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:
@@ -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
|
||||
|
@@ -12,6 +12,9 @@ from ifupdownaddons.iproute2 import iproute2
|
||||
from ifupdownaddons.mstpctlutil import mstpctlutil
|
||||
import traceback
|
||||
|
||||
class mstpctlFlags:
|
||||
PORT_PROCESSED = 0x1
|
||||
|
||||
class mstpctl(moduleBase):
|
||||
""" ifupdown2 addon module to configure mstp attributes """
|
||||
|
||||
@@ -161,14 +164,10 @@ class mstpctl(moduleBase):
|
||||
'mstpctl-portnetwork' : 'portnetwork',
|
||||
'mstpctl-portbpdufilter' : 'portbpdufilter'}
|
||||
|
||||
# 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.mstpctlcmd = None
|
||||
|
||||
@@ -342,7 +341,8 @@ class mstpctl(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) & \
|
||||
mstpctlFlags.PORT_PROCESSED):
|
||||
continue
|
||||
try:
|
||||
self._apply_bridge_port_settings(bportifaceobj,
|
||||
@@ -361,7 +361,8 @@ class mstpctl(moduleBase):
|
||||
%bridgename) == '2' else False)
|
||||
self._apply_bridge_port_settings(ifaceobj, bridgename, None,
|
||||
stp_on, mstpd_running)
|
||||
ifaceobj.priv_flags |= self._BRIDGE_PORT_PROCESSED
|
||||
ifaceobj.module_flags[self.name] = ifaceobj.module_flags.setdefault(self.name,0) | \
|
||||
mstpctlFlags.PORT_PROCESSED
|
||||
return
|
||||
if not self._is_bridge(ifaceobj):
|
||||
return
|
||||
|
@@ -198,6 +198,8 @@ class iface():
|
||||
|
||||
**priv_flags** private flags owned by module using this class
|
||||
|
||||
**module_flags** module flags owned by module using this class
|
||||
|
||||
**refcnt** reference count, indicating number of interfaces
|
||||
dependent on this iface
|
||||
|
||||
@@ -238,6 +240,8 @@ class iface():
|
||||
self.flags = 0x0
|
||||
"""iface flags """
|
||||
self.priv_flags = 0x0
|
||||
"""iface module flags dictionary with module name: flags"""
|
||||
self.module_flags = {}
|
||||
"""iface priv flags. can be used by the external object manager """
|
||||
self.refcnt = 0
|
||||
"""iface refcnt (incremented for each dependent this interface has) """
|
||||
@@ -445,6 +449,7 @@ class iface():
|
||||
del odict['_config_status']
|
||||
del odict['flags']
|
||||
del odict['priv_flags']
|
||||
del odict['module_flags']
|
||||
del odict['raw_config']
|
||||
del odict['linkstate']
|
||||
del odict['env']
|
||||
@@ -465,6 +470,7 @@ class iface():
|
||||
self.linkstate = None
|
||||
self.env = None
|
||||
self.priv_flags = 0
|
||||
self.module_flags = {}
|
||||
self.raw_config = []
|
||||
self.flags |= self._PICKLED
|
||||
self.link_type = ifaceLinkType.LINK_NA
|
||||
|
Reference in New Issue
Block a user