On Fri, Oct 21, 2022 at 03:16:21PM +0200, netdev@xxxxxxxxxxxxxxxxxxxx wrote: > As it is now in the bridge, the locked port part is handled before learning > in the ingress data path, so with BR_LEARNING and BR_PORT_LOCKED, I think it > will work as it does now except link local packages. If link-local learning is enabled on a locked port, I think those addresses should also be learned with the BR_FDB_LOCKED flag. The creation of those locked FDB entries can be further suppressed by the BROPT_NO_LL_LEARN flag. > If your suggestion of BR_LEARNING causing BR_FDB_LOCKED on a locked port, I > guess it would be implemented under br_fdb_update() and BR_LEARNING + > BR_PORT_LOCKED would go together, forcing BR_LEARNING in this case, thus also > for all drivers? Yes, basically where this is placed right now (in br_handle_frame_finish): if (p->flags & BR_PORT_LOCKED) { struct net_bridge_fdb_entry *fdb_src = br_fdb_find_rcu(br, eth_hdr(skb)->h_source, vid); if (!fdb_src) { unsigned long flags = 0; if (p->flags & BR_PORT_MAB) { ~~~~~~~~~~~~~~~~~~~~~~~~ except check for BR_LEARNING __set_bit(BR_FDB_LOCKED, &flags); br_fdb_update(br, p, eth_hdr(skb)->h_source, vid, flags); } goto drop; } else if (READ_ONCE(fdb_src->dst) != p || test_bit(BR_FDB_LOCAL, &fdb_src->flags) || test_bit(BR_FDB_LOCKED, &fdb_src->flags)) { goto drop; } }