15c6baef3SWillem de Bruijn#!/usr/bin/env python3 25c6baef3SWillem de Bruijn# SPDX-License-Identifier: GPL-2.0 35c6baef3SWillem de Bruijn 45c6baef3SWillem de Bruijn"""Regression tests for the SO_TXTIME interface. 55c6baef3SWillem de Bruijn 65c6baef3SWillem de BruijnTest delivery time in FQ and ETF qdiscs. 75c6baef3SWillem de Bruijn""" 85c6baef3SWillem de Bruijn 9543bdc15SWillem de Bruijnimport os 105c6baef3SWillem de Bruijnimport time 115c6baef3SWillem de Bruijn 125c6baef3SWillem de Bruijnfrom lib.py import ksft_exit, ksft_run, ksft_variants 135c6baef3SWillem de Bruijnfrom lib.py import KsftNamedVariant, KsftSkipEx 145c6baef3SWillem de Bruijnfrom lib.py import NetDrvEpEnv, bkg, cmd, defer, tc 155c6baef3SWillem de Bruijn 165c6baef3SWillem de Bruijn 175c6baef3SWillem de Bruijndef test_so_txtime(cfg, clockid, ipver, args_tx, args_rx, expect_success): 185c6baef3SWillem de Bruijn """Main function. Run so_txtime as sender and receiver.""" 19543bdc15SWillem de Bruijn slow_machine = os.environ.get('KSFT_MACHINE_SLOW') 20543bdc15SWillem de Bruijn 2146411c88SJakub Kicinski if not hasattr(cfg, "bin_remote"): 2246411c88SJakub Kicinski cfg.bin_local = cfg.test_dir / "so_txtime" 2346411c88SJakub Kicinski cfg.bin_remote = cfg.remote.deploy(cfg.bin_local) 245c6baef3SWillem de Bruijn 25543bdc15SWillem de Bruijn tstart = time.time_ns() + (2000_000_000 if slow_machine else 200_000_000) 265c6baef3SWillem de Bruijn 275c6baef3SWillem de Bruijn cmd_addr = f"-S {cfg.addr_v[ipver]} -D {cfg.remote_addr_v[ipver]}" 2846411c88SJakub Kicinski cmd_args = f"-{ipver} -c {clockid} -t {tstart} {cmd_addr}" 2946411c88SJakub Kicinski cmd_rx = f"{cfg.bin_remote} {cmd_args} {args_rx} -r" 3046411c88SJakub Kicinski cmd_tx = f"{cfg.bin_local} {cmd_args} {args_tx}" 315c6baef3SWillem de Bruijn 32543bdc15SWillem de Bruijn expect_fail = not expect_success 33543bdc15SWillem de Bruijn if slow_machine: 34543bdc15SWillem de Bruijn expect_success = False 35543bdc15SWillem de Bruijn 365c6baef3SWillem de Bruijn with bkg(cmd_rx, host=cfg.remote, fail=expect_success, 37543bdc15SWillem de Bruijn expect_fail=expect_fail, exit_wait=True): 385c6baef3SWillem de Bruijn cmd(cmd_tx) 395c6baef3SWillem de Bruijn 405c6baef3SWillem de Bruijn 415c6baef3SWillem de Bruijndef _qdisc_setup(ifname, qdisc, optargs=""): 425c6baef3SWillem de Bruijn """Replace root qdisc. Restore the original after the test. 435c6baef3SWillem de Bruijn 445c6baef3SWillem de Bruijn If the original is mq, children will be of type default_qdisc. 455c6baef3SWillem de Bruijn """ 465c6baef3SWillem de Bruijn orig = tc(f"qdisc show dev {ifname} root", json=True)[0].get("kind", None) 475c6baef3SWillem de Bruijn defer(tc, f"qdisc replace dev {ifname} root {orig}") 485c6baef3SWillem de Bruijn tc(f"qdisc replace dev {ifname} root {qdisc} {optargs}") 495c6baef3SWillem de Bruijn 505c6baef3SWillem de Bruijn 51b016022bSWillem de Bruijndef _test_variants_fq(): 525c6baef3SWillem de Bruijn for ipver in ["4", "6"]: 535c6baef3SWillem de Bruijn for testcase in [ 545c6baef3SWillem de Bruijn ["no_delay", "a,-1", "a,-1"], 555c6baef3SWillem de Bruijn ["zero_delay", "a,0", "a,0"], 565c6baef3SWillem de Bruijn ["one_pkt", "a,10", "a,10"], 575c6baef3SWillem de Bruijn ["in_order", "a,10,b,20", "a,10,b,20"], 58fabcf8caSWillem de Bruijn ["reverse_order", "a,20,b,10", "b,10,a,20"], 595c6baef3SWillem de Bruijn ]: 605c6baef3SWillem de Bruijn name = f"v{ipver}_{testcase[0]}" 615c6baef3SWillem de Bruijn yield KsftNamedVariant(name, ipver, testcase[1], testcase[2]) 625c6baef3SWillem de Bruijn 635c6baef3SWillem de Bruijn 64b016022bSWillem de Bruijn@ksft_variants(_test_variants_fq()) 65b016022bSWillem de Bruijndef test_so_txtime_fq_mono(cfg, ipver, args_tx, args_rx): 665c6baef3SWillem de Bruijn """Run all variants of monotonic (fq) tests.""" 67*3bdd6852SJakub Kicinski cfg.require_ipver(ipver) 685c6baef3SWillem de Bruijn _qdisc_setup(cfg.ifname, "fq") 695c6baef3SWillem de Bruijn test_so_txtime(cfg, "mono", ipver, args_tx, args_rx, True) 705c6baef3SWillem de Bruijn 715c6baef3SWillem de Bruijn 72b016022bSWillem de Bruijn@ksft_variants(_test_variants_fq()) 73b016022bSWillem de Bruijndef test_so_txtime_fq_tai(cfg, ipver, args_tx, args_rx): 74b016022bSWillem de Bruijn """Run all variants of fq tests, but pass CLOCK_TAI to test conversion.""" 75*3bdd6852SJakub Kicinski cfg.require_ipver(ipver) 76b016022bSWillem de Bruijn _qdisc_setup(cfg.ifname, "fq") 77b016022bSWillem de Bruijn test_so_txtime(cfg, "tai", ipver, args_tx, args_rx, True) 78b016022bSWillem de Bruijn 79b016022bSWillem de Bruijn 805c6baef3SWillem de Bruijndef _test_variants_etf(): 815c6baef3SWillem de Bruijn for ipver in ["4", "6"]: 825c6baef3SWillem de Bruijn for testcase in [ 835c6baef3SWillem de Bruijn ["no_delay", "a,-1", "a,-1", False], 845c6baef3SWillem de Bruijn ["zero_delay", "a,0", "a,0", False], 855c6baef3SWillem de Bruijn ["one_pkt", "a,10", "a,10", True], 865c6baef3SWillem de Bruijn ["in_order", "a,10,b,20", "a,10,b,20", True], 875c6baef3SWillem de Bruijn ["reverse_order", "a,20,b,10", "b,10,a,20", True], 885c6baef3SWillem de Bruijn ]: 895c6baef3SWillem de Bruijn name = f"v{ipver}_{testcase[0]}" 905c6baef3SWillem de Bruijn yield KsftNamedVariant( 915c6baef3SWillem de Bruijn name, ipver, testcase[1], testcase[2], testcase[3] 925c6baef3SWillem de Bruijn ) 935c6baef3SWillem de Bruijn 945c6baef3SWillem de Bruijn 955c6baef3SWillem de Bruijn@ksft_variants(_test_variants_etf()) 965c6baef3SWillem de Bruijndef test_so_txtime_etf(cfg, ipver, args_tx, args_rx, expect_fail): 975c6baef3SWillem de Bruijn """Run all variants of etf tests.""" 98*3bdd6852SJakub Kicinski cfg.require_ipver(ipver) 995c6baef3SWillem de Bruijn try: 1005c6baef3SWillem de Bruijn _qdisc_setup(cfg.ifname, "etf", "clockid CLOCK_TAI delta 400000") 1015c6baef3SWillem de Bruijn except Exception as e: 1025c6baef3SWillem de Bruijn raise KsftSkipEx("tc does not support qdisc etf. skipping") from e 1035c6baef3SWillem de Bruijn 1045c6baef3SWillem de Bruijn test_so_txtime(cfg, "tai", ipver, args_tx, args_rx, expect_fail) 1055c6baef3SWillem de Bruijn 1065c6baef3SWillem de Bruijn 1075c6baef3SWillem de Bruijndef main() -> None: 1085c6baef3SWillem de Bruijn """Boilerplate ksft main.""" 1095c6baef3SWillem de Bruijn with NetDrvEpEnv(__file__) as cfg: 110b016022bSWillem de Bruijn ksft_run( 111b016022bSWillem de Bruijn [test_so_txtime_fq_mono, test_so_txtime_fq_tai, test_so_txtime_etf], 112b016022bSWillem de Bruijn args=(cfg,), 113b016022bSWillem de Bruijn ) 1145c6baef3SWillem de Bruijn ksft_exit() 1155c6baef3SWillem de Bruijn 1165c6baef3SWillem de Bruijn 1175c6baef3SWillem de Bruijnif __name__ == "__main__": 1185c6baef3SWillem de Bruijn main() 119