Merge f5e0632b11 into 0eb28ac3d8
This commit is contained in:
commit
910b09087b
3 changed files with 170 additions and 6 deletions
30
functions
30
functions
|
|
@ -299,26 +299,44 @@ restore_transparent_hugepages() {
|
||||||
# WIFI tuning
|
# WIFI tuning
|
||||||
#
|
#
|
||||||
|
|
||||||
# usage: _wifi_set_power_level level
|
# usage: _wifi_set_power_level level [wireless_status_file]
|
||||||
_wifi_set_power_level() {
|
_wifi_set_power_level() {
|
||||||
# 0 auto, PM enabled
|
# 0 auto, PM enabled
|
||||||
# 1-5 least savings and lowest latency - most savings and highest latency
|
# 1-5 least savings and lowest latency - most savings and highest latency
|
||||||
# 6 disable power savings
|
# 6 disable power savings
|
||||||
level=$1
|
level=$1
|
||||||
|
wireless_status_file=${2:-/proc/net/wireless}
|
||||||
|
|
||||||
# do not report errors on systems with no wireless
|
# do not report errors on systems with no wireless
|
||||||
[ -e /proc/net/wireless ] || return 0
|
[ -e "$wireless_status_file" ] || return 0
|
||||||
|
|
||||||
# apply the settings using iwpriv
|
case "$level" in
|
||||||
ifaces=$(cat /proc/net/wireless | grep -v '|' | sed 's@^ *\([^:]*\):.*@\1@')
|
0|6)
|
||||||
|
power_save=off
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
power_save=on
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
ifaces=$(grep -v '|' "$wireless_status_file" | sed 's@^ *\([^:]*\):.*@\1@')
|
||||||
for iface in $ifaces; do
|
for iface in $ifaces; do
|
||||||
iwpriv $iface set_power $level
|
if command -v iw >/dev/null 2>&1; then
|
||||||
|
iw dev "$iface" set power_save "$power_save" && continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Keep support for legacy drivers using Wireless Extensions.
|
||||||
|
if command -v iwpriv >/dev/null 2>&1; then
|
||||||
|
iwpriv "$iface" set_power "$level"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# some adapters may rely on sysfs
|
# some adapters may rely on sysfs
|
||||||
for i in /sys/bus/pci/devices/*/power_level; do
|
for i in /sys/bus/pci/devices/*/power_level; do
|
||||||
(echo $level > $i) &> /dev/null
|
(echo "$level" > "$i") &> /dev/null
|
||||||
done
|
done
|
||||||
|
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
enable_wifi_powersave() {
|
enable_wifi_powersave() {
|
||||||
|
|
|
||||||
145
tests/unit/test_functions.py
Normal file
145
tests/unit/test_functions.py
Normal file
|
|
@ -0,0 +1,145 @@
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
|
class WifiPowerSaveTestCase(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self._repo_dir = os.path.abspath(
|
||||||
|
os.path.join(os.path.dirname(__file__), "..", "..")
|
||||||
|
)
|
||||||
|
self._test_dir = tempfile.mkdtemp()
|
||||||
|
self._bin_dir = os.path.join(self._test_dir, "bin")
|
||||||
|
os.mkdir(self._bin_dir)
|
||||||
|
self._log = os.path.join(self._test_dir, "commands.log")
|
||||||
|
self._wireless = os.path.join(self._test_dir, "wireless")
|
||||||
|
self._write_file(
|
||||||
|
self._wireless,
|
||||||
|
"""\
|
||||||
|
Inter-| sta-| Quality | Discarded packets | Missed | WE
|
||||||
|
face | tus | link level noise | nwid crypt frag retry misc | beacon | 22
|
||||||
|
wlan0: 0000 0. 0. 0. 0 0 0 0 0 0
|
||||||
|
wlan1: 0000 0. 0. 0. 0 0 0 0 0 0
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
for command in ("grep", "ls", "sed"):
|
||||||
|
os.symlink("/bin/" + command, os.path.join(self._bin_dir, command))
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
shutil.rmtree(self._test_dir)
|
||||||
|
|
||||||
|
def _write_file(self, path, content):
|
||||||
|
with open(path, "w") as output:
|
||||||
|
output.write(content)
|
||||||
|
|
||||||
|
def _write_command(self, name, body):
|
||||||
|
command = os.path.join(self._bin_dir, name)
|
||||||
|
self._write_file(command, "#!/bin/bash\n" + body.lstrip())
|
||||||
|
os.chmod(command, 0o755)
|
||||||
|
|
||||||
|
def _run(self, level):
|
||||||
|
env = os.environ.copy()
|
||||||
|
env["COMMAND_LOG"] = self._log
|
||||||
|
env["PATH"] = self._bin_dir
|
||||||
|
subprocess.check_call(
|
||||||
|
[
|
||||||
|
"/bin/bash",
|
||||||
|
"-c",
|
||||||
|
'. "$1"; _wifi_set_power_level "$2" "$3"',
|
||||||
|
"bash",
|
||||||
|
os.path.join(self._repo_dir, "functions"),
|
||||||
|
str(level),
|
||||||
|
self._wireless,
|
||||||
|
],
|
||||||
|
env=env,
|
||||||
|
)
|
||||||
|
if os.path.exists(self._log):
|
||||||
|
with open(self._log) as command_log:
|
||||||
|
return command_log.read().splitlines()
|
||||||
|
return []
|
||||||
|
|
||||||
|
def test_iw_enables_power_save_on_all_interfaces(self):
|
||||||
|
self._write_command("iw", 'echo "iw $*" >> "$COMMAND_LOG"\n')
|
||||||
|
self._write_command("iwpriv", 'echo "iwpriv $*" >> "$COMMAND_LOG"\n')
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
self._run(5),
|
||||||
|
[
|
||||||
|
"iw dev wlan0 set power_save on",
|
||||||
|
"iw dev wlan1 set power_save on",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_iw_disables_power_save_on_all_interfaces(self):
|
||||||
|
self._write_command("iw", 'echo "iw $*" >> "$COMMAND_LOG"\n')
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
self._run(0),
|
||||||
|
[
|
||||||
|
"iw dev wlan0 set power_save off",
|
||||||
|
"iw dev wlan1 set power_save off",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_iw_maps_legacy_disable_level_to_off(self):
|
||||||
|
self._write_command("iw", 'echo "iw $*" >> "$COMMAND_LOG"\n')
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
self._run(6),
|
||||||
|
[
|
||||||
|
"iw dev wlan0 set power_save off",
|
||||||
|
"iw dev wlan1 set power_save off",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_iwpriv_fallback_when_iw_is_unavailable(self):
|
||||||
|
self._write_command("iwpriv", 'echo "iwpriv $*" >> "$COMMAND_LOG"\n')
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
self._run(5),
|
||||||
|
[
|
||||||
|
"iwpriv wlan0 set_power 5",
|
||||||
|
"iwpriv wlan1 set_power 5",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_iwpriv_fallback_when_iw_rejects_interface(self):
|
||||||
|
self._write_command(
|
||||||
|
"iw",
|
||||||
|
"""
|
||||||
|
echo "iw $*" >> "$COMMAND_LOG"
|
||||||
|
exit 1
|
||||||
|
""",
|
||||||
|
)
|
||||||
|
self._write_command("iwpriv", 'echo "iwpriv $*" >> "$COMMAND_LOG"\n')
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
self._run(5),
|
||||||
|
[
|
||||||
|
"iw dev wlan0 set power_save on",
|
||||||
|
"iwpriv wlan0 set_power 5",
|
||||||
|
"iw dev wlan1 set power_save on",
|
||||||
|
"iwpriv wlan1 set_power 5",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_missing_tools_are_ignored(self):
|
||||||
|
self.assertEqual(self._run(5), [])
|
||||||
|
|
||||||
|
def test_no_interfaces_are_ignored(self):
|
||||||
|
self._write_file(
|
||||||
|
self._wireless,
|
||||||
|
"""\
|
||||||
|
Inter-| sta-| Quality | Discarded packets | Missed | WE
|
||||||
|
face | tus | link level noise | nwid crypt frag retry misc | beacon | 22
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
self._write_command("iw", 'echo "iw $*" >> "$COMMAND_LOG"\n')
|
||||||
|
|
||||||
|
self.assertEqual(self._run(5), [])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
|
|
@ -106,6 +106,7 @@ Requires: pygobject3-base
|
||||||
%endif
|
%endif
|
||||||
Requires: virt-what
|
Requires: virt-what
|
||||||
Requires: ethtool
|
Requires: ethtool
|
||||||
|
Requires: iw
|
||||||
Requires: gawk
|
Requires: gawk
|
||||||
Requires: util-linux
|
Requires: util-linux
|
||||||
Requires: dbus
|
Requires: dbus
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue