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

ifupdown2 loses interfaces on second down of swp port

Ticket: CM-5693
Reviewed By: roopa
Testing Done: tested bridge and bonds with interfaces with configs

Both bridge and mstpctl modules set priv_flags on interfaces
that have configs (like link-speed) even when used as bridge-ports.
And this collision causes statemanager.ifaceobj_sync() to never get called
because ifaceobj.priv_flags is 1 (we return immediately):
The fix was to create a new iface module_flags array to carry module info.
This commit is contained in:
Sam Tannous
2015-04-23 20:19:22 -04:00
parent ef7b7c04b4
commit 4c773918da
3 changed files with 22 additions and 14 deletions

View File

@@ -15,6 +15,9 @@ import itertools
import re
import time
class bridgeFlags:
PORT_PROCESSED = 0x1
class bridge(moduleBase):
""" ifupdown2 addon module to configure linux bridges """
@@ -190,14 +193,10 @@ class bridge(moduleBase):
'example' : ['bridge-port-pvids bond0=100 bond1=200']},
}}
# declare some ifaceobj priv_flags.
# XXX: This assumes that the priv_flags is owned by this module
# which it is not.
_BRIDGE_PORT_PROCESSED = 0x1
def __init__(self, *args, **kargs):
moduleBase.__init__(self, *args, **kargs)
self.ipcmd = None
self.name = self.__class__.__name__
self.brctlcmd = None
self._running_vidinfo = {}
self._running_vidinfo_valid = False
@@ -788,7 +787,8 @@ class bridge(moduleBase):
continue
for bportifaceobj in bportifaceobjlist:
# Dont process bridge port if it already has been processed
if bportifaceobj.priv_flags & self._BRIDGE_PORT_PROCESSED:
if (bportifaceobj.module_flags.get(self.name,0x0) & \
bridgeFlags.PORT_PROCESSED):
continue
try:
# Add attributes specific to the vlan aware bridge
@@ -817,7 +817,8 @@ class bridge(moduleBase):
bridge_vids,
bridge_pvid)
self._apply_bridge_port_settings(ifaceobj, bridgename=bridgename)
ifaceobj.priv_flags |= self._BRIDGE_PORT_PROCESSED
ifaceobj.module_flags[self.name] = ifaceobj.module_flags.setdefault(self.name,0) | \
bridgeFlags.PORT_PROCESSED
return
if not self._is_bridge(ifaceobj):
return