mlxsw: spectrum: Add trap for multicast trap-and-forward routes
When a multicast route is configured with trap-and-forward action, the packets should be marked with skb->offload_mr_fwd_mark, in order to prevent the packets from being forwarded again by the kernel ipmr module. Due to this, it is not possible to use the already existing multicast trap (MLXSW_TRAP_ID_ACL1) as the packet should be marked differently. Add the MLXSW_TRAP_ID_ACL2 which is for trap-and-forward multicast routes, and set the offload_mr_fwd_mark skb field in its handler. Signed-off-by: Yotam Gigi <yotamg@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2678724355
commit
a0040c8c93
|
@ -3312,6 +3312,14 @@ static void mlxsw_sp_rx_listener_mark_func(struct sk_buff *skb, u8 local_port,
|
||||||
return mlxsw_sp_rx_listener_no_mark_func(skb, local_port, priv);
|
return mlxsw_sp_rx_listener_no_mark_func(skb, local_port, priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mlxsw_sp_rx_listener_mr_mark_func(struct sk_buff *skb,
|
||||||
|
u8 local_port, void *priv)
|
||||||
|
{
|
||||||
|
skb->offload_mr_fwd_mark = 1;
|
||||||
|
skb->offload_fwd_mark = 1;
|
||||||
|
return mlxsw_sp_rx_listener_no_mark_func(skb, local_port, priv);
|
||||||
|
}
|
||||||
|
|
||||||
static void mlxsw_sp_rx_listener_sample_func(struct sk_buff *skb, u8 local_port,
|
static void mlxsw_sp_rx_listener_sample_func(struct sk_buff *skb, u8 local_port,
|
||||||
void *priv)
|
void *priv)
|
||||||
{
|
{
|
||||||
|
@ -3355,6 +3363,10 @@ out:
|
||||||
MLXSW_RXL(mlxsw_sp_rx_listener_mark_func, _trap_id, _action, \
|
MLXSW_RXL(mlxsw_sp_rx_listener_mark_func, _trap_id, _action, \
|
||||||
_is_ctrl, SP_##_trap_group, DISCARD)
|
_is_ctrl, SP_##_trap_group, DISCARD)
|
||||||
|
|
||||||
|
#define MLXSW_SP_RXL_MR_MARK(_trap_id, _action, _trap_group, _is_ctrl) \
|
||||||
|
MLXSW_RXL(mlxsw_sp_rx_listener_mr_mark_func, _trap_id, _action, \
|
||||||
|
_is_ctrl, SP_##_trap_group, DISCARD)
|
||||||
|
|
||||||
#define MLXSW_SP_EVENTL(_func, _trap_id) \
|
#define MLXSW_SP_EVENTL(_func, _trap_id) \
|
||||||
MLXSW_EVENTL(_func, _trap_id, SP_EVENT)
|
MLXSW_EVENTL(_func, _trap_id, SP_EVENT)
|
||||||
|
|
||||||
|
@ -3425,6 +3437,7 @@ static const struct mlxsw_listener mlxsw_sp_listener[] = {
|
||||||
MLXSW_SP_RXL_MARK(IPV4_PIM, TRAP_TO_CPU, PIM, false),
|
MLXSW_SP_RXL_MARK(IPV4_PIM, TRAP_TO_CPU, PIM, false),
|
||||||
MLXSW_SP_RXL_MARK(RPF, TRAP_TO_CPU, RPF, false),
|
MLXSW_SP_RXL_MARK(RPF, TRAP_TO_CPU, RPF, false),
|
||||||
MLXSW_SP_RXL_MARK(ACL1, TRAP_TO_CPU, MULTICAST, false),
|
MLXSW_SP_RXL_MARK(ACL1, TRAP_TO_CPU, MULTICAST, false),
|
||||||
|
MLXSW_SP_RXL_MR_MARK(ACL2, TRAP_TO_CPU, MULTICAST, false),
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mlxsw_sp_cpu_policers_set(struct mlxsw_core *mlxsw_core)
|
static int mlxsw_sp_cpu_policers_set(struct mlxsw_core *mlxsw_core)
|
||||||
|
|
|
@ -93,6 +93,8 @@ enum {
|
||||||
MLXSW_TRAP_ID_ACL0 = 0x1C0,
|
MLXSW_TRAP_ID_ACL0 = 0x1C0,
|
||||||
/* Multicast trap used for routes with trap action */
|
/* Multicast trap used for routes with trap action */
|
||||||
MLXSW_TRAP_ID_ACL1 = 0x1C1,
|
MLXSW_TRAP_ID_ACL1 = 0x1C1,
|
||||||
|
/* Multicast trap used for routes with trap-and-forward action */
|
||||||
|
MLXSW_TRAP_ID_ACL2 = 0x1C2,
|
||||||
|
|
||||||
MLXSW_TRAP_ID_MAX = 0x1FF
|
MLXSW_TRAP_ID_MAX = 0x1FF
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue