On Thu, 26 Mar 2026 16:52:31 -0700 Joe Damato wrote:
> Add a simple test for USO. Can be used with netdevsim or real hardware.
> Tests both ipv4 and ipv6 with several full segments and a partial
> segment.
> +def _test_uso(cfg, ipver, mss, total_payload):
> + cfg.require_ipver(ipver)
> +
> + try:
> + ethtool(f"-K {cfg.ifname} tx-udp-segmentation on")
> + except Exception as exc:
> + raise KsftSkipEx(
> + "Device does not support tx-udp-segmentation") from exc
> + defer(ethtool, f"-K {cfg.ifname} tx-udp-segmentation off")
If may have been on already when we started, no?
> + expected_segs = (total_payload + mss - 1) // mss
> +
> + rx_before = _get_rx_packets(cfg)
Let's run a little program on the remote that receives the packets
and validates they were correct? Maybe socat can do?
> + port = rand_port(stype=socket.SOCK_DGRAM)
> + _send_uso(cfg, ipver, mss, total_payload, port)
> +
> + time.sleep(0.5)
What's this? Did you mean to wait for stats to settle?
cfg.wait_hw_stats_settle()
> + rx_after = _get_rx_packets(cfg)
> + rx_delta = rx_after - rx_before
Instead of checking Rx (which is probably fine) we may want to check Tx
has the right number of frames. Sender may have mis-counted the whole
USO as one packet if it's buggy?
> + ksft_ge(rx_delta, expected_segs,
> + comment=f"Expected >= {expected_segs} rx packets, got
> {rx_delta}")
> +
> +
> +def test_uso_v4(cfg):
> + """USO IPv4: 11 segments (10 full + 1 partial)."""
> + _test_uso(cfg, "4", 1400, 1400 * 10 + 500)
> +
> +
> +def test_uso_v6(cfg):
> + """USO IPv6: 11 segments (10 full + 1 partial)."""
> + _test_uso(cfg, "6", 1400, 1400 * 10 + 500)
> +
> +
> +def test_uso_v4_exact(cfg):
> + """USO IPv4: exact multiple of MSS (5 full segments)."""
> + _test_uso(cfg, "4", 1400, 1400 * 5)
Variants are probably a good fit here.