mlxsw: spectrum: Check requested ageing time is valid
authorIdo Schimmel <idosch@mellanox.com>
Tue, 8 Mar 2016 20:59:33 +0000 (12:59 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 11 Mar 2016 19:47:58 +0000 (14:47 -0500)
Commit c62987bbd8a1 ("bridge: push bridge setting ageing_time down to
switchdev") added a check for minimum and maximum ageing time, but this
breaks existing behaviour where one can set ageing time to 0 for a
non-learning bridge.

Push this check down to the driver and allow the check in the bridge
layer to be removed. Currently ageing time 0 is refused by the driver,
but we can later add support for this functionality.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c

index 1b691d7..4b8abaf 100644 (file)
@@ -123,6 +123,8 @@ struct mlxsw_sp {
 #define MLXSW_SP_DEFAULT_LEARNING_INTERVAL 100
                unsigned int interval; /* ms */
        } fdb_notify;
+#define MLXSW_SP_MIN_AGEING_TIME 10
+#define MLXSW_SP_MAX_AGEING_TIME 1000000
 #define MLXSW_SP_DEFAULT_AGEING_TIME 300
        u32 ageing_time;
        struct mlxsw_sp_upper master_bridge;
index 7b56098..e1c74ef 100644 (file)
@@ -311,8 +311,13 @@ static int mlxsw_sp_port_attr_br_ageing_set(struct mlxsw_sp_port *mlxsw_sp_port,
        unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t);
        u32 ageing_time = jiffies_to_msecs(ageing_jiffies) / 1000;
 
-       if (switchdev_trans_ph_prepare(trans))
-               return 0;
+       if (switchdev_trans_ph_prepare(trans)) {
+               if (ageing_time < MLXSW_SP_MIN_AGEING_TIME ||
+                   ageing_time > MLXSW_SP_MAX_AGEING_TIME)
+                       return -ERANGE;
+               else
+                       return 0;
+       }
 
        return mlxsw_sp_ageing_set(mlxsw_sp, ageing_time);
 }