]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mlxsw: spectrum_router: Introduce nexthop action field
authorIdo Schimmel <idosch@nvidia.com>
Mon, 22 Mar 2021 15:58:46 +0000 (17:58 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 22 Mar 2021 20:45:46 +0000 (13:45 -0700)
Currently, the action associated with the nexthop is assumed to be
'forward' unless the 'discard' bit is set.

Instead, simplify this by introducing a dedicated field to represent the
action of the nexthop. This will allow us to more easily introduce more
actions, such as trap.

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

index bdf519b569b68f8cbcb2b5e134be8e077ca48a05..3ad1e1bd2197973dbe59246fda9355cc6e71a217 100644 (file)
@@ -2842,6 +2842,13 @@ enum mlxsw_sp_nexthop_type {
        MLXSW_SP_NEXTHOP_TYPE_IPIP,
 };
 
+enum mlxsw_sp_nexthop_action {
+       /* Nexthop forwards packets to an egress RIF */
+       MLXSW_SP_NEXTHOP_ACTION_FORWARD,
+       /* Nexthop discards packets */
+       MLXSW_SP_NEXTHOP_ACTION_DISCARD,
+};
+
 struct mlxsw_sp_nexthop_key {
        struct fib_nh *fib_nh;
 };
@@ -2868,10 +2875,10 @@ struct mlxsw_sp_nexthop {
           offloaded:1, /* set indicates this nexthop was written to the
                         * adjacency table.
                         */
-          update:1, /* set indicates this nexthop should be updated in the
+          update:1; /* set indicates this nexthop should be updated in the
                      * adjacency table (f.e., its MAC changed).
                      */
-          discard:1; /* nexthop is programmed to discard packets */
+       enum mlxsw_sp_nexthop_action action;
        enum mlxsw_sp_nexthop_type type;
        union {
                struct mlxsw_sp_neigh_entry *neigh_entry;
@@ -2981,7 +2988,7 @@ struct mlxsw_sp_nexthop *mlxsw_sp_nexthop_next(struct mlxsw_sp_router *router,
 
 bool mlxsw_sp_nexthop_is_forward(const struct mlxsw_sp_nexthop *nh)
 {
-       return nh->offloaded && !nh->discard;
+       return nh->offloaded && nh->action == MLXSW_SP_NEXTHOP_ACTION_FORWARD;
 }
 
 unsigned char *mlxsw_sp_nexthop_ha(struct mlxsw_sp_nexthop *nh)
@@ -3408,7 +3415,7 @@ static int __mlxsw_sp_nexthop_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
        mlxsw_reg_ratr_pack(ratr_pl, MLXSW_REG_RATR_OP_WRITE_WRITE_ENTRY,
                            true, MLXSW_REG_RATR_TYPE_ETHERNET,
                            adj_index, nh->rif->rif_index);
-       if (nh->discard)
+       if (nh->action == MLXSW_SP_NEXTHOP_ACTION_DISCARD)
                mlxsw_reg_ratr_trap_action_set(ratr_pl,
                                               MLXSW_REG_RATR_TRAP_ACTION_DISCARD_ERRORS);
        else
@@ -3828,10 +3835,12 @@ set_trap:
 static void __mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp_nexthop *nh,
                                            bool removing)
 {
-       if (!removing)
+       if (!removing) {
+               nh->action = MLXSW_SP_NEXTHOP_ACTION_FORWARD;
                nh->should_offload = 1;
-       else
+       } else {
                nh->should_offload = 0;
+       }
        nh->update = 1;
 }
 
@@ -4342,7 +4351,7 @@ static void mlxsw_sp_nexthop_obj_blackhole_init(struct mlxsw_sp *mlxsw_sp,
 {
        u16 lb_rif_index = mlxsw_sp->router->lb_rif_index;
 
-       nh->discard = 1;
+       nh->action = MLXSW_SP_NEXTHOP_ACTION_DISCARD;
        nh->should_offload = 1;
        /* While nexthops that discard packets do not forward packets
         * via an egress RIF, they still need to be programmed using a
@@ -4405,7 +4414,7 @@ err_type_init:
 static void mlxsw_sp_nexthop_obj_fini(struct mlxsw_sp *mlxsw_sp,
                                      struct mlxsw_sp_nexthop *nh)
 {
-       if (nh->discard)
+       if (nh->action == MLXSW_SP_NEXTHOP_ACTION_DISCARD)
                mlxsw_sp_nexthop_obj_blackhole_fini(mlxsw_sp, nh);
        mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh);
        list_del(&nh->router_list_node);