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


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