jdk/src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c
changeset 16089 7cf1e2708454
parent 11823 ee83ae88512d
child 16100 379f48d34516
equal deleted inserted replaced
16088:8edf3fb360ea 16089:7cf1e2708454
    65 static jmethodID sac_ctrID;    /* sun.nio.ch.sctp.AssociationChange.<init>   */
    65 static jmethodID sac_ctrID;    /* sun.nio.ch.sctp.AssociationChange.<init>   */
    66 static jclass    spc_class;    /* sun.nio.ch.sctp.PeerAddressChanged         */
    66 static jclass    spc_class;    /* sun.nio.ch.sctp.PeerAddressChanged         */
    67 static jmethodID spc_ctrID;    /* sun.nio.ch.sctp.PeerAddressChanged.<init>  */
    67 static jmethodID spc_ctrID;    /* sun.nio.ch.sctp.PeerAddressChanged.<init>  */
    68 static jclass    ss_class;     /* sun.nio.ch.sctp.Shutdown                   */
    68 static jclass    ss_class;     /* sun.nio.ch.sctp.Shutdown                   */
    69 static jmethodID ss_ctrID;     /* sun.nio.ch.sctp.Shutdown.<init>            */
    69 static jmethodID ss_ctrID;     /* sun.nio.ch.sctp.Shutdown.<init>            */
    70 static jfieldID  isa_addrID;   /* java.net.InetSocketAddress.addr            */
       
    71 static jfieldID  isa_portID;   /* java.net.InetSocketAddress.port            */
       
    72 
    70 
    73 /* defined in SctpNet.c */
    71 /* defined in SctpNet.c */
    74 jobject SockAddrToInetSocketAddress(JNIEnv* env, struct sockaddr* addr);
    72 jobject SockAddrToInetSocketAddress(JNIEnv* env, struct sockaddr* addr);
    75 
    73 
    76 jint handleSocketError(JNIEnv *env, jint errorValue);
    74 jint handleSocketError(JNIEnv *env, jint errorValue);
   136     CHECK_NULL(cls);
   134     CHECK_NULL(cls);
   137     ss_class = (*env)->NewGlobalRef(env, cls);
   135     ss_class = (*env)->NewGlobalRef(env, cls);
   138     CHECK_NULL(ss_class);
   136     CHECK_NULL(ss_class);
   139     ss_ctrID = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
   137     ss_ctrID = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
   140     CHECK_NULL(ss_ctrID);
   138     CHECK_NULL(ss_ctrID);
   141 
       
   142     /* InetSocketAddress */
       
   143     cls = (*env)->FindClass(env, "java/net/InetSocketAddress");
       
   144     CHECK_NULL(cls);
       
   145     isa_addrID = (*env)->GetFieldID(env, cls, "addr", "Ljava/net/InetAddress;");
       
   146     CHECK_NULL(isa_addrID);
       
   147     isa_portID = (*env)->GetFieldID(env, cls, "port", "I");
       
   148 }
   139 }
   149 
   140 
   150 void getControlData
   141 void getControlData
   151   (struct msghdr* msg, struct controlData* cdata) {
   142   (struct msghdr* msg, struct controlData* cdata) {
   152     struct cmsghdr* cmsg;
   143     struct cmsghdr* cmsg;
   507 }
   498 }
   508 
   499 
   509 /*
   500 /*
   510  * Class:     sun_nio_ch_sctp_SctpChannelImpl
   501  * Class:     sun_nio_ch_sctp_SctpChannelImpl
   511  * Method:    send0
   502  * Method:    send0
   512  * Signature: (IJILjava/net/SocketAddress;IIZI)I
   503  * Signature: (IJILjava/net/InetAddress;IIIZI)I
   513  */
   504  */
   514 JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_send0
   505 JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_send0
   515   (JNIEnv *env, jclass klass, jint fd, jlong address, jint length,
   506   (JNIEnv *env, jclass klass, jint fd, jlong address, jint length,
   516    jobject saTarget, jint assocId, jint streamNumber, jboolean unordered,
   507    jobject targetAddress, jint targetPort, jint assocId, jint streamNumber,
   517    jint ppid) {
   508    jboolean unordered, jint ppid) {
   518     SOCKADDR sa;
   509     SOCKADDR sa;
   519     int sa_len = sizeof(sa);
   510     int sa_len = sizeof(sa);
   520     ssize_t rv = 0;
   511     ssize_t rv = 0;
   521     jlong *addr = jlong_to_ptr(address);
   512     jlong *addr = jlong_to_ptr(address);
   522     struct iovec iov[1];
   513     struct iovec iov[1];
   524     int cbuf_size = CMSG_SPACE(sizeof (struct sctp_sndrcvinfo));
   515     int cbuf_size = CMSG_SPACE(sizeof (struct sctp_sndrcvinfo));
   525     char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))];
   516     char cbuf[CMSG_SPACE(sizeof (struct sctp_sndrcvinfo))];
   526     struct controlData cdata[1];
   517     struct controlData cdata[1];
   527 
   518 
   528     /* SctpChannel:
   519     /* SctpChannel:
   529      *    saTarget may contain the preferred address or NULL to use primary,
   520      *    targetAddress may contain the preferred address or NULL to use primary,
   530      *    assocId will always be -1
   521      *    assocId will always be -1
   531      * SctpMultiChannell:
   522      * SctpMultiChannell:
   532      *    Setup new association, saTarget will contain address, assocId = -1
   523      *    Setup new association, targetAddress will contain address, assocId = -1
   533      *    Association already existing, assocId != -1, saTarget = preferred addr
   524      *    Association already existing, assocId != -1, targetAddress = preferred addr
   534      */
   525      */
   535     if (saTarget != NULL /*&& assocId <= 0*/) {
   526     if (targetAddress != NULL /*&& assocId <= 0*/) {
   536 
       
   537         jobject targetAddress = (*env)->GetObjectField(env, saTarget, isa_addrID);
       
   538         jint targetPort = (*env)->GetIntField(env, saTarget, isa_portID);
       
   539 
       
   540         if (NET_InetAddressToSockaddr(env, targetAddress, targetPort,
   527         if (NET_InetAddressToSockaddr(env, targetAddress, targetPort,
   541                                       (struct sockaddr *)&sa,
   528                                       (struct sockaddr *)&sa,
   542                                       &sa_len, JNI_TRUE) != 0) {
   529                                       &sa_len, JNI_TRUE) != 0) {
   543             return IOS_THROWN;
   530             return IOS_THROWN;
   544         }
   531         }