diff options
| author | Nataliia Solomko <natalirs1985@gmail.com> | 2025-11-05 13:20:42 +0200 |
|---|---|---|
| committer | Nataliia Solomko <natalirs1985@gmail.com> | 2025-11-12 13:48:44 +0200 |
| commit | ccf4972f8dd9ddf370fe6376480c1244a138c4bd (patch) | |
| tree | c572124fe48db464fb48c912e070c0f322f12908 /src | |
| parent | 21d509d6c639f2a94c43c3af7f845ef0e544555f (diff) | |
| download | vyos-1x-ccf4972f8dd9ddf370fe6376480c1244a138c4bd.tar.gz vyos-1x-ccf4972f8dd9ddf370fe6376480c1244a138c4bd.zip | |
T7731: Static ARP entries are missing after an interface status change
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/interfaces_bonding.py | 6 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_bridge.py | 24 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_ethernet.py | 8 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_geneve.py | 9 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_l2tpv3.py | 9 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_macsec.py | 9 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_pseudo-ethernet.py | 10 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_virtual-ethernet.py | 9 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_vxlan.py | 9 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_wireless.py | 9 | ||||
| -rwxr-xr-x | src/conf_mode/interfaces_wwan.py | 10 |
11 files changed, 104 insertions, 8 deletions
diff --git a/src/conf_mode/interfaces_bonding.py b/src/conf_mode/interfaces_bonding.py index 4a2317f85..68c2885bc 100755 --- a/src/conf_mode/interfaces_bonding.py +++ b/src/conf_mode/interfaces_bonding.py @@ -175,6 +175,10 @@ def get_config(config=None): tmp = has_vrf_configured(conf, interface) if tmp: bond['member']['interface'][interface].update({'has_vrf' : ''}) + # Protocols static arp dependency + if 'static_arp' in bond: + set_dependents('static_arp', conf) + return bond @@ -279,7 +283,7 @@ def apply(bond): else: b.update(bond) - if dict_search('member.interface_remove', bond): + if dict_search('member.interface_remove', bond) or 'static_arp' in bond: try: call_dependents() except ConfigError: diff --git a/src/conf_mode/interfaces_bridge.py b/src/conf_mode/interfaces_bridge.py index 8cb0c515a..c6792404b 100755 --- a/src/conf_mode/interfaces_bridge.py +++ b/src/conf_mode/interfaces_bridge.py @@ -124,6 +124,10 @@ def get_config(config=None): if len(bridge['member']) == 0: del bridge['member'] + # Protocols static arp dependency + if 'static_arp' in bridge: + set_dependents('static_arp', conf) + return bridge def verify(bridge): @@ -213,12 +217,20 @@ def apply(bridge): if 'interface' in bridge['member']: tmp.extend(bridge['member']['interface']) - for interface in tmp: - if interface.startswith(tuple(['vxlan', 'wlan'])) and interface_exists(interface): - try: - call_dependents() - except ConfigError: - raise ConfigError(f'Error updating member interface {interface} configuration after changing bridge!') + # collect member interfaces that require dependent updates + interfaces_need_update = [ + iface + for iface in tmp + if iface.startswith(('vxlan', 'wlan')) and interface_exists(iface) + ] + + if interfaces_need_update or 'static_arp' in bridge: + try: + call_dependents() + except ConfigError: + raise ConfigError( + 'Error updating member interface configuration after changing bridge!' + ) return None diff --git a/src/conf_mode/interfaces_ethernet.py b/src/conf_mode/interfaces_ethernet.py index b112b244e..14bda1b3d 100755 --- a/src/conf_mode/interfaces_ethernet.py +++ b/src/conf_mode/interfaces_ethernet.py @@ -20,6 +20,8 @@ from sys import exit from vyos.base import Warning from vyos.config import Config +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed from vyos.configdict import get_flowtable_interfaces @@ -171,6 +173,10 @@ def get_config(config=None): ethernet['flowtable_interfaces'] = get_flowtable_interfaces(conf) + # Protocols static arp dependency + if 'static_arp' in ethernet: + set_dependents('static_arp', conf) + return ethernet def verify_speed_duplex(ethernet: dict, ethtool: Ethtool): @@ -368,6 +374,8 @@ def apply(ethernet): e.remove() else: e.update(ethernet) + if 'static_arp' in ethernet: + call_dependents() return None if __name__ == '__main__': diff --git a/src/conf_mode/interfaces_geneve.py b/src/conf_mode/interfaces_geneve.py index 11b349002..2f3e3cb8c 100755 --- a/src/conf_mode/interfaces_geneve.py +++ b/src/conf_mode/interfaces_geneve.py @@ -17,6 +17,8 @@ from sys import exit from vyos.config import Config +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed from vyos.configverify import verify_address @@ -51,6 +53,10 @@ def get_config(config=None): if is_node_changed(conf, base + [ifname, cli_option]): geneve.update({'rebuild_required': {}}) + # Protocols static arp dependency + if 'static_arp' in geneve: + set_dependents('static_arp', conf) + return geneve def verify(geneve): @@ -90,6 +96,9 @@ def apply(geneve): g = GeneveIf(**geneve) g.update(geneve) + if 'static_arp' in geneve: + call_dependents() + return None diff --git a/src/conf_mode/interfaces_l2tpv3.py b/src/conf_mode/interfaces_l2tpv3.py index 8eca1cedc..8478f3c40 100755 --- a/src/conf_mode/interfaces_l2tpv3.py +++ b/src/conf_mode/interfaces_l2tpv3.py @@ -17,6 +17,8 @@ from sys import exit from vyos.config import Config +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import leaf_node_changed from vyos.configverify import verify_address @@ -56,6 +58,10 @@ def get_config(config=None): tmp = leaf_node_changed(conf, base + [ifname, 'session-id']) l2tpv3.update({'session_id': tmp[0]}) + # Protocols static arp dependency + if 'static_arp' in l2tpv3: + set_dependents('static_arp', conf) + return l2tpv3 def verify(l2tpv3): @@ -100,6 +106,9 @@ def apply(l2tpv3): l = L2TPv3If(**l2tpv3) l.update(l2tpv3) + if 'static_arp' in l2tpv3: + call_dependents() + return None if __name__ == '__main__': diff --git a/src/conf_mode/interfaces_macsec.py b/src/conf_mode/interfaces_macsec.py index 683e12ec3..38823e7e6 100755 --- a/src/conf_mode/interfaces_macsec.py +++ b/src/conf_mode/interfaces_macsec.py @@ -19,6 +19,8 @@ import os from sys import exit from vyos.config import Config +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed from vyos.configdict import is_source_interface @@ -78,6 +80,10 @@ def get_config(config=None): tmp = is_source_interface(conf, macsec['source_interface'], ['macsec', 'pseudo-ethernet']) if tmp and tmp != ifname: macsec.update({'is_source_interface' : tmp}) + # Protocols static arp dependency + if 'static_arp' in macsec: + set_dependents('static_arp', conf) + return macsec @@ -193,6 +199,9 @@ def apply(macsec): if not is_systemd_service_running(systemd_service) or 'shutdown_required' in macsec: call(f'systemctl reload-or-restart {systemd_service}') + if 'static_arp' in macsec: + call_dependents() + return None diff --git a/src/conf_mode/interfaces_pseudo-ethernet.py b/src/conf_mode/interfaces_pseudo-ethernet.py index 6edd3f248..7f9345abb 100755 --- a/src/conf_mode/interfaces_pseudo-ethernet.py +++ b/src/conf_mode/interfaces_pseudo-ethernet.py @@ -17,8 +17,9 @@ from sys import exit from vyos.config import Config +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict -from vyos.configdict import is_node_changed from vyos.configdict import is_source_interface from vyos.configdict import is_node_changed from vyos.configverify import verify_vrf @@ -61,6 +62,10 @@ def get_config(config=None): tmp = is_source_interface(conf, peth['source_interface'], ['macsec']) if tmp and tmp != ifname: peth.update({'is_source_interface' : tmp}) + # Protocols static arp dependency + if 'static_arp' in peth: + set_dependents('static_arp', conf) + return peth def verify(peth): @@ -95,6 +100,9 @@ def apply(peth): p = MACVLANIf(**peth) p.update(peth) + if 'static_arp' in peth: + call_dependents() + return None if __name__ == '__main__': diff --git a/src/conf_mode/interfaces_virtual-ethernet.py b/src/conf_mode/interfaces_virtual-ethernet.py index f85c3d1de..81a12c581 100755 --- a/src/conf_mode/interfaces_virtual-ethernet.py +++ b/src/conf_mode/interfaces_virtual-ethernet.py @@ -19,6 +19,8 @@ from sys import exit from vyos import ConfigError from vyos import airbag from vyos.config import Config +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configverify import verify_address from vyos.configverify import verify_bridge_delete @@ -47,6 +49,10 @@ def get_config(config=None): veth['other_interfaces'] = conf.get_config_dict(base, key_mangling=('-', '_'), get_first_key=True, no_tag_node_value_mangle=True) + # Protocols static arp dependency + if 'static_arp' in veth: + set_dependents('static_arp', conf) + return veth @@ -101,6 +107,9 @@ def apply(veth): p = VethIf(**veth) p.update(veth) + if 'static_arp' in veth: + call_dependents() + return None diff --git a/src/conf_mode/interfaces_vxlan.py b/src/conf_mode/interfaces_vxlan.py index 81ebf8dda..5e23654e1 100755 --- a/src/conf_mode/interfaces_vxlan.py +++ b/src/conf_mode/interfaces_vxlan.py @@ -18,6 +18,8 @@ from sys import exit from vyos.base import Warning from vyos.config import Config +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import leaf_node_changed from vyos.configdict import is_node_changed @@ -83,6 +85,10 @@ def get_config(config=None): if len(vxlan['other_tunnels']) == 0: del vxlan['other_tunnels'] + # Protocols static arp dependency + if 'static_arp' in vxlan: + set_dependents('static_arp', conf) + return vxlan def verify(vxlan): @@ -249,6 +255,9 @@ def apply(vxlan): v = VXLANIf(**vxlan) v.update(vxlan) + if 'static_arp' in vxlan: + call_dependents() + return None if __name__ == '__main__': diff --git a/src/conf_mode/interfaces_wireless.py b/src/conf_mode/interfaces_wireless.py index b3b909046..a2e31484b 100755 --- a/src/conf_mode/interfaces_wireless.py +++ b/src/conf_mode/interfaces_wireless.py @@ -22,6 +22,8 @@ from netaddr import EUI, mac_unix_expanded from time import sleep from vyos.config import Config +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import dict_merge from vyos.configverify import verify_address @@ -133,6 +135,10 @@ def get_config(config=None): wifi['hostapd_accept_station_conf'] = hostapd_accept_station_conf.format(**wifi) wifi['hostapd_deny_station_conf'] = hostapd_deny_station_conf.format(**wifi) + # Protocols static arp dependency + if 'static_arp' in wifi: + set_dependents('static_arp', conf) + return wifi def verify(wifi): @@ -331,6 +337,9 @@ def apply(wifi): elif wifi['type'] == 'station': call(f'systemctl start wpa_supplicant@{interface}.service') + if 'static_arp' in wifi: + call_dependents() + return None if __name__ == '__main__': diff --git a/src/conf_mode/interfaces_wwan.py b/src/conf_mode/interfaces_wwan.py index ddddbe5e8..bde31ebe1 100755 --- a/src/conf_mode/interfaces_wwan.py +++ b/src/conf_mode/interfaces_wwan.py @@ -20,6 +20,8 @@ from sys import exit from time import sleep from vyos.config import Config +from vyos.configdep import set_dependents +from vyos.configdep import call_dependents from vyos.configdict import get_interface_dict from vyos.configdict import is_node_changed from vyos.configverify import verify_authentication @@ -87,6 +89,10 @@ def get_config(config=None): if len(wwan['other_interfaces']) == 0: del wwan['other_interfaces'] + # Protocols static arp dependency + if 'static_arp' in wwan: + set_dependents('static_arp', conf) + return wwan def verify(wwan): @@ -179,6 +185,10 @@ def apply(wwan): call(command, stdout=DEVNULL) w.update(wwan) + + if 'static_arp' in wwan: + call_dependents() + return None if __name__ == '__main__': |
