blob: ee4e880e19f73ee29c9e3b1210cc8722181a63f5 [file] [log] [blame] [edit]
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros.network import iw_runner
from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
from autotest_lib.server.cros.network import hostap_config
from autotest_lib.server.cros.network import wifi_cell_test_base
class network_WiFi_ChannelHop(wifi_cell_test_base.WiFiCellTestBase):
"""Tests roaming when an AP changes channels on an SSID."""
version = 1
ORIGINAL_FREQUENCY = 2412
ORIGINAL_BSSID = "00:01:02:03:04:05"
def run_once(self):
"""Test body."""
freq = network_WiFi_ChannelHop.ORIGINAL_FREQUENCY
ssid = self.context.router.build_unique_ssid()
ap_config = hostap_config.HostapConfig(
ssid=ssid,
frequency=freq,
mode=hostap_config.HostapConfig.MODE_11B,
bssid=network_WiFi_ChannelHop.ORIGINAL_BSSID)
self.context.configure(ap_config)
assoc_params = xmlrpc_datatypes.AssociationParameters(
ssid=self.context.router.get_ssid())
self.context.assert_connect_wifi(assoc_params)
self.context.assert_ping_from_dut()
self.context.client.check_iw_link_value(
iw_runner.IW_LINK_KEY_FREQUENCY,
freq)
self.context.router.deconfig()
# This checks both channel jumping on the same BSSID and channel
# jumping between BSSIDs, all inside the same SSID.
for freq, bssid in ((2437, network_WiFi_ChannelHop.ORIGINAL_BSSID),
(2462, network_WiFi_ChannelHop.ORIGINAL_BSSID),
(2422, "06:07:08:09:0a:0b"),
(2447, "0c:0d:0e:0f:10:11")):
# Wait for the disconnect to happen.
success, state, elapsed_seconds = \
self.context.client.wait_for_service_states(ssid,
['idle'], 30)
# Change channels on the AP. This happens in full view of the DUT
# and the AP deauths everyone as it exits.
ap_config = hostap_config.HostapConfig(
ssid=ssid,
frequency=freq,
mode=hostap_config.HostapConfig.MODE_11B,
bssid=bssid)
self.context.configure(ap_config)
# Wait for the DUT to scan and acquire the AP at the new
# frequency.
success, state, elapsed_seconds = \
self.context.client.wait_for_service_states(ssid,
self.context.client.CONNECTED_STATES, 30)
if not success:
raise error.TestFail(
'Failed to connect to "%s" in %f seconds (state=%s)' %
(ssid, elapsed_seconds, state))
# Verify that we're connected.
self.context.assert_ping_from_dut()
# Verify that the client switched to new frequency
self.context.client.check_iw_link_value(
iw_runner.IW_LINK_KEY_FREQUENCY,
freq)
self.context.router.deconfig()