Commit 5ca1b208 authored by Ido Schimmel's avatar Ido Schimmel Committed by Jakub Kicinski

mlxsw: spectrum_router: Add support for double entry RIFs

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: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarAmit Cohen <amcohen@nvidia.com>
Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 1a2f65b4
...@@ -433,6 +433,7 @@ static const struct mlxsw_sp_ipip_ops mlxsw_sp1_ipip_gre6_ops = { ...@@ -433,6 +433,7 @@ static const struct mlxsw_sp_ipip_ops mlxsw_sp1_ipip_gre6_ops = {
.dev_type = ARPHRD_IP6GRE, .dev_type = ARPHRD_IP6GRE,
.ul_proto = MLXSW_SP_L3_PROTO_IPV6, .ul_proto = MLXSW_SP_L3_PROTO_IPV6,
.inc_parsing_depth = true, .inc_parsing_depth = true,
.double_rif_entry = true,
.parms_init = mlxsw_sp1_ipip_netdev_parms_init_gre6, .parms_init = mlxsw_sp1_ipip_netdev_parms_init_gre6,
.nexthop_update = mlxsw_sp1_ipip_nexthop_update_gre6, .nexthop_update = mlxsw_sp1_ipip_nexthop_update_gre6,
.decap_config = mlxsw_sp1_ipip_decap_config_gre6, .decap_config = mlxsw_sp1_ipip_decap_config_gre6,
......
...@@ -49,6 +49,7 @@ struct mlxsw_sp_ipip_ops { ...@@ -49,6 +49,7 @@ struct mlxsw_sp_ipip_ops {
int dev_type; int dev_type;
enum mlxsw_sp_l3proto ul_proto; /* Underlay. */ enum mlxsw_sp_l3proto ul_proto; /* Underlay. */
bool inc_parsing_depth; bool inc_parsing_depth;
bool double_rif_entry;
struct mlxsw_sp_ipip_parms struct mlxsw_sp_ipip_parms
(*parms_init)(const struct net_device *ol_dev); (*parms_init)(const struct net_device *ol_dev);
......
...@@ -79,6 +79,7 @@ struct mlxsw_sp_rif_params { ...@@ -79,6 +79,7 @@ struct mlxsw_sp_rif_params {
}; };
u16 vid; u16 vid;
bool lag; bool lag;
bool double_entry;
}; };
struct mlxsw_sp_rif_subport { struct mlxsw_sp_rif_subport {
...@@ -1070,6 +1071,7 @@ mlxsw_sp_ipip_ol_ipip_lb_create(struct mlxsw_sp *mlxsw_sp, ...@@ -1070,6 +1071,7 @@ mlxsw_sp_ipip_ol_ipip_lb_create(struct mlxsw_sp *mlxsw_sp,
lb_params = (struct mlxsw_sp_rif_params_ipip_lb) { lb_params = (struct mlxsw_sp_rif_params_ipip_lb) {
.common.dev = ol_dev, .common.dev = ol_dev,
.common.lag = false, .common.lag = false,
.common.double_entry = ipip_ops->double_rif_entry,
.lb_config = ipip_ops->ol_loopback_config(mlxsw_sp, ol_dev), .lb_config = ipip_ops->ol_loopback_config(mlxsw_sp, ol_dev),
}; };
...@@ -8091,13 +8093,13 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp, ...@@ -8091,13 +8093,13 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
const struct mlxsw_sp_rif_params *params, const struct mlxsw_sp_rif_params *params,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
u8 rif_entries = params->double_entry ? 2 : 1;
u32 tb_id = l3mdev_fib_table(params->dev); u32 tb_id = l3mdev_fib_table(params->dev);
const struct mlxsw_sp_rif_ops *ops; const struct mlxsw_sp_rif_ops *ops;
struct mlxsw_sp_fid *fid = NULL; struct mlxsw_sp_fid *fid = NULL;
enum mlxsw_sp_rif_type type; enum mlxsw_sp_rif_type type;
struct mlxsw_sp_rif *rif; struct mlxsw_sp_rif *rif;
struct mlxsw_sp_vr *vr; struct mlxsw_sp_vr *vr;
u8 rif_entries = 1;
u16 rif_index; u16 rif_index;
int i, err; int i, err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment