xref: /openbmc/linux/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
19948a064SJiri Pirko /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
29948a064SJiri Pirko /* Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved */
338ebc0f4SPetr Machata 
438ebc0f4SPetr Machata #ifndef _MLXSW_IPIP_H_
538ebc0f4SPetr Machata #define _MLXSW_IPIP_H_
638ebc0f4SPetr Machata 
738ebc0f4SPetr Machata #include "spectrum_router.h"
84607f6d2SPetr Machata #include <net/ip_fib.h>
9fe735a3dSPetr Machata #include <linux/if_tunnel.h>
10ba1c7132SAmit Cohen #include <net/ip6_tunnel.h>
1138ebc0f4SPetr Machata 
129fb7bd77SPetr Machata struct ip_tunnel_parm
13e437f3b6SPetr Machata mlxsw_sp_ipip_netdev_parms4(const struct net_device *ol_dev);
148897207cSPetr Machata struct __ip6_tnl_parm
158897207cSPetr Machata mlxsw_sp_ipip_netdev_parms6(const struct net_device *ol_dev);
169fb7bd77SPetr Machata 
17474f0ff6SPetr Machata union mlxsw_sp_l3addr
18474f0ff6SPetr Machata mlxsw_sp_ipip_netdev_saddr(enum mlxsw_sp_l3proto proto,
19474f0ff6SPetr Machata 			   const struct net_device *ol_dev);
20474f0ff6SPetr Machata 
217e58a6c6SPetr Machata bool mlxsw_sp_l3addr_is_zero(union mlxsw_sp_l3addr addr);
227e58a6c6SPetr Machata 
2338ebc0f4SPetr Machata enum mlxsw_sp_ipip_type {
24ee954d1aSPetr Machata 	MLXSW_SP_IPIP_TYPE_GRE4,
25713e8502SAmit Cohen 	MLXSW_SP_IPIP_TYPE_GRE6,
2638ebc0f4SPetr Machata 	MLXSW_SP_IPIP_TYPE_MAX,
2738ebc0f4SPetr Machata };
2838ebc0f4SPetr Machata 
2980ef2abcSAmit Cohen struct mlxsw_sp_ipip_parms {
3080ef2abcSAmit Cohen 	enum mlxsw_sp_l3proto proto;
3180ef2abcSAmit Cohen 	union mlxsw_sp_l3addr saddr;
3280ef2abcSAmit Cohen 	union mlxsw_sp_l3addr daddr;
3380ef2abcSAmit Cohen 	int link;
3480ef2abcSAmit Cohen 	u32 ikey;
3580ef2abcSAmit Cohen 	u32 okey;
3680ef2abcSAmit Cohen };
3780ef2abcSAmit Cohen 
381012b9acSPetr Machata struct mlxsw_sp_ipip_entry {
391012b9acSPetr Machata 	enum mlxsw_sp_ipip_type ipipt;
401012b9acSPetr Machata 	struct net_device *ol_dev; /* Overlay. */
411012b9acSPetr Machata 	struct mlxsw_sp_rif_ipip_lb *ol_lb;
424607f6d2SPetr Machata 	struct mlxsw_sp_fib_entry *decap_fib_entry;
431012b9acSPetr Machata 	struct list_head ipip_list_node;
4480ef2abcSAmit Cohen 	struct mlxsw_sp_ipip_parms parms;
45ba1c7132SAmit Cohen 	u32 dip_kvdl_index;
461012b9acSPetr Machata };
471012b9acSPetr Machata 
4838ebc0f4SPetr Machata struct mlxsw_sp_ipip_ops {
4938ebc0f4SPetr Machata 	int dev_type;
5038ebc0f4SPetr Machata 	enum mlxsw_sp_l3proto ul_proto; /* Underlay. */
518d4f1046SAmit Cohen 	bool inc_parsing_depth;
52*5ca1b208SIdo Schimmel 	bool double_rif_entry;
531012b9acSPetr Machata 
5480ef2abcSAmit Cohen 	struct mlxsw_sp_ipip_parms
5580ef2abcSAmit Cohen 	(*parms_init)(const struct net_device *ol_dev);
5680ef2abcSAmit Cohen 
571012b9acSPetr Machata 	int (*nexthop_update)(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
5862b67ff3SIdo Schimmel 			      struct mlxsw_sp_ipip_entry *ipip_entry,
59197fdfd1SIdo Schimmel 			      bool force, char *ratr_pl);
601012b9acSPetr Machata 
611012b9acSPetr Machata 	bool (*can_offload)(const struct mlxsw_sp *mlxsw_sp,
627ba7bc55SIdo Schimmel 			    const struct net_device *ol_dev);
631012b9acSPetr Machata 
641012b9acSPetr Machata 	/* Return a configuration for creating an overlay loopback RIF. */
651012b9acSPetr Machata 	struct mlxsw_sp_rif_ipip_lb_config
661012b9acSPetr Machata 	(*ol_loopback_config)(struct mlxsw_sp *mlxsw_sp,
671012b9acSPetr Machata 			      const struct net_device *ol_dev);
684607f6d2SPetr Machata 
69acde33bfSJiri Pirko 	int (*decap_config)(struct mlxsw_sp *mlxsw_sp,
704607f6d2SPetr Machata 			    struct mlxsw_sp_ipip_entry *ipip_entry,
71acde33bfSJiri Pirko 			    u32 tunnel_index);
724cf04f3fSPetr Machata 
734cf04f3fSPetr Machata 	int (*ol_netdev_change)(struct mlxsw_sp *mlxsw_sp,
744cf04f3fSPetr Machata 				struct mlxsw_sp_ipip_entry *ipip_entry,
754cf04f3fSPetr Machata 				struct netlink_ext_ack *extack);
76ba1c7132SAmit Cohen 	int (*rem_ip_addr_set)(struct mlxsw_sp *mlxsw_sp,
77ba1c7132SAmit Cohen 			       struct mlxsw_sp_ipip_entry *ipip_entry);
78ba1c7132SAmit Cohen 	void (*rem_ip_addr_unset)(struct mlxsw_sp *mlxsw_sp,
79ba1c7132SAmit Cohen 				  const struct mlxsw_sp_ipip_entry *ipip_entry);
8038ebc0f4SPetr Machata };
8138ebc0f4SPetr Machata 
82a82feba6SAmit Cohen extern const struct mlxsw_sp_ipip_ops *mlxsw_sp1_ipip_ops_arr[];
83a82feba6SAmit Cohen extern const struct mlxsw_sp_ipip_ops *mlxsw_sp2_ipip_ops_arr[];
8438ebc0f4SPetr Machata 
8538ebc0f4SPetr Machata #endif /* _MLXSW_IPIP_H_*/
86