]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mlxsw: spectrum: Use different trap group for externally routed packets
authorIdo Schimmel <idosch@mellanox.com>
Wed, 29 Jul 2020 09:26:44 +0000 (12:26 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 29 Jul 2020 19:16:21 +0000 (12:16 -0700)
Cited commit mistakenly removed the trap group for externally routed
packets (e.g., via the management interface) and grouped locally routed
and externally routed packet traps under the same group, thereby
subjecting them to the same policer.

This can result in problems, for example, when FRR is restarted and
suddenly all transient traffic is trapped to the CPU because of a
default route through the management interface. Locally routed packets
required to re-establish a BGP connection will never reach the CPU and
the routing tables will not be re-populated.

Fix this by using a different trap group for externally routed packets.

Fixes: 936c3e595a24 ("mlxsw: spectrum_trap: Register layer 3 control traps")
Reported-by: Alex Veber <alexve@mellanox.com>
Tested-by: Alex Veber <alexve@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/devlink/devlink-trap.rst
drivers/net/ethernet/mellanox/mlxsw/reg.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_trap.c
include/net/devlink.h
net/core/devlink.c

index 1e3f3ffee2480ab4749c8adb08cb811ff538f029..2014307fbe63428d6751d83f59bb941190259aff 100644 (file)
@@ -486,6 +486,10 @@ narrow. The description of these groups must be added to the following table:
      - Contains packet traps for packets that should be locally delivered after
        routing, but do not match more specific packet traps (e.g.,
        ``ipv4_bgp``)
+   * - ``external_delivery``
+     - Contains packet traps for packets that should be routed through an
+       external interface (e.g., management interface) that does not belong to
+       the same device (e.g., switch ASIC) as the ingress interface
    * - ``ipv6``
      - Contains packet traps for various IPv6 control packets (e.g., Router
        Advertisements)
index fcb88d4271bfdeb5172f44d3fd5d8057ea2165c1..8ac987c8c8bc39f6242d674dae2787ffefe5452f 100644 (file)
@@ -5536,6 +5536,7 @@ enum mlxsw_reg_htgt_trap_group {
        MLXSW_REG_HTGT_TRAP_GROUP_SP_MULTICAST,
        MLXSW_REG_HTGT_TRAP_GROUP_SP_NEIGH_DISCOVERY,
        MLXSW_REG_HTGT_TRAP_GROUP_SP_ROUTER_EXP,
+       MLXSW_REG_HTGT_TRAP_GROUP_SP_EXTERNAL_ROUTE,
        MLXSW_REG_HTGT_TRAP_GROUP_SP_IP2ME,
        MLXSW_REG_HTGT_TRAP_GROUP_SP_DHCP,
        MLXSW_REG_HTGT_TRAP_GROUP_SP_EVENT,
index 157a42c63066de73e3a018743c709013bd2132db..1e38dfe7cf64d3b2a8bdc98c0aa6f7329ac70b08 100644 (file)
@@ -328,6 +328,9 @@ mlxsw_sp_trap_policer_items_arr[] = {
        {
                .policer = MLXSW_SP_TRAP_POLICER(18, 1024, 128),
        },
+       {
+               .policer = MLXSW_SP_TRAP_POLICER(19, 1024, 512),
+       },
 };
 
 static const struct mlxsw_sp_trap_group_item mlxsw_sp_trap_group_items_arr[] = {
@@ -421,6 +424,11 @@ static const struct mlxsw_sp_trap_group_item mlxsw_sp_trap_group_items_arr[] = {
                .hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_IP2ME,
                .priority = 2,
        },
+       {
+               .group = DEVLINK_TRAP_GROUP_GENERIC(EXTERNAL_DELIVERY, 19),
+               .hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_EXTERNAL_ROUTE,
+               .priority = 1,
+       },
        {
                .group = DEVLINK_TRAP_GROUP_GENERIC(IPV6, 15),
                .hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_IPV6,
@@ -882,11 +890,11 @@ static const struct mlxsw_sp_trap_item mlxsw_sp_trap_items_arr[] = {
                },
        },
        {
-               .trap = MLXSW_SP_TRAP_CONTROL(EXTERNAL_ROUTE, LOCAL_DELIVERY,
+               .trap = MLXSW_SP_TRAP_CONTROL(EXTERNAL_ROUTE, EXTERNAL_DELIVERY,
                                              TRAP),
                .listeners_arr = {
-                       MLXSW_SP_RXL_MARK(RTR_INGRESS0, IP2ME, TRAP_TO_CPU,
-                                         false),
+                       MLXSW_SP_RXL_MARK(RTR_INGRESS0, EXTERNAL_ROUTE,
+                                         TRAP_TO_CPU, false),
                },
        },
        {
index 1df6dfec26c2e8c9357ff589f76a607012ade891..95b0322a2a824a9b33c86b8b9115e5b463894499 100644 (file)
@@ -718,6 +718,7 @@ enum devlink_trap_group_generic_id {
        DEVLINK_TRAP_GROUP_GENERIC_ID_PIM,
        DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB,
        DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY,
+       DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY,
        DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6,
        DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT,
        DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL,
@@ -915,6 +916,8 @@ enum devlink_trap_group_generic_id {
        "uc_loopback"
 #define DEVLINK_TRAP_GROUP_GENERIC_NAME_LOCAL_DELIVERY \
        "local_delivery"
+#define DEVLINK_TRAP_GROUP_GENERIC_NAME_EXTERNAL_DELIVERY \
+       "external_delivery"
 #define DEVLINK_TRAP_GROUP_GENERIC_NAME_IPV6 \
        "ipv6"
 #define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_EVENT \
index 2cafbc808b090638977b85cb2ab3d0f0f07ed3f5..dc2b184759564f818a7e09ea0da28a54ec3e8f05 100644 (file)
@@ -8567,6 +8567,7 @@ static const struct devlink_trap_group devlink_trap_group_generic[] = {
        DEVLINK_TRAP_GROUP(PIM),
        DEVLINK_TRAP_GROUP(UC_LB),
        DEVLINK_TRAP_GROUP(LOCAL_DELIVERY),
+       DEVLINK_TRAP_GROUP(EXTERNAL_DELIVERY),
        DEVLINK_TRAP_GROUP(IPV6),
        DEVLINK_TRAP_GROUP(PTP_EVENT),
        DEVLINK_TRAP_GROUP(PTP_GENERAL),