|
@@ -98,3 +98,36 @@ int br_switchdev_set_port_flag(struct net_bridge_port *p,
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+static void
|
|
|
+br_switchdev_fdb_call_notifiers(bool adding, const unsigned char *mac,
|
|
|
+ u16 vid, struct net_device *dev)
|
|
|
+{
|
|
|
+ struct switchdev_notifier_fdb_info info;
|
|
|
+ unsigned long notifier_type;
|
|
|
+
|
|
|
+ info.addr = mac;
|
|
|
+ info.vid = vid;
|
|
|
+ notifier_type = adding ? SWITCHDEV_FDB_ADD_TO_DEVICE : SWITCHDEV_FDB_DEL_TO_DEVICE;
|
|
|
+ call_switchdev_notifiers(notifier_type, dev, &info.info);
|
|
|
+}
|
|
|
+
|
|
|
+void
|
|
|
+br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
|
|
|
+{
|
|
|
+ if (!fdb->added_by_user)
|
|
|
+ return;
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case RTM_DELNEIGH:
|
|
|
+ br_switchdev_fdb_call_notifiers(false, fdb->addr.addr,
|
|
|
+ fdb->vlan_id,
|
|
|
+ fdb->dst->dev);
|
|
|
+ break;
|
|
|
+ case RTM_NEWNEIGH:
|
|
|
+ br_switchdev_fdb_call_notifiers(true, fdb->addr.addr,
|
|
|
+ fdb->vlan_id,
|
|
|
+ fdb->dst->dev);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|