mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
selftests/net: Provide tcp-ao counters comparison helper
Rename __test_tcp_ao_counters_cmp() into test_assert_counters_ao() and test_tcp_ao_key_counters_cmp() into test_assert_counters_key() as they are asserts, rather than just compare functions. Provide test_cmp_counters() helper, that's going to be used to compare ao_info and netns counters as a stop condition for polling the sockets. Signed-off-by: Dmitry Safonov <0x7f454c46@gmail.com> Link: https://patch.msgid.link/20250319-tcp-ao-selftests-polling-v2-2-da48040153d1@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
65ffdf31be
commit
1fe4221093
|
|
@ -78,7 +78,7 @@ static void try_accept(const char *tst_name, unsigned int port, const char *pwd,
|
|||
close(lsk);
|
||||
|
||||
if (pwd)
|
||||
test_tcp_ao_counters_cmp(tst_name, &ao_cnt1, &ao_cnt2, cnt_expected);
|
||||
test_assert_counters(tst_name, &ao_cnt1, &ao_cnt2, cnt_expected);
|
||||
|
||||
if (!cnt_name)
|
||||
goto out;
|
||||
|
|
@ -204,7 +204,7 @@ static void try_connect(const char *tst_name, unsigned int port,
|
|||
if (pwd && ret > 0) {
|
||||
if (test_get_tcp_ao_counters(sk, &ao_cnt2))
|
||||
test_error("test_get_tcp_ao_counters()");
|
||||
test_tcp_ao_counters_cmp(tst_name, &ao_cnt1, &ao_cnt2, cnt_expected);
|
||||
test_assert_counters(tst_name, &ao_cnt1, &ao_cnt2, cnt_expected);
|
||||
}
|
||||
out:
|
||||
synchronize_threads(); /* close() */
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ static void *client_fn(void *arg)
|
|||
nr_packets, after_aogood, before_aogood);
|
||||
return NULL;
|
||||
}
|
||||
if (test_tcp_ao_counters_cmp("connect", &ao1, &ao2, TEST_CNT_GOOD))
|
||||
if (test_assert_counters("connect", &ao1, &ao2, TEST_CNT_GOOD))
|
||||
return NULL;
|
||||
|
||||
test_ok("connect TCPAOGood %" PRIu64 "/%" PRIu64 "/%" PRIu64 " => %" PRIu64 "/%" PRIu64 "/%" PRIu64 ", sent %zu",
|
||||
|
|
|
|||
|
|
@ -91,9 +91,9 @@ static void serve_interfered(int sk)
|
|||
return;
|
||||
}
|
||||
#ifdef TEST_ICMPS_ACCEPT
|
||||
test_tcp_ao_counters_cmp(NULL, &ao_cnt1, &ao_cnt2, TEST_CNT_GOOD);
|
||||
test_assert_counters(NULL, &ao_cnt1, &ao_cnt2, TEST_CNT_GOOD);
|
||||
#else
|
||||
test_tcp_ao_counters_cmp(NULL, &ao_cnt1, &ao_cnt2, TEST_CNT_GOOD | TEST_CNT_AO_DROPPED_ICMP);
|
||||
test_assert_counters(NULL, &ao_cnt1, &ao_cnt2, TEST_CNT_GOOD | TEST_CNT_AO_DROPPED_ICMP);
|
||||
#endif
|
||||
if (icmp_ignored_a >= icmp_ignored_b) {
|
||||
test_icmps_fail("%s counter didn't change: %" PRIu64 " >= %" PRIu64,
|
||||
|
|
|
|||
|
|
@ -633,7 +633,7 @@ static void verify_counters(const char *tst_name, bool is_listen_sk, bool server
|
|||
{
|
||||
unsigned int i;
|
||||
|
||||
__test_tcp_ao_counters_cmp(tst_name, a, b, TEST_CNT_GOOD);
|
||||
test_assert_counters_ao(tst_name, a, b, TEST_CNT_GOOD);
|
||||
|
||||
for (i = 0; i < collection.nr_keys; i++) {
|
||||
struct test_key *key = &collection.keys[i];
|
||||
|
|
@ -652,9 +652,9 @@ static void verify_counters(const char *tst_name, bool is_listen_sk, bool server
|
|||
rx_cnt_expected = key->used_on_server_tx;
|
||||
}
|
||||
|
||||
test_tcp_ao_key_counters_cmp(tst_name, a, b,
|
||||
rx_cnt_expected ? TEST_CNT_KEY_GOOD : 0,
|
||||
sndid, rcvid);
|
||||
test_assert_counters_key(tst_name, a, b,
|
||||
rx_cnt_expected ? TEST_CNT_KEY_GOOD : 0,
|
||||
sndid, rcvid);
|
||||
}
|
||||
test_tcp_ao_counters_free(a);
|
||||
test_tcp_ao_counters_free(b);
|
||||
|
|
|
|||
|
|
@ -528,6 +528,22 @@ extern int test_get_tcp_ao_counters(int sk, struct tcp_ao_counters *out);
|
|||
#define TEST_CNT_NS_DROPPED_ICMP BIT(11)
|
||||
typedef uint16_t test_cnt;
|
||||
|
||||
#define _for_each_counter(f) \
|
||||
do { \
|
||||
/* per-netns */ \
|
||||
f(netns_ao_good, TEST_CNT_NS_GOOD); \
|
||||
f(netns_ao_bad, TEST_CNT_NS_BAD); \
|
||||
f(netns_ao_key_not_found, TEST_CNT_NS_KEY_NOT_FOUND); \
|
||||
f(netns_ao_required, TEST_CNT_NS_AO_REQUIRED); \
|
||||
f(netns_ao_dropped_icmp, TEST_CNT_NS_DROPPED_ICMP); \
|
||||
/* per-socket */ \
|
||||
f(ao_info_pkt_good, TEST_CNT_SOCK_GOOD); \
|
||||
f(ao_info_pkt_bad, TEST_CNT_SOCK_BAD); \
|
||||
f(ao_info_pkt_key_not_found, TEST_CNT_SOCK_KEY_NOT_FOUND); \
|
||||
f(ao_info_pkt_ao_required, TEST_CNT_SOCK_AO_REQUIRED); \
|
||||
f(ao_info_pkt_dropped_icmp, TEST_CNT_SOCK_DROPPED_ICMP); \
|
||||
} while (0)
|
||||
|
||||
#define TEST_CNT_AO_GOOD (TEST_CNT_SOCK_GOOD | TEST_CNT_NS_GOOD)
|
||||
#define TEST_CNT_AO_BAD (TEST_CNT_SOCK_BAD | TEST_CNT_NS_BAD)
|
||||
#define TEST_CNT_AO_KEY_NOT_FOUND (TEST_CNT_SOCK_KEY_NOT_FOUND | \
|
||||
|
|
@ -539,10 +555,10 @@ typedef uint16_t test_cnt;
|
|||
#define TEST_CNT_GOOD (TEST_CNT_KEY_GOOD | TEST_CNT_AO_GOOD)
|
||||
#define TEST_CNT_BAD (TEST_CNT_KEY_BAD | TEST_CNT_AO_BAD)
|
||||
|
||||
extern int __test_tcp_ao_counters_cmp(const char *tst_name,
|
||||
extern int test_assert_counters_ao(const char *tst_name,
|
||||
struct tcp_ao_counters *before, struct tcp_ao_counters *after,
|
||||
test_cnt expected);
|
||||
extern int test_tcp_ao_key_counters_cmp(const char *tst_name,
|
||||
extern int test_assert_counters_key(const char *tst_name,
|
||||
struct tcp_ao_counters *before, struct tcp_ao_counters *after,
|
||||
test_cnt expected, int sndid, int rcvid);
|
||||
extern void test_tcp_ao_counters_free(struct tcp_ao_counters *cnts);
|
||||
|
|
@ -552,18 +568,17 @@ extern void test_tcp_ao_counters_free(struct tcp_ao_counters *cnts);
|
|||
* to test_get_tcp_ao_counters(). Check key counters manually if they
|
||||
* may change.
|
||||
*/
|
||||
static inline int test_tcp_ao_counters_cmp(const char *tst_name,
|
||||
struct tcp_ao_counters *before,
|
||||
struct tcp_ao_counters *after,
|
||||
test_cnt expected)
|
||||
static inline int test_assert_counters(const char *tst_name,
|
||||
struct tcp_ao_counters *before,
|
||||
struct tcp_ao_counters *after,
|
||||
test_cnt expected)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = __test_tcp_ao_counters_cmp(tst_name, before, after, expected);
|
||||
ret = test_assert_counters_ao(tst_name, before, after, expected);
|
||||
if (ret)
|
||||
goto out;
|
||||
ret = test_tcp_ao_key_counters_cmp(tst_name, before, after,
|
||||
expected, -1, -1);
|
||||
ret = test_assert_counters_key(tst_name, before, after, expected, -1, -1);
|
||||
out:
|
||||
test_tcp_ao_counters_free(before);
|
||||
test_tcp_ao_counters_free(after);
|
||||
|
|
|
|||
|
|
@ -403,55 +403,66 @@ int test_get_tcp_ao_counters(int sk, struct tcp_ao_counters *out)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int __test_tcp_ao_counters_cmp(const char *tst_name,
|
||||
struct tcp_ao_counters *before,
|
||||
struct tcp_ao_counters *after,
|
||||
test_cnt expected)
|
||||
int test_cmp_counters(struct tcp_ao_counters *before, struct tcp_ao_counters *after)
|
||||
{
|
||||
#define __cmp_ao(cnt, expecting_inc) \
|
||||
#define __cmp(cnt, e_cnt) \
|
||||
do { \
|
||||
if (before->cnt > after->cnt) \
|
||||
return -1; \
|
||||
if (before->cnt != after->cnt) \
|
||||
ret |= e_cnt; \
|
||||
} while (0)
|
||||
|
||||
int ret = 0;
|
||||
size_t i;
|
||||
|
||||
if (before->nr_keys != after->nr_keys)
|
||||
return -1;
|
||||
|
||||
_for_each_counter(__cmp);
|
||||
|
||||
i = before->nr_keys;
|
||||
while (i--) {
|
||||
__cmp(key_cnts[i].pkt_good, TEST_CNT_KEY_GOOD);
|
||||
__cmp(key_cnts[i].pkt_bad, TEST_CNT_KEY_BAD);
|
||||
}
|
||||
#undef __cmp
|
||||
return ret;
|
||||
}
|
||||
|
||||
int test_assert_counters_ao(const char *tst_name,
|
||||
struct tcp_ao_counters *before,
|
||||
struct tcp_ao_counters *after,
|
||||
test_cnt expected)
|
||||
{
|
||||
#define __cmp_ao(cnt, e_cnt) \
|
||||
do { \
|
||||
if (before->cnt > after->cnt) { \
|
||||
test_fail("%s: Decreased counter " __stringify(cnt) " %" PRIu64 " > %" PRIu64, \
|
||||
tst_name ?: "", before->cnt, after->cnt); \
|
||||
tst_name ?: "", before->cnt, after->cnt); \
|
||||
return -1; \
|
||||
} \
|
||||
if ((before->cnt != after->cnt) != (expecting_inc)) { \
|
||||
if ((before->cnt != after->cnt) != !!(expected & e_cnt)) { \
|
||||
test_fail("%s: Counter " __stringify(cnt) " was %sexpected to increase %" PRIu64 " => %" PRIu64, \
|
||||
tst_name ?: "", (expecting_inc) ? "" : "not ", \
|
||||
tst_name ?: "", (expected & e_cnt) ? "" : "not ", \
|
||||
before->cnt, after->cnt); \
|
||||
return -1; \
|
||||
} \
|
||||
} while(0)
|
||||
} while (0)
|
||||
|
||||
errno = 0;
|
||||
/* per-netns */
|
||||
__cmp_ao(netns_ao_good, !!(expected & TEST_CNT_NS_GOOD));
|
||||
__cmp_ao(netns_ao_bad, !!(expected & TEST_CNT_NS_BAD));
|
||||
__cmp_ao(netns_ao_key_not_found,
|
||||
!!(expected & TEST_CNT_NS_KEY_NOT_FOUND));
|
||||
__cmp_ao(netns_ao_required, !!(expected & TEST_CNT_NS_AO_REQUIRED));
|
||||
__cmp_ao(netns_ao_dropped_icmp,
|
||||
!!(expected & TEST_CNT_NS_DROPPED_ICMP));
|
||||
/* per-socket */
|
||||
__cmp_ao(ao_info_pkt_good, !!(expected & TEST_CNT_SOCK_GOOD));
|
||||
__cmp_ao(ao_info_pkt_bad, !!(expected & TEST_CNT_SOCK_BAD));
|
||||
__cmp_ao(ao_info_pkt_key_not_found,
|
||||
!!(expected & TEST_CNT_SOCK_KEY_NOT_FOUND));
|
||||
__cmp_ao(ao_info_pkt_ao_required, !!(expected & TEST_CNT_SOCK_AO_REQUIRED));
|
||||
__cmp_ao(ao_info_pkt_dropped_icmp,
|
||||
!!(expected & TEST_CNT_SOCK_DROPPED_ICMP));
|
||||
_for_each_counter(__cmp_ao);
|
||||
return 0;
|
||||
#undef __cmp_ao
|
||||
}
|
||||
|
||||
int test_tcp_ao_key_counters_cmp(const char *tst_name,
|
||||
struct tcp_ao_counters *before,
|
||||
struct tcp_ao_counters *after,
|
||||
test_cnt expected,
|
||||
int sndid, int rcvid)
|
||||
int test_assert_counters_key(const char *tst_name,
|
||||
struct tcp_ao_counters *before,
|
||||
struct tcp_ao_counters *after,
|
||||
test_cnt expected, int sndid, int rcvid)
|
||||
{
|
||||
size_t i;
|
||||
#define __cmp_ao(i, cnt, expecting_inc) \
|
||||
#define __cmp_ao(i, cnt, e_cnt) \
|
||||
do { \
|
||||
if (before->key_cnts[i].cnt > after->key_cnts[i].cnt) { \
|
||||
test_fail("%s: Decreased counter " __stringify(cnt) " %" PRIu64 " > %" PRIu64 " for key %u:%u", \
|
||||
|
|
@ -461,16 +472,16 @@ do { \
|
|||
before->key_cnts[i].rcvid); \
|
||||
return -1; \
|
||||
} \
|
||||
if ((before->key_cnts[i].cnt != after->key_cnts[i].cnt) != (expecting_inc)) { \
|
||||
if ((before->key_cnts[i].cnt != after->key_cnts[i].cnt) != !!(expected & e_cnt)) { \
|
||||
test_fail("%s: Counter " __stringify(cnt) " was %sexpected to increase %" PRIu64 " => %" PRIu64 " for key %u:%u", \
|
||||
tst_name ?: "", (expecting_inc) ? "" : "not ",\
|
||||
tst_name ?: "", (expected & e_cnt) ? "" : "not ",\
|
||||
before->key_cnts[i].cnt, \
|
||||
after->key_cnts[i].cnt, \
|
||||
before->key_cnts[i].sndid, \
|
||||
before->key_cnts[i].rcvid); \
|
||||
return -1; \
|
||||
} \
|
||||
} while(0)
|
||||
} while (0)
|
||||
|
||||
if (before->nr_keys != after->nr_keys) {
|
||||
test_fail("%s: Keys changed on the socket %zu != %zu",
|
||||
|
|
@ -485,8 +496,8 @@ do { \
|
|||
continue;
|
||||
if (rcvid >= 0 && before->key_cnts[i].rcvid != rcvid)
|
||||
continue;
|
||||
__cmp_ao(i, pkt_good, !!(expected & TEST_CNT_KEY_GOOD));
|
||||
__cmp_ao(i, pkt_bad, !!(expected & TEST_CNT_KEY_BAD));
|
||||
__cmp_ao(i, pkt_good, TEST_CNT_KEY_GOOD);
|
||||
__cmp_ao(i, pkt_bad, TEST_CNT_KEY_BAD);
|
||||
}
|
||||
return 0;
|
||||
#undef __cmp_ao
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ static void try_server_run(const char *tst_name, unsigned int port,
|
|||
test_error("test_get_tcp_ao_counters()");
|
||||
after_cnt = netstat_get_one(cnt_name, NULL);
|
||||
|
||||
test_tcp_ao_counters_cmp(tst_name, &ao1, &ao2, cnt_expected);
|
||||
test_assert_counters(tst_name, &ao1, &ao2, cnt_expected);
|
||||
|
||||
if (after_cnt <= before_cnt) {
|
||||
test_fail("%s: %s counter did not increase: %" PRIu64 " <= %" PRIu64,
|
||||
|
|
@ -182,7 +182,7 @@ static void test_sk_restore(const char *tst_name, unsigned int server_port,
|
|||
test_error("test_get_tcp_ao_counters()");
|
||||
after_cnt = netstat_get_one(cnt_name, NULL);
|
||||
|
||||
test_tcp_ao_counters_cmp(tst_name, &ao1, &ao2, cnt_expected);
|
||||
test_assert_counters(tst_name, &ao1, &ao2, cnt_expected);
|
||||
|
||||
if (after_cnt <= before_cnt) {
|
||||
test_fail("%s: %s counter did not increase: %" PRIu64 " <= %" PRIu64,
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ static void test_server_active_rst(unsigned int port)
|
|||
synchronize_threads(); /* 5: closed active sk */
|
||||
|
||||
synchronize_threads(); /* 6: counters checks */
|
||||
if (test_tcp_ao_counters_cmp("active RST server", &cnt1, &cnt2, TEST_CNT_GOOD))
|
||||
if (test_assert_counters("active RST server", &cnt1, &cnt2, TEST_CNT_GOOD))
|
||||
test_fail("MKT counters (server) have not only good packets");
|
||||
else
|
||||
test_ok("MKT counters are good on server");
|
||||
|
|
@ -165,7 +165,7 @@ static void test_server_passive_rst(unsigned int port)
|
|||
close(sk);
|
||||
|
||||
synchronize_threads(); /* 5: restore the socket, send more data */
|
||||
test_tcp_ao_counters_cmp("passive RST server", &ao1, &ao2, TEST_CNT_GOOD);
|
||||
test_assert_counters("passive RST server", &ao1, &ao2, TEST_CNT_GOOD);
|
||||
|
||||
synchronize_threads(); /* 6: server exits */
|
||||
}
|
||||
|
|
@ -431,7 +431,7 @@ static void test_client_passive_rst(unsigned int port)
|
|||
|
||||
synchronize_threads(); /* 6: server exits */
|
||||
close(sk);
|
||||
test_tcp_ao_counters_cmp("client passive RST", &ao1, &ao2, TEST_CNT_GOOD);
|
||||
test_assert_counters("client passive RST", &ao1, &ao2, TEST_CNT_GOOD);
|
||||
}
|
||||
|
||||
static void *client_fn(void *arg)
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ static void tcp_self_connect(const char *tst, unsigned int port,
|
|||
return;
|
||||
}
|
||||
|
||||
if (test_tcp_ao_counters_cmp(tst, &before_ao, &after_ao, TEST_CNT_GOOD)) {
|
||||
if (test_assert_counters(tst, &before_ao, &after_ao, TEST_CNT_GOOD)) {
|
||||
close(sk);
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ static void *server_fn(void *arg)
|
|||
test_error("test_get_tcp_ao_counters()");
|
||||
after_good = netstat_get_one("TCPAOGood", NULL);
|
||||
|
||||
test_tcp_ao_counters_cmp(NULL, &ao1, &ao2, TEST_CNT_GOOD);
|
||||
test_assert_counters(NULL, &ao1, &ao2, TEST_CNT_GOOD);
|
||||
|
||||
if (after_good <= before_good) {
|
||||
test_fail("TCPAOGood counter did not increase: %" PRIu64 " <= %" PRIu64,
|
||||
|
|
@ -226,7 +226,7 @@ static void *client_fn(void *arg)
|
|||
test_error("test_get_tcp_ao_counters()");
|
||||
after_good = netstat_get_one("TCPAOGood", NULL);
|
||||
|
||||
test_tcp_ao_counters_cmp(NULL, &ao1, &ao2, TEST_CNT_GOOD);
|
||||
test_assert_counters(NULL, &ao1, &ao2, TEST_CNT_GOOD);
|
||||
|
||||
if (after_good <= before_good) {
|
||||
test_fail("TCPAOGood counter did not increase: %" PRIu64 " <= %" PRIu64,
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ static void try_accept(const char *tst_name, unsigned int port,
|
|||
tst_name, cnt_name, before_cnt, after_cnt);
|
||||
}
|
||||
if (ao_addr)
|
||||
test_tcp_ao_counters_cmp(tst_name, &ao_cnt1, &ao_cnt2, cnt_expected);
|
||||
test_assert_counters(tst_name, &ao_cnt1, &ao_cnt2, cnt_expected);
|
||||
|
||||
out:
|
||||
synchronize_threads(); /* test_kill_sk() */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user