| # SPDX-License-Identifier: GPL-2.0 | |
| """ | |
| Netdev feature helper utilities for kernel selftests. | |
| Provides common operations for changing device features via ethtool. | |
| """ | |
| from . import KsftXfailEx, defer, ethtool, ksft_pr | |
| def set_ethtool_feat(dev, current, feats, host=None, check=True): | |
| """Set ethtool features with defer to restore original state.""" | |
| s2n = {True: "on", False: "off"} | |
| new = ["-K", dev] | |
| old = ["-K", dev] | |
| no_change = True | |
| for name, state in feats.items(): | |
| new += [name, s2n[state]] | |
| old += [name, s2n[current[name]["active"]]] | |
| if current[name]["active"] != state: | |
| no_change = False | |
| if current[name]["fixed"]: | |
| raise KsftXfailEx(f"Device does not support {name}") | |
| if no_change: | |
| return | |
| eth_cmd = ethtool(" ".join(new), host=host) | |
| defer(ethtool, " ".join(old), host=host) | |
| # If ethtool printed something kernel must have modified some features | |
| if eth_cmd.stdout: | |
| ksft_pr(eth_cmd) | |
| if not check: | |
| return | |
| current = ethtool(f"-k {dev}", json=True, host=host)[0] | |
| for name, state in feats.items(): | |
| if current[name]["active"] != state: | |
| raise KsftXfailEx(f"{name} was not set to {s2n[state]}") |