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 } |