Commit 031d5c16 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

mlxsw: spectrum_router: Introduce nexthop action field

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: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarPetr Machata <petrm@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 248136fa
...@@ -2842,6 +2842,13 @@ enum mlxsw_sp_nexthop_type { ...@@ -2842,6 +2842,13 @@ enum mlxsw_sp_nexthop_type {
MLXSW_SP_NEXTHOP_TYPE_IPIP, 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 mlxsw_sp_nexthop_key {
struct fib_nh *fib_nh; struct fib_nh *fib_nh;
}; };
...@@ -2868,10 +2875,10 @@ struct mlxsw_sp_nexthop { ...@@ -2868,10 +2875,10 @@ struct mlxsw_sp_nexthop {
offloaded:1, /* set indicates this nexthop was written to the offloaded:1, /* set indicates this nexthop was written to the
* adjacency table. * 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). * 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; enum mlxsw_sp_nexthop_type type;
union { union {
struct mlxsw_sp_neigh_entry *neigh_entry; struct mlxsw_sp_neigh_entry *neigh_entry;
...@@ -2981,7 +2988,7 @@ struct mlxsw_sp_nexthop *mlxsw_sp_nexthop_next(struct mlxsw_sp_router *router, ...@@ -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) 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) 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, ...@@ -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, mlxsw_reg_ratr_pack(ratr_pl, MLXSW_REG_RATR_OP_WRITE_WRITE_ENTRY,
true, MLXSW_REG_RATR_TYPE_ETHERNET, true, MLXSW_REG_RATR_TYPE_ETHERNET,
adj_index, nh->rif->rif_index); 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_set(ratr_pl,
MLXSW_REG_RATR_TRAP_ACTION_DISCARD_ERRORS); MLXSW_REG_RATR_TRAP_ACTION_DISCARD_ERRORS);
else else
...@@ -3828,10 +3835,12 @@ mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp, ...@@ -3828,10 +3835,12 @@ mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp,
static void __mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp_nexthop *nh, static void __mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp_nexthop *nh,
bool removing) bool removing)
{ {
if (!removing) if (!removing) {
nh->action = MLXSW_SP_NEXTHOP_ACTION_FORWARD;
nh->should_offload = 1; nh->should_offload = 1;
else } else {
nh->should_offload = 0; nh->should_offload = 0;
}
nh->update = 1; nh->update = 1;
} }
...@@ -4342,7 +4351,7 @@ static void mlxsw_sp_nexthop_obj_blackhole_init(struct mlxsw_sp *mlxsw_sp, ...@@ -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; u16 lb_rif_index = mlxsw_sp->router->lb_rif_index;
nh->discard = 1; nh->action = MLXSW_SP_NEXTHOP_ACTION_DISCARD;
nh->should_offload = 1; nh->should_offload = 1;
/* While nexthops that discard packets do not forward packets /* While nexthops that discard packets do not forward packets
* via an egress RIF, they still need to be programmed using a * via an egress RIF, they still need to be programmed using a
...@@ -4405,7 +4414,7 @@ mlxsw_sp_nexthop_obj_init(struct mlxsw_sp *mlxsw_sp, ...@@ -4405,7 +4414,7 @@ mlxsw_sp_nexthop_obj_init(struct mlxsw_sp *mlxsw_sp,
static void mlxsw_sp_nexthop_obj_fini(struct mlxsw_sp *mlxsw_sp, static void mlxsw_sp_nexthop_obj_fini(struct mlxsw_sp *mlxsw_sp,
struct mlxsw_sp_nexthop *nh) 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_obj_blackhole_fini(mlxsw_sp, nh);
mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh);
list_del(&nh->router_list_node); list_del(&nh->router_list_node);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment