STEP:smbsock_connect: 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>
Fri, 1 Jun 2018 12:35:01 +0000 (14:35 +0200)
source3/libsmb/cliconnect.c
source3/libsmb/smbsock_connect.c

index 837299d922022ed310fb53a0a3d470dca4196a1a..cbb4b9871c2e82ab6be882ce42ee5b1946ec9df4 100644 (file)
@@ -2586,7 +2586,7 @@ static void cli_connect_sock_done(struct tevent_req *subreq)
        if (tevent_req_nterror(req, status)) {
                return;
        }
-       set_socket_options(state->fd, lp_socket_options());
+       //set_socket_options(state->fd, lp_socket_options());
        tevent_req_done(req);
 }
 
@@ -2681,7 +2681,7 @@ static void cli_connect_nb_done(struct tevent_req *subreq)
        state->cli = cli_state_create(state, fd, state->desthost,
                                      state->signing_state, state->flags);
        if (tevent_req_nomem(state->cli, req)) {
-               close(fd);
+               //close(fd);
                return;
        }
        tevent_req_done(req);
index 9f915e1bb42b44d6ad48a90e7637d6e9bb278422..95661c407943b0bbeec912689b697c1dae782749 100644 (file)
@@ -24,6 +24,7 @@
 #include "client.h"
 #include "async_smb.h"
 #include "../libcli/smb/read_smb.h"
+#include "../libcli/smb/smb_transport.h"
 #include "libsmb/nmblib.h"
 
 struct cli_session_request_state {
@@ -336,6 +337,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_transport *smb_direct;
        int sock;
        uint16_t port;
 };
@@ -344,6 +347,7 @@ static void smbsock_connect_cleanup(struct tevent_req *req,
                                    enum tevent_req_state req_state);
 static void smbsock_connect_connected(struct tevent_req *subreq);
 static void smbsock_connect_do_139(struct tevent_req *subreq);
+static void smbsock_connect_do_5445(struct tevent_req *subreq);
 
 struct tevent_req *smbsock_connect_send(TALLOC_CTX *mem_ctx,
                                        struct tevent_context *ev,
@@ -356,6 +360,7 @@ struct tevent_req *smbsock_connect_send(TALLOC_CTX *mem_ctx,
 {
        struct tevent_req *req;
        struct smbsock_connect_state *state;
+       NTSTATUS status;
 
        req = tevent_req_create(mem_ctx, &state, struct smbsock_connect_state);
        if (req == NULL) {
@@ -403,6 +408,19 @@ struct tevent_req *smbsock_connect_send(TALLOC_CTX *mem_ctx,
         * port==0, try both
         */
 
+       status = smb_transport_direct_create(state, &state->smb_direct);
+       if (tevent_req_nterror(req, status)) {
+               return tevent_req_post(req, ev);
+       }
+       state->req_5445 = smb_transport_direct_connect_rdma_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_do_5445,
+                               req);
+
+#if 0
        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);
@@ -421,6 +439,7 @@ struct tevent_req *smbsock_connect_send(TALLOC_CTX *mem_ctx,
        }
        tevent_req_set_callback(state->req_139, smbsock_connect_do_139,
                                req);
+#endif
        return req;
 }
 
@@ -478,27 +497,56 @@ static void smbsock_connect_do_139(struct tevent_req *subreq)
                                req);
 }
 
+static void smbsock_connect_do_5445(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct smbsock_connect_state *state = tevent_req_data(
+               req, struct smbsock_connect_state);
+       NTSTATUS status;
+
+       status = smb_transport_direct_connect_rdma_recv(subreq);
+       TALLOC_FREE(subreq);
+       if (tevent_req_nterror(req, status)) {
+               return;
+       }
+
+       state->req_5445 = smb_transport_direct_connect_negotiate_send(state,
+                                       state->ev,
+                                       state->smb_direct);
+       if (tevent_req_nomem(state->req_5445, req)) {
+               return;
+       }
+       tevent_req_set_callback(state->req_5445, smbsock_connect_connected,
+                               req);
+}
+
 static void smbsock_connect_connected(struct tevent_req *subreq)
 {
        struct tevent_req *req = tevent_req_callback_data(
                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_connect_negotiate_recv(subreq);
+               TALLOC_FREE(state->req_5445);
+               talloc_steal(NULL, state->smb_direct);
+               state->sock = (intptr_t)state->smb_direct;
+               state->port = 5445;
+
+       } 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 {
@@ -507,15 +555,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;