smbdirect master3-signing
authorStefan Metzmacher <metze@samba.org>
Tue, 18 Sep 2012 02:57:23 +0000 (04:57 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 18 Sep 2012 03:10:25 +0000 (05:10 +0200)
libcli/smb/smb_transport_direct.c

index e0c63fd3503ece0b1ad7e5773e450432454ba796..39d222e2ac5eda5b27accfe73900f283744965a8 100644 (file)
@@ -456,8 +456,9 @@ struct tevent_req *smb_direct_negotiate_send(TALLOC_CTX *mem_ctx,
                return tevent_req_post(req, ev);
        }
 
+       memset(state->rep.buffer, 0x1F, sizeof(state->rep.buffer));
        state->rep.sge[0].addr = (uint64_t) (uintptr_t) state->rep.buffer;
-       state->rep.sge[0].length = sizeof(state->rep.buffer);;
+       state->rep.sge[0].length = sizeof(state->rep.buffer);
        state->rep.sge[0].lkey = state->rep.mr->lkey;
        state->rep.wr.sg_list = state->rep.sge;
        state->rep.wr.num_sge = ARRAY_SIZE(state->rep.sge);
@@ -534,13 +535,17 @@ static void smb_direct_negotiate_ibv_handler(struct tevent_context *ev,
        switch (wc.opcode) {
        case IBV_WC_SEND:
                break;
+       case IBV_WC_RECV:
+               DEBUG(0,("%s:%s: ret[%d] errno[%d]\n",
+                       __location__, __FUNCTION__, ret, errno));
+               dump_data(0, state->rep.buffer, sizeof(state->rep.buffer));
+
+               //ret = ibv_post_recv(cb->qp, &cb->rq_wr, &bad_wr);
+               break;
        case IBV_WC_RDMA_WRITE:
                break;
        case IBV_WC_RDMA_READ:
                break;
-       case IBV_WC_RECV:
-               //ret = ibv_post_recv(cb->qp, &cb->rq_wr, &bad_wr);
-               break;
        default:
                break;
        }
@@ -585,6 +590,9 @@ static void smb_direct_negotiate_rdma_handler(struct tevent_context *ev,
        }
 
        switch (state->t->rdma.cm_event->event) {
+       case RDMA_CM_EVENT_DISCONNECTED:
+               status = NT_STATUS_CONNECTION_DISCONNECTED;
+               break;
        case RDMA_CM_EVENT_ADDR_RESOLVED:
        case RDMA_CM_EVENT_ADDR_ERROR:
        case RDMA_CM_EVENT_ROUTE_RESOLVED:
@@ -595,13 +603,12 @@ static void smb_direct_negotiate_rdma_handler(struct tevent_context *ev,
        case RDMA_CM_EVENT_CONNECT_ERROR:
        case RDMA_CM_EVENT_UNREACHABLE:
        case RDMA_CM_EVENT_REJECTED:
-       case RDMA_CM_EVENT_DISCONNECTED:
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
        case RDMA_CM_EVENT_MULTICAST_JOIN:
        case RDMA_CM_EVENT_MULTICAST_ERROR:
        case RDMA_CM_EVENT_ADDR_CHANGE:
        case RDMA_CM_EVENT_TIMEWAIT_EXIT:
-               //error
+               status = NT_STATUS_INVALID_NETWORK_RESPONSE;
                break;
        }
 
@@ -609,6 +616,10 @@ static void smb_direct_negotiate_rdma_handler(struct tevent_context *ev,
                rdma_ack_cm_event(state->t->rdma.cm_event);
                state->t->rdma.cm_event = NULL;
        }
+
+       TALLOC_FREE(state->t->ibv.fde_channel);
+       TALLOC_FREE(state->t->rdma.fde_channel);
+       tevent_req_nterror(req, status);
 }
 
 NTSTATUS smb_direct_negotiate_recv(struct tevent_req *req)