1*d1aec26fSBastien Curutchet (eBPF Foundation) // SPDX-License-Identifier: GPL-2.0 2*d1aec26fSBastien Curutchet (eBPF Foundation) #include <net/if.h> 3*d1aec26fSBastien Curutchet (eBPF Foundation) #include <stdarg.h> 4*d1aec26fSBastien Curutchet (eBPF Foundation) 5*d1aec26fSBastien Curutchet (eBPF Foundation) #include "network_helpers.h" 6*d1aec26fSBastien Curutchet (eBPF Foundation) #include "test_progs.h" 7*d1aec26fSBastien Curutchet (eBPF Foundation) #include "test_xsk.h" 8*d1aec26fSBastien Curutchet (eBPF Foundation) #include "xsk_xdp_progs.skel.h" 9*d1aec26fSBastien Curutchet (eBPF Foundation) 10*d1aec26fSBastien Curutchet (eBPF Foundation) #define VETH_RX "veth0" 11*d1aec26fSBastien Curutchet (eBPF Foundation) #define VETH_TX "veth1" 12*d1aec26fSBastien Curutchet (eBPF Foundation) #define MTU 1500 13*d1aec26fSBastien Curutchet (eBPF Foundation) 14*d1aec26fSBastien Curutchet (eBPF Foundation) int setup_veth(bool busy_poll) 15*d1aec26fSBastien Curutchet (eBPF Foundation) { 16*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, 17*d1aec26fSBastien Curutchet (eBPF Foundation) "ip link add %s numtxqueues 4 numrxqueues 4 type veth peer name %s numtxqueues 4 numrxqueues 4", 18*d1aec26fSBastien Curutchet (eBPF Foundation) VETH_RX, VETH_TX); 19*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, "sysctl -wq net.ipv6.conf.%s.disable_ipv6=1", VETH_RX); 20*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, "sysctl -wq net.ipv6.conf.%s.disable_ipv6=1", VETH_TX); 21*d1aec26fSBastien Curutchet (eBPF Foundation) 22*d1aec26fSBastien Curutchet (eBPF Foundation) if (busy_poll) { 23*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, "echo 2 > /sys/class/net/%s/napi_defer_hard_irqs", VETH_RX); 24*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, "echo 200000 > /sys/class/net/%s/gro_flush_timeout", VETH_RX); 25*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, "echo 2 > /sys/class/net/%s/napi_defer_hard_irqs", VETH_TX); 26*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, "echo 200000 > /sys/class/net/%s/gro_flush_timeout", VETH_TX); 27*d1aec26fSBastien Curutchet (eBPF Foundation) } 28*d1aec26fSBastien Curutchet (eBPF Foundation) 29*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, "ip link set %s mtu %d", VETH_RX, MTU); 30*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, "ip link set %s mtu %d", VETH_TX, MTU); 31*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, "ip link set %s up", VETH_RX); 32*d1aec26fSBastien Curutchet (eBPF Foundation) SYS(fail, "ip link set %s up", VETH_TX); 33*d1aec26fSBastien Curutchet (eBPF Foundation) 34*d1aec26fSBastien Curutchet (eBPF Foundation) return 0; 35*d1aec26fSBastien Curutchet (eBPF Foundation) 36*d1aec26fSBastien Curutchet (eBPF Foundation) fail: 37*d1aec26fSBastien Curutchet (eBPF Foundation) return -1; 38*d1aec26fSBastien Curutchet (eBPF Foundation) } 39*d1aec26fSBastien Curutchet (eBPF Foundation) 40*d1aec26fSBastien Curutchet (eBPF Foundation) void delete_veth(void) 41*d1aec26fSBastien Curutchet (eBPF Foundation) { 42*d1aec26fSBastien Curutchet (eBPF Foundation) SYS_NOFAIL("ip link del %s", VETH_RX); 43*d1aec26fSBastien Curutchet (eBPF Foundation) SYS_NOFAIL("ip link del %s", VETH_TX); 44*d1aec26fSBastien Curutchet (eBPF Foundation) } 45*d1aec26fSBastien Curutchet (eBPF Foundation) 46*d1aec26fSBastien Curutchet (eBPF Foundation) int configure_ifobj(struct ifobject *tx, struct ifobject *rx) 47*d1aec26fSBastien Curutchet (eBPF Foundation) { 48*d1aec26fSBastien Curutchet (eBPF Foundation) rx->ifindex = if_nametoindex(VETH_RX); 49*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK_FD(rx->ifindex, "get RX ifindex")) 50*d1aec26fSBastien Curutchet (eBPF Foundation) return -1; 51*d1aec26fSBastien Curutchet (eBPF Foundation) 52*d1aec26fSBastien Curutchet (eBPF Foundation) tx->ifindex = if_nametoindex(VETH_TX); 53*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK_FD(tx->ifindex, "get TX ifindex")) 54*d1aec26fSBastien Curutchet (eBPF Foundation) return -1; 55*d1aec26fSBastien Curutchet (eBPF Foundation) 56*d1aec26fSBastien Curutchet (eBPF Foundation) tx->shared_umem = false; 57*d1aec26fSBastien Curutchet (eBPF Foundation) rx->shared_umem = false; 58*d1aec26fSBastien Curutchet (eBPF Foundation) 59*d1aec26fSBastien Curutchet (eBPF Foundation) 60*d1aec26fSBastien Curutchet (eBPF Foundation) return 0; 61*d1aec26fSBastien Curutchet (eBPF Foundation) } 62*d1aec26fSBastien Curutchet (eBPF Foundation) 63*d1aec26fSBastien Curutchet (eBPF Foundation) static void test_xsk(const struct test_spec *test_to_run, enum test_mode mode) 64*d1aec26fSBastien Curutchet (eBPF Foundation) { 65*d1aec26fSBastien Curutchet (eBPF Foundation) struct ifobject *ifobj_tx, *ifobj_rx; 66*d1aec26fSBastien Curutchet (eBPF Foundation) struct test_spec test; 67*d1aec26fSBastien Curutchet (eBPF Foundation) int ret; 68*d1aec26fSBastien Curutchet (eBPF Foundation) 69*d1aec26fSBastien Curutchet (eBPF Foundation) ifobj_tx = ifobject_create(); 70*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK_PTR(ifobj_tx, "create ifobj_tx")) 71*d1aec26fSBastien Curutchet (eBPF Foundation) return; 72*d1aec26fSBastien Curutchet (eBPF Foundation) 73*d1aec26fSBastien Curutchet (eBPF Foundation) ifobj_rx = ifobject_create(); 74*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK_PTR(ifobj_rx, "create ifobj_rx")) 75*d1aec26fSBastien Curutchet (eBPF Foundation) goto delete_tx; 76*d1aec26fSBastien Curutchet (eBPF Foundation) 77*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK(configure_ifobj(ifobj_tx, ifobj_rx), "conigure ifobj")) 78*d1aec26fSBastien Curutchet (eBPF Foundation) goto delete_rx; 79*d1aec26fSBastien Curutchet (eBPF Foundation) 80*d1aec26fSBastien Curutchet (eBPF Foundation) ret = get_hw_ring_size(ifobj_tx->ifname, &ifobj_tx->ring); 81*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ret) { 82*d1aec26fSBastien Curutchet (eBPF Foundation) ifobj_tx->hw_ring_size_supp = true; 83*d1aec26fSBastien Curutchet (eBPF Foundation) ifobj_tx->set_ring.default_tx = ifobj_tx->ring.tx_pending; 84*d1aec26fSBastien Curutchet (eBPF Foundation) ifobj_tx->set_ring.default_rx = ifobj_tx->ring.rx_pending; 85*d1aec26fSBastien Curutchet (eBPF Foundation) } 86*d1aec26fSBastien Curutchet (eBPF Foundation) 87*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK(init_iface(ifobj_rx, worker_testapp_validate_rx), "init RX")) 88*d1aec26fSBastien Curutchet (eBPF Foundation) goto delete_rx; 89*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK(init_iface(ifobj_tx, worker_testapp_validate_tx), "init TX")) 90*d1aec26fSBastien Curutchet (eBPF Foundation) goto delete_rx; 91*d1aec26fSBastien Curutchet (eBPF Foundation) 92*d1aec26fSBastien Curutchet (eBPF Foundation) test_init(&test, ifobj_tx, ifobj_rx, 0, &tests[0]); 93*d1aec26fSBastien Curutchet (eBPF Foundation) 94*d1aec26fSBastien Curutchet (eBPF Foundation) test.tx_pkt_stream_default = pkt_stream_generate(DEFAULT_PKT_CNT, MIN_PKT_SIZE); 95*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK_PTR(test.tx_pkt_stream_default, "TX pkt generation")) 96*d1aec26fSBastien Curutchet (eBPF Foundation) goto delete_rx; 97*d1aec26fSBastien Curutchet (eBPF Foundation) test.rx_pkt_stream_default = pkt_stream_generate(DEFAULT_PKT_CNT, MIN_PKT_SIZE); 98*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK_PTR(test.rx_pkt_stream_default, "RX pkt generation")) 99*d1aec26fSBastien Curutchet (eBPF Foundation) goto delete_rx; 100*d1aec26fSBastien Curutchet (eBPF Foundation) 101*d1aec26fSBastien Curutchet (eBPF Foundation) 102*d1aec26fSBastien Curutchet (eBPF Foundation) test_init(&test, ifobj_tx, ifobj_rx, mode, test_to_run); 103*d1aec26fSBastien Curutchet (eBPF Foundation) ret = test.test_func(&test); 104*d1aec26fSBastien Curutchet (eBPF Foundation) if (ret != TEST_SKIP) 105*d1aec26fSBastien Curutchet (eBPF Foundation) ASSERT_OK(ret, "Run test"); 106*d1aec26fSBastien Curutchet (eBPF Foundation) pkt_stream_restore_default(&test); 107*d1aec26fSBastien Curutchet (eBPF Foundation) 108*d1aec26fSBastien Curutchet (eBPF Foundation) if (ifobj_tx->hw_ring_size_supp) 109*d1aec26fSBastien Curutchet (eBPF Foundation) hw_ring_size_reset(ifobj_tx); 110*d1aec26fSBastien Curutchet (eBPF Foundation) 111*d1aec26fSBastien Curutchet (eBPF Foundation) pkt_stream_delete(test.tx_pkt_stream_default); 112*d1aec26fSBastien Curutchet (eBPF Foundation) pkt_stream_delete(test.rx_pkt_stream_default); 113*d1aec26fSBastien Curutchet (eBPF Foundation) xsk_xdp_progs__destroy(ifobj_tx->xdp_progs); 114*d1aec26fSBastien Curutchet (eBPF Foundation) xsk_xdp_progs__destroy(ifobj_rx->xdp_progs); 115*d1aec26fSBastien Curutchet (eBPF Foundation) 116*d1aec26fSBastien Curutchet (eBPF Foundation) delete_rx: 117*d1aec26fSBastien Curutchet (eBPF Foundation) ifobject_delete(ifobj_rx); 118*d1aec26fSBastien Curutchet (eBPF Foundation) delete_tx: 119*d1aec26fSBastien Curutchet (eBPF Foundation) ifobject_delete(ifobj_tx); 120*d1aec26fSBastien Curutchet (eBPF Foundation) } 121*d1aec26fSBastien Curutchet (eBPF Foundation) 122*d1aec26fSBastien Curutchet (eBPF Foundation) void test_ns_xsk_skb(void) 123*d1aec26fSBastien Curutchet (eBPF Foundation) { 124*d1aec26fSBastien Curutchet (eBPF Foundation) int i; 125*d1aec26fSBastien Curutchet (eBPF Foundation) 126*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK(setup_veth(false), "setup veth")) 127*d1aec26fSBastien Curutchet (eBPF Foundation) return; 128*d1aec26fSBastien Curutchet (eBPF Foundation) 129*d1aec26fSBastien Curutchet (eBPF Foundation) for (i = 0; i < ARRAY_SIZE(tests); i++) { 130*d1aec26fSBastien Curutchet (eBPF Foundation) if (test__start_subtest(tests[i].name)) 131*d1aec26fSBastien Curutchet (eBPF Foundation) test_xsk(&tests[i], TEST_MODE_SKB); 132*d1aec26fSBastien Curutchet (eBPF Foundation) } 133*d1aec26fSBastien Curutchet (eBPF Foundation) 134*d1aec26fSBastien Curutchet (eBPF Foundation) delete_veth(); 135*d1aec26fSBastien Curutchet (eBPF Foundation) } 136*d1aec26fSBastien Curutchet (eBPF Foundation) 137*d1aec26fSBastien Curutchet (eBPF Foundation) void test_ns_xsk_drv(void) 138*d1aec26fSBastien Curutchet (eBPF Foundation) { 139*d1aec26fSBastien Curutchet (eBPF Foundation) int i; 140*d1aec26fSBastien Curutchet (eBPF Foundation) 141*d1aec26fSBastien Curutchet (eBPF Foundation) if (!ASSERT_OK(setup_veth(false), "setup veth")) 142*d1aec26fSBastien Curutchet (eBPF Foundation) return; 143*d1aec26fSBastien Curutchet (eBPF Foundation) 144*d1aec26fSBastien Curutchet (eBPF Foundation) for (i = 0; i < ARRAY_SIZE(tests); i++) { 145*d1aec26fSBastien Curutchet (eBPF Foundation) if (test__start_subtest(tests[i].name)) 146*d1aec26fSBastien Curutchet (eBPF Foundation) test_xsk(&tests[i], TEST_MODE_DRV); 147*d1aec26fSBastien Curutchet (eBPF Foundation) } 148*d1aec26fSBastien Curutchet (eBPF Foundation) 149*d1aec26fSBastien Curutchet (eBPF Foundation) delete_veth(); 150*d1aec26fSBastien Curutchet (eBPF Foundation) } 151*d1aec26fSBastien Curutchet (eBPF Foundation) 152