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 [64]: 67 self.ssh.run("iw reg set IN") 68 self.ssh.run("uci set wireless.%s.htmode='VHT40'" % self.radio_5g) 69 elif self.channel_5g in [144]: 70 self.ssh.run("iw reg set RU") 71 self.ssh.run("uci set wireless.%s.htmode='VHT40'" % self.radio_5g) 72 self.ssh.run("uci set wireless.%s.country3=0x49" % self.radio_5g) 73 elif self.channel_5g in [149,153,157,161,165]: 74 self.ssh.run("iw reg set US") 75 elif self.channel_5g == 132 or self.channel_5g == 136: 76 self.ssh.run("iw reg set ZA") 77 self.ssh.run("uci set wireless.%s.htmode='VHT40'" % self.radio_5g) 78 79 if self.channel_2g == 13: 80 self.ssh.run("iw reg set AU") 81 82 # disable default OpenWrt SSID 83 self.ssh.run("uci set wireless.%s.disabled='%s'" % 84 (default_2g_iface, DISABLE_RADIO)) 85 self.ssh.run("uci set wireless.%s.disabled='%s'" % 86 (default_5g_iface, DISABLE_RADIO)) 87 88 # Enable radios 89 self.ssh.run("uci set wireless.%s.disabled='%s'" % (self.radio_2g, ENABLE_RADIO)) 90 self.ssh.run("uci set wireless.%s.disabled='%s'" % (self.radio_5g, ENABLE_RADIO)) 91 92 for config in self.wireless_configs: 93 94 # configure open network 95 if config.security == OPEN_SECURITY: 96 if config.band == hostapd_constants.BAND_2G: 97 self.ssh.run("uci set wireless.%s.ssid='%s'" % 98 (default_2g_iface, config.ssid)) 99 self.ssh.run("uci set wireless.%s.disabled='%s'" % 100 (default_2g_iface, ENABLE_RADIO)) 101 if config.hidden: 102 self.ssh.run("uci set wireless.%s.hidden='%s'" % 103 (default_2g_iface, ENABLE_HIDDEN)) 104 elif config.band == hostapd_constants.BAND_5G: 105 self.ssh.run("uci set wireless.%s.ssid='%s'" % 106 (default_5g_iface, config.ssid)) 107 self.ssh.run("uci set wireless.%s.disabled='%s'" % 108 (default_5g_iface, ENABLE_RADIO)) 109 if config.hidden: 110 self.ssh.run("uci set wireless.%s.hidden='%s'" % 111 (default_5g_iface, ENABLE_HIDDEN)) 112 continue 113 114 self.ssh.run("uci set wireless.%s='wifi-iface'" % config.name) 115 if config.band == hostapd_constants.BAND_2G: 116 self.ssh.run("uci set wireless.%s.device='%s'" % (config.name, self.radio_2g)) 117 else: 118 self.ssh.run("uci set wireless.%s.device='%s'" % (config.name, self.radio_5g)) 119 self.ssh.run("uci set wireless.%s.network='%s'" % 120 (config.name, config.iface)) 121 self.ssh.run("uci set wireless.%s.mode='ap'" % config.name) 122 self.ssh.run("uci set wireless.%s.ssid='%s'" % 123 (config.name, config.ssid)) 124 self.ssh.run("uci set wireless.%s.encryption='%s'" % 125 (config.name, config.security)) 126 if config.security == PSK_SECURITY or config.security == SAE_SECURITY\ 127 or config.security == PSK1_SECURITY\ 128 or config.security == SAEMIXED_SECURITY: 129 self.ssh.run("uci set wireless.%s.key='%s'" % 130 (config.name, config.password)) 131 elif config.security == WEP_SECURITY: 132 self.ssh.run("uci set wireless.%s.key%s='%s'" % 133 (config.name, config.wep_key_num, config.wep_key)) 134 self.ssh.run("uci set wireless.%s.key='%s'" % 135 (config.name, config.wep_key_num)) 136 elif config.security == ENT_SECURITY: 137 self.ssh.run("uci set wireless.%s.auth_secret='%s'" % 138 (config.name, config.radius_server_secret)) 139 self.ssh.run("uci set wireless.%s.auth_server='%s'" % 140 (config.name, config.radius_server_ip)) 141 self.ssh.run("uci set wireless.%s.auth_port='%s'" % 142 (config.name, config.radius_server_port)) 143 if config.ieee80211w: 144 self.ssh.run("uci set wireless.%s.ieee80211w='%s'" % 145 (config.name, config.ieee80211w)) 146 if config.hidden: 147 self.ssh.run("uci set wireless.%s.hidden='%s'" % 148 (config.name, ENABLE_HIDDEN)) 149 150 self.ssh.run("uci commit wireless") 151 self.ssh.run("cp %s %s.tmp" % (LEASE_FILE, LEASE_FILE)) 152 153 def cleanup_wireless_settings(self): 154 """Reset wireless settings to default.""" 155 self.ssh.run("wifi down") 156 self.ssh.run("rm -f /etc/config/wireless") 157 self.ssh.run("wifi config") 158 if self.channel_5g == 132: 159 self.ssh.run("iw reg set US") 160 self.ssh.run("cp %s.tmp %s" % (LEASE_FILE, LEASE_FILE)) 161 self.service_manager.restart(SERVICE_DNSMASQ) 162 time.sleep(9) 163 164