netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH v0 1/2] net: bridge: propagate FDB table into hardware
@ 2012-02-09  3:22 John Fastabend
  2012-02-09  3:22 ` [RFC PATCH v0 2/2] ixgbe: add NETIF_F_HW_FDB to supported flags John Fastabend
                   ` (2 more replies)
  0 siblings, 3 replies; 52+ messages in thread
From: John Fastabend @ 2012-02-09  3:22 UTC (permalink / raw)
  To: bhutchings, roprabhu
  Cc: netdev, mst, chrisw, davem, gregory.v.rose, shemminger, kvm, sri

Propagate software FDB table into hardware uc, mc lists when
the NETIF_F_HW_FDB is set.

This resolves the case below where an embedded switch is used
in hardware to do inter-VF or VF-PF switching. This patch
pushes the FDB entry (specifically the MAC address) into the
embedded switch with dev_add_uc and dev_add_mc so the switch
"learns" about the software bridge.


          veth0  veth2
            |      |
          ------------
          |  bridge0 |   <---- software bridging
          ------------
               /
               /
  ethx.y      ethx
    VF         PF
     \         \          <---- propagate FDB entries to HW
     \         \
  --------------------
  |  Embedded Bridge |    <---- hardware offloaded switching
  --------------------

This is only an RFC couple more changes are needed.

(1) Optimize HW FDB set/del to only walk list if an FDB offloaded
    device is attached. Or decide it doesn't matter from unlikely()
    path.

(2) Is it good enough to just call dev_uc_{add|del} or
    dev_mc_{add|del}? Or do some devices really need a new netdev
    callback to do this operation correctly. I think it should be
    good enough as is.

(3) wrapped list walk in rcu_read_lock() just in case maybe every
    case is already inside rcu_read_lock()/unlock().

Also this is in response to this thread regarding the macvlan and
exposing rx filters posting now to see if folks think this is the
right idea and if it will resolve at least the bridge case.

http://lists.openwall.net/netdev/2011/11/08/135

Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
---

 include/linux/netdev_features.h |    2 ++
 net/bridge/br_fdb.c             |   34 ++++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h
index 77f5202..5936fae 100644
--- a/include/linux/netdev_features.h
+++ b/include/linux/netdev_features.h
@@ -55,6 +55,8 @@ enum {
 	NETIF_F_NOCACHE_COPY_BIT,	/* Use no-cache copyfromuser */
 	NETIF_F_LOOPBACK_BIT,		/* Enable loopback */
 
+	NETIF_F_HW_FDB,			/* Hardware supports switching */
+
 	/*
 	 * Add your fresh new feature above and remember to update
 	 * netdev_features_strings[] in net/core/ethtool.c and maybe
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
index 5ba0c84..4cc545b 100644
--- a/net/bridge/br_fdb.c
+++ b/net/bridge/br_fdb.c
@@ -81,9 +81,26 @@ static void fdb_rcu_free(struct rcu_head *head)
 	kmem_cache_free(br_fdb_cache, ent);
 }
 
+static void fdb_hw_delete(struct net_bridge *br,
+			  struct net_bridge_fdb_entry *fdb)
+{
+	struct net_bridge_port *op;
+
+	rcu_read_lock();
+	list_for_each_entry_rcu(op, &br->port_list, list) {
+		struct net_device *dev = op->dev;
+
+		if ((dev->features & NETIF_F_HW_FDB) &&
+		    dev != fdb->dst->dev)
+			dev_uc_del(dev, fdb->addr.addr);
+	}
+	rcu_read_unlock();
+}
+
 static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f)
 {
 	hlist_del_rcu(&f->hlist);
+	fdb_hw_delete(br, f);
 	fdb_notify(br, f, RTM_DELNEIGH);
 	call_rcu(&f->rcu, fdb_rcu_free);
 }
@@ -350,6 +367,22 @@ static struct net_bridge_fdb_entry *fdb_find_rcu(struct hlist_head *head,
 	return NULL;
 }
 
+static void fdb_hw_create(struct net_bridge *br,
+			  struct net_bridge_fdb_entry *fdb)
+{
+	struct net_bridge_port *op;
+
+	rcu_read_lock();
+	list_for_each_entry_rcu(op, &br->port_list, list) {
+		struct net_device *dev = op->dev;
+
+		if ((dev->features & NETIF_F_HW_FDB) &&
+		    dev != fdb->dst->dev)
+			dev_uc_add(dev, fdb->addr.addr);
+	}
+	rcu_read_unlock();
+}
+
 static struct net_bridge_fdb_entry *fdb_create(struct hlist_head *head,
 					       struct net_bridge_port *source,
 					       const unsigned char *addr)
@@ -363,6 +396,7 @@ static struct net_bridge_fdb_entry *fdb_create(struct hlist_head *head,
 		fdb->is_local = 0;
 		fdb->is_static = 0;
 		fdb->updated = fdb->used = jiffies;
+		fdb_hw_create(source->br, fdb);
 		hlist_add_head_rcu(&fdb->hlist, head);
 	}
 	return fdb;

^ permalink raw reply related	[flat|nested] 52+ messages in thread

end of thread, other threads:[~2012-03-13 13:52 UTC | newest]

Thread overview: 52+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-02-09  3:22 [RFC PATCH v0 1/2] net: bridge: propagate FDB table into hardware John Fastabend
2012-02-09  3:22 ` [RFC PATCH v0 2/2] ixgbe: add NETIF_F_HW_FDB to supported flags John Fastabend
2012-02-09  4:36 ` [RFC PATCH v0 1/2] net: bridge: propagate FDB table into hardware Stephen Hemminger
2012-02-09 17:36   ` John Fastabend
2012-02-09 17:40     ` Stephen Hemminger
2012-02-09 17:52       ` John Fastabend
2012-02-09 21:11         ` jamal
2012-02-10  2:14           ` John Fastabend
2012-02-10  4:14             ` John Fastabend
2012-02-10 15:18               ` jamal
2012-02-10 16:39                 ` Stephen Hemminger
2012-02-13 13:54                   ` jamal
2012-02-13 15:13                 ` John Fastabend
2012-02-14 13:18                   ` jamal
2012-02-14 18:57                     ` John Fastabend
2012-02-14 19:05                       ` Stephen Hemminger
2012-02-14 19:08                         ` John Fastabend
2012-02-15 14:10                       ` Jamal Hadi Salim
2012-02-16  1:26                         ` John Fastabend
2012-02-17 14:28                           ` jamal
2012-02-17 17:10                             ` John Fastabend
2012-02-18 12:41                               ` jamal
2012-02-29  4:40                                 ` John Fastabend
2012-02-29  5:14                                   ` John Fastabend
2012-02-29 13:57                                     ` Jamal Hadi Salim
2012-02-29 13:56                                   ` Jamal Hadi Salim
2012-02-29 17:25                                     ` John Fastabend
2012-02-29 17:52                                       ` Stephen Hemminger
2012-02-29 18:19                                         ` John Fastabend
2012-03-01 13:36                                           ` Jamal Hadi Salim
2012-03-01 22:17                                             ` John Fastabend
2012-03-02 13:20                                               ` jamal
2012-03-05 17:00                                             ` Lennert Buytenhek
2012-03-01 13:24                                       ` Jamal Hadi Salim
2012-03-01 14:14                                       ` Michael S. Tsirkin
2012-03-01 22:10                                         ` John Fastabend
2012-03-05 16:53                                   ` Lennert Buytenhek
2012-03-06  3:45                                     ` John Fastabend
2012-03-06 14:15                                       ` Lennert Buytenhek
2012-03-06 13:42                                     ` jamal
2012-03-06 14:09                                       ` Lennert Buytenhek
2012-03-07 14:11                                         ` Jamal Hadi Salim
2012-03-12  8:48                                           ` Lennert Buytenhek
2012-03-13 13:52                                             ` Jamal Hadi Salim
2012-02-16  3:58                 ` Ben Hutchings
2012-02-16 19:18                   ` Shradha Shah
2012-02-17 14:37                   ` jamal
2012-02-10 13:45     ` Roopa Prabhu
2012-02-09 18:14 ` Sridhar Samudrala
2012-02-09 20:30   ` John Fastabend
2012-02-10  0:39     ` Sridhar Samudrala
2012-02-10  0:51       ` John Fastabend

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).