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

Print this page




 196   (JNIEnv* env, int fd, jobject resultContainerObj, struct sctp_send_failed *ssf,
 197    int read, jboolean isEOR, struct sockaddr* sap) {
 198     jobject bufferObj = NULL, resultObj, isaObj;
 199     char *addressP;
 200     struct sctp_sndrcvinfo *sri;
 201     int remaining, dataLength;
 202 
 203     /* the actual undelivered message data is directly after the ssf */
 204     int dataOffset = sizeof(struct sctp_send_failed);
 205 
 206     sri = (struct sctp_sndrcvinfo*) &ssf->ssf_info;
 207 
 208     /* the number of bytes remaining to be read in the sctp_send_failed notif*/
 209     remaining = ssf->ssf_length - read;
 210 
 211     /* the size of the actual undelivered message */
 212     dataLength = ssf->ssf_length - dataOffset;
 213 
 214     /* retrieved address from sockaddr */
 215     isaObj = SockAddrToInetSocketAddress(env, sap);

 216 
 217     /* data retrieved from sff_data */
 218     if (dataLength > 0) {
 219         struct iovec iov[1];
 220         struct msghdr msg[1];
 221         int rv, alreadyRead;
 222         char *dataP = (char*) ssf;
 223         dataP += dataOffset;
 224 
 225         if ((addressP = malloc(dataLength)) == NULL) {
 226             JNU_ThrowOutOfMemoryError(env, "handleSendFailed");
 227             return;
 228         }
 229 
 230         memset(msg, 0, sizeof (*msg));
 231         msg->msg_iov = iov;
 232         msg->msg_iovlen = 1;
 233 
 234         bufferObj = (*env)->NewDirectByteBuffer(env, addressP, dataLength);
 235         CHECK_NULL(bufferObj);


 320             break;
 321         case SCTP_ADDR_UNREACHABLE :
 322             event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_UNREACHABLE;
 323             break;
 324         case SCTP_ADDR_REMOVED :
 325             event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_REMOVED;
 326             break;
 327         case SCTP_ADDR_ADDED :
 328             event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_ADDED;
 329             break;
 330         case SCTP_ADDR_MADE_PRIM :
 331             event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_MADE_PRIM;
 332 #ifdef __linux__  /* Solaris currently doesn't support SCTP_ADDR_CONFIRMED */
 333             break;
 334         case SCTP_ADDR_CONFIRMED :
 335             event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_CONFIRMED;
 336 #endif  /* __linux__ */
 337     }
 338 
 339     addressObj = SockAddrToInetSocketAddress(env, (struct sockaddr*)&spc->spc_aaddr);

 340 
 341     /* create PeerAddressChanged */
 342     resultObj = (*env)->NewObject(env, spc_class, spc_ctrID, spc->spc_assoc_id,
 343             addressObj, event);
 344     CHECK_NULL(resultObj);
 345     (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
 346     (*env)->SetIntField(env, resultContainerObj, src_typeID,
 347             sun_nio_ch_sctp_ResultContainer_PEER_ADDRESS_CHANGED);
 348 }
 349 
 350 void handleUninteresting
 351   (union sctp_notification *snp) {
 352     //fprintf(stdout,"\nNative: handleUninterestingNotification: Receive notification type [%u]", snp->sn_header.sn_type);
 353 }
 354 
 355 /**
 356  * Handle notifications from the SCTP stack.
 357  * Returns JNI_TRUE if the notification is one that is of interest to the
 358  * Java API, otherwise JNI_FALSE.
 359  */


 376             return JNI_TRUE;
 377         default :
 378             /* the Java API is not interested in this event, maybe we are? */
 379             handleUninteresting(snp);
 380     }
 381     return JNI_FALSE;
 382 }
 383 
 384 void handleMessage
 385   (JNIEnv* env, jobject resultContainerObj, struct msghdr* msg,int read,
 386    jboolean isEOR, struct sockaddr* sap) {
 387     jobject isa, resultObj;
 388     struct controlData cdata[1];
 389 
 390     if (read == 0) {
 391         /* we reached EOF */
 392         read = -1;
 393     }
 394 
 395     isa = SockAddrToInetSocketAddress(env, sap);

 396     getControlData(msg, cdata);
 397 
 398     /* create MessageInfoImpl */
 399     resultObj = (*env)->NewObject(env, smi_class, smi_ctrID, cdata->assocId,
 400                                   isa, read, cdata->streamNumber,
 401                                   isEOR ? JNI_TRUE : JNI_FALSE,
 402                                   cdata->unordered, cdata->ppid);
 403     CHECK_NULL(resultObj);
 404     (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
 405     (*env)->SetIntField(env, resultContainerObj, src_typeID,
 406                         sun_nio_ch_sctp_ResultContainer_MESSAGE);
 407 }
 408 
 409 /*
 410  * Class:     sun_nio_ch_sctp_SctpChannelImpl
 411  * Method:    receive0
 412  * Signature: (ILsun/nio/ch/sctp/ResultContainer;JIZ)I
 413  */
 414 JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_receive0
 415   (JNIEnv *env, jclass klass, jint fd, jobject resultContainerObj,


 596                             "Socket is shutdown for writing");
 597         } else {
 598             handleSocketError(env, errno);
 599             return 0;
 600         }
 601     }
 602 
 603     return rv;
 604 }
 605 
 606 /*
 607  * Class:     sun_nio_ch_sctp_SctpChannelImpl
 608  * Method:    checkConnect
 609  * Signature: (Ljava/io/FileDescriptor;ZZ)I
 610  */
 611 JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_checkConnect
 612   (JNIEnv* env, jobject this, jobject fdo, jboolean block, jboolean ready) {
 613     return Java_sun_nio_ch_SocketChannelImpl_checkConnect(env, this,
 614                                                           fdo, block, ready);
 615 }
 616 


 196   (JNIEnv* env, int fd, jobject resultContainerObj, struct sctp_send_failed *ssf,
 197    int read, jboolean isEOR, struct sockaddr* sap) {
 198     jobject bufferObj = NULL, resultObj, isaObj;
 199     char *addressP;
 200     struct sctp_sndrcvinfo *sri;
 201     int remaining, dataLength;
 202 
 203     /* the actual undelivered message data is directly after the ssf */
 204     int dataOffset = sizeof(struct sctp_send_failed);
 205 
 206     sri = (struct sctp_sndrcvinfo*) &ssf->ssf_info;
 207 
 208     /* the number of bytes remaining to be read in the sctp_send_failed notif*/
 209     remaining = ssf->ssf_length - read;
 210 
 211     /* the size of the actual undelivered message */
 212     dataLength = ssf->ssf_length - dataOffset;
 213 
 214     /* retrieved address from sockaddr */
 215     isaObj = SockAddrToInetSocketAddress(env, sap);
 216     CHECK_NULL(isaObj);
 217 
 218     /* data retrieved from sff_data */
 219     if (dataLength > 0) {
 220         struct iovec iov[1];
 221         struct msghdr msg[1];
 222         int rv, alreadyRead;
 223         char *dataP = (char*) ssf;
 224         dataP += dataOffset;
 225 
 226         if ((addressP = malloc(dataLength)) == NULL) {
 227             JNU_ThrowOutOfMemoryError(env, "handleSendFailed");
 228             return;
 229         }
 230 
 231         memset(msg, 0, sizeof (*msg));
 232         msg->msg_iov = iov;
 233         msg->msg_iovlen = 1;
 234 
 235         bufferObj = (*env)->NewDirectByteBuffer(env, addressP, dataLength);
 236         CHECK_NULL(bufferObj);


 321             break;
 322         case SCTP_ADDR_UNREACHABLE :
 323             event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_UNREACHABLE;
 324             break;
 325         case SCTP_ADDR_REMOVED :
 326             event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_REMOVED;
 327             break;
 328         case SCTP_ADDR_ADDED :
 329             event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_ADDED;
 330             break;
 331         case SCTP_ADDR_MADE_PRIM :
 332             event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_MADE_PRIM;
 333 #ifdef __linux__  /* Solaris currently doesn't support SCTP_ADDR_CONFIRMED */
 334             break;
 335         case SCTP_ADDR_CONFIRMED :
 336             event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_CONFIRMED;
 337 #endif  /* __linux__ */
 338     }
 339 
 340     addressObj = SockAddrToInetSocketAddress(env, (struct sockaddr*)&spc->spc_aaddr);
 341     CHECK_NULL(addressObj);
 342 
 343     /* create PeerAddressChanged */
 344     resultObj = (*env)->NewObject(env, spc_class, spc_ctrID, spc->spc_assoc_id,
 345             addressObj, event);
 346     CHECK_NULL(resultObj);
 347     (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
 348     (*env)->SetIntField(env, resultContainerObj, src_typeID,
 349             sun_nio_ch_sctp_ResultContainer_PEER_ADDRESS_CHANGED);
 350 }
 351 
 352 void handleUninteresting
 353   (union sctp_notification *snp) {
 354     //fprintf(stdout,"\nNative: handleUninterestingNotification: Receive notification type [%u]", snp->sn_header.sn_type);
 355 }
 356 
 357 /**
 358  * Handle notifications from the SCTP stack.
 359  * Returns JNI_TRUE if the notification is one that is of interest to the
 360  * Java API, otherwise JNI_FALSE.
 361  */


 378             return JNI_TRUE;
 379         default :
 380             /* the Java API is not interested in this event, maybe we are? */
 381             handleUninteresting(snp);
 382     }
 383     return JNI_FALSE;
 384 }
 385 
 386 void handleMessage
 387   (JNIEnv* env, jobject resultContainerObj, struct msghdr* msg,int read,
 388    jboolean isEOR, struct sockaddr* sap) {
 389     jobject isa, resultObj;
 390     struct controlData cdata[1];
 391 
 392     if (read == 0) {
 393         /* we reached EOF */
 394         read = -1;
 395     }
 396 
 397     isa = SockAddrToInetSocketAddress(env, sap);
 398     CHECK_NULL(isa);
 399     getControlData(msg, cdata);
 400 
 401     /* create MessageInfoImpl */
 402     resultObj = (*env)->NewObject(env, smi_class, smi_ctrID, cdata->assocId,
 403                                   isa, read, cdata->streamNumber,
 404                                   isEOR ? JNI_TRUE : JNI_FALSE,
 405                                   cdata->unordered, cdata->ppid);
 406     CHECK_NULL(resultObj);
 407     (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
 408     (*env)->SetIntField(env, resultContainerObj, src_typeID,
 409                         sun_nio_ch_sctp_ResultContainer_MESSAGE);
 410 }
 411 
 412 /*
 413  * Class:     sun_nio_ch_sctp_SctpChannelImpl
 414  * Method:    receive0
 415  * Signature: (ILsun/nio/ch/sctp/ResultContainer;JIZ)I
 416  */
 417 JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_receive0
 418   (JNIEnv *env, jclass klass, jint fd, jobject resultContainerObj,


 599                             "Socket is shutdown for writing");
 600         } else {
 601             handleSocketError(env, errno);
 602             return 0;
 603         }
 604     }
 605 
 606     return rv;
 607 }
 608 
 609 /*
 610  * Class:     sun_nio_ch_sctp_SctpChannelImpl
 611  * Method:    checkConnect
 612  * Signature: (Ljava/io/FileDescriptor;ZZ)I
 613  */
 614 JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_checkConnect
 615   (JNIEnv* env, jobject this, jobject fdo, jboolean block, jboolean ready) {
 616     return Java_sun_nio_ch_SocketChannelImpl_checkConnect(env, this,
 617                                                           fdo, block, ready);
 618 }