Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit e47ef9e

Browse files
committed
Merge branch 'tc-testing-tdc-updates'
Pedro Tammela says: ==================== selftests: tc-testing: updates to tdc - Patch 1 removes an obscure feature from tdc - Patch 2 reworks the namespace and devices setup giving a nice speed boost - Patch 3 preloads all tc modules when running kselftests - Patch 4 turns on parallel testing in kselftests ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 0fbe92b + 04fd47b commit e47ef9e

File tree

2 files changed

+124
-57
lines changed

2 files changed

+124
-57
lines changed

tools/testing/selftests/tc-testing/plugin-lib/nsPlugin.py

Lines changed: 59 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@
99

1010
from tdc_config import *
1111

12+
try:
13+
from pyroute2 import netns
14+
from pyroute2 import IPRoute
15+
netlink = True
16+
except ImportError:
17+
netlink = False
18+
print("!!! Consider installing pyroute2 !!!")
19+
1220
def prepare_suite(obj, test):
1321
original = obj.args.NAMES
1422

@@ -28,10 +36,10 @@ def prepare_suite(obj, test):
2836
shadow['DEV2'] = original['DEV2']
2937
obj.args.NAMES = shadow
3038

31-
if obj.args.namespace:
32-
obj._ns_create()
39+
if netlink == True:
40+
obj._nl_ns_create()
3341
else:
34-
obj._ports_create()
42+
obj._ns_create()
3543

3644
# Make sure the netns is visible in the fs
3745
while True:
@@ -70,15 +78,11 @@ def pre_case(self, caseinfo, test_skip):
7078
if test_skip:
7179
return
7280

73-
7481
def post_case(self):
7582
if self.args.verbose:
7683
print('{}.post_case'.format(self.sub_class))
7784

78-
if self.args.namespace:
79-
self._ns_destroy()
80-
else:
81-
self._ports_destroy()
85+
self._ns_destroy()
8286

8387
def post_suite(self, index):
8488
if self.args.verbose:
@@ -93,24 +97,11 @@ def post_suite(self, index):
9397

9498
subprocess.run(cmd, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
9599

96-
def add_args(self, parser):
97-
super().add_args(parser)
98-
self.argparser_group = self.argparser.add_argument_group(
99-
'netns',
100-
'options for nsPlugin(run commands in net namespace)')
101-
self.argparser_group.add_argument(
102-
'-N', '--no-namespace', action='store_false', default=True,
103-
dest='namespace', help='Don\'t run commands in namespace')
104-
return self.argparser
105-
106100
def adjust_command(self, stage, command):
107101
super().adjust_command(stage, command)
108102
cmdform = 'list'
109103
cmdlist = list()
110104

111-
if not self.args.namespace:
112-
return command
113-
114105
if self.args.verbose:
115106
print('{}.adjust_command'.format(self.sub_class))
116107

@@ -138,41 +129,59 @@ def adjust_command(self, stage, command):
138129
print('adjust_command: return command [{}]'.format(command))
139130
return command
140131

141-
def _ports_create_cmds(self):
142-
cmds = []
143-
144-
cmds.append(self._replace_keywords('link add $DEV0 type veth peer name $DEV1'))
145-
cmds.append(self._replace_keywords('link set $DEV0 up'))
146-
cmds.append(self._replace_keywords('link add $DUMMY type dummy'))
147-
if not self.args.namespace:
148-
cmds.append(self._replace_keywords('link set $DEV1 up'))
149-
150-
return cmds
132+
def _nl_ns_create(self):
133+
ns = self.args.NAMES["NS"];
134+
dev0 = self.args.NAMES["DEV0"];
135+
dev1 = self.args.NAMES["DEV1"];
136+
dummy = self.args.NAMES["DUMMY"];
151137

152-
def _ports_create(self):
153-
self._exec_cmd_batched('pre', self._ports_create_cmds())
154-
155-
def _ports_destroy_cmd(self):
156-
return self._replace_keywords('link del $DEV0')
157-
158-
def _ports_destroy(self):
159-
self._exec_cmd('post', self._ports_destroy_cmd())
138+
if self.args.verbose:
139+
print('{}._nl_ns_create'.format(self.sub_class))
140+
141+
netns.create(ns)
142+
netns.pushns(newns=ns)
143+
with IPRoute() as ip:
144+
ip.link('add', ifname=dev1, kind='veth', peer={'ifname': dev0, 'net_ns_fd':'/proc/1/ns/net'})
145+
ip.link('add', ifname=dummy, kind='dummy')
146+
while True:
147+
try:
148+
dev1_idx = ip.link_lookup(ifname=dev1)[0]
149+
dummy_idx = ip.link_lookup(ifname=dummy)[0]
150+
ip.link('set', index=dev1_idx, state='up')
151+
ip.link('set', index=dummy_idx, state='up')
152+
break
153+
except:
154+
time.sleep(0.1)
155+
continue
156+
netns.popns()
157+
158+
with IPRoute() as ip:
159+
while True:
160+
try:
161+
dev0_idx = ip.link_lookup(ifname=dev0)[0]
162+
ip.link('set', index=dev0_idx, state='up')
163+
break
164+
except:
165+
time.sleep(0.1)
166+
continue
160167

161168
def _ns_create_cmds(self):
162169
cmds = []
163170

164-
if self.args.namespace:
165-
ns = self.args.NAMES['NS']
171+
ns = self.args.NAMES['NS']
166172

167-
cmds.append(self._replace_keywords('netns add {}'.format(ns)))
168-
cmds.append(self._replace_keywords('link set $DEV1 netns {}'.format(ns)))
169-
cmds.append(self._replace_keywords('link set $DUMMY netns {}'.format(ns)))
170-
cmds.append(self._replace_keywords('netns exec {} $IP link set $DEV1 up'.format(ns)))
171-
cmds.append(self._replace_keywords('netns exec {} $IP link set $DUMMY up'.format(ns)))
173+
cmds.append(self._replace_keywords('netns add {}'.format(ns)))
174+
cmds.append(self._replace_keywords('link add $DEV1 type veth peer name $DEV0'))
175+
cmds.append(self._replace_keywords('link set $DEV1 netns {}'.format(ns)))
176+
cmds.append(self._replace_keywords('link add $DUMMY type dummy'.format(ns)))
177+
cmds.append(self._replace_keywords('link set $DUMMY netns {}'.format(ns)))
178+
cmds.append(self._replace_keywords('netns exec {} $IP link set $DEV1 up'.format(ns)))
179+
cmds.append(self._replace_keywords('netns exec {} $IP link set $DUMMY up'.format(ns)))
180+
cmds.append(self._replace_keywords('link set $DEV0 up'.format(ns)))
172181

173-
if self.args.device:
174-
cmds.append(self._replace_keywords('link set $DEV2 netns {}'.format(ns)))
175-
cmds.append(self._replace_keywords('netns exec {} $IP link set $DEV2 up'.format(ns)))
182+
if self.args.device:
183+
cmds.append(self._replace_keywords('link set $DEV2 netns {}'.format(ns)))
184+
cmds.append(self._replace_keywords('netns exec {} $IP link set $DEV2 up'.format(ns)))
176185

177186
return cmds
178187

@@ -181,7 +190,6 @@ def _ns_create(self):
181190
Create the network namespace in which the tests will be run and set up
182191
the required network devices for it.
183192
'''
184-
self._ports_create()
185193
self._exec_cmd_batched('pre', self._ns_create_cmds())
186194

187195
def _ns_destroy_cmd(self):
@@ -192,9 +200,7 @@ def _ns_destroy(self):
192200
Destroy the network namespace for testing (and any associated network
193201
devices as well)
194202
'''
195-
if self.args.namespace:
196-
self._exec_cmd('post', self._ns_destroy_cmd())
197-
self._ports_destroy()
203+
self._exec_cmd('post', self._ns_destroy_cmd())
198204

199205
@cached_property
200206
def _proc(self):
Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,68 @@
11
#!/bin/sh
22
# SPDX-License-Identifier: GPL-2.0
33

4-
modprobe netdevsim
5-
modprobe sch_teql
6-
./tdc.py -c actions --nobuildebpf
7-
./tdc.py -c qdisc
4+
# If a module is required and was not compiled
5+
# the test that requires it will fail anyways
6+
try_modprobe() {
7+
modprobe -q -R "$1"
8+
if [ $? -ne 0 ]; then
9+
echo "Module $1 not found... skipping."
10+
else
11+
modprobe "$1"
12+
fi
13+
}
14+
15+
try_modprobe netdevsim
16+
try_modprobe act_bpf
17+
try_modprobe act_connmark
18+
try_modprobe act_csum
19+
try_modprobe act_ct
20+
try_modprobe act_ctinfo
21+
try_modprobe act_gact
22+
try_modprobe act_gate
23+
try_modprobe act_ipt
24+
try_modprobe act_mirred
25+
try_modprobe act_mpls
26+
try_modprobe act_nat
27+
try_modprobe act_pedit
28+
try_modprobe act_police
29+
try_modprobe act_sample
30+
try_modprobe act_simple
31+
try_modprobe act_skbedit
32+
try_modprobe act_skbmod
33+
try_modprobe act_tunnel_key
34+
try_modprobe act_vlan
35+
try_modprobe cls_basic
36+
try_modprobe cls_bpf
37+
try_modprobe cls_cgroup
38+
try_modprobe cls_flow
39+
try_modprobe cls_flower
40+
try_modprobe cls_fw
41+
try_modprobe cls_matchall
42+
try_modprobe cls_route
43+
try_modprobe cls_u32
44+
try_modprobe em_canid
45+
try_modprobe em_cmp
46+
try_modprobe em_ipset
47+
try_modprobe em_ipt
48+
try_modprobe em_meta
49+
try_modprobe em_nbyte
50+
try_modprobe em_text
51+
try_modprobe em_u32
52+
try_modprobe sch_cake
53+
try_modprobe sch_cbs
54+
try_modprobe sch_choke
55+
try_modprobe sch_codel
56+
try_modprobe sch_drr
57+
try_modprobe sch_etf
58+
try_modprobe sch_ets
59+
try_modprobe sch_fq
60+
try_modprobe sch_fq_codel
61+
try_modprobe sch_fq_pie
62+
try_modprobe sch_gred
63+
try_modprobe sch_hfsc
64+
try_modprobe sch_hhf
65+
try_modprobe sch_htb
66+
try_modprobe sch_teql
67+
./tdc.py -J`nproc` -c actions --nobuildebpf
68+
./tdc.py -J`nproc` -c qdisc

0 commit comments

Comments
 (0)