mlxsw: spectrum_router: mlxsw_sp_inetaddr_bridge_event: Add an argument
authorPetr Machata <petrm@nvidia.com>
Thu, 13 Jul 2023 16:15:28 +0000 (18:15 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 14 Jul 2023 09:20:15 +0000 (10:20 +0100)
For purposes of replay, mlxsw_sp_inetaddr_bridge_event() will need to make
decisions based on the proposed value of PVID. Querying PVID reveals the
current settings, not the in-flight values that the user requested and that
the notifiers are acting upon. Add a parameter, lower_pvid, which carries
the proposed PVID of the lower bridge, or -1 if the lower is not a bridge.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Danielle Ratson <danieller@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

index 3a51032..63f40d1 100644 (file)
@@ -8826,6 +8826,7 @@ static int mlxsw_sp_inetaddr_lag_event(struct net_device *lag_dev,
 
 static int mlxsw_sp_inetaddr_bridge_event(struct mlxsw_sp *mlxsw_sp,
                                          struct net_device *l3_dev,
+                                         int lower_pvid,
                                          unsigned long event,
                                          struct netlink_ext_ack *extack)
 {
@@ -8873,6 +8874,8 @@ static int mlxsw_sp_inetaddr_vlan_event(struct mlxsw_sp *mlxsw_sp,
 {
        struct net_device *real_dev = vlan_dev_real_dev(vlan_dev);
        u16 vid = vlan_dev_vlan_id(vlan_dev);
+       u16 lower_pvid;
+       int err;
 
        if (netif_is_bridge_port(vlan_dev))
                return 0;
@@ -8885,7 +8888,11 @@ static int mlxsw_sp_inetaddr_vlan_event(struct mlxsw_sp *mlxsw_sp,
                                                     vid, extack);
        } else if (netif_is_bridge_master(real_dev) &&
                   br_vlan_enabled(real_dev)) {
-               return mlxsw_sp_inetaddr_bridge_event(mlxsw_sp, vlan_dev, event,
+               err = br_vlan_get_pvid(real_dev, &lower_pvid);
+               if (err)
+                       return err;
+               return mlxsw_sp_inetaddr_bridge_event(mlxsw_sp, vlan_dev,
+                                                     lower_pvid, event,
                                                      extack);
        }
 
@@ -9022,7 +9029,7 @@ static int __mlxsw_sp_inetaddr_event(struct mlxsw_sp *mlxsw_sp,
        else if (netif_is_lag_master(dev))
                return mlxsw_sp_inetaddr_lag_event(dev, event, extack);
        else if (netif_is_bridge_master(dev))
-               return mlxsw_sp_inetaddr_bridge_event(mlxsw_sp, dev, event,
+               return mlxsw_sp_inetaddr_bridge_event(mlxsw_sp, dev, -1, event,
                                                      extack);
        else if (is_vlan_dev(dev))
                return mlxsw_sp_inetaddr_vlan_event(mlxsw_sp, dev, event,