vxlan.h (15099B)
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-2019 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_DIP_FIELD(decouple_mode, field) \ 112 ((decouple_mode)?(VXLAN_FLEX_IPV4_DIP__##field):(VXLAN_DIP__##field)) 113 #define BCM_VXLAN_VNID_FIELD(decouple_mode, field) \ 114 ((decouple_mode)?(VXLAN_FLEX__##field):(VXLAN_VN_ID__##field)) 115 #define BCM_VXLAN_VFI_FIELD(decouple_mode, field) \ 116 ((decouple_mode)?(VXLAN_VFI_FLEX__##field):(VXLAN_VFI__##field)) 117 #define BCM_VXLAN_TAG_FIELD(decouple_mode, field) \ 118 ((decouple_mode)?(L2_OTAG__##field):(SD_TAG__##field)) 119 #define BCM_VXLAN_TAG_VIEW(decouple_mode) \ 120 ((decouple_mode)?(_BCM_VXLAN_EGR_NEXT_HOP_L2OTAG_VIEW):(_BCM_VXLAN_EGR_NEXT_HOP_SDTAG_VIEW)) 121 #define BCM_VXLAN_SIP_FIELD(decouple_mode, field) \ 122 ((decouple_mode)?(VXLAN_FLEX_IPV4_SIP__##field):(VXLAN_SIP__##field)) 123 124 /* VXLAN VPN Type */ 125 #define _BCM_VXLAN_VPN_TYPE_TUNNEL_BASED_VNID 0x1 126 127 typedef struct _bcm_td2_vxlan_nh_info_s { 128 int entry_type; 129 int dvp_is_network; 130 int sd_tag_action_present; 131 int sd_tag_action_not_present; 132 int dvp; 133 int intf_num; 134 int sd_tag_vlan; 135 int sd_tag_pri; 136 int sd_tag_cfi; 137 int vc_swap_index; 138 int tpid_index; 139 int is_eline; 140 int dvp_network_group_id; 141 } _bcm_td2_vxlan_nh_info_t; 142 143 typedef struct _bcm_vxlan_match_port_info_s { 144 uint32 flags; 145 uint32 index; /* Index of memory where port info is programmed */ 146 bcm_trunk_t trunk_id; /* Trunk group ID */ 147 bcm_module_t modid; /* Module id */ 148 bcm_port_t port; /* Port */ 149 bcm_vlan_t match_vlan; 150 bcm_vlan_t match_inner_vlan; 151 uint32 match_tunnel_index; /* Tunnel Index */ 152 int match_count; /* Number of matches from VLAN_XLATE configured */ 153 int vfi; /* vfi related with vp */ 154 } _bcm_vxlan_match_port_info_t; 155 156 typedef struct _bcm_vxlan_eline_vp_map_info_s { 157 int vp1; /* Access VP */ 158 int vp2; /* Network VP */ 159 } _bcm_vxlan_eline_vp_map_info_t; 160 161 typedef struct _bcm_vxlan_tunnel_endpoint_s { 162 bcm_ip_t dip; /* Tunnel DIP */ 163 bcm_ip_t sip; /* Tunnel SIP */ 164 uint16 tunnel_state; /* Multicast Reference Count */ 165 int activate_flag; /* Tunnel terminator is deactivated or activated */ 166 bcm_vlan_t vlan; /* Out vlan for tunnel termination */ 167 } COMPILER_ATTRIBUTE((packed)) _bcm_vxlan_tunnel_endpoint_t; 168 169 typedef struct _bcm_vxlan_vpn_info_s { 170 bcm_ip_t sip; /* Tunnel SIP */ 171 uint32 vnid; /* vxlan vnid */ 172 uint8 vxlan_vpn_type; /* indicate vpn type */ 173 } _bcm_vxlan_vpn_info_t; 174 175 /* 176 * Software book keeping for VXLAN related information 177 */ 178 typedef struct _bcm_td2_vxlan_bookkeeping_s { 179 int initialized; /* Set to TRUE when VXLAN module initialized */ 180 sal_mutex_t vxlan_mutex; /* Protection mutex. */ 181 SHR_BITDCL *vxlan_ip_tnl_bitmap; /* EGR_IP_TUNNEL index bitmap */ 182 _bcm_vxlan_match_port_info_t *match_key; /* Match Key */ 183 _bcm_vxlan_tunnel_endpoint_t *vxlan_tunnel_term; 184 _bcm_vxlan_tunnel_endpoint_t *vxlan_tunnel_init; 185 bcm_vlan_t *vxlan_vpn_vlan; /* Outer VLAN for VPN */ 186 _bcm_vxlan_vpn_info_t *vxlan_vpn_info; 187 uint32 *vfi_vnid_map_count; /* VP-based VFI-VNID mapping count */ 188 } _bcm_td2_vxlan_bookkeeping_t; 189 190 typedef struct _bcm_td3_vxlan_vxlate_entry_s { 191 int dtype; 192 int ktype; 193 int vfi; 194 bcm_vlan_t vlan; 195 uint32 vnid; 196 } _bcm_td3_vxlan_vxlate_entry_t; 197 198 extern _bcm_td2_vxlan_bookkeeping_t *_bcm_td2_vxlan_bk_info[BCM_MAX_NUM_UNITS]; 199 200 /* Generic memory allocation routine. */ 201 #define BCMI_VXLAN_ALLOC(_ptr_,_size_,_descr_) \ 202 do { \ 203 if ((NULL == (_ptr_))) { \ 204 _ptr_ = sal_alloc((_size_),(_descr_)); \ 205 } \ 206 if((_ptr_) != NULL) { \ 207 sal_memset((_ptr_), 0, (_size_)); \ 208 } \ 209 } while (0) 210 211 #define _BCM_VXLAN_VPN_INVALID 0xffff 212 #define BCM_STAT_VXLAN_FLEX_COUNTER_MAX_TABLES 4 213 214 /* 215 * Do not change - Implementation assumes 216 * _BCM_VXLAN_VPN_TYPE_ELINE == _BCM_VXLAN_VPN_TYPE_ELAN 217 */ 218 #define _BCM_VXLAN_VPN_TYPE_ELINE _BCM_VPN_TYPE_VFI 219 #define _BCM_VXLAN_VPN_TYPE_ELAN _BCM_VPN_TYPE_VFI 220 221 #define _BCM_VXLAN_VPN_SET(_vpn_, _type_, _id_) \ 222 _BCM_VPN_SET(_vpn_, _type_, _id_) 223 224 #define _BCM_VXLAN_VPN_GET(_id_, _type_, _vpn_) \ 225 _BCM_VPN_GET(_id_, _type_, _vpn_) 226 227 #define _BCM_VXLAN_TUNNEL_ID_IF_INVALID_RETURN(unit, id) \ 228 do { \ 229 if (((id) < 0) || (id) >= (soc_mem_index_count((unit), SOURCE_VPm))) { \ 230 return (BCM_E_BADID); \ 231 } \ 232 } while(0) 233 234 extern int _bcm_esw_vxlan_trunk_member_add(int unit, bcm_trunk_t trunk_id, 235 int trunk_member_count, bcm_port_t *trunk_member_array); 236 extern int _bcm_esw_vxlan_trunk_member_delete(int unit, bcm_trunk_t trunk_id, 237 int trunk_member_count, bcm_port_t *trunk_member_array); 238 extern int _bcm_esw_vxlan_port_source_vp_lag_set( 239 int unit, 240 bcm_gport_t gport, 241 int vp_lag_vp); 242 extern int _bcm_esw_vxlan_port_source_vp_lag_clear( 243 int unit, 244 bcm_gport_t gport, 245 int vp_lag_vp); 246 extern int _bcm_esw_vxlan_port_source_vp_lag_get( 247 int unit, 248 bcm_gport_t gport, 249 int *vp_lag_vp); 250 251 252 #if defined(INCLUDE_L3) 253 254 extern int _bcm_td2_vxlan_nexthop_entry_modify( 255 int unit, 256 int nh_index, 257 int drop, 258 _bcm_td2_vxlan_nh_info_t *egr_nh_info, 259 int new_entry_type); 260 261 extern int _bcm_td2_vxlan_ecmp_nexthop_entry_modify( 262 int unit, 263 int ecmp_index, 264 int drop, 265 _bcm_td2_vxlan_nh_info_t egr_nh_info, 266 int new_entry_type); 267 268 extern int _bcm_td2_vxlan_ecmp_port_egress_nexthop_reset( 269 int unit, 270 int ecmp_index, 271 int vp_type, 272 int vp, 273 bcm_vpn_t vpn); 274 275 extern int _bcm_td2_vxlan_port_egress_nexthop_reset( 276 int unit, 277 int nh_index, 278 int vp_type, 279 int vp, 280 bcm_vpn_t vpn); 281 282 extern bcm_error_t _bcm_td2_vxlan_dip_stat_counter_get( 283 int unit, 284 int sync_mode, 285 bcm_ip_t vxlan_dip, 286 bcm_vxlan_dip_stat_t stat, 287 uint32 num_entries, 288 uint32 *counter_indexes, 289 bcm_stat_value_t *counter_values); 290 291 extern bcm_error_t _bcm_td2_vxlan_dip_stat_multi_get( 292 int unit, 293 bcm_ip_t vxlan_dip, 294 int nstat, 295 bcm_vxlan_dip_stat_t *stat_arr, 296 uint64 *value_arr); 297 298 299 300 extern bcm_error_t _bcm_td2_vxlan_dip_stat_multi_get32( 301 int unit, 302 bcm_ip_t vxlan_dip, 303 int nstat, 304 bcm_vxlan_dip_stat_t *stat_arr, 305 uint32 *value_arr); 306 307 308 extern bcm_error_t _bcm_td2_vxlan_dip_stat_counter_set( 309 int unit, 310 bcm_ip_t vxlan_dip, 311 bcm_vxlan_dip_stat_t stat, 312 uint32 num_entries, 313 uint32 *counter_indexes, 314 bcm_stat_value_t *counter_values); 315 316 extern bcm_error_t _bcm_esw_vxlan_dip_stat_counter_get( 317 int unit, 318 int sync_mode, 319 bcm_ip_t vxlan_dip, 320 bcm_vxlan_dip_stat_t stat, 321 uint32 num_entries, 322 uint32 *counter_indexes, 323 bcm_stat_value_t *counter_values); 324 325 326 extern bcm_error_t _bcm_td2_vxlan_dip_stat_multi_set( 327 int unit, 328 bcm_ip_t vxlan_dip, 329 int nstat, 330 bcm_vxlan_dip_stat_t *stat_arr, 331 uint64 *value_arr); 332 333 334 extern bcm_error_t _bcm_td2_vxlan_dip_stat_multi_set32( 335 int unit, 336 bcm_ip_t vxlan_dip, 337 int nstat, 338 bcm_vxlan_dip_stat_t *stat_arr, 339 uint32 *value_arr); 340 341 342 extern bcm_error_t _bcm_td2_vxlan_dip_stat_id_get( 343 int unit, 344 bcm_ip_t vxlan_dip, 345 bcm_vxlan_dip_stat_t stat, 346 uint32 *stat_counter_id); 347 348 349 350 extern bcm_error_t _bcm_td2_vxlan_dip_stat_detach( 351 int unit, 352 bcm_ip_t vxlan_dip); 353 354 355 extern bcm_error_t _bcm_td2_vxlan_dip_stat_attach( 356 int unit, 357 bcm_ip_t vxlan_dip, 358 uint32 stat_counter_id); 359 #endif 360 #if defined(INCLUDE_L3) 361 extern int _bcm_td2_vxlan_higig_ppd_select(int unit, int nh_index, uint32 flags); 362 extern int _bcm_td2_vxlan_ecmp_higig_ppd_select(int unit, int ecmp_index, uint32 flags); 363 #endif 364 365 #ifndef BCM_SW_STATE_DUMP_DISABLE 366 extern void _bcm_vxlan_sw_dump(int unit); 367 #endif /* BCM_SW_STATE_DUMP_DISABLE */ 368 369 #ifdef BCM_WARM_BOOT_SUPPORT 370 extern int _bcm_esw_vxlan_sync(int unit); 371 #endif /* BCM_WARM_BOOT_SUPPORT */ 372 373 #endif /* !_BCM_INT_VXLAN_H */ 374 375