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