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 | 5 import logging, re |
| 6 from autotest_lib.client.common_lib import error |
6 | 7 |
7 def isLinuxRouter(router): | 8 def isLinuxRouter(router): |
8 router_uname = router.run('uname').stdout | 9 router_uname = router.run('uname').stdout |
9 return re.search('Linux', router_uname) | 10 return re.search('Linux', router_uname) |
10 | 11 |
11 class LinuxRouter(object): | 12 class LinuxRouter(object): |
12 """ | 13 """ |
13 Linux/mac80211-style WiFi Router support for WiFiTest class. | 14 Linux/mac80211-style WiFi Router support for WiFiTest class. |
14 | 15 |
15 This class implements test methods/steps that communicate with a | 16 This class implements test methods/steps that communicate with a |
16 router implemented with Linux/mac80211. The router must | 17 router implemented with Linux/mac80211. The router must |
17 be pre-configured to enable ssh access and have a mac80211-based | 18 be pre-configured to enable ssh access and have a mac80211-based |
18 wireless device. We also assume hostapd 0.7.x and iw are present | 19 wireless device. We also assume hostapd 0.7.x and iw are present |
19 and any necessary modules are pre-loaded. | 20 and any necessary modules are pre-loaded. |
20 """ | 21 """ |
21 | 22 |
22 | 23 |
23 def __init__(self, host, params, defssid): | 24 def __init__(self, host, params, defssid): |
24 # Command locations. | 25 # Command locations. |
25 self.cmd_iw = "/usr/sbin/iw" | 26 self.cmd_iw = "/usr/sbin/iw" |
26 self.cmd_ip = "/usr/sbin/ip" | 27 self.cmd_ip = "/usr/sbin/ip" |
27 self.cmd_brctl = "/usr/sbin/brctl" | 28 self.cmd_brctl = "/usr/sbin/brctl" |
28 self.cmd_hostapd = "/usr/sbin/hostapd" | 29 self.cmd_hostapd = "/usr/sbin/hostapd" |
29 | 30 |
30 # Router host. | 31 # Router host. |
31 self.router = host | 32 self.router = host |
32 | 33 |
33 # Network interfaces. | 34 # Network interfaces. |
34 self.bridgeif = params.get('bridgedev', "br-lan") | 35 self.bridgeif = params.get('bridgedev', "br-lan") |
35 self.wiredif = params.get('wiredev', "eth1") | 36 self.wiredif = params.get('wiredev', "eth0") |
36 self.wlanif2 = "wlan2" | 37 self.wlanif2 = "wlan2" |
37 self.wlanif5 = "wlan5" | 38 self.wlanif5 = "wlan5" |
38 | 39 |
39 # Default to 1st available wireless phy. | 40 # Parse the output of 'iw phy' and find a device for each frequency |
40 if "phydev2" not in params: | 41 if "phydev2" not in params: |
41 output = self.router.run("%s list" % self.cmd_iw).stdout | 42 output = self.router.run("%s list" % self.cmd_iw).stdout |
42 test = re.compile("Wiphy (.*)") | 43 re_wiphy = re.compile("Wiphy (.*)") |
| 44 re_mhz = re.compile("(\d+) MHz") |
| 45 in_phy = False |
| 46 self.phydev2 = None |
| 47 self.phydev5 = None |
43 for line in output.splitlines(): | 48 for line in output.splitlines(): |
44 m = test.match(line) | 49 match_wiphy = re_wiphy.match(line) |
45 if m: | 50 if match_wiphy: |
46 self.phydev2 = m.group(1) | 51 in_phy = True |
47 self.phydev5 = self.phydev2 | 52 widevname = match_wiphy.group(1) |
48 break | 53 elif in_phy: |
| 54 if line[0] == '\t': |
| 55 match_mhz = re_mhz.search(line) |
| 56 if match_mhz: |
| 57 mhz = int(match_mhz.group(1)) |
| 58 if self.phydev2 is None and \ |
| 59 mhz in range(2402,2472,5): |
| 60 self.phydev2 = widevname |
| 61 elif self.phydev5 is None and \ |
| 62 mhz in range(5100,6000,20): |
| 63 self.phydev5 = widevname |
| 64 if None not in (self.phydev2, self.phydev5): |
| 65 break |
| 66 else: |
| 67 in_phy = False |
49 else: | 68 else: |
50 raise error.TestFail("No Wireless NIC detected on the device") | 69 raise error.TestFail("No Wireless NIC detected on the device") |
51 else: | 70 else: |
52 self.phydev2 = params['phydev2'] | 71 self.phydev2 = params['phydev2'] |
53 self.phydev5 = params.get('phydev5', self.phydev2) | 72 self.phydev5 = params.get('phydev5', self.phydev2) |
54 | 73 |
55 | 74 |
56 # hostapd configuration persists throughout the test, subsequent | 75 # hostapd configuration persists throughout the test, subsequent |
57 # 'config' commands only modify it. | 76 # 'config' commands only modify it. |
58 self.defssid = defssid | 77 self.defssid = defssid |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 self.router.run("%s link set %s down" % (self.cmd_ip, self.bridgeif), | 312 self.router.run("%s link set %s down" % (self.cmd_ip, self.bridgeif), |
294 ignore_status=True) | 313 ignore_status=True) |
295 self.router.run("%s delbr %s" % (self.cmd_brctl, self.bridgeif), | 314 self.router.run("%s delbr %s" % (self.cmd_brctl, self.bridgeif), |
296 ignore_status=True) | 315 ignore_status=True) |
297 | 316 |
298 self.hostapd['configured'] = False | 317 self.hostapd['configured'] = False |
299 | 318 |
300 | 319 |
301 def get_ssid(self): | 320 def get_ssid(self): |
302 return self.hostapd['conf']['ssid'] | 321 return self.hostapd['conf']['ssid'] |
OLD | NEW |