Commit 2df6bde3 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'selftests-tc-testing-updates-and-cleanups-for-tdc'

Pedro Tammela says:

====================
selftests: tc-testing: updates and cleanups for tdc

Address the recommendations from the previous series and cleanup some
leftovers.
====================

Link: https://lore.kernel.org/r/20231124154248.315470-1-pctammela@mojatatu.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents cae0de45 ed346fcc
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
include ../../../scripts/Makefile.include
top_srcdir = $(abspath ../../../..) TEST_PROGS += ./tdc.sh
APIDIR := $(top_scrdir)/include/uapi TEST_FILES := action-ebpf tdc*.py Tdc*.py plugins plugin-lib tc-tests scripts
TEST_GEN_FILES = action.o
include ../lib.mk include ../lib.mk
PROBE := $(shell $(LLC) -march=bpf -mcpu=probe -filetype=null /dev/null 2>&1)
ifeq ($(PROBE),)
CPU ?= probe
else
CPU ?= generic
endif
CLANG_SYS_INCLUDES := $(shell $(CLANG) -v -E - </dev/null 2>&1 \
| sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }')
CLANG_FLAGS = -I. -I$(APIDIR) \
$(CLANG_SYS_INCLUDES) \
-Wno-compare-distinct-pointer-types
$(OUTPUT)/%.o: %.c
$(CLANG) $(CLANG_FLAGS) \
-O2 --target=bpf -emit-llvm -c $< -o - | \
$(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@
TEST_PROGS += ./tdc.sh
TEST_FILES := tdc*.py Tdc*.py plugins plugin-lib tc-tests scripts
...@@ -195,8 +195,6 @@ directory: ...@@ -195,8 +195,6 @@ directory:
and the other is a test whether the command leaked memory or not. and the other is a test whether the command leaked memory or not.
(This one is a preliminary version, it may not work quite right yet, (This one is a preliminary version, it may not work quite right yet,
but the overall template is there and it should only need tweaks.) but the overall template is there and it should only need tweaks.)
- buildebpfPlugin.py:
builds all programs in $EBPFDIR.
ACKNOWLEDGEMENTS ACKNOWLEDGEMENTS
......
'''
build ebpf program
'''
import os
import signal
from string import Template
import subprocess
import time
from TdcPlugin import TdcPlugin
from tdc_config import *
class SubPlugin(TdcPlugin):
def __init__(self):
self.sub_class = 'buildebpf/SubPlugin'
self.tap = ''
super().__init__()
def pre_suite(self, testcount, testidlist):
super().pre_suite(testcount, testidlist)
if self.args.buildebpf:
self._ebpf_makeall()
def post_suite(self, index):
super().post_suite(index)
self._ebpf_makeclean()
def add_args(self, parser):
super().add_args(parser)
self.argparser_group = self.argparser.add_argument_group(
'buildebpf',
'options for buildebpfPlugin')
self.argparser_group.add_argument(
'--nobuildebpf', action='store_false', default=True,
dest='buildebpf',
help='Don\'t build eBPF programs')
return self.argparser
def _ebpf_makeall(self):
if self.args.buildebpf:
self._make('all')
def _ebpf_makeclean(self):
if self.args.buildebpf:
self._make('clean')
def _make(self, target):
command = 'make -C {} {}'.format(self.args.NAMES['EBPFDIR'], target)
proc = subprocess.Popen(command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=os.environ.copy())
(rawout, serr) = proc.communicate()
if proc.returncode != 0 and len(serr) > 0:
foutput = serr.decode("utf-8")
else:
foutput = rawout.decode("utf-8")
proc.stdout.close()
proc.stderr.close()
return proc, foutput
...@@ -23,8 +23,6 @@ class SubPlugin(TdcPlugin): ...@@ -23,8 +23,6 @@ class SubPlugin(TdcPlugin):
super().__init__() super().__init__()
def pre_suite(self, testcount, testlist): def pre_suite(self, testcount, testlist):
from itertools import cycle
super().pre_suite(testcount, testlist) super().pre_suite(testcount, testlist)
def prepare_test(self, test): def prepare_test(self, test):
...@@ -37,7 +35,7 @@ class SubPlugin(TdcPlugin): ...@@ -37,7 +35,7 @@ class SubPlugin(TdcPlugin):
if netlink == True: if netlink == True:
self._nl_ns_create() self._nl_ns_create()
else: else:
self._ns_create() self._ipr2_ns_create()
# Make sure the netns is visible in the fs # Make sure the netns is visible in the fs
ticks = 20 ticks = 20
...@@ -71,14 +69,14 @@ class SubPlugin(TdcPlugin): ...@@ -71,14 +69,14 @@ class SubPlugin(TdcPlugin):
if netlink == True: if netlink == True:
self._nl_ns_destroy() self._nl_ns_destroy()
else: else:
self._ns_destroy() self._ipr2_ns_destroy()
def post_suite(self, index): def post_suite(self, index):
if self.args.verbose: if self.args.verbose:
print('{}.post_suite'.format(self.sub_class)) print('{}.post_suite'.format(self.sub_class))
# Make sure we don't leak resources # Make sure we don't leak resources
cmd = "$IP -a netns del" cmd = self._replace_keywords("$IP -a netns del")
if self.args.verbose > 3: if self.args.verbose > 3:
print('_exec_cmd: command "{}"'.format(cmd)) print('_exec_cmd: command "{}"'.format(cmd))
...@@ -161,7 +159,7 @@ class SubPlugin(TdcPlugin): ...@@ -161,7 +159,7 @@ class SubPlugin(TdcPlugin):
ticks -= 1 ticks -= 1
continue continue
def _ns_create_cmds(self): def _ipr2_ns_create_cmds(self):
cmds = [] cmds = []
ns = self.args.NAMES['NS'] ns = self.args.NAMES['NS']
...@@ -181,26 +179,26 @@ class SubPlugin(TdcPlugin): ...@@ -181,26 +179,26 @@ class SubPlugin(TdcPlugin):
return cmds return cmds
def _ns_create(self): def _ipr2_ns_create(self):
''' '''
Create the network namespace in which the tests will be run and set up Create the network namespace in which the tests will be run and set up
the required network devices for it. the required network devices for it.
''' '''
self._exec_cmd_batched('pre', self._ns_create_cmds()) self._exec_cmd_batched('pre', self._ipr2_ns_create_cmds())
def _nl_ns_destroy(self): def _nl_ns_destroy(self):
ns = self.args.NAMES['NS'] ns = self.args.NAMES['NS']
netns.remove(ns) netns.remove(ns)
def _ns_destroy_cmd(self): def _ipr2_ns_destroy_cmd(self):
return self._replace_keywords('netns delete {}'.format(self.args.NAMES['NS'])) return self._replace_keywords('netns delete {}'.format(self.args.NAMES['NS']))
def _ns_destroy(self): def _ipr2_ns_destroy(self):
''' '''
Destroy the network namespace for testing (and any associated network Destroy the network namespace for testing (and any associated network
devices as well) devices as well)
''' '''
self._exec_cmd('post', self._ns_destroy_cmd()) self._exec_cmd('post', self._ipr2_ns_destroy_cmd())
@cached_property @cached_property
def _proc(self): def _proc(self):
......
...@@ -54,9 +54,6 @@ ...@@ -54,9 +54,6 @@
"actions", "actions",
"bpf" "bpf"
], ],
"plugins": {
"requires": "buildebpfPlugin"
},
"setup": [ "setup": [
[ [
"$TC action flush action bpf", "$TC action flush action bpf",
...@@ -65,10 +62,10 @@ ...@@ -65,10 +62,10 @@
255 255
] ]
], ],
"cmdUnderTest": "$TC action add action bpf object-file $EBPFDIR/action.o section action-ok index 667", "cmdUnderTest": "$TC action add action bpf object-file $EBPFDIR/action-ebpf section action-ok index 667",
"expExitCode": "0", "expExitCode": "0",
"verifyCmd": "$TC action get action bpf index 667", "verifyCmd": "$TC action get action bpf index 667",
"matchPattern": "action order [0-9]*: bpf action.o:\\[action-ok\\] id [0-9].* tag [0-9a-f]{16}( jited)? default-action pipe.*index 667 ref", "matchPattern": "action order [0-9]*: bpf action-ebpf:\\[action-ok\\] id [0-9].* tag [0-9a-f]{16}( jited)? default-action pipe.*index 667 ref",
"matchCount": "1", "matchCount": "1",
"teardown": [ "teardown": [
"$TC action flush action bpf" "$TC action flush action bpf"
...@@ -81,9 +78,6 @@ ...@@ -81,9 +78,6 @@
"actions", "actions",
"bpf" "bpf"
], ],
"plugins": {
"requires": "buildebpfPlugin"
},
"setup": [ "setup": [
[ [
"$TC action flush action bpf", "$TC action flush action bpf",
...@@ -92,10 +86,10 @@ ...@@ -92,10 +86,10 @@
255 255
] ]
], ],
"cmdUnderTest": "$TC action add action bpf object-file $EBPFDIR/action.o section action-ko index 667", "cmdUnderTest": "$TC action add action bpf object-file $EBPFDIR/action-ebpf section action-ko index 667",
"expExitCode": "255", "expExitCode": "255",
"verifyCmd": "$TC action get action bpf index 667", "verifyCmd": "$TC action get action bpf index 667",
"matchPattern": "action order [0-9]*: bpf action.o:\\[action-ko\\] id [0-9].*index 667 ref", "matchPattern": "action order [0-9]*: bpf action-ebpf:\\[action-ko\\] id [0-9].*index 667 ref",
"matchCount": "0", "matchCount": "0",
"teardown": [ "teardown": [
[ [
......
...@@ -52,17 +52,16 @@ ...@@ -52,17 +52,16 @@
], ],
"plugins": { "plugins": {
"requires": [ "requires": [
"buildebpfPlugin",
"nsPlugin" "nsPlugin"
] ]
}, },
"setup": [ "setup": [
"$TC qdisc add dev $DEV1 ingress" "$TC qdisc add dev $DEV1 ingress"
], ],
"cmdUnderTest": "$TC filter add dev $DEV1 parent ffff: handle 1 protocol ip prio 100 bpf object-file $EBPFDIR/action.o section action-ok", "cmdUnderTest": "$TC filter add dev $DEV1 parent ffff: handle 1 protocol ip prio 100 bpf object-file $EBPFDIR/action-ebpf section action-ok",
"expExitCode": "0", "expExitCode": "0",
"verifyCmd": "$TC filter get dev $DEV1 parent ffff: handle 1 protocol ip prio 100 bpf", "verifyCmd": "$TC filter get dev $DEV1 parent ffff: handle 1 protocol ip prio 100 bpf",
"matchPattern": "filter parent ffff: protocol ip pref 100 bpf chain [0-9]+ handle 0x1 action.o:\\[action-ok\\].*tag [0-9a-f]{16}( jited)?", "matchPattern": "filter parent ffff: protocol ip pref 100 bpf chain [0-9]+ handle 0x1 action-ebpf:\\[action-ok\\].*tag [0-9a-f]{16}( jited)?",
"matchCount": "1", "matchCount": "1",
"teardown": [ "teardown": [
"$TC qdisc del dev $DEV1 ingress" "$TC qdisc del dev $DEV1 ingress"
...@@ -77,17 +76,16 @@ ...@@ -77,17 +76,16 @@
], ],
"plugins": { "plugins": {
"requires": [ "requires": [
"buildebpfPlugin",
"nsPlugin" "nsPlugin"
] ]
}, },
"setup": [ "setup": [
"$TC qdisc add dev $DEV1 ingress" "$TC qdisc add dev $DEV1 ingress"
], ],
"cmdUnderTest": "$TC filter add dev $DEV1 parent ffff: handle 1 protocol ip prio 100 bpf object-file $EBPFDIR/action.o section action-ko", "cmdUnderTest": "$TC filter add dev $DEV1 parent ffff: handle 1 protocol ip prio 100 bpf object-file $EBPFDIR/action-ebpf section action-ko",
"expExitCode": "1", "expExitCode": "1",
"verifyCmd": "$TC filter get dev $DEV1 parent ffff: handle 1 protocol ip prio 100 bpf", "verifyCmd": "$TC filter get dev $DEV1 parent ffff: handle 1 protocol ip prio 100 bpf",
"matchPattern": "filter parent ffff: protocol ip pref 100 bpf chain [0-9]+ handle 0x1 action.o:\\[action-ko\\].*tag [0-9a-f]{16}( jited)?", "matchPattern": "filter parent ffff: protocol ip pref 100 bpf chain [0-9]+ handle 0x1 action-ebpf:\\[action-ko\\].*tag [0-9a-f]{16}( jited)?",
"matchCount": "0", "matchCount": "0",
"teardown": [ "teardown": [
"$TC qdisc del dev $DEV1 ingress" "$TC qdisc del dev $DEV1 ingress"
......
...@@ -497,11 +497,6 @@ def prepare_run(pm, args, testlist): ...@@ -497,11 +497,6 @@ def prepare_run(pm, args, testlist):
pm.call_post_suite(1) pm.call_post_suite(1)
return emergency_exit_message return emergency_exit_message
if args.verbose:
print('give test rig 2 seconds to stabilize')
time.sleep(2)
def purge_run(pm, index): def purge_run(pm, index):
pm.call_post_suite(index) pm.call_post_suite(index)
...@@ -1023,7 +1018,11 @@ def main(): ...@@ -1023,7 +1018,11 @@ def main():
if args.verbose > 2: if args.verbose > 2:
print('args is {}'.format(args)) print('args is {}'.format(args))
try:
set_operation_mode(pm, parser, args, remaining) set_operation_mode(pm, parser, args, remaining)
except KeyboardInterrupt:
# Cleanup on Ctrl-C
pm.call_post_suite(None)
if __name__ == "__main__": if __name__ == "__main__":
main() main()
...@@ -64,5 +64,5 @@ try_modprobe sch_hfsc ...@@ -64,5 +64,5 @@ try_modprobe sch_hfsc
try_modprobe sch_hhf try_modprobe sch_hhf
try_modprobe sch_htb try_modprobe sch_htb
try_modprobe sch_teql try_modprobe sch_teql
./tdc.py -J`nproc` -c actions --nobuildebpf ./tdc.py -J`nproc` -c actions
./tdc.py -J`nproc` -c qdisc ./tdc.py -J`nproc` -c qdisc
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment