From d90693fd0da03f8de4ccc4a5a85e2f2c9823e682 Mon Sep 17 00:00:00 2001 From: Oleksandr Kuchmystyi Date: Thu, 30 Apr 2026 15:57:27 +0300 Subject: 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. --- src/conf_mode/interfaces_pseudo-ethernet.py | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src') 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 ' + ) + + # 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): -- cgit v1.2.3