switch.c (29846B)
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 #include <soc/debug.h> 8 #include <soc/drv.h> 9 #include <soc/mem.h> 10 #include <bcm/switch.h> 11 #include <bcm/error.h> 12 #include <bcm_int/esw/switch.h> 13 14 /* Helper routines for argument translation */ 15 16 static int 17 _bool_invert(int unit, int arg, int set) 18 { 19 /* Same for both set/get */ 20 return !arg; 21 } 22 23 bcm_switch_binding_t apache_bindings[] = 24 { 25 { bcmSwitchL3SrcBindFailToCpu, 0, 26 CPU_CONTROL_Mr, MAC_BIND_FAILf, 27 NULL, 0}, 28 { bcmSwitchTunnelIp4IdShared, 0, 29 EGR_TUNNEL_ID_MASKr, SHARED_FRAG_ID_ENABLEf, 30 NULL, 0}, 31 { bcmSwitchL3InterfaceUrpfEnable, 0, 32 ING_CONFIG_64r, L3IIF_URPF_SELECTf, 33 NULL, soc_feature_urpf }, 34 { bcmSwitchClassBasedMoveFailPktToCpu, 0, 35 CPU_CONTROL_1r, CLASS_BASED_SM_PREVENTED_TOCPUf, 36 NULL, soc_feature_class_based_learning }, 37 { bcmSwitchL3UrpfFailToCpu, 0, 38 CPU_CONTROL_1r, URPF_MISS_TOCPUf, 39 NULL, soc_feature_urpf }, 40 { bcmSwitchClassBasedMoveFailPktDrop, 0, 41 ING_MISC_CONFIG2r, CLASS_BASED_SM_PREVENTED_DROPf, 42 NULL, soc_feature_class_based_learning }, 43 { bcmSwitchSTPBlockedFieldBypass, 0, 44 ING_MISC_CONFIG2r, BLOCKED_PORTS_FP_DISABLEf, 45 NULL, 0}, 46 { bcmSwitchRateLimitLinear, 0, 47 MISCCONFIGr, ITU_MODE_SELf, 48 _bool_invert, 0}, 49 { bcmSwitchRemoteLearnTrust, 0, 50 ING_CONFIG_64r, IGNORE_HG_HDR_DONOT_LEARNf, 51 _bool_invert, 0 }, 52 { bcmSwitchMldDirectAttachedOnly, 0, 53 ING_CONFIG_64r, MLD_CHECKS_ENABLEf, 54 NULL, soc_feature_igmp_mld_support }, 55 { bcmSwitchSharedVlanL2McastEnable, 0, 56 ING_CONFIG_64r, LOOKUP_L2MC_WITH_FID_IDf, 57 NULL, 0}, 58 { bcmSwitchMldUcastEnable, 0, 59 ING_CONFIG_64r, MLD_PKTS_UNICAST_IGNOREf, 60 _bool_invert, soc_feature_igmp_mld_support }, 61 { bcmSwitchSharedVlanEnable, 0, 62 ING_CONFIG_64r, SVL_ENABLEf, 63 NULL, 0}, 64 { bcmSwitchIgmpReservedMcastEnable, 0, 65 ING_CONFIG_64r, IPV4_RESERVED_MC_ADDR_IGMP_ENABLEf, 66 NULL, soc_feature_igmp_mld_support }, 67 { bcmSwitchMldReservedMcastEnable, 0, 68 ING_CONFIG_64r, IPV6_RESERVED_MC_ADDR_MLD_ENABLEf, 69 NULL, soc_feature_igmp_mld_support }, 70 { bcmSwitchIgmpUcastEnable, 0, 71 ING_CONFIG_64r, IGMP_PKTS_UNICAST_IGNOREf, 72 _bool_invert, soc_feature_igmp_mld_support }, 73 { bcmSwitchPortEgressBlockL3, 0, 74 ING_CONFIG_64r, APPLY_EGR_MASK_ON_L3f, 75 NULL, 0}, 76 { bcmSwitchPortEgressBlockL2, 0, 77 ING_CONFIG_64r, APPLY_EGR_MASK_ON_L2f, 78 NULL, 0}, 79 { bcmSwitchHgHdrExtLengthEnable, 0, 80 ING_CONFIG_64r, IGNORE_HG_HDR_HDR_EXT_LENf, 81 _bool_invert, 0 }, 82 { bcmSwitchIp4McastL2DestCheck, 0, 83 ING_CONFIG_64r, IPV4_MC_MACDA_CHECK_ENABLEf, 84 NULL, 0}, 85 { bcmSwitchIp6McastL2DestCheck, 0, 86 ING_CONFIG_64r, IPV6_MC_MACDA_CHECK_ENABLEf, 87 NULL, 0}, 88 { bcmSwitchL3TunnelUrpfMode, 0, 89 ING_CONFIG_64r, TUNNEL_URPF_MODEf, 90 NULL, soc_feature_urpf }, 91 { bcmSwitchL3TunnelUrpfDefaultRoute, 0, 92 ING_CONFIG_64r, TUNNEL_URPF_DEFAULTROUTECHECKf, 93 _bool_invert, soc_feature_urpf }, 94 { bcmSwitchMirrorStackMode, 0, 95 ING_CONFIG_64r, STACK_MODEf, 96 NULL, soc_feature_src_modid_blk }, 97 { bcmSwitchMirrorSrcModCheck, 0, 98 ING_CONFIG_64r, FB_A0_COMPATIBLEf, 99 NULL, soc_feature_src_modid_blk }, 100 { bcmSwitchProxySrcKnockout, 0, 101 IHG_LOOKUPr, REMOVE_MH_SRC_PORTf, 102 NULL, soc_feature_proxy_port_property }, 103 { bcmSwitchDosAttackToCpu, 0, 104 CPU_CONTROL_0r, DOSATTACK_TOCPUf, 105 NULL, 0 }, 106 { bcmSwitchParityErrorToCpu, 0, 107 CPU_CONTROL_0r, PARITY_ERR_TOCPUf, 108 NULL, soc_feature_parity_err_tocpu }, 109 { bcmSwitchUnknownVlanToCpu, 0, 110 CPU_CONTROL_0r, UVLAN_TOCPUf, 111 NULL, 0 }, 112 { bcmSwitchSourceMacZeroDrop, 0, 113 CPU_CONTROL_0r, MACSA_ALL_ZERO_DROPf, 114 NULL, 0}, 115 { bcmSwitchMplsSequenceErrToCpu, 0, 116 ING_MISC_CONFIGr, MPLS_SEQ_NUM_FAIL_TOCPUf, 117 NULL, 0}, 118 { bcmSwitchMplsLabelMissToCpu, 0, 119 CPU_CONTROL_Mr, MPLS_LABEL_MISSf, 120 NULL, 0}, 121 { bcmSwitchMplsTtlErrToCpu, 0, 122 CPU_CONTROL_Mr, MPLS_TTL_CHECK_FAILf, 123 NULL, 0}, 124 { bcmSwitchMplsInvalidL3PayloadToCpu, 0, 125 CPU_CONTROL_Mr, MPLS_INVALID_PAYLOADf, 126 NULL, 0}, 127 { bcmSwitchMplsInvalidActionToCpu, 0, 128 CPU_CONTROL_Mr, MPLS_INVALID_ACTIONf, 129 NULL, 0}, 130 { bcmSwitchSharedVlanMismatchToCpu, 0, 131 CPU_CONTROL_0r, PVLAN_VID_MISMATCH_TOCPUf , 132 NULL, 0}, 133 { bcmSwitchForceForwardFabricTrunk, 0, 134 ING_MISC_CONFIGr, LOCAL_SW_DISABLE_HGTRUNK_RES_ENf, 135 NULL, 0}, 136 { bcmSwitchFieldMultipathHashSeed, 0, 137 FP_ECMP_HASH_CONTROLr, ECMP_HASH_SALTf, 138 NULL, 0}, 139 { bcmSwitchMplsPortIndependentLowerRange1, 0, 140 GLOBAL_MPLS_RANGE_1_LOWERr, LABELf, 141 NULL, 0}, 142 { bcmSwitchMplsPortIndependentUpperRange1, 0, 143 GLOBAL_MPLS_RANGE_1_UPPERr, LABELf, 144 NULL, 0}, 145 { bcmSwitchMplsPortIndependentLowerRange2, 0, 146 GLOBAL_MPLS_RANGE_2_LOWERr, LABELf, 147 NULL, 0}, 148 { bcmSwitchMplsPortIndependentUpperRange2, 0, 149 GLOBAL_MPLS_RANGE_2_UPPERr, LABELf, 150 NULL, 0}, 151 { bcmSwitchL3UrpfRouteEnableExternal, 0, 152 L3_DEFIP_RPF_CONTROLr, DEFIP_RPF_ENABLEf, 153 NULL, soc_feature_urpf}, 154 { bcmSwitchMplsPWControlWordToCpu, 0, 155 ING_MISC_CONFIGr, PWACH_TOCPUf, 156 NULL, soc_feature_mpls}, 157 { bcmSwitchCpuToCpuEnable, 0, 158 ING_MISC_CONFIGr, DO_NOT_COPY_FROM_CPU_TO_CPUf, 159 _bool_invert, 0 }, 160 { bcmSwitchL3UrpfRouteEnable, 0, 161 L3_DEFIP_RPF_CONTROLr, DEFIP_RPF_ENABLEf, 162 NULL, soc_feature_urpf}, 163 { bcmSwitchBpduInvalidVlanDrop, 0, 164 EGR_CONFIG_1r, BPDU_INVALID_VLAN_DROPf, 165 NULL, soc_feature_igmp_mld_support }, 166 { bcmSwitchMirrorInvalidVlanDrop, 0, 167 EGR_CONFIG_1r, MIRROR_INVALID_VLAN_DROPf, 168 NULL, soc_feature_igmp_mld_support }, 169 { bcmSwitchMcastFloodBlocking, 0, 170 IGMP_MLD_PKT_CONTROLr, PFM_RULE_APPLYf, 171 NULL, soc_feature_igmp_mld_support }, 172 { bcmSwitchIpmcTtl1ToCpu, 0, 173 CPU_CONTROL_1r, IPMC_TTL1_ERR_TOCPUf, 174 NULL, 0 }, 175 { bcmSwitchL3UcastTtl1ToCpu, 0, 176 CPU_CONTROL_1r, L3UC_TTL1_ERR_TOCPUf, 177 NULL, 0 }, 178 { bcmSwitchDhcpLearn, 0, 179 ING_MISC_CONFIG2r, DO_NOT_LEARN_DHCPf, 180 NULL, 0 }, 181 { bcmSwitchUnknownIpmcAsMcast, 0, 182 ING_MISC_CONFIG2r, IPMC_MISS_AS_L2MCf, 183 NULL, 0 }, 184 { bcmSwitchTunnelUnknownIpmcDrop, 0, 185 ING_MISC_CONFIG2r, UNKNOWN_TUNNEL_IPMC_DROPf, 186 NULL, 0 }, 187 { bcmSwitchMcastUnknownErrToCpu, 0, 188 CPU_CONTROL_1r, MC_INDEX_ERROR_TOCPUf, 189 NULL,0}, 190 { bcmSwitchDosAttackMACSAEqualMACDA, 0 , 191 DOS_CONTROLr, MACSA_EQUALS_MACDA_DROPf, 192 NULL, soc_feature_enhanced_dos_ctrl }, 193 { bcmSwitchDosAttackFlagZeroSeqZero, 0, 194 DOS_CONTROLr, TCP_FLAGS_CTRL0_SEQ0_ENABLEf, 195 NULL, 0 }, 196 { bcmSwitchDosAttackSynFrag, 0 , 197 DOS_CONTROLr, TCP_FLAGS_SYN_FRAG_ENABLEf, 198 NULL, 0}, 199 { bcmSwitchDosAttackIcmp, 0 , 200 DOS_CONTROL_2r, ICMP_V4_PING_SIZE_ENABLEf, 201 NULL, 0 }, 202 { bcmSwitchDosAttackIcmp, 0 , 203 DOS_CONTROL_2r, ICMP_V6_PING_SIZE_ENABLEf, 204 NULL, 0 }, 205 { bcmSwitchDosAttackIcmpV4, 0 , 206 DOS_CONTROL_2r, ICMP_V4_PING_SIZE_ENABLEf, 207 NULL, 0 }, 208 { bcmSwitchDosAttackIcmpV6, 0 , 209 DOS_CONTROL_2r, ICMP_V6_PING_SIZE_ENABLEf, 210 NULL, 0 }, 211 { bcmSwitchDosAttackIcmpFragments, 0 , 212 DOS_CONTROL_2r, ICMP_FRAG_PKTS_ENABLEf, 213 NULL, soc_feature_enhanced_dos_ctrl }, 214 { bcmSwitchDosAttackTcpOffset, 0 , 215 DOS_CONTROL_2r, TCP_HDR_OFFSET_EQ1_ENABLEf, 216 NULL, soc_feature_enhanced_dos_ctrl }, 217 { bcmSwitchDosAttackUdpPortsEqual, 0 , 218 DOS_CONTROL_2r, UDP_SPORT_EQ_DPORT_ENABLEf, 219 NULL, soc_feature_enhanced_dos_ctrl }, 220 { bcmSwitchDosAttackTcpPortsEqual, 0 , 221 DOS_CONTROL_2r, TCP_SPORT_EQ_DPORT_ENABLEf, 222 NULL, soc_feature_enhanced_dos_ctrl }, 223 { bcmSwitchDosAttackTcpFlagsSF, 0 , 224 DOS_CONTROL_2r, TCP_FLAGS_SYN_FIN_ENABLEf, 225 NULL, soc_feature_enhanced_dos_ctrl }, 226 { bcmSwitchDosAttackTcpFlagsFUP, 0 , 227 DOS_CONTROL_2r, TCP_FLAGS_FIN_URG_PSH_SEQ0_ENABLEf, 228 NULL, soc_feature_enhanced_dos_ctrl }, 229 { bcmSwitchDosAttackTcpHdrPartial, 0 , 230 DOS_CONTROL_2r, TCP_HDR_PARTIAL_ENABLEf, 231 NULL, soc_feature_enhanced_dos_ctrl }, 232 { bcmSwitchDosAttackV6MinFragEnable, 0 , 233 DOS_CONTROL_2r, IPV6_MIN_FRAG_SIZE_ENABLEf, 234 NULL, soc_feature_enhanced_dos_ctrl }, 235 { bcmSwitchDosAttackV6MinFragSize, 0 , 236 IPV6_MIN_FRAG_SIZEr, PKT_LENGTHf, 237 NULL, soc_feature_enhanced_dos_ctrl }, 238 { bcmSwitchDosAttackIcmpPktOversize, 0, 239 DOS_CONTROL_3r, BIG_ICMP_PKT_SIZEf, 240 NULL, 0 }, 241 { bcmSwitchDosAttackIcmpV6PingSize, 0, 242 DOS_CONTROL_3r, BIG_ICMPV6_PKT_SIZEf, 243 NULL, soc_feature_big_icmpv6_ping_check }, 244 { bcmSwitchDosAttackMinTcpHdrSize, 0, 245 DOS_CONTROL_3r, MIN_TCPHDR_SIZEf, 246 NULL, 0 }, 247 { bcmSwitchHashNivSrcIfEtagSvidSelect0, 0, 248 RTAG7_HASH_CONTROL_2_64r, RTAG7_HASH_BIN_0_SELECT_Af, 249 NULL, 0 }, 250 { bcmSwitchHashNivSrcIfEtagSvidSelect1, 0, 251 RTAG7_HASH_CONTROL_2_64r, RTAG7_HASH_BIN_0_SELECT_Bf, 252 NULL, 0 }, 253 { bcmSwitchHashNivDstIfEtagVidSelect0, 0, 254 RTAG7_HASH_CONTROL_2_64r, RTAG7_HASH_BIN_1_SELECT_Af, 255 NULL, 0 }, 256 { bcmSwitchHashNivDstIfEtagVidSelect1, 0, 257 RTAG7_HASH_CONTROL_2_64r, RTAG7_HASH_BIN_1_SELECT_Bf, 258 NULL, 0 }, 259 { bcmSwitchMirrorUnmarked, 0, 260 EGR_CONFIG_1r, RING_MODEf, 261 _bool_invert, 0 }, 262 { bcmSwitchMeterAdjust, 0, 263 MTRI_IFGr, PACKET_IFG_BYTESf, 264 NULL, soc_feature_meter_adjust }, 265 { bcmSwitchEgressBlockUcast, 0, 266 ING_MISC_CONFIGr, APPLY_EGR_MASK_ON_UC_ONLYf, 267 NULL, soc_feature_egress_blk_ucast_override }, 268 { bcmSwitchSourceModBlockUcast, 0, 269 ING_MISC_CONFIGr, APPLY_SRCMOD_BLOCK_ON_UC_ONLYf, 270 NULL, soc_feature_src_modid_blk_ucast_override }, 271 { bcmSwitchHgHdrMcastFloodOverride, 0, 272 EGR_CONFIG_1r, FORCE_STATIC_MH_PFMf, 273 NULL, soc_feature_static_pfm }, 274 { bcmSwitchShaperAdjust, 0, 275 MTRI_IFGr, PACKET_IFG_BYTESf, 276 NULL, soc_feature_meter_adjust }, 277 { bcmSwitchHgHdrErrToCpu,0 , 278 CPU_CONTROL_1r, HG_HDR_ERROR_TOCPUf, 279 NULL, soc_feature_cpu_proto_prio}, 280 { bcmSwitchClassTagPacketsToCpu, 0, 281 CPU_CONTROL_1r, HG_HDR_TYPE1_TOCPUf, 282 NULL, soc_feature_cpu_proto_prio}, 283 { bcmSwitchRemoteLearnTrust, 0 , 284 EGR_CONFIG_1r, IGNORE_HG_HDR_DONOT_LEARNf, 285 _bool_invert, 0 }, 286 { bcmSwitchSourceModBlockControlOpcode, 0 , 287 ING_MISC_CONFIGr, DO_NOT_APPLY_SRCMOD_BLOCK_ON_SCf, 288 _bool_invert, soc_feature_src_modid_blk_opcode_override }, 289 { bcmSwitchUnknownMcastToCpu, 0 , 290 CPU_CONTROL_1r, UMC_TOCPUf, 291 NULL, 0 }, 292 { bcmSwitchUnknownUcastToCpu, 0 , 293 CPU_CONTROL_1r, UUCAST_TOCPUf, 294 NULL, 0 }, 295 { bcmSwitchL2StaticMoveToCpu, 0 , 296 CPU_CONTROL_1r, STATICMOVE_TOCPUf, 297 NULL, 0 }, 298 { bcmSwitchL3HeaderErrToCpu, 0 , /* compat */ 299 CPU_CONTROL_1r, V4L3ERR_TOCPUf, 300 NULL, 0 }, 301 { bcmSwitchUnknownL3DestToCpu, 0 , /* compat */ 302 CPU_CONTROL_1r, V4L3DSTMISS_TOCPUf, 303 NULL, 0 }, 304 { bcmSwitchIpmcPortMissToCpu, 0 , 305 CPU_CONTROL_1r, IPMCPORTMISS_TOCPUf, 306 NULL, 0 }, 307 { bcmSwitchIpmcErrorToCpu, 0 , 308 CPU_CONTROL_1r, IPMCERR_TOCPUf, 309 NULL, 0 }, 310 { bcmSwitchL2NonStaticMoveToCpu, 0 , 311 CPU_CONTROL_1r, NONSTATICMOVE_TOCPUf, 312 NULL, 0 }, 313 { bcmSwitchV6L3ErrToCpu, 0 , 314 CPU_CONTROL_1r, V6L3ERR_TOCPUf, 315 NULL, 0 }, 316 { bcmSwitchV6L3DstMissToCpu, 0 , 317 CPU_CONTROL_1r, V6L3DSTMISS_TOCPUf, 318 NULL, 0 }, 319 { bcmSwitchV4L3ErrToCpu, 0 , 320 CPU_CONTROL_1r, V4L3ERR_TOCPUf, 321 NULL, 0 }, 322 { bcmSwitchV4L3DstMissToCpu, 0 , 323 CPU_CONTROL_1r, V4L3DSTMISS_TOCPUf, 324 NULL, 0 }, 325 { bcmSwitchTunnelErrToCpu, 0 , 326 CPU_CONTROL_1r, TUNNEL_ERR_TOCPUf, 327 NULL, 0 }, 328 { bcmSwitchMartianAddrToCpu, 0 , 329 CPU_CONTROL_1r, MARTIAN_ADDR_TOCPUf, 330 NULL, 0 }, 331 { bcmSwitchL3UcTtlErrToCpu, 0 , 332 CPU_CONTROL_1r, L3UC_TTL_ERR_TOCPUf, 333 NULL, 0 }, 334 { bcmSwitchL3SlowpathToCpu, 0 , 335 CPU_CONTROL_1r, L3_SLOWPATH_TOCPUf, 336 NULL, 0 }, 337 { bcmSwitchIpmcTtlErrToCpu, 0 , 338 CPU_CONTROL_1r, IPMC_TTL_ERR_TOCPUf, 339 NULL, 0 }, 340 { bcmSwitchSampleIngressRandomSeed, 0 , 341 SFLOW_ING_RAND_SEEDr, SEEDf, 342 NULL, 0 }, 343 { bcmSwitchSampleEgressRandomSeed, 0 , 344 SFLOW_EGR_RAND_SEEDr, SEEDf, 345 NULL, 0 }, 346 { bcmSwitchArpReplyToCpu, 0 , 347 PROTOCOL_PKT_CONTROLr, ARP_REPLY_TO_CPUf, 348 NULL, 0 }, 349 { bcmSwitchArpReplyDrop, 0 , 350 PROTOCOL_PKT_CONTROLr, ARP_REPLY_DROPf, 351 NULL, 0 }, 352 { bcmSwitchArpRequestToCpu, 0 , 353 PROTOCOL_PKT_CONTROLr, ARP_REQUEST_TO_CPUf, 354 NULL, 0 }, 355 { bcmSwitchArpRequestDrop, 0 , 356 PROTOCOL_PKT_CONTROLr, ARP_REQUEST_DROPf, 357 NULL, 0 }, 358 { bcmSwitchNdPktToCpu, 0, 359 PROTOCOL_PKT_CONTROLr, ND_PKT_TO_CPUf, 360 NULL, 0 }, 361 { bcmSwitchNdPktDrop, 0, 362 PROTOCOL_PKT_CONTROLr, ND_PKT_DROPf, 363 NULL, 0 }, 364 { bcmSwitchDhcpPktToCpu, 0, 365 PROTOCOL_PKT_CONTROLr, DHCP_PKT_TO_CPUf, 366 NULL, 0 }, 367 { bcmSwitchDhcpPktDrop, 0, 368 PROTOCOL_PKT_CONTROLr, DHCP_PKT_DROPf, 369 NULL, 0 }, 370 { bcmSwitchDosAttackSipEqualDip,0, 371 DOS_CONTROLr, DROP_IF_SIP_EQUALS_DIPf, 372 NULL, 0 }, 373 { bcmSwitchDosAttackV4FirstFrag, 0, 374 DOS_CONTROLr, IPV4_FIRST_FRAG_CHECK_ENABLEf, 375 NULL, 0 }, 376 { bcmSwitchNonIpL3ErrToCpu, 0, 377 CPU_CONTROL_1r, NIP_L3ERR_TOCPUf, 378 NULL, soc_feature_nip_l3_err_tocpu }, 379 { bcmSwitchSourceRouteToCpu, 0, 380 CPU_CONTROL_1r, SRCROUTE_TOCPUf, 381 NULL, 0 }, 382 { bcmSwitchL3MtuFailToCpu,0 , 383 CPU_CONTROL_1r, L3_MTU_FAIL_TOCPUf, 384 NULL, soc_feature_l3mtu_fail_tocpu }, 385 { bcmSwitchIpmcSameVlanL3Route, 0, 386 EGR_CONFIG_1r, IPMC_ROUTE_SAME_VLANf, 387 NULL, soc_feature_l3}, 388 { bcmSwitchIpmcSameVlanPruning, 0, 389 ING_MISC_CONFIGr, IPMC_IND_MODEf, 390 _bool_invert, 0 }, 391 { bcmSwitchPrioDropToCpu, 0, 392 CPU_CONTROL_0r, DOT1P_ADMITTANCE_DROP_TOCPUf, 393 NULL, soc_feature_niv}, 394 { bcmSwitchNivPrioDropToCpu, 0, 395 CPU_CONTROL_0r, DOT1P_ADMITTANCE_DROP_TOCPUf, 396 NULL, soc_feature_niv}, 397 { bcmSwitchNivInterfaceMissToCpu, 0, 398 CPU_CONTROL_0r, NIV_FORWARDING_DROP_TOCPUf, 399 NULL, soc_feature_niv}, 400 { bcmSwitchNivRpfFailToCpu, 0, 401 CPU_CONTROL_0r, NIV_RPF_CHECK_FAIL_TOCPUf, 402 NULL, soc_feature_niv}, 403 { bcmSwitchNivTagInvalidToCpu, 0, 404 CPU_CONTROL_0r, VNTAG_FORMAT_DROP_TOCPUf, 405 NULL, soc_feature_niv}, 406 { bcmSwitchNivTagDropToCpu, 0, 407 CPU_CONTROL_0r, DISCARD_VNTAG_PRESENT_TOCPUf, 408 NULL, soc_feature_niv}, 409 { bcmSwitchNivUntagDropToCpu, 0, 410 CPU_CONTROL_0r, DISCARD_VNTAG_NOT_PRESENT_TOCPUf, 411 NULL, soc_feature_niv}, 412 { bcmSwitchTrillTtlErrToCpu, 0, 413 CPU_CONTROL_0r, TRILL_HOPCOUNT_CHECK_FAIL_TOCPUf, 414 NULL, soc_feature_trill}, 415 { bcmSwitchTrillHeaderErrToCpu, 0, 416 CPU_CONTROL_0r, TRILL_ERROR_FRAMES_TOCPUf, 417 NULL, soc_feature_trill}, 418 { bcmSwitchTrillMismatchToCpu, 0, 419 CPU_CONTROL_0r, TRILL_UNEXPECTED_FRAMES_TOCPUf, 420 NULL, soc_feature_trill}, 421 { bcmSwitchTrillNameMissToCpu, 0, 422 CPU_CONTROL_0r, TRILL_RBRIDGE_LOOKUP_MISS_TOCPUf, 423 NULL, soc_feature_trill}, 424 { bcmSwitchTrillRpfFailToCpu, 0, 425 CPU_CONTROL_0r, TRILL_RPF_CHECK_FAIL_TOCPUf, 426 NULL, soc_feature_trill}, 427 { bcmSwitchTrillOptionsToCpu, 0, 428 CPU_CONTROL_0r, TRILL_OPTIONS_TOCPUf, 429 NULL, soc_feature_trill}, 430 { bcmSwitchTrillNameErrDrop, 0, 431 TRILL_DROP_CONTROLr, INGRESS_RBRIDGE_EQ_EGRESS_RBRIDGE_DROPf, 432 NULL, soc_feature_trill}, 433 { bcmSwitchTrillHeaderVersionErrDrop, 0, 434 TRILL_DROP_CONTROLr, TRILL_HDR_VERSION_NON_ZERO_DROPf, 435 NULL, soc_feature_trill}, 436 { bcmSwitchTrillNameMissDrop, 0, 437 TRILL_DROP_CONTROLr, UNKNOWN_INGRESS_RBRIDGE_DROPf, 438 NULL, soc_feature_trill}, 439 { bcmSwitchTrillAdjacencyFailDrop, 0, 440 TRILL_DROP_CONTROLr, TRILL_ADJACENCY_FAIL_DROPf, 441 NULL, soc_feature_trill}, 442 { bcmSwitchTrillHeaderErrDrop, 0, 443 TRILL_DROP_CONTROLr, UC_TRILL_HDR_MC_MACDA_DROPf, 444 NULL, soc_feature_trill}, 445 { bcmSwitchTrillRpfFailDrop, 0, 446 TRILL_DROP_CONTROLr, RPF_CHECK_FAIL_DROPf, 447 NULL, soc_feature_trill}, 448 { bcmSwitchIngParseL2TunnelTermDipSipSelect, 0, 449 ING_L2_TUNNEL_PARSE_CONTROLr, IFP_L2_TUNNEL_PAYLOAD_FIELD_SELf , 450 NULL, 0}, 451 { bcmSwitchIngParseL3L4IPv4, 0, 452 ING_L2_TUNNEL_PARSE_CONTROLr, IGMP_ENABLEf , 453 NULL, 0}, 454 { bcmSwitchIngParseL3L4IPv6, 0, 455 ING_L2_TUNNEL_PARSE_CONTROLr, MLD_ENABLEf , 456 NULL, 0}, 457 { bcmSwitchV6L3LocalLinkDrop, 0, 458 ING_MISC_CONFIG2r, IPV6_SIP_LINK_LOCAL_DROPf, 459 NULL, 0}, 460 { bcmSwitchMplsGalAlertLabelToCpu, 0, 461 CPU_CONTROL_Mr, MPLS_GAL_EXPOSED_TO_CPUf, 462 NULL, 0}, 463 { bcmSwitchMplsRalAlertLabelToCpu, 0, 464 CPU_CONTROL_Mr, MPLS_RAL_EXPOSED_TO_CPUf, 465 NULL, 0}, 466 { bcmSwitchMplsIllegalReservedLabelToCpu, 0, 467 CPU_CONTROL_Mr, MPLS_ILLEGAL_RSVD_LABEL_TO_CPUf, 468 NULL, 0}, 469 { bcmSwitchMplsUnknownAchTypeToCpu, 0, 470 CPU_CONTROL_Mr, MPLS_UNKNOWN_ACH_TYPE_TO_CPUf, 471 NULL, 0}, 472 { bcmSwitchMplsUnknownAchVersionToCpu, 0, 473 CPU_CONTROL_Mr, MPLS_UNKNOWN_ACH_VERSION_TOCPUf, 474 NULL, 0}, 475 { bcmSwitchFailoverDropToCpu, 0, 476 CPU_CONTROL_1r, PROTECTION_DATA_DROP_TOCPUf, 477 NULL, 0}, 478 { bcmSwitchL3SrcBindMissToCpu, 0, 479 CPU_CONTROL_Mr, MAC_IP_BIND_LOOKUP_MISS_TOCPUf, 480 NULL, 0}, 481 { bcmSwitchL3SrcBindMissToCpu, 0, 482 CPU_CONTROL_Mr, MAC_IP_BIND_LOOKUP_MISS_TOCPUf, 483 NULL, 0}, 484 { bcmSwitchMplsLookupsExceededToCpu, 0, 485 CPU_CONTROL_Mr, MPLS_OUT_OF_LOOKUPS_TOCPUf, 486 NULL, 0}, 487 { bcmSwitchTimesyncUnknownVersionToCpu,0, 488 CPU_CONTROL_Mr, UNKNOWN_1588_VERSION_TO_CPUf, 489 NULL, 0}, 490 { bcmSwitchTimesyncIngressVersion, 0, 491 ING_1588_PARSING_CONTROLr, VERSION_CONTROLf, 492 NULL, 0}, 493 { bcmSwitchTimesyncEgressVersion, 0, 494 EGR_1588_PARSING_CONTROLr, VERSION_CONTROLf, 495 NULL, 0}, 496 { bcmSwitchCongestionCnmToCpu, 0, 497 IE2E_CONTROLr, ICNM_TO_CPUf, 498 NULL, 0}, 499 { bcmSwtichCongestionCnmProxyErrorToCpu, 0, 500 ING_MISC_CONFIGr, QCN_CNM_PRP_DLF_TO_CPUf, 501 NULL, 0}, 502 { bcmSwtichCongestionCnmProxyToCpu, 0, 503 ING_MISC_CONFIGr, QCN_CNM_PRP_TO_CPUf, 504 NULL, 0}, 505 { bcmSwitchL2GreTunnelMissToCpu, 0, 506 CPU_CONTROL_Mr, L2GRE_SIP_LOOKUP_FAIL_COPY_TOCPUf, 507 NULL, 0}, 508 { bcmSwitchL2GreVpnIdMissToCpu, 0, 509 CPU_CONTROL_Mr, L2GRE_VPNID_LOOKUP_FAIL_COPY_TOCPUf, 510 NULL, 0}, 511 { bcmSwitchRemoteProtectionTrust, 0, 512 ING_CONFIG_64r, USE_PROT_STATUSf, 513 NULL, 0}, 514 { bcmSwitchVxlanTunnelMissToCpu, 0, 515 CPU_CONTROL_Mr, VXLAN_SIP_LOOKUP_FAIL_COPY_TOCPUf, 516 NULL, 0}, 517 { bcmSwitchVxlanVnIdMissToCpu, 0, 518 CPU_CONTROL_Mr, VXLAN_VN_ID_LOOKUP_FAIL_COPY_TOCPUf, 519 NULL, 0}, 520 { bcmSwitchHashL2GreKeyMask0, 0, 521 RTAG7_HASH_CONTROL_L2GRE_MASK_Ar, L2GRE_TUNNEL_GRE_KEY_MASK_Af, 522 NULL, soc_feature_l2gre}, 523 { bcmSwitchHashL2GreKeyMask1, 0, 524 RTAG7_HASH_CONTROL_L2GRE_MASK_Br, L2GRE_TUNNEL_GRE_KEY_MASK_Bf, 525 NULL, soc_feature_l2gre}, 526 { bcmSwitchRemoteProtectionEnable, 0, 527 EGR_HG_HDR_PROT_STATUS_TX_CONTROLr, SET_PROT_STATUSf, 528 NULL, 0}, 529 { bcmSwitchL3NATEnable, 0, 530 ING_CONFIG_64r, NAT_ENABLEf, 531 NULL, 0}, 532 { bcmSwitchL3DNATHairpinToCpu, 0, 533 CPU_CONTROL_Mr, DNAT_HAIRPIN_COPY_TOCPUf, 534 NULL, 0}, 535 { bcmSwitchL3DNATMissToCpu, 0, 536 CPU_CONTROL_Mr, DNAT_MISS_COPY_TOCPUf, 537 NULL, 0}, 538 { bcmSwitchL3SNATMissToCpu, 0, 539 CPU_CONTROL_Mr, SNAT_MISS_COPY_TOCPUf, 540 NULL, 0}, 541 { bcmSwitchL3NatOtherToCpu, 0, 542 CPU_CONTROL_Mr, NAT_OTHER_COPY_TOCPUf, 543 NULL, 0}, 544 { bcmSwitchL3NatRealmCrossingIcmpToCpu, 0, 545 CPU_CONTROL_Mr, NAT_REALM_CROSSING_ICMP_COPY_TOCPUf, 546 NULL, 0}, 547 { bcmSwitchL3NatFragmentsToCpu, 0, 548 CPU_CONTROL_Mr, NAT_FRAGMENTS_COPY_TOCPUf, 549 NULL, 0}, 550 { bcmSwitchExtenderInterfaceMissToCpu, 0, 551 CPU_CONTROL_0r, NIV_FORWARDING_DROP_TOCPUf, 552 NULL, soc_feature_port_extension}, 553 { bcmSwitchExtenderRpfFailToCpu, 0, 554 CPU_CONTROL_0r, NIV_RPF_CHECK_FAIL_TOCPUf, 555 NULL, soc_feature_port_extension}, 556 { bcmSwitchEtagInvalidToCpu, 0, 557 CPU_CONTROL_0r, VNTAG_FORMAT_DROP_TOCPUf, 558 NULL, soc_feature_port_extension}, 559 { bcmSwitchEtagDropToCpu, 0, 560 CPU_CONTROL_0r, DISCARD_VNTAG_PRESENT_TOCPUf, 561 NULL, soc_feature_port_extension}, 562 { bcmSwitchNonEtagDropToCpu, 0, 563 CPU_CONTROL_0r, DISCARD_VNTAG_NOT_PRESENT_TOCPUf, 564 NULL, soc_feature_port_extension}, 565 { bcmSwitchHashUseL2GreTunnelGreKey0, 0, 566 RTAG7_HASH_CONTROL_2_64r, L2GRE_TUNNEL_USE_GRE_KEY_Af, 567 NULL, soc_feature_l2gre}, 568 { bcmSwitchHashUseL2GreTunnelGreKey1, 0, 569 RTAG7_HASH_CONTROL_2_64r, L2GRE_TUNNEL_USE_GRE_KEY_Bf, 570 NULL, soc_feature_l2gre}, 571 { bcmSwitchHashL2GrePayloadSelect0, 0, 572 RTAG7_HASH_CONTROL_2_64r, L2GRE_PAYLOAD_HASH_SELECT_Af, 573 NULL, soc_feature_l2gre}, 574 { bcmSwitchHashL2GrePayloadSelect1, 0, 575 RTAG7_HASH_CONTROL_2_64r, L2GRE_PAYLOAD_HASH_SELECT_Bf, 576 NULL, soc_feature_l2gre}, 577 { bcmSwitchHashL2GreNetworkPortPayloadDisable0, 0, 578 RTAG7_HASH_CONTROL_2_64r, DISABLE_HASH_L2GRE_Af, 579 NULL, soc_feature_l2gre}, 580 { bcmSwitchHashL2GreNetworkPortPayloadDisable1, 0, 581 RTAG7_HASH_CONTROL_2_64r, DISABLE_HASH_L2GRE_Bf, 582 NULL, soc_feature_l2gre}, 583 { bcmSwitchHashUseFlowSelTrunkUc , 0, 584 RTAG7_HASH_SELr, USE_FLOW_SEL_TRUNK_UCf, 585 NULL, 0}, 586 { bcmSwitchMcQueueSchedMode, 0, 587 HSP_SCHED_PORT_CONFIGr, MC_GROUP_MODEf, 588 NULL, 0}, 589 { bcmSwitchHashField0Ip6FlowLabel, 0, 590 RTAG7_HASH_CONTROL_2_64r, ENABLE_FLOW_LABEL_IPV6_Af, 591 NULL, 0}, 592 { bcmSwitchHashField1Ip6FlowLabel, 0, 593 RTAG7_HASH_CONTROL_2_64r, ENABLE_FLOW_LABEL_IPV6_Bf, 594 NULL, 0}, 595 { bcmSwitchMacroFlowHashUseMSB, 0, 596 RTAG7_HASH_CONTROL_2_64r, MACRO_FLOW_HASH_BYTE_SELf, 597 NULL, 0}, 598 { bcmSwitchHashHg2PktFieldsEnable, 0, 599 RTAG7_HASH_CONTROL_2_64r, TREAT_PPD2_AS_KNOWN_PPDf, 600 NULL, 0}, 601 { bcmSwitchHashField0OverlayCntagRpidEnable, 0, 602 RTAG7_HASH_CONTROL_2_64r, ENABLE_BIN_12_OVERLAY_Af, 603 NULL, 0}, 604 { bcmSwitchMimPayloadTpidEnable, 0, 605 RTAG7_HASH_CONTROL_2_64r, MIM_PAYLOAD_TPID_ENABLEf, 606 NULL, soc_feature_mim}, 607 { bcmSwitchHashMimUseTunnelHeader0, 0, 608 RTAG7_HASH_CONTROL_2_64r, DISABLE_HASH_MIM_INNER_L2_Af, 609 NULL, soc_feature_mim}, 610 { bcmSwitchHashMimUseTunnelHeader1, 0, 611 RTAG7_HASH_CONTROL_2_64r, DISABLE_HASH_MIM_INNER_L2_Bf, 612 NULL, soc_feature_mim}, 613 { bcmSwitchHashField1OverlayCntagRpidEnable, 0, 614 RTAG7_HASH_CONTROL_2_64r, ENABLE_BIN_12_OVERLAY_Bf, 615 NULL, 0}, 616 { bcmSwitchHashMPLSUseLabelStack, 0, 617 RTAG7_HASH_CONTROL_2_64r, USE_MPLS_STACK_FOR_HASHINGf, 618 NULL, 0}, 619 { bcmSwitchHashMPLSExcludeGAL, 0, 620 RTAG7_HASH_CONTROL_2_64r, EXCLUDE_RESERVED_LABELS_FROM_MPLS_HASHf, 621 NULL, 0}, 622 { bcmSwitchHashUseFlowSelEcmp, 0, 623 RTAG7_HASH_SELr, USE_FLOW_SEL_ECMPf, 624 NULL, 0}, 625 { bcmSwitchEcmpMacroFlowHashEnable, 0, 626 RTAG7_HASH_SELr, USE_FLOW_SEL_ECMPf, 627 NULL, 0}, 628 { bcmSwitchSTPDisabledFieldBypass, 0, 629 ING_MISC_CONFIG2r, DISABLED_PORTS_FP_DISABLEf, 630 NULL, 0}, 631 { bcmSwitchV6L3SrcDstLocalLinkDropCancel, 0, 632 ING_MISC_CONFIG2r, IPV6_SIP_AND_DIP_LINK_LOCAL_DO_NOT_DROPf, 633 NULL, 0}, 634 { bcmSwitchHashUseFlowSelMplsEcmp, 0, 635 RTAG7_HASH_SELr, USE_FLOW_SEL_MPLS_ECMPf, 636 NULL, 0}, 637 { bcmSwitchMplsReservedEntropyLabelToCpu, 0, 638 CPU_CONTROL_Mr, RESERVED_ENTROPY_LABEL_TOCPUf, 639 NULL, 0}, 640 { bcmSwitchHashUseFlowSelTrunkNonUnicast, 0, 641 RTAG7_HASH_SELr, USE_FLOW_SEL_TRUNK_NONUCf, 642 NULL, 0}, 643 { bcmSwitchHashUseFlowSelHigigTrunkUnicast, 0, 644 RTAG7_HASH_SELr, USE_FLOW_SEL_HG_TRUNK_UCf, 645 NULL, 0}, 646 { bcmSwitchHashUseFlowSelHigigTrunkNonUnicast, 0, 647 RTAG7_HASH_SELr, USE_FLOW_SEL_HG_TRUNK_NONUCf, 648 NULL, 0}, 649 { bcmSwitchHashUseFlowSelHigigTrunkFailover, 0, 650 RTAG7_HASH_SELr, USE_FLOW_SEL_HG_TRUNK_FAILOVERf, 651 NULL, 0}, 652 { bcmSwitchHashUseFlowSelLbidUnicast, 0, 653 RTAG7_HASH_SELr, USE_FLOW_SEL_LBID_UCf, 654 NULL, 0}, 655 { bcmSwitchHashUseFlowSelLbidNonUnicast, 0, 656 RTAG7_HASH_SELr, USE_FLOW_SEL_LBID_NONUCf, 657 NULL, 0}, 658 { bcmSwitchHashUseFlowSelEntropy, 0, 659 RTAG7_HASH_SELr, USE_FLOW_SEL_ENTROPY_LABELf, 660 NULL, 0} 661 }; 662 663 int 664 _bcm_apache_switch_control_port_binding_set(int unit, 665 bcm_port_t port, 666 bcm_switch_control_t type, 667 int arg, int *found) 668 { 669 uint64 oval64, val64; 670 int i; 671 bcm_switch_binding_t *b; 672 uint32 max; 673 int fval, fwidth, prt, idx; 674 port_tab_entry_t pent; 675 676 *found = 0; 677 for (i = 0; i < COUNTOF(apache_bindings); i++) { 678 b = &apache_bindings[i]; 679 if (b->type == type) { 680 /* We don't check the b->chip here since the table is specific for apache*/ 681 if (b->feature && !soc_feature(unit, b->feature)) { 682 continue; 683 } 684 if (b->xlate_arg) { 685 if ((fval = (b->xlate_arg)(unit, arg, 1)) < 0) { 686 return fval; 687 } 688 } else { 689 fval = arg; 690 } 691 /* Negative values should be treated as errors */ 692 if (fval < 0) { 693 return BCM_E_PARAM; 694 } 695 if (SOC_REG_INFO(unit, b->reg).regtype == soc_portreg) { 696 prt = port; 697 idx = 0; 698 } else { 699 if ((b->reg == PROTOCOL_PKT_CONTROLr) || 700 (b->reg == IGMP_MLD_PKT_CONTROLr)) { 701 if (IS_CPU_PORT(unit,port)) { 702 port = SOC_INFO(unit).cpu_hg_index; 703 } 704 BCM_IF_ERROR_RETURN 705 (soc_mem_read(unit, PORT_TABm, MEM_BLOCK_ANY, port, &pent)); 706 idx = soc_mem_field32_get(unit, PORT_TABm, &pent, 707 PROTOCOL_PKT_INDEXf); 708 prt = REG_PORT_ANY; 709 } else { 710 prt = REG_PORT_ANY; 711 idx = 0; 712 } 713 } 714 715 fwidth = soc_reg_field_length(unit, b->reg, b->field); 716 if (fwidth < 32) { 717 max = (1 << fwidth) - 1; 718 } else { 719 max = -1; 720 } 721 SOC_IF_ERROR_RETURN(soc_reg_get(unit, b->reg, prt, idx, &val64)); 722 oval64 = val64; 723 soc_reg64_field32_set(unit, b->reg, &val64, b->field, 724 ((uint32)fval > max) ? max : (uint32)fval); 725 if (COMPILER_64_NE(val64, oval64)) { 726 SOC_IF_ERROR_RETURN(soc_reg_set(unit, b->reg, prt, idx, val64)); 727 } 728 729 *found = 1; 730 } 731 } 732 return BCM_E_NONE; 733 } 734 735 736 737 int 738 _bcm_apache_switch_control_port_binding_get(int unit, 739 bcm_port_t port, 740 bcm_switch_control_t type, 741 int *arg, int *found) 742 { 743 uint64 val64; 744 int i; 745 bcm_switch_binding_t *b; 746 int prt, idx; 747 port_tab_entry_t pent; 748 749 *found = 0; 750 751 for (i = 0; i < COUNTOF(apache_bindings); i++) { 752 b = &apache_bindings[i]; 753 if (b->type == type) { 754 if (b->feature && !soc_feature(unit, b->feature)) { 755 continue; 756 } 757 if (SOC_REG_INFO(unit, b->reg).regtype == soc_portreg) { 758 prt = port; 759 idx = 0; 760 } else { 761 if ((b->reg == PROTOCOL_PKT_CONTROLr) || 762 (b->reg == IGMP_MLD_PKT_CONTROLr)) { 763 if (IS_CPU_PORT(unit,port)) { 764 port = SOC_INFO(unit).cpu_hg_index; 765 } 766 BCM_IF_ERROR_RETURN 767 (soc_mem_read(unit, PORT_TABm, MEM_BLOCK_ANY, port, &pent)); 768 idx = soc_mem_field32_get(unit, PORT_TABm, &pent, 769 PROTOCOL_PKT_INDEXf); 770 prt = REG_PORT_ANY; 771 } else { 772 prt = REG_PORT_ANY; 773 idx = 0; 774 } 775 } 776 SOC_IF_ERROR_RETURN(soc_reg_get(unit, b->reg, prt, idx, &val64)); 777 *arg = soc_reg64_field32_get(unit, b->reg, val64, b->field); 778 779 if (b->xlate_arg) { 780 *arg = (b->xlate_arg)(unit, *arg, 0); 781 } 782 *found = 1; 783 break; 784 } 785 } 786 return BCM_E_NONE; 787 } 788