Commit 0c8754b7 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

selftests: drv-net: test RSS header field configuration

Test reading RXFH fields over IOCTL and netlink.

  # ./tools/testing/selftests/drivers/net/hw/rss_api.py
  TAP version 13
  1..3
  ok 1 rss_api.test_rxfh_indir_ntf
  ok 2 rss_api.test_rxfh_indir_ctx_ntf
  ok 3 rss_api.test_rxfh_fields
  # Totals: pass:3 fail:0 xfail:0 xpass:0 skip:0 error:0

Link: https://patch.msgid.link/20250708220640.2738464-6-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 17833174
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -20,6 +20,38 @@ def _ethtool_create(cfg, act, opts):
    return int(output.split()[-1])


def _ethtool_get_cfg(cfg, fl_type, to_nl=False):
    descr = ethtool(f"-n {cfg.ifname} rx-flow-hash {fl_type}").stdout

    if to_nl:
        converter = {
            "IP SA": "ip-src",
            "IP DA": "ip-dst",
            "L4 bytes 0 & 1 [TCP/UDP src port]": "l4-b-0-1",
            "L4 bytes 2 & 3 [TCP/UDP dst port]": "l4-b-2-3",
        }

        ret = set()
    else:
        converter = {
            "IP SA": "s",
            "IP DA": "d",
            "L3 proto": "t",
            "L4 bytes 0 & 1 [TCP/UDP src port]": "f",
            "L4 bytes 2 & 3 [TCP/UDP dst port]": "n",
        }

        ret = ""

    for line in descr.split("\n")[1:-2]:
        # if this raises we probably need to add more keys to converter above
        if to_nl:
            ret.add(converter[line])
        else:
            ret += converter[line]
    return ret


def test_rxfh_indir_ntf(cfg):
    """
    Check that Netlink notifications are generated when RSS indirection
@@ -77,6 +109,21 @@ def test_rxfh_indir_ctx_ntf(cfg):
    ksft_eq(set(ntf["msg"]["indir"]), {1})


def test_rxfh_fields(cfg):
    """
    Test reading Rx Flow Hash over Netlink.
    """

    flow_types = ["tcp4", "tcp6", "udp4", "udp6"]
    ethnl = EthtoolFamily()

    cfg_nl = ethnl.rss_get({"header": {"dev-index": cfg.ifindex}})
    for fl_type in flow_types:
        one = _ethtool_get_cfg(cfg, fl_type, to_nl=True)
        ksft_eq(one, cfg_nl["flow-hash"][fl_type],
                comment="Config for " + fl_type)


def main() -> None:
    """ Ksft boiler plate main """