1
0
mirror of https://github.com/CumulusNetworks/ifupdown2.git synced 2024-05-06 15:54:50 +00:00

set arp accept to 1 for bridge devices with an ip and new bridge svi

device (forward port of commit

Ticket: CM-4218
Reviewed By:
Testing Done: Tested with address on new bridge svi and old bridge
This commit is contained in:
Roopa Prabhu
2014-11-17 16:23:42 -08:00
parent 84bf47c60a
commit 75afe2a7f4

View File

@@ -65,19 +65,36 @@ class address(moduleBase):
self.ipcmd = None self.ipcmd = None
self._bridge_fdb_query_cache = {} self._bridge_fdb_query_cache = {}
def _add_address_to_bridge(self, ifaceobj, hwaddress): def _address_valid(self, addrs):
if '.' in ifaceobj.name: if not addrs:
(bridgename, vlan) = ifaceobj.name.split('.') return False
if self.ipcmd.bridge_is_vlan_aware(bridgename): if any(map(lambda a: True if a[:7] != '0.0.0.0'
self.ipcmd.bridge_fdb_add(bridgename, hwaddress, else False, addrs)):
vlan) return True
return False
def _remove_address_from_bridge(self, ifaceobj, hwaddress): def _process_bridge(self, ifaceobj, up):
if '.' in ifaceobj.name: hwaddress = ifaceobj.get_attr_value_first('hwaddress')
(bridgename, vlan) = ifaceobj.name.split('.') addrs = ifaceobj.get_attr_value_first('address')
if self.ipcmd.bridge_is_vlan_aware(bridgename): is_vlan_dev_on_vlan_aware_bridge = False
self.ipcmd.bridge_fdb_del(bridgename, hwaddress, is_bridge = self.ipcmd.is_bridge(ifaceobj.name)
vlan) if not is_bridge:
if '.' in ifaceobj.name:
(bridgename, vlan) = ifaceobj.name.split('.')
is_vlan_dev_on_vlan_aware_bridge = self.ipcmd.bridge_is_vlan_aware(bridgename)
if is_bridge or is_vlan_dev_on_vlan_aware_bridge:
if self._address_valid(addrs):
if up:
self.write_file('/proc/sys/net/ipv4/conf/%s' %ifaceobj.name +
'/arp_accept', '1')
else:
self.write_file('/proc/sys/net/ipv4/conf/%s' %ifaceobj.name +
'/arp_accept', '0')
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)
def _inet_address_config(self, ifaceobj): def _inet_address_config(self, ifaceobj):
purge_addresses = ifaceobj.get_attr_value_first('address-purge') purge_addresses = ifaceobj.get_attr_value_first('address-purge')
@@ -141,7 +158,7 @@ class address(moduleBase):
# if not running in perf mode and ifaceobj does not have # if not running in perf mode and ifaceobj does not have
# any sibling iface objects, kill any stale dhclient # any sibling iface objects, kill any stale dhclient
# processes # processes
dhclientcmd = self.dhclient() dhclientcmd = dhclient()
if dhclient.is_running(ifaceobj.name): if dhclient.is_running(ifaceobj.name):
# release any dhcp leases # release any dhcp leases
dhclientcmd.release(ifaceobj.name) dhclientcmd.release(ifaceobj.name)
@@ -163,10 +180,8 @@ class address(moduleBase):
self.ipcmd.link_set(ifaceobj.name, 'address', hwaddress) self.ipcmd.link_set(ifaceobj.name, 'address', hwaddress)
self.ipcmd.batch_commit() self.ipcmd.batch_commit()
# After all adds are successful, also add the hw address # Handle special things on a bridge
# to the bridge if required self._process_bridge(ifaceobj, True)
if hwaddress:
self._add_address_to_bridge(ifaceobj, hwaddress)
self.ipcmd.route_add_gateway(ifaceobj.name, self.ipcmd.route_add_gateway(ifaceobj.name,
ifaceobj.get_attr_value_first('gateway')) ifaceobj.get_attr_value_first('gateway'))
@@ -186,10 +201,11 @@ class address(moduleBase):
alias = ifaceobj.get_attr_value_first('alias') alias = ifaceobj.get_attr_value_first('alias')
if alias: if alias:
self.ipcmd.link_set(ifaceobj.name, 'alias', "\'\'") self.ipcmd.link_set(ifaceobj.name, 'alias', "\'\'")
hwaddress = ifaceobj.get_attr_value_first('hwaddress') # XXX hwaddress reset cannot happen because we dont know last
if hwaddress: # address.
# XXX Dont know what to reset the address to
self._remove_address_from_bridge(ifaceobj, hwaddress) # Handle special things on a bridge
self._process_bridge(ifaceobj, False)
except Exception, e: except Exception, e:
self.logger.debug('%s : %s' %(ifaceobj.name, str(e))) self.logger.debug('%s : %s' %(ifaceobj.name, str(e)))
pass pass