mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 00:48:50 +00:00
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: Ido Schimmel <idosch@nvidia.com> Reviewed-by: Petr Machata <petrm@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
248136fa25
commit
031d5c1606
1 changed files with 17 additions and 8 deletions
|
@ -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 @@ mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp,
|
|||
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 @@ mlxsw_sp_nexthop_obj_init(struct mlxsw_sp *mlxsw_sp,
|
|||
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);
|
||||
|
|
Loading…
Reference in a new issue