static int tcpx_ep_accept(struct fid_ep *ep, const void *param, size_t paramlen) { struct tcpx_ep *tcpx_ep = container_of(ep, struct tcpx_ep, util_ep.ep_fid); struct tcpx_cm_context *cm_ctx; int ret; if (tcpx_ep->conn_fd == INVALID_SOCKET) return -FI_EINVAL; cm_ctx = calloc(1, sizeof(*cm_ctx)); if (!cm_ctx) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "cannot allocate memory \n"); return -FI_ENOMEM; } cm_ctx->fid = &tcpx_ep->util_ep.ep_fid.fid; cm_ctx->type = SERVER_SEND_CM_ACCEPT; if (paramlen) { cm_ctx->cm_data_sz = paramlen; memcpy(cm_ctx->cm_data, param, paramlen); } ret = ofi_wait_fd_add(tcpx_ep->util_ep.eq->wait, tcpx_ep->conn_fd, FI_EPOLL_OUT, tcpx_eq_wait_try_func, NULL, cm_ctx); if (ret) { free(cm_ctx); return ret; } tcpx_ep->util_ep.eq->wait->signal(tcpx_ep->util_ep.eq->wait); return 0; }
static void server_sock_accept(struct util_wait *wait, struct tcpx_cm_context *cm_ctx) { struct tcpx_conn_handle *handle; struct tcpx_pep *pep; SOCKET sock; int ret; FI_DBG(&tcpx_prov, FI_LOG_EP_CTRL, "Received Connreq\n"); assert(cm_ctx->fid->fclass == FI_CLASS_PEP); pep = container_of(cm_ctx->fid, struct tcpx_pep, util_pep.pep_fid.fid); sock = accept(pep->sock, NULL, 0); if (sock < 0) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "accept error: %d\n", ofi_sockerr()); return; } handle = calloc(1, sizeof(*handle)); if (!handle) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "cannot allocate memory \n"); goto err1; } cm_ctx = calloc(1, sizeof(*cm_ctx)); if (!cm_ctx) goto err2; handle->conn_fd = sock; handle->handle.fclass = FI_CLASS_CONNREQ; handle->pep = pep; cm_ctx->fid = &handle->handle; cm_ctx->type = SERVER_RECV_CONNREQ; ret = ofi_wait_fd_add(wait, sock, FI_EPOLL_IN, tcpx_eq_wait_try_func, NULL, (void *) cm_ctx); if (ret) goto err3; wait->signal(wait); return; err3: free(cm_ctx); err2: free(handle); err1: ofi_close_socket(sock); }
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 int tcpx_ep_connect(struct fid_ep *ep, const void *addr, const void *param, size_t paramlen) { struct tcpx_ep *tcpx_ep = container_of(ep, struct tcpx_ep, util_ep.ep_fid); struct tcpx_cm_context *cm_ctx; int ret; if (!addr || !tcpx_ep->conn_fd || paramlen > TCPX_MAX_CM_DATA_SIZE) return -FI_EINVAL; cm_ctx = calloc(1, sizeof(*cm_ctx)); if (!cm_ctx) { FI_WARN(&tcpx_prov, FI_LOG_EP_CTRL, "cannot allocate memory \n"); return -FI_ENOMEM; } ret = connect(tcpx_ep->conn_fd, (struct sockaddr *) addr, (socklen_t) ofi_sizeofaddr(addr)); if (ret && ofi_sockerr() != FI_EINPROGRESS) { ret = -ofi_sockerr(); goto err; } cm_ctx->fid = &tcpx_ep->util_ep.ep_fid.fid; cm_ctx->type = CLIENT_SEND_CONNREQ; if (paramlen) { cm_ctx->cm_data_sz = paramlen; memcpy(cm_ctx->cm_data, param, paramlen); } ret = ofi_wait_fd_add(tcpx_ep->util_ep.eq->wait, tcpx_ep->conn_fd, FI_EPOLL_OUT, tcpx_eq_wait_try_func, NULL,cm_ctx); if (ret) goto err; tcpx_ep->util_ep.eq->wait->signal(tcpx_ep->util_ep.eq->wait); return 0; err: free(cm_ctx); return ret; }
static int rxd_ep_wait_fd_add(struct rxd_ep *rxd_ep, struct util_wait *wait) { return ofi_wait_fd_add(wait, rxd_ep->dg_cq_fd, FI_EPOLL_IN, rxd_ep_trywait, rxd_ep, &rxd_ep->util_ep.ep_fid.fid); }