2026-03-30, 16:01:30 +0300, Cosmin Ratiu wrote:
> @@ -2616,14 +2616,22 @@ static int macsec_update_offload(struct net_device 
> *dev, enum macsec_offload off
>       if (!ops)
>               return -EOPNOTSUPP;
>  
> -     macsec->offload = offload;
> -
>       ctx.secy = &macsec->secy;
>       ret = offload == MACSEC_OFFLOAD_OFF ? macsec_offload(ops->mdo_del_secy, 
> &ctx)
>                                           : macsec_offload(ops->mdo_add_secy, 
> &ctx);
> -     if (ret) {
> -             macsec->offload = prev_offload;
> +     if (ret)
>               return ret;
> +
> +     /* Remove VLAN filters when disabling offload. */
> +     if (offload == MACSEC_OFFLOAD_OFF) {
> +             vlan_drop_rx_ctag_filter_info(dev);
> +             vlan_drop_rx_stag_filter_info(dev);
> +     }
> +     macsec->offload = offload;
> +     /* Add VLAN filters when enabling offload. */
> +     if (prev_offload == MACSEC_OFFLOAD_OFF) {
> +             vlan_get_rx_ctag_filter_info(dev);
> +             vlan_get_rx_stag_filter_info(dev);

Paolo pointed me to the sashiko review for this patch
https://sashiko.dev/#/patchset/20260330130130.989236-1-cratiu%40nvidia.com

A simple way to trigger this is to do s/VLAN_N_VID/500/ in
nsim_vlan_rx_*_vid.

For example:

echo 1 > /sys/bus/netdevsim/new_device
ip link add link eni1np1 macsec0 type macsec
ip link add link macsec0 macsec0.1 type vlan id 1
ip link add link macsec0 macsec0.1000 type vlan id 1000
ip link set macsec0 type macsec offload mac
cat /sys/kernel/debug/netdevsim/netdevsim1/ports/0/vlan      # empty


If this happens on a real device, the VLAN filters will be broken. I'm
not sure what the right behavior would be:

1. reject the request to enable offload
2. switch to promiscuous mode


OTOH maybe we don't need to care, since __netdev_update_features also
(kind of) ignores those errors:

echo 1 > /sys/bus/netdevsim/new_device
ethtool -K eni1np1 rx-vlan-filter off
ip link add link eni1np1 eni1np1.1 type vlan id 1
ip link add link eni1np1 eni1np1.1000 type vlan id 1000
cat /sys/kernel/debug/netdevsim/netdevsim1/ports/0/vlan      # empty as expected
ethtool -K eni1np1 rx-vlan-filter on                         # succeeds
ethtool -k eni1np1 | grep rx-vlan-filter                     # "rx-vlan-filter: 
on"
cat /sys/kernel/debug/netdevsim/netdevsim1/ports/0/vlan      # still empty 
because id=1000 was rejected
                                                             # and everything 
got rolled back
ip link add link eni1np1 eni1np1.123 type vlan id 123        # succeeds
cat /sys/kernel/debug/netdevsim/netdevsim1/ports/0/vlan      # only "ctag 123"


[at this point running
    ip link del eni1np1.1
or
    ethtool -K eni1np1 rx-vlan-filter off
will splat because vlan_filter_push_vids did a rollback/never added
id=1, and now we call vlan_kill_rx_filter_info, but that's specific to
this vid limit]

-- 
Sabrina

Reply via email to