--- zzzz-none-000/linux-4.9.276/net/bridge/br_fdb.c 2021-07-20 14:21:16.000000000 +0000 +++ falcon-5530-750/linux-4.9.276/net/bridge/br_fdb.c 2023-04-05 08:19:02.000000000 +0000 @@ -26,6 +26,11 @@ #include #include #include "br_private.h" +#if IS_ENABLED(CONFIG_PPA_BR_MAC_LEARNING) +#include +#endif + +#include static struct kmem_cache *br_fdb_cache __read_mostly; static struct net_bridge_fdb_entry *fdb_find(struct hlist_head *head, @@ -148,6 +153,10 @@ static void fdb_delete(struct net_bridge *br, struct net_bridge_fdb_entry *f) { +#if IS_ENABLED(CONFIG_PPA_BR_MAC_LEARNING) + if (ppa_hook_bridge_entry_delete_fn) + ppa_hook_bridge_entry_delete_fn(f->addr.addr, br->dev, 0); +#endif if (f->is_static) fdb_del_hw_addr(br, f->addr.addr); @@ -304,6 +313,16 @@ hlist_for_each_entry_safe(f, n, &br->hash[i], hlist) { unsigned long this_timer; +#if IS_ENABLED(CONFIG_PPA_BR_MAC_LEARNING) + if (ppa_hook_bridge_entry_hit_time_fn && + !f->is_local) { + unsigned int last_hit_time; + if (ppa_hook_bridge_entry_hit_time_fn(f->addr.addr, br->dev, + &last_hit_time) == + PPA_HIT) + f->updated = last_hit_time * HZ; + } +#endif if (f->is_static) continue; if (f->added_by_external_learn) @@ -593,6 +612,14 @@ fdb_modified = true; } fdb->updated = jiffies; +#if IS_ENABLED(CONFIG_PPA_BR_MAC_LEARNING) + if (ppa_hook_bridge_entry_add_fn && + source->dev) + ppa_hook_bridge_entry_add_fn( + (unsigned char *)addr, + br->dev, source->dev, + PPA_F_BRIDGE_ACCEL_MODE); +#endif if (unlikely(added_by_user)) fdb->added_by_user = 1; if (unlikely(fdb_modified)) @@ -611,6 +638,12 @@ /* else we lose race and someone else inserts * it first, don't bother updating */ +#if IS_ENABLED(CONFIG_PPA_BR_MAC_LEARNING) + if (ppa_hook_bridge_entry_add_fn && source->dev) + ppa_hook_bridge_entry_add_fn( + (unsigned char *)addr, br->dev, + source->dev, 0); +#endif spin_unlock(&br->hash_lock); } } @@ -688,6 +721,9 @@ struct sk_buff *skb; int err = -ENOBUFS; + /* fdb changed port or was deleted, must cancel any existing bypass. */ + avm_pa_flush_sessions_for_mac(fdb->addr.addr); + skb = nlmsg_new(fdb_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; @@ -1042,6 +1078,33 @@ return err; } +#if IS_ENABLED(CONFIG_DIRECTCONNECT_DP_API) +int dc_dp_br_fdb_delete(struct net_device *dev, const unsigned char *addr) +{ + struct net_bridge_port *p; + int err = 0; + + if (!dev) + return -EINVAL; + + if (!br_port_exists(dev)) + return -EINVAL; + + rcu_read_lock(); + p = br_port_get_rcu(dev); + if (p) { + if (addr) + err = __br_fdb_delete(p, addr, 0); + else + br_fdb_delete_by_port(p->br, p, 0, 0); + } + rcu_read_unlock(); + + return err; +} +EXPORT_SYMBOL(dc_dp_br_fdb_delete); +#endif + int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p) { struct net_bridge_fdb_entry *fdb, *tmp;