vxlan.h (15181B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2020 Broadcom Inc. All rights reserved. 6 * 7 * This file contains VXLAN definitions internal to the BCM library. 8 */ 9 10 11 #ifndef _BCM_INT_VXLAN_H 12 #define _BCM_INT_VXLAN_H 13 14 #include <bcm/types.h> 15 #include <bcm/vxlan.h> 16 #include <bcm_int/esw/vpn.h> 17 18 #define _BCM_MAX_NUM_VXLAN_TUNNEL 0x3FFF 19 #define _BCM_VXLAN_VFI_INVALID 0 20 21 /* 22 * VXLAN TPID types 23 */ 24 25 #define _BCM_VXLAN_TPID_SVP_BASED 0x0 26 #define _BCM_VXLAN_TPID_VFI_BASED 0x1 27 #define _BCM_VXLAN_TPID_SGLP_BASED 0x2 28 29 /* 30 * VXLAN TUNNEL TERMINATOR MULTICAST STATES 31 */ 32 33 #define _BCM_VXLAN_TUNNEL_TERM_MULTICAST_LEAF 0x1 34 #define _BCM_VXLAN_TUNNEL_TERM_MULTICAST_BUD 0x2 35 36 /* 37 * VXLAN EGR_L3_NEXT_HOP View 38 */ 39 #define _BCM_VXLAN_EGR_NEXT_HOP_L3_VIEW 0x0 40 #define _BCM_VXLAN_EGR_NEXT_HOP_SDTAG_VIEW 0x2 41 #define _BCM_VXLAN_EGR_NEXT_HOP_IFP_ACTION_VIEW 0x6 42 #define _BCM_VXLAN_EGR_NEXT_HOP_L3MC_VIEW 0x7 43 #define _BCM_VXLAN_EGR_NEXT_HOP_VXLAN_VIEW 0xA 44 #define _BCM_VXLAN_EGR_NEXT_HOP_L2OTAG_VIEW 0x15 45 46 /* 47 * VXLAN Lookup Key Types 48 */ 49 #define _BCM_VXLAN_KEY_TYPE_TUNNEL 0x08 50 #define _BCM_VXLAN_KEY_TYPE_VNID_VFI 0x09 51 #define _BCM_VXLAN_KEY_TYPE_TUNNEL_VNID_VFI 0x0A 52 #define _BCM_VXLAN_KEY_TYPE_LOOKUP_DIP 0x12 53 #define _BCM_VXLAN_KEY_TYPE_LOOKUP_VFI 0x08 54 #define _BCM_VXLAN_KEY_TYPE_LOOKUP_VFI_DVP 0x09 55 56 #define _BCM_VXLAN_FLEX_KEY_TYPE_LOOKUP_DIP 0xc 57 #define _BCM_VXLAN_KEY_TYPE_VNID_VFI_FLEX 0x13 58 #define _BCM_VXLAN_KEY_TYPE_VNID_VFI_SIP_FLEX 0x1C 59 #define _BCM_VXLAN_KEY_TYPE_LOOKUP_DIP_IN_MPLS_ENTRY 0x0C 60 #define _BCM_VXLAN_DATA_TYPE_LOOKUP_DIP_IN_MPLS_ENTRY 0x0C 61 #define _BCM_VXLAN_DATA_TYPE_VNID_VFI_FLEX 0x1C 62 #define _BCM_VXLAN_DATA_TYPE_LOOKUP_VFI 0x17 63 #define _BCM_VXLAN_FLEX_DATA_TYPE_IPV4_SIP 0xF 64 65 /* VXLAN Multicast state */ 66 #define _BCM_VXLAN_MULTICAST_NONE 0x0 67 #define _BCM_VXLAN_MULTICAST_BUD 0x1 68 #define _BCM_VXLAN_MULTICAST_LEAF 0x2 69 #define _BCM_VXLAN_MULTICAST_TRANSIT 0x4 70 71 /* VXLAN Tunnel Type */ 72 #define _BCM_VXLAN_TUNNEL_TYPE 0x0B 73 74 /* VXLAN SVP Type */ 75 #define _BCM_VXLAN_SOURCE_VP_TYPE_INVALID 0x0 76 #define _BCM_VXLAN_SOURCE_VP_TYPE_VFI 0x1 77 #define _BCM_VXLAN_SOURCE_VP_TYPE_VLAN 0x3 78 79 80 /* VXLAN ING_NEXT_HOP Type */ 81 #define _BCM_VXLAN_INGRESS_NEXT_HOP_ENTRY_TYPE 0x2 82 83 84 /* VXLAN DVP Type */ 85 #define _BCM_VXLAN_DEST_VP_TYPE_ACCESS 0x0 86 #define _BCM_VXLAN_INGRESS_DEST_VP_TYPE 0x3 87 #define _BCM_VXLAN_EGRESS_DEST_VP_TYPE 0x2 88 89 #define _BCM_VXLAN_TUNNEL_TERM_DISABLE 0x0 90 #define _BCM_VXLAN_TUNNEL_TERM_ENABLE 0x1 91 #define _BCM_VXLAN_TUNNEL_TERM_UDP_CHECKSUM_ENABLE 0x2 92 #define _BCM_VXLAN_TUNNEL_TERM_USE_OUTER_DSCP 0x4 93 #define _BCM_VXLAN_TUNNEL_TERM_USE_OUTER_PCP 0x8 94 95 /* 96 * VXLAN port state - need to remember where to find the port. 97 * Flags indicate the type of the port and hence the tables where the data is. 98 * The match attributes are the keys for the various hash tables. 99 */ 100 101 #define _BCM_VXLAN_PORT_MATCH_TYPE_NONE (1 << 0) 102 #define _BCM_VXLAN_PORT_MATCH_TYPE_VLAN (1 << 1) 103 #define _BCM_VXLAN_PORT_MATCH_TYPE_INNER_VLAN (1 << 2) 104 #define _BCM_VXLAN_PORT_MATCH_TYPE_VLAN_STACKED (1 << 3) 105 #define _BCM_VXLAN_PORT_MATCH_TYPE_VLAN_PRI (1 << 4) 106 #define _BCM_VXLAN_PORT_MATCH_TYPE_PORT (1 << 5) 107 #define _BCM_VXLAN_PORT_MATCH_TYPE_TRUNK (1 << 6) 108 #define _BCM_VXLAN_PORT_MATCH_TYPE_VNID (1 << 7) 109 #define _BCM_VXLAN_PORT_MATCH_TYPE_SHARED (1 << 8) 110 111 #define _BCM_VXLAN_PORT_MATCH_NO_UNTAG_OP (1 << 0) 112 113 #define BCM_VXLAN_DIP_FIELD(decouple_mode, field) \ 114 ((decouple_mode)?(VXLAN_FLEX_IPV4_DIP__##field):(VXLAN_DIP__##field)) 115 #define BCM_VXLAN_VNID_FIELD(decouple_mode, field) \ 116 ((decouple_mode)?(VXLAN_FLEX__##field):(VXLAN_VN_ID__##field)) 117 #define BCM_VXLAN_VFI_FIELD(decouple_mode, field) \ 118 ((decouple_mode)?(VXLAN_VFI_FLEX__##field):(VXLAN_VFI__##field)) 119 #define BCM_VXLAN_TAG_FIELD(decouple_mode, field) \ 120 ((decouple_mode)?(L2_OTAG__##field):(SD_TAG__##field)) 121 #define BCM_VXLAN_TAG_VIEW(decouple_mode) \ 122 ((decouple_mode)?(_BCM_VXLAN_EGR_NEXT_HOP_L2OTAG_VIEW):(_BCM_VXLAN_EGR_NEXT_HOP_SDTAG_VIEW)) 123 #define BCM_VXLAN_SIP_FIELD(decouple_mode, field) \ 124 ((decouple_mode)?(VXLAN_FLEX_IPV4_SIP__##field):(VXLAN_SIP__##field)) 125 126 /* VXLAN VPN Type */ 127 #define _BCM_VXLAN_VPN_TYPE_TUNNEL_BASED_VNID 0x1 128 129 typedef struct _bcm_td2_vxlan_nh_info_s { 130 int entry_type; 131 int dvp_is_network; 132 int sd_tag_action_present; 133 int sd_tag_action_not_present; 134 int dvp; 135 int intf_num; 136 int sd_tag_vlan; 137 int sd_tag_pri; 138 int sd_tag_cfi; 139 int vc_swap_index; 140 int tpid_index; 141 int is_eline; 142 int dvp_network_group_id; 143 } _bcm_td2_vxlan_nh_info_t; 144 145 typedef struct _bcm_vxlan_match_port_info_s { 146 uint32 flags; 147 uint32 index; /* Index of memory where port info is programmed */ 148 bcm_trunk_t trunk_id; /* Trunk group ID */ 149 bcm_module_t modid; /* Module id */ 150 bcm_port_t port; /* Port */ 151 bcm_vlan_t match_vlan; 152 bcm_vlan_t match_inner_vlan; 153 uint32 match_tunnel_index; /* Tunnel Index */ 154 int match_count; /* Number of matches from VLAN_XLATE configured */ 155 int vfi; /* vfi related with vp */ 156 uint32 flags2; 157 } _bcm_vxlan_match_port_info_t; 158 159 typedef struct _bcm_vxlan_eline_vp_map_info_s { 160 int vp1; /* Access VP */ 161 int vp2; /* Network VP */ 162 } _bcm_vxlan_eline_vp_map_info_t; 163 164 typedef struct _bcm_vxlan_tunnel_endpoint_s { 165 bcm_ip_t dip; /* Tunnel DIP */ 166 bcm_ip_t sip; /* Tunnel SIP */ 167 uint16 tunnel_state; /* Multicast Reference Count */ 168 int activate_flag; /* Tunnel terminator is deactivated or activated */ 169 bcm_vlan_t vlan; /* Out vlan for tunnel termination */ 170 } COMPILER_ATTRIBUTE((packed)) _bcm_vxlan_tunnel_endpoint_t; 171 172 typedef struct _bcm_vxlan_vpn_info_s { 173 bcm_ip_t sip; /* Tunnel SIP */ 174 uint32 vnid; /* vxlan vnid */ 175 uint8 vxlan_vpn_type; /* indicate vpn type */ 176 } _bcm_vxlan_vpn_info_t; 177 178 /* 179 * Software book keeping for VXLAN related information 180 */ 181 typedef struct _bcm_td2_vxlan_bookkeeping_s { 182 int initialized; /* Set to TRUE when VXLAN module initialized */ 183 sal_mutex_t vxlan_mutex; /* Protection mutex. */ 184 SHR_BITDCL *vxlan_ip_tnl_bitmap; /* EGR_IP_TUNNEL index bitmap */ 185 _bcm_vxlan_match_port_info_t *match_key; /* Match Key */ 186 _bcm_vxlan_tunnel_endpoint_t *vxlan_tunnel_term; 187 _bcm_vxlan_tunnel_endpoint_t *vxlan_tunnel_init; 188 bcm_vlan_t *vxlan_vpn_vlan; /* Outer VLAN for VPN */ 189 _bcm_vxlan_vpn_info_t *vxlan_vpn_info; 190 uint32 *vfi_vnid_map_count; /* VP-based VFI-VNID mapping count */ 191 } _bcm_td2_vxlan_bookkeeping_t; 192 193 typedef struct _bcm_td3_vxlan_vxlate_entry_s { 194 int dtype; 195 int ktype; 196 int vfi; 197 bcm_vlan_t vlan; 198 uint32 vnid; 199 } _bcm_td3_vxlan_vxlate_entry_t; 200 201 extern _bcm_td2_vxlan_bookkeeping_t *_bcm_td2_vxlan_bk_info[BCM_MAX_NUM_UNITS]; 202 203 /* Generic memory allocation routine. */ 204 #define BCMI_VXLAN_ALLOC(_ptr_,_size_,_descr_) \ 205 do { \ 206 if ((NULL == (_ptr_))) { \ 207 _ptr_ = sal_alloc((_size_),(_descr_)); \ 208 } \ 209 if((_ptr_) != NULL) { \ 210 sal_memset((_ptr_), 0, (_size_)); \ 211 } \ 212 } while (0) 213 214 #define _BCM_VXLAN_VPN_INVALID 0xffff 215 #define BCM_STAT_VXLAN_FLEX_COUNTER_MAX_TABLES 4 216 217 /* 218 * Do not change - Implementation assumes 219 * _BCM_VXLAN_VPN_TYPE_ELINE == _BCM_VXLAN_VPN_TYPE_ELAN 220 */ 221 #define _BCM_VXLAN_VPN_TYPE_ELINE _BCM_VPN_TYPE_VFI 222 #define _BCM_VXLAN_VPN_TYPE_ELAN _BCM_VPN_TYPE_VFI 223 224 #define _BCM_VXLAN_VPN_SET(_vpn_, _type_, _id_) \ 225 _BCM_VPN_SET(_vpn_, _type_, _id_) 226 227 #define _BCM_VXLAN_VPN_GET(_id_, _type_, _vpn_) \ 228 _BCM_VPN_GET(_id_, _type_, _vpn_) 229 230 #define _BCM_VXLAN_TUNNEL_ID_IF_INVALID_RETURN(unit, id) \ 231 do { \ 232 if (((id) < 0) || (id) >= (soc_mem_index_count((unit), SOURCE_VPm))) { \ 233 return (BCM_E_BADID); \ 234 } \ 235 } while(0) 236 237 extern int _bcm_esw_vxlan_trunk_member_add(int unit, bcm_trunk_t trunk_id, 238 int trunk_member_count, bcm_port_t *trunk_member_array); 239 extern int _bcm_esw_vxlan_trunk_member_delete(int unit, bcm_trunk_t trunk_id, 240 int trunk_member_count, bcm_port_t *trunk_member_array); 241 extern int _bcm_esw_vxlan_port_source_vp_lag_set( 242 int unit, 243 bcm_gport_t gport, 244 int vp_lag_vp); 245 extern int _bcm_esw_vxlan_port_source_vp_lag_clear( 246 int unit, 247 bcm_gport_t gport, 248 int vp_lag_vp); 249 extern int _bcm_esw_vxlan_port_source_vp_lag_get( 250 int unit, 251 bcm_gport_t gport, 252 int *vp_lag_vp); 253 254 255 #if defined(INCLUDE_L3) 256 257 extern int _bcm_td2_vxlan_nexthop_entry_modify( 258 int unit, 259 int nh_index, 260 int drop, 261 _bcm_td2_vxlan_nh_info_t *egr_nh_info, 262 int new_entry_type); 263 264 extern int _bcm_td2_vxlan_ecmp_nexthop_entry_modify( 265 int unit, 266 int ecmp_index, 267 int drop, 268 _bcm_td2_vxlan_nh_info_t egr_nh_info, 269 int new_entry_type); 270 271 extern int _bcm_td2_vxlan_ecmp_port_egress_nexthop_reset( 272 int unit, 273 int ecmp_index, 274 int vp_type, 275 int vp, 276 bcm_vpn_t vpn); 277 278 extern int _bcm_td2_vxlan_port_egress_nexthop_reset( 279 int unit, 280 int nh_index, 281 int vp_type, 282 int vp, 283 bcm_vpn_t vpn); 284 285 extern bcm_error_t _bcm_td2_vxlan_dip_stat_counter_get( 286 int unit, 287 int sync_mode, 288 bcm_ip_t vxlan_dip, 289 bcm_vxlan_dip_stat_t stat, 290 uint32 num_entries, 291 uint32 *counter_indexes, 292 bcm_stat_value_t *counter_values); 293 294 extern bcm_error_t _bcm_td2_vxlan_dip_stat_multi_get( 295 int unit, 296 bcm_ip_t vxlan_dip, 297 int nstat, 298 bcm_vxlan_dip_stat_t *stat_arr, 299 uint64 *value_arr); 300 301 302 303 extern bcm_error_t _bcm_td2_vxlan_dip_stat_multi_get32( 304 int unit, 305 bcm_ip_t vxlan_dip, 306 int nstat, 307 bcm_vxlan_dip_stat_t *stat_arr, 308 uint32 *value_arr); 309 310 311 extern bcm_error_t _bcm_td2_vxlan_dip_stat_counter_set( 312 int unit, 313 bcm_ip_t vxlan_dip, 314 bcm_vxlan_dip_stat_t stat, 315 uint32 num_entries, 316 uint32 *counter_indexes, 317 bcm_stat_value_t *counter_values); 318 319 extern bcm_error_t _bcm_esw_vxlan_dip_stat_counter_get( 320 int unit, 321 int sync_mode, 322 bcm_ip_t vxlan_dip, 323 bcm_vxlan_dip_stat_t stat, 324 uint32 num_entries, 325 uint32 *counter_indexes, 326 bcm_stat_value_t *counter_values); 327 328 329 extern bcm_error_t _bcm_td2_vxlan_dip_stat_multi_set( 330 int unit, 331 bcm_ip_t vxlan_dip, 332 int nstat, 333 bcm_vxlan_dip_stat_t *stat_arr, 334 uint64 *value_arr); 335 336 337 extern bcm_error_t _bcm_td2_vxlan_dip_stat_multi_set32( 338 int unit, 339 bcm_ip_t vxlan_dip, 340 int nstat, 341 bcm_vxlan_dip_stat_t *stat_arr, 342 uint32 *value_arr); 343 344 345 extern bcm_error_t _bcm_td2_vxlan_dip_stat_id_get( 346 int unit, 347 bcm_ip_t vxlan_dip, 348 bcm_vxlan_dip_stat_t stat, 349 uint32 *stat_counter_id); 350 351 352 353 extern bcm_error_t _bcm_td2_vxlan_dip_stat_detach( 354 int unit, 355 bcm_ip_t vxlan_dip); 356 357 358 extern bcm_error_t _bcm_td2_vxlan_dip_stat_attach( 359 int unit, 360 bcm_ip_t vxlan_dip, 361 uint32 stat_counter_id); 362 #endif 363 #if defined(INCLUDE_L3) 364 extern int _bcm_td2_vxlan_higig_ppd_select(int unit, int nh_index, uint32 flags); 365 extern int _bcm_td2_vxlan_ecmp_higig_ppd_select(int unit, int ecmp_index, uint32 flags); 366 #endif 367 368 #ifndef BCM_SW_STATE_DUMP_DISABLE 369 extern void _bcm_vxlan_sw_dump(int unit); 370 #endif /* BCM_SW_STATE_DUMP_DISABLE */ 371 372 #ifdef BCM_WARM_BOOT_SUPPORT 373 extern int _bcm_esw_vxlan_sync(int unit); 374 #endif /* BCM_WARM_BOOT_SUPPORT */ 375 376 #endif /* !_BCM_INT_VXLAN_H */ 377 378