]> git.hungrycats.org Git - linux/commitdiff
mlxsw: spectrum_router: Add support for double entry RIFs
authorIdo Schimmel <idosch@nvidia.com>
Wed, 7 Dec 2022 12:36:44 +0000 (13:36 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Nov 2024 15:26:42 +0000 (16:26 +0100)
[ Upstream commit 5ca1b208c5d107fd4b9e7801200dea18ab1af8e7 ]

In Spectrum-1, loopback router interfaces (RIFs) used for IP-in-IP
encapsulation with an IPv6 underlay require two RIF entries and the RIF
index must be even.

Prepare for this change by extending the RIF parameters structure with a
'double_entry' field that indicates if the RIF being created requires
two RIF entries or not. Only set it for RIFs representing ip6gre tunnels
in Spectrum-1.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Amit Cohen <amcohen@nvidia.com>
Signed-off-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Stable-dep-of: 12ae97c531fc ("mlxsw: spectrum_ipip: Fix memory leak when changing remote IPv6 address")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

index a2ee695a3f17856d23afff3979d842ff11ad38d9..7ed4b64fecc7a661d5df952ecaefb257b2a77d63 100644 (file)
@@ -433,6 +433,7 @@ static const struct mlxsw_sp_ipip_ops mlxsw_sp1_ipip_gre6_ops = {
        .dev_type = ARPHRD_IP6GRE,
        .ul_proto = MLXSW_SP_L3_PROTO_IPV6,
        .inc_parsing_depth = true,
+       .double_rif_entry = true,
        .parms_init = mlxsw_sp1_ipip_netdev_parms_init_gre6,
        .nexthop_update = mlxsw_sp1_ipip_nexthop_update_gre6,
        .decap_config = mlxsw_sp1_ipip_decap_config_gre6,
index 8cc259dcc8d0984cb5f46cd131585d4d5b7d22ab..a35f009da561226e8bd431d0527d43b85019541d 100644 (file)
@@ -49,6 +49,7 @@ struct mlxsw_sp_ipip_ops {
        int dev_type;
        enum mlxsw_sp_l3proto ul_proto; /* Underlay. */
        bool inc_parsing_depth;
+       bool double_rif_entry;
 
        struct mlxsw_sp_ipip_parms
        (*parms_init)(const struct net_device *ol_dev);
index ab0aa1a61d4aaea0a3c4078433fe290f8ae16ee3..a00dd0ee524e1c60647f96ead32e17ff931980d5 100644 (file)
@@ -77,6 +77,7 @@ struct mlxsw_sp_rif_params {
        };
        u16 vid;
        bool lag;
+       bool double_entry;
 };
 
 struct mlxsw_sp_rif_subport {
@@ -1068,6 +1069,7 @@ mlxsw_sp_ipip_ol_ipip_lb_create(struct mlxsw_sp *mlxsw_sp,
        lb_params = (struct mlxsw_sp_rif_params_ipip_lb) {
                .common.dev = ol_dev,
                .common.lag = false,
+               .common.double_entry = ipip_ops->double_rif_entry,
                .lb_config = ipip_ops->ol_loopback_config(mlxsw_sp, ol_dev),
        };