OLD | NEW |
1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import logging, re, time | 5 import logging, re, time |
6 from autotest_lib.client.common_lib import error | 6 from autotest_lib.client.common_lib import error |
7 | 7 |
8 def isLinuxRouter(router): | 8 def isLinuxRouter(router): |
9 router_uname = router.run('uname').stdout | 9 router_uname = router.run('uname').stdout |
10 return re.search('Linux', router_uname) | 10 return re.search('Linux', router_uname) |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 self.hostapd = { | 78 self.hostapd = { |
79 'configured': False, | 79 'configured': False, |
80 'file': "/tmp/hostapd-test.conf", | 80 'file': "/tmp/hostapd-test.conf", |
81 'driver': "nl80211", | 81 'driver': "nl80211", |
82 'conf': { | 82 'conf': { |
83 'ssid': defssid, | 83 'ssid': defssid, |
84 'bridge': self.bridgeif, | 84 'bridge': self.bridgeif, |
85 'hw_mode': 'g' | 85 'hw_mode': 'g' |
86 } | 86 } |
87 } | 87 } |
88 | 88 self.station = { |
| 89 'configured': False, |
| 90 'conf': { |
| 91 'ssid': defssid, |
| 92 } |
| 93 } |
89 # Kill hostapd if already running. | 94 # Kill hostapd if already running. |
90 self.router.run("pkill hostapd >/dev/null 2>&1", ignore_status=True) | 95 self.router.run("pkill hostapd >/dev/null 2>&1", ignore_status=True) |
91 | 96 |
92 # Remove all bridges. | 97 # Remove all bridges. |
93 output = self.router.run("%s show" % self.cmd_brctl).stdout | 98 output = self.router.run("%s show" % self.cmd_brctl).stdout |
94 test = re.compile("^(\S+).*") | 99 test = re.compile("^(\S+).*") |
95 for line in output.splitlines()[1:]: | 100 for line in output.splitlines()[1:]: |
96 m = test.match(line) | 101 m = test.match(line) |
97 if m: | 102 if m: |
98 device = m.group(1) | 103 device = m.group(1) |
(...skipping 14 matching lines...) Expand all Loading... |
113 self.router.run("%s reg set US" % self.cmd_iw) | 118 self.router.run("%s reg set US" % self.cmd_iw) |
114 | 119 |
115 def create(self, params): | 120 def create(self, params): |
116 """ Create a wifi device of the specified type """ | 121 """ Create a wifi device of the specified type """ |
117 # | 122 # |
118 # AP mode is handled entirely by hostapd so we only | 123 # AP mode is handled entirely by hostapd so we only |
119 # have to setup others (mapping the bsd type to what | 124 # have to setup others (mapping the bsd type to what |
120 # iw wants) | 125 # iw wants) |
121 # | 126 # |
122 # map from bsd types to iw types | 127 # map from bsd types to iw types |
123 if params['type'] == "ap" or params['type'] == "hostap": | 128 self.apmode = params['type'] in ("ap", "hostap") |
124 self.apmode = True | 129 if not self.apmode: |
| 130 self.station['type'] = params['type'] |
125 phytype = { | 131 phytype = { |
126 "sta" : "managed", | 132 "sta" : "managed", |
127 "monitor" : "monitor", | 133 "monitor" : "monitor", |
128 "adhoc" : "adhoc", | 134 "adhoc" : "adhoc", |
129 "ibss" : "ibss", | 135 "ibss" : "ibss", |
130 "ap" : "managed", # NB: handled by hostapd | 136 "ap" : "managed", # NB: handled by hostapd |
131 "hostap" : "managed", # NB: handled by hostapd | 137 "hostap" : "managed", # NB: handled by hostapd |
132 "mesh" : "mesh", | 138 "mesh" : "mesh", |
133 "wds" : "wds", | 139 "wds" : "wds", |
134 }[params['type']] | 140 }[params['type']] |
135 | 141 |
136 self.router.run("%s phy %s interface add %s type %s" % | 142 self.router.run("%s phy %s interface add %s type %s" % |
137 (self.cmd_iw, self.phydev2, self.wlanif2, phytype)) | 143 (self.cmd_iw, self.phydev2, self.wlanif2, phytype)) |
138 self.router.run("%s phy %s interface add %s type %s" % | 144 self.router.run("%s phy %s interface add %s type %s" % |
139 (self.cmd_iw, self.phydev5, self.wlanif5, phytype)) | 145 (self.cmd_iw, self.phydev5, self.wlanif5, phytype)) |
140 | 146 |
141 | 147 |
142 def destroy(self, params): | 148 def destroy(self, params): |
143 """ Destroy a previously created device """ | 149 """ Destroy a previously created device """ |
144 # For linux, this is the same as deconfig. | 150 # For linux, this is the same as deconfig. |
145 self.deconfig(params) | 151 self.deconfig(params) |
146 | 152 |
147 | 153 |
148 | 154 |
149 def config(self, params): | 155 def hostap_config(self, params): |
150 """ Configure the AP per test requirements """ | 156 """ Configure the AP per test requirements """ |
151 | 157 |
152 multi_interface = 'multi_interface' in params | 158 multi_interface = 'multi_interface' in params |
153 if multi_interface: | 159 if multi_interface: |
154 params.pop('multi_interface') | 160 params.pop('multi_interface') |
155 elif self.hostapd['configured']: | 161 elif self.hostapd['configured'] or self.station['configured']: |
156 self.deconfig({}) | 162 self.deconfig({}) |
157 | 163 |
| 164 # Construct the hostapd.conf file and start hostapd. |
| 165 conf = self.hostapd['conf'] |
| 166 tx_power_params = {} |
| 167 htcaps = set() |
| 168 |
| 169 conf['driver'] = params.get('hostapd_driver', |
| 170 self.hostapd['driver']) |
| 171 |
| 172 for k, v in params.iteritems(): |
| 173 if k == 'ssid': |
| 174 conf['ssid'] = v |
| 175 elif k == 'ssid_suffix': |
| 176 conf['ssid'] = self.defssid + v |
| 177 elif k == 'channel': |
| 178 freq = int(v) |
| 179 |
| 180 # 2.4GHz |
| 181 if freq <= 2484: |
| 182 # Make sure hw_mode is set |
| 183 if conf.get('hw_mode') == 'a': |
| 184 conf['hw_mode'] = 'g' |
| 185 |
| 186 # Freq = 5 * chan + 2407, except channel 14 |
| 187 if freq == 2484: |
| 188 conf['channel'] = 14 |
| 189 else: |
| 190 conf['channel'] = (freq - 2407) / 5 |
| 191 # 5GHz |
| 192 else: |
| 193 # Make sure hw_mode is set |
| 194 conf['hw_mode'] = 'a' |
| 195 # Freq = 5 * chan + 4000 |
| 196 if freq < 5000: |
| 197 conf['channel'] = (freq - 4000) / 5 |
| 198 # Freq = 5 * chan + 5000 |
| 199 else: |
| 200 conf['channel'] = (freq - 5000) / 5 |
| 201 |
| 202 elif k == 'country': |
| 203 conf['country_code'] = v |
| 204 elif k == 'dotd': |
| 205 conf['ieee80211d'] = 1 |
| 206 elif k == '-dotd': |
| 207 conf['ieee80211d'] = 0 |
| 208 elif k == 'mode': |
| 209 if v == '11a': |
| 210 conf['hw_mode'] = 'a' |
| 211 elif v == '11g': |
| 212 conf['hw_mode'] = 'g' |
| 213 elif v == '11b': |
| 214 conf['hw_mode'] = 'b' |
| 215 elif v == '11n': |
| 216 conf['ieee80211n'] = 1 |
| 217 elif k == 'bintval': |
| 218 conf['beacon_int'] = v |
| 219 elif k == 'dtimperiod': |
| 220 conf['dtim_period'] = v |
| 221 elif k == 'rtsthreshold': |
| 222 conf['rts_threshold'] = v |
| 223 elif k == 'fragthreshold': |
| 224 conf['fragm_threshold'] = v |
| 225 elif k == 'shortpreamble': |
| 226 conf['preamble'] = 1 |
| 227 elif k == 'authmode': |
| 228 if v == "open": |
| 229 conf['auth_algs'] = 1 |
| 230 elif v == "shared": |
| 231 conf['auth_algs'] = 2 |
| 232 elif k == 'hidessid': |
| 233 conf['ignore_broadcast_ssid'] = 1 |
| 234 elif k == 'wme': |
| 235 conf['wmm_enabled'] = 1 |
| 236 elif k == '-wme': |
| 237 conf['wmm_enabled'] = 0 |
| 238 elif k == 'deftxkey': |
| 239 conf['wep_default_key'] = v |
| 240 elif k == 'ht20': |
| 241 htcaps.add('') # NB: ensure 802.11n setup below |
| 242 conf['wmm_enabled'] = 1 |
| 243 elif k == 'ht40': |
| 244 htcaps.add('[HT40-]') |
| 245 htcaps.add('[HT40+]') |
| 246 conf['wmm_enabled'] = 1 |
| 247 elif k == 'shortgi': |
| 248 htcaps.add('[SHORT-GI-20]') |
| 249 htcaps.add('[SHORT-GI-40]') |
| 250 elif k == 'pureg': |
| 251 pass # TODO(sleffler) need hostapd support |
| 252 elif k == 'puren': |
| 253 pass # TODO(sleffler) need hostapd support |
| 254 elif k == 'protmode': |
| 255 pass # TODO(sleffler) need hostapd support |
| 256 elif k == 'ht': |
| 257 htcaps.add('') # NB: ensure 802.11n setup below |
| 258 elif k == 'htprotmode': |
| 259 pass # TODO(sleffler) need hostapd support |
| 260 elif k == 'rifs': |
| 261 pass # TODO(sleffler) need hostapd support |
| 262 elif k == 'wepmode': |
| 263 pass # NB: meaningless for hostapd; ignore |
| 264 elif k == '-ampdu': |
| 265 pass # TODO(sleffler) need hostapd support |
| 266 elif k == 'txpower': |
| 267 tx_power_params['power'] = v |
| 268 else: |
| 269 conf[k] = v |
| 270 |
| 271 # Aggregate ht_capab. |
| 272 if htcaps: |
| 273 conf['ieee80211n'] = 1 |
| 274 conf['ht_capab'] = ''.join(htcaps) |
| 275 |
| 276 # Figure out the correct interface. |
| 277 if conf.get('hw_mode', 'b') == 'a': |
| 278 conf['interface'] = self.wlanif5 |
| 279 else: |
| 280 conf['interface'] = self.wlanif2 |
| 281 |
| 282 # Generate hostapd.conf. |
| 283 self.router.run("cat <<EOF >%s\n%s\nEOF\n" % |
| 284 (self.hostapd['file'], '\n'.join( |
| 285 "%s=%s" % kv for kv in conf.iteritems()))) |
| 286 |
| 287 if not multi_interface: |
| 288 logging.info("Initializing bridge...") |
| 289 self.router.run("%s addbr %s" % |
| 290 (self.cmd_brctl, self.bridgeif)) |
| 291 self.router.run("%s setfd %s %d" % |
| 292 (self.cmd_brctl, self.bridgeif, 0)) |
| 293 self.router.run("%s stp %s %d" % |
| 294 (self.cmd_brctl, self.bridgeif, 0)) |
| 295 |
| 296 # Run hostapd. |
| 297 logging.info("Starting hostapd...") |
| 298 self.router.run("%s -B %s" % |
| 299 (self.cmd_hostapd, self.hostapd['file'])) |
| 300 |
| 301 |
| 302 # Set up the bridge. |
| 303 if not multi_interface: |
| 304 logging.info("Setting up the bridge...") |
| 305 self.router.run("%s addif %s %s" % |
| 306 (self.cmd_brctl, self.bridgeif, self.wiredif)) |
| 307 self.router.run("%s link set %s up" % |
| 308 (self.cmd_ip, self.wiredif)) |
| 309 self.router.run("%s link set %s up" % |
| 310 (self.cmd_ip, self.bridgeif)) |
| 311 self.hostapd['interface'] = conf['interface'] |
| 312 else: |
| 313 tx_power_params['interface'] = conf['interface'] |
| 314 |
| 315 # Configure transmit power |
| 316 self.set_txpower(tx_power_params) |
| 317 |
| 318 logging.info("AP configured.") |
| 319 |
| 320 self.hostapd['configured'] = True |
| 321 |
| 322 |
| 323 def station_config(self, params): |
| 324 multi_interface = 'multi_interface' in params |
| 325 if multi_interface: |
| 326 params.pop('multi_interface') |
| 327 elif self.station['configured'] or self.hostapd['configured']: |
| 328 self.deconfig({}) |
| 329 |
| 330 interface = self.wlanif2 |
| 331 conf = self.station['conf'] |
| 332 for k, v in params.iteritems(): |
| 333 if k == 'ssid_suffix': |
| 334 conf['ssid'] = self.defssid + v |
| 335 elif k == 'channel': |
| 336 freq = int(v) |
| 337 if freq > 2484: |
| 338 interface = self.wlanif5 |
| 339 elif k == 'mode': |
| 340 if v == '11a': |
| 341 interface = self.wlanif5 |
| 342 else: |
| 343 conf[k] = v |
| 344 |
| 345 if not multi_interface: |
| 346 logging.info("Initializing bridge...") |
| 347 self.router.run("%s addbr %s" % |
| 348 (self.cmd_brctl, self.bridgeif)) |
| 349 self.router.run("%s setfd %s %d" % |
| 350 (self.cmd_brctl, self.bridgeif, 0)) |
| 351 self.router.run("%s stp %s %d" % |
| 352 (self.cmd_brctl, self.bridgeif, 0)) |
| 353 |
| 354 # Run interface configuration commands |
| 355 for k, v in conf.iteritems(): |
| 356 if k != 'ssid': |
| 357 self.router.run("%s dev %s set %s %s" % |
| 358 (self.cmd_iw, interface, k, v)) |
| 359 |
| 360 # Connect the station |
| 361 self.router.run("%s link set %s up" % (self.cmd_ip, interface)) |
| 362 connect_cmd = ('ibss join' if self.station['type'] == 'ibss' |
| 363 else 'connect') |
| 364 self.router.run("%s dev %s %s %s %d" % |
| 365 (self.cmd_iw, interface, connect_cmd, |
| 366 conf['ssid'], freq)) |
| 367 |
| 368 # Add wireless interface to the bridge |
| 369 self.router.run("%s addif %s %s" % |
| 370 (self.cmd_brctl, self.bridgeif, interface)) |
| 371 |
| 372 # Add interface to the bridge. |
| 373 # Bring up the bridge |
| 374 if not multi_interface: |
| 375 logging.info("Setting up the bridge...") |
| 376 self.router.run("%s addif %s %s" % |
| 377 (self.cmd_brctl, self.bridgeif, self.wiredif)) |
| 378 self.router.run("%s link set %s up" % |
| 379 (self.cmd_ip, self.wiredif)) |
| 380 self.router.run("%s link set %s up" % |
| 381 (self.cmd_ip, self.bridgeif)) |
| 382 |
| 383 self.station['configured'] = True |
| 384 self.station['interface'] = interface |
| 385 |
| 386 |
| 387 def config(self, params): |
158 if self.apmode: | 388 if self.apmode: |
159 # Construct the hostapd.conf file and start hostapd. | 389 self.hostap_config(params) |
160 conf = self.hostapd['conf'] | 390 else: |
161 tx_power_params = {} | 391 self.station_config(params) |
162 htcaps = set() | |
163 | |
164 conf['driver'] = params.get('hostapd_driver', | |
165 self.hostapd['driver']) | |
166 | |
167 for k, v in params.iteritems(): | |
168 if k == 'ssid': | |
169 conf['ssid'] = v | |
170 elif k == 'ssid_suffix': | |
171 conf['ssid'] = self.defssid + v | |
172 elif k == 'channel': | |
173 freq = int(v) | |
174 | |
175 # 2.4GHz | |
176 if freq <= 2484: | |
177 # Make sure hw_mode is set | |
178 if conf.get('hw_mode') == 'a': | |
179 conf['hw_mode'] = 'g' | |
180 | |
181 # Freq = 5 * chan + 2407, except channel 14 | |
182 if freq == 2484: | |
183 conf['channel'] = 14 | |
184 else: | |
185 conf['channel'] = (freq - 2407) / 5 | |
186 # 5GHz | |
187 else: | |
188 # Make sure hw_mode is set | |
189 conf['hw_mode'] = 'a' | |
190 # Freq = 5 * chan + 4000 | |
191 if freq < 5000: | |
192 conf['channel'] = (freq - 4000) / 5 | |
193 # Freq = 5 * chan + 5000 | |
194 else: | |
195 conf['channel'] = (freq - 5000) / 5 | |
196 | |
197 elif k == 'country': | |
198 conf['country_code'] = v | |
199 elif k == 'dotd': | |
200 conf['ieee80211d'] = 1 | |
201 elif k == '-dotd': | |
202 conf['ieee80211d'] = 0 | |
203 elif k == 'mode': | |
204 if v == '11a': | |
205 conf['hw_mode'] = 'a' | |
206 elif v == '11g': | |
207 conf['hw_mode'] = 'g' | |
208 elif v == '11b': | |
209 conf['hw_mode'] = 'b' | |
210 elif v == '11n': | |
211 conf['ieee80211n'] = 1 | |
212 elif k == 'bintval': | |
213 conf['beacon_int'] = v | |
214 elif k == 'dtimperiod': | |
215 conf['dtim_period'] = v | |
216 elif k == 'rtsthreshold': | |
217 conf['rts_threshold'] = v | |
218 elif k == 'fragthreshold': | |
219 conf['fragm_threshold'] = v | |
220 elif k == 'shortpreamble': | |
221 conf['preamble'] = 1 | |
222 elif k == 'authmode': | |
223 if v == "open": | |
224 conf['auth_algs'] = 1 | |
225 elif v == "shared": | |
226 conf['auth_algs'] = 2 | |
227 elif k == 'hidessid': | |
228 conf['ignore_broadcast_ssid'] = 1 | |
229 elif k == 'wme': | |
230 conf['wmm_enabled'] = 1 | |
231 elif k == '-wme': | |
232 conf['wmm_enabled'] = 0 | |
233 elif k == 'deftxkey': | |
234 conf['wep_default_key'] = v | |
235 elif k == 'ht20': | |
236 htcaps.add('') # NB: ensure 802.11n setup below | |
237 conf['wmm_enabled'] = 1 | |
238 elif k == 'ht40': | |
239 htcaps.add('[HT40-]') | |
240 htcaps.add('[HT40+]') | |
241 conf['wmm_enabled'] = 1 | |
242 elif k == 'shortgi': | |
243 htcaps.add('[SHORT-GI-20]') | |
244 htcaps.add('[SHORT-GI-40]') | |
245 elif k == 'pureg': | |
246 pass # TODO(sleffler) need hostapd support | |
247 elif k == 'puren': | |
248 pass # TODO(sleffler) need hostapd support | |
249 elif k == 'protmode': | |
250 pass # TODO(sleffler) need hostapd support | |
251 elif k == 'ht': | |
252 htcaps.add('') # NB: ensure 802.11n setup below | |
253 elif k == 'htprotmode': | |
254 pass # TODO(sleffler) need hostapd support | |
255 elif k == 'rifs': | |
256 pass # TODO(sleffler) need hostapd support | |
257 elif k == 'wepmode': | |
258 pass # NB: meaningless for hostapd; ignore | |
259 elif k == '-ampdu': | |
260 pass # TODO(sleffler) need hostapd support | |
261 elif k == 'txpower': | |
262 tx_power_params['power'] = v | |
263 else: | |
264 conf[k] = v | |
265 | |
266 # Aggregate ht_capab. | |
267 if htcaps: | |
268 conf['ieee80211n'] = 1 | |
269 conf['ht_capab'] = ''.join(htcaps) | |
270 | |
271 # Figure out the correct interface. | |
272 if conf.get('hw_mode', 'b') == 'a': | |
273 conf['interface'] = self.wlanif5 | |
274 else: | |
275 conf['interface'] = self.wlanif2 | |
276 | |
277 # Generate hostapd.conf. | |
278 self.router.run("cat <<EOF >%s\n%s\nEOF\n" % | |
279 (self.hostapd['file'], '\n'.join( | |
280 "%s=%s" % kv for kv in conf.iteritems()))) | |
281 | |
282 if not multi_interface: | |
283 logging.info("Initializing bridge...") | |
284 self.router.run("%s addbr %s" % | |
285 (self.cmd_brctl, self.bridgeif)) | |
286 self.router.run("%s setfd %s %d" % | |
287 (self.cmd_brctl, self.bridgeif, 0)) | |
288 self.router.run("%s stp %s %d" % | |
289 (self.cmd_brctl, self.bridgeif, 0)) | |
290 | |
291 # Run hostapd. | |
292 logging.info("Starting hostapd...") | |
293 self.router.run("%s -B %s" % | |
294 (self.cmd_hostapd, self.hostapd['file'])) | |
295 | |
296 | |
297 # Set up the bridge. | |
298 if not multi_interface: | |
299 logging.info("Setting up the bridge...") | |
300 self.router.run("%s addif %s %s" % | |
301 (self.cmd_brctl, self.bridgeif, self.wiredif)) | |
302 self.router.run("%s link set %s up" % | |
303 (self.cmd_ip, self.wiredif)) | |
304 self.router.run("%s link set %s up" % | |
305 (self.cmd_ip, self.bridgeif)) | |
306 self.hostapd['interface'] = conf['interface'] | |
307 else: | |
308 tx_power_params['interface'] = conf['interface'] | |
309 | |
310 # Configure transmit power | |
311 self.set_txpower(tx_power_params) | |
312 | |
313 logging.info("AP configured.") | |
314 | |
315 # else: | |
316 # # use iw to manually configure interface | |
317 | |
318 self.hostapd['configured'] = True | |
319 | 392 |
320 | 393 |
321 def deconfig(self, params): | 394 def deconfig(self, params): |
322 """ De-configure the AP (will also bring wlan and the bridge down) """ | 395 """ De-configure the AP (will also bring wlan and the bridge down) """ |
323 | 396 |
324 if not self.hostapd['configured']: | 397 if not self.hostapd['configured'] and not self.station['configured']: |
325 return | 398 return |
326 | 399 |
327 # Taking down hostapd takes wlan0 and mon.wlan0 down. | 400 # Taking down hostapd takes wlan0 and mon.wlan0 down. |
328 self.router.run("pkill hostapd >/dev/null 2>&1", ignore_status=True) | 401 if self.hostapd['configured']: |
329 # self.router.run("rm -f %s" % self.hostapd['file']) | 402 self.router.run("pkill hostapd >/dev/null 2>&1", ignore_status=True) |
| 403 # self.router.run("rm -f %s" % self.hostapd['file']) |
| 404 if self.station['configured']: |
| 405 if self.station['type'] == 'ibss': |
| 406 self.router.run("%s dev %s ibss leave" % |
| 407 (self.cmd_iw, self.station['interface'])) |
| 408 else: |
| 409 self.router.run("%s dev %s disconnect" % |
| 410 (self.cmd_iw, self.station['interface'])) |
| 411 self.router.run("%s link set %s down" % (self.cmd_ip, |
| 412 self.station['interface'])) |
330 | 413 |
331 # Try a couple times to remove the bridge; hostapd may still be exiting | 414 # Try a couple times to remove the bridge; hostapd may still be exiting |
332 for attempt in range(3): | 415 for attempt in range(3): |
333 self.router.run("%s link set %s down" % | 416 self.router.run("%s link set %s down" % |
334 (self.cmd_ip, self.bridgeif), ignore_status=True) | 417 (self.cmd_ip, self.bridgeif), ignore_status=True) |
335 | 418 |
336 result = self.router.run("%s delbr %s" % | 419 result = self.router.run("%s delbr %s" % |
337 (self.cmd_brctl, self.bridgeif), | 420 (self.cmd_brctl, self.bridgeif), |
338 ignore_status=True) | 421 ignore_status=True) |
339 if not result.stderr or 'No such device' in result.stderr: | 422 if not result.stderr or 'No such device' in result.stderr: |
340 break | 423 break |
341 time.sleep(1) | 424 time.sleep(1) |
342 else: | 425 else: |
343 raise error.TestFail("Unable to delete bridge %s: %s" % | 426 raise error.TestFail("Unable to delete bridge %s: %s" % |
344 (self.bridgeif, result.stderr)) | 427 (self.bridgeif, result.stderr)) |
345 | 428 |
346 | 429 |
347 self.hostapd['configured'] = False | 430 self.hostapd['configured'] = False |
| 431 self.station['configured'] = False |
348 | 432 |
349 | 433 |
350 def get_ssid(self): | 434 def get_ssid(self): |
351 return self.hostapd['conf']['ssid'] | 435 return self.hostapd['conf']['ssid'] |
352 | 436 |
353 | 437 |
354 def set_txpower(self, params): | 438 def set_txpower(self, params): |
355 self.router.run("%s dev %s set txpower %s" % | 439 self.router.run("%s dev %s set txpower %s" % |
356 (self.cmd_iw, params.get('interface', | 440 (self.cmd_iw, params.get('interface', |
357 self.hostapd['interface']), | 441 self.hostapd['interface']), |
358 params.get('power', 'auto'))) | 442 params.get('power', 'auto'))) |
OLD | NEW |