• Vladimir Oltean's avatar
    net: bridge: update BROPT_VLAN_ENABLED before notifying switchdev in br_vlan_filter_toggle · f7cdb3ec
    Vladimir Oltean authored
    SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING is notified by the bridge from
    two places:
    - nbp_vlan_init(), during bridge port creation
    - br_vlan_filter_toggle(), during a netlink/sysfs/ioctl change requested
      by user space
    
    If a switchdev driver uses br_vlan_enabled(br_dev) inside its handler
    for the SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING attribute notifier,
    different things will be seen depending on whether the bridge calls from
    the first path or the second:
    - in nbp_vlan_init(), br_vlan_enabled() reflects the current state of
      the bridge
    - in br_vlan_filter_toggle(), br_vlan_enabled() reflects the past state
      of the bridge
    
    This can lead in some cases to complications in driver implementation,
    which can be avoided if these could reliably use br_vlan_enabled().
    
    Nothing seems to depend on this behavior, and it seems overall more
    straightforward for br_vlan_enabled() to return the proper value even
    during the SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING notifier, so
    temporarily enable the bridge option, then revert it if the switchdev
    notifier failed.
    
    Cc: Roopa Prabhu <roopa@nvidia.com>
    Cc: Nikolay Aleksandrov <nikolay@nvidia.com>
    Cc: Ido Schimmel <idosch@nvidia.com>
    Cc: Jiri Pirko <jiri@nvidia.com>
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f7cdb3ec
br_vlan.c 53.7 KB