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