Acked-by: Thomas Graf <[email protected]>
Signed-off-by: Flavio Leitner <[email protected]>
---
ofproto/ofproto-dpif.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++
ofproto/ofproto-provider.h | 22 +++++++++++++++++++
ofproto/ofproto.c | 28 +++++++++++++++++++++++
ofproto/ofproto.h | 17 ++++++++++++++
4 files changed, 122 insertions(+)
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 38acbf0..eb00ccf 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -2680,6 +2680,59 @@ set_mac_table_config(struct ofproto *ofproto_, unsigned
int idle_time,
mac_learning_set_max_entries(ofproto->ml, max_entries);
ovs_rwlock_unlock(&ofproto->ml->rwlock);
}
+
+static int
+set_mcast_snooping(struct ofproto *ofproto_,
+ const struct ofproto_mcast_snooping_settings *s)
+{
+ struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_);
+
+ /* Only revalidate flows if the configuration changed. */
+ if (!s != !ofproto->ms) {
+ ofproto->backer->need_revalidate = REV_RECONFIGURE;
+ }
+
+ if (s) {
+ if (!ofproto->ms) {
+ ofproto->ms = mcast_snooping_create();
+ }
+
+ ovs_rwlock_wrlock(&ofproto->ms->rwlock);
+ mcast_snooping_set_idle_time(ofproto->ms, s->idle_time);
+ mcast_snooping_set_max_entries(ofproto->ms, s->max_entries);
+ mcast_snooping_set_flood_unreg(ofproto->ms, s->flood_unreg);
+ ovs_rwlock_unlock(&ofproto->ms->rwlock);
+ } else {
+ mcast_snooping_unref(ofproto->ms);
+ ofproto->ms = NULL;
+ }
+
+ return 0;
+}
+
+/* Configures multicast snooping on 'ofport_' using the settings defined
+ * in 's'.*/
+static int
+set_mcast_snooping_port(struct ofproto *ofproto_, void *aux,
+ const struct ofproto_port_mcast_snooping_settings *s)
+{
+ struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_);
+ struct ofbundle *bundle = bundle_lookup(ofproto, aux);
+
+
+ if (!s || !s->flood) {
+ ovs_rwlock_wrlock(&ofproto->ms->rwlock);
+ mcast_snooping_port_disable_flood(ofproto->ms, bundle->vlan, bundle);
+ ovs_rwlock_unlock(&ofproto->ms->rwlock);
+ return 0;
+ }
+
+ ovs_rwlock_wrlock(&ofproto->ms->rwlock);
+ mcast_snooping_port_enable_flood(ofproto->ms, bundle->vlan, bundle);
+ ovs_rwlock_unlock(&ofproto->ms->rwlock);
+ return 0;
+}
+
/* Ports. */
@@ -5006,6 +5059,8 @@ const struct ofproto_class ofproto_dpif_class = {
is_mirror_output_bundle,
forward_bpdu_changed,
set_mac_table_config,
+ set_mcast_snooping,
+ set_mcast_snooping_port,
set_realdev,
NULL, /* meter_get_features */
NULL, /* meter_set */
diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
index bfa0235..fc98049 100644
--- a/ofproto/ofproto-provider.h
+++ b/ofproto/ofproto-provider.h
@@ -1631,6 +1631,28 @@ struct ofproto_class {
void (*set_mac_table_config)(struct ofproto *ofproto,
unsigned int idle_time, size_t max_entries);
+ /* Sets the multicast snooping aging timeout for the OFPP_NORMAL action
+ * to 'idle_time', in seconds, and the maximum number of multicast snooping
+ * table entries to 'max_entries'.
+ *
+ * An implementation that doesn't support configuring these features may
+ * set this function to NULL or implement it as a no-op. */
+ int (*set_mcast_snooping)(struct ofproto *ofproto,
+ const struct ofproto_mcast_snooping_settings *s);
+
+ /* Configures multicast snooping on 'ofproto' using the
+ * settings defined in 's'.
+ *
+ * If 's' is nonnull, configures multicast snooping according to its
+ * members.
+ * If 's' is null, removes any multicast snooping configuration from
+ * 'ofport'.
+ *
+ * EOPNOTSUPP as a return value indicates that this ofproto_class does not
+ * support multicast snooping, as does a null pointer. */
+ int (*set_mcast_snooping_port)(struct ofproto *ofproto_, void *aux,
+ const struct ofproto_port_mcast_snooping_settings
*s);
+
/* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.)
*
* This is deprecated. It is only for compatibility with broken device drivers
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index a517264..dfb4abc 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -736,6 +736,34 @@ ofproto_set_mac_table_config(struct ofproto *ofproto,
unsigned idle_time,
}
}
+/* Multicast snooping configuration. */
+
+/* Configures IGMP snooping on 'ofproto' using the settings
+ * defined in 's'. If 's' is NULL, disables IGMP snooping.
+ *
+ * Returns 0 if successful, otherwise a positive errno value. */
+int
+ofproto_set_mcast_snooping(struct ofproto *ofproto,
+ const struct ofproto_mcast_snooping_settings *s)
+{
+ return (ofproto->ofproto_class->set_mcast_snooping
+ ? ofproto->ofproto_class->set_mcast_snooping(ofproto, s)
+ : EOPNOTSUPP);
+}
+
+/* Configures IGMP snooping on 'ofp_port' of 'ofproto' using the
+ * settings defined in 's'.
+ *
+ * Returns 0 if successful, otherwise a positive errno value.*/
+int
+ofproto_port_set_mcast_snooping(struct ofproto *ofproto, void *aux,
+ const struct ofproto_port_mcast_snooping_settings *s)
+{
+ return (ofproto->ofproto_class->set_mcast_snooping_port
+ ? ofproto->ofproto_class->set_mcast_snooping_port(ofproto, aux, s)
+ : EOPNOTSUPP);
+}
+
void
ofproto_set_threads(int n_handlers_, int n_revalidators_)
{
diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h
index ab51365..af5466b 100644
--- a/ofproto/ofproto.h
+++ b/ofproto/ofproto.h
@@ -123,6 +123,19 @@ struct ofproto_port_queue {
uint8_t dscp; /* DSCP bits (e.g. [0, 63]). */
};
+struct ofproto_mcast_snooping_settings {
+ bool enabled; /* If false, ignore other members */
+ bool flood_unreg; /* if true, flood unregistered packets to all
+ all ports. If false, send only to ports
+ connected to multicast routers */
+ unsigned int idle_time; /* Entry is removed after the idle time */
+ unsigned int max_entries; /* Size of the multicast snooping table */
+};
+
+struct ofproto_port_mcast_snooping_settings {
+ bool flood; /* If true, send all mcast packets. */
+};
+
/* How the switch should act if the controller cannot be contacted. */
enum ofproto_fail_mode {
OFPROTO_FAIL_SECURE, /* Preserve flow table. */
@@ -241,6 +254,10 @@ void ofproto_set_max_idle(unsigned max_idle);
void ofproto_set_forward_bpdu(struct ofproto *, bool forward_bpdu);
void ofproto_set_mac_table_config(struct ofproto *, unsigned idle_time,
size_t max_entries);
+int ofproto_set_mcast_snooping(struct ofproto *ofproto,
+ const struct ofproto_mcast_snooping_settings *s);
+int ofproto_port_set_mcast_snooping(struct ofproto *ofproto, void *aux,
+ const struct ofproto_port_mcast_snooping_settings *s);
void ofproto_set_threads(int n_handlers, int n_revalidators);
void ofproto_set_dp_desc(struct ofproto *, const char *dp_desc);
int ofproto_set_snoops(struct ofproto *, const struct sset *snoops);
--
1.9.0
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev