__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:
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,
{
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);
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;
}
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;
break;
}
+ DEBUG(0,("%s:%s: ret[%d] errno[%d]\n",
+ __location__, __FUNCTION__, ret, errno));
ibv_ack_cq_events(state->t->ibv.cq, 1);
}
}
}
-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,