]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
mlxsw: spectrum_trap: Register ACL control traps
authorIdo Schimmel <idosch@mellanox.com>
Fri, 29 May 2020 18:36:48 +0000 (21:36 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 1 Jun 2020 18:49:23 +0000 (11:49 -0700)
In a similar fashion to other control traps, register ACL control traps
with devlink.

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

index 8daeae1384da066a58887c0780c9053bc00c9828..5ffa32b75e5fb93c731d1d07bc98a57e9c8c9c7d 100644 (file)
@@ -3987,10 +3987,15 @@ static void mlxsw_sp_rx_listener_l3_mark_func(struct sk_buff *skb,
        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,
-                                            void *priv)
+void mlxsw_sp_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
+                         u8 local_port)
+{
+       mlxsw_sp->ptp_ops->receive(mlxsw_sp, skb, local_port);
+}
+
+void mlxsw_sp_sample_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
+                            u8 local_port)
 {
-       struct mlxsw_sp *mlxsw_sp = priv;
        struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp->ports[local_port];
        struct mlxsw_sp_port_sample *sample;
        u32 size;
@@ -4014,12 +4019,6 @@ out:
        consume_skb(skb);
 }
 
-void mlxsw_sp_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
-                         u8 local_port)
-{
-       mlxsw_sp->ptp_ops->receive(mlxsw_sp, skb, local_port);
-}
-
 #define MLXSW_SP_RXL_NO_MARK(_trap_id, _action, _trap_group, _is_ctrl) \
        MLXSW_RXL(mlxsw_sp_rx_listener_no_mark_func, _trap_id, _action, \
                  _is_ctrl, SP_##_trap_group, DISCARD)
@@ -4054,11 +4053,6 @@ static const struct mlxsw_listener mlxsw_sp_listener[] = {
                             ROUTER_EXP, false),
        MLXSW_SP_RXL_NO_MARK(DISCARD_ING_ROUTER_DIP_LINK_LOCAL, FORWARD,
                             ROUTER_EXP, false),
-       /* PKT Sample trap */
-       MLXSW_RXL(mlxsw_sp_rx_listener_sample_func, PKT_SAMPLE, MIRROR_TO_CPU,
-                 false, SP_PKT_SAMPLE, DISCARD),
-       /* ACL trap */
-       MLXSW_SP_RXL_NO_MARK(ACL0, TRAP_TO_CPU, FLOW_LOGGING, false),
        /* Multicast Router Traps */
        MLXSW_SP_RXL_MARK(ACL1, TRAP_TO_CPU, MULTICAST, false),
        MLXSW_SP_RXL_L3_MARK(ACL2, TRAP_TO_CPU, MULTICAST, false),
@@ -4094,7 +4088,6 @@ static int mlxsw_sp_cpu_policers_set(struct mlxsw_core *mlxsw_core)
                switch (i) {
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_ROUTER_EXP:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_MULTICAST:
-               case MLXSW_REG_HTGT_TRAP_GROUP_SP_FLOW_LOGGING:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_FID_MISS:
                        rate = 1024;
                        burst_size = 7;
@@ -4133,20 +4126,12 @@ static int mlxsw_sp_trap_groups_set(struct mlxsw_core *mlxsw_core)
        for (i = 0; i < max_trap_groups; i++) {
                policer_id = i;
                switch (i) {
-               case MLXSW_REG_HTGT_TRAP_GROUP_SP_FLOW_LOGGING:
-                       priority = 4;
-                       tc = 4;
-                       break;
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_ROUTER_EXP:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_MULTICAST:
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_FID_MISS:
                        priority = 1;
                        tc = 1;
                        break;
-               case MLXSW_REG_HTGT_TRAP_GROUP_SP_PKT_SAMPLE:
-                       priority = 0;
-                       tc = 0;
-                       break;
                case MLXSW_REG_HTGT_TRAP_GROUP_SP_EVENT:
                        priority = MLXSW_REG_HTGT_DEFAULT_PRIORITY;
                        tc = MLXSW_REG_HTGT_DEFAULT_TC;
index 9d4dfb22cb7ac31d0421dfc1530f0da51878c0e1..6f96ca50c9bab8be632fa179281b02c254456b9e 100644 (file)
@@ -453,6 +453,8 @@ void mlxsw_sp_rx_listener_no_mark_func(struct sk_buff *skb,
                                       u8 local_port, void *priv);
 void mlxsw_sp_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
                          u8 local_port);
+void mlxsw_sp_sample_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
+                            u8 local_port);
 int mlxsw_sp_port_speed_get(struct mlxsw_sp_port *mlxsw_sp_port, u32 *speed);
 int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
                          enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,
index 148a35b7f4f8ab843d205885496a61fe46e1bdf6..157a42c63066de73e3a018743c709013bd2132db 100644 (file)
@@ -195,6 +195,23 @@ static void mlxsw_sp_rx_ptp_listener(struct sk_buff *skb, u8 local_port,
        mlxsw_sp_ptp_receive(mlxsw_sp, skb, local_port);
 }
 
+static void mlxsw_sp_rx_sample_listener(struct sk_buff *skb, u8 local_port,
+                                       void *trap_ctx)
+{
+       struct mlxsw_sp *mlxsw_sp = devlink_trap_ctx_priv(trap_ctx);
+       int err;
+
+       err = __mlxsw_sp_rx_no_mark_listener(skb, local_port, trap_ctx);
+       if (err)
+               return;
+
+       /* The sample handler expects skb->data to point to the start of the
+        * Ethernet header.
+        */
+       skb_push(skb, ETH_HLEN);
+       mlxsw_sp_sample_receive(mlxsw_sp, skb, local_port);
+}
+
 #define MLXSW_SP_TRAP_DROP(_id, _group_id)                                   \
        DEVLINK_TRAP_GENERIC(DROP, DROP, _id,                                 \
                             DEVLINK_TRAP_GROUP_GENERIC_ID_##_group_id,       \
@@ -308,6 +325,9 @@ mlxsw_sp_trap_policer_items_arr[] = {
        {
                .policer = MLXSW_SP_TRAP_POLICER(17, 19 * 1024, 4096),
        },
+       {
+               .policer = MLXSW_SP_TRAP_POLICER(18, 1024, 128),
+       },
 };
 
 static const struct mlxsw_sp_trap_group_item mlxsw_sp_trap_group_items_arr[] = {
@@ -416,6 +436,16 @@ static const struct mlxsw_sp_trap_group_item mlxsw_sp_trap_group_items_arr[] = {
                .hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_PTP1,
                .priority = 2,
        },
+       {
+               .group = DEVLINK_TRAP_GROUP_GENERIC(ACL_SAMPLE, 0),
+               .hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_PKT_SAMPLE,
+               .priority = 0,
+       },
+       {
+               .group = DEVLINK_TRAP_GROUP_GENERIC(ACL_TRAP, 18),
+               .hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_FLOW_LOGGING,
+               .priority = 4,
+       },
 };
 
 static const struct mlxsw_sp_trap_item mlxsw_sp_trap_items_arr[] = {
@@ -935,6 +965,21 @@ static const struct mlxsw_sp_trap_item mlxsw_sp_trap_items_arr[] = {
                        MLXSW_SP_RXL_NO_MARK(PTP1, PTP1, TRAP_TO_CPU, false),
                },
        },
+       {
+               .trap = MLXSW_SP_TRAP_CONTROL(FLOW_ACTION_SAMPLE, ACL_SAMPLE,
+                                             MIRROR),
+               .listeners_arr = {
+                       MLXSW_RXL(mlxsw_sp_rx_sample_listener, PKT_SAMPLE,
+                                 MIRROR_TO_CPU, false, SP_PKT_SAMPLE, DISCARD),
+               },
+       },
+       {
+               .trap = MLXSW_SP_TRAP_CONTROL(FLOW_ACTION_TRAP, ACL_TRAP, TRAP),
+               .listeners_arr = {
+                       MLXSW_SP_RXL_NO_MARK(ACL0, FLOW_LOGGING, TRAP_TO_CPU,
+                                            false),
+               },
+       },
 };
 
 static struct mlxsw_sp_trap_policer_item *