[ovs-dev] [PATCH 17/18] bridge: Set multicast snooping table configuration

Flavio Leitner fbl at redhat.com
Fri Apr 11 21:34:22 UTC 2014


Fix bridge to create and configure multicast snooping.

Acked-by: Thomas Graf <tgraf at redhat.com>
Signed-off-by: Flavio Leitner <fbl at redhat.com>
---
 vswitchd/bridge.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)

diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index f46d002..28d0808 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -34,6 +34,7 @@
 #include "lacp.h"
 #include "list.h"
 #include "mac-learning.h"
+#include "mcast-snooping.h"
 #include "meta-flow.h"
 #include "netdev.h"
 #include "ofp-print.h"
@@ -203,6 +204,7 @@ static void bridge_configure_datapath_id(struct bridge *);
 static void bridge_configure_netflow(struct bridge *);
 static void bridge_configure_forward_bpdu(struct bridge *);
 static void bridge_configure_mac_table(struct bridge *);
+static void bridge_configure_mcast_snooping(struct bridge *);
 static void bridge_configure_sflow(struct bridge *, int *sflow_bridge_number);
 static void bridge_configure_ipfix(struct bridge *);
 static void bridge_configure_stp(struct bridge *);
@@ -597,6 +599,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg)
         bridge_configure_mirrors(br);
         bridge_configure_forward_bpdu(br);
         bridge_configure_mac_table(br);
+        bridge_configure_mcast_snooping(br);
         bridge_configure_remotes(br, managers, n_managers);
         bridge_configure_netflow(br);
         bridge_configure_sflow(br, &sflow_bridge_number);
@@ -1568,6 +1571,73 @@ bridge_configure_mac_table(struct bridge *br)
     ofproto_set_mac_table_config(br->ofproto, idle_time, mac_table_size);
 }
 
+/* Set multicast snooping table configuration for 'br'. */
+static void
+bridge_configure_mcast_snooping(struct bridge *br)
+{
+    if (!br->cfg->mcast_snooping_enable) {
+        ofproto_set_mcast_snooping(br->ofproto, NULL);
+    } else {
+        struct port *port;
+        struct ofproto_mcast_snooping_settings br_s;
+        const char *idle_time_str;
+        const char *max_entries_str;
+        int num_ports_failed;
+
+        idle_time_str = smap_get(&br->cfg->other_config,
+                                 "mcast-snooping-aging-time");
+        br_s.idle_time = (idle_time_str && atoi(idle_time_str)
+                          ? atoi(idle_time_str)
+                          : MCAST_ENTRY_DEFAULT_IDLE_TIME);
+
+        max_entries_str = smap_get(&br->cfg->other_config,
+                                   "mcast-snooping-table-size");
+        br_s.max_entries = (max_entries_str && atoi(max_entries_str)
+                            ? atoi(max_entries_str)
+                            : MCAST_DEFAULT_MAX_ENTRIES);
+
+        if (smap_get_bool(&br->cfg->other_config,
+                          "mcast-snooping-flood-unregistered",
+                          false)) {
+            br_s.flood_unreg = true;
+        } else {
+            br_s.flood_unreg = false;
+        }
+
+        /* Configure multicast snooping on the bridge */
+        if (ofproto_set_mcast_snooping(br->ofproto, &br_s)) {
+            VLOG_ERR("bridge %s: could not enable multicast snooping",
+                     br->name);
+            return;
+        }
+
+        num_ports_failed = 0;
+        HMAP_FOR_EACH (port, hmap_node, &br->ports) {
+            struct ofproto_port_mcast_snooping_settings port_s;
+
+            if (smap_get_bool(&port->cfg->other_config, "mcast-snooping-flood",
+                               false)) {
+                port_s.flood = true;
+            } else {
+                port_s.flood = false;
+            }
+
+            if (ofproto_port_set_mcast_snooping(br->ofproto, port, &port_s)) {
+                num_ports_failed++;
+                VLOG_ERR("port %s: could not configure mcast snooping",
+                         port->name);
+                continue;
+            }
+        }
+
+        if (num_ports_failed) {
+            ofproto_set_mcast_snooping(br->ofproto, NULL);
+            VLOG_ERR("bridge %s: could not configure %d ports, disabling",
+                     br->name, num_ports_failed);
+        }
+    }
+}
+
 static void
 find_local_hw_addr(const struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
                    const struct port *fake_br, struct iface **hw_addr_iface)
-- 
1.9.0




More information about the dev mailing list