-
Notifications
You must be signed in to change notification settings - Fork 128
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftest: net-drv: hds: add test for HDS feature
HDS/HDS-thresh features were updated/implemented. so add some tests for these features. HDS tests are the same with `ethtool -G eth0 tcp-data-split <on | off | auto >` but `auto` depends on driver specification. So, it doesn't include `auto` case. HDS-thresh tests are same with `ethtool -G eth0 hds-thresh <0 - MAX>` It includes both 0 and MAX cases. It also includes exceed case, MAX + 1. Signed-off-by: Taehee Yoo <ap420073@gmail.com> Link: https://patch.msgid.link/20250114142852.3364986-11-ap420073@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
- Loading branch information
Showing
2 changed files
with
121 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,6 +12,7 @@ TEST_PROGS := \ | |
queues.py \ | ||
stats.py \ | ||
shaper.py \ | ||
hds.py \ | ||
# end of TEST_PROGS | ||
|
||
include ../../lib.mk |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
#!/usr/bin/env python3 | ||
# SPDX-License-Identifier: GPL-2.0 | ||
|
||
import errno | ||
from lib.py import ksft_run, ksft_exit, ksft_eq, ksft_raises, KsftSkipEx | ||
from lib.py import EthtoolFamily, NlError | ||
from lib.py import NetDrvEnv | ||
|
||
def get_hds(cfg, netnl) -> None: | ||
try: | ||
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) | ||
except NlError as e: | ||
raise KsftSkipEx('ring-get not supported by device') | ||
if 'tcp-data-split' not in rings: | ||
raise KsftSkipEx('tcp-data-split not supported by device') | ||
|
||
def get_hds_thresh(cfg, netnl) -> None: | ||
try: | ||
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) | ||
except NlError as e: | ||
raise KsftSkipEx('ring-get not supported by device') | ||
if 'hds-thresh' not in rings: | ||
raise KsftSkipEx('hds-thresh not supported by device') | ||
|
||
def set_hds_enable(cfg, netnl) -> None: | ||
try: | ||
netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'tcp-data-split': 'enabled'}) | ||
except NlError as e: | ||
if e.error == errno.EINVAL: | ||
raise KsftSkipEx("disabling of HDS not supported by the device") | ||
elif e.error == errno.EOPNOTSUPP: | ||
raise KsftSkipEx("ring-set not supported by the device") | ||
try: | ||
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) | ||
except NlError as e: | ||
raise KsftSkipEx('ring-get not supported by device') | ||
if 'tcp-data-split' not in rings: | ||
raise KsftSkipEx('tcp-data-split not supported by device') | ||
|
||
ksft_eq('enabled', rings['tcp-data-split']) | ||
|
||
def set_hds_disable(cfg, netnl) -> None: | ||
try: | ||
netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'tcp-data-split': 'disabled'}) | ||
except NlError as e: | ||
if e.error == errno.EINVAL: | ||
raise KsftSkipEx("disabling of HDS not supported by the device") | ||
elif e.error == errno.EOPNOTSUPP: | ||
raise KsftSkipEx("ring-set not supported by the device") | ||
try: | ||
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) | ||
except NlError as e: | ||
raise KsftSkipEx('ring-get not supported by device') | ||
if 'tcp-data-split' not in rings: | ||
raise KsftSkipEx('tcp-data-split not supported by device') | ||
|
||
ksft_eq('disabled', rings['tcp-data-split']) | ||
|
||
def set_hds_thresh_zero(cfg, netnl) -> None: | ||
try: | ||
netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'hds-thresh': 0}) | ||
except NlError as e: | ||
if e.error == errno.EINVAL: | ||
raise KsftSkipEx("hds-thresh-set not supported by the device") | ||
elif e.error == errno.EOPNOTSUPP: | ||
raise KsftSkipEx("ring-set not supported by the device") | ||
try: | ||
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) | ||
except NlError as e: | ||
raise KsftSkipEx('ring-get not supported by device') | ||
if 'hds-thresh' not in rings: | ||
raise KsftSkipEx('hds-thresh not supported by device') | ||
|
||
ksft_eq(0, rings['hds-thresh']) | ||
|
||
def set_hds_thresh_max(cfg, netnl) -> None: | ||
try: | ||
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) | ||
except NlError as e: | ||
raise KsftSkipEx('ring-get not supported by device') | ||
if 'hds-thresh' not in rings: | ||
raise KsftSkipEx('hds-thresh not supported by device') | ||
try: | ||
netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'hds-thresh': rings['hds-thresh-max']}) | ||
except NlError as e: | ||
if e.error == errno.EINVAL: | ||
raise KsftSkipEx("hds-thresh-set not supported by the device") | ||
elif e.error == errno.EOPNOTSUPP: | ||
raise KsftSkipEx("ring-set not supported by the device") | ||
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) | ||
ksft_eq(rings['hds-thresh'], rings['hds-thresh-max']) | ||
|
||
def set_hds_thresh_gt(cfg, netnl) -> None: | ||
try: | ||
rings = netnl.rings_get({'header': {'dev-index': cfg.ifindex}}) | ||
except NlError as e: | ||
raise KsftSkipEx('ring-get not supported by device') | ||
if 'hds-thresh' not in rings: | ||
raise KsftSkipEx('hds-thresh not supported by device') | ||
if 'hds-thresh-max' not in rings: | ||
raise KsftSkipEx('hds-thresh-max not defined by device') | ||
hds_gt = rings['hds-thresh-max'] + 1 | ||
with ksft_raises(NlError) as e: | ||
netnl.rings_set({'header': {'dev-index': cfg.ifindex}, 'hds-thresh': hds_gt}) | ||
ksft_eq(e.exception.nl_msg.error, -errno.EINVAL) | ||
|
||
def main() -> None: | ||
with NetDrvEnv(__file__, queue_count=3) as cfg: | ||
ksft_run([get_hds, | ||
get_hds_thresh, | ||
set_hds_disable, | ||
set_hds_enable, | ||
set_hds_thresh_zero, | ||
set_hds_thresh_max, | ||
set_hds_thresh_gt], | ||
args=(cfg, EthtoolFamily())) | ||
ksft_exit() | ||
|
||
if __name__ == "__main__": | ||
main() |