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