/bin/wifi: Make --band work for 'wifi setclient'.
Currently, the --band argument of 'wifi setclient' just chooses a
radio that supports the desired band. If this is a dual-band radio
(e.g. Marvell 8897), we may join an AP with the wrong band. This
commit fixes that by specifying freq_list in the wpa_supplicant
config.
Change-Id: If6062c17910f543d812d93c42c7bd682db2c75a7
diff --git a/wifi/autochannel.py b/wifi/autochannel.py
index 51b4d00..c669c9a 100644
--- a/wifi/autochannel.py
+++ b/wifi/autochannel.py
@@ -65,6 +65,12 @@
% (band, autotype, width))
+def get_all_frequencies(band):
+ """Get all 802.11 frequencies for the given band."""
+ return get_permitted_frequencies(band, 'OVERLAP' if band == '2.4' else 'ANY',
+ '20').split()
+
+
def scan(interface, band, autotype, width):
"""Do an autochannel scan and return the recommended channel.
diff --git a/wifi/autochannel_test.py b/wifi/autochannel_test.py
index a53725f..7198cb5 100755
--- a/wifi/autochannel_test.py
+++ b/wifi/autochannel_test.py
@@ -22,5 +22,17 @@
wvtest.WVEXCEPT(ValueError, autochannel.get_permitted_frequencies, *case)
+@wvtest.wvtest
+def get_all_frequencies_test():
+ wvtest.WVPASSEQ(['2412', '2417', '2422', '2427', '2432', '2437', '2442',
+ '2447', '2452', '2457', '2462'],
+ autochannel.get_all_frequencies('2.4'))
+
+ wvtest.WVPASSEQ(['5180', '5200', '5220', '5240', '5745', '5765', '5785',
+ '5805', '5825', '5260', '5280', '5300', '5320', '5500',
+ '5520', '5540', '5560', '5580', '5660', '5680', '5700'],
+ autochannel.get_all_frequencies('5'))
+
+
if __name__ == '__main__':
wvtest.wvtest_main()
diff --git a/wifi/configs.py b/wifi/configs.py
index 3377a08..743fe10 100644
--- a/wifi/configs.py
+++ b/wifi/configs.py
@@ -6,6 +6,8 @@
import Crypto.Protocol.KDF
+# pylint: disable=g-bad-import-order
+import autochannel
import experiment
import utils
@@ -373,10 +375,13 @@
utils.validate_and_sanitize_bssid(opt.bssid))
network_block = make_network_block(network_block_lines)
+ freq_list = ','.join(autochannel.get_all_frequencies(opt.band))
+
lines = [
'ctrl_interface=/var/run/wpa_supplicant',
'ap_scan=1',
'autoscan=exponential:1:30',
+ 'freq_list=' + freq_list,
network_block
]
return '\n'.join(lines)
diff --git a/wifi/configs_test.py b/wifi/configs_test.py
index ab5d6c7..64e05c6 100755
--- a/wifi/configs_test.py
+++ b/wifi/configs_test.py
@@ -10,27 +10,36 @@
from wvtest import wvtest
+_FREQ_LIST = {
+ '2.4': '2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462',
+ '5': ('5180,5200,5220,5240,5745,5765,5785,5805,5825,5260,5280,5300,5320,'
+ '5500,5520,5540,5560,5580,5660,5680,5700'),
+}
+
+
_WPA_SUPPLICANT_CONFIG = """ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
autoscan=exponential:1:30
-network={
+freq_list={freq_list}
+network={{
\tssid="some ssid"
\t#psk="some passphrase"
\tpsk=41821f7ca3ea5d85beea7644ed7e0fefebd654177fa06c26fbdfdc3c599a317f
\tscan_ssid=1
-}
+}}
"""
_WPA_SUPPLICANT_CONFIG_BSSID = """ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
autoscan=exponential:1:30
-network={
+freq_list={freq_list}
+network={{
\tssid="some ssid"
\t#psk="some passphrase"
\tpsk=41821f7ca3ea5d85beea7644ed7e0fefebd654177fa06c26fbdfdc3c599a317f
\tscan_ssid=1
\tbssid=12:34:56:78:90:ab
-}
+}}
"""
# pylint: disable=g-backslash-continuation
@@ -38,12 +47,13 @@
"""ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
autoscan=exponential:1:30
-network={
+freq_list={freq_list}
+network={{
\tssid="some ssid"
\tkey_mgmt=NONE
\tscan_ssid=1
\tbssid=12:34:56:78:90:ab
-}
+}}
"""
@@ -54,24 +64,30 @@
"Can't test generate_wpa_supplicant_config without wpa_passphrase.")
return
- opt = FakeOptDict()
- config = configs.generate_wpa_supplicant_config(
- 'some ssid', 'some passphrase', opt)
- wvtest.WVPASSEQ(_WPA_SUPPLICANT_CONFIG, config)
+ for band in ('2.4', '5'):
+ opt = FakeOptDict()
+ opt.band = band
+ got = configs.generate_wpa_supplicant_config(
+ 'some ssid', 'some passphrase', opt)
+ want = _WPA_SUPPLICANT_CONFIG.format(freq_list=_FREQ_LIST[band])
+ wvtest.WVPASSEQ(want, got)
- opt.bssid = 'TotallyNotValid'
- wvtest.WVEXCEPT(utils.BinWifiException,
- configs.generate_wpa_supplicant_config,
- 'some ssid', 'some passphrase', opt)
+ opt.bssid = 'TotallyNotValid'
+ wvtest.WVEXCEPT(utils.BinWifiException,
+ configs.generate_wpa_supplicant_config,
+ 'some ssid', 'some passphrase', opt)
- opt.bssid = '12:34:56:78:90:Ab'
- config = configs.generate_wpa_supplicant_config(
- 'some ssid', 'some passphrase', opt)
- wvtest.WVPASSEQ(_WPA_SUPPLICANT_CONFIG_BSSID, config)
+ opt.bssid = '12:34:56:78:90:Ab'
+ got = configs.generate_wpa_supplicant_config(
+ 'some ssid', 'some passphrase', opt)
+ want = _WPA_SUPPLICANT_CONFIG_BSSID.format(freq_list=_FREQ_LIST[band])
+ wvtest.WVPASSEQ(want, got)
- config = configs.generate_wpa_supplicant_config(
- 'some ssid', None, opt)
- wvtest.WVPASSEQ(_WPA_SUPPLICANT_CONFIG_BSSID_UNSECURED, config)
+ got = configs.generate_wpa_supplicant_config(
+ 'some ssid', None, opt)
+ want = _WPA_SUPPLICANT_CONFIG_BSSID_UNSECURED.format(
+ freq_list=_FREQ_LIST[band])
+ wvtest.WVPASSEQ(want, got)
_PHY_INFO = """Wiphy phy0