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