Home | History | Annotate | Download | only in network_WiFi_RegDomain
      1 # Copyright (c) 2015 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 AUTHOR = 'pstew, quiche'
      6 NAME = 'network_WiFi_RegDomain'
      7 TIME = 'MEDIUM'
      8 TEST_TYPE = 'Server'
      9 ATTRIBUTES = "suite:wifi_matfunc_bcm4356"
     10 DEPENDENCIES = 'wificell'
     11 
     12 DOC = """
     13 This test verifies that a DUT can, or cannot, connect on given
     14 channels, in given regions.
     15 
     16 This test exercises:
     17 - parsing of VPD data
     18 - mapping of VPD data to ISO country code
     19 - communication of country code from user-space to kernel
     20 - communication of country code / rules from kernel to driver
     21 - communication of country code / rules from driver to firmware
     22 
     23 This test is an aid to identify changes in behavior. It does not
     24 provide advice on regulatory requirements.
     25 """
     26 
     27 import logging
     28 
     29 from autotest_lib.client.common_lib import error
     30 from autotest_lib.client.common_lib.cros.network import interface
     31 
     32 
     33 # When adding a negative rule ('expect': 'no-connect'), be sure to add
     34 # a case with a positive rule ('expect': 'connect', or 'expect':
     35 # 'passive-scan'). Otherwise, we haven't ruled out the possibility
     36 # that the test itself prevents the DUT from connecting.
     37 #
     38 # Note:
     39 # - 'passive-scan' implies 'connect'
     40 # - 'no-connect' implies no probes
     41 DEVTYPE_TO_REGION_INFOS = {
     42     # TODO(quiche): Add ath9k expectations for channels 52 and 120.
     43     'ath9k':
     44         [
     45          # This first set of expectations is based on
     46          # ath_world_regdom_63_65 in ath/regd.c. We may need to change
     47          # or remove these, if it turns out that some DUTs have other
     48          # ath9k SKUs.
     49          {'region_name': '',
     50           'country_code': '00',
     51           'channel_infos': [
     52               {'chnum': 13, 'expect': 'passive-scan'},
     53               {'chnum': 36, 'expect': 'passive-scan'},
     54               {'chnum': 149, 'expect': 'passive-scan'}]},
     55          # Many of the 'passive-scan' expectations for the remaining
     56          # regions seem to arise from ath_world_regdom_63_65. (Or, at
     57          # least, not all of the passive scanning expectations can be
     58          # attributed to data in wireless-regdb.)
     59          {'region_name': 'ar',
     60           'country_code': 'AR',
     61           'channel_infos': [
     62               {'chnum': 13, 'expect': 'passive-scan'},
     63               {'chnum': 36, 'expect': 'passive-scan'},
     64               {'chnum': 149, 'expect': 'passive-scan'}]},
     65          {'region_name': 'id',
     66           'country_code': 'ID',
     67           'channel_infos': [
     68               {'chnum': 13, 'expect': 'passive-scan'},
     69               {'chnum': 36, 'expect': 'no-connect'},
     70               {'chnum': 149, 'expect': 'passive-scan'}]},
     71          {'region_name': 'ru',
     72           'country_code': 'RU',
     73           'channel_infos': [
     74               {'chnum': 13, 'expect': 'passive-scan'},
     75               {'chnum': 36, 'expect': 'passive-scan'},
     76               {'chnum': 149, 'expect': 'passive-scan'}]},
     77          {'region_name': 'us',
     78           'country_code': 'US',
     79           'channel_infos': [
     80               {'chnum': 13, 'expect': 'no-connect'},
     81               {'chnum': 36, 'expect': 'passive-scan'},
     82               {'chnum': 149, 'expect': 'passive-scan'}]}],
     83     'bcm435x':
     84         [{'region_name': 'ca.hybrid',  # <country code>.<extra>
     85           'country_code': 'CA',
     86           'channel_infos': [
     87               {'chnum': 13, 'expect': 'no-connect'},
     88               {'chnum': 36, 'expect': 'connect'},
     89               {'chnum': 52, 'expect': 'passive-scan'},
     90               {'chnum': 120, 'expect': 'passive-scan'},
     91               {'chnum': 149, 'expect': 'connect'},
     92               {'chnum': 165, 'expect': 'connect'}]},
     93          {'region_name': 'nordic',  # virtual set
     94           'country_code': 'SE',
     95           'channel_infos': [
     96               {'chnum': 13, 'expect': 'connect'},
     97               {'chnum': 36, 'expect': 'connect'},
     98               {'chnum': 52, 'expect': 'passive-scan'},
     99               {'chnum': 120, 'expect': 'passive-scan'},
    100               {'chnum': 149, 'expect': 'no-connect'},
    101               {'chnum': 165, 'expect': 'no-connect'}]},
    102          {'region_name': 'us',
    103           'country_code': 'US',
    104           'channel_infos': [
    105               {'chnum': 13, 'expect': 'no-connect'},
    106               {'chnum': 36, 'expect': 'connect'},
    107               {'chnum': 52, 'expect': 'passive-scan'},
    108               {'chnum': 120, 'expect': 'no-connect'},
    109               {'chnum': 149, 'expect': 'connect'},
    110               {'chnum': 165, 'expect': 'connect'}]}],
    111     'intel_wp2':
    112     # TODO(quiche): Add wp2 expectations for channels 52 and 120. If
    113     # those expectations match the (to-be-added) expectations for
    114     # ath9k, then collapse both configs into a 'cfg80211' config.
    115         [
    116          {'region_name': '',
    117           'country_code': '00',
    118           'channel_infos': [
    119               {'chnum': 13, 'expect': 'passive-scan'},
    120               {'chnum': 36, 'expect': 'passive-scan'},
    121               {'chnum': 149, 'expect': 'passive-scan'}]},
    122          # Many of the 'passive-scan' expectations seem to follow from
    123          # the initial world rules above. (Or, at least, not all of
    124          # the passive scanning expectations can be attributed to
    125          # country-speific data in wireless-regdb. We haven't
    126          # investigated if the 'passive-scan' expectations are due to
    127          # rules in the driver.)
    128          {'region_name': 'ar',
    129           'country_code': 'AR',
    130           'channel_infos': [
    131               {'chnum': 13, 'expect': 'passive-scan'},
    132               {'chnum': 36, 'expect': 'passive-scan'},
    133               {'chnum': 149, 'expect': 'passive-scan'}]},
    134          {'region_name': 'id',
    135           'country_code': 'ID',
    136           'channel_infos': [
    137               {'chnum': 13, 'expect': 'passive-scan'},
    138               {'chnum': 36, 'expect': 'no-connect'},
    139               {'chnum': 149, 'expect': 'passive-scan'}]},
    140          {'region_name': 'ru',
    141           'country_code': 'RU',
    142           'channel_infos': [
    143               {'chnum': 13, 'expect': 'passive-scan'},
    144               {'chnum': 36, 'expect': 'passive-scan'},
    145               {'chnum': 149, 'expect': 'passive-scan'}]},
    146          {'region_name': 'us',
    147           'country_code': 'US',
    148           'channel_infos': [
    149               {'chnum': 13, 'expect': 'no-connect'},
    150               {'chnum': 36, 'expect': 'passive-scan'},
    151               {'chnum': 149, 'expect': 'passive-scan'}]}]}
    152 WLAN_DEV = 'wlan0'
    153 
    154 
    155 def run(machine):
    156     host = hosts.create_host(machine)
    157     wlan_info = interface.Interface(WLAN_DEV, host=host).device_description
    158     if not wlan_info:
    159         raise error.TestFail('Couldn\'t find the WiFi device.')
    160     if wlan_info.name in (
    161         interface.NAME_ATHEROS_AR9280,
    162         interface.NAME_ATHEROS_AR9382,
    163         interface.NAME_ATHEROS_AR9462):
    164             devtype = 'ath9k'
    165     elif wlan_info.name in (
    166         interface.NAME_BROADCOM_BCM4354_SDIO,
    167         interface.NAME_BROADCOM_BCM4356_PCIE):
    168             devtype = 'bcm435x'
    169     elif wlan_info.name in (
    170         interface.NAME_INTEL_7260,
    171         interface.NAME_INTEL_7265):
    172             devtype = 'intel_wp2'
    173     else:
    174         raise error.TestNAError(
    175             'Unrecognized WiFi chip |%s|.' % wlan_info.name)
    176 
    177     logging.debug('Running test with devtype=%s', devtype)
    178     for region_info in DEVTYPE_TO_REGION_INFOS[devtype]:
    179         # Use a fresh |host| every time, as WiFiTestContextManager
    180         # cleans up |host| on context exit.
    181         host = hosts.create_host(machine)
    182         job.run_test(
    183             'network_WiFi_RegDomain',
    184             tag=region_info['region_name'] or 'default',
    185             host=host,
    186             raw_cmdline_args=args,
    187             additional_params=region_info)
    188 
    189 
    190 parallel_simple(run, machines)
    191