summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOleksandr Kuchmystyi <o.kuchmystyi@vyos.io>2026-04-30 15:57:27 +0300
committerOleksandr Kuchmystyi <o.kuchmystyi@vyos.io>2026-06-22 15:36:19 +0300
commitd90693fd0da03f8de4ccc4a5a85e2f2c9823e682 (patch)
treeb4f1dc220fab2047bbd88c3cc27b6040974e7373 /src
parent02f8c17a56518157e48048fb39b69f373ee9c829 (diff)
downloadvyos-1x-d90693fd0da03f8de4ccc4a5a85e2f2c9823e682.tar.gz
vyos-1x-d90693fd0da03f8de4ccc4a5a85e2f2c9823e682.zip
pseudo-ethernet: T8540: Add anycast-gateway support for EVPN
Introduce 'anycast-gateway' leafNode for pseudo-ethernet interfaces. When set, a local FDB entry is installed on the parent bridge to prevent the shared anycast MAC from leaking over the VXLAN overlay.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/conf_mode/interfaces_pseudo-ethernet.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/conf_mode/interfaces_pseudo-ethernet.py b/src/conf_mode/interfaces_pseudo-ethernet.py
index 6a4219343..12019d3e6 100755
--- a/src/conf_mode/interfaces_pseudo-ethernet.py
+++ b/src/conf_mode/interfaces_pseudo-ethernet.py
@@ -68,6 +68,35 @@ def get_config(config=None):
return peth
+def _verify_anycast_gateway(peth: dict):
+ """Validate anycast-gateway requirements."""
+
+ if 'anycast_gateway' not in peth:
+ return
+
+ ifname = peth['ifname']
+
+ # Requirement 1: MAC address must be explicitly configured
+ if 'mac' not in peth:
+ raise ConfigError(
+ f'Anycast-gateway requires an explicit MAC address to be set on interface {ifname}. '
+ f'Use: set interfaces pseudo-ethernet {ifname} mac <mac>'
+ )
+
+ # Requirement 2: source-interface must be a bridge or bridge sub-interface
+ source_iface = peth.get('source_interface')
+ if not source_iface:
+ raise ConfigError(
+ f'Anycast-gateway requires source-interface to be set on interface {ifname}'
+ )
+
+ if not source_iface.startswith('br'):
+ raise ConfigError(
+ 'Anycast-gateway requires source-interface to be a bridge '
+ 'or a bridge vlan interface (e.g. br0 or br0.100), but '
+ f'"{source_iface}" is neither of these two.'
+ )
+
def verify(peth):
if 'deleted' in peth:
verify_bridge_delete(peth)
@@ -82,6 +111,8 @@ def verify(peth):
# use common function to verify VLAN configuration
verify_vlan_config(peth)
+ _verify_anycast_gateway(peth)
+
return None
def generate(peth):