Nptrans * np_fdtrans_create(int fdin, int fdout) { Nptrans *npt; Fdtrans *fdt; fdt = malloc(sizeof(*fdt)); if (!fdt) { np_uerror(ENOMEM); return NULL; } fdt->fdin = fdin; fdt->fdout = fdout; fdt->fc = NULL; fdt->fc_msize = 0; npt = np_trans_create(fdt, np_fdtrans_recv, np_fdtrans_send, np_fdtrans_destroy); if (!npt) { free(fdt); return NULL; } fdt->trans = npt; return npt; }
Nptrans * np_fdtrans_create(int fdin, int fdout) { Nptrans *npt; Fdtrans *fdt; fdt = malloc(sizeof(*fdt)); if (!fdt) return NULL; //fprintf(stderr, "np_fdtrans_create trans %p fdtrans %p\n", npt, fdt); fdt->trans = npt; fdt->fdin = fdin; fdt->fdout = fdout; npt = np_trans_create(fdt, np_fdtrans_read, np_fdtrans_write, np_fdtrans_destroy); if (!npt) { free(fdt); return NULL; } return npt; }
Nptrans * np_fdtrans_create(int fdin, int fdout) { Nptrans *npt; Fdtrans *fdt; fdt = malloc(sizeof(*fdt)); if (!fdt) return NULL; fdt->trans = 0; fdt->fdin = fdin; fdt->fdout = fdout; fdt->is_tcp = 0; npt = np_trans_create(fdt, np_fdtrans_read, np_fdtrans_write, np_fdtrans_destroy); if (!npt) { free(fdt); return NULL; } fdt->trans = npt; return npt; }
/** * \brief Create an RDMA transport server * * \param cmid The CM id passed up in the connect event * \param q_depth A hint from the client on the depth of it's SQ/RQ * \param msize The max message size * \returns A pointer to the newly allocated transport */ Nptrans * np_rdmatrans_create(struct rdma_cm_id *cmid, int q_depth, int msize) { int i, ret; u8 *p; struct Nptrans *trans; struct Rdmatrans *rdma; struct ibv_qp_init_attr qp_attr; struct rdma_conn_param cparam; rdma = calloc(1, sizeof *rdma); if (!rdma) goto error; ret = pthread_mutex_init(&rdma->lock, NULL); if (ret) goto error; ret = pthread_cond_init(&rdma->cond, NULL); if (ret) goto error; rdma->connected = 0; rdma->cm_id = cmid; rdma->context = cmid->verbs; rdma->q_depth = q_depth; rdma->msize = msize + sizeof(Rdmactx); rdma->pd = ibv_alloc_pd(rdma->context); if (!rdma->pd) goto error; /* Create receive buffer space and register it */ rdma->rcv_buf = malloc(rdma->msize * q_depth); if (!rdma->rcv_buf) goto error; rdma->rcv_mr = ibv_reg_mr(rdma->pd, rdma->rcv_buf, rdma->msize * q_depth, IBV_ACCESS_LOCAL_WRITE); if (!rdma->rcv_mr) goto error; /* Create send buffer space and register it */ rdma->snd_buf = malloc(rdma->msize * q_depth); if (!rdma->snd_buf) goto error; rdma->next_buf = 0; rdma->snd_mr = ibv_reg_mr(rdma->pd, rdma->snd_buf, rdma->msize * q_depth, 0); if (!rdma->snd_mr) goto error; rdma->ch = ibv_create_comp_channel(rdma->context); if (!rdma->ch) goto error; rdma->fd = rdma->ch->fd; rdma->cq = ibv_create_cq(rdma->context, 2*q_depth, rdma, rdma->ch, 0); if (!rdma->cq) goto error; ibv_req_notify_cq(rdma->cq, 0); /* Create the CQ */ memset(&qp_attr, 0, sizeof qp_attr); qp_attr.send_cq = rdma->cq; qp_attr.recv_cq = rdma->cq; qp_attr.cap.max_send_wr = q_depth; qp_attr.cap.max_recv_wr = q_depth; qp_attr.cap.max_send_sge = 1; qp_attr.cap.max_send_sge = 1; qp_attr.cap.max_recv_sge = 1; qp_attr.cap.max_inline_data = 64; qp_attr.qp_type = IBV_QPT_RC; ret = rdma_create_qp(rdma->cm_id, rdma->pd, &qp_attr); if (ret) goto error; rdma->qp = rdma->cm_id->qp; p = rdma->rcv_buf; for (i = 0; i < q_depth; i++) rdma_post_recv(rdma, (Rdmactx *)(p + i*rdma->msize)); trans = np_trans_create(rdma, rdma_trans_recv, rdma_trans_send, rdma_trans_destroy); if (!trans) goto error; rdma->trans = trans; memset(&cparam, 0, sizeof(cparam)); cparam.responder_resources = 1; cparam.initiator_depth = 1; cparam.private_data = NULL; cparam.private_data_len = 0; ret = rdma_accept(cmid, &cparam); if (ret) { np_uerror(ret); goto error; } rdma->connected = 1; return trans; error: if (rdma) rdma_trans_destroy(rdma); rdma_reject(cmid, NULL, 0); return NULL; }