91 lines
2.4 KiB
C
91 lines
2.4 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Author: Dmitry Safonov <dima@arista.com> */
|
|
#include <inttypes.h>
|
|
#include "aolib.h"
|
|
|
|
static void *server_fn(void *arg)
|
|
{
|
|
int sk, lsk;
|
|
ssize_t bytes;
|
|
|
|
lsk = test_listen_socket(this_ip_addr, test_server_port, 1);
|
|
|
|
if (test_add_key(lsk, DEFAULT_TEST_PASSWORD, this_ip_dest, -1, 100, 100))
|
|
test_error("setsockopt(TCP_AO_ADD_KEY)");
|
|
synchronize_threads();
|
|
|
|
if (test_wait_fd(lsk, TEST_TIMEOUT_SEC, 0))
|
|
test_error("test_wait_fd()");
|
|
|
|
sk = accept(lsk, NULL, NULL);
|
|
if (sk < 0)
|
|
test_error("accept()");
|
|
|
|
synchronize_threads();
|
|
|
|
bytes = test_server_run(sk, 0, 0);
|
|
|
|
test_fail("server served: %zd", bytes);
|
|
return NULL;
|
|
}
|
|
|
|
static void *client_fn(void *arg)
|
|
{
|
|
int sk = socket(test_family, SOCK_STREAM, IPPROTO_TCP);
|
|
uint64_t before_aogood, after_aogood;
|
|
const size_t nr_packets = 20;
|
|
struct netstat *ns_before, *ns_after;
|
|
struct tcp_ao_counters ao1, ao2;
|
|
|
|
if (sk < 0)
|
|
test_error("socket()");
|
|
|
|
if (test_add_key(sk, DEFAULT_TEST_PASSWORD, this_ip_dest, -1, 100, 100))
|
|
test_error("setsockopt(TCP_AO_ADD_KEY)");
|
|
|
|
synchronize_threads();
|
|
if (test_connect_socket(sk, this_ip_dest, test_server_port) <= 0)
|
|
test_error("failed to connect()");
|
|
synchronize_threads();
|
|
|
|
ns_before = netstat_read();
|
|
before_aogood = netstat_get(ns_before, "TCPAOGood", NULL);
|
|
if (test_get_tcp_ao_counters(sk, &ao1))
|
|
test_error("test_get_tcp_ao_counters()");
|
|
|
|
if (test_client_verify(sk, 100, nr_packets, TEST_TIMEOUT_SEC)) {
|
|
test_fail("verify failed");
|
|
return NULL;
|
|
}
|
|
|
|
ns_after = netstat_read();
|
|
after_aogood = netstat_get(ns_after, "TCPAOGood", NULL);
|
|
if (test_get_tcp_ao_counters(sk, &ao2))
|
|
test_error("test_get_tcp_ao_counters()");
|
|
netstat_print_diff(ns_before, ns_after);
|
|
netstat_free(ns_before);
|
|
netstat_free(ns_after);
|
|
|
|
if (nr_packets > (after_aogood - before_aogood)) {
|
|
test_fail("TCPAOGood counter mismatch: %zu > (%zu - %zu)",
|
|
nr_packets, after_aogood, before_aogood);
|
|
return NULL;
|
|
}
|
|
if (test_tcp_ao_counters_cmp("connect", &ao1, &ao2, TEST_CNT_GOOD))
|
|
return NULL;
|
|
|
|
test_ok("connect TCPAOGood %" PRIu64 "/%" PRIu64 "/%" PRIu64 " => %" PRIu64 "/%" PRIu64 "/%" PRIu64 ", sent %" PRIu64,
|
|
before_aogood, ao1.ao_info_pkt_good,
|
|
ao1.key_cnts[0].pkt_good,
|
|
after_aogood, ao2.ao_info_pkt_good,
|
|
ao2.key_cnts[0].pkt_good,
|
|
nr_packets);
|
|
return NULL;
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
test_init(1, server_fn, client_fn);
|
|
return 0;
|
|
}
|