from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_true, KsftSkipEx from lib.py import EthtoolFamily, NetshaperFamily from lib.py import NetDrvEnv from lib.py import NlError from lib.py import cmd
def get_shapers(cfg, nl_shaper) -> None: try:
shapers = nl_shaper.get({'ifindex': cfg.ifindex}, dump=True) except NlError as e: if e.error == 95: raise KsftSkipEx("shapers not supported by the device") raise
# Default configuration: no shapers configured.
ksft_eq(len(shapers), 0)
def get_caps(cfg, nl_shaper) -> None: try:
caps = nl_shaper.cap_get({'ifindex': cfg.ifindex}, dump=True) except NlError as e: if e.error == 95: raise KsftSkipEx("shapers not supported by the device") raise
# Each device implementing shaper support must support some # features in at least a scope.
ksft_true(len(caps)> 0)
def set_qshapers(cfg, nl_shaper) -> None: try:
caps = nl_shaper.cap_get({'ifindex': cfg.ifindex, 'scope':'queue'}) except NlError as e: if e.error == 95: raise KsftSkipEx("shapers not supported by the device") raise ifnot'support-bw-max'in caps ornot'support-metric-bps'in caps: raise KsftSkipEx("device does not support queue scope shapers with bw_max and metric bps")
cfg.queues = True;
netnl = EthtoolFamily()
channels = netnl.channels_get({'header': {'dev-index': cfg.ifindex}}) if channels['combined-count'] == 0:
cfg.rx_type = 'rx'
cfg.nr_queues = channels['rx-count'] else:
cfg.rx_type = 'combined'
cfg.nr_queues = channels['combined-count'] if cfg.nr_queues < 3: raise KsftSkipEx(f"device does not support enough queues min 3 found {cfg.nr_queues}")
def basic_groups(cfg, nl_shaper) -> None: ifnot cfg.netdev: raise KsftSkipEx("netdev shaper not supported by the device") if cfg.nr_queues < 3: raise KsftSkipEx(f"netdev does not have enough queues min 3 reported {cfg.nr_queues}")
try:
caps = nl_shaper.cap_get({'ifindex': cfg.ifindex, 'scope':'queue'}) except NlError as e: if e.error == 95: raise KsftSkipEx("shapers not supported by the device") raise ifnot'support-weight'in caps: raise KsftSkipEx("device does not support queue scope shapers with weight")
# Deleting all the leaves shaper does not affect the node one # when the latter has 'netdev' scope.
shapers = nl_shaper.get({'ifindex': cfg.ifindex}, dump=True)
ksft_eq(len(shapers), 1)
def qgroups(cfg, nl_shaper) -> None: if cfg.nr_queues < 4: raise KsftSkipEx(f"netdev does not have enough queues min 4 reported {cfg.nr_queues}") try:
caps = nl_shaper.cap_get({'ifindex': cfg.ifindex, 'scope':'node'}) except NlError as e: if e.error == 95: raise KsftSkipEx("shapers not supported by the device") raise ifnot'support-bw-max'in caps ornot'support-metric-bps'in caps: raise KsftSkipEx("device does not support node scope shapers with bw_max and metric bps") try:
caps = nl_shaper.cap_get({'ifindex': cfg.ifindex, 'scope':'queue'}) except NlError as e: if e.error == 95: raise KsftSkipEx("shapers not supported by the device") raise ifnot'support-nesting'in caps ornot'support-weight'in caps ornot'support-metric-bps'in caps: raise KsftSkipEx("device does not support nested queue scope shapers with weight")
def delegation(cfg, nl_shaper) -> None: ifnot cfg.groups: raise KsftSkipEx("device does not support node scope") try:
caps = nl_shaper.cap_get({'ifindex': cfg.ifindex, 'scope':'node'}) except NlError as e: if e.error == 95: raise KsftSkipEx("node scope shapers not supported by the device") raise ifnot'support-nesting'in caps: raise KsftSkipEx("device does not support node scope shapers nesting")
# Final cleanup. for i in range(1, 4):
nl_shaper.delete({'ifindex': cfg.ifindex, 'handle': {'scope': 'queue', 'id': i}})
shapers = nl_shaper.get({'ifindex': cfg.ifindex}, dump=True)
ksft_eq(len(shapers), 0)
def queue_update(cfg, nl_shaper) -> None: if cfg.nr_queues < 4: raise KsftSkipEx(f"netdev does not have enough queues min 4 reported {cfg.nr_queues}") ifnot cfg.queues: raise KsftSkipEx("device does not support queue scope")
for i in range(3):
nl_shaper.set({'ifindex': cfg.ifindex, 'handle': {'scope': 'queue', 'id': i}, 'metric': 'bps', 'bw-max': (i + 1) * 1000}) # Delete a channel, with no shapers configured on top of the related # queue: no changes expected
cmd(f"ethtool -L {cfg.dev['ifname']} {cfg.rx_type} 3", timeout=10)
shapers = nl_shaper.get({'ifindex': cfg.ifindex}, dump=True)
ksft_eq(shapers, [{'ifindex': cfg.ifindex, 'parent': {'scope': 'netdev'}, 'handle': {'scope': 'queue', 'id': 0}, 'metric': 'bps', 'bw-max': 1000},
{'ifindex': cfg.ifindex, 'parent': {'scope': 'netdev'}, 'handle': {'scope': 'queue', 'id': 1}, 'metric': 'bps', 'bw-max': 2000},
{'ifindex': cfg.ifindex, 'parent': {'scope': 'netdev'}, 'handle': {'scope': 'queue', 'id': 2}, 'metric': 'bps', 'bw-max': 3000}])
# Delete a channel, with a shaper configured on top of the related # queue: the shaper must be deleted, too
cmd(f"ethtool -L {cfg.dev['ifname']} {cfg.rx_type} 2", timeout=10)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.