@@ -429,8 +429,26 @@ def tc_show_ingress(self, expected=None):
429
429
(len (filters ), expected ))
430
430
return filters
431
431
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
+
434
452
params = ""
435
453
if da :
436
454
params += " da"
@@ -440,9 +458,10 @@ def cls_bpf_add_filter(self, bpf, da=False, verbose=False, skip_sw=False,
440
458
params += " skip_sw"
441
459
if skip_hw :
442
460
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 )
446
465
447
466
def set_ethtool_tc_offloads (self , enable , fail = True ):
448
467
args = "hw-tc-offload %s" % ("on" if enable else "off" )
@@ -644,6 +663,32 @@ def check_verifier_log(output, reference):
644
663
args )
645
664
sim .wait_for_flush ()
646
665
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
+
647
692
start_test ("Test TC offloads work..." )
648
693
ret , _ , err = sim .cls_bpf_add_filter (obj , verbose = True , skip_sw = True ,
649
694
fail = False , include_stderr = True )
0 commit comments