diff options
Diffstat (limited to 'smoketest/scripts/cli/test_interfaces_wireless.py')
| -rwxr-xr-x | smoketest/scripts/cli/test_interfaces_wireless.py | 174 | 
1 files changed, 143 insertions, 31 deletions
| diff --git a/smoketest/scripts/cli/test_interfaces_wireless.py b/smoketest/scripts/cli/test_interfaces_wireless.py index 5ade36e7d..7bfe0d221 100755 --- a/smoketest/scripts/cli/test_interfaces_wireless.py +++ b/smoketest/scripts/cli/test_interfaces_wireless.py @@ -22,9 +22,11 @@ from base_interfaces_test import BasicInterfaceTest  from glob import glob  from vyos.configsession import ConfigSessionError -from vyos.utils.process import process_named_running -from vyos.utils.kernel import check_kmod  from vyos.utils.file import read_file +from vyos.utils.kernel import check_kmod +from vyos.utils.network import interface_exists +from vyos.utils.process import process_named_running +from vyos.utils.process import call  from vyos.xml_ref import default_value  def get_config_value(interface, key): @@ -32,19 +34,31 @@ def get_config_value(interface, key):      tmp = re.findall(f'{key}=+(.*)', tmp)      return tmp[0] +wifi_cc_path = ['system', 'wireless', 'country-code'] +country = 'se'  class WirelessInterfaceTest(BasicInterfaceTest.TestCase):      @classmethod      def setUpClass(cls):          cls._base_path = ['interfaces', 'wireless']          cls._options = { -            'wlan0':  ['physical-device phy0', 'ssid VyOS-WIFI-0', -                       'type station', 'address 192.0.2.1/30'], -            'wlan1':  ['physical-device phy0', 'ssid VyOS-WIFI-1', 'country-code se', -                       'type access-point', 'address 192.0.2.5/30', 'channel 0'], -            'wlan10': ['physical-device phy1', 'ssid VyOS-WIFI-2', -                       'type station', 'address 192.0.2.9/30'], -            'wlan11': ['physical-device phy1', 'ssid VyOS-WIFI-3', 'country-code se', -                       'type access-point', 'address 192.0.2.13/30', 'channel 0'], +            'wlan0':  ['physical-device phy0', +                       'ssid VyOS-WIFI-0', +                       'type station', +                       'address 192.0.2.1/30'], +            'wlan1':  ['physical-device phy0', +                       'ssid VyOS-WIFI-1', +                       'type access-point', +                       'address 192.0.2.5/30', +                       'channel 0'], +            'wlan10': ['physical-device phy1', +                       'ssid VyOS-WIFI-2', +                       'type station', +                       'address 192.0.2.9/30'], +            'wlan11': ['physical-device phy1', +                       'ssid VyOS-WIFI-3', +                       'type access-point', +                       'address 192.0.2.13/30', +                       'channel 0'],          }          cls._interfaces = list(cls._options)          # call base-classes classmethod @@ -54,6 +68,9 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):          cls._test_ipv6 = False          cls._test_vlan = False +        cls.cli_set(cls, wifi_cc_path + [country]) + +      def test_wireless_add_single_ip_address(self):          # derived method to check if member interfaces are enslaved properly          super().test_add_single_ip_address() @@ -70,11 +87,10 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):      def test_wireless_hostapd_config(self):          # Only set the hostapd (access-point) options -        interface = 'wlan0' +        interface = self._interfaces[1] # wlan1          ssid = 'ssid'          self.cli_set(self._base_path + [interface, 'ssid', ssid]) -        self.cli_set(self._base_path + [interface, 'country-code', 'se'])          self.cli_set(self._base_path + [interface, 'type', 'access-point'])          # auto-powersave is special @@ -148,7 +164,7 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):      def test_wireless_hostapd_vht_mu_beamformer_config(self):          # Multi-User-Beamformer -        interface = 'wlan1' +        interface = self._interfaces[1] # wlan1          ssid = 'vht_mu-beamformer'          antennas = '3' @@ -217,7 +233,7 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):      def test_wireless_hostapd_vht_su_beamformer_config(self):          # Single-User-Beamformer -        interface = 'wlan1' +        interface = self._interfaces[1] # wlan1          ssid = 'vht_su-beamformer'          antennas = '3' @@ -284,34 +300,115 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):          for key, value in vht_opt.items():              self.assertIn(value, tmp) +    def test_wireless_hostapd_he_config(self): +        # Only set the hostapd (access-point) options - HE mode for 802.11ax at 6GHz +        interface = self._interfaces[1] # wlan1 +        ssid = 'ssid' +        channel = '1' +        sae_pw = 'VyOSVyOSVyOS' +        bss_color = '37' +        channel_set_width = '134' +        center_channel_freq_1 = '15' + +        self.cli_set(self._base_path + [interface, 'ssid', ssid]) +        self.cli_set(self._base_path + [interface, 'type', 'access-point']) +        self.cli_set(self._base_path + [interface, 'channel', channel]) +        self.cli_set(self._base_path + [interface, 'mode', 'ax']) +        self.cli_set(self._base_path + [interface, 'security', 'wpa', 'mode', 'wpa3']) +        self.cli_set(self._base_path + [interface, 'security', 'wpa', 'passphrase', sae_pw]) +        self.cli_set(self._base_path + [interface, 'security', 'wpa', 'cipher', 'CCMP']) +        self.cli_set(self._base_path + [interface, 'security', 'wpa', 'cipher', 'GCMP']) +        self.cli_set(self._base_path + [interface, 'enable-bf-protection']) +        self.cli_set(self._base_path + [interface, 'mgmt-frame-protection', 'required']) +        self.cli_set(self._base_path + [interface, 'capabilities', 'he', 'bss-color', bss_color]) +        self.cli_set(self._base_path + [interface, 'capabilities', 'he', 'channel-set-width', channel_set_width]) +        self.cli_set(self._base_path + [interface, 'capabilities', 'he', 'center-channel-freq', 'freq-1', center_channel_freq_1]) +        self.cli_set(self._base_path + [interface, 'capabilities', 'he', 'beamform', 'multi-user-beamformer']) +        self.cli_set(self._base_path + [interface, 'capabilities', 'he', 'beamform', 'single-user-beamformer']) + +        self.cli_commit() + +        # +        # Validate Config +        # +        tmp = get_config_value(interface, 'interface') +        self.assertEqual(interface, tmp) + +        # ssid +        tmp = get_config_value(interface, 'ssid') +        self.assertEqual(ssid, tmp) + +        # mode of operation resulting from [interface, 'mode', 'ax'] +        tmp = get_config_value(interface, 'hw_mode') +        self.assertEqual('a', tmp) +        tmp = get_config_value(interface, 'ieee80211h') +        self.assertEqual('1', tmp) +        tmp = get_config_value(interface, 'ieee80211ax') +        self.assertEqual('1', tmp) + +        # channel and channel width +        tmp = get_config_value(interface, 'channel') +        self.assertEqual(channel, tmp) +        tmp = get_config_value(interface, 'op_class') +        self.assertEqual(channel_set_width, tmp) +        tmp = get_config_value(interface, 'he_oper_centr_freq_seg0_idx') +        self.assertEqual(center_channel_freq_1, tmp) + +        # BSS coloring +        tmp = get_config_value(interface, 'he_bss_color') +        self.assertEqual(bss_color, tmp) + +        # sae_password +        tmp = get_config_value(interface, 'sae_password') +        self.assertEqual(sae_pw, tmp) + +        # WPA3 and dependencies +        tmp = get_config_value(interface, 'wpa') +        self.assertEqual('2', tmp) +        tmp = get_config_value(interface, 'rsn_pairwise') +        self.assertEqual('CCMP GCMP', tmp) +        tmp = get_config_value(interface, 'wpa_key_mgmt') +        self.assertEqual('SAE', tmp) + +        # beamforming +        tmp = get_config_value(interface, 'he_mu_beamformer') +        self.assertEqual('1', tmp) +        tmp = get_config_value(interface, 'he_su_beamformee') +        self.assertEqual('0', tmp) +        tmp = get_config_value(interface, 'he_mu_beamformer') +        self.assertEqual('1', tmp) + +        # Check for running process +        self.assertTrue(process_named_running('hostapd')) +      def test_wireless_hostapd_wpa_config(self):          # Only set the hostapd (access-point) options -        interface = 'wlan0' -        phy = 'phy0' -        ssid = 'ssid' +        interface = self._interfaces[1] # wlan1 +        ssid = 'VyOS-SMOKETEST'          channel = '1'          wpa_key = 'VyOSVyOSVyOS'          mode = 'n' -        country = 'de' -        self.cli_set(self._base_path + [interface, 'physical-device', phy])          self.cli_set(self._base_path + [interface, 'type', 'access-point'])          self.cli_set(self._base_path + [interface, 'mode', mode]) -        # SSID must be set -        with self.assertRaises(ConfigSessionError): -            self.cli_commit() -        self.cli_set(self._base_path + [interface, 'ssid', ssid]) +        # SSID and country-code are already configured in self.setUpClass() +        # Therefore, we must delete those here to check if commit will fail without it. +        self.cli_delete(wifi_cc_path) +        self.cli_delete(self._base_path + [interface, 'ssid']) -        # Channel must be set +        # Country-Code must be set          with self.assertRaises(ConfigSessionError):              self.cli_commit() -        self.cli_set(self._base_path + [interface, 'channel', channel]) +        self.cli_set(wifi_cc_path + [country]) -        # Country-Code must be set +        # SSID must be set          with self.assertRaises(ConfigSessionError):              self.cli_commit() -        self.cli_set(self._base_path + [interface, 'country-code', country]) +        self.cli_set(self._base_path + [interface, 'ssid', ssid]) + +        # Channel must be set (defaults to channel 0) +        self.cli_set(self._base_path + [interface, 'channel', channel])          self.cli_set(self._base_path + [interface, 'security', 'wpa', 'mode', 'wpa2'])          self.cli_set(self._base_path + [interface, 'security', 'wpa', 'passphrase', wpa_key]) @@ -351,7 +448,7 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):          self.assertTrue(process_named_running('hostapd'))      def test_wireless_access_point_bridge(self): -        interface = 'wlan0' +        interface = self._interfaces[1] # wlan1          ssid = 'VyOS-Test'          bridge = 'br42477' @@ -360,8 +457,8 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):          self.cli_set(bridge_path + ['member', 'interface', interface])          self.cli_set(self._base_path + [interface, 'ssid', ssid]) -        self.cli_set(self._base_path + [interface, 'country-code', 'se'])          self.cli_set(self._base_path + [interface, 'type', 'access-point']) +        self.cli_set(self._base_path + [interface, 'channel', '1'])          self.cli_commit() @@ -388,7 +485,7 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):          self.cli_delete(bridge_path)      def test_wireless_security_station_address(self): -        interface = 'wlan0' +        interface = self._interfaces[1] # wlan1          ssid = 'VyOS-ACL'          hostapd_accept_station_conf = f'/run/hostapd/{interface}_station_accept.conf' @@ -398,7 +495,6 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):          deny_mac = ['00:00:00:00:de:01', '00:00:00:00:de:02', '00:00:00:00:de:03', '00:00:00:00:de:04']          self.cli_set(self._base_path + [interface, 'ssid', ssid]) -        self.cli_set(self._base_path + [interface, 'country-code', 'se'])          self.cli_set(self._base_path + [interface, 'type', 'access-point'])          self.cli_set(self._base_path + [interface, 'security', 'station-address', 'mode', 'accept']) @@ -409,6 +505,12 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):          self.cli_commit() +        self.assertTrue(interface_exists(interface)) +        self.assertTrue(os.path.isfile(f'/run/hostapd/{interface}_station_accept.conf')) +        self.assertTrue(os.path.isfile(f'/run/hostapd/{interface}_station_deny.conf')) + +        self.assertTrue(process_named_running('hostapd')) +          # in accept mode all addresses are allowed unless specified in the deny list          tmp = get_config_value(interface, 'macaddr_acl')          self.assertEqual(tmp, '0') @@ -424,6 +526,11 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):          #  Switch mode accept -> deny          self.cli_set(self._base_path + [interface, 'security', 'station-address', 'mode', 'deny'])          self.cli_commit() + +        self.assertTrue(interface_exists(interface)) +        self.assertTrue(os.path.isfile(f'/run/hostapd/{interface}_station_accept.conf')) +        self.assertTrue(os.path.isfile(f'/run/hostapd/{interface}_station_deny.conf')) +          # In deny mode all addresses are denied unless specified in the allow list          tmp = get_config_value(interface, 'macaddr_acl')          self.assertEqual(tmp, '1') @@ -433,4 +540,9 @@ class WirelessInterfaceTest(BasicInterfaceTest.TestCase):  if __name__ == '__main__':      check_kmod('mac80211_hwsim') +    # loading the module created two WIFI Interfaces in the background (wlan0 and wlan1) +    # remove them to have a clean test start +    for interface in ['wlan0', 'wlan1']: +        if interface_exists(interface): +            call(f'sudo iw dev {interface} del')      unittest.main(verbosity=2) | 
