* [PATCH v4 net-next 0/6] IGMP snooping for local traffic
@ 2017-11-09 22:10 Andrew Lunn
2017-11-09 22:10 ` [PATCH v4 net-next 1/6] net: bridge: Rename mglist to host_joined Andrew Lunn
` (7 more replies)
0 siblings, 8 replies; 10+ messages in thread
From: Andrew Lunn @ 2017-11-09 22:10 UTC (permalink / raw)
To: David Miller; +Cc: Vivien Didelot, Florian Fainelli, netdev, Andrew Lunn
The linux bridge supports IGMP snooping. It will listen to IGMP
reports on bridge ports and keep track of which groups have been
joined on an interface. It will then forward multicast based on this
group membership.
When the bridge adds or removed groups from an interface, it uses
switchdev to request the hardware add an mdb to a port, so the
hardware can perform the selective forwarding between ports.
What is not covered by the current bridge code, is IGMP joins/leaves
from the host on the brX interface. These are not reported via
switchdev so that hardware knows the local host is interested in the
multicast frames.
Luckily, the bridge does track joins/leaves on the brX interface. The
code is obfusticated, which is why i missed it with my first attempt.
So the first patch tries to remove this obfustication. Currently,
there is no notifications sent when the bridge interface joins a
group. The second patch adds them. bridge monitor then shows
joins/leaves in the same way as for other ports of the bridge.
Then starts the work passing down to the hardware that the host has
joined/left a group. The existing switchdev mdb object cannot be used,
since the semantics are different. The existing
SWITCHDEV_OBJ_ID_PORT_MDB is used to indicate a specific multicast
group should be forwarded out that port of the switch. However here we
require the exact opposite. We want multicast frames for the group
received on the port to the forwarded to the host. Hence add a new
object SWITCHDEV_OBJ_ID_HOST_MDB, a multicast database entry to
forward to the host. This new object is then propagated through the
DSA layers. No DSA driver changes should be needed, this should just
work...
This version fixes up the nitpick from Nikolay, removes an unrelated
white space change, and adds in a patch adding a few const attributes
to a couple of functions taking a port parameter, in order to stop the
following patch produces warnings.
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Andrew Lunn (6):
net: bridge: Rename mglist to host_joined
net: bridge: Send notification when host join/leaves a group
net: bridge: Add/del switchdev object on host join/leave
net: dsa: slave: Handle switchdev host mdb add/del
net: dsa: add more const attributes
net: dsa: switch: Don't add CPU port to an mdb by default
include/net/switchdev.h | 1 +
net/bridge/br_input.c | 2 +-
net/bridge/br_mdb.c | 54 +++++++++++++++++++++++++++++++++++++++++++----
net/bridge/br_multicast.c | 18 ++++++++++------
net/bridge/br_private.h | 2 +-
net/dsa/dsa_priv.h | 4 ++--
net/dsa/port.c | 6 +++---
net/dsa/slave.c | 13 ++++++++++++
net/dsa/switch.c | 2 +-
net/switchdev/switchdev.c | 2 ++
10 files changed, 85 insertions(+), 19 deletions(-)
--
2.15.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v4 net-next 1/6] net: bridge: Rename mglist to host_joined
2017-11-09 22:10 [PATCH v4 net-next 0/6] IGMP snooping for local traffic Andrew Lunn
@ 2017-11-09 22:10 ` Andrew Lunn
2017-11-09 22:10 ` [PATCH v4 net-next 2/6] net: bridge: Send notification when host join/leaves a group Andrew Lunn
` (6 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Andrew Lunn @ 2017-11-09 22:10 UTC (permalink / raw)
To: David Miller; +Cc: Vivien Didelot, Florian Fainelli, netdev, Andrew Lunn
The boolean mglist indicates the host has joined a particular
multicast group on the bridge interface. It is badly named, obscuring
what is means. Rename it.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
---
net/bridge/br_input.c | 2 +-
net/bridge/br_mdb.c | 2 +-
net/bridge/br_multicast.c | 14 +++++++-------
net/bridge/br_private.h | 2 +-
4 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
index a096d3e189da..7f98a7d25866 100644
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
@@ -137,7 +137,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
mdst = br_mdb_get(br, skb, vid);
if ((mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) &&
br_multicast_querier_exists(br, eth_hdr(skb))) {
- if ((mdst && mdst->mglist) ||
+ if ((mdst && mdst->host_joined) ||
br_multicast_is_router(br)) {
local_rcv = true;
br->dev->stats.multicast++;
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c
index 31ddff22563e..aa716a33cb71 100644
--- a/net/bridge/br_mdb.c
+++ b/net/bridge/br_mdb.c
@@ -655,7 +655,7 @@ static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry)
call_rcu_bh(&p->rcu, br_multicast_free_pg);
err = 0;
- if (!mp->ports && !mp->mglist &&
+ if (!mp->ports && !mp->host_joined &&
netif_running(br->dev))
mod_timer(&mp->timer, jiffies);
break;
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index 5f7f0e9d446c..bfe5adb1f51c 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -249,7 +249,7 @@ static void br_multicast_group_expired(struct timer_list *t)
if (!netif_running(br->dev) || timer_pending(&mp->timer))
goto out;
- mp->mglist = false;
+ mp->host_joined = false;
if (mp->ports)
goto out;
@@ -292,7 +292,7 @@ static void br_multicast_del_pg(struct net_bridge *br,
p->flags);
call_rcu_bh(&p->rcu, br_multicast_free_pg);
- if (!mp->ports && !mp->mglist &&
+ if (!mp->ports && !mp->host_joined &&
netif_running(br->dev))
mod_timer(&mp->timer, jiffies);
@@ -773,7 +773,7 @@ static int br_multicast_add_group(struct net_bridge *br,
goto err;
if (!port) {
- mp->mglist = true;
+ mp->host_joined = true;
mod_timer(&mp->timer, now + br->multicast_membership_interval);
goto out;
}
@@ -1477,7 +1477,7 @@ static int br_ip4_multicast_query(struct net_bridge *br,
max_delay *= br->multicast_last_member_count;
- if (mp->mglist &&
+ if (mp->host_joined &&
(timer_pending(&mp->timer) ?
time_after(mp->timer.expires, now + max_delay) :
try_to_del_timer_sync(&mp->timer) >= 0))
@@ -1561,7 +1561,7 @@ static int br_ip6_multicast_query(struct net_bridge *br,
goto out;
max_delay *= br->multicast_last_member_count;
- if (mp->mglist &&
+ if (mp->host_joined &&
(timer_pending(&mp->timer) ?
time_after(mp->timer.expires, now + max_delay) :
try_to_del_timer_sync(&mp->timer) >= 0))
@@ -1622,7 +1622,7 @@ br_multicast_leave_group(struct net_bridge *br,
br_mdb_notify(br->dev, port, group, RTM_DELMDB,
p->flags);
- if (!mp->ports && !mp->mglist &&
+ if (!mp->ports && !mp->host_joined &&
netif_running(br->dev))
mod_timer(&mp->timer, jiffies);
}
@@ -1662,7 +1662,7 @@ br_multicast_leave_group(struct net_bridge *br,
br->multicast_last_member_interval;
if (!port) {
- if (mp->mglist &&
+ if (mp->host_joined &&
(timer_pending(&mp->timer) ?
time_after(mp->timer.expires, time) :
try_to_del_timer_sync(&mp->timer) >= 0)) {
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 40553d832b6e..1312b8d20ec3 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -209,7 +209,7 @@ struct net_bridge_mdb_entry
struct rcu_head rcu;
struct timer_list timer;
struct br_ip addr;
- bool mglist;
+ bool host_joined;
};
struct net_bridge_mdb_htable
--
2.15.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 net-next 2/6] net: bridge: Send notification when host join/leaves a group
2017-11-09 22:10 [PATCH v4 net-next 0/6] IGMP snooping for local traffic Andrew Lunn
2017-11-09 22:10 ` [PATCH v4 net-next 1/6] net: bridge: Rename mglist to host_joined Andrew Lunn
@ 2017-11-09 22:10 ` Andrew Lunn
2017-11-09 22:10 ` [PATCH v4 net-next 3/6] net: bridge: Add/del switchdev object on host join/leave Andrew Lunn
` (5 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Andrew Lunn @ 2017-11-09 22:10 UTC (permalink / raw)
To: David Miller; +Cc: Vivien Didelot, Florian Fainelli, netdev, Andrew Lunn
The host can join or leave a multicast group on the brX interface, as
indicated by IGMP snooping. This is tracked within the bridge
multicast code. Send a notification when this happens, in the same way
a notification is sent when a port of the bridge joins/leaves a group
because of IGMP snooping.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
---
net/bridge/br_mdb.c | 9 ++++++---
net/bridge/br_multicast.c | 6 +++++-
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c
index aa716a33cb71..702408d2a93c 100644
--- a/net/bridge/br_mdb.c
+++ b/net/bridge/br_mdb.c
@@ -317,7 +317,7 @@ static void __br_mdb_notify(struct net_device *dev, struct net_bridge_port *p,
#endif
mdb.obj.orig_dev = port_dev;
- if (port_dev && type == RTM_NEWMDB) {
+ if (p && port_dev && type == RTM_NEWMDB) {
complete_info = kmalloc(sizeof(*complete_info), GFP_ATOMIC);
if (complete_info) {
complete_info->port = p;
@@ -327,7 +327,7 @@ static void __br_mdb_notify(struct net_device *dev, struct net_bridge_port *p,
if (switchdev_port_obj_add(port_dev, &mdb.obj))
kfree(complete_info);
}
- } else if (port_dev && type == RTM_DELMDB) {
+ } else if (p && port_dev && type == RTM_DELMDB) {
switchdev_port_obj_del(port_dev, &mdb.obj);
}
@@ -353,7 +353,10 @@ void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
struct br_mdb_entry entry;
memset(&entry, 0, sizeof(entry));
- entry.ifindex = port->dev->ifindex;
+ if (port)
+ entry.ifindex = port->dev->ifindex;
+ else
+ entry.ifindex = dev->ifindex;
entry.addr.proto = group->proto;
entry.addr.u.ip4 = group->u.ip4;
#if IS_ENABLED(CONFIG_IPV6)
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index bfe5adb1f51c..cb4729539b82 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -250,6 +250,7 @@ static void br_multicast_group_expired(struct timer_list *t)
goto out;
mp->host_joined = false;
+ br_mdb_notify(br->dev, NULL, &mp->addr, RTM_DELMDB, 0);
if (mp->ports)
goto out;
@@ -773,7 +774,10 @@ static int br_multicast_add_group(struct net_bridge *br,
goto err;
if (!port) {
- mp->host_joined = true;
+ if (!mp->host_joined) {
+ mp->host_joined = true;
+ br_mdb_notify(br->dev, NULL, &mp->addr, RTM_NEWMDB, 0);
+ }
mod_timer(&mp->timer, now + br->multicast_membership_interval);
goto out;
}
--
2.15.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 net-next 3/6] net: bridge: Add/del switchdev object on host join/leave
2017-11-09 22:10 [PATCH v4 net-next 0/6] IGMP snooping for local traffic Andrew Lunn
2017-11-09 22:10 ` [PATCH v4 net-next 1/6] net: bridge: Rename mglist to host_joined Andrew Lunn
2017-11-09 22:10 ` [PATCH v4 net-next 2/6] net: bridge: Send notification when host join/leaves a group Andrew Lunn
@ 2017-11-09 22:10 ` Andrew Lunn
2017-11-09 22:11 ` [PATCH v4 net-next 4/6] net: dsa: slave: Handle switchdev host mdb add/del Andrew Lunn
` (4 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Andrew Lunn @ 2017-11-09 22:10 UTC (permalink / raw)
To: David Miller; +Cc: Vivien Didelot, Florian Fainelli, netdev, Andrew Lunn
When the host joins or leaves a multicast group, use switchdev to add
an object to the hardware to forward traffic for the group to the
host.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
---
v4: Use switch statement in br_mdb_switchdev_host_port()
---
include/net/switchdev.h | 1 +
net/bridge/br_mdb.c | 43 +++++++++++++++++++++++++++++++++++++++++++
net/switchdev/switchdev.c | 2 ++
3 files changed, 46 insertions(+)
diff --git a/include/net/switchdev.h b/include/net/switchdev.h
index d756fbe46625..39bc855d7fee 100644
--- a/include/net/switchdev.h
+++ b/include/net/switchdev.h
@@ -76,6 +76,7 @@ enum switchdev_obj_id {
SWITCHDEV_OBJ_ID_UNDEFINED,
SWITCHDEV_OBJ_ID_PORT_VLAN,
SWITCHDEV_OBJ_ID_PORT_MDB,
+ SWITCHDEV_OBJ_ID_HOST_MDB,
};
struct switchdev_obj {
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c
index 702408d2a93c..b0f4c734900b 100644
--- a/net/bridge/br_mdb.c
+++ b/net/bridge/br_mdb.c
@@ -292,6 +292,46 @@ static void br_mdb_complete(struct net_device *dev, int err, void *priv)
kfree(priv);
}
+static void br_mdb_switchdev_host_port(struct net_device *dev,
+ struct net_device *lower_dev,
+ struct br_mdb_entry *entry, int type)
+{
+ struct switchdev_obj_port_mdb mdb = {
+ .obj = {
+ .id = SWITCHDEV_OBJ_ID_HOST_MDB,
+ .flags = SWITCHDEV_F_DEFER,
+ },
+ .vid = entry->vid,
+ };
+
+ if (entry->addr.proto == htons(ETH_P_IP))
+ ip_eth_mc_map(entry->addr.u.ip4, mdb.addr);
+#if IS_ENABLED(CONFIG_IPV6)
+ else
+ ipv6_eth_mc_map(&entry->addr.u.ip6, mdb.addr);
+#endif
+
+ mdb.obj.orig_dev = dev;
+ switch (type) {
+ case RTM_NEWMDB:
+ switchdev_port_obj_add(lower_dev, &mdb.obj);
+ break;
+ case RTM_DELMDB:
+ switchdev_port_obj_del(lower_dev, &mdb.obj);
+ break;
+ }
+}
+
+static void br_mdb_switchdev_host(struct net_device *dev,
+ struct br_mdb_entry *entry, int type)
+{
+ struct net_device *lower_dev;
+ struct list_head *iter;
+
+ netdev_for_each_lower_dev(dev, lower_dev, iter)
+ br_mdb_switchdev_host_port(dev, lower_dev, entry, type);
+}
+
static void __br_mdb_notify(struct net_device *dev, struct net_bridge_port *p,
struct br_mdb_entry *entry, int type)
{
@@ -331,6 +371,9 @@ static void __br_mdb_notify(struct net_device *dev, struct net_bridge_port *p,
switchdev_port_obj_del(port_dev, &mdb.obj);
}
+ if (!p)
+ br_mdb_switchdev_host(dev, entry, type);
+
skb = nlmsg_new(rtnl_mdb_nlmsg_size(), GFP_ATOMIC);
if (!skb)
goto errout;
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c
index 0531b41d1f2d..74b9d916a58b 100644
--- a/net/switchdev/switchdev.c
+++ b/net/switchdev/switchdev.c
@@ -345,6 +345,8 @@ static size_t switchdev_obj_size(const struct switchdev_obj *obj)
return sizeof(struct switchdev_obj_port_vlan);
case SWITCHDEV_OBJ_ID_PORT_MDB:
return sizeof(struct switchdev_obj_port_mdb);
+ case SWITCHDEV_OBJ_ID_HOST_MDB:
+ return sizeof(struct switchdev_obj_port_mdb);
default:
BUG();
}
--
2.15.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 net-next 4/6] net: dsa: slave: Handle switchdev host mdb add/del
2017-11-09 22:10 [PATCH v4 net-next 0/6] IGMP snooping for local traffic Andrew Lunn
` (2 preceding siblings ...)
2017-11-09 22:10 ` [PATCH v4 net-next 3/6] net: bridge: Add/del switchdev object on host join/leave Andrew Lunn
@ 2017-11-09 22:11 ` Andrew Lunn
2017-11-09 22:11 ` [PATCH v4 net-next 5/6] net: dsa: add more const attributes Andrew Lunn
` (3 subsequent siblings)
7 siblings, 0 replies; 10+ messages in thread
From: Andrew Lunn @ 2017-11-09 22:11 UTC (permalink / raw)
To: David Miller; +Cc: Vivien Didelot, Florian Fainelli, netdev, Andrew Lunn
Add code to handle switchdev host mdb add/del. Since DSA uses one of
the switch ports as a transport to the host, we just need to add an
MDB on this port.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
net/dsa/slave.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 9ecd8f85ea29..d6e7a642493b 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -304,6 +304,13 @@ static int dsa_slave_port_obj_add(struct net_device *dev,
case SWITCHDEV_OBJ_ID_PORT_MDB:
err = dsa_port_mdb_add(dp, SWITCHDEV_OBJ_PORT_MDB(obj), trans);
break;
+ case SWITCHDEV_OBJ_ID_HOST_MDB:
+ /* DSA can directly translate this to a normal MDB add,
+ * but on the CPU port.
+ */
+ err = dsa_port_mdb_add(dp->cpu_dp, SWITCHDEV_OBJ_PORT_MDB(obj),
+ trans);
+ break;
case SWITCHDEV_OBJ_ID_PORT_VLAN:
err = dsa_port_vlan_add(dp, SWITCHDEV_OBJ_PORT_VLAN(obj),
trans);
@@ -326,6 +333,12 @@ static int dsa_slave_port_obj_del(struct net_device *dev,
case SWITCHDEV_OBJ_ID_PORT_MDB:
err = dsa_port_mdb_del(dp, SWITCHDEV_OBJ_PORT_MDB(obj));
break;
+ case SWITCHDEV_OBJ_ID_HOST_MDB:
+ /* DSA can directly translate this to a normal MDB add,
+ * but on the CPU port.
+ */
+ err = dsa_port_mdb_del(dp->cpu_dp, SWITCHDEV_OBJ_PORT_MDB(obj));
+ break;
case SWITCHDEV_OBJ_ID_PORT_VLAN:
err = dsa_port_vlan_del(dp, SWITCHDEV_OBJ_PORT_VLAN(obj));
break;
--
2.15.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 net-next 5/6] net: dsa: add more const attributes
2017-11-09 22:10 [PATCH v4 net-next 0/6] IGMP snooping for local traffic Andrew Lunn
` (3 preceding siblings ...)
2017-11-09 22:11 ` [PATCH v4 net-next 4/6] net: dsa: slave: Handle switchdev host mdb add/del Andrew Lunn
@ 2017-11-09 22:11 ` Andrew Lunn
2017-11-09 22:18 ` Vivien Didelot
2017-11-09 22:11 ` [PATCH v4 net-next 6/6] net: dsa: switch: Don't add CPU port to an mdb by default Andrew Lunn
` (2 subsequent siblings)
7 siblings, 1 reply; 10+ messages in thread
From: Andrew Lunn @ 2017-11-09 22:11 UTC (permalink / raw)
To: David Miller; +Cc: Vivien Didelot, Florian Fainelli, netdev, Andrew Lunn
The notify mechanism does not need to modify the port it is notifying.
So make the parameter const.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
net/dsa/dsa_priv.h | 4 ++--
net/dsa/port.c | 6 +++---
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h
index bb0218c1b570..507e1ce4d4d2 100644
--- a/net/dsa/dsa_priv.h
+++ b/net/dsa/dsa_priv.h
@@ -147,10 +147,10 @@ int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr,
int dsa_port_fdb_del(struct dsa_port *dp, const unsigned char *addr,
u16 vid);
int dsa_port_fdb_dump(struct dsa_port *dp, dsa_fdb_dump_cb_t *cb, void *data);
-int dsa_port_mdb_add(struct dsa_port *dp,
+int dsa_port_mdb_add(const struct dsa_port *dp,
const struct switchdev_obj_port_mdb *mdb,
struct switchdev_trans *trans);
-int dsa_port_mdb_del(struct dsa_port *dp,
+int dsa_port_mdb_del(const struct dsa_port *dp,
const struct switchdev_obj_port_mdb *mdb);
int dsa_port_vlan_add(struct dsa_port *dp,
const struct switchdev_obj_port_vlan *vlan,
diff --git a/net/dsa/port.c b/net/dsa/port.c
index bb30b1a7de3a..a85cd63a91c4 100644
--- a/net/dsa/port.c
+++ b/net/dsa/port.c
@@ -17,7 +17,7 @@
#include "dsa_priv.h"
-static int dsa_port_notify(struct dsa_port *dp, unsigned long e, void *v)
+static int dsa_port_notify(const struct dsa_port *dp, unsigned long e, void *v)
{
struct raw_notifier_head *nh = &dp->ds->dst->nh;
int err;
@@ -215,7 +215,7 @@ int dsa_port_fdb_dump(struct dsa_port *dp, dsa_fdb_dump_cb_t *cb, void *data)
return ds->ops->port_fdb_dump(ds, port, cb, data);
}
-int dsa_port_mdb_add(struct dsa_port *dp,
+int dsa_port_mdb_add(const struct dsa_port *dp,
const struct switchdev_obj_port_mdb *mdb,
struct switchdev_trans *trans)
{
@@ -229,7 +229,7 @@ int dsa_port_mdb_add(struct dsa_port *dp,
return dsa_port_notify(dp, DSA_NOTIFIER_MDB_ADD, &info);
}
-int dsa_port_mdb_del(struct dsa_port *dp,
+int dsa_port_mdb_del(const struct dsa_port *dp,
const struct switchdev_obj_port_mdb *mdb)
{
struct dsa_notifier_mdb_info info = {
--
2.15.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 net-next 6/6] net: dsa: switch: Don't add CPU port to an mdb by default
2017-11-09 22:10 [PATCH v4 net-next 0/6] IGMP snooping for local traffic Andrew Lunn
` (4 preceding siblings ...)
2017-11-09 22:11 ` [PATCH v4 net-next 5/6] net: dsa: add more const attributes Andrew Lunn
@ 2017-11-09 22:11 ` Andrew Lunn
2017-11-10 2:03 ` [PATCH v4 net-next 0/6] IGMP snooping for local traffic Nikolay Aleksandrov
2017-11-10 4:42 ` David Miller
7 siblings, 0 replies; 10+ messages in thread
From: Andrew Lunn @ 2017-11-09 22:11 UTC (permalink / raw)
To: David Miller; +Cc: Vivien Didelot, Florian Fainelli, netdev, Andrew Lunn
Now that the host indicates when a multicast group should be forwarded
from the switch to the host, don't do it by default.
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
v4:
Fix unrelated white space change
---
net/dsa/switch.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/dsa/switch.c b/net/dsa/switch.c
index e6c06aa349a6..1155e43c157f 100644
--- a/net/dsa/switch.c
+++ b/net/dsa/switch.c
@@ -121,7 +121,7 @@ static int dsa_switch_mdb_add(struct dsa_switch *ds,
if (ds->index == info->sw_index)
set_bit(info->port, group);
for (port = 0; port < ds->num_ports; port++)
- if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port))
+ if (dsa_is_dsa_port(ds, port))
set_bit(port, group);
if (switchdev_trans_ph_prepare(trans)) {
--
2.15.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v4 net-next 5/6] net: dsa: add more const attributes
2017-11-09 22:11 ` [PATCH v4 net-next 5/6] net: dsa: add more const attributes Andrew Lunn
@ 2017-11-09 22:18 ` Vivien Didelot
0 siblings, 0 replies; 10+ messages in thread
From: Vivien Didelot @ 2017-11-09 22:18 UTC (permalink / raw)
To: Andrew Lunn, David Miller; +Cc: Florian Fainelli, netdev, Andrew Lunn
Hi Andrew,
Andrew Lunn <andrew@lunn.ch> writes:
> The notify mechanism does not need to modify the port it is notifying.
> So make the parameter const.
>
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v4 net-next 0/6] IGMP snooping for local traffic
2017-11-09 22:10 [PATCH v4 net-next 0/6] IGMP snooping for local traffic Andrew Lunn
` (5 preceding siblings ...)
2017-11-09 22:11 ` [PATCH v4 net-next 6/6] net: dsa: switch: Don't add CPU port to an mdb by default Andrew Lunn
@ 2017-11-10 2:03 ` Nikolay Aleksandrov
2017-11-10 4:42 ` David Miller
7 siblings, 0 replies; 10+ messages in thread
From: Nikolay Aleksandrov @ 2017-11-10 2:03 UTC (permalink / raw)
To: Andrew Lunn, David Miller; +Cc: Vivien Didelot, Florian Fainelli, netdev
On 10.11.2017 00:10, Andrew Lunn wrote:
> The linux bridge supports IGMP snooping. It will listen to IGMP
> reports on bridge ports and keep track of which groups have been
> joined on an interface. It will then forward multicast based on this
> group membership.
>
> When the bridge adds or removed groups from an interface, it uses
> switchdev to request the hardware add an mdb to a port, so the
> hardware can perform the selective forwarding between ports.
>
> What is not covered by the current bridge code, is IGMP joins/leaves
> from the host on the brX interface. These are not reported via
> switchdev so that hardware knows the local host is interested in the
> multicast frames.
>
> Luckily, the bridge does track joins/leaves on the brX interface. The
> code is obfusticated, which is why i missed it with my first attempt.
> So the first patch tries to remove this obfustication. Currently,
> there is no notifications sent when the bridge interface joins a
> group. The second patch adds them. bridge monitor then shows
> joins/leaves in the same way as for other ports of the bridge.
>
> Then starts the work passing down to the hardware that the host has
> joined/left a group. The existing switchdev mdb object cannot be used,
> since the semantics are different. The existing
> SWITCHDEV_OBJ_ID_PORT_MDB is used to indicate a specific multicast
> group should be forwarded out that port of the switch. However here we
> require the exact opposite. We want multicast frames for the group
> received on the port to the forwarded to the host. Hence add a new
> object SWITCHDEV_OBJ_ID_HOST_MDB, a multicast database entry to
> forward to the host. This new object is then propagated through the
> DSA layers. No DSA driver changes should be needed, this should just
> work...
>
> This version fixes up the nitpick from Nikolay, removes an unrelated
> white space change, and adds in a patch adding a few const attributes
> to a couple of functions taking a port parameter, in order to stop the
> following patch produces warnings.
>
> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
>
> Andrew Lunn (6):
> net: bridge: Rename mglist to host_joined
> net: bridge: Send notification when host join/leaves a group
> net: bridge: Add/del switchdev object on host join/leave
> net: dsa: slave: Handle switchdev host mdb add/del
> net: dsa: add more const attributes
> net: dsa: switch: Don't add CPU port to an mdb by default
>
> include/net/switchdev.h | 1 +
> net/bridge/br_input.c | 2 +-
> net/bridge/br_mdb.c | 54 +++++++++++++++++++++++++++++++++++++++++++----
> net/bridge/br_multicast.c | 18 ++++++++++------
> net/bridge/br_private.h | 2 +-
> net/dsa/dsa_priv.h | 4 ++--
> net/dsa/port.c | 6 +++---
> net/dsa/slave.c | 13 ++++++++++++
> net/dsa/switch.c | 2 +-
> net/switchdev/switchdev.c | 2 ++
> 10 files changed, 85 insertions(+), 19 deletions(-)
>
Andrew, overall looks good to me, thanks for keeping the acks and
incorporating the changes. Just one note - in the future please add the
reviewers to the CC list. I've been reviewing and suggesting changes to
this set since its RFC/WIP version but it's making it harder to track
when I'm not receiving the new versions and have to search for them on
netdev.
Thanks,
Nik
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v4 net-next 0/6] IGMP snooping for local traffic
2017-11-09 22:10 [PATCH v4 net-next 0/6] IGMP snooping for local traffic Andrew Lunn
` (6 preceding siblings ...)
2017-11-10 2:03 ` [PATCH v4 net-next 0/6] IGMP snooping for local traffic Nikolay Aleksandrov
@ 2017-11-10 4:42 ` David Miller
7 siblings, 0 replies; 10+ messages in thread
From: David Miller @ 2017-11-10 4:42 UTC (permalink / raw)
To: andrew; +Cc: vivien.didelot, f.fainelli, netdev
From: Andrew Lunn <andrew@lunn.ch>
Date: Thu, 9 Nov 2017 23:10:56 +0100
> The linux bridge supports IGMP snooping. It will listen to IGMP
> reports on bridge ports and keep track of which groups have been
> joined on an interface. It will then forward multicast based on this
> group membership.
>
> When the bridge adds or removed groups from an interface, it uses
> switchdev to request the hardware add an mdb to a port, so the
> hardware can perform the selective forwarding between ports.
>
> What is not covered by the current bridge code, is IGMP joins/leaves
> from the host on the brX interface. These are not reported via
> switchdev so that hardware knows the local host is interested in the
> multicast frames.
>
> Luckily, the bridge does track joins/leaves on the brX interface. The
> code is obfusticated, which is why i missed it with my first attempt.
> So the first patch tries to remove this obfustication. Currently,
> there is no notifications sent when the bridge interface joins a
> group. The second patch adds them. bridge monitor then shows
> joins/leaves in the same way as for other ports of the bridge.
>
> Then starts the work passing down to the hardware that the host has
> joined/left a group. The existing switchdev mdb object cannot be used,
> since the semantics are different. The existing
> SWITCHDEV_OBJ_ID_PORT_MDB is used to indicate a specific multicast
> group should be forwarded out that port of the switch. However here we
> require the exact opposite. We want multicast frames for the group
> received on the port to the forwarded to the host. Hence add a new
> object SWITCHDEV_OBJ_ID_HOST_MDB, a multicast database entry to
> forward to the host. This new object is then propagated through the
> DSA layers. No DSA driver changes should be needed, this should just
> work...
>
> This version fixes up the nitpick from Nikolay, removes an unrelated
> white space change, and adds in a patch adding a few const attributes
> to a couple of functions taking a port parameter, in order to stop the
> following patch produces warnings.
>
> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Series applied, thanks Andrew.
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2017-11-10 4:42 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-09 22:10 [PATCH v4 net-next 0/6] IGMP snooping for local traffic Andrew Lunn
2017-11-09 22:10 ` [PATCH v4 net-next 1/6] net: bridge: Rename mglist to host_joined Andrew Lunn
2017-11-09 22:10 ` [PATCH v4 net-next 2/6] net: bridge: Send notification when host join/leaves a group Andrew Lunn
2017-11-09 22:10 ` [PATCH v4 net-next 3/6] net: bridge: Add/del switchdev object on host join/leave Andrew Lunn
2017-11-09 22:11 ` [PATCH v4 net-next 4/6] net: dsa: slave: Handle switchdev host mdb add/del Andrew Lunn
2017-11-09 22:11 ` [PATCH v4 net-next 5/6] net: dsa: add more const attributes Andrew Lunn
2017-11-09 22:18 ` Vivien Didelot
2017-11-09 22:11 ` [PATCH v4 net-next 6/6] net: dsa: switch: Don't add CPU port to an mdb by default Andrew Lunn
2017-11-10 2:03 ` [PATCH v4 net-next 0/6] IGMP snooping for local traffic Nikolay Aleksandrov
2017-11-10 4:42 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).