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