On Fri, Oct 21, 2022 at 03:16:21PM +0200, [email protected] 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;
                }
        }

Reply via email to