Path: blob/master/tools/testing/selftests/drivers/net/hw/iou-zcrx.py
26295 views
#!/usr/bin/env python31# SPDX-License-Identifier: GPL-2.023import re4from os import path5from lib.py import ksft_run, ksft_exit, KsftSkipEx6from lib.py import NetDrvEpEnv7from lib.py import bkg, cmd, defer, ethtool, rand_port, wait_port_listen8910def _get_current_settings(cfg):11output = ethtool(f"-g {cfg.ifname}", json=True)[0]12return (output['rx'], output['hds-thresh'])131415def _get_combined_channels(cfg):16output = ethtool(f"-l {cfg.ifname}").stdout17values = re.findall(r'Combined:\s+(\d+)', output)18return int(values[1])192021def _create_rss_ctx(cfg, chan):22output = ethtool(f"-X {cfg.ifname} context new start {chan} equal 1").stdout23values = re.search(r'New RSS context is (\d+)', output).group(1)24ctx_id = int(values)25return (ctx_id, defer(ethtool, f"-X {cfg.ifname} delete context {ctx_id}"))262728def _set_flow_rule(cfg, port, chan):29output = ethtool(f"-N {cfg.ifname} flow-type tcp6 dst-port {port} action {chan}").stdout30values = re.search(r'ID (\d+)', output).group(1)31return int(values)323334def _set_flow_rule_rss(cfg, port, ctx_id):35output = ethtool(f"-N {cfg.ifname} flow-type tcp6 dst-port {port} context {ctx_id}").stdout36values = re.search(r'ID (\d+)', output).group(1)37return int(values)383940def test_zcrx(cfg) -> None:41cfg.require_ipver('6')4243combined_chans = _get_combined_channels(cfg)44if combined_chans < 2:45raise KsftSkipEx('at least 2 combined channels required')46(rx_ring, hds_thresh) = _get_current_settings(cfg)47port = rand_port()4849ethtool(f"-G {cfg.ifname} tcp-data-split on")50defer(ethtool, f"-G {cfg.ifname} tcp-data-split auto")5152ethtool(f"-G {cfg.ifname} hds-thresh 0")53defer(ethtool, f"-G {cfg.ifname} hds-thresh {hds_thresh}")5455ethtool(f"-G {cfg.ifname} rx 64")56defer(ethtool, f"-G {cfg.ifname} rx {rx_ring}")5758ethtool(f"-X {cfg.ifname} equal {combined_chans - 1}")59defer(ethtool, f"-X {cfg.ifname} default")6061flow_rule_id = _set_flow_rule(cfg, port, combined_chans - 1)62defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}")6364rx_cmd = f"{cfg.bin_local} -s -p {port} -i {cfg.ifname} -q {combined_chans - 1}"65tx_cmd = f"{cfg.bin_remote} -c -h {cfg.addr_v['6']} -p {port} -l 12840"66with bkg(rx_cmd, exit_wait=True):67wait_port_listen(port, proto="tcp")68cmd(tx_cmd, host=cfg.remote)697071def test_zcrx_oneshot(cfg) -> None:72cfg.require_ipver('6')7374combined_chans = _get_combined_channels(cfg)75if combined_chans < 2:76raise KsftSkipEx('at least 2 combined channels required')77(rx_ring, hds_thresh) = _get_current_settings(cfg)78port = rand_port()7980ethtool(f"-G {cfg.ifname} tcp-data-split on")81defer(ethtool, f"-G {cfg.ifname} tcp-data-split auto")8283ethtool(f"-G {cfg.ifname} hds-thresh 0")84defer(ethtool, f"-G {cfg.ifname} hds-thresh {hds_thresh}")8586ethtool(f"-G {cfg.ifname} rx 64")87defer(ethtool, f"-G {cfg.ifname} rx {rx_ring}")8889ethtool(f"-X {cfg.ifname} equal {combined_chans - 1}")90defer(ethtool, f"-X {cfg.ifname} default")9192flow_rule_id = _set_flow_rule(cfg, port, combined_chans - 1)93defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}")9495rx_cmd = f"{cfg.bin_local} -s -p {port} -i {cfg.ifname} -q {combined_chans - 1} -o 4"96tx_cmd = f"{cfg.bin_remote} -c -h {cfg.addr_v['6']} -p {port} -l 4096 -z 16384"97with bkg(rx_cmd, exit_wait=True):98wait_port_listen(port, proto="tcp")99cmd(tx_cmd, host=cfg.remote)100101102def test_zcrx_rss(cfg) -> None:103cfg.require_ipver('6')104105combined_chans = _get_combined_channels(cfg)106if combined_chans < 2:107raise KsftSkipEx('at least 2 combined channels required')108(rx_ring, hds_thresh) = _get_current_settings(cfg)109port = rand_port()110111ethtool(f"-G {cfg.ifname} tcp-data-split on")112defer(ethtool, f"-G {cfg.ifname} tcp-data-split auto")113114ethtool(f"-G {cfg.ifname} hds-thresh 0")115defer(ethtool, f"-G {cfg.ifname} hds-thresh {hds_thresh}")116117ethtool(f"-G {cfg.ifname} rx 64")118defer(ethtool, f"-G {cfg.ifname} rx {rx_ring}")119120ethtool(f"-X {cfg.ifname} equal {combined_chans - 1}")121defer(ethtool, f"-X {cfg.ifname} default")122123(ctx_id, delete_ctx) = _create_rss_ctx(cfg, combined_chans - 1)124flow_rule_id = _set_flow_rule_rss(cfg, port, ctx_id)125defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}")126127rx_cmd = f"{cfg.bin_local} -s -p {port} -i {cfg.ifname} -q {combined_chans - 1}"128tx_cmd = f"{cfg.bin_remote} -c -h {cfg.addr_v['6']} -p {port} -l 12840"129with bkg(rx_cmd, exit_wait=True):130wait_port_listen(port, proto="tcp")131cmd(tx_cmd, host=cfg.remote)132133134def main() -> None:135with NetDrvEpEnv(__file__) as cfg:136cfg.bin_local = path.abspath(path.dirname(__file__) + "/../../../drivers/net/hw/iou-zcrx")137cfg.bin_remote = cfg.remote.deploy(cfg.bin_local)138139ksft_run(globs=globals(), case_pfx={"test_"}, args=(cfg, ))140ksft_exit()141142143if __name__ == "__main__":144main()145146147