Lines Matching full:cfg

24 def _rss_key_check(cfg, data=None, context=0):
26 data = get_rss(cfg, context=context)
33 def get_rss(cfg, context=0):
34 return ethtool(f"-x {cfg.ifname} context {context}", json=True)[0]
37 def get_drop_err_sum(cfg):
38 stats = ip("-s -s link show dev " + cfg.ifname, json=True)[0]
47 def ethtool_create(cfg, act, opts):
48 output = ethtool(f"{act} {cfg.ifname} {opts}").stdout
54 def require_ntuple(cfg):
55 features = ethtool(f"-k {cfg.ifname}", json=True)[0]
62 def require_context_cnt(cfg, need_cnt):
66 if need_cnt and cfg.context_cnt and cfg.context_cnt < need_cnt:
67 raise KsftSkipEx(f"Test requires at least {need_cnt} contexts, but device only has {cfg.context_cnt}")
72 def _get_rx_cnts(cfg, prev=None):
73 cfg.wait_hw_stats_settle()
74 data = cfg.netdevnl.qstats_get({"ifindex": cfg.ifindex, "scope": ["queue"]}, dump=True)
85 def _send_traffic_check(cfg, port, name, params):
94 cnts = _get_rx_cnts(cfg)
95 GenerateTraffic(cfg, port=port).wait_pkts_and_stop(20000)
96 cnts = _get_rx_cnts(cfg, prev=cnts)
109 def _ntuple_rule_check(cfg, rule_id, ctx_id):
111 text = ethtool(f"-n {cfg.ifname} rule {rule_id}").stdout
116 def test_rss_key_indir(cfg):
119 qcnt = len(_get_rx_cnts(cfg))
123 data = get_rss(cfg)
131 _rss_key_check(cfg, data=data)
136 ethtool(f"-X {cfg.ifname} hkey " + _rss_key_str(key))
138 data = get_rss(cfg)
143 ethtool(f"-X {cfg.ifname} equal 3 hkey " + _rss_key_str(key))
144 reset_indir = defer(ethtool, f"-X {cfg.ifname} default")
146 data = get_rss(cfg)
147 _rss_key_check(cfg, data=data)
153 ethtool(f"-X {cfg.ifname} default hkey " + _rss_key_str(key))
154 data = get_rss(cfg)
155 _rss_key_check(cfg, data=data)
160 ethtool(f"-X {cfg.ifname} equal 2")
161 data = get_rss(cfg)
166 cnts = _get_rx_cnts(cfg)
167 GenerateTraffic(cfg).wait_pkts_and_stop(20000)
168 cnts = _get_rx_cnts(cfg, prev=cnts)
178 cnts = _get_rx_cnts(cfg)
179 GenerateTraffic(cfg).wait_pkts_and_stop(20000)
180 cnts = _get_rx_cnts(cfg, prev=cnts)
190 def test_rss_queue_reconfigure(cfg, main_ctx=True):
200 require_ntuple(cfg)
204 qcnt = len(_get_rx_cnts(cfg))
205 ethtool(f"-L {cfg.ifname} combined 4")
206 defer(ethtool, f"-L {cfg.ifname} combined {qcnt}")
214 ctx_id = ethtool_create(cfg, "-X", "context new")
216 defer(ethtool, f"-X {cfg.ifname} {ctx_ref} delete")
219 data = get_rss(cfg, context=ctx_id)
226 ethtool(f"-L {cfg.ifname} combined 5")
227 data = get_rss(cfg)
230 ethtool(f"-L {cfg.ifname} combined 4")
234 ethtool(f"-X {cfg.ifname} {ctx_ref} weight 1 0 0 1")
237 defer(ethtool, f"-X {cfg.ifname} default")
240 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {ctx_id}"
241 ntuple = ethtool_create(cfg, "-N", flow)
242 defer(ethtool, f"-N {cfg.ifname} delete {ntuple}")
244 _send_traffic_check(cfg, port, ctx_ref, { 'target': (0, 3),
248 ethtool(f"-L {cfg.ifname} combined 5")
249 data = get_rss(cfg, context=ctx_id)
252 _send_traffic_check(cfg, port, ctx_ref, { 'target': (0, 3),
257 ethtool(f"-L {cfg.ifname} combined 3")
264 ethtool(f"-L {cfg.ifname} combined 4")
265 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {ctx_id} action 1"
268 ntuple2 = ethtool_create(cfg, "-N", flow)
269 defer(ethtool, f"-N {cfg.ifname} delete {ntuple2}")
275 ethtool(f"-X {cfg.ifname} {ctx_ref} weight 1 0 1 0")
278 ntuple2 = ethtool_create(cfg, "-N", flow)
283 defer(ethtool, f"-N {cfg.ifname} delete {ntuple2}")
286 _send_traffic_check(cfg, port, ctx_ref, { 'target': (1, 3),
290 ethtool(f"-L {cfg.ifname} combined 3")
297 def test_rss_resize(cfg):
306 channels = cfg.ethnl.channels_get({'header': {'dev-index': cfg.ifindex}})
313 ethtool(f"-L {cfg.ifname} combined 2")
314 defer(ethtool, f"-L {cfg.ifname} combined {qcnt}")
316 ethtool(f"-X {cfg.ifname} weight 1 7")
317 defer(ethtool, f"-X {cfg.ifname} default")
319 ethtool(f"-L {cfg.ifname} combined {ch_max}")
320 data = get_rss(cfg)
330 def test_hitless_key_update(cfg):
340 data = get_rss(cfg)
346 tgen = GenerateTraffic(cfg)
348 errors0, carrier0 = get_drop_err_sum(cfg)
350 ethnl.rss_set({"header": {"dev-index": cfg.ifindex}, "hkey": key})
352 errors1, carrier1 = get_drop_err_sum(cfg)
361 def test_rss_context_dump(cfg):
367 data = get_rss(cfg)
377 ids.append(ethtool_create(cfg, "-X", f"context new"))
378 defer(ethtool, f"-X {cfg.ifname} context {ids[-1]} delete")
380 ids.append(ethtool_create(cfg, "-X", f"context new weight 1 1"))
381 defer(ethtool, f"-X {cfg.ifname} context {ids[-1]} delete")
383 ids.append(ethtool_create(cfg, "-X", f"context new hkey {key}"))
384 defer(ethtool, f"-X {cfg.ifname} context {ids[-1]} delete")
390 expect_tuples = set([(cfg.ifname, -1)] + [(cfg.ifname, ctx_id) for ctx_id in ids])
393 ctxs = cfg.ethnl.rss_get({}, dump=True)
396 ctx_tuples = set([ctx for ctx in tuples if ctx[0] == cfg.ifname])
412 ctxs = cfg.ethnl.rss_get({'header': {'dev-name': cfg.ifname}}, dump=True)
419 expect_tuples.remove((cfg.ifname, -1))
421 ctxs = cfg.ethnl.rss_get({'start-context': 1}, dump=True)
424 ctx_tuples = set([ctx for ctx in tuples if ctx[0] == cfg.ifname])
428 ctxs = cfg.ethnl.rss_get({'header': {'dev-name': cfg.ifname}, 'start-context': 1}, dump=True)
433 def test_rss_context(cfg, ctx_cnt=1, create_with_cfg=None):
441 require_ntuple(cfg)
446 qcnt = len(_get_rx_cnts(cfg))
450 ethtool(f"-L {cfg.ifname} combined {2 + 2 * ctx_cnt}")
451 defer(ethtool, f"-L {cfg.ifname} combined {qcnt}")
458 ethtool(f"-X {cfg.ifname} equal 2")
459 defer(ethtool, f"-X {cfg.ifname} default")
466 ctx_id = ethtool_create(cfg, "-X", f"context new {create_cfg}")
467 defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete")
474 if cfg.context_cnt is None:
475 cfg.context_cnt = ctx_cnt
478 _rss_key_check(cfg, context=ctx_id)
481 ethtool(f"-X {cfg.ifname} context {ctx_id} {want_cfg}")
482 _rss_key_check(cfg, context=ctx_id)
485 data = get_rss(cfg, ctx_id)
486 ksft_eq(min(data['rss-indirection-table']), 2 + i * 2, "Unexpected context cfg: " + str(data))
487 ksft_eq(max(data['rss-indirection-table']), 2 + i * 2 + 1, "Unexpected context cfg: " + str(data))
490 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {ports[i]} context {ctx_id}"
491 ntuple = ethtool_create(cfg, "-N", flow)
492 defer(ethtool, f"-N {cfg.ifname} delete {ntuple}")
494 _ntuple_rule_check(cfg, ntuple, ctx_id)
497 _send_traffic_check(cfg, ports[i], f"context {i}",
506 def test_rss_context4(cfg):
507 test_rss_context(cfg, 4)
510 def test_rss_context32(cfg):
511 test_rss_context(cfg, 32)
514 def test_rss_context4_create_with_cfg(cfg):
515 test_rss_context(cfg, 4, create_with_cfg=True)
518 def test_rss_context_queue_reconfigure(cfg):
519 test_rss_queue_reconfigure(cfg, main_ctx=False)
522 def test_rss_context_out_of_order(cfg, ctx_cnt=4):
530 require_ntuple(cfg)
531 require_context_cnt(cfg, 4)
534 qcnt = len(_get_rx_cnts(cfg))
538 ethtool(f"-L {cfg.ifname} combined {2 + 2 * ctx_cnt}")
539 defer(ethtool, f"-L {cfg.ifname} combined {qcnt}")
567 _send_traffic_check(cfg, ports[i], f"context {i}", expected)
570 ethtool(f"-X {cfg.ifname} equal 2")
571 defer(ethtool, f"-X {cfg.ifname} default")
574 ctx_id = ethtool_create(cfg, "-X", f"context new start {2 + i * 2} equal 2")
575 ctx.append(defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete"))
578 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {ports[i]} context {ctx_id}"
579 ntuple_id = ethtool_create(cfg, "-N", flow)
580 ntuple.append(defer(ethtool, f"-N {cfg.ifname} delete {ntuple_id}"))
597 def test_rss_context_overlap(cfg, other_ctx=0):
603 require_ntuple(cfg)
605 require_context_cnt(cfg, 2)
607 queue_cnt = len(_get_rx_cnts(cfg))
611 ethtool(f"-L {cfg.ifname} combined 4")
612 defer(ethtool, f"-L {cfg.ifname} combined {queue_cnt}")
617 ethtool(f"-X {cfg.ifname} equal 4")
618 defer(ethtool, f"-X {cfg.ifname} default")
620 other_ctx = ethtool_create(cfg, "-X", "context new")
621 ethtool(f"-X {cfg.ifname} context {other_ctx} equal 4")
622 defer(ethtool, f"-X {cfg.ifname} context {other_ctx} delete")
624 ctx_id = ethtool_create(cfg, "-X", "context new")
625 ethtool(f"-X {cfg.ifname} context {ctx_id} start 2 equal 2")
626 defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete")
630 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {other_ctx}"
631 ntuple_id = ethtool_create(cfg, "-N", flow)
632 ntuple = defer(ethtool, f"-N {cfg.ifname} delete {ntuple_id}")
635 cnts = _get_rx_cnts(cfg)
636 GenerateTraffic(cfg, port=port).wait_pkts_and_stop(20000)
637 cnts = _get_rx_cnts(cfg, prev=cnts)
648 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {ctx_id}"
649 ntuple_id = ethtool_create(cfg, "-N", flow)
650 defer(ethtool, f"-N {cfg.ifname} delete {ntuple_id}")
652 cnts = _get_rx_cnts(cfg)
653 GenerateTraffic(cfg, port=port).wait_pkts_and_stop(20000)
654 cnts = _get_rx_cnts(cfg, prev=cnts)
663 def test_rss_context_overlap2(cfg):
664 test_rss_context_overlap(cfg, True)
667 def test_flow_add_context_missing(cfg):
673 require_ntuple(cfg)
678 get_rss(cfg, context=ctx_id)
683 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port 1234 context {ctx_id}"
684 ntuple_id = ethtool_create(cfg, "-N", flow)
685 ethtool(f"-N {cfg.ifname} delete {ntuple_id}")
690 def test_delete_rss_context_busy(cfg):
696 require_ntuple(cfg)
699 ctx_id = ethtool_create(cfg, "-X", "context new")
700 ctx_deleter = defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete")
704 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {ctx_id}"
705 ntuple_id = ethtool_create(cfg, "-N", flow)
706 defer(ethtool, f"-N {cfg.ifname} delete {ntuple_id}")
717 def test_rss_ntuple_addition(cfg):
723 require_ntuple(cfg)
725 queue_cnt = len(_get_rx_cnts(cfg))
729 ethtool(f"-L {cfg.ifname} combined 4")
730 defer(ethtool, f"-L {cfg.ifname} combined {queue_cnt}")
735 ethtool(f"-X {cfg.ifname} equal 1")
736 defer(ethtool, f"-X {cfg.ifname} default")
739 ctx_id = ethtool_create(cfg, "-X", "context new equal 2")
740 defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete")
744 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {ctx_id} action 2"
746 ntuple_id = ethtool_create(cfg, "-N", flow)
749 defer(ethtool, f"-N {cfg.ifname} delete {ntuple_id}")
751 _send_traffic_check(cfg, port, f"context {ctx_id}", { 'target': (2, 3),
756 def test_rss_default_context_rule(cfg):
766 require_ntuple(cfg)
768 queue_cnt = len(_get_rx_cnts(cfg))
772 ethtool(f"-L {cfg.ifname} combined 4")
773 defer(ethtool, f"-L {cfg.ifname} combined {queue_cnt}")
778 ethtool(f"-X {cfg.ifname} equal 2")
779 defer(ethtool, f"-X {cfg.ifname} default")
782 ctx_id = ethtool_create(cfg, "-X", "context new start 2 equal 2")
783 defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete")
787 flow_generic = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} context {ctx_id} loc 1"
788 ethtool(f"-N {cfg.ifname} {flow_generic}")
789 defer(ethtool, f"-N {cfg.ifname} delete 1")
794 flow_main = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port_main} context 0 loc 0"
795 ethtool(f"-N {cfg.ifname} {flow_main}")
796 defer(ethtool, f"-N {cfg.ifname} delete 0")
798 _ntuple_rule_check(cfg, 1, ctx_id)
801 _send_traffic_check(cfg, port_main, "context 0",
807 _send_traffic_check(cfg, port_other, f"context {ctx_id}",
813 with NetDrvEpEnv(__file__, nsim_test=False) as cfg:
814 cfg.context_cnt = None
815 cfg.ethnl = EthtoolFamily()
816 cfg.netdevnl = NetdevFamily()
827 args=(cfg, ))