summaryrefslogtreecommitdiff
path: root/src/conf_mode/interfaces-wireless.py
diff options
context:
space:
mode:
authorChristian Poessinger <christian@poessinger.com>2020-03-22 21:10:21 +0100
committerChristian Poessinger <christian@poessinger.com>2020-03-22 21:13:25 +0100
commitece243962965bce4d8e3ba3a97be480db2eac9d7 (patch)
treea68c5cb3be6d463cb307496c199215571e553983 /src/conf_mode/interfaces-wireless.py
parent30353d21a763dd18bf1b3ff38febfbf199eb18b0 (diff)
downloadvyos-1x-ece243962965bce4d8e3ba3a97be480db2eac9d7.tar.gz
vyos-1x-ece243962965bce4d8e3ba3a97be480db2eac9d7.zip
wireless: T2151: calculate MAC address only if not deleted
Calculation of the locally administered MAC address should only be performed when the interface is not deleted.
Diffstat (limited to 'src/conf_mode/interfaces-wireless.py')
-rwxr-xr-xsrc/conf_mode/interfaces-wireless.py54
1 files changed, 34 insertions, 20 deletions
diff --git a/src/conf_mode/interfaces-wireless.py b/src/conf_mode/interfaces-wireless.py
index 0af21304f..35ff4567e 100755
--- a/src/conf_mode/interfaces-wireless.py
+++ b/src/conf_mode/interfaces-wireless.py
@@ -1332,29 +1332,24 @@ def verify(wifi):
# use common function to verify VLAN configuration
verify_vlan_config(wifi)
+ conf = Config()
+ # Only one wireless interface per phy can be in station mode
+ base = ['interfaces', 'wireless']
+ for phy in os.listdir('/sys/class/ieee80211'):
+ stations = []
+ for wlan in conf.list_nodes(base):
+ # the following node is mandatory
+ if conf.exists(base + [wlan, 'physical-device', phy]):
+ tmp = conf.return_value(base + [wlan, 'type'])
+ if tmp == 'station':
+ stations.append(wlan)
+
+ if len(stations) > 1:
+ raise ConfigError('Only one station per wireless physical interface possible!')
+
return None
def generate(wifi):
-
- if not wifi['mac']:
- # http://wiki.stocksy.co.uk/wiki/Multiple_SSIDs_with_hostapd
- # generate locally administered MAC address from used phy interface
- with open('/sys/class/ieee80211/{}/addresses'.format(wifi['phy']), 'r') as f:
- tmp = EUI(f.read().rstrip()).value
- # mask last nibble from the MAC address
- tmp &= 0xfffffffffff0
- # set locally administered bit in MAC address
- tmp |= 0x020000000000
- # we now need to add an offset to our MAC address indicating this
- # subinterfaces index
- tmp += int(findall(r'\d+', wifi['intf'])[0])
-
- # convert integer to "real" MAC address representation
- mac = EUI(hex(tmp).split('x')[-1])
- # change dialect to use : as delimiter instead of -
- mac.dialect = mac_unix_expanded
- wifi['mac'] = str(mac)
-
pid = 0
# always stop hostapd service first before reconfiguring it
pidfile = get_pid('hostapd', wifi['intf'])
@@ -1390,6 +1385,25 @@ def generate(wifi):
return None
+ if not wifi['mac']:
+ # http://wiki.stocksy.co.uk/wiki/Multiple_SSIDs_with_hostapd
+ # generate locally administered MAC address from used phy interface
+ with open('/sys/class/ieee80211/{}/addresses'.format(wifi['phy']), 'r') as f:
+ tmp = EUI(f.read().rstrip()).value
+ # mask last nibble from the MAC address
+ tmp &= 0xfffffffffff0
+ # set locally administered bit in MAC address
+ tmp |= 0x020000000000
+ # we now need to add an offset to our MAC address indicating this
+ # subinterfaces index
+ tmp += int(findall(r'\d+', wifi['intf'])[0])
+
+ # convert integer to "real" MAC address representation
+ mac = EUI(hex(tmp).split('x')[-1])
+ # change dialect to use : as delimiter instead of -
+ mac.dialect = mac_unix_expanded
+ wifi['mac'] = str(mac)
+
# render appropriate new config files depending on access-point or station mode
if wifi['op_mode'] == 'ap':
tmpl = Template(config_hostapd_tmpl)