Ensure single buffer XDP functions correctly by covering the following cases: 1) Zero size payload 2) Full MTU 3) Single buffer packets through a multi-buffer XDP program
These changes were tested with netdevsim and fbnic.
# ./ksft-net-drv/drivers/net/xdp.py TAP version 13 1..10 ok 1 xdp.test_xdp_native_pass_sb ok 2 xdp.test_xdp_native_pass_mb ok 3 xdp.test_xdp_native_drop_sb ok 4 xdp.test_xdp_native_drop_mb ok 5 xdp.test_xdp_native_tx_sb ok 6 xdp.test_xdp_native_tx_mb # Failed run: pkt_sz 2048, offset 1. Last successful run: pkt_sz 1024, offset 256. Reason: Adjustment failed ok 7 xdp.test_xdp_native_adjst_tail_grow_data ok 8 xdp.test_xdp_native_adjst_tail_shrnk_data # Failed run: pkt_sz 512, offset -256. Last successful run: pkt_sz 512, offset -128. Reason: Adjustment failed ok 9 xdp.test_xdp_native_adjst_head_grow_data # Failed run: pkt_sz (2048) > HDS threshold (1536) and offset 64 > 48 ok 10 xdp.test_xdp_native_adjst_head_shrnk_data # Totals: pass:10 fail:0 xfail:0 xpass:0 skip:0 error:0
Dimitri Daskalakis (3): selftests: drv-net: xdp: Extract common XDP_TX setup/validation. selftests: drv-net: xdp: Add a single-buffer XDP_TX test. selftests: drv-net: xdp: Validate single-buff XDP_TX in multi-buff mode
tools/testing/selftests/drivers/net/xdp.py | 71 ++++++++++++++++++---- 1 file changed, 58 insertions(+), 13 deletions(-)
In preparation of single-buffer XDP_TX tests, refactor common test code into the _test_xdp_native_tx method. Add support for multiple payload sizes, and additional validation for RX packet count. Pass the -n flag to echo to avoid adding an extra byte into the TX packet.
Signed-off-by: Jakub Kicinski kuba@kernel.org Signed-off-by: Dimitri Daskalakis dimitri.daskalakis1@gmail.com --- tools/testing/selftests/drivers/net/xdp.py | 47 ++++++++++++++++------ 1 file changed, 34 insertions(+), 13 deletions(-)
diff --git a/tools/testing/selftests/drivers/net/xdp.py b/tools/testing/selftests/drivers/net/xdp.py index 1dd8bf3bf6c9..ea4da9024f9f 100755 --- a/tools/testing/selftests/drivers/net/xdp.py +++ b/tools/testing/selftests/drivers/net/xdp.py @@ -290,34 +290,55 @@ def test_xdp_native_drop_mb(cfg): _test_drop(cfg, bpf_info, 8000)
-def test_xdp_native_tx_mb(cfg): +def _test_xdp_native_tx(cfg, bpf_info, payload_lens): """ - Tests the XDP_TX action for a multi-buff case. + Tests the XDP_TX action.
Args: cfg: Configuration object containing network settings. + bpf_info: BPFProgInfo object containing the BPF program metadata. + payload_lens: Array of packet lengths to send. """ cfg.require_cmd("socat", remote=True) - - bpf_info = BPFProgInfo("xdp_prog_frags", "xdp_native.bpf.o", "xdp.frags", 9000) prog_info = _load_xdp_prog(cfg, bpf_info) port = rand_port()
_set_xdp_map("map_xdp_setup", TestConfig.MODE.value, XDPAction.TX.value) _set_xdp_map("map_xdp_setup", TestConfig.PORT.value, port)
- test_string = ''.join(random.choice(string.ascii_lowercase) for _ in range(8000)) - rx_udp = f"socat -{cfg.addr_ipver} -T 2 -u UDP-RECV:{port},reuseport STDOUT" - tx_udp = f"echo {test_string} | socat -t 2 -u STDIN UDP:{cfg.baddr}:{port}" + expected_pkts = 0 + for payload_len in payload_lens: + test_string = "".join( + random.choice(string.ascii_lowercase) for _ in range(payload_len) + ) + + rx_udp = f"socat -{cfg.addr_ipver} -T 2 " + \ + f"-u UDP-RECV:{port},reuseport STDOUT" + tx_udp = f"echo -n {test_string} | socat -t 2 " + \ + f"-u STDIN UDP:{cfg.baddr}:{port}" + + with bkg(rx_udp, host=cfg.remote, exit_wait=True) as rnc: + wait_port_listen(port, proto="udp", host=cfg.remote) + cmd(tx_udp, host=cfg.remote, shell=True) + + ksft_eq(rnc.stdout.strip(), test_string, "UDP packet exchange failed")
- with bkg(rx_udp, host=cfg.remote, exit_wait=True) as rnc: - wait_port_listen(port, proto="udp", host=cfg.remote) - cmd(tx_udp, host=cfg.remote, shell=True) + expected_pkts += 1 + stats = _get_stats(prog_info["maps"]["map_xdp_stats"]) + ksft_eq(stats[XDPStats.RX.value], expected_pkts, "RX stats mismatch") + ksft_eq(stats[XDPStats.TX.value], expected_pkts, "TX stats mismatch")
- stats = _get_stats(prog_info['maps']['map_xdp_stats'])
- ksft_eq(rnc.stdout.strip(), test_string, "UDP packet exchange failed") - ksft_eq(stats[XDPStats.TX.value], 1, "TX stats mismatch") +def test_xdp_native_tx_mb(cfg): + """ + Tests the XDP_TX action for a multi-buff case. + + Args: + cfg: Configuration object containing network settings. + """ + bpf_info = BPFProgInfo("xdp_prog_frags", "xdp_native.bpf.o", + "xdp.frags", 9000) + _test_xdp_native_tx(cfg, bpf_info, [8000])
def _validate_res(res, offset_lst, pkt_sz_lst):
Test single-buffer XDP_TX for packets with various payload sizes. Update the socat TX command to generate packets with 0 length payloads.
Signed-off-by: Jakub Kicinski kuba@kernel.org Signed-off-by: Dimitri Daskalakis dimitri.daskalakis1@gmail.com --- tools/testing/selftests/drivers/net/xdp.py | 23 +++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/drivers/net/xdp.py b/tools/testing/selftests/drivers/net/xdp.py index ea4da9024f9f..cea24c9b573e 100755 --- a/tools/testing/selftests/drivers/net/xdp.py +++ b/tools/testing/selftests/drivers/net/xdp.py @@ -314,8 +314,13 @@ def _test_xdp_native_tx(cfg, bpf_info, payload_lens):
rx_udp = f"socat -{cfg.addr_ipver} -T 2 " + \ f"-u UDP-RECV:{port},reuseport STDOUT" + + # Writing zero bytes to stdin gets ignored by socat, + # but with the shut-null flag socat generates a zero sized packet + # when the socket is closed. + tx_cmd_suffix = ",shut-null" if payload_len == 0 else "" tx_udp = f"echo -n {test_string} | socat -t 2 " + \ - f"-u STDIN UDP:{cfg.baddr}:{port}" + f"-u STDIN UDP:{cfg.baddr}:{port}{tx_cmd_suffix}"
with bkg(rx_udp, host=cfg.remote, exit_wait=True) as rnc: wait_port_listen(port, proto="udp", host=cfg.remote) @@ -329,6 +334,21 @@ def _test_xdp_native_tx(cfg, bpf_info, payload_lens): ksft_eq(stats[XDPStats.TX.value], expected_pkts, "TX stats mismatch")
+def test_xdp_native_tx_sb(cfg): + """ + Tests the XDP_TX action for a single-buff case. + + Args: + cfg: Configuration object containing network settings. + """ + bpf_info = BPFProgInfo("xdp_prog", "xdp_native.bpf.o", "xdp", 1500) + + # Ensure there's enough room for an ETH / IP / UDP header + pkt_hdr_len = 42 if cfg.addr_ipver == "4" else 62 + + _test_xdp_native_tx(cfg, bpf_info, [0, 1500 // 2, 1500 - pkt_hdr_len]) + + def test_xdp_native_tx_mb(cfg): """ Tests the XDP_TX action for a multi-buff case. @@ -665,6 +685,7 @@ def main(): test_xdp_native_pass_mb, test_xdp_native_drop_sb, test_xdp_native_drop_mb, + test_xdp_native_tx_sb, test_xdp_native_tx_mb, test_xdp_native_adjst_tail_grow_data, test_xdp_native_adjst_tail_shrnk_data,
Validate that drivers with multi-buff XDP programs properly reinitialize xdp_buff between packets.
Signed-off-by: Jakub Kicinski kuba@kernel.org Signed-off-by: Dimitri Daskalakis dimitri.daskalakis1@gmail.com --- tools/testing/selftests/drivers/net/xdp.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/drivers/net/xdp.py b/tools/testing/selftests/drivers/net/xdp.py index cea24c9b573e..35e9495cd506 100755 --- a/tools/testing/selftests/drivers/net/xdp.py +++ b/tools/testing/selftests/drivers/net/xdp.py @@ -358,7 +358,10 @@ def test_xdp_native_tx_mb(cfg): """ bpf_info = BPFProgInfo("xdp_prog_frags", "xdp_native.bpf.o", "xdp.frags", 9000) - _test_xdp_native_tx(cfg, bpf_info, [8000]) + # The first packet ensures we exercise the fragmented code path. + # And the subsequent 0-sized packet ensures the driver + # reinitializes xdp_buff correctly. + _test_xdp_native_tx(cfg, bpf_info, [8000, 0])
def _validate_res(res, offset_lst, pkt_sz_lst):
Hello:
This series was applied to netdev/net-next.git (main) by Jakub Kicinski kuba@kernel.org:
On Wed, 20 Aug 2025 18:40:20 -0700 you wrote:
Ensure single buffer XDP functions correctly by covering the following cases:
- Zero size payload
- Full MTU
- Single buffer packets through a multi-buffer XDP program
These changes were tested with netdevsim and fbnic.
[...]
Here is the summary with links: - [net-next,1/3] selftests: drv-net: xdp: Extract common XDP_TX setup/validation. https://git.kernel.org/netdev/net-next/c/91aacd8ceffe - [net-next,2/3] selftests: drv-net: xdp: Add a single-buffer XDP_TX test. https://git.kernel.org/netdev/net-next/c/d06d70eb6af4 - [net-next,3/3] selftests: drv-net: xdp: Validate single-buff XDP_TX in multi-buff mode https://git.kernel.org/netdev/net-next/c/bbd885b193cc
You are awesome, thank you!
linux-kselftest-mirror@lists.linaro.org