Thread (148 messages) 148 messages, 14 authors, 2014-12-09

Re: [patch net-next v3 09/17] bridge: add API to notify bridge driver of learned FBD on offloaded device

From: Scott Feldman <hidden>
Date: 2014-11-26 02:03:32

On Tue, Nov 25, 2014 at 12:44 PM, Florian Fainelli [off-list ref] wrote:
On 25/11/14 02:28, Jiri Pirko wrote:
quoted
From: Scott Feldman <redacted>

When the swdev device learns a new mac/vlan on a port, it sends some async
notification to the driver and the driver installs an FDB in the device.
To give a holistic system view, the learned mac/vlan should be reflected
in the bridge's FBD table, so the user, using normal iproute2 cmds, can view
what is currently learned by the device.  This API on the bridge driver gives
a way for the swdev driver to install an FBD entry in the bridge FBD table.
(And remove one).

This is equivalent to the device running these cmds:

  bridge fdb [add|del] <mac> dev <dev> vid <vlan id> master

This patch needs some extra eyeballs for review, in paricular around the
locking and contexts.

Signed-off-by: Scott Feldman <redacted>
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
---
[snip]
quoted
+     head = &br->hash[br_mac_hash(addr, vid)];
+     fdb = fdb_find(head, addr, vid);
+     if (!fdb) {
+             fdb = fdb_create(head, p, addr, vid);
+             if (!fdb) {
+                     err = -ENOMEM;
+                     goto err_unlock;
+             }
+             fdb->added_by_external_learn = 1;
+             fdb_notify(br, fdb, RTM_NEWNEIGH);
+     } else if (fdb->added_by_external_learn) {
+             /* Refresh entry */
+             fdb->updated = fdb->used = jiffies;
+     } else if (!fdb->added_by_user) {
+             /* Take over SW learned entry */
+             fdb->added_by_external_learn = 1;
+             fdb->updated = jiffies;
+             fdb_notify(br, fdb, RTM_NEWNEIGH);
+     }
Is there any case where this fdb entry gets re-used and is no longer
added by an external learning? Should we clear this flag somewhere?
Once the FDB entry is marked "added_by_external_learn" it stays marked
as such until removed by aging cleanup process (or flushed due to
interface down, etc).  If aged out (and now deleted), the FDB entry
may come back either by SW learn or by HW learn.  If SW learn comes
first, and then HW learn, HW learn will override and mark the existing
FDB entry "added_by_external_learn".  So there is take-over by HW but
no give-back to SW.  And there is no explicit clearing of the mark
short of deleting the FDB entry.  The mark is mostly for letting
user's know which FDB entries where learned by HW and synced to the
bridge's FDB.
[snip]
quoted
+EXPORT_SYMBOL(br_fdb_external_learn_del);
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 4f577c4..02cd63b 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -101,6 +101,7 @@ struct net_bridge_fdb_entry
      unsigned char                   is_local;
      unsigned char                   is_static;
      unsigned char                   added_by_user;
+     unsigned char                   added_by_external_learn;
Pheww, we could be saving some memory footprint here by using different
types here ;)
--
Florian
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help