connect.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Author: Dmitry Safonov <dima@arista.com> */
  3. #include <inttypes.h>
  4. #include "aolib.h"
  5. static void *server_fn(void *arg)
  6. {
  7. int sk, lsk;
  8. ssize_t bytes;
  9. lsk = test_listen_socket(this_ip_addr, test_server_port, 1);
  10. if (test_add_key(lsk, DEFAULT_TEST_PASSWORD, this_ip_dest, -1, 100, 100))
  11. test_error("setsockopt(TCP_AO_ADD_KEY)");
  12. synchronize_threads();
  13. if (test_wait_fd(lsk, TEST_TIMEOUT_SEC, 0))
  14. test_error("test_wait_fd()");
  15. sk = accept(lsk, NULL, NULL);
  16. if (sk < 0)
  17. test_error("accept()");
  18. synchronize_threads();
  19. bytes = test_server_run(sk, 0, 0);
  20. test_fail("server served: %zd", bytes);
  21. return NULL;
  22. }
  23. static void *client_fn(void *arg)
  24. {
  25. int sk = socket(test_family, SOCK_STREAM, IPPROTO_TCP);
  26. uint64_t before_aogood, after_aogood;
  27. const size_t nr_packets = 20;
  28. struct netstat *ns_before, *ns_after;
  29. struct tcp_counters ao1, ao2;
  30. if (sk < 0)
  31. test_error("socket()");
  32. if (test_add_key(sk, DEFAULT_TEST_PASSWORD, this_ip_dest, -1, 100, 100))
  33. test_error("setsockopt(TCP_AO_ADD_KEY)");
  34. synchronize_threads();
  35. if (test_connect_socket(sk, this_ip_dest, test_server_port) <= 0)
  36. test_error("failed to connect()");
  37. synchronize_threads();
  38. ns_before = netstat_read();
  39. before_aogood = netstat_get(ns_before, "TCPAOGood", NULL);
  40. if (test_get_tcp_counters(sk, &ao1))
  41. test_error("test_get_tcp_counters()");
  42. if (test_client_verify(sk, 100, nr_packets)) {
  43. test_fail("verify failed");
  44. return NULL;
  45. }
  46. ns_after = netstat_read();
  47. after_aogood = netstat_get(ns_after, "TCPAOGood", NULL);
  48. if (test_get_tcp_counters(sk, &ao2))
  49. test_error("test_get_tcp_counters()");
  50. netstat_print_diff(ns_before, ns_after);
  51. netstat_free(ns_before);
  52. netstat_free(ns_after);
  53. if (nr_packets > (after_aogood - before_aogood)) {
  54. test_fail("TCPAOGood counter mismatch: %zu > (%" PRIu64 " - %" PRIu64 ")",
  55. nr_packets, after_aogood, before_aogood);
  56. return NULL;
  57. }
  58. if (test_assert_counters("connect", &ao1, &ao2, TEST_CNT_GOOD))
  59. return NULL;
  60. test_ok("connect TCPAOGood %" PRIu64 "/%" PRIu64 "/%" PRIu64 " => %" PRIu64 "/%" PRIu64 "/%" PRIu64 ", sent %zu",
  61. before_aogood, ao1.ao.ao_info_pkt_good,
  62. ao1.ao.key_cnts[0].pkt_good,
  63. after_aogood, ao2.ao.ao_info_pkt_good,
  64. ao2.ao.key_cnts[0].pkt_good,
  65. nr_packets);
  66. return NULL;
  67. }
  68. int main(int argc, char *argv[])
  69. {
  70. test_init(2, server_fn, client_fn);
  71. return 0;
  72. }