summaryrefslogtreecommitdiff
path: root/source4/torture/nbt
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-04-06 11:17:08 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:11:27 -0500
commit7c6c366150022d6a745dcf18ed67bd264bc9c55d (patch)
treec43db606012e52a129179bef0b489c34a65a8036 /source4/torture/nbt
parent567a74690c9536f464844d647b9fe21ca56b53f3 (diff)
downloadsamba-7c6c366150022d6a745dcf18ed67bd264bc9c55d.tar.gz
samba-7c6c366150022d6a745dcf18ed67bd264bc9c55d.tar.bz2
samba-7c6c366150022d6a745dcf18ed67bd264bc9c55d.zip
r6223: added a bit more datagram infrastructure and the beginnings of a test
suite. The NBT-DGRAM test does a UDP/138 netlogon request, to which a windows server sends a reply, but the windows server sends the reply to the wrong port (it always sends to 138), so the test suite doesn't see it. (This used to be commit a7634625dbc944dd8256a822be290010f341a571)
Diffstat (limited to 'source4/torture/nbt')
-rw-r--r--source4/torture/nbt/dgram.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/source4/torture/nbt/dgram.c b/source4/torture/nbt/dgram.c
new file mode 100644
index 0000000000..c87940a94d
--- /dev/null
+++ b/source4/torture/nbt/dgram.c
@@ -0,0 +1,124 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ NBT dgram testing
+
+ 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 "libcli/nbt/libnbt.h"
+#include "libcli/dgram/libdgram.h"
+#include "librpc/gen_ndr/ndr_nbt.h"
+#include "lib/socket/socket.h"
+#include "lib/events/events.h"
+
+#define TEST_NAME "TORTURE_TEST"
+
+/*
+ reply handler for netlogon request
+*/
+static void netlogon_handler(struct dgram_mailslot_handler *dgmslot,
+ struct nbt_dgram_packet *packet,
+ const char *src_address, int src_port)
+{
+ printf("netlogon reply from %s:%d\n", src_address, src_port);
+}
+
+/* test UDP/138 netlogon requests */
+static BOOL nbt_test_netlogon(TALLOC_CTX *mem_ctx,
+ struct nbt_name name, const char *address)
+{
+ struct dgram_mailslot_handler *dgmslot;
+ struct nbt_dgram_socket *dgmsock = nbt_dgram_socket_init(mem_ctx, NULL);
+ const char *myaddress = talloc_strdup(mem_ctx, iface_best_ip(address));
+ struct nbt_netlogon_packet logon;
+ struct nbt_name myname;
+ NTSTATUS status;
+ int timelimit = lp_parm_int(-1, "torture", "timelimit", 10);
+ struct timeval tv = timeval_current();
+
+ socket_listen(dgmsock->sock, myaddress, 0, 0, 0);
+
+ /* setup a temporary mailslot listener for replies */
+ dgmslot = dgram_mailslot_temp(dgmsock, "\\MAILSLOT\\NET\\GETDC",
+ netlogon_handler, NULL);
+
+
+ ZERO_STRUCT(logon);
+ logon.command = NETLOGON_QUERY_FOR_PDC;
+ logon.req.pdc.computer_name = TEST_NAME;
+ logon.req.pdc.mailslot_name = dgmslot->mailslot_name;
+ logon.req.pdc.unicode_name = TEST_NAME;
+ logon.req.pdc.nt_version = 1;
+ logon.req.pdc.lmnt_token = 0xFFFF;
+ logon.req.pdc.lm20_token = 0xFFFF;
+
+ myname.name = TEST_NAME;
+ myname.type = NBT_NAME_CLIENT;
+ myname.scope = NULL;
+
+ status = dgram_mailslot_netlogon_send(dgmsock, &name, address, &myname, &logon);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("Failed to send netlogon request - %s\n", nt_errstr(status));
+ goto failed;
+ }
+
+
+ while (timeval_elapsed(&tv) < timelimit) {
+ event_loop_once(dgmsock->event_ctx);
+ }
+
+ talloc_free(dgmsock);
+ return True;
+
+failed:
+ talloc_free(dgmsock);
+ return False;
+}
+
+
+/*
+ test nbt dgram operations
+*/
+BOOL torture_nbt_dgram(void)
+{
+ const char *address;
+ struct nbt_name name;
+ TALLOC_CTX *mem_ctx = talloc_new(NULL);
+ NTSTATUS status;
+ BOOL ret = True;
+
+ name.name = lp_parm_string(-1, "torture", "host");
+ name.type = NBT_NAME_PDC;
+ name.scope = NULL;
+
+ /* do an initial name resolution to find its IP */
+ status = resolve_name(&name, mem_ctx, &address);
+ if (!NT_STATUS_IS_OK(status)) {
+ printf("Failed to resolve %s - %s\n",
+ name.name, nt_errstr(status));
+ talloc_free(mem_ctx);
+ return False;
+ }
+
+ ret &= nbt_test_netlogon(mem_ctx, name, address);
+
+ talloc_free(mem_ctx);
+
+ return ret;
+}