Skip to content

Commit fb94a2e

Browse files
authored
Merge pull request #8402 from opensourcerouting/debian10-topotest-fix
tests: fix for l3mdev topotests on kernel 4.19
2 parents 9d78be6 + 6a93e3d commit fb94a2e

File tree

7 files changed

+71
-80
lines changed

7 files changed

+71
-80
lines changed

tests/topotests/bgp_evpn_rt5/test_bgp_evpn.py

+2-10
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,11 @@
4242
from lib import topotest
4343
from lib.topogen import Topogen, TopoRouter, get_topogen
4444
from lib.topolog import logger
45+
from lib.common_config import adjust_router_l3mdev
4546

4647
# Required to instantiate the topology builder class.
4748
from mininet.topo import Topo
4849

49-
l3mdev_accept = 0
50-
krel = ""
51-
5250

5351
class BGPEVPNTopo(Topo):
5452
"Test topology builder"
@@ -73,8 +71,6 @@ def build(self, *_args, **_opts):
7371

7472
def setup_module(mod):
7573
"Sets up the pytest environment"
76-
global l3mdev_accept
77-
global krel
7874

7975
tgen = Topogen(BGPEVPNTopo, mod.__name__)
8076
tgen.start_topology()
@@ -90,18 +86,13 @@ def setup_module(mod):
9086
)
9187
return pytest.skip("Skipping BGP EVPN RT5 NETNS Test. Kernel not supported")
9288

93-
l3mdev_accept = 1
94-
logger.info("setting net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept))
95-
9689
# create VRF vrf-101 on R1 and R2
9790
# create loop101
9891
cmds_vrflite = [
99-
"sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept),
10092
"ip link add {}-vrf-101 type vrf table 101",
10193
"ip ru add oif {}-vrf-101 table 101",
10294
"ip ru add iif {}-vrf-101 table 101",
10395
"ip link set dev {}-vrf-101 up",
104-
"sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept),
10596
"ip link add loop101 type dummy",
10697
"ip link set dev loop101 master {}-vrf-101",
10798
"ip link set dev loop101 up",
@@ -139,6 +130,7 @@ def setup_module(mod):
139130
logger.info("result: " + output)
140131

141132
router = tgen.gears["r2"]
133+
adjust_router_l3mdev(tgen, "r2")
142134
for cmd in cmds_vrflite:
143135
logger.info("cmd to r2: " + cmd.format("r2"))
144136
output = router.run(cmd.format("r2"))

tests/topotests/bgp_l3vpn_to_bgp_vrf/customize.py

+7-17
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
from lib.topogen import Topogen, TopoRouter, get_topogen
8585
from lib.topolog import logger
8686
from lib.ltemplate import ltemplateRtrCmd
87+
from lib.common_config import adjust_router_l3mdev
8788

8889
# Required to instantiate the topology builder class.
8990
from mininet.topo import Topo
@@ -145,26 +146,12 @@ def build(self, *_args, **_opts):
145146
switch[1].add_link(tgen.gears["r3"], nodeif="r3-eth1")
146147

147148

148-
l3mdev_accept = 0
149-
150-
151149
def ltemplatePreRouterStartHook():
152-
global l3mdev_accept
153150
cc = ltemplateRtrCmd()
154151
krel = platform.release()
155152
tgen = get_topogen()
156153
logger.info("pre router-start hook, kernel=" + krel)
157154

158-
if (
159-
topotest.version_cmp(krel, "4.15") >= 0
160-
and topotest.version_cmp(krel, "4.18") <= 0
161-
):
162-
l3mdev_accept = 1
163-
164-
if topotest.version_cmp(krel, "5.0") >= 0:
165-
l3mdev_accept = 1
166-
167-
logger.info("setting net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept))
168155
# check for mpls
169156
if tgen.hasmpls != True:
170157
logger.info("MPLS not available, skipping setup")
@@ -187,10 +174,11 @@ def ltemplatePreRouterStartHook():
187174
"ip ru add oif {0}-cust1 table 10",
188175
"ip ru add iif {0}-cust1 table 10",
189176
"ip link set dev {0}-cust1 up",
190-
"sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept),
191177
]
192178
for rtr in rtrs:
193-
router = tgen.gears[rtr]
179+
# adjust handling of VRF traffic
180+
adjust_router_l3mdev(tgen, rtr)
181+
194182
for cmd in cmds:
195183
cc.doCmd(tgen, rtr, cmd.format(rtr))
196184
cc.doCmd(tgen, rtr, "ip link set dev {0}-eth4 master {0}-cust1".format(rtr))
@@ -229,9 +217,11 @@ def ltemplatePreRouterStartHook():
229217
"ip ru add oif {0}-cust2 table 20",
230218
"ip ru add iif {0}-cust2 table 20",
231219
"ip link set dev {0}-cust2 up",
232-
"sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept),
233220
]
234221
for rtr in rtrs:
222+
# adjust handling of VRF traffic
223+
adjust_router_l3mdev(tgen, rtr)
224+
235225
for cmd in cmds:
236226
cc.doCmd(tgen, rtr, cmd.format(rtr))
237227
cc.doCmd(tgen, rtr, "ip link set dev {0}-eth0 master {0}-cust2".format(rtr))

tests/topotests/bgp_l3vpn_to_bgp_vrf/scripts/check_linux_vrf.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from lib.lutil import luCommand
2-
from customize import l3mdev_accept
2+
from lib.common_config import kernel_requires_l3mdev_adjustment
33

4+
l3mdev_accept = kernel_requires_l3mdev_adjustment()
45
l3mdev_rtrs = ["r1", "r3", "r4", "ce4"]
56
for rtr in l3mdev_rtrs:
67
luCommand(rtr, "sysctl net.ipv4.tcp_l3mdev_accept", " = \d*", "none", "")

tests/topotests/bgp_vrf_lite_ipv6_rtadv/test_bgp_vrf_lite_ipv6_rtadv.py

+3-25
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
from lib import topotest
4343
from lib.topogen import Topogen, TopoRouter, get_topogen
4444
from lib.topolog import logger
45+
from lib.common_config import adjust_router_l3mdev
4546

4647
# Required to instantiate the topology builder class.
4748
from mininet.topo import Topo
@@ -71,22 +72,6 @@ def setup_module(mod):
7172
router_list = tgen.routers()
7273

7374
logger.info("Testing with VRF Lite support")
74-
krel = platform.release()
75-
76-
# May need to adjust handling of vrf traffic depending on kernel version
77-
l3mdev_accept = 0
78-
if (
79-
topotest.version_cmp(krel, "4.15") >= 0
80-
and topotest.version_cmp(krel, "4.18") <= 0
81-
):
82-
l3mdev_accept = 1
83-
84-
if topotest.version_cmp(krel, "5.0") >= 0:
85-
l3mdev_accept = 1
86-
87-
logger.info(
88-
"krel '{0}' setting net.ipv4.tcp_l3mdev_accept={1}".format(krel, l3mdev_accept)
89-
)
9075

9176
cmds = [
9277
"ip link add {0}-cust1 type vrf table 1001",
@@ -99,15 +84,8 @@ def setup_module(mod):
9984
for cmd in cmds:
10085
output = tgen.net[rname].cmd(cmd.format(rname))
10186

102-
output = tgen.net[rname].cmd("sysctl -n net.ipv4.tcp_l3mdev_accept")
103-
logger.info(
104-
"router {0}: existing tcp_l3mdev_accept was {1}".format(rname, output)
105-
)
106-
107-
if l3mdev_accept:
108-
output = tgen.net[rname].cmd(
109-
"sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept)
110-
)
87+
# adjust handling of vrf traffic
88+
adjust_router_l3mdev(tgen, rname)
11189

11290
for rname, router in router_list.items():
11391
router.load_config(

tests/topotests/isis-topo1-vrf/test_isis_topo1_vrf.py

+6-25
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@
4141
from lib.topogen import Topogen, TopoRouter, get_topogen
4242
from lib.topolog import logger
4343
from lib.topotest import iproute2_is_vrf_capable
44-
from lib.common_config import required_linux_kernel_version
44+
from lib.common_config import (
45+
required_linux_kernel_version,
46+
adjust_router_l3mdev,
47+
)
4548

4649
from mininet.topo import Topo
4750

@@ -106,22 +109,6 @@ def setup_module(mod):
106109
tgen.start_topology()
107110

108111
logger.info("Testing with VRF Lite support")
109-
krel = platform.release()
110-
111-
# May need to adjust handling of vrf traffic depending on kernel version
112-
l3mdev_accept = 0
113-
if (
114-
topotest.version_cmp(krel, "4.15") >= 0
115-
and topotest.version_cmp(krel, "4.18") <= 0
116-
):
117-
l3mdev_accept = 1
118-
119-
if topotest.version_cmp(krel, "5.0") >= 0:
120-
l3mdev_accept = 1
121-
122-
logger.info(
123-
"krel '{0}' setting net.ipv4.tcp_l3mdev_accept={1}".format(krel, l3mdev_accept)
124-
)
125112

126113
cmds = [
127114
"ip link add {0}-cust1 type vrf table 1001",
@@ -135,15 +122,9 @@ def setup_module(mod):
135122
# create VRF rx-cust1 and link rx-eth0 to rx-cust1
136123
for cmd in cmds:
137124
output = tgen.net[rname].cmd(cmd.format(rname))
138-
output = tgen.net[rname].cmd("sysctl -n net.ipv4.tcp_l3mdev_accept")
139-
logger.info(
140-
"router {0}: existing tcp_l3mdev_accept was {1}".format(rname, output)
141-
)
142125

143-
if l3mdev_accept:
144-
output = tgen.net[rname].cmd(
145-
"sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept)
146-
)
126+
# adjust handling of vrf traffic
127+
adjust_router_l3mdev(tgen, rname)
147128

148129
for rname, router in tgen.routers().items():
149130
router.load_config(

tests/topotests/lib/common_config.py

+50
Original file line numberDiff line numberDiff line change
@@ -4512,3 +4512,53 @@ def verify_ip_nht(tgen, input_dict):
45124512

45134513
logger.debug("Exiting lib API: verify_ip_nht()")
45144514
return False
4515+
4516+
4517+
def kernel_requires_l3mdev_adjustment():
4518+
"""
4519+
Checks if the L3 master device needs to be adjusted to handle VRF traffic
4520+
based on kernel version.
4521+
4522+
Returns
4523+
-------
4524+
1 or 0
4525+
"""
4526+
4527+
if version_cmp(platform.release(), "4.15") >= 0:
4528+
return 1
4529+
return 0
4530+
4531+
4532+
def adjust_router_l3mdev(tgen, router):
4533+
"""
4534+
Adjusts a routers L3 master device to handle VRF traffic depending on kernel
4535+
version.
4536+
4537+
Parameters
4538+
----------
4539+
* `tgen` : tgen object
4540+
* `router` : router id to be configured.
4541+
4542+
Returns
4543+
-------
4544+
True
4545+
"""
4546+
4547+
l3mdev_accept = kernel_requires_l3mdev_adjustment()
4548+
4549+
logger.info(
4550+
"router {0}: setting net.ipv4.tcp_l3mdev_accept={1}".format(
4551+
router, l3mdev_accept
4552+
)
4553+
)
4554+
4555+
output = tgen.net[router].cmd("sysctl -n net.ipv4.tcp_l3mdev_accept")
4556+
logger.info(
4557+
"router {0}: existing tcp_l3mdev_accept was {1}".format(router, output)
4558+
)
4559+
4560+
tgen.net[router].cmd(
4561+
"sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept)
4562+
)
4563+
4564+
return True

tests/topotests/lib/topotest.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -544,8 +544,7 @@ def iproute2_is_vrf_capable():
544544
["ip", "route", "show", "vrf"],
545545
stdout=subprocess.PIPE,
546546
stderr=subprocess.PIPE,
547-
stdin=subprocess.PIPE,
548-
encoding="utf-8"
547+
stdin=subprocess.PIPE
549548
)
550549
iproute2_err = subp.communicate()[1].splitlines()[0].split()[0]
551550

0 commit comments

Comments
 (0)