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

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