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