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