Path: blob/master/tools/testing/selftests/drivers/net/hw/iou-zcrx.py
52819 views
#!/usr/bin/env python31# SPDX-License-Identifier: GPL-2.023import re4from os import path5from lib.py import ksft_run, ksft_exit, KsftSkipEx, ksft_variants, KsftNamedVariant6from lib.py import NetDrvEpEnv7from lib.py import bkg, cmd, defer, ethtool, rand_port, wait_port_listen8from lib.py import EthtoolFamily910SKIP_CODE = 421112def create_rss_ctx(cfg):13output = ethtool(f"-X {cfg.ifname} context new start {cfg.target} equal 1").stdout14values = re.search(r'New RSS context is (\d+)', output).group(1)15return int(values)161718def set_flow_rule(cfg):19output = ethtool(f"-N {cfg.ifname} flow-type tcp6 dst-port {cfg.port} action {cfg.target}").stdout20values = re.search(r'ID (\d+)', output).group(1)21return int(values)222324def set_flow_rule_rss(cfg, rss_ctx_id):25output = ethtool(f"-N {cfg.ifname} flow-type tcp6 dst-port {cfg.port} context {rss_ctx_id}").stdout26values = re.search(r'ID (\d+)', output).group(1)27return int(values)282930def single(cfg):31channels = cfg.ethnl.channels_get({'header': {'dev-index': cfg.ifindex}})32channels = channels['combined-count']33if channels < 2:34raise KsftSkipEx('Test requires NETIF with at least 2 combined channels')3536rings = cfg.ethnl.rings_get({'header': {'dev-index': cfg.ifindex}})37rx_rings = rings['rx']38hds_thresh = rings.get('hds-thresh', 0)3940cfg.ethnl.rings_set({'header': {'dev-index': cfg.ifindex},41'tcp-data-split': 'enabled',42'hds-thresh': 0,43'rx': 64})44defer(cfg.ethnl.rings_set, {'header': {'dev-index': cfg.ifindex},45'tcp-data-split': 'unknown',46'hds-thresh': hds_thresh,47'rx': rx_rings})4849cfg.target = channels - 150ethtool(f"-X {cfg.ifname} equal {cfg.target}")51defer(ethtool, f"-X {cfg.ifname} default")5253flow_rule_id = set_flow_rule(cfg)54defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}")555657def rss(cfg):58channels = cfg.ethnl.channels_get({'header': {'dev-index': cfg.ifindex}})59channels = channels['combined-count']60if channels < 2:61raise KsftSkipEx('Test requires NETIF with at least 2 combined channels')6263rings = cfg.ethnl.rings_get({'header': {'dev-index': cfg.ifindex}})64rx_rings = rings['rx']65hds_thresh = rings.get('hds-thresh', 0)6667cfg.ethnl.rings_set({'header': {'dev-index': cfg.ifindex},68'tcp-data-split': 'enabled',69'hds-thresh': 0,70'rx': 64})71defer(cfg.ethnl.rings_set, {'header': {'dev-index': cfg.ifindex},72'tcp-data-split': 'unknown',73'hds-thresh': hds_thresh,74'rx': rx_rings})7576cfg.target = channels - 177ethtool(f"-X {cfg.ifname} equal {cfg.target}")78defer(ethtool, f"-X {cfg.ifname} default")7980rss_ctx_id = create_rss_ctx(cfg)81defer(ethtool, f"-X {cfg.ifname} delete context {rss_ctx_id}")8283flow_rule_id = set_flow_rule_rss(cfg, rss_ctx_id)84defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}")858687@ksft_variants([88KsftNamedVariant("single", single),89KsftNamedVariant("rss", rss),90])91def test_zcrx(cfg, setup) -> None:92cfg.require_ipver('6')9394setup(cfg)95rx_cmd = f"{cfg.bin_local} -s -p {cfg.port} -i {cfg.ifname} -q {cfg.target}"96tx_cmd = f"{cfg.bin_remote} -c -h {cfg.addr_v['6']} -p {cfg.port} -l 12840"97with bkg(rx_cmd, exit_wait=True):98wait_port_listen(cfg.port, proto="tcp")99cmd(tx_cmd, host=cfg.remote)100101102@ksft_variants([103KsftNamedVariant("single", single),104KsftNamedVariant("rss", rss),105])106def test_zcrx_oneshot(cfg, setup) -> None:107cfg.require_ipver('6')108109setup(cfg)110rx_cmd = f"{cfg.bin_local} -s -p {cfg.port} -i {cfg.ifname} -q {cfg.target} -o 4"111tx_cmd = f"{cfg.bin_remote} -c -h {cfg.addr_v['6']} -p {cfg.port} -l 4096 -z 16384"112with bkg(rx_cmd, exit_wait=True):113wait_port_listen(cfg.port, proto="tcp")114cmd(tx_cmd, host=cfg.remote)115116117def test_zcrx_large_chunks(cfg) -> None:118"""Test zcrx with large buffer chunks."""119120cfg.require_ipver('6')121122combined_chans = _get_combined_channels(cfg)123if combined_chans < 2:124raise KsftSkipEx('at least 2 combined channels required')125(rx_ring, hds_thresh) = _get_current_settings(cfg)126port = rand_port()127128ethtool(f"-G {cfg.ifname} tcp-data-split on")129defer(ethtool, f"-G {cfg.ifname} tcp-data-split auto")130131ethtool(f"-G {cfg.ifname} hds-thresh 0")132defer(ethtool, f"-G {cfg.ifname} hds-thresh {hds_thresh}")133134ethtool(f"-G {cfg.ifname} rx 64")135defer(ethtool, f"-G {cfg.ifname} rx {rx_ring}")136137ethtool(f"-X {cfg.ifname} equal {combined_chans - 1}")138defer(ethtool, f"-X {cfg.ifname} default")139140flow_rule_id = _set_flow_rule(cfg, port, combined_chans - 1)141defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}")142143rx_cmd = f"{cfg.bin_local} -s -p {port} -i {cfg.ifname} -q {combined_chans - 1} -x 2"144tx_cmd = f"{cfg.bin_remote} -c -h {cfg.addr_v['6']} -p {port} -l 12840"145146probe = cmd(rx_cmd + " -d", fail=False)147if probe.ret == SKIP_CODE:148raise KsftSkipEx(probe.stdout)149150with bkg(rx_cmd, exit_wait=True):151wait_port_listen(port, proto="tcp")152cmd(tx_cmd, host=cfg.remote)153154155def main() -> None:156with NetDrvEpEnv(__file__) as cfg:157cfg.bin_local = path.abspath(path.dirname(__file__) + "/../../../drivers/net/hw/iou-zcrx")158cfg.bin_remote = cfg.remote.deploy(cfg.bin_local)159160cfg.ethnl = EthtoolFamily()161cfg.port = rand_port()162ksft_run(globs=globals(), cases=[test_zcrx, test_zcrx_oneshot], args=(cfg, ))163ksft_exit()164165166if __name__ == "__main__":167main()168169170