[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