Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1186)

Side by Side Diff: server/site_linux_router.py

Issue 6603026: Test joining an IBSS (AdHoc) network (Closed) Base URL: http://git.chromium.org/git/autotest.git@master
Patch Set: s/iw_config/station_config/ Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | server/site_tests/network_WiFiMatFunc/011CheckIBSS » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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')))
OLDNEW
« no previous file with comments | « no previous file | server/site_tests/network_WiFiMatFunc/011CheckIBSS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698