Message ID | 20230809124343.12957-6-magnus.karlsson@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | BPF |
Headers | show |
Series | seltests/xsk: various improvements to xskxceiver | expand |
On 8/9/23 14:43, Magnus Karlsson wrote: > From: Magnus Karlsson <magnus.karlsson@intel.com> > > Declare the test names statically in a struct so that we can refer to > them when adding the support to execute a single test in the next > commit. Before this pathc, the names of them was not declared in a patch > single place which made it not possible to refer to them. > > Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> > --- > tools/testing/selftests/bpf/xskxceiver.c | 191 +++++++---------------- > tools/testing/selftests/bpf/xskxceiver.h | 37 +---- > 2 files changed, 57 insertions(+), 171 deletions(-) [...]
On Thu, 10 Aug 2023 at 14:16, Przemek Kitszel <przemyslaw.kitszel@intel.com> wrote: > > On 8/9/23 14:43, Magnus Karlsson wrote: > > From: Magnus Karlsson <magnus.karlsson@intel.com> > > > > Declare the test names statically in a struct so that we can refer to > > them when adding the support to execute a single test in the next > > commit. Before this pathc, the names of them was not declared in a > > patch Thanks for catching. Will fix it in the next revision. > > single place which made it not possible to refer to them. > > > > Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> > > --- > > tools/testing/selftests/bpf/xskxceiver.c | 191 +++++++---------------- > > tools/testing/selftests/bpf/xskxceiver.h | 37 +---- > > 2 files changed, 57 insertions(+), 171 deletions(-) > > [...]
On Wed, Aug 09, 2023 at 02:43:38PM +0200, Magnus Karlsson wrote: > From: Magnus Karlsson <magnus.karlsson@intel.com> > > Declare the test names statically in a struct so that we can refer to > them when adding the support to execute a single test in the next > commit. Before this pathc, the names of them was not declared in a s/was/were pathc was caught by Przemek > single place which made it not possible to refer to them. > > Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> > --- > tools/testing/selftests/bpf/xskxceiver.c | 191 +++++++---------------- > tools/testing/selftests/bpf/xskxceiver.h | 37 +---- > 2 files changed, 57 insertions(+), 171 deletions(-) > > diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selftests/bpf/xskxceiver.c > index ee72bb0a8978..b1d0c69f21b8 100644 > --- a/tools/testing/selftests/bpf/xskxceiver.c > +++ b/tools/testing/selftests/bpf/xskxceiver.c > @@ -447,7 +447,8 @@ static void __test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx, > } > > static void test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx, > - struct ifobject *ifobj_rx, enum test_mode mode) > + struct ifobject *ifobj_rx, enum test_mode mode, > + const struct test_spec *test_to_run) > { > struct pkt_stream *tx_pkt_stream; > struct pkt_stream *rx_pkt_stream; > @@ -469,6 +470,8 @@ static void test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx, > ifobj->bind_flags |= XDP_COPY; > } > > + strncpy(test->name, test_to_run->name, MAX_TEST_NAME_SIZE); > + test->test_func = test_to_run->test_func; > test->mode = mode; > __test_spec_init(test, ifobj_tx, ifobj_rx); > } > @@ -478,11 +481,6 @@ static void test_spec_reset(struct test_spec *test) > __test_spec_init(test, test->ifobj_tx, test->ifobj_rx); > } > > -static void test_spec_set_name(struct test_spec *test, const char *name) > -{ > - strncpy(test->name, name, MAX_TEST_NAME_SIZE); > -} > - > static void test_spec_set_xdp_prog(struct test_spec *test, struct bpf_program *xdp_prog_rx, > struct bpf_program *xdp_prog_tx, struct bpf_map *xskmap_rx, > struct bpf_map *xskmap_tx) > @@ -1727,7 +1725,6 @@ static int testapp_teardown(struct test_spec *test) > { > int i; > > - test_spec_set_name(test, "TEARDOWN"); > for (i = 0; i < MAX_TEARDOWN_ITER; i++) { > if (testapp_validate_traffic(test)) > return TEST_FAILURE; > @@ -1749,11 +1746,10 @@ static void swap_directions(struct ifobject **ifobj1, struct ifobject **ifobj2) > *ifobj2 = tmp_ifobj; > } > > -static int testapp_bidi(struct test_spec *test) > +static int testapp_bidirectional(struct test_spec *test) > { > int res; > > - test_spec_set_name(test, "BIDIRECTIONAL"); > test->ifobj_tx->rx_on = true; > test->ifobj_rx->tx_on = true; > test->total_steps = 2; > @@ -1782,9 +1778,8 @@ static void swap_xsk_resources(struct ifobject *ifobj_tx, struct ifobject *ifobj > exit_with_error(errno); > } > > -static int testapp_bpf_res(struct test_spec *test) > +static int testapp_xdp_prog_cleanup(struct test_spec *test) > { > - test_spec_set_name(test, "BPF_RES"); > test->total_steps = 2; > test->nb_sockets = 2; > if (testapp_validate_traffic(test)) > @@ -1796,14 +1791,12 @@ static int testapp_bpf_res(struct test_spec *test) > > static int testapp_headroom(struct test_spec *test) > { > - test_spec_set_name(test, "UMEM_HEADROOM"); > test->ifobj_rx->umem->frame_headroom = UMEM_HEADROOM_TEST_SIZE; > return testapp_validate_traffic(test); > } > > static int testapp_stats_rx_dropped(struct test_spec *test) > { > - test_spec_set_name(test, "STAT_RX_DROPPED"); > if (test->mode == TEST_MODE_ZC) { > ksft_test_result_skip("Can not run RX_DROPPED test for ZC mode\n"); > return TEST_SKIP; > @@ -1819,7 +1812,6 @@ static int testapp_stats_rx_dropped(struct test_spec *test) > > static int testapp_stats_tx_invalid_descs(struct test_spec *test) > { > - test_spec_set_name(test, "STAT_TX_INVALID"); > pkt_stream_replace_half(test, XSK_UMEM__INVALID_FRAME_SIZE, 0); > test->ifobj_tx->validation_func = validate_tx_invalid_descs; > return testapp_validate_traffic(test); > @@ -1827,7 +1819,6 @@ static int testapp_stats_tx_invalid_descs(struct test_spec *test) > > static int testapp_stats_rx_full(struct test_spec *test) > { > - test_spec_set_name(test, "STAT_RX_FULL"); > pkt_stream_replace(test, DEFAULT_UMEM_BUFFERS + DEFAULT_UMEM_BUFFERS / 2, MIN_PKT_SIZE); > test->ifobj_rx->pkt_stream = pkt_stream_generate(test->ifobj_rx->umem, > DEFAULT_UMEM_BUFFERS, MIN_PKT_SIZE); > @@ -1840,7 +1831,6 @@ static int testapp_stats_rx_full(struct test_spec *test) > > static int testapp_stats_fill_empty(struct test_spec *test) > { > - test_spec_set_name(test, "STAT_RX_FILL_EMPTY"); > pkt_stream_replace(test, DEFAULT_UMEM_BUFFERS + DEFAULT_UMEM_BUFFERS / 2, MIN_PKT_SIZE); > test->ifobj_rx->pkt_stream = pkt_stream_generate(test->ifobj_rx->umem, > DEFAULT_UMEM_BUFFERS, MIN_PKT_SIZE); > @@ -1850,9 +1840,8 @@ static int testapp_stats_fill_empty(struct test_spec *test) > return testapp_validate_traffic(test); > } > > -static int testapp_unaligned(struct test_spec *test) > +static int testapp_send_receive_unaligned(struct test_spec *test) > { > - test_spec_set_name(test, "UNALIGNED_MODE"); > test->ifobj_tx->umem->unaligned_mode = true; > test->ifobj_rx->umem->unaligned_mode = true; > /* Let half of the packets straddle a 4K buffer boundary */ > @@ -1861,9 +1850,8 @@ static int testapp_unaligned(struct test_spec *test) > return testapp_validate_traffic(test); > } > > -static int testapp_unaligned_mb(struct test_spec *test) > +static int testapp_send_receive_unaligned_mb(struct test_spec *test) > { > - test_spec_set_name(test, "UNALIGNED_MODE_9K"); > test->mtu = MAX_ETH_JUMBO_SIZE; > test->ifobj_tx->umem->unaligned_mode = true; > test->ifobj_rx->umem->unaligned_mode = true; > @@ -1875,14 +1863,12 @@ static int testapp_single_pkt(struct test_spec *test) > { > struct pkt pkts[] = {{0, MIN_PKT_SIZE, 0, true}}; > > - test_spec_set_name(test, "SEND_RECEIVE_SINGLE_PKT"); > pkt_stream_generate_custom(test, pkts, ARRAY_SIZE(pkts)); > return testapp_validate_traffic(test); > } > > -static int testapp_multi_buffer(struct test_spec *test) > +static int testapp_send_receive_mb(struct test_spec *test) > { > - test_spec_set_name(test, "SEND_RECEIVE_9K_PACKETS"); > test->mtu = MAX_ETH_JUMBO_SIZE; > pkt_stream_replace(test, DEFAULT_PKT_CNT, MAX_ETH_JUMBO_SIZE); > > @@ -1979,7 +1965,6 @@ static int testapp_xdp_drop(struct test_spec *test) > struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs; > struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs; > > - test_spec_set_name(test, "XDP_DROP_HALF"); > test_spec_set_xdp_prog(test, skel_rx->progs.xsk_xdp_drop, skel_tx->progs.xsk_xdp_drop, > skel_rx->maps.xsk, skel_tx->maps.xsk); > > @@ -2012,8 +1997,6 @@ static int testapp_xdp_metadata_copy(struct test_spec *test) > > static int testapp_poll_txq_tmout(struct test_spec *test) > { > - test_spec_set_name(test, "POLL_TXQ_FULL"); > - > test->ifobj_tx->use_poll = true; > /* create invalid frame by set umem frame_size and pkt length equal to 2048 */ > test->ifobj_tx->umem->frame_size = 2048; > @@ -2023,7 +2006,6 @@ static int testapp_poll_txq_tmout(struct test_spec *test) > > static int testapp_poll_rxq_tmout(struct test_spec *test) > { > - test_spec_set_name(test, "POLL_RXQ_EMPTY"); > test->ifobj_rx->use_poll = true; > return testapp_validate_traffic_single_thread(test, test->ifobj_rx); > } > @@ -2033,7 +2015,6 @@ static int testapp_too_many_frags(struct test_spec *test) > struct pkt pkts[2 * XSK_DESC__MAX_SKB_FRAGS + 2] = {}; > u32 max_frags, i; > > - test_spec_set_name(test, "TOO_MANY_FRAGS"); > if (test->mode == TEST_MODE_ZC) > max_frags = test->ifobj_tx->xdp_zc_max_segs; > else > @@ -2139,13 +2120,11 @@ static void init_iface(struct ifobject *ifobj, const char *dst_mac, const char * > > static int testapp_send_receive(struct test_spec *test) > { > - test_spec_set_name(test, "SEND_RECEIVE"); > return testapp_validate_traffic(test); > } > > static int testapp_send_receive_2k_frame(struct test_spec *test) > { > - test_spec_set_name(test, "SEND_RECEIVE_2K_FRAME_SIZE"); > test->ifobj_tx->umem->frame_size = 2048; > test->ifobj_rx->umem->frame_size = 2048; > pkt_stream_replace(test, DEFAULT_PKT_CNT, MIN_PKT_SIZE); > @@ -2155,26 +2134,22 @@ static int testapp_send_receive_2k_frame(struct test_spec *test) > static int testapp_poll_rx(struct test_spec *test) > { > test->ifobj_rx->use_poll = true; > - test_spec_set_name(test, "POLL_RX"); > return testapp_validate_traffic(test); > } > > static int testapp_poll_tx(struct test_spec *test) > { > test->ifobj_tx->use_poll = true; > - test_spec_set_name(test, "POLL_TX"); > return testapp_validate_traffic(test); > } > > static int testapp_aligned_inv_desc(struct test_spec *test) > { > - test_spec_set_name(test, "ALIGNED_INV_DESC"); > return testapp_invalid_desc(test); > } > > static int testapp_aligned_inv_desc_2k_frame(struct test_spec *test) > { > - test_spec_set_name(test, "ALIGNED_INV_DESC_2K_FRAME_SIZE"); > test->ifobj_tx->umem->frame_size = 2048; > test->ifobj_rx->umem->frame_size = 2048; > return testapp_invalid_desc(test); > @@ -2182,7 +2157,6 @@ static int testapp_aligned_inv_desc_2k_frame(struct test_spec *test) > > static int testapp_unaligned_inv_desc(struct test_spec *test) > { > - test_spec_set_name(test, "UNALIGNED_INV_DESC"); > test->ifobj_tx->umem->unaligned_mode = true; > test->ifobj_rx->umem->unaligned_mode = true; > return testapp_invalid_desc(test); > @@ -2192,7 +2166,6 @@ static int testapp_unaligned_inv_desc_4001_frame(struct test_spec *test) > { > u64 page_size, umem_size; > > - test_spec_set_name(test, "UNALIGNED_INV_DESC_4K1_FRAME_SIZE"); > /* Odd frame size so the UMEM doesn't end near a page boundary. */ > test->ifobj_tx->umem->frame_size = 4001; > test->ifobj_rx->umem->frame_size = 4001; > @@ -2211,13 +2184,11 @@ static int testapp_unaligned_inv_desc_4001_frame(struct test_spec *test) > > static int testapp_aligned_inv_desc_mb(struct test_spec *test) > { > - test_spec_set_name(test, "ALIGNED_INV_DESC_MULTI_BUFF"); > return testapp_invalid_desc_mb(test); > } > > static int testapp_unaligned_inv_desc_mb(struct test_spec *test) > { > - test_spec_set_name(test, "UNALIGNED_INV_DESC_MULTI_BUFF"); > test->ifobj_tx->umem->unaligned_mode = true; > test->ifobj_rx->umem->unaligned_mode = true; > return testapp_invalid_desc_mb(test); > @@ -2225,109 +2196,20 @@ static int testapp_unaligned_inv_desc_mb(struct test_spec *test) > > static int testapp_xdp_metadata(struct test_spec *test) > { > - test_spec_set_name(test, "XDP_METADATA_COPY"); > return testapp_xdp_metadata_copy(test); > } > > static int testapp_xdp_metadata_mb(struct test_spec *test) > { > - test_spec_set_name(test, "XDP_METADATA_COPY_MULTI_BUFF"); > test->mtu = MAX_ETH_JUMBO_SIZE; > return testapp_xdp_metadata_copy(test); > } > > -static void run_pkt_test(struct test_spec *test, enum test_mode mode, enum test_type type) > -{ > - int ret = TEST_SKIP; > - > - switch (type) { > - case TEST_TYPE_STATS_RX_DROPPED: > - ret = testapp_stats_rx_dropped(test); > - break; > - case TEST_TYPE_STATS_TX_INVALID_DESCS: > - ret = testapp_stats_tx_invalid_descs(test); > - break; > - case TEST_TYPE_STATS_RX_FULL: > - ret = testapp_stats_rx_full(test); > - break; > - case TEST_TYPE_STATS_FILL_EMPTY: > - ret = testapp_stats_fill_empty(test); > - break; > - case TEST_TYPE_TEARDOWN: > - ret = testapp_teardown(test); > - break; > - case TEST_TYPE_BIDI: > - ret = testapp_bidi(test); > - break; > - case TEST_TYPE_BPF_RES: > - ret = testapp_bpf_res(test); > - break; > - case TEST_TYPE_RUN_TO_COMPLETION: > - ret = testapp_send_receive(test); > - break; > - case TEST_TYPE_RUN_TO_COMPLETION_MB: > - ret = testapp_multi_buffer(test); > - break; > - case TEST_TYPE_RUN_TO_COMPLETION_SINGLE_PKT: > - ret = testapp_single_pkt(test); > - break; > - case TEST_TYPE_RUN_TO_COMPLETION_2K_FRAME: > - ret = testapp_send_receive_2k_frame(test); > - break; > - case TEST_TYPE_RX_POLL: > - ret = testapp_poll_rx(test); > - break; > - case TEST_TYPE_TX_POLL: > - ret = testapp_poll_tx(test); > - break; > - case TEST_TYPE_POLL_TXQ_TMOUT: > - ret = testapp_poll_txq_tmout(test); > - break; > - case TEST_TYPE_POLL_RXQ_TMOUT: > - ret = testapp_poll_rxq_tmout(test); > - break; > - case TEST_TYPE_ALIGNED_INV_DESC: > - ret = testapp_aligned_inv_desc(test); > - break; > - case TEST_TYPE_ALIGNED_INV_DESC_2K_FRAME: > - ret = testapp_aligned_inv_desc_2k_frame(test); > - break; > - case TEST_TYPE_UNALIGNED_INV_DESC: > - ret = testapp_unaligned_inv_desc(test); > - break; > - case TEST_TYPE_UNALIGNED_INV_DESC_4K1_FRAME: > - ret = testapp_unaligned_inv_desc_4001_frame(test); > - break; > - case TEST_TYPE_ALIGNED_INV_DESC_MB: > - ret = testapp_aligned_inv_desc_mb(test); > - break; > - case TEST_TYPE_UNALIGNED_INV_DESC_MB: > - ret = testapp_unaligned_inv_desc_mb(test); > - break; > - case TEST_TYPE_UNALIGNED: > - ret = testapp_unaligned(test); > - break; > - case TEST_TYPE_UNALIGNED_MB: > - ret = testapp_unaligned_mb(test); > - break; > - case TEST_TYPE_HEADROOM: > - ret = testapp_headroom(test); > - break; > - case TEST_TYPE_XDP_DROP_HALF: > - ret = testapp_xdp_drop(test); > - break; > - case TEST_TYPE_XDP_METADATA_COUNT: > - ret = testapp_xdp_metadata(test); > - break; > - case TEST_TYPE_XDP_METADATA_COUNT_MB: > - ret = testapp_xdp_metadata_mb(test); > - break; > - case TEST_TYPE_TOO_MANY_FRAGS: > - ret = testapp_too_many_frags(test); > - break; > - default: > - break; > - } > +static void run_pkt_test(struct test_spec *test) > +{ > + int ret; > + > + ret = test->test_func(test); > > if (ret == TEST_PASS) > ksft_test_result_pass("PASS: %s %s%s\n", mode_string(test), busy_poll_string(test), > @@ -2395,6 +2277,39 @@ static bool is_xdp_supported(int ifindex) > return true; > } > > +static const struct test_spec tests[] = { > + {.name = "SEND_RECEIVE", .test_func = testapp_send_receive}, > + {.name = "SEND_RECEIVE_2K_FRAME", .test_func = testapp_send_receive_2k_frame}, > + {.name = "SEND_RECEIVE_SINGLE_PKT", .test_func = testapp_single_pkt}, > + {.name = "POLL_RX", .test_func = testapp_poll_rx}, > + {.name = "POLL_TX", .test_func = testapp_poll_tx}, > + {.name = "POLL_RXQ_FULL", .test_func = testapp_poll_rxq_tmout}, > + {.name = "POLL_TXQ_FULL", .test_func = testapp_poll_txq_tmout}, > + {.name = "SEND_RECEIVE_UNALIGNED", .test_func = testapp_send_receive_unaligned}, > + {.name = "ALIGNED_INV_DESC", .test_func = testapp_aligned_inv_desc}, > + {.name = "ALIGNED_INV_DESC_2K_FRAME_SIZE", .test_func = testapp_aligned_inv_desc_2k_frame}, > + {.name = "UNALIGNED_INV_DESC", .test_func = testapp_unaligned_inv_desc}, > + {.name = "UNALIGNED_INV_DESC_4001_FRAME_SIZE", > + .test_func = testapp_unaligned_inv_desc_4001_frame}, > + {.name = "UMEM_HEADROOM", .test_func = testapp_headroom}, > + {.name = "TEARDOWN", .test_func = testapp_teardown}, > + {.name = "BIDIRECTIONAL", .test_func = testapp_bidirectional}, > + {.name = "STAT_RX_DROPPED", .test_func = testapp_stats_rx_dropped}, > + {.name = "STAT_TX_INVALID", .test_func = testapp_stats_tx_invalid_descs}, > + {.name = "STAT_RX_FULL", .test_func = testapp_stats_rx_full}, > + {.name = "STAT_FILL_EMPTY", .test_func = testapp_stats_fill_empty}, > + {.name = "XDP_PROG_CLEANUP", .test_func = testapp_xdp_prog_cleanup}, > + {.name = "XDP_DROP_HALF", .test_func = testapp_xdp_drop}, > + {.name = "XDP_METADATA_COPY", .test_func = testapp_xdp_metadata}, > + {.name = "XDP_METADATA_COPY_MULTI_BUFF", .test_func = testapp_xdp_metadata_mb}, > + {.name = "SEND_RECEIVE_9K_PACKETS", .test_func = testapp_send_receive_mb}, > + {.name = "SEND_RECEIVE_UNALIGNED_9K_PACKETS", > + .test_func = testapp_send_receive_unaligned_mb}, > + {.name = "ALIGNED_INV_DESC_MULTI_BUFF", .test_func = testapp_aligned_inv_desc_mb}, > + {.name = "UNALIGNED_INV_DESC_MULTI_BUFF", .test_func = testapp_unaligned_inv_desc_mb}, > + {.name = "TOO_MANY_FRAGS", .test_func = testapp_too_many_frags}, > +}; can you move this to a header file? looks weird to have these declarations in the middle of the file. > + > int main(int argc, char **argv) > { > struct pkt_stream *rx_pkt_stream_default; > @@ -2437,7 +2352,7 @@ int main(int argc, char **argv) > init_iface(ifobj_rx, MAC1, MAC2, worker_testapp_validate_rx); > init_iface(ifobj_tx, MAC2, MAC1, worker_testapp_validate_tx); > > - test_spec_init(&test, ifobj_tx, ifobj_rx, 0); > + test_spec_init(&test, ifobj_tx, ifobj_rx, 0, &tests[0]); > tx_pkt_stream_default = pkt_stream_generate(ifobj_tx->umem, DEFAULT_PKT_CNT, MIN_PKT_SIZE); > rx_pkt_stream_default = pkt_stream_generate(ifobj_rx->umem, DEFAULT_PKT_CNT, MIN_PKT_SIZE); > if (!tx_pkt_stream_default || !rx_pkt_stream_default) > @@ -2446,17 +2361,17 @@ int main(int argc, char **argv) > test.rx_pkt_stream_default = rx_pkt_stream_default; > > if (opt_mode == TEST_MODE_ALL) > - ksft_set_plan(modes * TEST_TYPE_MAX); > + ksft_set_plan(modes * ARRAY_SIZE(tests)); > else > - ksft_set_plan(TEST_TYPE_MAX); > + ksft_set_plan(ARRAY_SIZE(tests)); > > for (i = 0; i < modes; i++) { > if (opt_mode != TEST_MODE_ALL && i != opt_mode) > continue; > > - for (j = 0; j < TEST_TYPE_MAX; j++) { > - test_spec_init(&test, ifobj_tx, ifobj_rx, i); > - run_pkt_test(&test, i, j); > + for (j = 0; j < ARRAY_SIZE(tests); j++) { > + test_spec_init(&test, ifobj_tx, ifobj_rx, i, &tests[j]); > + run_pkt_test(&test); > usleep(USLEEP_MAX); > > if (test.fail) > diff --git a/tools/testing/selftests/bpf/xskxceiver.h b/tools/testing/selftests/bpf/xskxceiver.h > index 1412492e9618..3a71d490db3e 100644 > --- a/tools/testing/selftests/bpf/xskxceiver.h > +++ b/tools/testing/selftests/bpf/xskxceiver.h > @@ -34,7 +34,7 @@ > #define MAX_INTERFACES 2 > #define MAX_INTERFACE_NAME_CHARS 16 > #define MAX_SOCKETS 2 > -#define MAX_TEST_NAME_SIZE 32 > +#define MAX_TEST_NAME_SIZE 48 > #define MAX_TEARDOWN_ITER 10 > #define PKT_HDR_SIZE (sizeof(struct ethhdr) + 2) /* Just to align the data in the packet */ > #define MIN_PKT_SIZE 64 > @@ -66,38 +66,6 @@ enum test_mode { > TEST_MODE_ALL > }; > > -enum test_type { > - TEST_TYPE_RUN_TO_COMPLETION, > - TEST_TYPE_RUN_TO_COMPLETION_2K_FRAME, > - TEST_TYPE_RUN_TO_COMPLETION_SINGLE_PKT, > - TEST_TYPE_RX_POLL, > - TEST_TYPE_TX_POLL, > - TEST_TYPE_POLL_RXQ_TMOUT, > - TEST_TYPE_POLL_TXQ_TMOUT, > - TEST_TYPE_UNALIGNED, > - TEST_TYPE_ALIGNED_INV_DESC, > - TEST_TYPE_ALIGNED_INV_DESC_2K_FRAME, > - TEST_TYPE_UNALIGNED_INV_DESC, > - TEST_TYPE_UNALIGNED_INV_DESC_4K1_FRAME, > - TEST_TYPE_HEADROOM, > - TEST_TYPE_TEARDOWN, > - TEST_TYPE_BIDI, > - TEST_TYPE_STATS_RX_DROPPED, > - TEST_TYPE_STATS_TX_INVALID_DESCS, > - TEST_TYPE_STATS_RX_FULL, > - TEST_TYPE_STATS_FILL_EMPTY, > - TEST_TYPE_BPF_RES, > - TEST_TYPE_XDP_DROP_HALF, > - TEST_TYPE_XDP_METADATA_COUNT, > - TEST_TYPE_XDP_METADATA_COUNT_MB, > - TEST_TYPE_RUN_TO_COMPLETION_MB, > - TEST_TYPE_UNALIGNED_MB, > - TEST_TYPE_ALIGNED_INV_DESC_MB, > - TEST_TYPE_UNALIGNED_INV_DESC_MB, > - TEST_TYPE_TOO_MANY_FRAGS, > - TEST_TYPE_MAX > -}; > - > struct xsk_umem_info { > struct xsk_ring_prod fq; > struct xsk_ring_cons cq; > @@ -137,8 +105,10 @@ struct pkt_stream { > }; > > struct ifobject; > +struct test_spec; > typedef int (*validation_func_t)(struct ifobject *ifobj); > typedef void *(*thread_func_t)(void *arg); > +typedef int (*test_func_t)(struct test_spec *test); > > struct ifobject { > char ifname[MAX_INTERFACE_NAME_CHARS]; > @@ -180,6 +150,7 @@ struct test_spec { > struct bpf_program *xdp_prog_tx; > struct bpf_map *xskmap_rx; > struct bpf_map *xskmap_tx; > + test_func_t test_func; > int mtu; > u16 total_steps; > u16 current_step; > -- > 2.34.1 >
diff --git a/tools/testing/selftests/bpf/xskxceiver.c b/tools/testing/selftests/bpf/xskxceiver.c index ee72bb0a8978..b1d0c69f21b8 100644 --- a/tools/testing/selftests/bpf/xskxceiver.c +++ b/tools/testing/selftests/bpf/xskxceiver.c @@ -447,7 +447,8 @@ static void __test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx, } static void test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx, - struct ifobject *ifobj_rx, enum test_mode mode) + struct ifobject *ifobj_rx, enum test_mode mode, + const struct test_spec *test_to_run) { struct pkt_stream *tx_pkt_stream; struct pkt_stream *rx_pkt_stream; @@ -469,6 +470,8 @@ static void test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx, ifobj->bind_flags |= XDP_COPY; } + strncpy(test->name, test_to_run->name, MAX_TEST_NAME_SIZE); + test->test_func = test_to_run->test_func; test->mode = mode; __test_spec_init(test, ifobj_tx, ifobj_rx); } @@ -478,11 +481,6 @@ static void test_spec_reset(struct test_spec *test) __test_spec_init(test, test->ifobj_tx, test->ifobj_rx); } -static void test_spec_set_name(struct test_spec *test, const char *name) -{ - strncpy(test->name, name, MAX_TEST_NAME_SIZE); -} - static void test_spec_set_xdp_prog(struct test_spec *test, struct bpf_program *xdp_prog_rx, struct bpf_program *xdp_prog_tx, struct bpf_map *xskmap_rx, struct bpf_map *xskmap_tx) @@ -1727,7 +1725,6 @@ static int testapp_teardown(struct test_spec *test) { int i; - test_spec_set_name(test, "TEARDOWN"); for (i = 0; i < MAX_TEARDOWN_ITER; i++) { if (testapp_validate_traffic(test)) return TEST_FAILURE; @@ -1749,11 +1746,10 @@ static void swap_directions(struct ifobject **ifobj1, struct ifobject **ifobj2) *ifobj2 = tmp_ifobj; } -static int testapp_bidi(struct test_spec *test) +static int testapp_bidirectional(struct test_spec *test) { int res; - test_spec_set_name(test, "BIDIRECTIONAL"); test->ifobj_tx->rx_on = true; test->ifobj_rx->tx_on = true; test->total_steps = 2; @@ -1782,9 +1778,8 @@ static void swap_xsk_resources(struct ifobject *ifobj_tx, struct ifobject *ifobj exit_with_error(errno); } -static int testapp_bpf_res(struct test_spec *test) +static int testapp_xdp_prog_cleanup(struct test_spec *test) { - test_spec_set_name(test, "BPF_RES"); test->total_steps = 2; test->nb_sockets = 2; if (testapp_validate_traffic(test)) @@ -1796,14 +1791,12 @@ static int testapp_bpf_res(struct test_spec *test) static int testapp_headroom(struct test_spec *test) { - test_spec_set_name(test, "UMEM_HEADROOM"); test->ifobj_rx->umem->frame_headroom = UMEM_HEADROOM_TEST_SIZE; return testapp_validate_traffic(test); } static int testapp_stats_rx_dropped(struct test_spec *test) { - test_spec_set_name(test, "STAT_RX_DROPPED"); if (test->mode == TEST_MODE_ZC) { ksft_test_result_skip("Can not run RX_DROPPED test for ZC mode\n"); return TEST_SKIP; @@ -1819,7 +1812,6 @@ static int testapp_stats_rx_dropped(struct test_spec *test) static int testapp_stats_tx_invalid_descs(struct test_spec *test) { - test_spec_set_name(test, "STAT_TX_INVALID"); pkt_stream_replace_half(test, XSK_UMEM__INVALID_FRAME_SIZE, 0); test->ifobj_tx->validation_func = validate_tx_invalid_descs; return testapp_validate_traffic(test); @@ -1827,7 +1819,6 @@ static int testapp_stats_tx_invalid_descs(struct test_spec *test) static int testapp_stats_rx_full(struct test_spec *test) { - test_spec_set_name(test, "STAT_RX_FULL"); pkt_stream_replace(test, DEFAULT_UMEM_BUFFERS + DEFAULT_UMEM_BUFFERS / 2, MIN_PKT_SIZE); test->ifobj_rx->pkt_stream = pkt_stream_generate(test->ifobj_rx->umem, DEFAULT_UMEM_BUFFERS, MIN_PKT_SIZE); @@ -1840,7 +1831,6 @@ static int testapp_stats_rx_full(struct test_spec *test) static int testapp_stats_fill_empty(struct test_spec *test) { - test_spec_set_name(test, "STAT_RX_FILL_EMPTY"); pkt_stream_replace(test, DEFAULT_UMEM_BUFFERS + DEFAULT_UMEM_BUFFERS / 2, MIN_PKT_SIZE); test->ifobj_rx->pkt_stream = pkt_stream_generate(test->ifobj_rx->umem, DEFAULT_UMEM_BUFFERS, MIN_PKT_SIZE); @@ -1850,9 +1840,8 @@ static int testapp_stats_fill_empty(struct test_spec *test) return testapp_validate_traffic(test); } -static int testapp_unaligned(struct test_spec *test) +static int testapp_send_receive_unaligned(struct test_spec *test) { - test_spec_set_name(test, "UNALIGNED_MODE"); test->ifobj_tx->umem->unaligned_mode = true; test->ifobj_rx->umem->unaligned_mode = true; /* Let half of the packets straddle a 4K buffer boundary */ @@ -1861,9 +1850,8 @@ static int testapp_unaligned(struct test_spec *test) return testapp_validate_traffic(test); } -static int testapp_unaligned_mb(struct test_spec *test) +static int testapp_send_receive_unaligned_mb(struct test_spec *test) { - test_spec_set_name(test, "UNALIGNED_MODE_9K"); test->mtu = MAX_ETH_JUMBO_SIZE; test->ifobj_tx->umem->unaligned_mode = true; test->ifobj_rx->umem->unaligned_mode = true; @@ -1875,14 +1863,12 @@ static int testapp_single_pkt(struct test_spec *test) { struct pkt pkts[] = {{0, MIN_PKT_SIZE, 0, true}}; - test_spec_set_name(test, "SEND_RECEIVE_SINGLE_PKT"); pkt_stream_generate_custom(test, pkts, ARRAY_SIZE(pkts)); return testapp_validate_traffic(test); } -static int testapp_multi_buffer(struct test_spec *test) +static int testapp_send_receive_mb(struct test_spec *test) { - test_spec_set_name(test, "SEND_RECEIVE_9K_PACKETS"); test->mtu = MAX_ETH_JUMBO_SIZE; pkt_stream_replace(test, DEFAULT_PKT_CNT, MAX_ETH_JUMBO_SIZE); @@ -1979,7 +1965,6 @@ static int testapp_xdp_drop(struct test_spec *test) struct xsk_xdp_progs *skel_rx = test->ifobj_rx->xdp_progs; struct xsk_xdp_progs *skel_tx = test->ifobj_tx->xdp_progs; - test_spec_set_name(test, "XDP_DROP_HALF"); test_spec_set_xdp_prog(test, skel_rx->progs.xsk_xdp_drop, skel_tx->progs.xsk_xdp_drop, skel_rx->maps.xsk, skel_tx->maps.xsk); @@ -2012,8 +1997,6 @@ static int testapp_xdp_metadata_copy(struct test_spec *test) static int testapp_poll_txq_tmout(struct test_spec *test) { - test_spec_set_name(test, "POLL_TXQ_FULL"); - test->ifobj_tx->use_poll = true; /* create invalid frame by set umem frame_size and pkt length equal to 2048 */ test->ifobj_tx->umem->frame_size = 2048; @@ -2023,7 +2006,6 @@ static int testapp_poll_txq_tmout(struct test_spec *test) static int testapp_poll_rxq_tmout(struct test_spec *test) { - test_spec_set_name(test, "POLL_RXQ_EMPTY"); test->ifobj_rx->use_poll = true; return testapp_validate_traffic_single_thread(test, test->ifobj_rx); } @@ -2033,7 +2015,6 @@ static int testapp_too_many_frags(struct test_spec *test) struct pkt pkts[2 * XSK_DESC__MAX_SKB_FRAGS + 2] = {}; u32 max_frags, i; - test_spec_set_name(test, "TOO_MANY_FRAGS"); if (test->mode == TEST_MODE_ZC) max_frags = test->ifobj_tx->xdp_zc_max_segs; else @@ -2139,13 +2120,11 @@ static void init_iface(struct ifobject *ifobj, const char *dst_mac, const char * static int testapp_send_receive(struct test_spec *test) { - test_spec_set_name(test, "SEND_RECEIVE"); return testapp_validate_traffic(test); } static int testapp_send_receive_2k_frame(struct test_spec *test) { - test_spec_set_name(test, "SEND_RECEIVE_2K_FRAME_SIZE"); test->ifobj_tx->umem->frame_size = 2048; test->ifobj_rx->umem->frame_size = 2048; pkt_stream_replace(test, DEFAULT_PKT_CNT, MIN_PKT_SIZE); @@ -2155,26 +2134,22 @@ static int testapp_send_receive_2k_frame(struct test_spec *test) static int testapp_poll_rx(struct test_spec *test) { test->ifobj_rx->use_poll = true; - test_spec_set_name(test, "POLL_RX"); return testapp_validate_traffic(test); } static int testapp_poll_tx(struct test_spec *test) { test->ifobj_tx->use_poll = true; - test_spec_set_name(test, "POLL_TX"); return testapp_validate_traffic(test); } static int testapp_aligned_inv_desc(struct test_spec *test) { - test_spec_set_name(test, "ALIGNED_INV_DESC"); return testapp_invalid_desc(test); } static int testapp_aligned_inv_desc_2k_frame(struct test_spec *test) { - test_spec_set_name(test, "ALIGNED_INV_DESC_2K_FRAME_SIZE"); test->ifobj_tx->umem->frame_size = 2048; test->ifobj_rx->umem->frame_size = 2048; return testapp_invalid_desc(test); @@ -2182,7 +2157,6 @@ static int testapp_aligned_inv_desc_2k_frame(struct test_spec *test) static int testapp_unaligned_inv_desc(struct test_spec *test) { - test_spec_set_name(test, "UNALIGNED_INV_DESC"); test->ifobj_tx->umem->unaligned_mode = true; test->ifobj_rx->umem->unaligned_mode = true; return testapp_invalid_desc(test); @@ -2192,7 +2166,6 @@ static int testapp_unaligned_inv_desc_4001_frame(struct test_spec *test) { u64 page_size, umem_size; - test_spec_set_name(test, "UNALIGNED_INV_DESC_4K1_FRAME_SIZE"); /* Odd frame size so the UMEM doesn't end near a page boundary. */ test->ifobj_tx->umem->frame_size = 4001; test->ifobj_rx->umem->frame_size = 4001; @@ -2211,13 +2184,11 @@ static int testapp_unaligned_inv_desc_4001_frame(struct test_spec *test) static int testapp_aligned_inv_desc_mb(struct test_spec *test) { - test_spec_set_name(test, "ALIGNED_INV_DESC_MULTI_BUFF"); return testapp_invalid_desc_mb(test); } static int testapp_unaligned_inv_desc_mb(struct test_spec *test) { - test_spec_set_name(test, "UNALIGNED_INV_DESC_MULTI_BUFF"); test->ifobj_tx->umem->unaligned_mode = true; test->ifobj_rx->umem->unaligned_mode = true; return testapp_invalid_desc_mb(test); @@ -2225,109 +2196,20 @@ static int testapp_unaligned_inv_desc_mb(struct test_spec *test) static int testapp_xdp_metadata(struct test_spec *test) { - test_spec_set_name(test, "XDP_METADATA_COPY"); return testapp_xdp_metadata_copy(test); } static int testapp_xdp_metadata_mb(struct test_spec *test) { - test_spec_set_name(test, "XDP_METADATA_COPY_MULTI_BUFF"); test->mtu = MAX_ETH_JUMBO_SIZE; return testapp_xdp_metadata_copy(test); } -static void run_pkt_test(struct test_spec *test, enum test_mode mode, enum test_type type) -{ - int ret = TEST_SKIP; - - switch (type) { - case TEST_TYPE_STATS_RX_DROPPED: - ret = testapp_stats_rx_dropped(test); - break; - case TEST_TYPE_STATS_TX_INVALID_DESCS: - ret = testapp_stats_tx_invalid_descs(test); - break; - case TEST_TYPE_STATS_RX_FULL: - ret = testapp_stats_rx_full(test); - break; - case TEST_TYPE_STATS_FILL_EMPTY: - ret = testapp_stats_fill_empty(test); - break; - case TEST_TYPE_TEARDOWN: - ret = testapp_teardown(test); - break; - case TEST_TYPE_BIDI: - ret = testapp_bidi(test); - break; - case TEST_TYPE_BPF_RES: - ret = testapp_bpf_res(test); - break; - case TEST_TYPE_RUN_TO_COMPLETION: - ret = testapp_send_receive(test); - break; - case TEST_TYPE_RUN_TO_COMPLETION_MB: - ret = testapp_multi_buffer(test); - break; - case TEST_TYPE_RUN_TO_COMPLETION_SINGLE_PKT: - ret = testapp_single_pkt(test); - break; - case TEST_TYPE_RUN_TO_COMPLETION_2K_FRAME: - ret = testapp_send_receive_2k_frame(test); - break; - case TEST_TYPE_RX_POLL: - ret = testapp_poll_rx(test); - break; - case TEST_TYPE_TX_POLL: - ret = testapp_poll_tx(test); - break; - case TEST_TYPE_POLL_TXQ_TMOUT: - ret = testapp_poll_txq_tmout(test); - break; - case TEST_TYPE_POLL_RXQ_TMOUT: - ret = testapp_poll_rxq_tmout(test); - break; - case TEST_TYPE_ALIGNED_INV_DESC: - ret = testapp_aligned_inv_desc(test); - break; - case TEST_TYPE_ALIGNED_INV_DESC_2K_FRAME: - ret = testapp_aligned_inv_desc_2k_frame(test); - break; - case TEST_TYPE_UNALIGNED_INV_DESC: - ret = testapp_unaligned_inv_desc(test); - break; - case TEST_TYPE_UNALIGNED_INV_DESC_4K1_FRAME: - ret = testapp_unaligned_inv_desc_4001_frame(test); - break; - case TEST_TYPE_ALIGNED_INV_DESC_MB: - ret = testapp_aligned_inv_desc_mb(test); - break; - case TEST_TYPE_UNALIGNED_INV_DESC_MB: - ret = testapp_unaligned_inv_desc_mb(test); - break; - case TEST_TYPE_UNALIGNED: - ret = testapp_unaligned(test); - break; - case TEST_TYPE_UNALIGNED_MB: - ret = testapp_unaligned_mb(test); - break; - case TEST_TYPE_HEADROOM: - ret = testapp_headroom(test); - break; - case TEST_TYPE_XDP_DROP_HALF: - ret = testapp_xdp_drop(test); - break; - case TEST_TYPE_XDP_METADATA_COUNT: - ret = testapp_xdp_metadata(test); - break; - case TEST_TYPE_XDP_METADATA_COUNT_MB: - ret = testapp_xdp_metadata_mb(test); - break; - case TEST_TYPE_TOO_MANY_FRAGS: - ret = testapp_too_many_frags(test); - break; - default: - break; - } +static void run_pkt_test(struct test_spec *test) +{ + int ret; + + ret = test->test_func(test); if (ret == TEST_PASS) ksft_test_result_pass("PASS: %s %s%s\n", mode_string(test), busy_poll_string(test), @@ -2395,6 +2277,39 @@ static bool is_xdp_supported(int ifindex) return true; } +static const struct test_spec tests[] = { + {.name = "SEND_RECEIVE", .test_func = testapp_send_receive}, + {.name = "SEND_RECEIVE_2K_FRAME", .test_func = testapp_send_receive_2k_frame}, + {.name = "SEND_RECEIVE_SINGLE_PKT", .test_func = testapp_single_pkt}, + {.name = "POLL_RX", .test_func = testapp_poll_rx}, + {.name = "POLL_TX", .test_func = testapp_poll_tx}, + {.name = "POLL_RXQ_FULL", .test_func = testapp_poll_rxq_tmout}, + {.name = "POLL_TXQ_FULL", .test_func = testapp_poll_txq_tmout}, + {.name = "SEND_RECEIVE_UNALIGNED", .test_func = testapp_send_receive_unaligned}, + {.name = "ALIGNED_INV_DESC", .test_func = testapp_aligned_inv_desc}, + {.name = "ALIGNED_INV_DESC_2K_FRAME_SIZE", .test_func = testapp_aligned_inv_desc_2k_frame}, + {.name = "UNALIGNED_INV_DESC", .test_func = testapp_unaligned_inv_desc}, + {.name = "UNALIGNED_INV_DESC_4001_FRAME_SIZE", + .test_func = testapp_unaligned_inv_desc_4001_frame}, + {.name = "UMEM_HEADROOM", .test_func = testapp_headroom}, + {.name = "TEARDOWN", .test_func = testapp_teardown}, + {.name = "BIDIRECTIONAL", .test_func = testapp_bidirectional}, + {.name = "STAT_RX_DROPPED", .test_func = testapp_stats_rx_dropped}, + {.name = "STAT_TX_INVALID", .test_func = testapp_stats_tx_invalid_descs}, + {.name = "STAT_RX_FULL", .test_func = testapp_stats_rx_full}, + {.name = "STAT_FILL_EMPTY", .test_func = testapp_stats_fill_empty}, + {.name = "XDP_PROG_CLEANUP", .test_func = testapp_xdp_prog_cleanup}, + {.name = "XDP_DROP_HALF", .test_func = testapp_xdp_drop}, + {.name = "XDP_METADATA_COPY", .test_func = testapp_xdp_metadata}, + {.name = "XDP_METADATA_COPY_MULTI_BUFF", .test_func = testapp_xdp_metadata_mb}, + {.name = "SEND_RECEIVE_9K_PACKETS", .test_func = testapp_send_receive_mb}, + {.name = "SEND_RECEIVE_UNALIGNED_9K_PACKETS", + .test_func = testapp_send_receive_unaligned_mb}, + {.name = "ALIGNED_INV_DESC_MULTI_BUFF", .test_func = testapp_aligned_inv_desc_mb}, + {.name = "UNALIGNED_INV_DESC_MULTI_BUFF", .test_func = testapp_unaligned_inv_desc_mb}, + {.name = "TOO_MANY_FRAGS", .test_func = testapp_too_many_frags}, +}; + int main(int argc, char **argv) { struct pkt_stream *rx_pkt_stream_default; @@ -2437,7 +2352,7 @@ int main(int argc, char **argv) init_iface(ifobj_rx, MAC1, MAC2, worker_testapp_validate_rx); init_iface(ifobj_tx, MAC2, MAC1, worker_testapp_validate_tx); - test_spec_init(&test, ifobj_tx, ifobj_rx, 0); + test_spec_init(&test, ifobj_tx, ifobj_rx, 0, &tests[0]); tx_pkt_stream_default = pkt_stream_generate(ifobj_tx->umem, DEFAULT_PKT_CNT, MIN_PKT_SIZE); rx_pkt_stream_default = pkt_stream_generate(ifobj_rx->umem, DEFAULT_PKT_CNT, MIN_PKT_SIZE); if (!tx_pkt_stream_default || !rx_pkt_stream_default) @@ -2446,17 +2361,17 @@ int main(int argc, char **argv) test.rx_pkt_stream_default = rx_pkt_stream_default; if (opt_mode == TEST_MODE_ALL) - ksft_set_plan(modes * TEST_TYPE_MAX); + ksft_set_plan(modes * ARRAY_SIZE(tests)); else - ksft_set_plan(TEST_TYPE_MAX); + ksft_set_plan(ARRAY_SIZE(tests)); for (i = 0; i < modes; i++) { if (opt_mode != TEST_MODE_ALL && i != opt_mode) continue; - for (j = 0; j < TEST_TYPE_MAX; j++) { - test_spec_init(&test, ifobj_tx, ifobj_rx, i); - run_pkt_test(&test, i, j); + for (j = 0; j < ARRAY_SIZE(tests); j++) { + test_spec_init(&test, ifobj_tx, ifobj_rx, i, &tests[j]); + run_pkt_test(&test); usleep(USLEEP_MAX); if (test.fail) diff --git a/tools/testing/selftests/bpf/xskxceiver.h b/tools/testing/selftests/bpf/xskxceiver.h index 1412492e9618..3a71d490db3e 100644 --- a/tools/testing/selftests/bpf/xskxceiver.h +++ b/tools/testing/selftests/bpf/xskxceiver.h @@ -34,7 +34,7 @@ #define MAX_INTERFACES 2 #define MAX_INTERFACE_NAME_CHARS 16 #define MAX_SOCKETS 2 -#define MAX_TEST_NAME_SIZE 32 +#define MAX_TEST_NAME_SIZE 48 #define MAX_TEARDOWN_ITER 10 #define PKT_HDR_SIZE (sizeof(struct ethhdr) + 2) /* Just to align the data in the packet */ #define MIN_PKT_SIZE 64 @@ -66,38 +66,6 @@ enum test_mode { TEST_MODE_ALL }; -enum test_type { - TEST_TYPE_RUN_TO_COMPLETION, - TEST_TYPE_RUN_TO_COMPLETION_2K_FRAME, - TEST_TYPE_RUN_TO_COMPLETION_SINGLE_PKT, - TEST_TYPE_RX_POLL, - TEST_TYPE_TX_POLL, - TEST_TYPE_POLL_RXQ_TMOUT, - TEST_TYPE_POLL_TXQ_TMOUT, - TEST_TYPE_UNALIGNED, - TEST_TYPE_ALIGNED_INV_DESC, - TEST_TYPE_ALIGNED_INV_DESC_2K_FRAME, - TEST_TYPE_UNALIGNED_INV_DESC, - TEST_TYPE_UNALIGNED_INV_DESC_4K1_FRAME, - TEST_TYPE_HEADROOM, - TEST_TYPE_TEARDOWN, - TEST_TYPE_BIDI, - TEST_TYPE_STATS_RX_DROPPED, - TEST_TYPE_STATS_TX_INVALID_DESCS, - TEST_TYPE_STATS_RX_FULL, - TEST_TYPE_STATS_FILL_EMPTY, - TEST_TYPE_BPF_RES, - TEST_TYPE_XDP_DROP_HALF, - TEST_TYPE_XDP_METADATA_COUNT, - TEST_TYPE_XDP_METADATA_COUNT_MB, - TEST_TYPE_RUN_TO_COMPLETION_MB, - TEST_TYPE_UNALIGNED_MB, - TEST_TYPE_ALIGNED_INV_DESC_MB, - TEST_TYPE_UNALIGNED_INV_DESC_MB, - TEST_TYPE_TOO_MANY_FRAGS, - TEST_TYPE_MAX -}; - struct xsk_umem_info { struct xsk_ring_prod fq; struct xsk_ring_cons cq; @@ -137,8 +105,10 @@ struct pkt_stream { }; struct ifobject; +struct test_spec; typedef int (*validation_func_t)(struct ifobject *ifobj); typedef void *(*thread_func_t)(void *arg); +typedef int (*test_func_t)(struct test_spec *test); struct ifobject { char ifname[MAX_INTERFACE_NAME_CHARS]; @@ -180,6 +150,7 @@ struct test_spec { struct bpf_program *xdp_prog_tx; struct bpf_map *xskmap_rx; struct bpf_map *xskmap_tx; + test_func_t test_func; int mtu; u16 total_steps; u16 current_step;