src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c

Print this page

        

*** 30,90 **** #include "jni.h" #include "nio_util.h" #include "nio.h" #include "net_util.h" #include "net_util_md.h" ! #include "sun_nio_ch_SctpNet.h" ! #include "sun_nio_ch_SctpChannelImpl.h" ! #include "sun_nio_ch_SctpAssocChange.h" ! #include "sun_nio_ch_SctpResultContainer.h" ! #include "sun_nio_ch_SctpPeerAddrChange.h" /* sizeof(union sctp_notification */ #define NOTIFICATION_BUFFER_SIZE 280 ! #define MESSAGE_IMPL_CLASS "sun/nio/ch/SctpMessageInfoImpl" ! #define RESULT_CONTAINER_CLASS "sun/nio/ch/SctpResultContainer" ! #define SEND_FAILED_CLASS "sun/nio/ch/SctpSendFailed" ! #define ASSOC_CHANGE_CLASS "sun/nio/ch/SctpAssocChange" ! #define PEER_CHANGE_CLASS "sun/nio/ch/SctpPeerAddrChange" ! #define SHUTDOWN_CLASS "sun/nio/ch/SctpShutdown" struct controlData { int assocId; unsigned short streamNumber; jboolean unordered; unsigned int ppid; }; ! static jclass smi_class; /* sun.nio.ch.SctpMessageInfoImpl */ ! static jmethodID smi_ctrID; /* sun.nio.ch.SctpMessageInfoImpl.<init> */ ! static jfieldID src_valueID; /* sun.nio.ch.SctpResultContainer.value */ ! static jfieldID src_typeID; /* sun.nio.ch.SctpResultContainer.type */ ! static jclass ssf_class; /* sun.nio.ch.SctpSendFailed */ ! static jmethodID ssf_ctrID; /* sun.nio.ch.SctpSendFailed.<init> */ ! static jclass sac_class; /* sun.nio.ch.SctpAssociationChanged */ ! static jmethodID sac_ctrID; /* sun.nio.ch.SctpAssociationChanged.<init> */ ! static jclass spc_class; /* sun.nio.ch.SctpPeerAddressChanged */ ! static jmethodID spc_ctrID; /* sun.nio.ch.SctpPeerAddressChanged.<init> */ ! static jclass ss_class; /* sun.nio.ch.SctpShutdown */ ! static jmethodID ss_ctrID; /* sun.nio.ch.SctpShutdown.<init> */ static jfieldID isa_addrID; /* java.net.InetSocketAddress.addr */ static jfieldID isa_portID; /* java.net.InetSocketAddress.port */ /* defined in SctpNet.c */ jobject SockAddrToInetSocketAddress(JNIEnv* env, struct sockaddr* addr); /* use SocketChannelImpl's checkConnect implementation */ extern jint Java_sun_nio_ch_SocketChannelImpl_checkConnect(JNIEnv* env, jobject this, jobject fdo, jboolean block, jboolean ready); /* ! * Class: sun_nio_ch_SctpChannelImpl * Method: initIDs * Signature: ()V */ ! JNIEXPORT void JNICALL Java_sun_nio_ch_SctpChannelImpl_initIDs (JNIEnv *env, jclass klass) { jclass cls; /* SctpMessageInfoImpl */ cls = (*env)->FindClass(env, MESSAGE_IMPL_CLASS); --- 30,92 ---- #include "jni.h" #include "nio_util.h" #include "nio.h" #include "net_util.h" #include "net_util_md.h" ! #include "sun_nio_ch_sctp_SctpNet.h" ! #include "sun_nio_ch_sctp_SctpChannelImpl.h" ! #include "sun_nio_ch_sctp_SctpAssocChange.h" ! #include "sun_nio_ch_sctp_SctpResultContainer.h" ! #include "sun_nio_ch_sctp_SctpPeerAddrChange.h" /* sizeof(union sctp_notification */ #define NOTIFICATION_BUFFER_SIZE 280 ! #define MESSAGE_IMPL_CLASS "sun/nio/ch/sctp/SctpMessageInfoImpl" ! #define RESULT_CONTAINER_CLASS "sun/nio/ch/sctp/SctpResultContainer" ! #define SEND_FAILED_CLASS "sun/nio/ch/sctp/SctpSendFailed" ! #define ASSOC_CHANGE_CLASS "sun/nio/ch/sctp/SctpAssocChange" ! #define PEER_CHANGE_CLASS "sun/nio/ch/sctp/SctpPeerAddrChange" ! #define SHUTDOWN_CLASS "sun/nio/ch/sctp/SctpShutdown" struct controlData { int assocId; unsigned short streamNumber; jboolean unordered; unsigned int ppid; }; ! static jclass smi_class; /* sun.nio.ch.sctp.SctpMessageInfoImpl */ ! static jmethodID smi_ctrID; /* sun.nio.ch.sctp.SctpMessageInfoImpl.<init> */ ! static jfieldID src_valueID; /* sun.nio.ch.sctp.SctpResultContainer.value */ ! static jfieldID src_typeID; /* sun.nio.ch.sctp.SctpResultContainer.type */ ! static jclass ssf_class; /* sun.nio.ch.sctp.SctpSendFailed */ ! static jmethodID ssf_ctrID; /* sun.nio.ch.sctp.SctpSendFailed.<init> */ ! static jclass sac_class; /* sun.nio.ch.sctp.SctpAssociationChanged */ ! static jmethodID sac_ctrID; /* sun.nio.ch.sctp.SctpAssociationChanged.<init>*/ ! static jclass spc_class; /* sun.nio.ch.sctp.SctpPeerAddressChanged */ ! static jmethodID spc_ctrID; /* sun.nio.ch.sctp.SctpPeerAddressChanged.<init>*/ ! static jclass ss_class; /* sun.nio.ch.sctp.SctpShutdown */ ! static jmethodID ss_ctrID; /* sun.nio.ch.sctp.SctpShutdown.<init> */ static jfieldID isa_addrID; /* java.net.InetSocketAddress.addr */ static jfieldID isa_portID; /* java.net.InetSocketAddress.port */ /* defined in SctpNet.c */ jobject SockAddrToInetSocketAddress(JNIEnv* env, struct sockaddr* addr); + jint handleSocketError(JNIEnv *env, jint errorValue); + /* use SocketChannelImpl's checkConnect implementation */ extern jint Java_sun_nio_ch_SocketChannelImpl_checkConnect(JNIEnv* env, jobject this, jobject fdo, jboolean block, jboolean ready); /* ! * Class: sun_nio_ch_sctp_SctpChannelImpl * Method: initIDs * Signature: ()V */ ! JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_initIDs (JNIEnv *env, jclass klass) { jclass cls; /* SctpMessageInfoImpl */ cls = (*env)->FindClass(env, MESSAGE_IMPL_CLASS);
*** 270,321 **** resultObj = (*env)->NewObject(env, ssf_class, ssf_ctrID, ssf->ssf_assoc_id, isaObj, bufferObj, ssf->ssf_error, sri->sinfo_stream); CHECK_NULL(resultObj); (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); (*env)->SetIntField(env, resultContainerObj, src_typeID, ! sun_nio_ch_SctpResultContainer_SEND_FAILED); } void handleAssocChange (JNIEnv* env, jobject resultContainerObj, struct sctp_assoc_change *sac) { jobject resultObj; int state = 0; switch (sac->sac_state) { case SCTP_COMM_UP : ! state = sun_nio_ch_SctpAssocChange_SCTP_COMM_UP; break; case SCTP_COMM_LOST : ! state = sun_nio_ch_SctpAssocChange_SCTP_COMM_LOST; break; case SCTP_RESTART : ! state = sun_nio_ch_SctpAssocChange_SCTP_RESTART; break; case SCTP_SHUTDOWN_COMP : ! state = sun_nio_ch_SctpAssocChange_SCTP_SHUTDOWN; break; case SCTP_CANT_STR_ASSOC : ! state = sun_nio_ch_SctpAssocChange_SCTP_CANT_START; } /* create SctpAssociationChanged */ resultObj = (*env)->NewObject(env, sac_class, sac_ctrID, sac->sac_assoc_id, state, sac->sac_outbound_streams, sac->sac_inbound_streams); CHECK_NULL(resultObj); (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); (*env)->SetIntField(env, resultContainerObj, src_typeID, ! sun_nio_ch_SctpResultContainer_ASSOCIATION_CHANGED); } void handleShutdown (JNIEnv* env, jobject resultContainerObj, struct sctp_shutdown_event* sse) { /* create SctpShutdown */ jobject resultObj = (*env)->NewObject(env, ss_class, ss_ctrID, sse->sse_assoc_id); CHECK_NULL(resultObj); (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); (*env)->SetIntField(env, resultContainerObj, src_typeID, ! sun_nio_ch_SctpResultContainer_SHUTDOWN); } void handlePeerAddrChange (JNIEnv* env, jobject resultContainerObj, struct sctp_paddr_change* spc) { int event = 0; --- 272,323 ---- resultObj = (*env)->NewObject(env, ssf_class, ssf_ctrID, ssf->ssf_assoc_id, isaObj, bufferObj, ssf->ssf_error, sri->sinfo_stream); CHECK_NULL(resultObj); (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); (*env)->SetIntField(env, resultContainerObj, src_typeID, ! sun_nio_ch_sctp_SctpResultContainer_SEND_FAILED); } void handleAssocChange (JNIEnv* env, jobject resultContainerObj, struct sctp_assoc_change *sac) { jobject resultObj; int state = 0; switch (sac->sac_state) { case SCTP_COMM_UP : ! state = sun_nio_ch_sctp_SctpAssocChange_SCTP_COMM_UP; break; case SCTP_COMM_LOST : ! state = sun_nio_ch_sctp_SctpAssocChange_SCTP_COMM_LOST; break; case SCTP_RESTART : ! state = sun_nio_ch_sctp_SctpAssocChange_SCTP_RESTART; break; case SCTP_SHUTDOWN_COMP : ! state = sun_nio_ch_sctp_SctpAssocChange_SCTP_SHUTDOWN; break; case SCTP_CANT_STR_ASSOC : ! state = sun_nio_ch_sctp_SctpAssocChange_SCTP_CANT_START; } /* create SctpAssociationChanged */ resultObj = (*env)->NewObject(env, sac_class, sac_ctrID, sac->sac_assoc_id, state, sac->sac_outbound_streams, sac->sac_inbound_streams); CHECK_NULL(resultObj); (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); (*env)->SetIntField(env, resultContainerObj, src_typeID, ! sun_nio_ch_sctp_SctpResultContainer_ASSOCIATION_CHANGED); } void handleShutdown (JNIEnv* env, jobject resultContainerObj, struct sctp_shutdown_event* sse) { /* create SctpShutdown */ jobject resultObj = (*env)->NewObject(env, ss_class, ss_ctrID, sse->sse_assoc_id); CHECK_NULL(resultObj); (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); (*env)->SetIntField(env, resultContainerObj, src_typeID, ! sun_nio_ch_sctp_SctpResultContainer_SHUTDOWN); } void handlePeerAddrChange (JNIEnv* env, jobject resultContainerObj, struct sctp_paddr_change* spc) { int event = 0;
*** 322,348 **** jobject addressObj, resultObj; unsigned int state = spc->spc_state; switch (state) { case SCTP_ADDR_AVAILABLE : ! event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_AVAILABLE; break; case SCTP_ADDR_UNREACHABLE : ! event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_UNREACHABLE; break; case SCTP_ADDR_REMOVED : ! event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_REMOVED; break; case SCTP_ADDR_ADDED : ! event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_ADDED; break; case SCTP_ADDR_MADE_PRIM : ! event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_MADE_PRIM; #ifdef __linux__ /* Solaris currently doesn't support SCTP_ADDR_CONFIRMED */ break; case SCTP_ADDR_CONFIRMED : ! event = sun_nio_ch_SctpPeerAddrChange_SCTP_ADDR_CONFIRMED; #endif /* __linux__ */ } addressObj = SockAddrToInetSocketAddress(env, (struct sockaddr*)&spc->spc_aaddr); --- 324,350 ---- jobject addressObj, resultObj; unsigned int state = spc->spc_state; switch (state) { case SCTP_ADDR_AVAILABLE : ! event = sun_nio_ch_sctp_SctpPeerAddrChange_SCTP_ADDR_AVAILABLE; break; case SCTP_ADDR_UNREACHABLE : ! event = sun_nio_ch_sctp_SctpPeerAddrChange_SCTP_ADDR_UNREACHABLE; break; case SCTP_ADDR_REMOVED : ! event = sun_nio_ch_sctp_SctpPeerAddrChange_SCTP_ADDR_REMOVED; break; case SCTP_ADDR_ADDED : ! event = sun_nio_ch_sctp_SctpPeerAddrChange_SCTP_ADDR_ADDED; break; case SCTP_ADDR_MADE_PRIM : ! event = sun_nio_ch_sctp_SctpPeerAddrChange_SCTP_ADDR_MADE_PRIM; #ifdef __linux__ /* Solaris currently doesn't support SCTP_ADDR_CONFIRMED */ break; case SCTP_ADDR_CONFIRMED : ! event = sun_nio_ch_sctp_SctpPeerAddrChange_SCTP_ADDR_CONFIRMED; #endif /* __linux__ */ } addressObj = SockAddrToInetSocketAddress(env, (struct sockaddr*)&spc->spc_aaddr);
*** 350,360 **** resultObj = (*env)->NewObject(env, spc_class, spc_ctrID, spc->spc_assoc_id, addressObj, event); CHECK_NULL(resultObj); (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); (*env)->SetIntField(env, resultContainerObj, src_typeID, ! sun_nio_ch_SctpResultContainer_PEER_ADDRESS_CHANGED); } void handleUninteresting (union sctp_notification *snp) { //fprintf(stdout,"\nNative: handleUninterestingNotification: Receive notification type [%u]", snp->sn_header.sn_type); --- 352,362 ---- resultObj = (*env)->NewObject(env, spc_class, spc_ctrID, spc->spc_assoc_id, addressObj, event); CHECK_NULL(resultObj); (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); (*env)->SetIntField(env, resultContainerObj, src_typeID, ! sun_nio_ch_sctp_SctpResultContainer_PEER_ADDRESS_CHANGED); } void handleUninteresting (union sctp_notification *snp) { //fprintf(stdout,"\nNative: handleUninterestingNotification: Receive notification type [%u]", snp->sn_header.sn_type);
*** 409,427 **** isEOR ? JNI_TRUE : JNI_FALSE, cdata->unordered, cdata->ppid); CHECK_NULL(resultObj); (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); (*env)->SetIntField(env, resultContainerObj, src_typeID, ! sun_nio_ch_SctpResultContainer_MESSAGE); } /* ! * Class: sun_nio_ch_SctpChannelImpl * Method: receive0 * Signature: (ILsun/nio/ch/SctpResultContainer;JIZ)I */ ! JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_receive0 (JNIEnv *env, jclass klass, jint fd, jobject resultContainerObj, jlong address, jint length, jboolean peek) { SOCKADDR sa; int sa_len = sizeof(sa); ssize_t rv = 0; --- 411,429 ---- isEOR ? JNI_TRUE : JNI_FALSE, cdata->unordered, cdata->ppid); CHECK_NULL(resultObj); (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj); (*env)->SetIntField(env, resultContainerObj, src_typeID, ! sun_nio_ch_sctp_SctpResultContainer_MESSAGE); } /* ! * Class: sun_nio_ch_sctp_SctpChannelImpl * Method: receive0 * Signature: (ILsun/nio/ch/SctpResultContainer;JIZ)I */ ! JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_receive0 (JNIEnv *env, jclass klass, jint fd, jobject resultContainerObj, jlong address, jint length, jboolean peek) { SOCKADDR sa; int sa_len = sizeof(sa); ssize_t rv = 0;
*** 503,517 **** (msg->msg_flags & MSG_EOR), (struct sockaddr*)&sa); return rv; } /* ! * Class: sun_nio_ch_SctpChannelImpl * Method: send0 * Signature: (IJILjava/net/SocketAddress;IIZI)I */ ! JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_send0 (JNIEnv *env, jclass klass, jint fd, jlong address, jint length, jobject saTarget, jint assocId, jint streamNumber, jboolean unordered, jint ppid) { SOCKADDR sa; int sa_len = sizeof(sa); --- 505,519 ---- (msg->msg_flags & MSG_EOR), (struct sockaddr*)&sa); return rv; } /* ! * Class: sun_nio_ch_sctp_SctpChannelImpl * Method: send0 * Signature: (IJILjava/net/SocketAddress;IIZI)I */ ! JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_send0 (JNIEnv *env, jclass klass, jint fd, jlong address, jint length, jobject saTarget, jint assocId, jint streamNumber, jboolean unordered, jint ppid) { SOCKADDR sa; int sa_len = sizeof(sa);
*** 580,594 **** return rv; } /* ! * Class: sun_nio_ch_SctpChannelImpl * Method: checkConnect * Signature: (Ljava/io/FileDescriptor;ZZ)I */ ! JNIEXPORT jint JNICALL Java_sun_nio_ch_SctpChannelImpl_checkConnect (JNIEnv* env, jobject this, jobject fdo, jboolean block, jboolean ready) { return Java_sun_nio_ch_SocketChannelImpl_checkConnect(env, this, fdo, block, ready); } --- 582,596 ---- return rv; } /* ! * Class: sun_nio_ch_sctp_SctpChannelImpl * Method: checkConnect * Signature: (Ljava/io/FileDescriptor;ZZ)I */ ! JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_checkConnect (JNIEnv* env, jobject this, jobject fdo, jboolean block, jboolean ready) { return Java_sun_nio_ch_SocketChannelImpl_checkConnect(env, this, fdo, block, ready); }