Fix bridge to create and configure multicast snooping. Acked-by: Thomas Graf <tg...@redhat.com> Signed-off-by: Flavio Leitner <f...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev