static void handle_accept_conn(struct poll_fd_mgr *poll_mgr, struct poll_fd_info *poll_info) { struct fi_eq_cm_entry cm_entry; struct fi_eq_err_entry err_entry; struct tcpx_ep *ep; int ret; assert(poll_info->fid->fclass == FI_CLASS_EP); ep = container_of(poll_info->fid, struct tcpx_ep, util_ep.ep_fid.fid); ret = tx_cm_data(ep->conn_fd, ofi_ctrl_connresp, poll_info); if (ret) goto err; cm_entry.fid = poll_info->fid; ret = (int) fi_eq_write(&ep->util_ep.eq->eq_fid, FI_CONNECTED, &cm_entry, sizeof(cm_entry), 0); if (ret < 0) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "Error writing to EQ\n"); } ret = fi_fd_nonblock(ep->conn_fd); return; err: memset(&err_entry, 0, sizeof err_entry); err_entry.fid = poll_info->fid; err_entry.context = poll_info->fid->context; err_entry.err = ret; fi_eq_write(&ep->util_ep.eq->eq_fid, FI_SHUTDOWN, &err_entry, sizeof(err_entry), UTIL_FLAG_ERROR); }
static void client_send_connreq(struct util_wait *wait, struct tcpx_cm_context *cm_ctx) { struct tcpx_ep *ep; struct fi_eq_err_entry err_entry; socklen_t len; int status, ret = FI_SUCCESS; FI_DBG(&tcpx_prov, FI_LOG_EP_CTRL, "client send connreq\n"); assert(cm_ctx->fid->fclass == FI_CLASS_EP); ep = container_of(cm_ctx->fid, struct tcpx_ep, util_ep.ep_fid.fid); len = sizeof(status); ret = getsockopt(ep->conn_fd, SOL_SOCKET, SO_ERROR, (char *) &status, &len); if (ret < 0 || status) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "connection failure\n"); ret = (ret < 0)? -ofi_sockerr() : status; goto err; } ret = tx_cm_data(ep->conn_fd, ofi_ctrl_connreq, cm_ctx); if (ret) goto err; ret = ofi_wait_fd_del(wait, ep->conn_fd); if (ret) goto err; cm_ctx->type = CLIENT_RECV_CONNRESP; ret = ofi_wait_fd_add(wait, ep->conn_fd, FI_EPOLL_IN, tcpx_eq_wait_try_func, NULL, cm_ctx); if (ret) goto err; wait->signal(wait); return; err: memset(&err_entry, 0, sizeof err_entry); err_entry.fid = cm_ctx->fid; err_entry.context = cm_ctx->fid->context; err_entry.err = -ret; free(cm_ctx); fi_eq_write(&ep->util_ep.eq->eq_fid, FI_NOTIFY, &err_entry, sizeof(err_entry), UTIL_FLAG_ERROR); }
static void server_send_cm_accept(struct util_wait *wait, struct tcpx_cm_context *cm_ctx) { struct fi_eq_cm_entry cm_entry = {0}; struct fi_eq_err_entry err_entry; struct tcpx_ep *ep; int ret; assert(cm_ctx->fid->fclass == FI_CLASS_EP); ep = container_of(cm_ctx->fid, struct tcpx_ep, util_ep.ep_fid.fid); ret = tx_cm_data(ep->conn_fd, ofi_ctrl_connresp, cm_ctx); if (ret) goto err; cm_entry.fid = cm_ctx->fid; ret = (int) fi_eq_write(&ep->util_ep.eq->eq_fid, FI_CONNECTED, &cm_entry, sizeof(cm_entry), 0); if (ret < 0) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "Error writing to EQ\n"); } ret = ofi_wait_fd_del(wait, ep->conn_fd); if (ret) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "Could not remove fd from wait\n"); goto err; } ret = tcpx_ep_msg_xfer_enable(ep); if (ret) goto err; FI_DBG(&tcpx_prov, FI_LOG_EP_CTRL, "Connection Accept Successful\n"); free(cm_ctx); return; err: memset(&err_entry, 0, sizeof err_entry); err_entry.fid = cm_ctx->fid; err_entry.context = cm_ctx->fid->context; err_entry.err = -ret; free(cm_ctx); fi_eq_write(&ep->util_ep.eq->eq_fid, FI_NOTIFY, &err_entry, sizeof(err_entry), UTIL_FLAG_ERROR); }
static int send_conn_req(struct poll_fd_mgr *poll_mgr, struct poll_fd_info *poll_info, struct tcpx_ep *ep, int index) { socklen_t len; int status, ret = FI_SUCCESS; assert(poll_mgr->poll_fds[index].revents == POLLOUT); len = sizeof(status); ret = getsockopt(ep->conn_fd, SOL_SOCKET, SO_ERROR, (char *) &status, &len); if (ret < 0 || status) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "connection failure\n"); return (ret < 0)? -errno : status; } ret = tx_cm_data(ep->conn_fd, ofi_ctrl_connreq, poll_info); return ret; }