mlxsw: Add irif and erif disabled traps
authorAmit Cohen <amitc@mellanox.com>
Sun, 19 Jan 2020 13:00:46 +0000 (15:00 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 19 Jan 2020 15:23:52 +0000 (16:23 +0100)
IRIF_DISABLED and ERIF_DISABLED are driver specific traps. Packets are
dropped for these reasons when they need to be routed through/from
existing router interfaces (RIF) which are disabled.

Add devlink driver-specific traps and mlxsw trap IDs used to report
these traps.

Signed-off-by: Amit Cohen <amitc@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/devlink/devlink-trap.rst
Documentation/networking/devlink/mlxsw.rst
drivers/net/ethernet/mellanox/mlxsw/spectrum_trap.c
drivers/net/ethernet/mellanox/mlxsw/trap.h

index cbaa750de37df2bc5c2af883a1b05e2a5f3ded3c..68245ea387ada73d634a1d36482c1ac546943c83 100644 (file)
@@ -234,6 +234,7 @@ links to the description of driver-specific traps registered by various device
 drivers:
 
   * :doc:`netdevsim`
+  * :doc:`mlxsw`
 
 Generic Packet Trap Groups
 ==========================
index 5f9bb0a0616acfd31281a5b287e26ccf598d4250..cf857cb4ba8fc9f92bfc9769a045c4c63c20514c 100644 (file)
@@ -57,3 +57,25 @@ The ``mlxsw`` driver reports the following versions
    * - ``fw.version``
      - running
      - Three digit firmware version
+
+Driver-specific Traps
+=====================
+
+.. list-table:: List of Driver-specific Traps Registered by ``mlxsw``
+   :widths: 5 5 90
+
+   * - Name
+     - Type
+     - Description
+   * - ``irif_disabled``
+     - ``drop``
+     - Traps packets that the device decided to drop because they need to be
+       routed from a disabled router interface (RIF). This can happen during
+       RIF dismantle, when the RIF is first disabled before being removed
+       completely
+   * - ``erif_disabled``
+     - ``drop``
+     - Traps packets that the device decided to drop because they need to be
+       routed through a disabled router interface (RIF). This can happen during
+       RIF dismantle, when the RIF is first disabled before being removed
+       completely
index e0d7c49ffae0be8fef5725b8a92ac36ef7a438ea..42013fe1113159d2f792ecaf27e52f243d5a7e8a 100644 (file)
@@ -9,6 +9,20 @@
 #include "reg.h"
 #include "spectrum.h"
 
+/* All driver-specific traps must be documented in
+ * Documentation/networking/devlink/mlxsw.rst
+ */
+enum {
+       DEVLINK_MLXSW_TRAP_ID_BASE = DEVLINK_TRAP_GENERIC_ID_MAX,
+       DEVLINK_MLXSW_TRAP_ID_IRIF_DISABLED,
+       DEVLINK_MLXSW_TRAP_ID_ERIF_DISABLED,
+};
+
+#define DEVLINK_MLXSW_TRAP_NAME_IRIF_DISABLED \
+       "irif_disabled"
+#define DEVLINK_MLXSW_TRAP_NAME_ERIF_DISABLED \
+       "erif_disabled"
+
 #define MLXSW_SP_TRAP_METADATA DEVLINK_TRAP_METADATA_TYPE_F_IN_PORT
 
 static void mlxsw_sp_rx_drop_listener(struct sk_buff *skb, u8 local_port,
@@ -21,6 +35,12 @@ 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_DRIVER_DROP(_id, _group_id)                            \
+       DEVLINK_TRAP_DRIVER(DROP, DROP, DEVLINK_MLXSW_TRAP_ID_##_id,          \
+                           DEVLINK_MLXSW_TRAP_NAME_##_id,                    \
+                           DEVLINK_TRAP_GROUP_GENERIC(_group_id),            \
+                           MLXSW_SP_TRAP_METADATA)
+
 #define MLXSW_SP_TRAP_EXCEPTION(_id, _group_id)                      \
        DEVLINK_TRAP_GENERIC(EXCEPTION, TRAP, _id,                            \
                             DEVLINK_TRAP_GROUP_GENERIC(_group_id),           \
@@ -58,6 +78,8 @@ static struct devlink_trap mlxsw_sp_traps_arr[] = {
        MLXSW_SP_TRAP_EXCEPTION(UNRESOLVED_NEIGH, L3_DROPS),
        MLXSW_SP_TRAP_EXCEPTION(IPV4_LPM_UNICAST_MISS, L3_DROPS),
        MLXSW_SP_TRAP_EXCEPTION(IPV6_LPM_UNICAST_MISS, L3_DROPS),
+       MLXSW_SP_TRAP_DRIVER_DROP(IRIF_DISABLED, L3_DROPS),
+       MLXSW_SP_TRAP_DRIVER_DROP(ERIF_DISABLED, L3_DROPS),
 };
 
 static struct mlxsw_listener mlxsw_sp_listeners_arr[] = {
@@ -90,6 +112,8 @@ static struct mlxsw_listener mlxsw_sp_listeners_arr[] = {
                               TRAP_EXCEPTION_TO_CPU),
        MLXSW_SP_RXL_EXCEPTION(DISCARD_ROUTER_LPM6, ROUTER_EXP,
                               TRAP_EXCEPTION_TO_CPU),
+       MLXSW_SP_RXL_DISCARD(ROUTER_IRIF_EN, L3_DISCARDS),
+       MLXSW_SP_RXL_DISCARD(ROUTER_ERIF_EN, L3_DISCARDS),
 };
 
 /* Mapping between hardware trap and devlink trap. Multiple hardware traps can
@@ -123,6 +147,8 @@ static u16 mlxsw_sp_listener_devlink_map[] = {
        DEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH,
        DEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS,
        DEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS,
+       DEVLINK_MLXSW_TRAP_ID_IRIF_DISABLED,
+       DEVLINK_MLXSW_TRAP_ID_ERIF_DISABLED,
 };
 
 static int mlxsw_sp_rx_listener(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
index 3d2331be05d8e923c99beed7cd37b1a6aad78f16..8573cc3a00103fc1671c1f3eef69e6414a338da2 100644 (file)
@@ -88,6 +88,8 @@ enum {
        MLXSW_TRAP_ID_DISCARD_ING_ROUTER_IPV4_SIP_BC = 0x16A,
        MLXSW_TRAP_ID_DISCARD_ING_ROUTER_IPV4_DIP_LOCAL_NET = 0x16B,
        MLXSW_TRAP_ID_DISCARD_ING_ROUTER_DIP_LINK_LOCAL = 0x16C,
+       MLXSW_TRAP_ID_DISCARD_ROUTER_IRIF_EN = 0x178,
+       MLXSW_TRAP_ID_DISCARD_ROUTER_ERIF_EN = 0x179,
        MLXSW_TRAP_ID_DISCARD_ROUTER_LPM4 = 0x17B,
        MLXSW_TRAP_ID_DISCARD_ROUTER_LPM6 = 0x17C,
        MLXSW_TRAP_ID_DISCARD_IPV6_MC_DIP_RESERVED_SCOPE = 0x1B0,