hack call smb_direct
authorStefan Metzmacher <metze@samba.org>
Sun, 16 Sep 2012 21:43:06 +0000 (23:43 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 18 Sep 2012 03:10:24 +0000 (05:10 +0200)
source3/libsmb/smbsock_connect.c

index c5fd2c843127d4628e5ea073dceafa70b18f8730..58ed95c1a13c0680ce7645df2f5b8bb7b8d95aa0 100644 (file)
@@ -312,6 +312,8 @@ struct smbsock_connect_state {
        uint8_t calling_type;
        struct tevent_req *req_139;
        struct tevent_req *req_445;
+       struct tevent_req *req_5445;
+       struct smb_direct_transport *smb_direct;
        int sock;
        uint16_t port;
 };
@@ -321,6 +323,15 @@ static int smbsock_connect_state_destructor(
 static void smbsock_connect_connected(struct tevent_req *subreq);
 static void smbsock_connect_do_139(struct tevent_req *subreq);
 
+struct smb_direct_transport *smb_direct_transport_create(TALLOC_CTX *mem_ctx);
+struct tevent_req *smb_direct_rdma_connect_send(TALLOC_CTX *mem_ctx,
+                                       struct tevent_context *ev,
+                                       struct smb_direct_transport *transport,
+                                       const struct sockaddr_storage *addr,
+                                       struct tsocket_address *local_addr,
+                                       struct tsocket_address *remote_addr);
+NTSTATUS smb_transport_direct_rdma_connect_recv(struct tevent_req *req);
+
 struct tevent_req *smbsock_connect_send(TALLOC_CTX *mem_ctx,
                                        struct tevent_context *ev,
                                        const struct sockaddr_storage *addr,
@@ -335,7 +346,7 @@ struct tevent_req *smbsock_connect_send(TALLOC_CTX *mem_ctx,
 
        req = tevent_req_create(mem_ctx, &state, struct smbsock_connect_state);
        if (req == NULL) {
-               return NULL;
+       return NULL;
        }
        state->ev = ev;
        state->addr = addr;
@@ -379,6 +390,15 @@ struct tevent_req *smbsock_connect_send(TALLOC_CTX *mem_ctx,
         * port==0, try both
         */
 
+       state->smb_direct = smb_direct_transport_create(state);
+       state->req_5445 = smb_direct_rdma_connect_send(state, ev, state->smb_direct,
+                                                      addr, NULL, NULL);
+       if (tevent_req_nomem(state->req_5445, req)) {
+               return tevent_req_post(req, ev);
+       }
+       tevent_req_set_callback(state->req_5445, smbsock_connect_connected,
+                               req);
+
        state->req_445 = open_socket_out_send(state, ev, addr, TCP_SMB_PORT, 5000);
        if (tevent_req_nomem(state->req_445, req)) {
                return tevent_req_post(req, ev);
@@ -442,21 +462,27 @@ static void smbsock_connect_connected(struct tevent_req *subreq)
                subreq, struct tevent_req);
        struct smbsock_connect_state *state = tevent_req_data(
                req, struct smbsock_connect_state);
-       struct tevent_req *unfinished_req;
        NTSTATUS status;
 
-       if (subreq == state->req_445) {
+       if (subreq == state->req_5445) {
+
+               status = smb_transport_direct_rdma_connect_recv(subreq);
+               TALLOC_FREE(state->req_5445);
+               TALLOC_FREE(state->smb_direct);
+               state->sock = -1;
+               state->port = 5445;
+               status = NT_STATUS_NOT_IMPLEMENTED;
+
+       } else if (subreq == state->req_445) {
 
                status = open_socket_out_recv(subreq, &state->sock);
                TALLOC_FREE(state->req_445);
-               unfinished_req = state->req_139;
                state->port = TCP_SMB_PORT;
 
        } else if (subreq == state->req_139) {
 
                status = nb_connect_recv(subreq, &state->sock);
                TALLOC_FREE(state->req_139);
-               unfinished_req = state->req_445;
                state->port = NBT_SMB_PORT;
 
        } else {
@@ -465,15 +491,18 @@ static void smbsock_connect_connected(struct tevent_req *subreq)
        }
 
        if (NT_STATUS_IS_OK(status)) {
-               TALLOC_FREE(unfinished_req);
-               state->req_139 = NULL;
-               state->req_445 = NULL;
+               TALLOC_FREE(state->req_5445);
+               TALLOC_FREE(state->req_445);
+               TALLOC_FREE(state->req_139);
                tevent_req_done(req);
                return;
        }
-       if (unfinished_req == NULL) {
+       if ((state->req_5445 == NULL) &&
+           (state->req_445 == NULL) &&
+           (state->req_139 == NULL))
+       {
                /*
-                * Both requests failed
+                * All requests failed
                 */
                tevent_req_nterror(req, status);
                return;