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