summaryrefslogtreecommitdiff
path: root/source4/torture
diff options
context:
space:
mode:
Diffstat (limited to 'source4/torture')
-rw-r--r--source4/torture/nbt/wins.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/source4/torture/nbt/wins.c b/source4/torture/nbt/wins.c
index 9f7f749677..c581a69ca7 100644
--- a/source4/torture/nbt/wins.c
+++ b/source4/torture/nbt/wins.c
@@ -20,6 +20,8 @@
*/
#include "includes.h"
+#include "dlinklist.h"
+#include "lib/events/events.h"
#include "lib/socket/socket.h"
#include "libcli/resolve/resolve.h"
#include "system/network.h"
@@ -50,9 +52,11 @@ static bool nbt_test_wins_name(struct torture_context *tctx, const char *address
bool try_low_port)
{
struct nbt_name_register_wins io;
+ struct nbt_name_register name_register;
struct nbt_name_query query;
struct nbt_name_refresh_wins refresh;
struct nbt_name_release release;
+ struct nbt_name_request *req;
NTSTATUS status;
struct nbt_name_socket *nbtsock = torture_init_nbt_socket(tctx);
const char *myaddress;
@@ -130,6 +134,56 @@ static bool nbt_test_wins_name(struct torture_context *tctx, const char *address
CHECK_STRING(tctx, io.out.wins_server, address);
CHECK_VALUE(tctx, io.out.rcode, 0);
+
+ torture_comment(tctx, "register the name correct address\n");
+ name_register.in.name = *name;
+ name_register.in.dest_port = lp_nbt_port(tctx->lp_ctx);
+ name_register.in.dest_addr = address;
+ name_register.in.address = myaddress;
+ name_register.in.nb_flags = nb_flags;
+ name_register.in.register_demand= false;
+ name_register.in.broadcast = false;
+ name_register.in.multi_homed = true;
+ name_register.in.ttl = 300000;
+ name_register.in.timeout = 3;
+ name_register.in.retries = 2;
+
+ /*
+ * test if the server ignores resent requests
+ */
+ req = nbt_name_register_send(nbtsock, &name_register);
+ while (true) {
+ event_loop_once(nbtsock->event_ctx);
+ if (req->state != NBT_REQUEST_WAIT) {
+ break;
+ }
+ if (req->received_wack) {
+ /*
+ * if we received the wack response
+ * we resend the request and the
+ * server should ignore that
+ * and not handle it as new request
+ */
+ req->state = NBT_REQUEST_SEND;
+ DLIST_ADD_END(nbtsock->send_queue, req,
+ struct nbt_name_request *);
+ EVENT_FD_WRITEABLE(nbtsock->fde);
+ break;
+ }
+ }
+
+ status = nbt_name_register_recv(req, tctx, &name_register);
+ if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
+ torture_assert_ntstatus_ok(tctx, status,
+ talloc_asprintf(tctx, "No response from %s for name register\n",
+ address));
+ }
+ torture_assert_ntstatus_ok(tctx, status,
+ talloc_asprintf(tctx, "Bad response from %s for name register\n",
+ address));
+
+ CHECK_VALUE(tctx, name_register.out.rcode, 0);
+ CHECK_STRING(tctx, name_register.out.reply_addr, myaddress);
}
torture_comment(tctx, "register the name correct address\n");