openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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