On 02/24, Marcus Wichelmann wrote: > The existing XDP metadata test works by creating a veth pair and > attaching XDP & TC programs that drop the packet when the condition of > the test isn't fulfilled. The test then pings through the veth pair and > succeeds when the ping comes through. > > While this test works great for a veth pair, it is hard to replicate for > tap devices to test the XDP metadata support of them. A similar test for > the tun driver would either involve logic to reply to the ping request, > or would have to capture the packet to check if it was dropped or not. > > To make the testing of other drivers easier while still maximizing code > reuse, this commit refactors the existing xdp_context_functional test to > use a test_result map. Instead of conditionally passing or dropping the > packet, the TC program is changed to copy the received metadata into the > value of that single-entry array map. Tests can then verify that the map > value matches the expectation. > > This testing logic is easy to adapt to other network drivers as the only > remaining requirement is that there is some way to send a custom > Ethernet packet through it that triggers the XDP & TC programs. > > The payload of the Ethernet packet is used as the test data that is > expected to be passed as metadata from the XDP to the TC program and > written to the map. It has a fixed size of 32 bytes which is a > reasonalbe size that should be supported by both drivers. Additional > packet headers are not necessary for the test and were therefore skipped > to keep the testing code short. > > Signed-off-by: Marcus Wichelmann <marcus.wichelmann@xxxxxxxxxxxxxxxx> > --- > .../bpf/prog_tests/xdp_context_test_run.c | 99 +++++++++++++++---- > .../selftests/bpf/progs/test_xdp_meta.c | 56 ++++++----- > 2 files changed, 112 insertions(+), 43 deletions(-) > > diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_context_test_run.c b/tools/testing/selftests/bpf/prog_tests/xdp_context_test_run.c > index 937da9b7532a..4043f220d7c0 100644 > --- a/tools/testing/selftests/bpf/prog_tests/xdp_context_test_run.c > +++ b/tools/testing/selftests/bpf/prog_tests/xdp_context_test_run.c > @@ -4,13 +4,19 @@ > #include "test_xdp_context_test_run.skel.h" > #include "test_xdp_meta.skel.h" > > -#define TX_ADDR "10.0.0.1" > -#define RX_ADDR "10.0.0.2" > #define RX_NAME "veth0" > #define TX_NAME "veth1" > #define TX_NETNS "xdp_context_tx" > #define RX_NETNS "xdp_context_rx" > > +#define TEST_PAYLOAD_LEN 32 > +static const __u8 test_payload[TEST_PAYLOAD_LEN] = { > + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, > + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, > + 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, > + 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, > +}; > + > void test_xdp_context_error(int prog_fd, struct bpf_test_run_opts opts, > __u32 data_meta, __u32 data, __u32 data_end, > __u32 ingress_ifindex, __u32 rx_queue_index, > @@ -112,15 +118,66 @@ void test_xdp_context_test_run(void) > test_xdp_context_test_run__destroy(skel); > } > > -void test_xdp_context_functional(void) [..] > +int send_test_packet(int ifindex) nit: static? same for assert_test_result below