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 (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