1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2*4882a593Smuzhiyun /* Copyright (c) 2018 Mellanox Technologies. All rights reserved */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef _MLXSW_SPECTRUM_NVE_H 5*4882a593Smuzhiyun #define _MLXSW_SPECTRUM_NVE_H 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <linux/netlink.h> 8*4882a593Smuzhiyun #include <linux/rhashtable.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include "spectrum.h" 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun struct mlxsw_sp_nve_config { 13*4882a593Smuzhiyun enum mlxsw_sp_nve_type type; 14*4882a593Smuzhiyun u8 ttl; 15*4882a593Smuzhiyun u8 learning_en:1; 16*4882a593Smuzhiyun __be16 udp_dport; 17*4882a593Smuzhiyun __be32 flowlabel; 18*4882a593Smuzhiyun u32 ul_tb_id; 19*4882a593Smuzhiyun enum mlxsw_sp_l3proto ul_proto; 20*4882a593Smuzhiyun union mlxsw_sp_l3addr ul_sip; 21*4882a593Smuzhiyun }; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun struct mlxsw_sp_nve { 24*4882a593Smuzhiyun struct mlxsw_sp_nve_config config; 25*4882a593Smuzhiyun struct rhashtable mc_list_ht; 26*4882a593Smuzhiyun struct mlxsw_sp *mlxsw_sp; 27*4882a593Smuzhiyun const struct mlxsw_sp_nve_ops **nve_ops_arr; 28*4882a593Smuzhiyun unsigned int num_nve_tunnels; /* Protected by RTNL */ 29*4882a593Smuzhiyun unsigned int num_max_mc_entries[MLXSW_SP_L3_PROTO_MAX]; 30*4882a593Smuzhiyun u32 tunnel_index; 31*4882a593Smuzhiyun u16 ul_rif_index; /* Reserved for Spectrum */ 32*4882a593Smuzhiyun unsigned int inc_parsing_depth_refs; 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct mlxsw_sp_nve_ops { 36*4882a593Smuzhiyun enum mlxsw_sp_nve_type type; 37*4882a593Smuzhiyun bool (*can_offload)(const struct mlxsw_sp_nve *nve, 38*4882a593Smuzhiyun const struct net_device *dev, 39*4882a593Smuzhiyun struct netlink_ext_ack *extack); 40*4882a593Smuzhiyun void (*nve_config)(const struct mlxsw_sp_nve *nve, 41*4882a593Smuzhiyun const struct net_device *dev, 42*4882a593Smuzhiyun struct mlxsw_sp_nve_config *config); 43*4882a593Smuzhiyun int (*init)(struct mlxsw_sp_nve *nve, 44*4882a593Smuzhiyun const struct mlxsw_sp_nve_config *config); 45*4882a593Smuzhiyun void (*fini)(struct mlxsw_sp_nve *nve); 46*4882a593Smuzhiyun int (*fdb_replay)(const struct net_device *nve_dev, __be32 vni, 47*4882a593Smuzhiyun struct netlink_ext_ack *extack); 48*4882a593Smuzhiyun void (*fdb_clear_offload)(const struct net_device *nve_dev, __be32 vni); 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun extern const struct mlxsw_sp_nve_ops mlxsw_sp1_nve_vxlan_ops; 52*4882a593Smuzhiyun extern const struct mlxsw_sp_nve_ops mlxsw_sp2_nve_vxlan_ops; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #endif 55