]> git.proxmox.com Git - mirror_ifupdown2.git/commitdiff
Merge pull request #121 from aderumier/arpaccept
authorJulien Fortin <julien@cumulusnetworks.com>
Thu, 24 Oct 2019 23:21:29 +0000 (16:21 -0700)
committerGitHub <noreply@github.com>
Thu, 24 Oct 2019 23:21:29 +0000 (16:21 -0700)
add arp-accept option.

1  2 
ifupdown2/addons/address.py

index b883fbae93f63e6b56814e8ae8dea7fb339f217b,762c58c77d3fa2c06cb31ff1956788378a29ea0c..a8ef1e25fe38a5132bc2443c54fb5392ce7295a9
@@@ -96,6 -96,11 +96,11 @@@ class address(moduleBase)
                                'dual connected VxLANs',
                                'validvals' : ['<ipv4>', ],
                                'example'  : ['clagd-vxlan-anycast-ip 36.0.0.11']},
+                       'arp-accept' :
+                             { 'help': 'Allow gratuitous arp to update arp table',
+                               'validvals': ['on', 'off', 'yes', 'no', '0', '1'],
+                               'default' : 'off',
+                               'example' : ['arp-accept on']},
                        'ip-forward' :
                              { 'help': 'ip forwarding flag',
                                'validvals': ['on', 'off', 'yes', 'no', '0', '1'],
      def _process_bridge(self, ifaceobj, up):
          hwaddress = self._get_hwaddress(ifaceobj)
          addrs = ifaceobj.get_attr_value_first('address')
+         arp_accept = ifaceobj.get_attr_value_first('arp-accept')
+         arp_accept = utils.boolean_support_binary(arp_accept)
          is_vlan_dev_on_vlan_aware_bridge = False
          is_bridge = self.ipcmd.is_bridge(ifaceobj.name)
          if not is_bridge:
                          self.write_file('/proc/sys/net/ipv4/conf/%s' % ifaceobj.name +
                                          '/arp_accept', '0')
                  else:
-                     self.write_file('/proc/sys/net/ipv4/conf/%s/arp_accept' % ifaceobj.name, '0')
+                     self.write_file('/proc/sys/net/ipv4/conf/%s/arp_accept' % ifaceobj.name, arp_accept)
          if hwaddress and is_vlan_dev_on_vlan_aware_bridge:
 -           if up:
 -              self.ipcmd.bridge_fdb_add(bridgename, hwaddress, vlan)
 -           else:
 -              self.ipcmd.bridge_fdb_del(bridgename, hwaddress, vlan)
 +            if up:
 +                # check statemanager to delete the old entry if necessary
 +                try:
 +                    for old_obj in statemanager.statemanager_api.get_ifaceobjs(ifaceobj.name) or []:
 +                        old_hwaddress = old_obj.get_attr_value_first("hwaddress")
 +                        if old_hwaddress and self.ipcmd.mac_str_to_int(old_hwaddress) != self.ipcmd.mac_str_to_int(hwaddress):
 +                            self.ipcmd.bridge_fdb_del(bridgename, old_hwaddress, vlan)
 +                            break
 +                except:
 +                    pass
 +                self.ipcmd.bridge_fdb_add(bridgename, hwaddress, vlan)
 +            else:
 +                self.ipcmd.bridge_fdb_del(bridgename, hwaddress, vlan)
  
      def _get_anycast_addr(self, ifaceobjlist):
          for ifaceobj in ifaceobjlist:
          if addr_method not in ["dhcp", "ppp"]:
              self._inet_address_config(ifaceobj, ifaceobj_getfunc,
                                        force_reapply)
 +        else:
 +            # remove old addresses added by ifupdown2
 +            # (if intf was moved from static config to dhcp)
 +            for old_ifaceobj in statemanager.statemanager_api.get_ifaceobjs(ifaceobj.name) or []:
 +                for addr in old_ifaceobj.get_attr_value("address") or []:
 +                    self.ipcmd.addr_del(ifaceobj.name, addr)
  
          self.process_mtu(ifaceobj, ifaceobj_getfunc)