s4-smbtorture: pick correct last packet while checking backchannel replies in RPC...
[ira/wip.git] / source4 / torture / nbt / winsbench.c
index f06db648fc96c441057fca258c41543349899abf..bea3d4f9cff8d604ddb0e67a436dcd0815cb6576 100644 (file)
@@ -27,6 +27,7 @@
 #include "lib/socket/netif.h"
 #include "torture/torture.h"
 #include "torture/nbt/proto.h"
+#include "param/param.h"
 
 struct wins_state {
        int num_names;
@@ -34,6 +35,7 @@ struct wins_state {
        int pass_count;
        int fail_count;
        const char *wins_server;
+       uint16_t wins_port;
        const char *my_ip;
        uint32_t ttl;
 };
@@ -54,7 +56,7 @@ static struct nbt_name generate_name(TALLOC_CTX *tctx, int idx)
 
 static void register_handler(struct nbt_name_request *req)
 {
-       struct idx_state *istate = talloc_get_type(req->async.private, struct idx_state);
+       struct idx_state *istate = talloc_get_type(req->async.private_data, struct idx_state);
        struct wins_state *state = istate->state;
        struct nbt_name_register io;
        NTSTATUS status;
@@ -85,6 +87,7 @@ static void generate_register(struct nbt_name_socket *nbtsock, struct wins_state
 
        io.in.name            = generate_name(tmp_ctx, idx);
        io.in.dest_addr       = state->wins_server;
+       io.in.dest_port       = state->wins_port;
        io.in.address         = state->my_ip;
        io.in.nb_flags        = NBT_NODE_H;
        io.in.register_demand = false;
@@ -97,7 +100,7 @@ static void generate_register(struct nbt_name_socket *nbtsock, struct wins_state
        req = nbt_name_register_send(nbtsock, &io);
 
        req->async.fn = register_handler;
-       req->async.private = istate;
+       req->async.private_data = istate;
 
        talloc_free(tmp_ctx);
 }
@@ -105,7 +108,7 @@ static void generate_register(struct nbt_name_socket *nbtsock, struct wins_state
 
 static void release_handler(struct nbt_name_request *req)
 {
-       struct idx_state *istate = talloc_get_type(req->async.private, struct idx_state);
+       struct idx_state *istate = talloc_get_type(req->async.private_data, struct idx_state);
        struct wins_state *state = istate->state;
        struct nbt_name_release io;
        NTSTATUS status;
@@ -136,6 +139,7 @@ static void generate_release(struct nbt_name_socket *nbtsock, struct wins_state
        istate->state = state;
 
        io.in.name            = generate_name(tmp_ctx, idx);
+       io.in.dest_port       = state->wins_port;
        io.in.dest_addr       = state->wins_server;
        io.in.address         = state->my_ip;
        io.in.nb_flags        = NBT_NODE_H;
@@ -146,7 +150,7 @@ static void generate_release(struct nbt_name_socket *nbtsock, struct wins_state
        req = nbt_name_release_send(nbtsock, &io);
 
        req->async.fn = release_handler;
-       req->async.private = istate;
+       req->async.private_data = istate;
 
        talloc_free(tmp_ctx);
 }
@@ -154,7 +158,7 @@ static void generate_release(struct nbt_name_socket *nbtsock, struct wins_state
 
 static void query_handler(struct nbt_name_request *req)
 {
-       struct idx_state *istate = talloc_get_type(req->async.private, struct idx_state);
+       struct idx_state *istate = talloc_get_type(req->async.private_data, struct idx_state);
        struct wins_state *state = istate->state;
        struct nbt_name_query io;
        NTSTATUS status;
@@ -184,6 +188,7 @@ static void generate_query(struct nbt_name_socket *nbtsock, struct wins_state *s
 
        io.in.name            = generate_name(tmp_ctx, idx);
        io.in.dest_addr       = state->wins_server;
+       io.in.dest_port       = state->wins_port;
        io.in.broadcast       = false;
        io.in.wins_lookup     = true;
        io.in.timeout         = 2;
@@ -192,7 +197,7 @@ static void generate_query(struct nbt_name_socket *nbtsock, struct wins_state *s
        req = nbt_name_query_send(nbtsock, &io);
 
        req->async.fn = query_handler;
-       req->async.private = istate;
+       req->async.private_data = istate;
 
        talloc_free(tmp_ctx);
 }
@@ -220,7 +225,7 @@ static void generate_request(struct nbt_name_socket *nbtsock, struct wins_state
 */
 static bool bench_wins(struct torture_context *tctx)
 {
-       struct nbt_name_socket *nbtsock = nbt_name_socket_init(tctx, NULL);
+       struct nbt_name_socket *nbtsock = nbt_name_socket_init(tctx, tctx->ev, lp_iconv_convenience(tctx->lp_ctx));
        int num_sent=0;
        struct timeval tv = timeval_current();
        bool ret = true;
@@ -230,6 +235,7 @@ static bool bench_wins(struct torture_context *tctx)
        struct socket_address *my_ip;
        struct nbt_name name;
        const char *address;
+       struct interface *ifaces;
 
        if (!torture_nbt_get_name(tctx, &name, &address))
                return false;
@@ -239,7 +245,9 @@ static bool bench_wins(struct torture_context *tctx)
        state->num_names = torture_entries;
        state->registered = talloc_zero_array(state, bool, state->num_names);
        state->wins_server = address;
-       state->my_ip = talloc_strdup(tctx, iface_best_ip(address));
+       state->wins_port = lp_nbt_port(tctx->lp_ctx);
+       load_interfaces(tctx, lp_interfaces(tctx->lp_ctx), &ifaces);
+       state->my_ip = talloc_strdup(tctx, iface_best_ip(ifaces, address));
        state->ttl = timelimit;
 
        my_ip = socket_address_from_strings(nbtsock, nbtsock->sock->backend_name, 
@@ -282,11 +290,10 @@ static bool bench_wins(struct torture_context *tctx)
   benchmark how fast a WINS server can respond to a mixture of
   registration/refresh/release and name query requests
 */
-struct torture_suite *torture_bench_wins(void)
+struct torture_suite *torture_bench_wins(TALLOC_CTX *mem_ctx)
 {
-       struct torture_suite *suite = torture_suite_create(
-                                                                               talloc_autofree_context(),
-                                                                               "BENCH-WINS");
+       struct torture_suite *suite = torture_suite_create(mem_ctx, 
+                                                          "BENCH-WINS");
 
        torture_suite_add_simple_test(suite, "wins", bench_wins);