Page Menu
Home
VyOS Platform
Search
Configure Global Search
Log In
Files
F118309604
test_interfaces_wireless.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
25 KB
Referenced Files
None
Subscribers
None
test_interfaces_wireless.py
View Options
#!/usr/bin/env python3
#
# Copyright (C) 2020-2024 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import
os
import
re
import
unittest
from
base_interfaces_test
import
BasicInterfaceTest
from
glob
import
glob
from
vyos.configsession
import
ConfigSessionError
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
):
tmp
=
read_file
(
f
'/run/hostapd/{interface}.conf'
)
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'
,
'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
super
(
WirelessInterfaceTest
,
cls
)
.
setUpClass
()
# T5245 - currently testcases are disabled
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
()
for
option
,
option_value
in
self
.
_options
.
items
():
if
'type access-point'
in
option_value
:
# Check for running process
self
.
assertTrue
(
process_named_running
(
'hostapd'
))
elif
'type station'
in
option_value
:
# Check for running process
self
.
assertTrue
(
process_named_running
(
'wpa_supplicant'
))
else
:
self
.
assertTrue
(
False
)
def
test_wireless_hostapd_config
(
self
):
# Only set the hostapd (access-point) options
interface
=
self
.
_interfaces
[
1
]
# wlan1
ssid
=
'ssid'
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'ssid'
,
ssid
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'type'
,
'access-point'
])
# auto-powersave is special
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'ht'
,
'auto-powersave'
])
ht_opt
=
{
# VyOS CLI option hostapd - ht_capab setting
'40mhz-incapable'
:
'[40-INTOLERANT]'
,
'delayed-block-ack'
:
'[DELAYED-BA]'
,
'greenfield'
:
'[GF]'
,
'ldpc'
:
'[LDPC]'
,
'lsig-protection'
:
'[LSIG-TXOP-PROT]'
,
'channel-set-width ht40+'
:
'[HT40+]'
,
'stbc tx'
:
'[TX-STBC]'
,
'stbc rx 123'
:
'[RX-STBC-123]'
,
'max-amsdu 7935'
:
'[MAX-AMSDU-7935]'
,
'smps static'
:
'[SMPS-STATIC]'
,
}
for
key
in
ht_opt
:
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'ht'
]
+
key
.
split
())
vht_opt
=
{
# VyOS CLI option hostapd - ht_capab setting
'channel-set-width 3'
:
'[VHT160-80PLUS80]'
,
'stbc tx'
:
'[TX-STBC-2BY1]'
,
'stbc rx 12'
:
'[RX-STBC-12]'
,
'ldpc'
:
'[RXLDPC]'
,
'tx-powersave'
:
'[VHT-TXOP-PS]'
,
'vht-cf'
:
'[HTC-VHT]'
,
'antenna-pattern-fixed'
:
'[RX-ANTENNA-PATTERN][TX-ANTENNA-PATTERN]'
,
'max-mpdu 11454'
:
'[MAX-MPDU-11454]'
,
'max-mpdu-exp 2'
:
'[MAX-A-MPDU-LEN-EXP-2]'
,
'link-adaptation both'
:
'[VHT-LINK-ADAPT3]'
,
'short-gi 80'
:
'[SHORT-GI-80]'
,
'short-gi 160'
:
'[SHORT-GI-160]'
,
}
for
key
in
vht_opt
:
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'vht'
]
+
key
.
split
())
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
)
# channel
tmp
=
get_config_value
(
interface
,
'channel'
)
cli_default
=
default_value
(
self
.
_base_path
+
[
interface
,
'channel'
])
self
.
assertEqual
(
cli_default
,
tmp
)
# auto-powersave is special
tmp
=
get_config_value
(
interface
,
'uapsd_advertisement_enabled'
)
self
.
assertEqual
(
'1'
,
tmp
)
tmp
=
get_config_value
(
interface
,
'ht_capab'
)
for
key
,
value
in
ht_opt
.
items
():
self
.
assertIn
(
value
,
tmp
)
tmp
=
get_config_value
(
interface
,
'vht_capab'
)
for
key
,
value
in
vht_opt
.
items
():
self
.
assertIn
(
value
,
tmp
)
# Check for running process
self
.
assertTrue
(
process_named_running
(
'hostapd'
))
def
test_wireless_hostapd_vht_mu_beamformer_config
(
self
):
# Multi-User-Beamformer
interface
=
self
.
_interfaces
[
1
]
# wlan1
ssid
=
'vht_mu-beamformer'
antennas
=
'3'
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'
,
'36'
])
ht_opt
=
{
# VyOS CLI option hostapd - ht_capab setting
'channel-set-width ht20'
:
'[HT20]'
,
'channel-set-width ht40-'
:
'[HT40-]'
,
'channel-set-width ht40+'
:
'[HT40+]'
,
'dsss-cck-40'
:
'[DSSS_CCK-40]'
,
'short-gi 20'
:
'[SHORT-GI-20]'
,
'short-gi 40'
:
'[SHORT-GI-40]'
,
'max-amsdu 7935'
:
'[MAX-AMSDU-7935]'
,
}
for
key
in
ht_opt
:
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'ht'
]
+
key
.
split
())
vht_opt
=
{
# VyOS CLI option hostapd - ht_capab setting
'max-mpdu 11454'
:
'[MAX-MPDU-11454]'
,
'max-mpdu-exp 2'
:
'[MAX-A-MPDU-LEN-EXP-2]'
,
'stbc tx'
:
'[TX-STBC-2BY1]'
,
'stbc rx 12'
:
'[RX-STBC-12]'
,
'ldpc'
:
'[RXLDPC]'
,
'tx-powersave'
:
'[VHT-TXOP-PS]'
,
'vht-cf'
:
'[HTC-VHT]'
,
'antenna-pattern-fixed'
:
'[RX-ANTENNA-PATTERN][TX-ANTENNA-PATTERN]'
,
'link-adaptation both'
:
'[VHT-LINK-ADAPT3]'
,
'short-gi 80'
:
'[SHORT-GI-80]'
,
'short-gi 160'
:
'[SHORT-GI-160]'
,
'beamform multi-user-beamformer'
:
'[MU-BEAMFORMER][BF-ANTENNA-3][SOUNDING-DIMENSION-3]'
,
}
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'vht'
,
'channel-set-width'
,
'1'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'vht'
,
'center-channel-freq'
,
'freq-1'
,
'42'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'vht'
,
'antenna-count'
,
antennas
])
for
key
in
vht_opt
:
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'vht'
]
+
key
.
split
())
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
)
# channel
tmp
=
get_config_value
(
interface
,
'channel'
)
self
.
assertEqual
(
'36'
,
tmp
)
tmp
=
get_config_value
(
interface
,
'ht_capab'
)
for
key
,
value
in
ht_opt
.
items
():
self
.
assertIn
(
value
,
tmp
)
tmp
=
get_config_value
(
interface
,
'vht_capab'
)
for
key
,
value
in
vht_opt
.
items
():
self
.
assertIn
(
value
,
tmp
)
def
test_wireless_hostapd_vht_su_beamformer_config
(
self
):
# Single-User-Beamformer
interface
=
self
.
_interfaces
[
1
]
# wlan1
ssid
=
'vht_su-beamformer'
antennas
=
'3'
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'
,
'36'
])
ht_opt
=
{
# VyOS CLI option hostapd - ht_capab setting
'channel-set-width ht20'
:
'[HT20]'
,
'channel-set-width ht40-'
:
'[HT40-]'
,
'channel-set-width ht40+'
:
'[HT40+]'
,
'dsss-cck-40'
:
'[DSSS_CCK-40]'
,
'short-gi 20'
:
'[SHORT-GI-20]'
,
'short-gi 40'
:
'[SHORT-GI-40]'
,
'max-amsdu 7935'
:
'[MAX-AMSDU-7935]'
,
}
for
key
in
ht_opt
:
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'ht'
]
+
key
.
split
())
vht_opt
=
{
# VyOS CLI option hostapd - ht_capab setting
'max-mpdu 11454'
:
'[MAX-MPDU-11454]'
,
'max-mpdu-exp 2'
:
'[MAX-A-MPDU-LEN-EXP-2]'
,
'stbc tx'
:
'[TX-STBC-2BY1]'
,
'stbc rx 12'
:
'[RX-STBC-12]'
,
'ldpc'
:
'[RXLDPC]'
,
'tx-powersave'
:
'[VHT-TXOP-PS]'
,
'vht-cf'
:
'[HTC-VHT]'
,
'antenna-pattern-fixed'
:
'[RX-ANTENNA-PATTERN][TX-ANTENNA-PATTERN]'
,
'link-adaptation both'
:
'[VHT-LINK-ADAPT3]'
,
'short-gi 80'
:
'[SHORT-GI-80]'
,
'short-gi 160'
:
'[SHORT-GI-160]'
,
'beamform single-user-beamformer'
:
'[SU-BEAMFORMER][BF-ANTENNA-2][SOUNDING-DIMENSION-2]'
,
}
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'vht'
,
'channel-set-width'
,
'1'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'vht'
,
'center-channel-freq'
,
'freq-1'
,
'42'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'vht'
,
'antenna-count'
,
antennas
])
for
key
in
vht_opt
:
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'vht'
]
+
key
.
split
())
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
)
# channel
tmp
=
get_config_value
(
interface
,
'channel'
)
self
.
assertEqual
(
'36'
,
tmp
)
tmp
=
get_config_value
(
interface
,
'ht_capab'
)
for
key
,
value
in
ht_opt
.
items
():
self
.
assertIn
(
value
,
tmp
)
tmp
=
get_config_value
(
interface
,
'vht_capab'
)
for
key
,
value
in
vht_opt
.
items
():
self
.
assertIn
(
value
,
tmp
)
def
test_wireless_hostapd_he_2ghz_config
(
self
):
# Only set the hostapd (access-point) options - HE mode for 802.11ax at 2.4GHz
interface
=
self
.
_interfaces
[
1
]
# wlan1
ssid
=
'ssid'
channel
=
'1'
sae_pw
=
'VyOSVyOSVyOS'
bss_color
=
'13'
channel_set_width
=
'81'
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'
,
'wpa2'
])
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
,
'capabilities'
,
'ht'
,
'40mhz-incapable'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'ht'
,
'channel-set-width'
,
'ht20'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'ht'
,
'channel-set-width'
,
'ht40+'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'ht'
,
'channel-set-width'
,
'ht40-'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'ht'
,
'short-gi'
,
'20'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'ht'
,
'short-gi'
,
'40'
])
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'
,
'beamform'
,
'multi-user-beamformer'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'he'
,
'beamform'
,
'single-user-beamformer'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'capabilities'
,
'he'
,
'beamform'
,
'single-user-beamformee'
])
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
(
'g'
,
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
)
# BSS coloring
tmp
=
get_config_value
(
interface
,
'he_bss_color'
)
self
.
assertEqual
(
bss_color
,
tmp
)
# sae_password
tmp
=
get_config_value
(
interface
,
'wpa_passphrase'
)
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
(
'WPA-PSK WPA-PSK-SHA256'
,
tmp
)
# beamforming
tmp
=
get_config_value
(
interface
,
'he_mu_beamformer'
)
self
.
assertEqual
(
'1'
,
tmp
)
tmp
=
get_config_value
(
interface
,
'he_su_beamformee'
)
self
.
assertEqual
(
'1'
,
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_he_6ghz_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'
,
'antenna-pattern-fixed'
])
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
)
# antenna pattern
tmp
=
get_config_value
(
interface
,
'he_6ghz_rx_ant_pat'
)
self
.
assertEqual
(
'1'
,
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
=
self
.
_interfaces
[
1
]
# wlan1
ssid
=
'VyOS-SMOKETEST'
channel
=
'1'
wpa_key
=
'VyOSVyOSVyOS'
mode
=
'n'
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'type'
,
'access-point'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'mode'
,
mode
])
# 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'
])
# Country-Code must be set
with
self
.
assertRaises
(
ConfigSessionError
):
self
.
cli_commit
()
self
.
cli_set
(
wifi_cc_path
+
[
country
])
# SSID must be set
with
self
.
assertRaises
(
ConfigSessionError
):
self
.
cli_commit
()
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
])
self
.
cli_commit
()
#
# Validate Config
#
tmp
=
get_config_value
(
interface
,
'interface'
)
self
.
assertEqual
(
interface
,
tmp
)
tmp
=
get_config_value
(
interface
,
'hw_mode'
)
# rewrite special mode
if
mode
==
'n'
:
mode
=
'g'
self
.
assertEqual
(
mode
,
tmp
)
# WPA key
tmp
=
get_config_value
(
interface
,
'wpa'
)
self
.
assertEqual
(
'2'
,
tmp
)
tmp
=
get_config_value
(
interface
,
'wpa_passphrase'
)
self
.
assertEqual
(
wpa_key
,
tmp
)
# SSID
tmp
=
get_config_value
(
interface
,
'ssid'
)
self
.
assertEqual
(
ssid
,
tmp
)
# channel
tmp
=
get_config_value
(
interface
,
'channel'
)
self
.
assertEqual
(
channel
,
tmp
)
# Country code
tmp
=
get_config_value
(
interface
,
'country_code'
)
self
.
assertEqual
(
country
.
upper
(),
tmp
)
# Check for running process
self
.
assertTrue
(
process_named_running
(
'hostapd'
))
def
test_wireless_access_point_bridge
(
self
):
interface
=
self
.
_interfaces
[
1
]
# wlan1
ssid
=
'VyOS-Test'
bridge
=
'br42477'
# We need a bridge where we can hook our access-point interface to
bridge_path
=
[
'interfaces'
,
'bridge'
,
bridge
]
self
.
cli_set
(
bridge_path
+
[
'member'
,
'interface'
,
interface
])
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'
,
'1'
])
self
.
cli_commit
()
# Check for running process
self
.
assertTrue
(
process_named_running
(
'hostapd'
))
bridge_members
=
[]
for
tmp
in
glob
(
f
'/sys/class/net/{bridge}/lower_*'
):
bridge_members
.
append
(
os
.
path
.
basename
(
tmp
)
.
replace
(
'lower_'
,
''
))
self
.
assertIn
(
interface
,
bridge_members
)
# Now generate a VLAN on the bridge
self
.
cli_set
(
bridge_path
+
[
'enable-vlan'
])
self
.
cli_set
(
bridge_path
+
[
'vif'
,
'20'
,
'address'
,
'10.0.0.1/24'
])
self
.
cli_commit
()
tmp
=
get_config_value
(
interface
,
'bridge'
)
self
.
assertEqual
(
tmp
,
bridge
)
tmp
=
get_config_value
(
interface
,
'wds_sta'
)
self
.
assertEqual
(
tmp
,
'1'
)
self
.
cli_delete
(
bridge_path
)
def
test_wireless_security_station_address
(
self
):
interface
=
self
.
_interfaces
[
1
]
# wlan1
ssid
=
'VyOS-ACL'
hostapd_accept_station_conf
=
f
'/run/hostapd/{interface}_station_accept.conf'
hostapd_deny_station_conf
=
f
'/run/hostapd/{interface}_station_deny.conf'
accept_mac
=
[
'00:00:00:00:ac:01'
,
'00:00:00:00:ac:02'
,
'00:00:00:00:ac:03'
,
'00:00:00:00:ac:04'
]
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
,
'type'
,
'access-point'
])
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'security'
,
'station-address'
,
'mode'
,
'accept'
])
for
mac
in
accept_mac
:
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'security'
,
'station-address'
,
'accept'
,
'mac'
,
mac
])
for
mac
in
deny_mac
:
self
.
cli_set
(
self
.
_base_path
+
[
interface
,
'security'
,
'station-address'
,
'deny'
,
'mac'
,
mac
])
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'
)
accept_list
=
read_file
(
hostapd_accept_station_conf
)
for
mac
in
accept_mac
:
self
.
assertIn
(
mac
,
accept_list
)
deny_list
=
read_file
(
hostapd_deny_station_conf
)
for
mac
in
deny_mac
:
self
.
assertIn
(
mac
,
deny_list
)
# 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'
)
# Check for running process
self
.
assertTrue
(
process_named_running
(
'hostapd'
))
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
)
File Metadata
Details
Attached
Mime Type
text/x-script.python
Expires
Sat, Oct 17, 12:49 AM (1 d, 6 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4398832
Default Alt Text
test_interfaces_wireless.py (25 KB)
Attached To
Mode
rVYOSONEX vyos-1x
Attached
Detach File
Event Timeline
Log In to Comment