rdm,a
authorStefan Metzmacher <metze@samba.org>
Mon, 17 Sep 2012 01:11:44 +0000 (03:11 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 18 Sep 2012 03:10:24 +0000 (05:10 +0200)
libcli/smb/smb_transport_direct.c

index 4e01ee6312c105eec8fa729d2f1790b69becf55c..f949659eebcacae30cc8adf18469668b1d4dd38d 100644 (file)
@@ -309,6 +309,8 @@ static void smb_direct_rdma_connect_handler(struct tevent_context *ev,
                        __location__, __FUNCTION__, ret, errno));
 
                state->t->rdma.expected_event = RDMA_CM_EVENT_DISCONNECTED;
+               TALLOC_FREE(state->t->rdma.fde_channel);
+               tevent_req_done(req);
                break;
 
        case RDMA_CM_EVENT_ROUTE_ERROR:
@@ -353,6 +355,18 @@ NTSTATUS smb_direct_rdma_connect_recv(struct tevent_req *req)
 
 struct smb_direct_negotiate_state {
        struct smb_direct_transport *t;
+       struct {
+               uint8_t buffer[0x14];
+               struct ibv_mr *mr;
+               struct ibv_sge sge;
+               struct ibv_send_wr wr;
+       } req;
+       struct {
+               uint8_t buffer[0x1C];
+               struct ibv_mr *mr;
+               struct ibv_sge sge;
+               struct ibv_recv_wr wr;
+       } rep;
 };
 
 struct tevent_req *smb_direct_negotiate_send(TALLOC_CTX *mem_ctx,
@@ -375,6 +389,9 @@ struct tevent_req *smb_direct_negotiate_send(TALLOC_CTX *mem_ctx,
 {
        struct tevent_req *req;
        struct smb_direct_negotiate_state *state;
+       struct ibv_recv_wr *bad_recv_wr = NULL;
+       struct ibv_send_wr *bad_send_wr = NULL;
+       int ret;
 
        req = tevent_req_create(mem_ctx, &state,
                                struct smb_direct_negotiate_state);
@@ -399,28 +416,63 @@ struct tevent_req *smb_direct_negotiate_send(TALLOC_CTX *mem_ctx,
        if (tevent_req_nomem(transport->rdma.fde_channel, req)) {
                return tevent_req_post(req, ev);
        }
-#if 0
-       cb->recv_mr = ibv_reg_mr(cb->pd, &cb->recv_buf, sizeof cb->recv_buf,
-                                IBV_ACCESS_LOCAL_WRITE);
-       if (!cb->recv_mr) {
-               fprintf(stderr, "recv_buf reg_mr failed\n");
-               return errno;
+
+       SSVAL(state->req.buffer, 0x00, 0x0100);
+       SSVAL(state->req.buffer, 0x02, 0x0100);
+       SSVAL(state->req.buffer, 0x04, 0x0000);
+       SSVAL(state->req.buffer, 0x06, 0x000A);
+       SIVAL(state->req.buffer, 0x08, 0x00000400);
+       SIVAL(state->req.buffer, 0x0C, 0x00000400);
+       SIVAL(state->req.buffer, 0x10, 0x00020000);
+
+       state->req.mr = ibv_reg_mr(transport->ibv.pd,
+                                  state->req.buffer,
+                                  sizeof(state->req.buffer),
+                                  IBV_ACCESS_LOCAL_WRITE);
+       if (tevent_req_nomem(state->req.mr, req)) {
+               return tevent_req_post(req, ev);
        }
 
-       cb->send_mr = ibv_reg_mr(cb->pd, &cb->send_buf, sizeof cb->send_buf, 0);
-       if (!cb->send_mr) {
-               fprintf(stderr, "send_buf reg_mr failed\n");
-               ret = errno;
-               goto err1;
+       state->req.sge.addr = (uint64_t) (uintptr_t) state->req.buffer;
+       state->req.sge.length = sizeof(state->req.buffer);;
+       state->req.sge.lkey = state->req.mr->lkey;
+       state->req.wr.opcode = IBV_WR_SEND;
+       state->req.wr.send_flags = IBV_SEND_SIGNALED;
+       state->req.wr.sg_list = &state->req.sge;
+       state->req.wr.num_sge = 1;
+
+       state->rep.mr = ibv_reg_mr(transport->ibv.pd,
+                                  state->rep.buffer,
+                                  sizeof(state->rep.buffer),
+                                  0);
+       if (tevent_req_nomem(state->rep.mr, req)) {
+               return tevent_req_post(req, ev);
        }
 
-       cb->rdma_buf = malloc(cb->size);
-       if (!cb->rdma_buf) {
-               fprintf(stderr, "rdma_buf malloc failed\n");
-               ret = -ENOMEM;
-               goto err2;
+       state->rep.sge.addr = (uint64_t) (uintptr_t) state->rep.buffer;
+       state->rep.sge.length = sizeof(state->rep.buffer);;
+       state->rep.sge.lkey = state->rep.mr->lkey;
+       state->rep.wr.sg_list = &state->rep.sge;
+       state->rep.wr.num_sge = 1;
+
+       errno = 0;
+       ret = ibv_post_recv(transport->ibv.qp, &state->rep.wr, &bad_recv_wr);
+       if (ret != 0) {
+               DEBUG(0,("%s:%s: ret[%d] errno[%d]\n",
+                       __location__, __FUNCTION__, ret, errno));
+
        }
-#endif
+
+       errno = 0;
+       ret = ibv_post_send(transport->ibv.qp, &state->req.wr, &bad_send_wr);
+       if (ret != 0) {
+               DEBUG(0,("%s:%s: ret[%d] errno[%d]\n",
+                       __location__, __FUNCTION__, ret, errno));
+
+       }
+
+               DEBUG(0,("%s:%s: ret[%d] errno[%d]\n",
+                       __location__, __FUNCTION__, ret, errno));
        return req;
 }
 
@@ -463,6 +515,8 @@ static void smb_direct_negotiate_ibv_handler(struct tevent_context *ev,
 
        ret = ibv_poll_cq(state->t->ibv.cq, 1, &wc);
        if (ret != 1) {
+               DEBUG(0,("%s:%s: ret[%d] errno[%d]\n",
+                       __location__, __FUNCTION__, ret, errno));
        }
 
        ret = 0;
@@ -484,6 +538,8 @@ static void smb_direct_negotiate_ibv_handler(struct tevent_context *ev,
                break;
        }
 
+               DEBUG(0,("%s:%s: ret[%d] errno[%d]\n",
+                       __location__, __FUNCTION__, ret, errno));
        ibv_ack_cq_events(state->t->ibv.cq, 1);
 }
 
@@ -548,7 +604,7 @@ static void smb_direct_negotiate_rdma_handler(struct tevent_context *ev,
        }
 }
 
-NTSTATUS smb_direct_rdma_connect_recv(struct tevent_req *req)
+NTSTATUS smb_direct_negotiate_recv(struct tevent_req *req)
 {
        struct smb_direct_negotiate_state *state =
                tevent_req_data(req,