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 (9242B)


      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_KATANA_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/error.h>
     23 #include <bcm/bfd.h>
     24 
     25 
     26 /*
     27  * Function Vectors
     28  */
     29 static bcm_esw_bfd_drv_t bcm_kt_bfd_drv = {
     30     /* init                     */ bcmi_kt_bfd_init,
     31     /* detach                   */ bcmi_xgs5_bfd_detach,
     32     /* endpoint_create          */ bcmi_xgs5_bfd_endpoint_create,
     33     /* endpoint_get             */ bcmi_xgs5_bfd_endpoint_get,
     34     /* endpoint_destroy         */ bcmi_xgs5_bfd_endpoint_destroy,
     35     /* endpoint_destroy_all     */ bcmi_xgs5_bfd_endpoint_destroy_all,
     36     /* endpoint_poll            */ bcmi_xgs5_bfd_endpoint_poll,
     37     /* event_register           */ bcmi_xgs5_bfd_event_register,
     38     /* event_unregister         */ bcmi_xgs5_bfd_event_unregister,
     39     /* endpoint_stat_get        */ bcmi_xgs5_bfd_endpoint_stat_get,
     40     /* auth_sha1_set            */ bcmi_xgs5_bfd_auth_sha1_set,
     41     /* auth_sha1_get            */ bcmi_xgs5_bfd_auth_sha1_get,
     42     /* auth_simple_password_set */ bcmi_xgs5_bfd_auth_simple_password_set,
     43     /* auth_simple_password_get */ bcmi_xgs5_bfd_auth_simple_password_get,
     44 #ifdef BCM_WARM_BOOT_SUPPORT
     45     /* bfd_sync                 */ bcmi_xgs5_bfd_sync,
     46     /* _bfd_wb_downgrade_config_set */ _bcmi_bfd_wb_downgrade_config_set,
     47 #endif /* BCM_WARM_BOOT_SUPPORT */
     48 #ifdef BCM_WARM_BOOT_SUPPORT_SW_DUMP
     49     /* bfd_sw_dump              */ bcmi_xgs5_bfd_sw_dump,
     50 #endif /* BCM_WARM_BOOT_SUPPORT_SW_DUMP */
     51     /* tx_start                 */ bcmi_xgs5_bfd_tx_start,
     52     /* tx_stop                  */ bcmi_xgs5_bfd_tx_stop,
     53     /* bfd_status_multi_get     */ bcmi_xgs5_bfd_status_multi_get,
     54     /* bfd_discard_stat_set     */ bcmi_xgs5_bfd_discard_stat_set,
     55     /* bfd_discard_stat_get     */ bcmi_xgs5_bfd_discard_stat_get,
     56     /* bcm_bfd_dump_trace       */ bcmi_xgs5_bfd_dump_trace,
     57 };
     58 
     59 
     60 /*
     61  * Device Specific HW Tables
     62  */
     63 
     64 /* Device programming routines */
     65 static bcm_xgs5_bfd_hw_calls_t bcm_kt_bfd_hw_calls = {
     66     /* l3_tnl_term_entry_init   */ _bcm_tr2_l3_tnl_term_entry_init,
     67     /* mpls_lock                */ bcm_tr_mpls_lock,
     68     /* mpls_unlock              */ bcm_tr_mpls_unlock,
     69 };
     70 
     71 /* L2 Table */
     72 static bcm_xgs5_bfd_l2_table_t bcm_kt_bfd_l2_table = {
     73     /* mem                */  L2Xm,
     74     /* key_type           */  KEY_TYPEf,
     75     /* bfd_key_type       */  0x4,
     76     /* valid              */  VALIDf,
     77     /* static             */  BFD__STATIC_BITf,
     78     /* session_id_type    */  BFD__SESSION_IDENTIFIER_TYPEf,
     79     /* your_discr         */  BFD__YOUR_DISCRIMINATORf,
     80     /* label              */  BFD__LABELf,
     81     /* session_index      */  BFD__BFD_RX_SESSION_INDEXf,
     82     /* cpu_queue_class    */  BFD__BFD_CPU_QUEUE_CLASSf,
     83     /* remote             */  BFD__BFD_REMOTEf,
     84     /* dst_module         */  BFD__BFD_DST_MODf,
     85     /* dst_port           */  BFD__BFD_DST_PORTf,
     86     /* int_pri            */  BFD__BFD_INT_PRIf,
     87 };
     88 
     89 /* L3 IPv4 Unicast Table */
     90 static bcm_xgs5_bfd_l3_ipv4_table_t bcm_kt_bfd_l3_ipv4_table = {
     91     /* mem                */ L3_ENTRY_IPV4_UNICASTm, 
     92     /* vrf_id             */ VRF_IDf, 
     93     /* ip_addr            */ IP_ADDRf,
     94     /* key_type           */ KEY_TYPEf, 
     95     /* local_address      */ IPV4UC__LOCAL_ADDRESSf,
     96     /* bfd_enable         */ IPV4UC__BFD_ENABLEf,
     97 };
     98 
     99 /* L3 IPv6 Unicast Table */
    100 static bcm_xgs5_bfd_l3_ipv6_table_t bcm_kt_bfd_l3_ipv6_table = {
    101     /* mem                */ L3_ENTRY_IPV6_UNICASTm, 
    102     /* ip_addr_lwr_64     */ IP_ADDR_LWR_64f,
    103     /* ip_addr_upr_64     */ IP_ADDR_UPR_64f,
    104     /* key_type_0         */ KEY_TYPE_0f,
    105     /* key_type_1         */ KEY_TYPE_1f,
    106     /* vrf_id             */ VRF_IDf,
    107     /* local_address      */ IPV6UC__LOCAL_ADDRESSf,
    108     /* bfd_enable         */ IPV6UC__BFD_ENABLEf,
    109     /* base_valid_0       */ INVALIDf,
    110     /* base_valid_1       */ INVALIDf,
    111     /* key_type           */ INVALIDf,
    112     /* data_type          */ INVALIDf,
    113 };
    114 
    115 /* L3 Tunnel Table */
    116 static bcm_xgs5_bfd_l3_tunnel_table_t bcm_kt_bfd_l3_tunnel_table = {
    117     /* mem                */ L3_TUNNELm,
    118     /* bfd_enable         */ BFD_ENABLEf,
    119 };
    120 
    121 /* SB2 L3 Tunnel Table */
    122 static bcm_xgs5_bfd_l3_tunnel_table_t bcm_sb2_bfd_l3_tunnel_table = {
    123     /* mem                */ L3_TUNNELm,
    124     /* bfd_enable         */ BFD_ENABLEf,
    125 };
    126 
    127 /* MPLS Table */
    128 static bcm_xgs5_bfd_mpls_table_t bcm_kt_bfd_mpls_table = {
    129     /* mem                */ MPLS_ENTRYm,
    130     /* valid              */ VALIDf,
    131     /* key_type           */ KEY_TYPEf,
    132     /* key_type_value     */ 0x0,
    133     /* mpls_label         */ MPLS__MPLS_LABELf,
    134     /* session_id_type    */ MPLS__SESSION_IDENTIFIER_TYPEf,
    135     /* bfd_enable         */ MPLS__BFD_ENABLEf,
    136     /* cw_check_ctrl      */ MPLS__CW_CHECK_CTRLf,
    137     /* pw_cc_type         */ MPLS__PW_CC_TYPEf,
    138     /* mpls_action_if_bos */ MPLS__MPLS_ACTION_IF_BOSf,
    139     /* l3_iif             */ MPLS__L3_IIFf,
    140     /* decap_use_ttl      */ MPLS__DECAP_USE_TTLf,
    141     /* Mod id             */ MPLS__MODULE_IDf,
    142     /* Port num           */ MPLS__PORT_NUMf,
    143 };
    144 
    145 /* HW Definitions */
    146 static bcm_xgs5_bfd_hw_defs_t    bcm_kt_bfd_hw_defs[BCM_MAX_NUM_UNITS];
    147 
    148 
    149 /*
    150  * Function:
    151  *      bcmi_kt_bfd_init
    152  * Purpose:
    153  *      Initialize the BFD subsystem
    154  * Parameters:
    155  *      unit - (IN) Unit number.
    156  * Returns:
    157  *      BCM_E_NONE Operation completed successfully
    158  *      BCM_E_MEMORY Unable to allocate memory for internal control structures
    159  *      BCM_E_INTERNAL Failed to initialize
    160  * Notes:
    161  *      BFD initialization will return BCM_E_NONE for the following
    162  *      error conditions (i.e. feature not supported):
    163  *      - uKernel is not loaded
    164  *      - BFD application is not found in any of the uC uKernel
    165  */
    166 int
    167 bcmi_kt_bfd_init(int unit)
    168 {
    169 
    170     /* BFD feature enable bit set */
    171     uint8 bfd_feature_enable;
    172     uint32 val;
    173 
    174     /* HW Definition Tables */
    175     sal_memset(bcm_kt_bfd_hw_defs, 0, sizeof(bcm_kt_bfd_hw_defs));
    176     bcm_kt_bfd_hw_defs[unit].hw_call   = &bcm_kt_bfd_hw_calls;
    177     bcm_kt_bfd_hw_defs[unit].l2        = &bcm_kt_bfd_l2_table;
    178     bcm_kt_bfd_hw_defs[unit].l3_ipv4   = &bcm_kt_bfd_l3_ipv4_table;
    179     bcm_kt_bfd_hw_defs[unit].l3_ipv6   = &bcm_kt_bfd_l3_ipv6_table;
    180     if (SOC_IS_SABER2(unit)) {
    181         bcm_kt_bfd_hw_defs[unit].l3_tunnel = &bcm_sb2_bfd_l3_tunnel_table;
    182     } else {
    183         bcm_kt_bfd_hw_defs[unit].l3_tunnel = &bcm_kt_bfd_l3_tunnel_table;
    184     }
    185     bcm_kt_bfd_hw_defs[unit].mpls      = &bcm_kt_bfd_mpls_table;
    186 
    187     /*
    188      * BFD Feature Enable
    189      * lower bits will take precedence
    190      */
    191     bfd_feature_enable = soc_property_get(unit, spn_BFD_FEATURE_ENABLE, 1);
    192 
    193     if (bfd_feature_enable & BFD_MHOP_FEATURE_ENABLE) {
    194          /* Set UDP Dest port for MultiHop BFD session */
    195          BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val));
    196          soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val,
    197                            BFD_UDP_PORTM_HOPf, BFD_UDP_MULTI_HOP_DEST_PORT);
    198          BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val));
    199 
    200          bcm_kt_bfd_hw_defs[unit].bfd_feature_enable = BFD_MHOP_FEATURE_ENABLE;
    201 
    202     } else if (bfd_feature_enable &  BFD_MICRO_FEATURE_ENABLE) {
    203         /* Set UDP Dest port for Micro BFD session */
    204           BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val));
    205           soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val,
    206                             BFD_UDP_PORTM_HOPf, MICRO_BFD_DEST_PORT);
    207           BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val));
    208 
    209           bcm_kt_bfd_hw_defs[unit].bfd_feature_enable = BFD_MICRO_FEATURE_ENABLE;
    210 
    211     } else if (bfd_feature_enable & BFD_ECHO_FEATURE_ENABLE) {
    212           /* Set UDP Dest port for Echo BFD session */
    213           BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val));
    214           soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val,
    215                             BFD_UDP_PORTM_HOPf, BFD_ECHO_DEST_PORT);
    216           BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val));
    217 
    218           bcm_kt_bfd_hw_defs[unit].bfd_feature_enable = BFD_ECHO_FEATURE_ENABLE;
    219 
    220     } else if(bfd_feature_enable == 0) {
    221           /* Clear HW default values of BFD_RX_UDP_CONTROL reg */
    222           BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val));
    223           soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val,
    224                             BFD_UDP_PORT1_HOPf, 0);
    225           soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val,
    226                             BFD_UDP_PORTM_HOPf, 0);
    227           BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val));
    228 
    229           bcm_kt_bfd_hw_defs[unit].bfd_feature_enable = 0;
    230     }
    231 
    232     /* Initialize Common XGS5 BFD module */
    233     BCM_IF_ERROR_RETURN
    234         (bcmi_xgs5_bfd_init(unit, &bcm_kt_bfd_drv, &bcm_kt_bfd_hw_defs[unit]));
    235 
    236     return BCM_E_NONE;
    237 }
    238 
    239 #else   /* BCM_KATANA_SUPPORT && INCLUDE_BFD */
    240 int bcm_esw_kt_bfd_not_empty;
    241 #endif  /* BCM_KATANA_SUPPORT && INCLUDE_BFD */
    242