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