From 1a718057c3f5e01784e9cc76810a090314aaab41 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Thu, 29 Sep 2016 23:08:43 -0700 Subject: [PATCH] WIP --- libcli/smb/smb_direct_daemon.c | 57 +++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/libcli/smb/smb_direct_daemon.c b/libcli/smb/smb_direct_daemon.c index 83d891fb2166..0ea3e5944fd9 100644 --- a/libcli/smb/smb_direct_daemon.c +++ b/libcli/smb/smb_direct_daemon.c @@ -581,7 +581,7 @@ static NTSTATUS smbd_direct_daemon_listen( ZERO_STRUCT(inaddr); inaddr.sin_family = AF_INET; - inaddr.sin_port = 5445; + inaddr.sin_port = htons(5445); inaddr.sin_addr.s_addr = INADDR_ANY; result = rdma_bind_addr(daemon_state->rdma.cm_id, @@ -853,7 +853,6 @@ static void rdma_cm_handler(struct tevent_context *ev, private_data, struct smb_direct_daemon_state); struct smb_direct_connection *sconn = NULL; struct rdma_cm_event *cm_ev = NULL; - struct rdma_cm_event cm_ev_copy; int result; NTSTATUS status; @@ -865,41 +864,49 @@ static void rdma_cm_handler(struct tevent_context *ev, return; } - cm_ev_copy = *cm_ev; - result = rdma_ack_cm_event(cm_ev); - if (result != 0) { - DBG_ERR("rdma_ack_cm_event failed [%s]\n", strerror(errno)); - goto fail; - } - cm_ev = NULL; + DBG_ERR("cm_event type [%d] cm_id [%p]\n", + cm_ev->event, cm_ev->id); + + switch (cm_ev->event) { + case RDMA_CM_EVENT_CONNECT_REQUEST: { + struct rdma_conn_param conn_param; + uint8_t ird_ord_hdr[8]; - DBG_DEBUG("cm_event type [%d] cm_id [%p]\n", - cm_ev_copy.event, cm_ev_copy.id); + RSIVAL(ird_ord_hdr, 0, 0); + RSIVAL(ird_ord_hdr, 4, 16); - switch (cm_ev_copy.event) { - case RDMA_CM_EVENT_CONNECT_REQUEST: DBG_DEBUG("RDMA_CM_EVENT_CONNECT_REQUEST\n"); - result = rdma_accept(cm_ev_copy.id, NULL); + ZERO_STRUCT(conn_param); +// conn_param.private_data = ird_ord_hdr; +// conn_param.private_data_len = sizeof(ird_ord_hdr); + conn_param.responder_resources = 1; + conn_param.initiator_depth = 1; +// conn_param.retry_count = 10; + + errno = 0; + + result = rdma_accept(cm_ev->id, NULL); if (result != 0) { - DBG_ERR("rdma_accept failed [%s]\n", strerror(errno)); + DBG_ERR("rdma_accept failed [%s] result [%d]\n", strerror(errno), result); goto fail; } sconn = smb_direct_connection_listener(daemon_state, - cm_ev_copy.id); + cm_ev->id); if (sconn == NULL) { DBG_ERR("smb_direct_connection_create failed\n"); return; } - cm_ev_copy.id->context = sconn; + cm_ev->id->context = sconn; break; + } case RDMA_CM_EVENT_ESTABLISHED: DBG_DEBUG("RDMA_CM_EVENT_ESTABLISHED\n"); - sconn = talloc_get_type_abort(cm_ev_copy.id->context, + sconn = talloc_get_type_abort(cm_ev->id->context, struct smb_direct_connection); status = smb_direct_connection_complete_alloc(sconn); if (!NT_STATUS_IS_OK(status)) { @@ -914,7 +921,7 @@ static void rdma_cm_handler(struct tevent_context *ev, case RDMA_CM_EVENT_DISCONNECTED: DBG_DEBUG("RDMA_CM_EVENT_DISCONNECTED\n"); - sconn = talloc_get_type(cm_ev_copy.id->context, + sconn = talloc_get_type(cm_ev->id->context, struct smb_direct_connection); TALLOC_FREE(sconn); break; @@ -924,17 +931,25 @@ static void rdma_cm_handler(struct tevent_context *ev, goto fail; default: - DBG_ERR("event %d\n", cm_ev_copy.event); + DBG_ERR("event %d\n", cm_ev->event); goto fail; } + result = rdma_ack_cm_event(cm_ev); + if (result != 0) { + DBG_ERR("rdma_ack_cm_event failed [%s]\n", strerror(errno)); + goto fail; + } return; fail: - if (cm_ev_copy.id == daemon_state->rdma.cm_id) { + rdma_ack_cm_event(cm_ev); + + if (cm_ev->id == daemon_state->rdma.cm_id) { /* Listening conn is erroring out, shut it down and die */ TALLOC_FREE(daemon_state->listening_conn); + // tevent_req_error(daemon_state->req, EPANIC); } TALLOC_FREE(sconn); -- 2.34.1