aboutsummaryrefslogtreecommitdiffstats
path: root/net/bridge/br_fdb.c
diff options
context:
space:
mode:
authorJiri Pirko <jiri@resnulli.us>2015-01-15 17:49:37 -0500
committerDavid S. Miller <davem@davemloft.net>2015-01-18 00:23:57 -0500
commit3aeb66176ffa8fefd7a9f7d37bda1d8adcf469a1 (patch)
tree9f2232db459c95cf0d000ab95322c6b7aac86235 /net/bridge/br_fdb.c
parent03bf0c281234028388108d0aee720954f5fe6924 (diff)
net: replace br_fdb_external_learn_* calls with switchdev notifier events
This patch benefits from newly introduced switchdev notifier and uses it to propagate fdb learn events from rocker driver to bridge. That avoids direct function calls and possible use by other listeners (ovs). Suggested-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: Jiri Pirko <jiri@resnulli.us> Signed-off-by: Scott Feldman <sfeldma@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge/br_fdb.c')
-rw-r--r--net/bridge/br_fdb.c38
1 files changed, 4 insertions, 34 deletions
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
index e6e0372bc3cd..03667e65cc29 100644
--- a/net/bridge/br_fdb.c
+++ b/net/bridge/br_fdb.c
@@ -990,26 +990,14 @@ void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p)
990 } 990 }
991} 991}
992 992
993int br_fdb_external_learn_add(struct net_device *dev, 993int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
994 const unsigned char *addr, u16 vid) 994 const unsigned char *addr, u16 vid)
995{ 995{
996 struct net_bridge_port *p;
997 struct net_bridge *br;
998 struct hlist_head *head; 996 struct hlist_head *head;
999 struct net_bridge_fdb_entry *fdb; 997 struct net_bridge_fdb_entry *fdb;
1000 int err = 0; 998 int err = 0;
1001 999
1002 rtnl_lock(); 1000 ASSERT_RTNL();
1003
1004 p = br_port_get_rtnl(dev);
1005 if (!p) {
1006 pr_info("bridge: %s not a bridge port\n", dev->name);
1007 err = -EINVAL;
1008 goto err_rtnl_unlock;
1009 }
1010
1011 br = p->br;
1012
1013 spin_lock_bh(&br->hash_lock); 1001 spin_lock_bh(&br->hash_lock);
1014 1002
1015 head = &br->hash[br_mac_hash(addr, vid)]; 1003 head = &br->hash[br_mac_hash(addr, vid)];
@@ -1034,33 +1022,18 @@ int br_fdb_external_learn_add(struct net_device *dev,
1034 1022
1035err_unlock: 1023err_unlock:
1036 spin_unlock_bh(&br->hash_lock); 1024 spin_unlock_bh(&br->hash_lock);
1037err_rtnl_unlock:
1038 rtnl_unlock();
1039 1025
1040 return err; 1026 return err;
1041} 1027}
1042EXPORT_SYMBOL(br_fdb_external_learn_add);
1043 1028
1044int br_fdb_external_learn_del(struct net_device *dev, 1029int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p,
1045 const unsigned char *addr, u16 vid) 1030 const unsigned char *addr, u16 vid)
1046{ 1031{
1047 struct net_bridge_port *p;
1048 struct net_bridge *br;
1049 struct hlist_head *head; 1032 struct hlist_head *head;
1050 struct net_bridge_fdb_entry *fdb; 1033 struct net_bridge_fdb_entry *fdb;
1051 int err = 0; 1034 int err = 0;
1052 1035
1053 rtnl_lock(); 1036 ASSERT_RTNL();
1054
1055 p = br_port_get_rtnl(dev);
1056 if (!p) {
1057 pr_info("bridge: %s not a bridge port\n", dev->name);
1058 err = -EINVAL;
1059 goto err_rtnl_unlock;
1060 }
1061
1062 br = p->br;
1063
1064 spin_lock_bh(&br->hash_lock); 1037 spin_lock_bh(&br->hash_lock);
1065 1038
1066 head = &br->hash[br_mac_hash(addr, vid)]; 1039 head = &br->hash[br_mac_hash(addr, vid)];
@@ -1071,9 +1044,6 @@ int br_fdb_external_learn_del(struct net_device *dev,
1071 err = -ENOENT; 1044 err = -ENOENT;
1072 1045
1073 spin_unlock_bh(&br->hash_lock); 1046 spin_unlock_bh(&br->hash_lock);
1074err_rtnl_unlock:
1075 rtnl_unlock();
1076 1047
1077 return err; 1048 return err;
1078} 1049}
1079EXPORT_SYMBOL(br_fdb_external_learn_del);