]> git.proxmox.com Git - mirror_ifupdown2.git/commitdiff
addons: bridge: read bridge multicast_v4_queriers from sysfs
authorJulien Fortin <julien@cumulusnetworks.com>
Tue, 2 Oct 2018 16:43:50 +0000 (18:43 +0200)
committerJulien Fortin <julien@cumulusnetworks.com>
Thu, 13 Dec 2018 22:43:57 +0000 (14:43 -0800)
➜  ~ ifquery -a
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto br0
iface br0
      bridge-ports swp2
      bridge-mcqv4src 100=172.16.100.1 101=172.16.101.1

➜  ~ ifup br0 -v
...
info: executing /sbin/brctl showmcqv4src br0
info: executing /sbin/brctl setmcqv4src br0 100 172.16.100.1
info: executing /sbin/brctl setmcqv4src br0 101 172.16.101.1
...
➜  ~ ifquery br0 -c
auto br0
iface br0                                                           [pass]
      bridge-ports swp2                                           [pass]
      bridge-mcqv4src 100=172.16.100.1 101=172.16.101.1           [pass]

➜  ~

Signed-off-by: Julien Fortin <julien@cumulusnetworks.com>
ifupdown2/addons/bridge.py
ifupdown2/addons/bridgevlan.py
ifupdown2/ifupdownaddons/LinkUtils.py

index c25f12f4d2663de6ff8e5853ef260313c9930213..fd2e28cce854ff08a14b70264ed30112e279bd56 100644 (file)
@@ -1112,7 +1112,7 @@ class bridge(moduleBase):
         if attrval:
             running_mcqv4src = {}
             if not ifupdownflags.flags.PERFMODE:
-                running_mcqv4src = self.brctlcmd.bridge_get_mcqv4src(ifaceobj.name)
+                running_mcqv4src = self.brctlcmd.bridge_get_mcqv4src_sysfs(ifaceobj.name)
             mcqs = {}
             srclist = attrval.split()
             for s in srclist:
@@ -1125,7 +1125,7 @@ class bridge(moduleBase):
             for v in mcqs.keys():
                 self.brctlcmd.bridge_set_mcqv4src(ifaceobj.name, v, mcqs[v])
         elif not ifupdownflags.flags.PERFMODE:
-            running_mcqv4src = self.brctlcmd.bridge_get_mcqv4src(ifaceobj.name)
+            running_mcqv4src = self.brctlcmd.bridge_get_mcqv4src_sysfs(ifaceobj.name)
             if running_mcqv4src:
                 for v in running_mcqv4src.keys():
                     self.brctlcmd.bridge_del_mcqv4src(ifaceobj.name, v)
@@ -2299,7 +2299,7 @@ class bridge(moduleBase):
         return running_attrs
 
     def _query_running_mcqv4src(self, ifaceobjrunning):
-        running_mcqv4src = self.brctlcmd.bridge_get_mcqv4src(ifaceobjrunning.name)
+        running_mcqv4src = self.brctlcmd.bridge_get_mcqv4src_sysfs(ifaceobjrunning.name)
         mcqs = ['%s=%s' %(v, i) for v, i in running_mcqv4src.items()]
         mcqs.sort()
         mcq = ' '.join(mcqs)
index aadecc8c45cb826371140af2f8537e8d1b6d3efa..3cc4fb8bd0fef0e6eb5133b4cb1f117536741b22 100644 (file)
@@ -79,7 +79,7 @@ class bridgevlan(moduleBase):
 
         running_mcqv4src = {}
         if not ifupdownflags.flags.PERFMODE:
-            running_mcqv4src = self.brctlcmd.bridge_get_mcqv4src(bridgename)
+            running_mcqv4src = self.brctlcmd.bridge_get_mcqv4src_sysfs(bridgename)
         if running_mcqv4src:
             r_mcqv4src = running_mcqv4src.get(vlan)
         else:
@@ -115,7 +115,7 @@ class bridgevlan(moduleBase):
 
     def _query_running_bridge_igmp_querier_src(self, ifaceobj):
         (bridgename, vlanid) = ifaceobj.name.split('.')
-        running_mcqv4src = self.brctlcmd.bridge_get_mcqv4src(bridgename)
+        running_mcqv4src = self.brctlcmd.bridge_get_mcqv4src_sysfs(bridgename)
         if running_mcqv4src:
            return running_mcqv4src.get(vlanid)
         return None
index a0c7c63efa222cb0579ad5b4b70e8af9a2db37e0..ab1dd6e6d4b1e36d550d56401569bd21f2679958 100644 (file)
@@ -2595,6 +2595,31 @@ class LinkUtils(utilsBase):
             return mcqv4src.get(vlan)
         return mcqv4src
 
+    def bridge_get_mcqv4src_sysfs(self, bridge, vlan=None):
+        if not LinkUtils.bridge_utils_is_installed:
+            return {}
+        if not self.supported_command['showmcqv4src']:
+            return {}
+        if ifupdownflags.flags.PERFMODE:
+            return {}
+        mcqv4src = {}
+        try:
+            filename = '/sys/class/net/%s/bridge/multicast_v4_queriers' % bridge
+            if os.path.exists(filename):
+                for line in self.read_file(filename) or []:
+                    vlan_id, ip = line.split('=')
+                    mcqv4src[vlan_id] = ip.strip()
+        except Exception as e:
+            s = str(e).lower()
+            msg = ('%s showmcqv4src: skipping unsupported command'
+                   % utils.brctl_cmd)
+            self.logger.info(msg)
+            self.supported_command['showmcqv4src'] = False
+            return {}
+        if vlan:
+            return mcqv4src.get(vlan)
+        return mcqv4src
+
     @staticmethod
     def bridge_set_mclmi(bridge, mclmi):
         if not LinkUtils.bridge_utils_is_installed: