mlxsw: spectrum_trap: Lookup and pass cookie down to devlink_trap_report()
authorJiri Pirko <jiri@mellanox.com>
Tue, 25 Feb 2020 10:45:25 +0000 (11:45 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 25 Feb 2020 19:05:55 +0000 (11:05 -0800)
Use the cookie index received along with the packet to lookup original
flow_offload cookie binary and pass it down to devlink_trap_report().
Add "fa_cookie" metadata to the ACL trap.

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

index 9fad56df8303976df33df74ac4028e3f5f8b879a..1f2e6db743e18cbc0a6dc45decd784a2f4de82fd 100644 (file)
@@ -769,6 +769,22 @@ static void mlxsw_afa_cookie_put(struct mlxsw_afa *mlxsw_afa,
        mlxsw_afa_cookie_destroy(mlxsw_afa, cookie);
 }
 
+/* RCU read lock must be held */
+const struct flow_action_cookie *
+mlxsw_afa_cookie_lookup(struct mlxsw_afa *mlxsw_afa, u32 cookie_index)
+{
+       struct mlxsw_afa_cookie *cookie;
+
+       /* 0 index means no cookie */
+       if (!cookie_index)
+               return NULL;
+       cookie = idr_find(&mlxsw_afa->cookie_idr, cookie_index);
+       if (!cookie)
+               return NULL;
+       return &cookie->fa_cookie;
+}
+EXPORT_SYMBOL(mlxsw_afa_cookie_lookup);
+
 struct mlxsw_afa_cookie_ref {
        struct mlxsw_afa_resource resource;
        struct mlxsw_afa_cookie *cookie;
index 67473f8bd12ba15b54b2457c2e95bbe55beb9dc3..5f4c1e5051368df84f5a2440c64de26350ce9420 100644 (file)
@@ -43,6 +43,8 @@ int mlxsw_afa_block_activity_get(struct mlxsw_afa_block *block, bool *activity);
 int mlxsw_afa_block_continue(struct mlxsw_afa_block *block);
 int mlxsw_afa_block_jump(struct mlxsw_afa_block *block, u16 group_id);
 int mlxsw_afa_block_terminate(struct mlxsw_afa_block *block);
+const struct flow_action_cookie *
+mlxsw_afa_cookie_lookup(struct mlxsw_afa *mlxsw_afa, u32 cookie_index);
 int mlxsw_afa_block_append_drop(struct mlxsw_afa_block *block, bool ingress,
                                const struct flow_action_cookie *fa_cookie,
                                struct netlink_ext_ack *extack);
index c88f00b293a1ada27217e98a0846c4e591121be3..3522f96745779ff9ddcc127be572e090c0e60d18 100644 (file)
@@ -780,6 +780,12 @@ int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp,
 
 struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp);
 
+static inline const struct flow_action_cookie *
+mlxsw_sp_acl_act_cookie_lookup(struct mlxsw_sp *mlxsw_sp, u32 cookie_index)
+{
+       return mlxsw_afa_cookie_lookup(mlxsw_sp->afa, cookie_index);
+}
+
 int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp);
 void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp);
 u32 mlxsw_sp_acl_region_rehash_intrvl_get(struct mlxsw_sp *mlxsw_sp);
index a55577a50e9056dd3c62fcd700fdc1b4ea534a41..9c300d625e04356f94e85b973594074ec4d9e740 100644 (file)
@@ -75,6 +75,35 @@ static void mlxsw_sp_rx_drop_listener(struct sk_buff *skb, u8 local_port,
        consume_skb(skb);
 }
 
+static void mlxsw_sp_rx_acl_drop_listener(struct sk_buff *skb, u8 local_port,
+                                         void *trap_ctx)
+{
+       u32 cookie_index = mlxsw_skb_cb(skb)->cookie_index;
+       const struct flow_action_cookie *fa_cookie;
+       struct devlink_port *in_devlink_port;
+       struct mlxsw_sp_port *mlxsw_sp_port;
+       struct mlxsw_sp *mlxsw_sp;
+       struct devlink *devlink;
+       int err;
+
+       mlxsw_sp = devlink_trap_ctx_priv(trap_ctx);
+       mlxsw_sp_port = mlxsw_sp->ports[local_port];
+
+       err = mlxsw_sp_rx_listener(mlxsw_sp, skb, local_port, mlxsw_sp_port);
+       if (err)
+               return;
+
+       devlink = priv_to_devlink(mlxsw_sp->core);
+       in_devlink_port = mlxsw_core_port_devlink_port_get(mlxsw_sp->core,
+                                                          local_port);
+       skb_push(skb, ETH_HLEN);
+       rcu_read_lock();
+       fa_cookie = mlxsw_sp_acl_act_cookie_lookup(mlxsw_sp, cookie_index);
+       devlink_trap_report(devlink, skb, trap_ctx, in_devlink_port, fa_cookie);
+       rcu_read_unlock();
+       consume_skb(skb);
+}
+
 static void mlxsw_sp_rx_exception_listener(struct sk_buff *skb, u8 local_port,
                                           void *trap_ctx)
 {
@@ -106,6 +135,11 @@ static void mlxsw_sp_rx_exception_listener(struct sk_buff *skb, u8 local_port,
                             DEVLINK_TRAP_GROUP_GENERIC(_group_id),           \
                             MLXSW_SP_TRAP_METADATA)
 
+#define MLXSW_SP_TRAP_DROP_EXT(_id, _group_id, _metadata)                    \
+       DEVLINK_TRAP_GENERIC(DROP, DROP, _id,                                 \
+                            DEVLINK_TRAP_GROUP_GENERIC(_group_id),           \
+                            MLXSW_SP_TRAP_METADATA | (_metadata))
+
 #define MLXSW_SP_TRAP_DRIVER_DROP(_id, _group_id)                            \
        DEVLINK_TRAP_DRIVER(DROP, DROP, DEVLINK_MLXSW_TRAP_ID_##_id,          \
                            DEVLINK_MLXSW_TRAP_NAME_##_id,                    \
@@ -123,7 +157,7 @@ static void mlxsw_sp_rx_exception_listener(struct sk_buff *skb, u8 local_port,
                      SET_FW_DEFAULT, SP_##_group_id)
 
 #define MLXSW_SP_RXL_ACL_DISCARD(_id, _en_group_id, _dis_group_id)           \
-       MLXSW_RXL_DIS(mlxsw_sp_rx_drop_listener, DISCARD_##_id,               \
+       MLXSW_RXL_DIS(mlxsw_sp_rx_acl_drop_listener, DISCARD_##_id,           \
                      TRAP_EXCEPTION_TO_CPU, false, SP_##_en_group_id,        \
                      SET_FW_DEFAULT, SP_##_dis_group_id)
 
@@ -160,8 +194,10 @@ static const struct devlink_trap mlxsw_sp_traps_arr[] = {
        MLXSW_SP_TRAP_DROP(NON_ROUTABLE, L3_DROPS),
        MLXSW_SP_TRAP_EXCEPTION(DECAP_ERROR, TUNNEL_DROPS),
        MLXSW_SP_TRAP_DROP(OVERLAY_SMAC_MC, TUNNEL_DROPS),
-       MLXSW_SP_TRAP_DROP(INGRESS_FLOW_ACTION_DROP, ACL_DROPS),
-       MLXSW_SP_TRAP_DROP(EGRESS_FLOW_ACTION_DROP, ACL_DROPS),
+       MLXSW_SP_TRAP_DROP_EXT(INGRESS_FLOW_ACTION_DROP, ACL_DROPS,
+                              DEVLINK_TRAP_METADATA_TYPE_F_FA_COOKIE),
+       MLXSW_SP_TRAP_DROP_EXT(EGRESS_FLOW_ACTION_DROP, ACL_DROPS,
+                              DEVLINK_TRAP_METADATA_TYPE_F_FA_COOKIE),
 };
 
 static const struct mlxsw_listener mlxsw_sp_listeners_arr[] = {