2 # SPDX-License-Identifier: ISC
5 # Part of NetDEF Topology Tests
7 # Copyright (c) 2018, LabN Consulting, L.L.C.
8 # Authored by Lou Berger <lberger@labn.net>
18 CWD
= os
.path
.dirname(os
.path
.realpath(__file__
))
19 sys
.path
.append(os
.path
.join(CWD
, "../"))
21 # pylint: disable=C0413
22 # Import topogen and topotest helpers
23 from lib
import topotest
24 from lib
.topogen
import Topogen
, TopoRouter
, get_topogen
25 from lib
.topolog
import logger
26 from lib
.common_config
import required_linux_kernel_version
28 pytestmark
= [pytest
.mark
.bgpd
]
36 tgen
.add_router("c11")
37 tgen
.add_router("c12")
38 tgen
.add_router("c21")
39 tgen
.add_router("c22")
40 tgen
.add_router("c31")
41 tgen
.add_router("c32")
43 tgen
.add_link(tgen
.gears
["r1"], tgen
.gears
["r2"], "eth0", "eth0")
44 tgen
.add_link(tgen
.gears
["r1"], tgen
.gears
["r3"], "eth1", "eth0")
45 tgen
.add_link(tgen
.gears
["r1"], tgen
.gears
["c11"], "eth2", "eth0")
46 tgen
.add_link(tgen
.gears
["r1"], tgen
.gears
["c12"], "eth3", "eth0")
47 tgen
.add_link(tgen
.gears
["r2"], tgen
.gears
["c21"], "eth1", "eth0")
48 tgen
.add_link(tgen
.gears
["r2"], tgen
.gears
["c22"], "eth2", "eth0")
49 tgen
.add_link(tgen
.gears
["r3"], tgen
.gears
["c31"], "eth1", "eth0")
50 tgen
.add_link(tgen
.gears
["r3"], tgen
.gears
["c32"], "eth2", "eth0")
53 def setup_module(mod
):
54 result
= required_linux_kernel_version("5.15")
55 if result
is not True:
56 pytest
.skip("Kernel requirements are not met")
58 tgen
= Topogen(build_topo
, mod
.__name
__)
61 for rname
, router
in tgen
.routers().items():
63 TopoRouter
.RD_ZEBRA
, os
.path
.join(CWD
, "{}/zebra.conf".format(rname
))
66 TopoRouter
.RD_STATIC
, os
.path
.join(CWD
, "{}/staticd.conf".format(rname
))
69 TopoRouter
.RD_BGP
, os
.path
.join(CWD
, "{}/bgpd.conf".format(rname
))
72 tgen
.gears
["r1"].run("sysctl net.vrf.strict_mode=1")
73 tgen
.gears
["r1"].run("ip link add vrf10 type vrf table 10")
74 tgen
.gears
["r1"].run("ip link set vrf10 up")
75 tgen
.gears
["r1"].run("ip link add vrf20 type vrf table 20")
76 tgen
.gears
["r1"].run("ip link set vrf20 up")
77 tgen
.gears
["r1"].run("ip link set eth2 master vrf10")
78 tgen
.gears
["r1"].run("ip link set eth3 master vrf20")
80 tgen
.gears
["r2"].run("sysctl net.vrf.strict_mode=1")
81 tgen
.gears
["r2"].run("ip link add vrf10 type vrf table 10")
82 tgen
.gears
["r2"].run("ip link set vrf10 up")
83 tgen
.gears
["r2"].run("ip link add vrf20 type vrf table 20")
84 tgen
.gears
["r2"].run("ip link set vrf20 up")
85 tgen
.gears
["r2"].run("ip link set eth1 master vrf10")
86 tgen
.gears
["r2"].run("ip link set eth2 master vrf20")
88 tgen
.gears
["r3"].run("sysctl net.vrf.strict_mode=1")
89 tgen
.gears
["r3"].run("ip link add vrf10 type vrf table 10")
90 tgen
.gears
["r3"].run("ip link set vrf10 up")
91 tgen
.gears
["r3"].run("ip link add vrf20 type vrf table 20")
92 tgen
.gears
["r3"].run("ip link set vrf20 up")
93 tgen
.gears
["r3"].run("ip link set eth1 master vrf10")
94 tgen
.gears
["r3"].run("ip link set eth2 master vrf20")
99 def teardown_module(mod
):
104 def check_ping4(name
, dest_addr
, expected
):
105 def _check(name
, dest_addr
, match
):
107 output
= tgen
.gears
[name
].run("ping {} -c 1 -w 1".format(dest_addr
))
109 if match
not in output
:
112 match
= ", {} packet loss".format("0%" if expected
else "100%")
113 logger
.info("[+] check {} {} {}".format(name
, dest_addr
, match
))
115 func
= functools
.partial(_check
, name
, dest_addr
, match
)
116 success
, result
= topotest
.run_and_expect(func
, None, count
=10, wait
=1)
117 assert result
is None, "Failed"
123 check_ping4("c11", "192.168.2.1", True)
124 check_ping4("c11", "192.168.3.1", True)
125 check_ping4("c12", "192.168.2.1", True)
126 check_ping4("c12", "192.168.3.1", True)
127 check_ping4("c21", "192.168.3.1", True)
128 check_ping4("c22", "192.168.3.1", True)
131 if __name__
== "__main__":
132 args
= ["-s"] + sys
.argv
[1:]
133 sys
.exit(pytest
.main(args
))