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

misc bug fixes for svi address propagation, svi query etc

Ticket: CM-3346
Reviewed By:
Testing Done: Tested new format with new bridge driver

- add/del vlan aware bridge svi mac addresses from bridge
- shorten macvlan interface names to <bridge>-<vid>-v<n>
- fix query check for address-virtual interfaces
- fix query check for vlan interfaces
This commit is contained in:
Roopa Prabhu
2014-10-28 23:04:40 -07:00
parent e160136944
commit cb46a2082f
4 changed files with 65 additions and 23 deletions

View File

@@ -56,6 +56,20 @@ class address(moduleBase):
moduleBase.__init__(self, *args, **kargs)
self.ipcmd = None
def _add_address_to_bridge(self, ifaceobj, hwaddress):
if '.' in ifaceobj.name:
(bridgename, vlan) = ifaceobj.name.split('.')
if self.ipcmd.bridge_is_vlan_aware(bridgename):
self.ipcmd.bridge_fdb_add(bridgename, hwaddress,
vlan)
def _remove_address_from_bridge(self, ifaceobj, hwaddress):
if '.' in ifaceobj.name:
(bridgename, vlan) = ifaceobj.name.split('.')
if self.ipcmd.bridge_is_vlan_aware(bridgename):
self.ipcmd.bridge_fdb_del(bridgename, hwaddress,
vlan)
def _inet_address_config(self, ifaceobj):
newaddrs = []
addrs = ifaceobj.get_attr_value('address')
@@ -126,13 +140,19 @@ class address(moduleBase):
mtu = ifaceobj.get_attr_value_first('mtu')
if mtu:
self.ipcmd.link_set(ifaceobj.name, 'mtu', mtu)
hwaddress = ifaceobj.get_attr_value_first('hwaddress')
if hwaddress:
self.ipcmd.link_set(ifaceobj.name, 'address', hwaddress)
alias = ifaceobj.get_attr_value_first('alias')
if alias:
self.ipcmd.link_set_alias(ifaceobj.name, alias)
hwaddress = ifaceobj.get_attr_value_first('hwaddress')
if hwaddress:
self.ipcmd.link_set(ifaceobj.name, 'address', hwaddress)
self.ipcmd.batch_commit()
# After all adds are successful, also add the hw address
# to the bridge if required
if hwaddress:
self._add_address_to_bridge(ifaceobj, hwaddress)
self.ipcmd.route_add_gateway(ifaceobj.name,
ifaceobj.get_attr_value_first('gateway'))
@@ -151,6 +171,10 @@ class address(moduleBase):
alias = ifaceobj.get_attr_value_first('alias')
if alias:
self.ipcmd.link_set(ifaceobj.name, 'alias', "\'\'")
hwaddress = ifaceobj.get_attr_value_first('hwaddress')
if hwaddress:
# XXX Dont know what to reset the address to
self._remove_address_from_bridge(ifaceobj, hwaddress)
except Exception, e:
self.log_warn(str(e))

View File

@@ -53,7 +53,7 @@ class addressvirtual(moduleBase):
hwaddress = []
self.ipcmd.batch_start()
av_idx = 0
macvlan_prefix = '%s-virt' %ifaceobj.name.replace('.', '-')
macvlan_prefix = '%s-v' %ifaceobj.name.replace('.', '-')
for av in address_virtual_list:
av_attrs = av.split()
if len(av_attrs) < 2:
@@ -64,7 +64,7 @@ class addressvirtual(moduleBase):
# Create a macvlan device on this device and set the virtual
# router mac and ip on it
macvlan_ifacename = '%s-%d' %(macvlan_prefix, av_idx)
macvlan_ifacename = '%s%d' %(macvlan_prefix, av_idx)
if not self.ipcmd.link_exists(macvlan_ifacename):
rtnetlink_api.rtnl_api.create_macvlan(macvlan_ifacename,
ifaceobj.name)
@@ -85,7 +85,7 @@ class addressvirtual(moduleBase):
return
hwaddress = []
self.ipcmd.batch_start()
macvlan_prefix = '%s-virt' %ifaceobj.name.replace('.', '-')
macvlan_prefix = '%s-v' %ifaceobj.name.replace('.', '-')
for macvlan_ifacename in glob.glob("/sys/class/net/%s-*" %macvlan_prefix):
macvlan_ifacename = os.path.basename(macvlan_ifacename)
if not self.ipcmd.link_exists(macvlan_ifacename):
@@ -108,7 +108,7 @@ class addressvirtual(moduleBase):
hwaddress = []
self.ipcmd.batch_start()
av_idx = 0
macvlan_prefix = '%s-virt' %ifaceobj.name.replace('.', '-')
macvlan_prefix = '%s-v' %ifaceobj.name.replace('.', '-')
for av in address_virtual_list:
av_attrs = av.split()
if len(av_attrs) < 2:
@@ -118,7 +118,7 @@ class addressvirtual(moduleBase):
continue
# Delete the macvlan device on this device
macvlan_ifacename = '%s-%d' %(macvlan_prefix, av_idx)
macvlan_ifacename = '%s%d' %(macvlan_prefix, av_idx)
self.ipcmd.link_delete(os.path.basename(macvlan_ifacename))
if av_attrs[0] != 'None':
hwaddress.append(av_attrs[0])
@@ -142,7 +142,8 @@ class addressvirtual(moduleBase):
def _down(self, ifaceobj):
try:
self._remove_address_config(ifaceobj, ifaceobj.get_attr_value('address-virtual'))
self._remove_address_config(ifaceobj,
ifaceobj.get_attr_value('address-virtual'))
except Exception, e:
self.log_warn(str(e))
@@ -150,8 +151,10 @@ class addressvirtual(moduleBase):
address_virtual_list = ifaceobj.get_attr_value('address-virtual')
if not address_virtual_list:
return
if not self.ipcmd.link_exists(ifaceobj.name):
return
av_idx = 0
macvlan_prefix = '%s-virt' %ifaceobj.name.replace('.', '-')
macvlan_prefix = '%s-v' %ifaceobj.name.replace('.', '-')
for address_virtual in address_virtual_list:
av_attrs = address_virtual.split()
if len(av_attrs) < 2:
@@ -161,11 +164,23 @@ class addressvirtual(moduleBase):
continue
# Check if the macvlan device on this interface
macvlan_ifacename = '%s-%d' %(macvlan_prefix, av_idx)
if self.ipcmd.link_exists(macvlan_ifacename):
# XXX Check mac and ip address
macvlan_ifacename = '%s%d' %(macvlan_prefix, av_idx)
if not self.ipcmd.link_exists(macvlan_ifacename):
ifaceobjcurr.update_config_with_status('address-virtual',
'', 1)
av_idx += 1
continue
# Check mac and ip address
rhwaddress = self.ipcmd.link_get_hwaddress(macvlan_ifacename)
raddrs = self.ipcmd.addr_get(macvlan_ifacename)
if not raddrs or not rhwaddress:
ifaceobjcurr.update_config_with_status('address-virtual', '', 1)
av_idx += 1
continue
raddrs = raddrs.keys()
self.logger.info(rhwaddress)
self.logger.info(raddrs)
if rhwaddress == av_attrs[0] and raddrs == av_attrs[1:]:
ifaceobjcurr.update_config_with_status('address-virtual',
address_virtual, 0)

View File

@@ -441,6 +441,9 @@ class iface():
outbuf = ''
if self.auto:
outbuf += 'auto %s\n' %self.name
if self.type == ifaceType.BRIDGE_VLAN:
outbuf += 'vlan %s' %self.name
else:
outbuf += 'iface %s' %self.name
if self.addr_family:
outbuf += ' %s' %self.addr_family

View File

@@ -224,8 +224,7 @@ class ifupdownMain(ifupdownBase):
# to indicate if we should follow upperifaces
#
ifaceobj = self.get_ifaceobj_first(ifacename)
if (ifaceobj.type == ifaceType.BRIDGE or
ifaceobj.type == ifaceType.BRIDGE_VLAN):
if ifaceobj.type == ifaceType.BRIDGE_VLAN:
return False
return True
@@ -247,6 +246,7 @@ class ifupdownMain(ifupdownBase):
"""
ifaceobjcurr = iface()
ifaceobjcurr.name = ifaceobj.name
ifaceobjcurr.type = ifaceobj.type
ifaceobjcurr.lowerifaces = ifaceobj.lowerifaces
ifaceobjcurr.priv_flags = ifaceobj.priv_flags
ifaceobjcurr.auto = ifaceobj.auto