r6247: added the server side code for receiving mailslot requests, and
authorAndrew Tridgell <tridge@samba.org>
Fri, 8 Apr 2005 08:57:09 +0000 (08:57 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:11:28 +0000 (13:11 -0500)
parsing incoming netlogon requests. No replies are sent yet.

source/include/structs.h
source/libcli/dgram/dgramsocket.c
source/libcli/dgram/netlogon.c
source/librpc/idl/nbt.idl
source/nbt_server/config.mk
source/nbt_server/dgram/browse.c [new file with mode: 0644]
source/nbt_server/dgram/netlogon.c [new file with mode: 0644]
source/nbt_server/dgram/request.c [new file with mode: 0644]
source/nbt_server/interfaces.c
source/torture/nbt/dgram.c

index 6276012e48a9d7d6769ac8b50d1f8bfdc3af6ddc..b7c9abfe8b9c0e3cf5f38374ca3c84443df9f07d 100644 (file)
@@ -173,6 +173,8 @@ struct nbt_name_refresh_wins;
 struct nbt_name_register_wins;
 
 struct nbt_dgram_packet;
+struct nbt_dgram_socket;
+struct dgram_mailslot_handler;
 
 struct messaging_context;
 struct stream_connection;
index 33734258a371b8a47175fb84c0aa31d7241243c3..a3909df7686c81235c70963a1e0894541adec17d 100644 (file)
@@ -59,7 +59,7 @@ static void dgm_socket_recv(struct nbt_dgram_socket *dgmsock)
        talloc_steal(tmp_ctx, src_addr);
        blob.length = nread;
 
-       DEBUG(0,("Received dgram packet of length %d from %s:%d\n", 
+       DEBUG(2,("Received dgram packet of length %d from %s:%d\n", 
                 blob.length, src_addr, src_port));
 
        packet = talloc(tmp_ctx, struct nbt_dgram_packet);
index c76264eea4dcf88ad48262c6566725f0af9e1d62..a0218e2cb5eff52e9e1869f3d82eddc3d9dfb8e3 100644 (file)
@@ -50,7 +50,7 @@ NTSTATUS dgram_mailslot_netlogon_send(struct nbt_dgram_socket *dgmsock,
 
 
        status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE, 
-                                    "\\MAILSLOT\\NET\\NETLOGON",
+                                    NBT_MAILSLOT_NETLOGON,
                                     dest_name, dest_address, src_name, &blob);
        talloc_free(tmp_ctx);
        return status;
index 6f17a14cde7411296d773614f78242a7a08da224..d9178c6a37fcff4e46c38cdc6d1687eb4e1bfcce 100644 (file)
@@ -224,6 +224,10 @@ interface nbt
           code, but it does make working with these types of dgrams
           easier */
 
+       const string NBT_MAILSLOT_NETLOGON = "\\MAILSLOT\\NET\\NETLOGON";
+       const string NBT_MAILSLOT_GETDC    = "\\MAILSLOT\\GETDC";
+       const string NBT_MAILSLOT_BROWSE   = "\\MAILSLOT\\BROWSE";
+
        typedef [enum8bit] enum {
                SMB_TRANSACTION = 0x25
        } smb_command;
@@ -329,6 +333,7 @@ interface nbt
        typedef struct {
                astring              computer_name;
                astring              mailslot_name;
+               [flag(NDR_ALIGN2)]   DATA_BLOB _pad;
                nstring              unicode_name;
                uint32               nt_version;
                uint16               lmnt_token;
@@ -337,7 +342,8 @@ interface nbt
 
        /* response from request */
        typedef struct {
-               astring              pdc_name;
+               astring pdc_name;
+               [flag(NDR_ALIGN2)]   DATA_BLOB _pad;
                nstring              unicode_pdc_name;
                nstring              domain_name;
                uint32               nt_version;
index bda10b2deb0b9a61ba4b6bcae9c09a03e7da2935..04a9dde1b0adac504bc0373c27648c44cb0cdc7b 100644 (file)
@@ -13,6 +13,18 @@ REQUIRED_SUBSYSTEMS = \
 # End SUBSYSTEM NBTD_WINS
 #######################
 
+#######################
+# Start SUBSYSTEM NBTD_DGRAM
+[SUBSYSTEM::NBTD_DGRAM]
+ADD_OBJ_FILES = \
+               nbt_server/dgram/request.o \
+               nbt_server/dgram/netlogon.o \
+               nbt_server/dgram/browse.o
+REQUIRED_SUBSYSTEMS = \
+               LIBCLI_DGRAM
+# End SUBSYSTEM NBTD_DGRAM
+#######################
+
 #######################
 # Start SUBSYSTEM NBTD
 [SUBSYSTEM::NBTD]
@@ -26,6 +38,6 @@ ADD_OBJ_FILES = \
                nbt_server/defense.o \
                nbt_server/packet.o
 REQUIRED_SUBSYSTEMS = \
-               LIBCLI_NBT NBTD_WINS
+               LIBCLI_NBT NBTD_WINS NBTD_DGRAM
 # End SUBSYSTEM NBTD
 #######################
diff --git a/source/nbt_server/dgram/browse.c b/source/nbt_server/dgram/browse.c
new file mode 100644 (file)
index 0000000..ca9618f
--- /dev/null
@@ -0,0 +1,38 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   NBT datagram browse server
+
+   Copyright (C) Andrew Tridgell       2005
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+#include "dlinklist.h"
+#include "nbt_server/nbt_server.h"
+#include "smbd/service_task.h"
+#include "lib/socket/socket.h"
+
+/*
+  handle incoming browse mailslot requests
+*/
+void nbtd_mailslot_browse_handler(struct dgram_mailslot_handler *dgmslot, 
+                                 struct nbt_dgram_packet *packet, 
+                                 const char *src_address, int src_port)
+{
+       DEBUG(2,("Browse request on '%s' from %s:%d\n", 
+                 dgmslot->mailslot_name, src_address, src_port));
+}
diff --git a/source/nbt_server/dgram/netlogon.c b/source/nbt_server/dgram/netlogon.c
new file mode 100644 (file)
index 0000000..471145c
--- /dev/null
@@ -0,0 +1,54 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   NBT datagram netlogon server
+
+   Copyright (C) Andrew Tridgell       2005
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+#include "dlinklist.h"
+#include "nbt_server/nbt_server.h"
+#include "smbd/service_task.h"
+#include "lib/socket/socket.h"
+
+/*
+  handle incoming netlogon mailslot requests
+*/
+void nbtd_mailslot_netlogon_handler(struct dgram_mailslot_handler *dgmslot, 
+                                   struct nbt_dgram_packet *packet, 
+                                   const char *src_address, int src_port)
+{
+       NTSTATUS status = NT_STATUS_NO_MEMORY;
+       struct nbt_netlogon_packet *netlogon = 
+               talloc(dgmslot, struct nbt_netlogon_packet);
+       if (netlogon == NULL) goto failed;
+
+       DEBUG(2,("netlogon request from %s:%d\n", src_address, src_port));
+       status = dgram_mailslot_netlogon_parse(dgmslot, netlogon, packet, netlogon);
+       if (!NT_STATUS_IS_OK(status)) goto failed;
+
+       NDR_PRINT_DEBUG(nbt_netlogon_packet, netlogon);
+
+       talloc_free(netlogon);
+       return;
+
+failed:
+       DEBUG(2,("nbtd netlogon handler failed from %s:%d - %s\n",
+                src_address, src_port, nt_errstr(status)));
+       talloc_free(netlogon);
+}
diff --git a/source/nbt_server/dgram/request.c b/source/nbt_server/dgram/request.c
new file mode 100644 (file)
index 0000000..59b94bc
--- /dev/null
@@ -0,0 +1,113 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   NBT datagram server
+
+   Copyright (C) Andrew Tridgell       2005
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+#include "dlinklist.h"
+#include "nbt_server/nbt_server.h"
+#include "smbd/service_task.h"
+#include "lib/socket/socket.h"
+
+/*
+  a list of mailslots that we have static handlers for
+*/
+static const struct {
+       const char *mailslot_name;
+       dgram_mailslot_handler_t handler;
+} mailslot_handlers[] = {
+       { NBT_MAILSLOT_NETLOGON, nbtd_mailslot_netlogon_handler },
+       { NBT_MAILSLOT_BROWSE,   nbtd_mailslot_browse_handler }
+};
+
+/*
+  receive an incoming dgram request. This is used for general datagram
+  requests. Mailslot requests for our listening mailslots
+  are handled in the specific mailslot handlers
+*/
+void dgram_request_handler(struct nbt_dgram_socket *dgmsock, 
+                          struct nbt_dgram_packet *packet, 
+                          const char *src_address, int src_port)
+{
+       DEBUG(0,("General datagram request from %s:%d\n", src_address, src_port));
+       NDR_PRINT_DEBUG(nbt_dgram_packet, packet);
+}
+
+
+/*
+  setup the port 138 datagram listener for a given interface
+*/
+NTSTATUS nbtd_dgram_setup(struct nbtd_interface *iface, const char *bind_address)
+{
+       struct nbt_dgram_socket *bcast_dgmsock;
+       struct nbtd_server *nbtsrv = iface->nbtsrv;
+       NTSTATUS status;
+       /* the list of mailslots that we are interested in */
+       int i;
+
+       /* listen for broadcasts on port 138 */
+       bcast_dgmsock = nbt_dgram_socket_init(iface, nbtsrv->task->event_ctx);
+       NT_STATUS_HAVE_NO_MEMORY(bcast_dgmsock);
+       
+       status = socket_listen(bcast_dgmsock->sock, iface->bcast_address, 
+                              lp_dgram_port(), 0, 0);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("Failed to bind to %s:%d - %s\n", 
+                        iface->bcast_address, lp_dgram_port(), nt_errstr(status)));
+               talloc_free(iface);
+               return status;
+       }
+       
+       dgram_set_incoming_handler(bcast_dgmsock, dgram_request_handler, iface);
+
+       /* listen for unicasts on port 138 */
+       iface->dgmsock = nbt_dgram_socket_init(iface, nbtsrv->task->event_ctx);
+       NT_STATUS_HAVE_NO_MEMORY(iface->dgmsock);
+
+       status = socket_listen(iface->dgmsock->sock, bind_address, 
+                              lp_dgram_port(), 0, 0);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("Failed to bind to %s:%d - %s\n", 
+                        bind_address, lp_dgram_port(), nt_errstr(status)));
+               talloc_free(iface);
+               return status;
+       }
+       dgram_set_incoming_handler(iface->dgmsock, dgram_request_handler, iface);
+
+
+       for (i=0;i<ARRAY_SIZE(mailslot_handlers);i++) {
+               /* note that we don't need to keep the pointer
+                  to the dgmslot around - the callback is all
+                  we need */
+               struct dgram_mailslot_handler *dgmslot;
+
+               dgmslot = dgram_mailslot_listen(bcast_dgmsock, 
+                                               mailslot_handlers[i].mailslot_name,
+                                               mailslot_handlers[i].handler, iface);
+               NT_STATUS_HAVE_NO_MEMORY(dgmslot);
+
+               dgmslot = dgram_mailslot_listen(iface->dgmsock, 
+                                               mailslot_handlers[i].mailslot_name,
+                                               mailslot_handlers[i].handler, iface);
+               NT_STATUS_HAVE_NO_MEMORY(dgmslot);
+       }
+
+       return NT_STATUS_OK;
+}
index dfd453832122e04fda2d43929d53f278f9338264..b77e692e105f87b92c5ab2879fdb3681aa7aeeed 100644 (file)
@@ -63,17 +63,6 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock,
 }
 
 
-/*
-  receive an incoming dgram request
-*/
-static void dgram_request_handler(struct nbt_dgram_socket *dgmsock, 
-                                 struct nbt_dgram_packet *packet, 
-                                 const char *src_address, int src_port)
-{
-}
-
-
-
 /*
   find a registered name on an interface
 */
@@ -123,7 +112,6 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv,
 
        if (strcmp(netmask, "0.0.0.0") != 0) {
                struct nbt_name_socket *bcast_nbtsock;
-               struct nbt_dgram_socket *bcast_dgmsock;
 
                /* listen for broadcasts on port 137 */
                bcast_nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx);
@@ -138,21 +126,6 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv,
                }
 
                nbt_set_incoming_handler(bcast_nbtsock, nbtd_request_handler, iface);
-
-
-               /* listen for broadcasts on port 138 */
-               bcast_dgmsock = nbt_dgram_socket_init(iface, nbtsrv->task->event_ctx);
-               NT_STATUS_HAVE_NO_MEMORY(bcast_dgmsock);
-
-               status = socket_listen(bcast_dgmsock->sock, bcast, lp_dgram_port(), 0, 0);
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0,("Failed to bind to %s:%d - %s\n", 
-                                bcast, lp_dgram_port(), nt_errstr(status)));
-                       talloc_free(iface);
-                       return status;
-               }
-
-               dgram_set_incoming_handler(bcast_dgmsock, dgram_request_handler, iface);
        }
 
        /* listen for unicasts on port 137 */
@@ -162,26 +135,21 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv,
        status = socket_listen(iface->nbtsock->sock, bind_address, lp_nbt_port(), 0, 0);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0,("Failed to bind to %s:%d - %s\n", 
-                        address, lp_nbt_port(), nt_errstr(status)));
+                        bind_address, lp_nbt_port(), nt_errstr(status)));
                talloc_free(iface);
                return status;
        }
        nbt_set_incoming_handler(iface->nbtsock, nbtd_request_handler, iface);
 
-
-       /* listen for unicasts on port 138 */
-       iface->dgmsock = nbt_dgram_socket_init(iface, nbtsrv->task->event_ctx);
-       NT_STATUS_HAVE_NO_MEMORY(iface->dgmsock);
-
-       status = socket_listen(iface->dgmsock->sock, bind_address, lp_dgram_port(), 0, 0);
+       /* also setup the datagram listeners */
+       status = nbtd_dgram_setup(iface, bind_address);
        if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0,("Failed to bind to %s:%d - %s\n", 
-                        address, lp_dgram_port(), nt_errstr(status)));
+               DEBUG(0,("Failed to setup dgram listen on %s - %s\n", 
+                        bind_address, nt_errstr(status)));
                talloc_free(iface);
                return status;
        }
-       dgram_set_incoming_handler(iface->dgmsock, dgram_request_handler, iface);
-
+       
        if (strcmp(netmask, "0.0.0.0") == 0) {
                DLIST_ADD(nbtsrv->bcast_interface, iface);
        } else {
index f7d838e32a6b28ecc867a2c5487f548beec20d88..c5a3b61136a47dfb64b14e51bc352efe4303f819 100644 (file)
@@ -78,7 +78,7 @@ static BOOL nbt_test_netlogon(TALLOC_CTX *mem_ctx,
        }
 
        /* setup a temporary mailslot listener for replies */
-       dgmslot = dgram_mailslot_temp(dgmsock, "\\MAILSLOT\\NET\\GETDC", 
+       dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
                                      netlogon_handler, &replies);