Skip to content

Commit 6d2d58f

Browse files
Jakub Kicinskidavem330
authored andcommitted
selftests/bpf: validate replace of TC filters is working
Daniel discovered recently I broke TC filter replace (and fixed it in commit ad9294d ("bpf: fix cls_bpf on filter replace")). Add a test to make sure it never happens again. Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9045bdc commit 6d2d58f

File tree

1 file changed

+50
-5
lines changed

1 file changed

+50
-5
lines changed

tools/testing/selftests/bpf/test_offload.py

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -429,8 +429,26 @@ def tc_show_ingress(self, expected=None):
429429
(len(filters), expected))
430430
return filters
431431

432-
def cls_bpf_add_filter(self, bpf, da=False, verbose=False, skip_sw=False,
433-
skip_hw=False, fail=True, include_stderr=False):
432+
def cls_filter_op(self, op, qdisc="ingress", prio=None, handle=None,
433+
cls="", params="",
434+
fail=True, include_stderr=False):
435+
spec = ""
436+
if prio is not None:
437+
spec += " prio %d" % (prio)
438+
if handle:
439+
spec += " handle %s" % (handle)
440+
441+
return tc("filter {op} dev {dev} {qdisc} {spec} {cls} {params}"\
442+
.format(op=op, dev=self['ifname'], qdisc=qdisc, spec=spec,
443+
cls=cls, params=params),
444+
fail=fail, include_stderr=include_stderr)
445+
446+
def cls_bpf_add_filter(self, bpf, op="add", prio=None, handle=None,
447+
da=False, verbose=False,
448+
skip_sw=False, skip_hw=False,
449+
fail=True, include_stderr=False):
450+
cls = "bpf " + bpf
451+
434452
params = ""
435453
if da:
436454
params += " da"
@@ -440,9 +458,10 @@ def cls_bpf_add_filter(self, bpf, da=False, verbose=False, skip_sw=False,
440458
params += " skip_sw"
441459
if skip_hw:
442460
params += " skip_hw"
443-
return tc("filter add dev %s ingress bpf %s %s" %
444-
(self['ifname'], bpf, params),
445-
fail=fail, include_stderr=include_stderr)
461+
462+
return self.cls_filter_op(op=op, prio=prio, handle=handle, cls=cls,
463+
params=params,
464+
fail=fail, include_stderr=include_stderr)
446465

447466
def set_ethtool_tc_offloads(self, enable, fail=True):
448467
args = "hw-tc-offload %s" % ("on" if enable else "off")
@@ -644,6 +663,32 @@ def check_verifier_log(output, reference):
644663
args)
645664
sim.wait_for_flush()
646665

666+
start_test("Test TC replace...")
667+
sim.cls_bpf_add_filter(obj, prio=1, handle=1)
668+
sim.cls_bpf_add_filter(obj, op="replace", prio=1, handle=1)
669+
sim.cls_filter_op(op="delete", prio=1, handle=1, cls="bpf")
670+
671+
sim.cls_bpf_add_filter(obj, prio=1, handle=1, skip_sw=True)
672+
sim.cls_bpf_add_filter(obj, op="replace", prio=1, handle=1, skip_sw=True)
673+
sim.cls_filter_op(op="delete", prio=1, handle=1, cls="bpf")
674+
675+
sim.cls_bpf_add_filter(obj, prio=1, handle=1, skip_hw=True)
676+
sim.cls_bpf_add_filter(obj, op="replace", prio=1, handle=1, skip_hw=True)
677+
sim.cls_filter_op(op="delete", prio=1, handle=1, cls="bpf")
678+
679+
start_test("Test TC replace bad flags...")
680+
for i in range(3):
681+
for j in range(3):
682+
ret, _ = sim.cls_bpf_add_filter(obj, op="replace", prio=1, handle=1,
683+
skip_sw=(j == 1), skip_hw=(j == 2),
684+
fail=False)
685+
fail(bool(ret) != bool(j),
686+
"Software TC incorrect load in replace test, iteration %d" %
687+
(j))
688+
sim.cls_filter_op(op="delete", prio=1, handle=1, cls="bpf")
689+
690+
sim.tc_flush_filters()
691+
647692
start_test("Test TC offloads work...")
648693
ret, _, err = sim.cls_bpf_add_filter(obj, verbose=True, skip_sw=True,
649694
fail=False, include_stderr=True)

0 commit comments

Comments
 (0)