/* Used only with one-to-one socket. * * Event callback when there is data available on the registered * socket to recv. */ static void mca_btl_sctp_component_recv_handler(int sd, short flags, void* user) { orte_process_name_t guid; struct sockaddr_in addr; int retval; mca_btl_sctp_proc_t* btl_proc; opal_socklen_t addr_len = sizeof(addr); mca_btl_sctp_event_t *event = (mca_btl_sctp_event_t *)user; int msg_flags=0; struct sctp_sndrcvinfo sri; /* accept new connections on the listen socket */ if(mca_btl_sctp_component.sctp_listen_sd == sd) { mca_btl_sctp_component_accept(); return; } OBJ_RELEASE(event); retval = sctp_recvmsg(sd, (char *)&guid, sizeof(guid), 0, 0, &sri, &msg_flags); if(retval != sizeof(guid)) { CLOSE_THE_SOCKET(sd); return; } SCTP_BTL_ERROR(("mca_btl_sctp_component_recv_handler() sd=%d, got %d byte guid.\n", sd, retval)); ORTE_PROCESS_NAME_NTOH(guid); /* lookup the corresponding process */ btl_proc = mca_btl_sctp_proc_lookup(&guid); if(NULL == btl_proc) { BTL_ERROR(("errno=%d",errno)); CLOSE_THE_SOCKET(sd); return; } /* lookup peer address */ if(getpeername(sd, (struct sockaddr*)&addr, &addr_len) != 0) { if(opal_socket_errno != ECONNRESET && opal_socket_errno != EBADF && opal_socket_errno != ENOTCONN) { BTL_ERROR(("getpeername() failed with errno=%d", opal_socket_errno)); } CLOSE_THE_SOCKET(sd); return; } /* are there any existing peer instances will to accept this connection */ if(mca_btl_sctp_proc_accept(btl_proc, &addr, sd) == false) { CLOSE_THE_SOCKET(sd); return; } }
/* * Receive the endpoints globally unique process identification from a newly * connected socket and verify the expected response. If so, move the * socket to a connected state. */ static int mca_btl_tcp2_endpoint_recv_connect_ack(mca_btl_base_endpoint_t* btl_endpoint) { orte_process_name_t guid; mca_btl_tcp2_proc_t* btl_proc = btl_endpoint->endpoint_proc; if((mca_btl_tcp2_endpoint_recv_blocking(btl_endpoint, &guid, sizeof(orte_process_name_t))) != sizeof(orte_process_name_t)) { return OMPI_ERR_UNREACH; } ORTE_PROCESS_NAME_NTOH(guid); /* compare this to the expected values */ if (OPAL_EQUAL != orte_util_compare_name_fields(ORTE_NS_CMP_ALL, &btl_proc->proc_ompi->proc_name, &guid)) { BTL_ERROR(("received unexpected process identifier %s", ORTE_NAME_PRINT(&guid))); mca_btl_tcp2_endpoint_close(btl_endpoint); return OMPI_ERR_UNREACH; } return OMPI_SUCCESS; }