|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
| 2 | +/* Author: Dmitry Safonov <[email protected]> */ |
| 3 | +#include <inttypes.h> |
| 4 | +#include "aolib.h" |
| 5 | + |
| 6 | +static void *server_fn(void *arg) |
| 7 | +{ |
| 8 | + int sk, lsk; |
| 9 | + ssize_t bytes; |
| 10 | + |
| 11 | + lsk = test_listen_socket(this_ip_addr, test_server_port, 1); |
| 12 | + |
| 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(); |
| 16 | + |
| 17 | + if (test_wait_fd(lsk, TEST_TIMEOUT_SEC, 0)) |
| 18 | + test_error("test_wait_fd()"); |
| 19 | + |
| 20 | + sk = accept(lsk, NULL, NULL); |
| 21 | + if (sk < 0) |
| 22 | + test_error("accept()"); |
| 23 | + |
| 24 | + synchronize_threads(); |
| 25 | + |
| 26 | + bytes = test_server_run(sk, 0, 0); |
| 27 | + |
| 28 | + test_fail("server served: %zd", bytes); |
| 29 | + return NULL; |
| 30 | +} |
| 31 | + |
| 32 | +static void *client_fn(void *arg) |
| 33 | +{ |
| 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; |
| 39 | + |
| 40 | + if (sk < 0) |
| 41 | + test_error("socket()"); |
| 42 | + |
| 43 | + if (test_add_key(sk, DEFAULT_TEST_PASSWORD, this_ip_dest, -1, 100, 100)) |
| 44 | + test_error("setsockopt(TCP_AO_ADD_KEY)"); |
| 45 | + |
| 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(); |
| 50 | + |
| 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()"); |
| 55 | + |
| 56 | + if (test_client_verify(sk, 100, nr_packets, TEST_TIMEOUT_SEC)) { |
| 57 | + test_fail("verify failed"); |
| 58 | + return NULL; |
| 59 | + } |
| 60 | + |
| 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); |
| 68 | + |
| 69 | + if (nr_packets > (after_aogood - before_aogood)) { |
| 70 | + test_fail("TCPAOGood counter mismatch: %zu > (%zu - %zu)", |
| 71 | + nr_packets, after_aogood, before_aogood); |
| 72 | + return NULL; |
| 73 | + } |
| 74 | + if (test_tcp_ao_counters_cmp("connect", &ao1, &ao2, TEST_CNT_GOOD)) |
| 75 | + return NULL; |
| 76 | + |
| 77 | + test_ok("connect TCPAOGood %" PRIu64 "/%" PRIu64 "/%" PRIu64 " => %" PRIu64 "/%" PRIu64 "/%" PRIu64 ", sent %" PRIu64, |
| 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, |
| 82 | + nr_packets); |
| 83 | + return NULL; |
| 84 | +} |
| 85 | + |
| 86 | +int main(int argc, char *argv[]) |
| 87 | +{ |
| 88 | + test_init(1, server_fn, client_fn); |
| 89 | + return 0; |
| 90 | +} |
0 commit comments