WIP
authorRalph Boehme <slow@samba.org>
Fri, 30 Sep 2016 06:08:43 +0000 (23:08 -0700)
committerStefan Metzmacher <metze@samba.org>
Fri, 1 Jun 2018 12:35:10 +0000 (14:35 +0200)
libcli/smb/smb_direct_daemon.c

index 83d891fb21669a0079804bbe056aac2ced0c4f8a..0ea3e5944fd9b902b1b1502b91aa36ec3476861e 100644 (file)
@@ -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);