1 // SPDX-License-Identifier: GPL-2.0
2 /* Author: Dmitry Safonov <dima@arista.com> */
6 static void *server_fn(void *arg
)
11 lsk
= test_listen_socket(this_ip_addr
, test_server_port
, 1);
13 if (test_add_key(lsk
, DEFAULT_TEST_PASSWORD
, this_ip_dest
, -1, 100, 100))
14 test_error("setsockopt(TCP_AO_ADD_KEY)");
15 synchronize_threads();
17 if (test_wait_fd(lsk
, TEST_TIMEOUT_SEC
, 0))
18 test_error("test_wait_fd()");
20 sk
= accept(lsk
, NULL
, NULL
);
22 test_error("accept()");
24 synchronize_threads();
26 bytes
= test_server_run(sk
, 0, 0);
28 test_fail("server served: %zd", bytes
);
32 static void *client_fn(void *arg
)
34 int sk
= socket(test_family
, SOCK_STREAM
, IPPROTO_TCP
);
35 uint64_t before_aogood
, after_aogood
;
36 const size_t nr_packets
= 20;
37 struct netstat
*ns_before
, *ns_after
;
38 struct tcp_ao_counters ao1
, ao2
;
41 test_error("socket()");
43 if (test_add_key(sk
, DEFAULT_TEST_PASSWORD
, this_ip_dest
, -1, 100, 100))
44 test_error("setsockopt(TCP_AO_ADD_KEY)");
46 synchronize_threads();
47 if (test_connect_socket(sk
, this_ip_dest
, test_server_port
) <= 0)
48 test_error("failed to connect()");
49 synchronize_threads();
51 ns_before
= netstat_read();
52 before_aogood
= netstat_get(ns_before
, "TCPAOGood", NULL
);
53 if (test_get_tcp_ao_counters(sk
, &ao1
))
54 test_error("test_get_tcp_ao_counters()");
56 if (test_client_verify(sk
, 100, nr_packets
, TEST_TIMEOUT_SEC
)) {
57 test_fail("verify failed");
61 ns_after
= netstat_read();
62 after_aogood
= netstat_get(ns_after
, "TCPAOGood", NULL
);
63 if (test_get_tcp_ao_counters(sk
, &ao2
))
64 test_error("test_get_tcp_ao_counters()");
65 netstat_print_diff(ns_before
, ns_after
);
66 netstat_free(ns_before
);
67 netstat_free(ns_after
);
69 if (nr_packets
> (after_aogood
- before_aogood
)) {
70 test_fail("TCPAOGood counter mismatch: %zu > (%" PRIu64
" - %" PRIu64
")",
71 nr_packets
, after_aogood
, before_aogood
);
74 if (test_tcp_ao_counters_cmp("connect", &ao1
, &ao2
, TEST_CNT_GOOD
))
77 test_ok("connect TCPAOGood %" PRIu64
"/%" PRIu64
"/%" PRIu64
" => %" PRIu64
"/%" PRIu64
"/%" PRIu64
", sent %zu",
78 before_aogood
, ao1
.ao_info_pkt_good
,
79 ao1
.key_cnts
[0].pkt_good
,
80 after_aogood
, ao2
.ao_info_pkt_good
,
81 ao2
.key_cnts
[0].pkt_good
,
86 int main(int argc
, char *argv
[])
88 test_init(2, server_fn
, client_fn
);