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.
(cherry picked from commit
56924fef20984fd959939bf7f17c3dd6fd6b137a)
(cherry picked from commit
28d96f7643e2885b1f9c17ad9324a6dbb1b0f8c7)
import re
import time
+class bridgeFlags:
+ PORT_PROCESSED = 0x1
+
class bridge(moduleBase):
""" ifupdown2 addon module to configure linux bridges """
'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
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
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
from ifupdownaddons.mstpctlutil import mstpctlutil
import traceback
+class mstpctlFlags:
+ PORT_PROCESSED = 0x1
+
class mstpctl(moduleBase):
""" ifupdown2 addon module to configure mstp attributes """
'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
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,
%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
**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
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) """
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']
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