xref: /linux/tools/testing/selftests/drivers/net/so_txtime.py (revision 3bdd6852c2af087af420b377823ca8549ed01e74)
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