162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _MLXSW_IPIP_H_
562306a36Sopenharmony_ci#define _MLXSW_IPIP_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include "spectrum_router.h"
862306a36Sopenharmony_ci#include <net/ip_fib.h>
962306a36Sopenharmony_ci#include <linux/if_tunnel.h>
1062306a36Sopenharmony_ci#include <net/ip6_tunnel.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cistruct ip_tunnel_parm
1362306a36Sopenharmony_cimlxsw_sp_ipip_netdev_parms4(const struct net_device *ol_dev);
1462306a36Sopenharmony_cistruct __ip6_tnl_parm
1562306a36Sopenharmony_cimlxsw_sp_ipip_netdev_parms6(const struct net_device *ol_dev);
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciunion mlxsw_sp_l3addr
1862306a36Sopenharmony_cimlxsw_sp_ipip_netdev_saddr(enum mlxsw_sp_l3proto proto,
1962306a36Sopenharmony_ci			   const struct net_device *ol_dev);
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cibool mlxsw_sp_l3addr_is_zero(union mlxsw_sp_l3addr addr);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cienum mlxsw_sp_ipip_type {
2462306a36Sopenharmony_ci	MLXSW_SP_IPIP_TYPE_GRE4,
2562306a36Sopenharmony_ci	MLXSW_SP_IPIP_TYPE_GRE6,
2662306a36Sopenharmony_ci	MLXSW_SP_IPIP_TYPE_MAX,
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistruct mlxsw_sp_ipip_parms {
3062306a36Sopenharmony_ci	enum mlxsw_sp_l3proto proto;
3162306a36Sopenharmony_ci	union mlxsw_sp_l3addr saddr;
3262306a36Sopenharmony_ci	union mlxsw_sp_l3addr daddr;
3362306a36Sopenharmony_ci	int link;
3462306a36Sopenharmony_ci	u32 ikey;
3562306a36Sopenharmony_ci	u32 okey;
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistruct mlxsw_sp_ipip_entry {
3962306a36Sopenharmony_ci	enum mlxsw_sp_ipip_type ipipt;
4062306a36Sopenharmony_ci	struct net_device *ol_dev; /* Overlay. */
4162306a36Sopenharmony_ci	struct mlxsw_sp_rif_ipip_lb *ol_lb;
4262306a36Sopenharmony_ci	struct mlxsw_sp_fib_entry *decap_fib_entry;
4362306a36Sopenharmony_ci	struct list_head ipip_list_node;
4462306a36Sopenharmony_ci	struct mlxsw_sp_ipip_parms parms;
4562306a36Sopenharmony_ci	u32 dip_kvdl_index;
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct mlxsw_sp_ipip_ops {
4962306a36Sopenharmony_ci	int dev_type;
5062306a36Sopenharmony_ci	enum mlxsw_sp_l3proto ul_proto; /* Underlay. */
5162306a36Sopenharmony_ci	bool inc_parsing_depth;
5262306a36Sopenharmony_ci	bool double_rif_entry;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	struct mlxsw_sp_ipip_parms
5562306a36Sopenharmony_ci	(*parms_init)(const struct net_device *ol_dev);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	int (*nexthop_update)(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
5862306a36Sopenharmony_ci			      struct mlxsw_sp_ipip_entry *ipip_entry,
5962306a36Sopenharmony_ci			      bool force, char *ratr_pl);
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	bool (*can_offload)(const struct mlxsw_sp *mlxsw_sp,
6262306a36Sopenharmony_ci			    const struct net_device *ol_dev);
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	/* Return a configuration for creating an overlay loopback RIF. */
6562306a36Sopenharmony_ci	struct mlxsw_sp_rif_ipip_lb_config
6662306a36Sopenharmony_ci	(*ol_loopback_config)(struct mlxsw_sp *mlxsw_sp,
6762306a36Sopenharmony_ci			      const struct net_device *ol_dev);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	int (*decap_config)(struct mlxsw_sp *mlxsw_sp,
7062306a36Sopenharmony_ci			    struct mlxsw_sp_ipip_entry *ipip_entry,
7162306a36Sopenharmony_ci			    u32 tunnel_index);
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	int (*ol_netdev_change)(struct mlxsw_sp *mlxsw_sp,
7462306a36Sopenharmony_ci				struct mlxsw_sp_ipip_entry *ipip_entry,
7562306a36Sopenharmony_ci				struct netlink_ext_ack *extack);
7662306a36Sopenharmony_ci	int (*rem_ip_addr_set)(struct mlxsw_sp *mlxsw_sp,
7762306a36Sopenharmony_ci			       struct mlxsw_sp_ipip_entry *ipip_entry);
7862306a36Sopenharmony_ci	void (*rem_ip_addr_unset)(struct mlxsw_sp *mlxsw_sp,
7962306a36Sopenharmony_ci				  const struct mlxsw_sp_ipip_entry *ipip_entry);
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciextern const struct mlxsw_sp_ipip_ops *mlxsw_sp1_ipip_ops_arr[];
8362306a36Sopenharmony_ciextern const struct mlxsw_sp_ipip_ops *mlxsw_sp2_ipip_ops_arr[];
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#endif /* _MLXSW_IPIP_H_*/
86