diff options
| author | Christian Breunig <christian@breunig.cc> | 2023-10-28 20:57:38 +0200 | 
|---|---|---|
| committer | Christian Breunig <christian@breunig.cc> | 2023-10-30 16:20:56 +0100 | 
| commit | ec9a95502daa88b9632af12524e7cefebf86bab6 (patch) | |
| tree | db1e08a4dc32654bfdc9624450165a2ed82402c1 /python | |
| parent | 0e129df010f5306b9a8ba5b39fffb520baade38b (diff) | |
| download | vyos-1x-ec9a95502daa88b9632af12524e7cefebf86bab6.tar.gz vyos-1x-ec9a95502daa88b9632af12524e7cefebf86bab6.zip | |
vxlan: T5668: add CLI knob to enable ARP/ND suppression
In order to minimize the flooding of ARP and ND messages in the VXLAN network,
EVPN includes provisions [1] that allow participating VTEPs to suppress such
messages in case they know the MAC-IP binding and can reply on behalf of the
remote host. In Linux, the above is implemented in the bridge driver using a
per-port option called "neigh_suppress" that was added in kernel version 4.15.
[1] https://www.rfc-editor.org/rfc/rfc7432#section-10
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/ifconfig/vxlan.py | 23 | 
1 files changed, 23 insertions, 0 deletions
| diff --git a/python/vyos/ifconfig/vxlan.py b/python/vyos/ifconfig/vxlan.py index 1fe5db7cd..ddb2263ab 100644 --- a/python/vyos/ifconfig/vxlan.py +++ b/python/vyos/ifconfig/vxlan.py @@ -56,6 +56,10 @@ class VXLANIf(Interface):      }      _command_set = {**Interface._command_set, **{ +        'neigh_suppress': { +            'validate': lambda v: assert_list(v, ['on', 'off']), +            'shellcmd': 'bridge link set dev {ifname} neigh_suppress {value} learning off', +        },          'vlan_tunnel': {              'validate': lambda v: assert_list(v, ['on', 'off']),              'shellcmd': 'bridge link set dev {ifname} vlan_tunnel {value}', @@ -113,6 +117,19 @@ class VXLANIf(Interface):                         'port {port} dev {ifname}'                  self._cmd(cmd.format(**self.config)) +    def set_neigh_suppress(self, state): +        """ +        Controls whether neigh discovery (arp and nd) proxy and suppression +        is enabled on the port. By default this flag is off. +        """ + +        # Determine current OS Kernel neigh_suppress setting - only adjust when needed +        tmp = get_interface_config(self.ifname) +        cur_state = 'on' if dict_search(f'linkinfo.info_slave_data.neigh_suppress', tmp) == True else 'off' +        new_state = 'on' if state else 'off' +        if cur_state != new_state: +            self.set_interface('neigh_suppress', state) +      def set_vlan_vni_mapping(self, state):          """          Controls whether vlan to tunnel mapping is enabled on the port. @@ -163,3 +180,9 @@ class VXLANIf(Interface):          # Enable/Disable VLAN tunnel mapping          # This is only possible after the interface was assigned to the bridge          self.set_vlan_vni_mapping(dict_search('vlan_to_vni', config) != None) + +        # Enable/Disable neighbor suppression and learning, there is no need to +        # explicitly "disable" it, as VXLAN interface will be recreated if anything +        # under "parameters" changes. +        if dict_search('parameters.neighbor_suppress', config) != None: +            self.set_neigh_suppress('on') | 
