2 Unix SMB/CIFS implementation.
6 Copyright (C) Andrew Tridgell 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "lib/events/events.h"
24 #include "libcli/resolve/resolve.h"
25 #include "torture/torture.h"
26 #include "torture/nbt/proto.h"
27 #include "param/param.h"
29 struct result_struct
{
34 static void increment_handler(struct nbt_name_request
*req
)
36 struct result_struct
*v
= talloc_get_type(req
->async
.private_data
, struct result_struct
);
37 if (req
->state
!= NBT_REQUEST_DONE
) {
46 benchmark simple name queries
48 static bool bench_namequery(struct torture_context
*tctx
)
50 struct nbt_name_socket
*nbtsock
= torture_init_nbt_socket(tctx
);
52 struct result_struct
*result
;
53 struct nbt_name_query io
;
54 struct timeval tv
= timeval_current();
55 int timelimit
= torture_setting_int(tctx
, "timelimit", 5);
60 if (!torture_nbt_get_name(tctx
, &name
, &address
))
64 io
.in
.dest_addr
= address
;
65 io
.in
.dest_port
= lpcfg_nbt_port(tctx
->lp_ctx
);
66 io
.in
.broadcast
= false;
67 io
.in
.wins_lookup
= false;
70 result
= talloc_zero(tctx
, struct result_struct
);
72 torture_comment(tctx
, "Running for %d seconds\n", timelimit
);
73 while (timeval_elapsed(&tv
) < timelimit
) {
74 while (num_sent
- (result
->num_pass
+result
->num_fail
) < 10) {
75 struct nbt_name_request
*req
;
76 req
= nbt_name_query_send(nbtsock
, &io
);
77 torture_assert(tctx
, req
!= NULL
, "Failed to setup request!");
78 req
->async
.fn
= increment_handler
;
79 req
->async
.private_data
= result
;
81 if (num_sent
% 1000 == 0) {
82 if (torture_setting_bool(tctx
, "progress", true)) {
83 torture_comment(tctx
, "%.1f queries per second (%d failures) \r",
84 result
->num_pass
/ timeval_elapsed(&tv
),
91 tevent_loop_once(nbtsock
->event_ctx
);
94 while (num_sent
!= (result
->num_pass
+ result
->num_fail
)) {
95 tevent_loop_once(nbtsock
->event_ctx
);
98 torture_comment(tctx
, "%.1f queries per second (%d failures) \n",
99 result
->num_pass
/ timeval_elapsed(&tv
),
107 benchmark how fast a server can respond to name queries
109 struct torture_suite
*torture_bench_nbt(TALLOC_CTX
*mem_ctx
)
111 struct torture_suite
*suite
= torture_suite_create(mem_ctx
, "bench");
112 torture_suite_add_simple_test(suite
, "namequery", bench_namequery
);