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

bfd.c (20678B)


      1 /*
      2  * 
      3  *
      4  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      5  * 
      6  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      7  *
      8  * File:       bfd.c
      9  * Purpose:    Bidirectional Forwarding Detection APIs.
     10  */
     11 
     12 #include <soc/defs.h>
     13 
     14 #if defined(BCM_TRIDENT2_SUPPORT) && defined(INCLUDE_BFD)
     15 
     16 #include <soc/hash.h>
     17 #include <bcm_int/esw/bfd.h>
     18 #include <bcm_int/esw/xgs5.h>
     19 #include <bcm_int/esw/katana.h>
     20 #include <bcm_int/esw/triumph.h>
     21 #include <bcm_int/esw/triumph2.h>
     22 #include <bcm_int/esw/trident2.h>
     23 #include <bcm_int/esw/tomahawk3.h>
     24 #include <bcm/error.h>
     25 #include <bcm/bfd.h>
     26 
     27 
     28 /*
     29  * Function Vectors
     30  */
     31 static bcm_esw_bfd_drv_t bcm_td2_bfd_drv = {
     32     /* init                     */ bcmi_td2_bfd_init,
     33     /* detach                   */ bcmi_xgs5_bfd_detach,
     34     /* endpoint_create          */ bcmi_xgs5_bfd_endpoint_create,
     35     /* endpoint_get             */ bcmi_xgs5_bfd_endpoint_get,
     36     /* endpoint_destroy         */ bcmi_xgs5_bfd_endpoint_destroy,
     37     /* endpoint_destroy_all     */ bcmi_xgs5_bfd_endpoint_destroy_all,
     38     /* endpoint_poll            */ bcmi_xgs5_bfd_endpoint_poll,
     39     /* event_register           */ bcmi_xgs5_bfd_event_register,
     40     /* event_unregister         */ bcmi_xgs5_bfd_event_unregister,
     41     /* endpoint_stat_get        */ bcmi_xgs5_bfd_endpoint_stat_get,
     42     /* auth_sha1_set            */ bcmi_xgs5_bfd_auth_sha1_set,
     43     /* auth_sha1_get            */ bcmi_xgs5_bfd_auth_sha1_get,
     44     /* auth_simple_password_set */ bcmi_xgs5_bfd_auth_simple_password_set,
     45     /* auth_simple_password_get */ bcmi_xgs5_bfd_auth_simple_password_get,
     46 #ifdef BCM_WARM_BOOT_SUPPORT
     47     /* bfd_sync                 */ bcmi_xgs5_bfd_sync,
     48     /* _bfd_wb_downgrade_config_set */ _bcmi_bfd_wb_downgrade_config_set,
     49 #endif /* BCM_WARM_BOOT_SUPPORT */
     50 #ifdef BCM_WARM_BOOT_SUPPORT_SW_DUMP
     51     /* bfd_sw_dump              */ bcmi_xgs5_bfd_sw_dump,
     52 #endif /* BCM_WARM_BOOT_SUPPORT_SW_DUMP */
     53     /* tx_start                 */ bcmi_xgs5_bfd_tx_start,
     54     /* tx_stop                  */ bcmi_xgs5_bfd_tx_stop,
     55     /* bfd_status_multi_get     */ bcmi_xgs5_bfd_status_multi_get,
     56     /* bfd_discard_stat_set     */ bcmi_xgs5_bfd_discard_stat_set,
     57     /* bfd_discard_stat_get     */ bcmi_xgs5_bfd_discard_stat_get,
     58     /* bcm_bfd_dump_trace       */ bcmi_xgs5_bfd_dump_trace,
     59 };
     60 
     61 
     62 /*
     63  * Device Specific HW Tables
     64  */
     65 
     66 /* Device programming routines */
     67 static bcm_xgs5_bfd_hw_calls_t bcm_td2_bfd_hw_calls = {
     68     /* l3_tnl_term_entry_init   */ _bcm_tr2_l3_tnl_term_entry_init,
     69     /* mpls_lock                */ bcm_tr_mpls_lock,
     70     /* mpls_unlock              */ bcm_tr_mpls_unlock,
     71 };
     72 
     73 /* L2 Table */
     74 static bcm_xgs5_bfd_l2_table_t bcm_td2_bfd_l2_table = {
     75     /* mem                */  L2Xm,
     76     /* key_type           */  KEY_TYPEf,
     77     /* bfd_key_type       */  0x8,
     78     /* valid              */  VALIDf,
     79     /* static             */  BFD__STATIC_BITf,
     80     /* session_id_type    */  BFD__SESSION_IDENTIFIER_TYPEf,
     81     /* your_discr         */  BFD__YOUR_DISCRIMINATORf,
     82     /* label              */  BFD__LABELf,
     83     /* session_index      */  BFD__RX_SESSION_IDXf,
     84     /* cpu_queue_class    */  INVALIDf,
     85     /* remote             */  BFD__REMOTEf,
     86     /* dst_module         */  BFD__MODULE_IDf,
     87     /* dst_port           */  BFD__PORT_NUMf,
     88     /* int_pri            */  BFD__INT_PRIf,
     89 };
     90 
     91 /* L3 IPv4 Unicast Table */
     92 static bcm_xgs5_bfd_l3_ipv4_table_t bcm_td2_bfd_l3_ipv4_table = {
     93     /* mem                */ L3_ENTRY_IPV4_UNICASTm, 
     94     /* vrf_id             */ VRF_IDf, 
     95     /* ip_addr            */ IP_ADDRf,
     96     /* key_type           */ KEY_TYPEf, 
     97     /* local_address      */ IPV4UC__LOCAL_ADDRESSf,
     98     /* bfd_enable         */ IPV4UC__BFD_ENABLEf,
     99 };
    100 
    101 /* L3 IPv6 Unicast Table */
    102 static bcm_xgs5_bfd_l3_ipv6_table_t bcm_td2_bfd_l3_ipv6_table = {
    103     /* mem                */ L3_ENTRY_IPV6_UNICASTm, 
    104     /* ip_addr_lwr_64     */ IP_ADDR_LWR_64f,
    105     /* ip_addr_upr_64     */ IP_ADDR_UPR_64f,
    106     /* key_type_0         */ KEY_TYPE_0f,
    107     /* key_type_1         */ KEY_TYPE_1f,
    108     /* vrf_id             */ VRF_IDf,
    109     /* local_address      */ IPV6UC__LOCAL_ADDRESSf,
    110     /* bfd_enable         */ IPV6UC__BFD_ENABLEf,
    111     /* base_valid_0       */ INVALIDf,
    112     /* base_valid_1       */ INVALIDf,
    113     /* key_type           */ INVALIDf,
    114     /* data_type          */ INVALIDf,
    115 };
    116 
    117 /* L3 Tunnel Table */
    118 static bcm_xgs5_bfd_l3_tunnel_table_t bcm_td2_bfd_l3_tunnel_table = {
    119     /* mem                */ L3_TUNNELm,
    120     /* bfd_enable         */ BFD_ENABLEf,
    121 };
    122 
    123 /* MPLS Table */
    124 static bcm_xgs5_bfd_mpls_table_t bcm_td2_bfd_mpls_table = {
    125     /* mem                */ MPLS_ENTRYm,
    126     /* valid              */ VALIDf,
    127     /* key_type           */ KEY_TYPEf,
    128     /* key_type_value     */ 0x0,
    129     /* mpls_label         */ MPLS__MPLS_LABELf,
    130     /* session_id_type    */ MPLS__SESSION_IDENTIFIER_TYPEf,
    131     /* bfd_enable         */ MPLS__BFD_ENABLEf,
    132     /* cw_check_ctrl      */ MPLS__CW_CHECK_CTRLf,
    133     /* pw_cc_type         */ MPLS__PW_CC_TYPEf,
    134     /* mpls_action_if_bos */ MPLS__MPLS_ACTION_IF_BOSf,
    135     /* l3_iif             */ MPLS__L3_IIFf,
    136     /* decap_use_ttl      */ MPLS__DECAP_USE_TTLf,
    137     /* mod id             */ MPLS__MODULE_IDf,
    138     /* port num           */ MPLS__PORT_NUMf,
    139 };
    140 #if defined(BCM_TOMAHAWK3_SUPPORT)
    141 
    142 static bcm_xgs5_bfd_hw_calls_t bcm_th3_bfd_hw_calls = {
    143     /* l3_tnl_term_entry_init   */ _bcm_th3_l3_tnl_term_entry_init,
    144     /* mpls_lock                */ bcm_tr_mpls_lock,
    145     /* mpls_unlock              */ bcm_tr_mpls_unlock,
    146 };
    147 
    148 /* L3 IPv4 Unicast Table */
    149 static bcm_xgs5_bfd_l3_ipv4_table_t bcm_th3_bfd_l3_ipv4_table = {
    150     /* mem                */ L3_ENTRY_SINGLEm,
    151     /* vrf_id             */ VRF_IDf,
    152     /* ip_addr            */ IP_ADDRf,
    153     /* key_type           */ KEY_TYPEf,
    154     /* local_address      */ IPV4UC__LOCAL_ADDRESSf,
    155     /* bfd_enable         */ IPV4UC__BFD_ENABLEf
    156 };
    157 
    158 /* L3 IPv6 Unicast Table */
    159 static bcm_xgs5_bfd_l3_ipv6_table_t bcm_th3_bfd_l3_ipv6_table = {
    160     /* mem                */ L3_ENTRY_DOUBLEm,
    161     /* ip_addr_lwr_64     */ IPV6UC__IP_ADDR_LWR_64f,
    162     /* ip_addr_upr_64     */ IPV6UC__IP_ADDR_UPR_64f,
    163     /* key_type_0         */ INVALIDf,
    164     /* key_type_1         */ INVALIDf,
    165     /* vrf_id             */ IPV6UC__VRF_IDf,
    166     /* local_address      */ IPV6UC__LOCAL_ADDRESSf,
    167     /* bfd_enable         */ IPV6UC__BFD_ENABLEf,
    168     /* base_valid_0       */ BASE_VALID_0f,
    169     /* base_valid_1       */ BASE_VALID_1f,
    170     /* key_type           */ KEY_TYPEf,
    171     /* data_type          */ INVALIDf
    172 };
    173 
    174 /* L3 Tunnel IPV4 Table */
    175 static bcm_xgs5_bfd_l3_tunnel_table_t bcm_th3_bfd_l3_tunnel_ipv4_table = {
    176     /* mem                */ L3_TUNNEL_DOUBLEm,
    177     /* bfd_enable         */ IPV4__BFD_ENABLEf,
    178 };
    179 
    180 /* L3 Tunnel IPV6 Table */
    181 static bcm_xgs5_bfd_l3_tunnel_ipv6_table_t bcm_th3_bfd_l3_tunnel_ipv6_table = {
    182     /* mem                */ L3_TUNNEL_QUADm,
    183     /* bfd_enable         */ IPV6__BFD_ENABLEf,
    184 };
    185 
    186 /* MPLS Table */
    187 static bcm_xgs5_bfd_mpls_table_t bcm_th3_bfd_mpls_table = {
    188     /* mem                */ MPLS_ENTRY_SINGLEm,
    189     /* valid              */ BASE_VALIDf,
    190     /* key_type           */ KEY_TYPEf,
    191     /* key_type_value     */ 0x0,
    192     /* mpls_label         */ MPLS__MPLS_LABELf,
    193     /* session_id_type    */ MPLS__SESSION_IDENTIFIER_TYPEf,
    194     /* bfd_enable         */ MPLS__BFD_ENABLEf,
    195     /* cw_check_ctrl      */ MPLS__CW_CHECK_CTRLf,
    196     /* pw_cc_type         */ MPLS__PW_CC_TYPEf,
    197     /* mpls_action_if_bos */ MPLS__MPLS_ACTION_IF_BOSf,
    198     /* l3_iif             */ MPLS__L3_IIFf,
    199     /* decap_use_ttl      */ MPLS__DECAP_USE_TTLf,
    200     /* mod id             */ MPLS__MODULE_IDf,
    201     /* port num           */ MPLS__PORT_NUMf,
    202 };
    203 
    204 #endif
    205 
    206 #if defined(BCM_TRIDENT3_SUPPORT)
    207 /* L3 IPv4 Unicast Table */
    208 static bcm_xgs5_bfd_l3_ipv4_table_t bcm_td3_bfd_l3_ipv4_table = {
    209     /* mem                */ L3_ENTRY_SINGLEm,
    210     /* vrf_id             */ VRF_IDf,
    211     /* ip_addr            */ IP_ADDRf,
    212     /* key_type           */ KEY_TYPEf,
    213     /* local_address      */ IPV4UC__LOCAL_ADDRESSf,
    214     /* class_id           */ IPV4UC__CLASS_IDf,
    215 };
    216 
    217 /* L3 IPv6 Unicast Table */
    218 static bcm_xgs5_bfd_l3_ipv6_table_t bcm_td3_bfd_l3_ipv6_table = {
    219     /* mem                */ L3_ENTRY_DOUBLEm,
    220     /* ip_addr_lwr_64     */ IPV6UC__IP_ADDR_LWR_64f,
    221     /* ip_addr_upr_64     */ IPV6UC__IP_ADDR_UPR_64f,
    222     /* key_type_0         */ INVALIDf,
    223     /* key_type_1         */ INVALIDf,
    224     /* vrf_id             */ IPV6UC__VRF_IDf,
    225     /* local_address      */ IPV6UC__LOCAL_ADDRESSf,
    226     /* class_id           */ IPV6UC__CLASS_IDf,
    227     /* base_valid_0       */ BASE_VALID_0f,
    228     /* base_valid_1       */ BASE_VALID_1f,
    229     /* key_type           */ KEY_TYPEf,
    230     /* data_type          */ DATA_TYPEf,
    231 };
    232 
    233 /* L3 Tunnel Table */
    234 static bcm_xgs5_bfd_l3_tunnel_table_t bcm_td3_bfd_l3_tunnel_table = {
    235     /* mem                */ L3_TUNNELm,
    236     /* tunnel_class_id    */ TUNNEL_CLASS_IDf,
    237 };
    238 
    239 /* MPLS Table */
    240 static bcm_xgs5_bfd_mpls_table_t bcm_td3_bfd_mpls_table = {
    241     /* mem                */ MPLS_ENTRYm,
    242     /* valid              */ VALIDf,
    243     /* key_type           */ KEY_TYPEf,
    244     /* key_type_value     */ 0x0,
    245     /* mpls_label         */ MPLS__MPLS_LABELf,
    246     /* session_id_type    */ MPLS__SESSION_IDENTIFIER_TYPEf,
    247     /* class_id           */ MPLS__CLASS_IDf,
    248     /* cw_check_ctrl      */ MPLS__CW_CHECK_CTRLf,
    249     /* pw_cc_type         */ MPLS__PW_CC_TYPEf,
    250     /* mpls_action_if_bos */ MPLS__MPLS_ACTION_IF_BOSf,
    251     /* l3_iif             */ MPLS__L3_IIFf,
    252     /* decap_use_ttl      */ MPLS__DECAP_USE_TTLf,
    253     /* mod id             */ MPLS__MODULE_IDf,
    254     /* port num           */ MPLS__PORT_NUMf,
    255 };
    256 #endif
    257 
    258 /* HW Definitions */
    259 static bcm_xgs5_bfd_hw_defs_t    bcm_td2_bfd_hw_defs[BCM_MAX_NUM_UNITS];
    260 
    261 
    262 /*
    263  * Function:
    264  *     bcmi_td2_bfd_ipv4_loopback_addr_set
    265  * Description:
    266  *     Set ipv6 reserved multicast address and mask.
    267  *
    268  * Parameters:
    269  *      unit             - (IN) unit number
    270  *      ip_addr          - (IN) ipv4 address
    271  *      ip_mask          - (IN) ipv4 mask
    272  *      mem              - (IN) PARSER1/2 BFD DIPV4 LOOPBACK memory
    273  *
    274  * Return Value:
    275  *      BCM_E_XXX
    276  * Notes:
    277  */
    278 int
    279 bcmi_td2_bfd_ipv4_loopback_addr_set(int unit,
    280                                     soc_mem_t mem,
    281                                     bcm_ip_t ip_addr,
    282                                     bcm_ip_t ip_mask)
    283 {
    284 
    285     uint32    entry_buf[SOC_MAX_MEM_FIELD_WORDS];
    286 
    287     /* clear entry memory */
    288     sal_memset(entry_buf, 0, sizeof(entry_buf));
    289     /* set address in entry */
    290     soc_mem_field_set(unit, mem, entry_buf, VALUEf, &ip_addr);
    291     /* set the mask in entry */
    292     soc_mem_field_set(unit, mem, entry_buf, MASKf, &ip_mask);
    293     /* write entry to hardware */
    294     BCM_IF_ERROR_RETURN(soc_mem_write(unit, mem, MEM_BLOCK_ALL, 0,
    295                                       entry_buf));
    296     return BCM_E_NONE;
    297 }
    298 
    299 
    300 /*
    301  * Function:
    302  *     bcmi_td2_bfd_ipv6_loopback_addr_set
    303  * Description:
    304  *     Set ipv6 reserved multicast address and mask.
    305  *
    306  * Parameters:
    307  *      unit             - (IN) unit number
    308  *      ip6_addr         - (IN) ipv6 address
    309  *      ip6_mask         - (IN) ipv6 mask
    310  *      mem              - (IN) PARSER1/2 BFD DIPV6 LOOPBACK memory
    311  *
    312  * Return Value:
    313  *      BCM_E_XXX
    314  * Notes:
    315  */
    316 int
    317 bcmi_td2_bfd_ipv6_loopback_addr_set(int unit,
    318                                     soc_mem_t mem,
    319                                     bcm_ip6_t ip6_addr,
    320                                     bcm_ip6_t ip6_mask)
    321 {
    322 
    323     uint32    ip6_fields[4];
    324     uint32    entry_buf[SOC_MAX_MEM_FIELD_WORDS];
    325 
    326     /* clear entry memory */
    327     sal_memset(entry_buf, 0, sizeof(entry_buf));
    328     /* encode v6 address into ip6_fields */
    329     SAL_IP6_ADDR_TO_UINT32(ip6_addr, ip6_fields);
    330     /* set address in entry */
    331     soc_mem_field_set(unit, mem, entry_buf, VALUEf, &(ip6_fields[0]));
    332     /* encode v6 mask into ip6_fields */
    333     SAL_IP6_ADDR_TO_UINT32(ip6_mask, ip6_fields);
    334     /* set the mask in entry */
    335     soc_mem_field_set(unit, mem, entry_buf, MASKf, &(ip6_fields[0]));
    336     /* write entry to hardware */
    337     BCM_IF_ERROR_RETURN(soc_mem_write(unit, mem, MEM_BLOCK_ALL, 0,
    338                                       entry_buf));
    339     return BCM_E_NONE;
    340 }
    341 
    342 /*
    343  * Function:
    344  *      bcmi_td2_bfd_init
    345  * Purpose:
    346  *      Initialize the BFD subsystem
    347  * Parameters:
    348  *      unit - (IN) Unit number.
    349  * Returns:
    350  *      BCM_E_NONE Operation completed successfully
    351  *      BCM_E_MEMORY Unable to allocate memory for internal control structures
    352  *      BCM_E_INTERNAL Failed to initialize
    353  * Notes:
    354  *      BFD initialization will return BCM_E_NONE for the following
    355  *      error conditions (i.e. feature not supported):
    356  *      - uKernel is not loaded
    357  *      - BFD application is not found in any of the uC uKernel
    358  */
    359 int
    360 bcmi_td2_bfd_init(int unit)
    361 {
    362 
    363     /* BFD feature enable bit set */
    364     uint8 bfd_feature_enable;
    365     uint32 val;
    366 #if defined(BCM_TRIDENT3_SUPPORT)
    367     bcm_ip_t  ip_addr;
    368     bcm_ip_t  ip_mask;
    369     bcm_ip6_t ip6_addr;
    370     bcm_ip6_t ip6_mask;
    371     uint8 i;
    372 #endif
    373 
    374 #if defined(BCM_TRIDENT3_SUPPORT)
    375     if (SOC_IS_TRIDENT3X(unit)) {
    376 
    377         /* HW Definition Tables */
    378         sal_memset(bcm_td2_bfd_hw_defs, 0, sizeof(bcm_td2_bfd_hw_defs));
    379         bcm_td2_bfd_hw_defs[unit].l2        = &bcm_td2_bfd_l2_table;
    380         bcm_td2_bfd_hw_defs[unit].hw_call   = &bcm_td2_bfd_hw_calls;
    381         bcm_td2_bfd_hw_defs[unit].l3_ipv4   = &bcm_td3_bfd_l3_ipv4_table;
    382         bcm_td2_bfd_hw_defs[unit].l3_ipv6   = &bcm_td3_bfd_l3_ipv6_table;
    383         bcm_td2_bfd_hw_defs[unit].l3_tunnel = &bcm_td3_bfd_l3_tunnel_table;
    384         bcm_td2_bfd_hw_defs[unit].mpls      = &bcm_td3_bfd_mpls_table;
    385 
    386         /*
    387          * DIPv4 loopback address must be in the range
    388          * 127.0.0.0 - 127.255.255.255
    389          */
    390         ip_addr = 0x7F000000;
    391         ip_mask = 0xFF000000;
    392         sal_memset(ip6_addr, 0, BCM_IP6_ADDRLEN);
    393         sal_memset(ip6_mask, 0, BCM_IP6_ADDRLEN);
    394         /*
    395          * DIPv6 loopback address must be in the range
    396          * 0:0:0:0:0:FFFF:7F00:0000 - 0:0:0:0:0:FFFF: 7FFF:FFFF
    397  */
    398         ip6_addr[3] = 0x7F;
    399         ip6_addr[4] = 0xFF;
    400         ip6_addr[5] = 0xFF;
    401         for(i = 3; i < BCM_IP6_ADDRLEN; i++) {
    402             ip6_mask[i] = 0xFF;
    403         }
    404         bcmi_td2_bfd_ipv4_loopback_addr_set(unit, PARSER1_BFD_DIP_V4_LOOPBACKm,
    405                                             ip_addr, ip_mask);
    406         bcmi_td2_bfd_ipv4_loopback_addr_set(unit, PARSER2_BFD_DIP_V4_LOOPBACKm,
    407                                             ip_addr, ip_mask);
    408         bcmi_td2_bfd_ipv6_loopback_addr_set(unit, PARSER1_BFD_DIP_V6_LOOPBACKm,
    409                                             ip6_addr, ip6_mask);
    410         bcmi_td2_bfd_ipv6_loopback_addr_set(unit, PARSER2_BFD_DIP_V6_LOOPBACKm,
    411                                             ip6_addr, ip6_mask);
    412     } else
    413 #endif
    414 #if defined(BCM_TOMAHAWK3_SUPPORT)
    415     if (SOC_IS_TOMAHAWK3(unit)) {
    416         /* HW Definition Tables */
    417         sal_memset(bcm_td2_bfd_hw_defs, 0, sizeof(bcm_td2_bfd_hw_defs));
    418         bcm_td2_bfd_hw_defs[unit].l2        = &bcm_td2_bfd_l2_table;
    419         bcm_td2_bfd_hw_defs[unit].hw_call   = &bcm_th3_bfd_hw_calls;
    420         bcm_td2_bfd_hw_defs[unit].l3_ipv4   = &bcm_th3_bfd_l3_ipv4_table;
    421         bcm_td2_bfd_hw_defs[unit].l3_ipv6   = &bcm_th3_bfd_l3_ipv6_table;
    422         bcm_td2_bfd_hw_defs[unit].l3_tunnel = &bcm_th3_bfd_l3_tunnel_ipv4_table;
    423         bcm_td2_bfd_hw_defs[unit].l3_tunnel_ipv6 = &bcm_th3_bfd_l3_tunnel_ipv6_table;
    424         bcm_td2_bfd_hw_defs[unit].mpls      = &bcm_th3_bfd_mpls_table;
    425     } else
    426 #endif
    427     {
    428         /* HW Definition Tables */
    429         sal_memset(bcm_td2_bfd_hw_defs, 0, sizeof(bcm_td2_bfd_hw_defs));
    430         bcm_td2_bfd_hw_defs[unit].hw_call   = &bcm_td2_bfd_hw_calls;
    431         bcm_td2_bfd_hw_defs[unit].l2        = &bcm_td2_bfd_l2_table;
    432         bcm_td2_bfd_hw_defs[unit].l3_ipv4   = &bcm_td2_bfd_l3_ipv4_table;
    433         bcm_td2_bfd_hw_defs[unit].l3_ipv6   = &bcm_td2_bfd_l3_ipv6_table;
    434         bcm_td2_bfd_hw_defs[unit].l3_tunnel = &bcm_td2_bfd_l3_tunnel_table;
    435         bcm_td2_bfd_hw_defs[unit].mpls      = &bcm_td2_bfd_mpls_table;
    436         bcm_td2_bfd_hw_defs[unit].l3_tunnel_ipv6 = NULL;
    437     }
    438 
    439 #if defined(BCM_APACHE_SUPPORT)
    440     if(!(SOC_IS_APACHE(unit))) {
    441 #endif
    442     /*
    443      * BFD Feature Enable
    444      * lower bits will take precedence
    445      */
    446     bfd_feature_enable = soc_property_get(unit, spn_BFD_FEATURE_ENABLE, 1);
    447 
    448     if (bfd_feature_enable & BFD_MHOP_FEATURE_ENABLE) {
    449          /* Set UDP Dest port for MultiHop BFD session */
    450          BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val));
    451          soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val,
    452                            BFD_UDP_PORTM_HOPf, BFD_UDP_MULTI_HOP_DEST_PORT);
    453          BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val));
    454 
    455          bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = BFD_MHOP_FEATURE_ENABLE;
    456 
    457     } else if (bfd_feature_enable &  BFD_MICRO_FEATURE_ENABLE) {
    458         /* Set UDP Dest port for Micro BFD session */
    459           BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val));
    460           soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val,
    461                             BFD_UDP_PORTM_HOPf, MICRO_BFD_DEST_PORT);
    462           BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val));
    463 
    464           bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = BFD_MICRO_FEATURE_ENABLE;
    465 
    466     } else if (bfd_feature_enable & BFD_ECHO_FEATURE_ENABLE) {
    467           /* Set UDP Dest port for Echo BFD session */
    468           BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val));
    469           soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val,
    470                             BFD_UDP_PORTM_HOPf, BFD_ECHO_DEST_PORT);
    471           BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val));
    472 
    473           bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = BFD_ECHO_FEATURE_ENABLE;
    474     } else if (bfd_feature_enable == 0) {
    475           /* Clear HW default values of BFD_RX_UDP_CONTROL register */
    476           BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val));
    477           soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val,
    478                             BFD_UDP_PORT1_HOPf, 0);
    479           soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val,
    480                             BFD_UDP_PORTM_HOPf, 0);
    481           BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val));
    482 
    483           bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = 0;
    484     }
    485 #if defined(BCM_APACHE_SUPPORT)
    486     } else if (SOC_IS_APACHE(unit)) {
    487         uint64 val64;
    488 
    489         bfd_feature_enable = soc_property_get(unit, spn_BFD_FEATURE_ENABLE, 3);
    490         if (bfd_feature_enable & BFD_ECHO_FEATURE_ENABLE) {
    491             if(!(bfd_feature_enable & BFD_MHOP_FEATURE_ENABLE)) {
    492                 /* Set UDP Dest port for Echo BFD session */
    493                 BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROL_64r(unit,&val64));
    494                 soc_reg64_field32_set(unit, BFD_RX_UDP_CONTROL_64r, &val64,
    495                                       BFD_UDP_PORTM_HOPf,BFD_ECHO_DEST_PORT);
    496                 BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROL_64r(unit, val64));
    497                 bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = BFD_ECHO_FEATURE_ENABLE;
    498 
    499             } else if(!(bfd_feature_enable & BFD_MICRO_FEATURE_ENABLE)) {
    500                 BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROL_64r(unit,&val64));
    501                 soc_reg64_field32_set(unit, BFD_RX_UDP_CONTROL_64r, &val64,
    502                                       BFD_UDP_PORT_LAGf,BFD_ECHO_DEST_PORT);
    503                 BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROL_64r(unit, val64));
    504                 bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = BFD_ECHO_FEATURE_ENABLE;
    505             }
    506         } else if (bfd_feature_enable ==0) {
    507             /* Clear HW default values of BFD_RX_UDP_CONTROL register */
    508             BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROL_64r(unit,&val64));
    509             soc_reg64_field32_set(unit, BFD_RX_UDP_CONTROL_64r, &val64,
    510                                   BFD_UDP_PORT1_HOPf, 0);
    511             soc_reg64_field32_set(unit, BFD_RX_UDP_CONTROL_64r, &val64,
    512                                   BFD_UDP_PORTM_HOPf, 0);
    513             soc_reg64_field32_set(unit, BFD_RX_UDP_CONTROL_64r, &val64,
    514                                   BFD_UDP_PORT_LAGf,0);
    515             BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROL_64r(unit, val64));
    516             bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = 0;
    517         }
    518     }
    519 #endif
    520 
    521     /* Initialize Common XGS5 BFD module */
    522     BCM_IF_ERROR_RETURN
    523         (bcmi_xgs5_bfd_init(unit, &bcm_td2_bfd_drv, &bcm_td2_bfd_hw_defs[unit]));
    524 
    525     return BCM_E_NONE;
    526 }
    527 
    528 #else   /* BCM_TRIDENT2_SUPPORT && INCLUDE_BFD */
    529 int bcm_esw_td2_bfd_not_empty;
    530 #endif  /* BCM_TRIDENT2_SUPPORT && INCLUDE_BFD */
    531