Lines Matching full:cfg
24 def _rss_key_check(cfg, data=None, context=0): argument
26 data = get_rss(cfg, context=context)
33 def get_rss(cfg, context=0): argument
34 return ethtool(f"-x {cfg.ifname} context {context}", json=True)[0]
37 def get_drop_err_sum(cfg): argument
38 stats = ip("-s -s link show dev " + cfg.ifname, json=True)[0]
47 def ethtool_create(cfg, act, opts): argument
48 output = ethtool(f"{act} {cfg.ifname} {opts}").stdout
54 def require_ntuple(cfg): argument
55 features = ethtool(f"-k {cfg.ifname}", json=True)[0]
62 def require_context_cnt(cfg, need_cnt): argument
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_cn…
72 def _get_rx_cnts(cfg, prev=None): argument
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): argument
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): argument
111 text = ethtool(f"-n {cfg.ifname} rule {rule_id}").stdout
116 def test_rss_key_indir(cfg): argument
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)
185 def test_rss_queue_reconfigure(cfg, main_ctx=True): argument
195 require_ntuple(cfg)
199 qcnt = len(_get_rx_cnts(cfg))
200 ethtool(f"-L {cfg.ifname} combined 4")
201 defer(ethtool, f"-L {cfg.ifname} combined {qcnt}")
209 ctx_id = ethtool_create(cfg, "-X", "context new")
211 defer(ethtool, f"-X {cfg.ifname} {ctx_ref} delete")
214 data = get_rss(cfg, context=ctx_id)
221 ethtool(f"-L {cfg.ifname} combined 5")
222 data = get_rss(cfg)
225 ethtool(f"-L {cfg.ifname} combined 4")
229 ethtool(f"-X {cfg.ifname} {ctx_ref} weight 1 0 0 1")
232 defer(ethtool, f"-X {cfg.ifname} default")
235 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {ctx_id}"
236 ntuple = ethtool_create(cfg, "-N", flow)
237 defer(ethtool, f"-N {cfg.ifname} delete {ntuple}")
239 _send_traffic_check(cfg, port, ctx_ref, { 'target': (0, 3),
243 ethtool(f"-L {cfg.ifname} combined 5")
244 data = get_rss(cfg, context=ctx_id)
247 _send_traffic_check(cfg, port, ctx_ref, { 'target': (0, 3),
252 ethtool(f"-L {cfg.ifname} combined 3")
259 ethtool(f"-L {cfg.ifname} combined 4")
260 …flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {ctx_id} action 1"
263 ntuple2 = ethtool_create(cfg, "-N", flow)
264 defer(ethtool, f"-N {cfg.ifname} delete {ntuple2}")
270 ethtool(f"-X {cfg.ifname} {ctx_ref} weight 1 0 1 0")
273 ntuple2 = ethtool_create(cfg, "-N", flow)
278 defer(ethtool, f"-N {cfg.ifname} delete {ntuple2}")
281 _send_traffic_check(cfg, port, ctx_ref, { 'target': (1, 3),
285 ethtool(f"-L {cfg.ifname} combined 3")
292 def test_rss_resize(cfg): argument
301 channels = cfg.ethnl.channels_get({'header': {'dev-index': cfg.ifindex}})
308 ethtool(f"-L {cfg.ifname} combined 2")
309 defer(ethtool, f"-L {cfg.ifname} combined {qcnt}")
311 ethtool(f"-X {cfg.ifname} weight 1 7")
312 defer(ethtool, f"-X {cfg.ifname} default")
314 ethtool(f"-L {cfg.ifname} combined {ch_max}")
315 data = get_rss(cfg)
325 def test_hitless_key_update(cfg): argument
335 data = get_rss(cfg)
340 tgen = GenerateTraffic(cfg)
342 errors0, carrier0 = get_drop_err_sum(cfg)
344 ethtool(f"-X {cfg.ifname} hkey " + _rss_key_str(key))
346 errors1, carrier1 = get_drop_err_sum(cfg)
355 def test_rss_context_dump(cfg): argument
361 data = get_rss(cfg)
371 ids.append(ethtool_create(cfg, "-X", f"context new"))
372 defer(ethtool, f"-X {cfg.ifname} context {ids[-1]} delete")
374 ids.append(ethtool_create(cfg, "-X", f"context new weight 1 1"))
375 defer(ethtool, f"-X {cfg.ifname} context {ids[-1]} delete")
377 ids.append(ethtool_create(cfg, "-X", f"context new hkey {key}"))
378 defer(ethtool, f"-X {cfg.ifname} context {ids[-1]} delete")
384 expect_tuples = set([(cfg.ifname, -1)] + [(cfg.ifname, ctx_id) for ctx_id in ids])
387 ctxs = cfg.ethnl.rss_get({}, dump=True)
390 ctx_tuples = set([ctx for ctx in tuples if ctx[0] == cfg.ifname])
406 ctxs = cfg.ethnl.rss_get({'header': {'dev-name': cfg.ifname}}, dump=True)
413 expect_tuples.remove((cfg.ifname, -1))
415 ctxs = cfg.ethnl.rss_get({'start-context': 1}, dump=True)
418 ctx_tuples = set([ctx for ctx in tuples if ctx[0] == cfg.ifname])
422 ctxs = cfg.ethnl.rss_get({'header': {'dev-name': cfg.ifname}, 'start-context': 1}, dump=True)
427 def test_rss_context(cfg, ctx_cnt=1, create_with_cfg=None): argument
435 require_ntuple(cfg)
440 qcnt = len(_get_rx_cnts(cfg))
444 ethtool(f"-L {cfg.ifname} combined {2 + 2 * ctx_cnt}")
445 defer(ethtool, f"-L {cfg.ifname} combined {qcnt}")
452 ethtool(f"-X {cfg.ifname} equal 2")
453 defer(ethtool, f"-X {cfg.ifname} default")
460 ctx_id = ethtool_create(cfg, "-X", f"context new {create_cfg}")
461 defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete")
468 if cfg.context_cnt is None:
469 cfg.context_cnt = ctx_cnt
472 _rss_key_check(cfg, context=ctx_id)
475 ethtool(f"-X {cfg.ifname} context {ctx_id} {want_cfg}")
476 _rss_key_check(cfg, context=ctx_id)
479 data = get_rss(cfg, ctx_id)
480 … ksft_eq(min(data['rss-indirection-table']), 2 + i * 2, "Unexpected context cfg: " + str(data))
481 … ksft_eq(max(data['rss-indirection-table']), 2 + i * 2 + 1, "Unexpected context cfg: " + str(data))
484 … flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {ports[i]} context {ctx_id}"
485 ntuple = ethtool_create(cfg, "-N", flow)
486 defer(ethtool, f"-N {cfg.ifname} delete {ntuple}")
488 _ntuple_rule_check(cfg, ntuple, ctx_id)
491 _send_traffic_check(cfg, ports[i], f"context {i}",
500 def test_rss_context4(cfg): argument
501 test_rss_context(cfg, 4)
504 def test_rss_context32(cfg): argument
505 test_rss_context(cfg, 32)
508 def test_rss_context4_create_with_cfg(cfg): argument
509 test_rss_context(cfg, 4, create_with_cfg=True)
512 def test_rss_context_queue_reconfigure(cfg): argument
513 test_rss_queue_reconfigure(cfg, main_ctx=False)
516 def test_rss_context_out_of_order(cfg, ctx_cnt=4): argument
524 require_ntuple(cfg)
525 require_context_cnt(cfg, 4)
528 qcnt = len(_get_rx_cnts(cfg))
532 ethtool(f"-L {cfg.ifname} combined {2 + 2 * ctx_cnt}")
533 defer(ethtool, f"-L {cfg.ifname} combined {qcnt}")
561 _send_traffic_check(cfg, ports[i], f"context {i}", expected)
564 ethtool(f"-X {cfg.ifname} equal 2")
565 defer(ethtool, f"-X {cfg.ifname} default")
568 ctx_id = ethtool_create(cfg, "-X", f"context new start {2 + i * 2} equal 2")
569 ctx.append(defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete"))
572 … flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {ports[i]} context {ctx_id}"
573 ntuple_id = ethtool_create(cfg, "-N", flow)
574 ntuple.append(defer(ethtool, f"-N {cfg.ifname} delete {ntuple_id}"))
591 def test_rss_context_overlap(cfg, other_ctx=0): argument
597 require_ntuple(cfg)
599 require_context_cnt(cfg, 2)
601 queue_cnt = len(_get_rx_cnts(cfg))
605 ethtool(f"-L {cfg.ifname} combined 4")
606 defer(ethtool, f"-L {cfg.ifname} combined {queue_cnt}")
611 ethtool(f"-X {cfg.ifname} equal 4")
612 defer(ethtool, f"-X {cfg.ifname} default")
614 other_ctx = ethtool_create(cfg, "-X", "context new")
615 ethtool(f"-X {cfg.ifname} context {other_ctx} equal 4")
616 defer(ethtool, f"-X {cfg.ifname} context {other_ctx} delete")
618 ctx_id = ethtool_create(cfg, "-X", "context new")
619 ethtool(f"-X {cfg.ifname} context {ctx_id} start 2 equal 2")
620 defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete")
624 … flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {other_ctx}"
625 ntuple_id = ethtool_create(cfg, "-N", flow)
626 ntuple = defer(ethtool, f"-N {cfg.ifname} delete {ntuple_id}")
629 cnts = _get_rx_cnts(cfg)
630 GenerateTraffic(cfg, port=port).wait_pkts_and_stop(20000)
631 cnts = _get_rx_cnts(cfg, prev=cnts)
642 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {ctx_id}"
643 ntuple_id = ethtool_create(cfg, "-N", flow)
644 defer(ethtool, f"-N {cfg.ifname} delete {ntuple_id}")
646 cnts = _get_rx_cnts(cfg)
647 GenerateTraffic(cfg, port=port).wait_pkts_and_stop(20000)
648 cnts = _get_rx_cnts(cfg, prev=cnts)
657 def test_rss_context_overlap2(cfg): argument
658 test_rss_context_overlap(cfg, True)
661 def test_flow_add_context_missing(cfg): argument
667 require_ntuple(cfg)
672 get_rss(cfg, context=ctx_id)
677 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port 1234 context {ctx_id}"
678 ntuple_id = ethtool_create(cfg, "-N", flow)
679 ethtool(f"-N {cfg.ifname} delete {ntuple_id}")
684 def test_delete_rss_context_busy(cfg): argument
690 require_ntuple(cfg)
693 ctx_id = ethtool_create(cfg, "-X", "context new")
694 ctx_deleter = defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete")
698 flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {ctx_id}"
699 ntuple_id = ethtool_create(cfg, "-N", flow)
700 defer(ethtool, f"-N {cfg.ifname} delete {ntuple_id}")
711 def test_rss_ntuple_addition(cfg): argument
717 require_ntuple(cfg)
719 queue_cnt = len(_get_rx_cnts(cfg))
723 ethtool(f"-L {cfg.ifname} combined 4")
724 defer(ethtool, f"-L {cfg.ifname} combined {queue_cnt}")
729 ethtool(f"-X {cfg.ifname} equal 1")
730 defer(ethtool, f"-X {cfg.ifname} default")
733 ctx_id = ethtool_create(cfg, "-X", "context new equal 2")
734 defer(ethtool, f"-X {cfg.ifname} context {ctx_id} delete")
738 …flow = f"flow-type tcp{cfg.addr_ipver} dst-ip {cfg.addr} dst-port {port} context {ctx_id} action 2"
740 ntuple_id = ethtool_create(cfg, "-N", flow)
743 defer(ethtool, f"-N {cfg.ifname} delete {ntuple_id}")
745 _send_traffic_check(cfg, port, f"context {ctx_id}", { 'target': (2, 3),
751 with NetDrvEpEnv(__file__, nsim_test=False) as cfg:
752 cfg.context_cnt = None
753 cfg.ethnl = EthtoolFamily()
754 cfg.netdevnl = NetdevFamily()
764 args=(cfg, ))