1"""Class to configure wireless settings.""" 2 3import time 4 5from acts.controllers.ap_lib import hostapd_constants 6from acts.controllers.openwrt_lib.network_settings import SERVICE_DNSMASQ 7from acts.controllers.openwrt_lib.network_settings import ServiceManager 8 9 10LEASE_FILE = "/tmp/dhcp.leases" 11OPEN_SECURITY = "none" 12PSK1_SECURITY = "psk" 13PSK_SECURITY = "psk2" 14WEP_SECURITY = "wep" 15ENT_SECURITY = "wpa2" 16OWE_SECURITY = "owe" 17SAE_SECURITY = "sae" 18SAEMIXED_SECURITY = "sae-mixed" 19ENABLE_RADIO = "0" 20DISABLE_RADIO = "1" 21ENABLE_HIDDEN = "1" 22RADIO_2G = "radio1" 23RADIO_5G = "radio0" 24 25 26class WirelessSettingsApplier(object): 27 """Class for wireless settings. 28 29 Attributes: 30 ssh: ssh object for the AP. 31 service_manager: Object manage service configuration 32 wireless_configs: a list of 33 acts.controllers.openwrt_lib.wireless_config.WirelessConfig. 34 channel_2g: channel for 2G band. 35 channel_5g: channel for 5G band. 36 """ 37 38 def __init__(self, ssh, configs, channel_2g, channel_5g, radio_2g=RADIO_2G, radio_5g=RADIO_5G): 39 """Initialize wireless settings. 40 41 Args: 42 ssh: ssh connection object. 43 configs: a list of 44 acts.controllers.openwrt_lib.wireless_config.WirelessConfig. 45 channel_2g: channel for 2G band. 46 channel_5g: channel for 5G band. 47 """ 48 self.ssh = ssh 49 self.service_manager = ServiceManager(ssh) 50 self.wireless_configs = configs 51 self.channel_2g = channel_2g 52 self.channel_5g = channel_5g 53 self.radio_2g = radio_2g 54 self.radio_5g = radio_5g 55 56 def apply_wireless_settings(self): 57 """Configure wireless settings from a list of configs.""" 58 default_2g_iface = "default_" + self.radio_2g 59 default_5g_iface = "default_" + self.radio_5g 60 61 # set channels for 2G and 5G bands 62 self.ssh.run("uci set wireless.%s.channel='%s'" % (self.radio_2g, self.channel_2g)) 63 self.ssh.run("uci set wireless.%s.channel='%s'" % (self.radio_5g, self.channel_5g)) 64 if self.channel_5g == 165: 65 self.ssh.run("uci set wireless.%s.htmode='VHT20'" % self.radio_5g) 66 elif self.channel_5g in [149,153,157,161,165]: 67 self.ssh.run("iw reg set US") 68 elif self.channel_5g == 132 or self.channel_5g == 136: 69 self.ssh.run("iw reg set ZA") 70 self.ssh.run("uci set wireless.%s.htmode='VHT40'" % self.radio_5g) 71 72 if self.channel_2g == 13: 73 self.ssh.run("iw reg set AU") 74 75 # disable default OpenWrt SSID 76 self.ssh.run("uci set wireless.%s.disabled='%s'" % 77 (default_2g_iface, DISABLE_RADIO)) 78 self.ssh.run("uci set wireless.%s.disabled='%s'" % 79 (default_5g_iface, DISABLE_RADIO)) 80 81 # Enable radios 82 self.ssh.run("uci set wireless.%s.disabled='%s'" % (self.radio_2g, ENABLE_RADIO)) 83 self.ssh.run("uci set wireless.%s.disabled='%s'" % (self.radio_5g, ENABLE_RADIO)) 84 85 for config in self.wireless_configs: 86 87 # configure open network 88 if config.security == OPEN_SECURITY: 89 if config.band == hostapd_constants.BAND_2G: 90 self.ssh.run("uci set wireless.%s.ssid='%s'" % 91 (default_2g_iface, config.ssid)) 92 self.ssh.run("uci set wireless.%s.disabled='%s'" % 93 (default_2g_iface, ENABLE_RADIO)) 94 if config.hidden: 95 self.ssh.run("uci set wireless.%s.hidden='%s'" % 96 (default_2g_iface, ENABLE_HIDDEN)) 97 elif config.band == hostapd_constants.BAND_5G: 98 self.ssh.run("uci set wireless.%s.ssid='%s'" % 99 (default_5g_iface, config.ssid)) 100 self.ssh.run("uci set wireless.%s.disabled='%s'" % 101 (default_5g_iface, ENABLE_RADIO)) 102 if config.hidden: 103 self.ssh.run("uci set wireless.%s.hidden='%s'" % 104 (default_5g_iface, ENABLE_HIDDEN)) 105 continue 106 107 self.ssh.run("uci set wireless.%s='wifi-iface'" % config.name) 108 if config.band == hostapd_constants.BAND_2G: 109 self.ssh.run("uci set wireless.%s.device='%s'" % (config.name, self.radio_2g)) 110 else: 111 self.ssh.run("uci set wireless.%s.device='%s'" % (config.name, self.radio_5g)) 112 self.ssh.run("uci set wireless.%s.network='%s'" % 113 (config.name, config.iface)) 114 self.ssh.run("uci set wireless.%s.mode='ap'" % config.name) 115 self.ssh.run("uci set wireless.%s.ssid='%s'" % 116 (config.name, config.ssid)) 117 self.ssh.run("uci set wireless.%s.encryption='%s'" % 118 (config.name, config.security)) 119 if config.security == PSK_SECURITY or config.security == SAE_SECURITY\ 120 or config.security == PSK1_SECURITY\ 121 or config.security == SAEMIXED_SECURITY: 122 self.ssh.run("uci set wireless.%s.key='%s'" % 123 (config.name, config.password)) 124 elif config.security == WEP_SECURITY: 125 self.ssh.run("uci set wireless.%s.key%s='%s'" % 126 (config.name, config.wep_key_num, config.wep_key)) 127 self.ssh.run("uci set wireless.%s.key='%s'" % 128 (config.name, config.wep_key_num)) 129 elif config.security == ENT_SECURITY: 130 self.ssh.run("uci set wireless.%s.auth_secret='%s'" % 131 (config.name, config.radius_server_secret)) 132 self.ssh.run("uci set wireless.%s.auth_server='%s'" % 133 (config.name, config.radius_server_ip)) 134 self.ssh.run("uci set wireless.%s.auth_port='%s'" % 135 (config.name, config.radius_server_port)) 136 if config.ieee80211w: 137 self.ssh.run("uci set wireless.%s.ieee80211w='%s'" % 138 (config.name, config.ieee80211w)) 139 if config.hidden: 140 self.ssh.run("uci set wireless.%s.hidden='%s'" % 141 (config.name, ENABLE_HIDDEN)) 142 143 self.ssh.run("uci commit wireless") 144 self.ssh.run("cp %s %s.tmp" % (LEASE_FILE, LEASE_FILE)) 145 146 def cleanup_wireless_settings(self): 147 """Reset wireless settings to default.""" 148 self.ssh.run("wifi down") 149 self.ssh.run("rm -f /etc/config/wireless") 150 self.ssh.run("wifi config") 151 if self.channel_5g == 132: 152 self.ssh.run("iw reg set US") 153 self.ssh.run("cp %s.tmp %s" % (LEASE_FILE, LEASE_FILE)) 154 self.service_manager.restart(SERVICE_DNSMASQ) 155 time.sleep(9) 156 157