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

hash.h (23713B)


      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-2020 Broadcom Inc. All rights reserved.
      7  *
      8  */
      9 
     10 #ifndef __BCM_HASH_H__
     11 #define __BCM_HASH_H__
     12 
     13 #include <bcm/types.h>
     14 
     15 /* Flex bin selection APIs valid options. */
     16 #define BCM_HASH_FLEX_BIN_OPTION_REPLACE    (1 << 0)   /* Indicate a replace
     17                                                           operation. */
     18 #define BCM_HASH_FLEX_BIN_OPTION_WITH_ID    (1 << 1)   /* Write to the entry
     19                                                           pointed to by the
     20                                                           given entry_id. */
     21 #define BCM_HASH_FLEX_BIN_OPTION_SIZE_8BIT  (1 << 2)   /* Select 8bit instead of
     22                                                           16bit per bin command */
     23 
     24 /* Hash flex bin selection command object offset. */
     25 typedef enum bcm_hash_flex_bin_object_offset_e {
     26     BCM_HASH_OBJ_OFFSET_BIT0 = 0,       /* From start of the object. */
     27     BCM_HASH_OBJ_OFFSET_BIT4 = 1,       /* Start at bit4 of the object. */
     28     BCM_HASH_OBJ_OFFSET_BIT8 = 2,       /* Start at bit8 of the object. */
     29     BCM_HASH_OBJ_OFFSET_BIT12 = 3,      /* Start at bit12 of the object. */
     30     BCM_HASH_OBJ_OFFSET_BIT16 = 4,      /* Start at bit16 of the object. */
     31     BCM_HASH_OBJ_OFFSET_BIT20 = 5,      /* Start at bit20 of the object. */
     32     BCM_HASH_OBJ_OFFSET_BIT24 = 6,      /* Start at bit24 of the object. */
     33     BCM_HASH_OBJ_OFFSET_BIT28 = 7,      /* Start at bit28 of the object. */
     34     BCM_HASH_OBJ_OFFSET_BIT32 = 8,      /* Start at bit32 of the object. */
     35     BCM_HASH_OBJ_OFFSET_BIT36 = 9,      /* Start at bit36 of the object. */
     36     BCM_HASH_OBJ_OFFSET_BIT40 = 10,     /* Start at bit40 of the object. */
     37     BCM_HASH_OBJ_OFFSET_BIT44 = 11,     /* Start at bit44 of the object. */
     38     BCM_HASH_OBJ_OFFSET_BIT48 = 12,     /* Start at bit48 of the object. */
     39     BCM_HASH_OBJ_OFFSET_BIT52 = 13,     /* Start at bit52 of the object. */
     40     BCM_HASH_OBJ_OFFSET_BIT56 = 14,     /* Start at bit56 of the object. */
     41     BCM_HASH_OBJ_OFFSET_BIT60 = 15,     /* Start at bit60 of the object. */
     42     BCM_HASH_OBJ_OFFSET_BIT64 = 16,     /* Start at bit64 of the object. */
     43     BCM_HASH_OBJ_OFFSET_BIT68 = 17,     /* Start at bit68 of the object. */
     44     BCM_HASH_OBJ_OFFSET_BIT72 = 18,     /* Start at bit72 of the object. */
     45     BCM_HASH_OBJ_OFFSET_BIT76 = 19,     /* Start at bit76 of the object. */
     46     BCM_HASH_OBJ_OFFSET_BIT80 = 20,     /* Start at bit80 of the object. */
     47     BCM_HASH_OBJ_OFFSET_BIT84 = 21,     /* Start at bit84 of the object. */
     48     BCM_HASH_OBJ_OFFSET_BIT88 = 22,     /* Start at bit88 of the object. */
     49     BCM_HASH_OBJ_OFFSET_BIT92 = 23,     /* Start at bit92 of the object. */
     50     BCM_HASH_OBJ_OFFSET_BIT96 = 24,     /* Start at bit96 of the object. */
     51     BCM_HASH_OBJ_OFFSET_BIT100 = 25,    /* Start at bit100 of the object. */
     52     BCM_HASH_OBJ_OFFSET_BIT104 = 26,    /* Start at bit104 of the object. */
     53     BCM_HASH_OBJ_OFFSET_BIT108 = 27,    /* Start at bit108 of the object. */
     54     BCM_HASH_OBJ_OFFSET_BIT112 = 28,    /* Start at bit112 of the object. */
     55     BCM_HASH_OBJ_OFFSET_BIT116 = 29,    /* Start at bit116 of the object. */
     56     BCM_HASH_OBJ_OFFSET_BIT120 = 30,    /* Start at bit120 of the object. */
     57     BCM_HASH_OBJ_OFFSET_BIT124 = 31,    /* Start at bit124 of the object. */
     58     BCM_HASH_OBJ_OFFSET_MAX = 32        /* Must be last. */
     59 } bcm_hash_flex_bin_object_offset_t;
     60 
     61 /* Hash flex bin selection command bin ID. */
     62 typedef enum bcm_hash_flex_bin_id_e {
     63     BCM_HASH_BIN_A_0 = 0,               /* ID of the BIN_A 0. */
     64     BCM_HASH_BIN_A_1 = 1,               /* ID of the BIN_A 1. */
     65     BCM_HASH_BIN_A_2 = 2,               /* ID of the BIN_A 2. */
     66     BCM_HASH_BIN_A_3 = 3,               /* ID of the BIN_A 3. */
     67     BCM_HASH_BIN_A_4 = 4,               /* ID of the BIN_A 4. */
     68     BCM_HASH_BIN_A_5 = 5,               /* ID of the BIN_A 5. */
     69     BCM_HASH_BIN_A_6 = 6,               /* ID of the BIN_A 6. */
     70     BCM_HASH_BIN_A_7 = 7,               /* ID of the BIN_A 7. */
     71     BCM_HASH_BIN_A_8 = 8,               /* ID of the BIN_A 8. */
     72     BCM_HASH_BIN_A_9 = 9,               /* ID of the BIN_A 9. */
     73     BCM_HASH_BIN_A_10 = 10,             /* ID of the BIN_A 10. */
     74     BCM_HASH_BIN_A_11 = 11,             /* ID of the BIN_A 11. */
     75     BCM_HASH_BIN_A_12 = 12,             /* ID of the BIN_A 12. */
     76     BCM_HASH_BIN_A_MAX = 12,            /* Max bin number in BIN_A set. */
     77     BCM_HASH_BIN_A_0_UPPER_HALF = 50,   /* ID for the upper half of the BIN_A 0. */
     78     BCM_HASH_BIN_A_1_UPPER_HALF = 51,   /* ID for the upper half of the BIN_A 1. */
     79     BCM_HASH_BIN_A_2_UPPER_HALF = 52,   /* ID for the upper half of the BIN_A 2. */
     80     BCM_HASH_BIN_A_3_UPPER_HALF = 53,   /* ID for the upper half of the BIN_A 3. */
     81     BCM_HASH_BIN_A_4_UPPER_HALF = 54,   /* ID for the upper half of the BIN_A 4. */
     82     BCM_HASH_BIN_A_5_UPPER_HALF = 55,   /* ID for the upper half of the BIN_A 5. */
     83     BCM_HASH_BIN_A_6_UPPER_HALF = 56,   /* ID for the upper half of the BIN_A 6. */
     84     BCM_HASH_BIN_A_7_UPPER_HALF = 57,   /* ID for the upper half of the BIN_A 7. */
     85     BCM_HASH_BIN_A_8_UPPER_HALF = 58,   /* ID for the upper half of the BIN_A 8. */
     86     BCM_HASH_BIN_A_9_UPPER_HALF = 59,   /* ID for the upper half of the BIN_A 9. */
     87     BCM_HASH_BIN_A_10_UPPER_HALF = 60,  /* ID for the upper half of the BIN_A
     88                                            10. */
     89     BCM_HASH_BIN_A_11_UPPER_HALF = 61,  /* ID for the upper half of the BIN_A
     90                                            11. */
     91     BCM_HASH_BIN_A_12_UPPER_HALF = 62,  /* ID for the upper half of the BIN_A
     92                                            12. */
     93     BCM_HASH_BIN_A_UPPER_HALF_MAX = 62, /* Max upper half bin number in the
     94                                            BIN_A set. */
     95     BCM_HASH_BIN_B_0 = 100,             /* ID of the BIN_B 0. */
     96     BCM_HASH_BIN_B_1 = 101,             /* ID of the BIN_B 1. */
     97     BCM_HASH_BIN_B_2 = 102,             /* ID of the BIN_B 2. */
     98     BCM_HASH_BIN_B_3 = 103,             /* ID of the BIN_B 3. */
     99     BCM_HASH_BIN_B_4 = 104,             /* ID of the BIN_B 4. */
    100     BCM_HASH_BIN_B_5 = 105,             /* ID of the BIN_B 5. */
    101     BCM_HASH_BIN_B_6 = 106,             /* ID of the BIN_B 6. */
    102     BCM_HASH_BIN_B_7 = 107,             /* ID of the BIN_B 7. */
    103     BCM_HASH_BIN_B_8 = 108,             /* ID of the BIN_B 8. */
    104     BCM_HASH_BIN_B_9 = 109,             /* ID of the BIN_B 9. */
    105     BCM_HASH_BIN_B_10 = 110,            /* ID of the BIN_B 10. */
    106     BCM_HASH_BIN_B_11 = 111,            /* ID of the BIN_B 11. */
    107     BCM_HASH_BIN_B_12 = 112,            /* ID of the BIN_B 12. */
    108     BCM_HASH_BIN_B_MAX = 112,           /* Max bin number in BIN_B set. */
    109     BCM_HASH_BIN_B_0_UPPER_HALF = 150,  /* ID for the upper half of the BIN_B 0. */
    110     BCM_HASH_BIN_B_1_UPPER_HALF = 151,  /* ID for the upper half of the BIN_B 1. */
    111     BCM_HASH_BIN_B_2_UPPER_HALF = 152,  /* ID for the upper half of the BIN_B 2. */
    112     BCM_HASH_BIN_B_3_UPPER_HALF = 153,  /* ID for the upper half of the BIN_B 3. */
    113     BCM_HASH_BIN_B_4_UPPER_HALF = 154,  /* ID for the upper half of the BIN_B 4. */
    114     BCM_HASH_BIN_B_5_UPPER_HALF = 155,  /* ID for the upper half of the BIN_B 5. */
    115     BCM_HASH_BIN_B_6_UPPER_HALF = 156,  /* ID for the upper half of the BIN_B 6. */
    116     BCM_HASH_BIN_B_7_UPPER_HALF = 157,  /* ID for the upper half of the BIN_B 7. */
    117     BCM_HASH_BIN_B_8_UPPER_HALF = 158,  /* ID for the upper half of the BIN_B 8. */
    118     BCM_HASH_BIN_B_9_UPPER_HALF = 159,  /* ID for the upper half of the BIN_B 9. */
    119     BCM_HASH_BIN_B_10_UPPER_HALF = 160, /* ID for the upper half of the BIN_B
    120                                            10. */
    121     BCM_HASH_BIN_B_11_UPPER_HALF = 161, /* ID for the upper half of the BIN_B
    122                                            11. */
    123     BCM_HASH_BIN_B_12_UPPER_HALF = 162, /* ID for the upper half of the BIN_B
    124                                            12. */
    125     BCM_HASH_BIN_B_UPPER_HALF_MAX = 162 /* Max upper half bin number in the
    126                                            BIN_B set. */
    127 } bcm_hash_flex_bin_id_t;
    128 
    129 /* Hash flex bin selection command object IDs. */
    130 typedef enum bcm_hash_flex_bin_object_id_e {
    131     BCM_HASH_OBJ_SGPP = 0,              /* Source Global Physical Port. */
    132     BCM_HASH_OBJ_SVP = 1,               /* Source VP. */
    133     BCM_HASH_OBJ_OUTER_PROTO = 2,       /* Outer header IP protocol. */
    134     BCM_HASH_OBJ_HG_LBID = 3,           /* HG Load Balance ID. */
    135     BCM_HASH_OBJ_OUTER_SIP = 4,         /* Outer IP source address. */
    136     BCM_HASH_OBJ_OUTER_DIP = 5,         /* Outer IP destination address. */
    137     BCM_HASH_OBJ_OUTER_SIP_NORMALIZED = 6, /* Outer SIP normalized. */
    138     BCM_HASH_OBJ_OUTER_DIP_NORMALIZED = 7, /* Outer DIP normalized. */
    139     BCM_HASH_OBJ_INNER_SIP = 8,         /* Inner SIP. */
    140     BCM_HASH_OBJ_INNER_DIP = 9,         /* Inner DIP. */
    141     BCM_HASH_OBJ_INNER_SIP_NORMALIZED = 10, /* Inner SIP normalized. */
    142     BCM_HASH_OBJ_INNER_DIP_NORMALIZED = 11, /* Inner DIP normalized. */
    143     BCM_HASH_OBJ_OUTER_L4_SRC_PORT = 12, /* Outer L4 source port. */
    144     BCM_HASH_OBJ_OUTER_L4_DEST_PORT = 13, /* Outer L4 dest port. */
    145     BCM_HASH_OBJ_INNER_L4_SRC_PORT = 14, /* Inner L4 source port. */
    146     BCM_HASH_OBJ_INNER_L4_DEST_PORT = 15, /* Inner L4 dest port. */
    147     BCM_HASH_OBJ_OUTER_L4_SRC_PORT_NORMALIZED = 16, /* Outer L4 source port normalized. */
    148     BCM_HASH_OBJ_OUTER_L4_DEST_PORT_NORMALIZED = 17, /* Outer L4 dest port normalized. */
    149     BCM_HASH_OBJ_INNER_L4_SRC_PORT_NORMALIZED = 18, /* Inner L4 source port normalized. */
    150     BCM_HASH_OBJ_INNER_L4_DEST_PORT_NORMALIZED = 19, /* Inner L4 dest port normalized. */
    151     BCM_HASH_OBJ_INNER_PROTO = 20,      /* Inner IP protocol. */
    152     BCM_HASH_OBJ_MPLS_LABEL_1 = 21,     /* MPLS label 1. */
    153     BCM_HASH_OBJ_MPLS_LABEL_2 = 22,     /* MPLS label 2. */
    154     BCM_HASH_OBJ_MPLS_LABEL_3 = 23,     /* MPLS label 3. */
    155     BCM_HASH_OBJ_MPLS_LABEL_4 = 24,     /* MPLS label 4. */
    156     BCM_HASH_OBJ_MPLS_LABEL_5 = 25,     /* MPLS label 5. */
    157     BCM_HASH_OBJ_OUTER_MAC_SA = 26,     /* MAC source address. */
    158     BCM_HASH_OBJ_OUTER_MAC_DA = 27,     /* MAC destination address. */
    159     BCM_HASH_OBJ_OUTER_VNTAG_ETAG = 28, /* VNTAG. */
    160     BCM_HASH_OBJ_OUTER_OTAG = 29,       /* OTAG. */
    161     BCM_HASH_OBJ_OUTER_ITAG = 30,       /* ITAG. */
    162     BCM_HASH_OBJ_OUTER_CNTAG = 31,      /* CNTAG. */
    163     BCM_HASH_OBJ_OUTER_ETHTYPE = 32,    /* ETHTYPE. */
    164     BCM_HASH_OBJ_OUTER_VXLAN = 33,      /* VXLAN 8 bytes. */
    165     BCM_HASH_OBJ_OUTER_IPV4_HEADER = 34, /* The first 12 bytes of IPv4 header. */
    166     BCM_HASH_OBJ_OUTER_IPV4_SIP = 35,   /* The IPv4 source address. */
    167     BCM_HASH_OBJ_OUTER_IPV4_DIP = 36,   /* The IPv4 destination address. */
    168     BCM_HASH_OBJ_OUTER_IPV6_DIP = 37,   /* IPv6 destination address. */
    169     BCM_HASH_OBJ_OUTER_IPV6_SIP = 38,   /* IPv6 source address. */
    170     BCM_HASH_OBJ_OUTER_IPV6_HEADER1 = 39, /* The first 4 bytes of IPv6 header. */
    171     BCM_HASH_OBJ_OUTER_IPV6_HEADER2 = 40, /* The second 4 bytes of IPv6 header. */
    172     BCM_HASH_OBJ_OUTER_GRE_HEADER = 41, /* GRE header. */
    173     BCM_HASH_OBJ_OUTER_L4 = 42,         /* 8 bytes of L4 field. */
    174     BCM_HASH_OBJ_OUTER_L5 = 43,         /* 8 bytes of L5 field. */
    175     BCM_HASH_OBJ_OUTER_UDF0_0 = 44,     /* first 2 byte of UDF0. */
    176     BCM_HASH_OBJ_OUTER_UDF0_1 = 45,     /* 2 byte UDF0. */
    177     BCM_HASH_OBJ_OUTER_UDF0_2 = 46,     /* 2 byte UDF0. */
    178     BCM_HASH_OBJ_OUTER_UDF0_3 = 47,     /* 2 byte UDF0. */
    179     BCM_HASH_OBJ_OUTER_UDF0_4 = 48,     /* 2 byte UDF0. */
    180     BCM_HASH_OBJ_OUTER_UDF0_5 = 49,     /* 2 byte UDF0. */
    181     BCM_HASH_OBJ_OUTER_UDF0_6 = 50,     /* 2 byte UDF0. */
    182     BCM_HASH_OBJ_OUTER_UDF0_7 = 51,     /* 2 byte UDF0. */
    183     BCM_HASH_OBJ_OUTER_UDF1_0 = 52,     /* first 2 byte of UDF1. */
    184     BCM_HASH_OBJ_OUTER_UDF1_1 = 53,     /* 2 byte UDF1. */
    185     BCM_HASH_OBJ_OUTER_UDF1_2 = 54,     /* 2 byte UDF1. */
    186     BCM_HASH_OBJ_OUTER_UDF1_3 = 55,     /* 2 byte UDF1. */
    187     BCM_HASH_OBJ_OUTER_UDF1_4 = 56,     /* 3 byte UDF1. */
    188     BCM_HASH_OBJ_OUTER_UDF1_5 = 57,     /* 3 byte UDF1. */
    189     BCM_HASH_OBJ_OUTER_UDF1_6 = 58,     /* 4 byte UDF1. */
    190     BCM_HASH_OBJ_OUTER_UDF1_7 = 59,     /* 4 byte UDF1. */
    191     BCM_HASH_OBJ_OUTER_TOS = 60,        /* IP header Type Of Service. */
    192     BCM_HASH_OBJ_OUTER_TTL = 61,        /* IP header TTL. */
    193     BCM_HASH_OBJ_INNER_MAC_SA = 62,     /* MAC source address. */
    194     BCM_HASH_OBJ_INNER_MAC_DA = 63,     /* MAC destination address. */
    195     BCM_HASH_OBJ_INNER_VNTAG_ETAG = 64, /* VNTAG. */
    196     BCM_HASH_OBJ_INNER_OTAG = 65,       /* OTAG. */
    197     BCM_HASH_OBJ_INNER_ITAG = 66,       /* ITAG. */
    198     BCM_HASH_OBJ_INNER_CNTAG = 67,      /* CNTAG. */
    199     BCM_HASH_OBJ_INNER_ETHTYPE = 68,    /* ETHTYPE. */
    200     BCM_HASH_OBJ_INNER_VXLAN = 69,      /* VXLAN 8 bytes. */
    201     BCM_HASH_OBJ_INNER_IPV4_HEADER = 70, /* The first 12 bytes of IPv4 header. */
    202     BCM_HASH_OBJ_INNER_IPV4_SIP = 71,   /* The IPv4 source address. */
    203     BCM_HASH_OBJ_INNER_IPV4_DIP = 72,   /* The IPv4 destination address. */
    204     BCM_HASH_OBJ_INNER_IPV6_DIP = 73,   /* IPv6 destination address. */
    205     BCM_HASH_OBJ_INNER_IPV6_SIP = 74,   /* IPv6 source address. */
    206     BCM_HASH_OBJ_INNER_IPV6_HEADER1 = 75, /* The first 4 bytes of IPv6 header. */
    207     BCM_HASH_OBJ_INNER_IPV6_HEADER2 = 76, /* The second 4 bytes of IPv6 header. */
    208     BCM_HASH_OBJ_INNER_GRE_HEADER = 77, /* GRE header. */
    209     BCM_HASH_OBJ_INNER_L4 = 78,         /* 8 bytes of Layer 4 field. */
    210     BCM_HASH_OBJ_INNER_L5 = 79,         /* 8 bytes of Layer 5 field. */
    211     BCM_HASH_OBJ_INNER_UDF0_0 = 80,     /* first 2 byte of UDF0. */
    212     BCM_HASH_OBJ_INNER_UDF0_1 = 81,     /* 2 byte UDF0. */
    213     BCM_HASH_OBJ_INNER_UDF0_2 = 82,     /* 2 byte UDF0. */
    214     BCM_HASH_OBJ_INNER_UDF0_3 = 83,     /* 2 byte UDF0. */
    215     BCM_HASH_OBJ_INNER_UDF0_4 = 84,     /* 2 byte UDF0. */
    216     BCM_HASH_OBJ_INNER_UDF0_5 = 85,     /* 2 byte UDF0. */
    217     BCM_HASH_OBJ_INNER_UDF0_6 = 86,     /* 2 byte UDF0. */
    218     BCM_HASH_OBJ_INNER_UDF0_7 = 87,     /* 2 byte UDF0. */
    219     BCM_HASH_OBJ_INNER_UDF1_0 = 88,     /* first 2 byte of UDF1. */
    220     BCM_HASH_OBJ_INNER_UDF1_1 = 89,     /* 2 byte UDF1. */
    221     BCM_HASH_OBJ_INNER_UDF1_2 = 90,     /* 2 byte UDF1. */
    222     BCM_HASH_OBJ_INNER_UDF1_3 = 91,     /* 2 byte UDF1. */
    223     BCM_HASH_OBJ_INNER_UDF1_4 = 92,     /* 3 byte UDF1. */
    224     BCM_HASH_OBJ_INNER_UDF1_5 = 93,     /* 3 byte UDF1. */
    225     BCM_HASH_OBJ_INNER_UDF1_6 = 94,     /* 4 byte UDF1. */
    226     BCM_HASH_OBJ_INNER_UDF1_7 = 95,     /* 4 byte UDF1. */
    227     BCM_HASH_OBJ_INNER_TOS = 96,        /* IP header Type Of Service. */
    228     BCM_HASH_OBJ_INNER_TTL = 97,        /* IP header TTL. */
    229     BCM_HASH_OBJ_SUBPORT_TAG = 98,      /* SUBPORT_TAG. */
    230     BCM_HASH_OBJ_ID_MAX = 99,           /* Must be last. */
    231     BCM_HASH_OBJ_ID_INVALID = BCM_HASH_OBJ_ID_MAX /* Same as the BCM_HASH_OBJ_ID_MAX. */
    232 } bcm_hash_flex_bin_object_id_t;
    233 
    234 /* Hash flex bin selection packet types. */
    235 typedef enum bcm_hash_pkt_type_e {
    236     BCM_HASH_PKT_FLOW_TYPE_FRONT_PANEL = 0, /* Packet flow type: front panel port */
    237     BCM_HASH_PKT_FLOW_TYPE_FRONT_PANEL_SYSTEM_HDR_PROXY = 1, /* Packet flow type: front panel port,
    238                                            system header proxy */
    239     BCM_HASH_PKT_FLOW_TYPE_FRONT_PANEL_LOOPBACK_GENERIC = 2, /* Packet flow type: front panel port,
    240                                            loopback generic */
    241     BCM_HASH_PKT_FLOW_TYPE_FRONT_PANEL_LOOPBACK_TUNNEL_TERM = 3, /* Packet flow type: front panel port,
    242                                            loopback tunnel termination */
    243     BCM_HASH_PKT_FLOW_TYPE_SYSTEM_HDR = 4, /* Packet flow type: system header */
    244     BCM_HASH_PKT_FLOW_TYPE_SYSTEM_HDR_CONTROL = 5, /* Packet flow type: system header
    245                                            control */
    246     BCM_HASH_PKT_FLOW_TYPE_SYSTEM_HDR_UNICAST = 6, /* Packet flow type: system header
    247                                            unicast */
    248     BCM_HASH_PKT_FLOW_TYPE_SYSTEM_HDR_FLOOD = 7, /* Packet flow type: system header flood */
    249     BCM_HASH_PKT_FLOW_TYPE_SYSTEM_HDR_L2_MULTICAST = 8, /* Packet flow type: system header L2
    250                                            multicast */
    251     BCM_HASH_PKT_FLOW_TYPE_SYSTEM_HDR_L3_MULTICAST = 9, /* Packet flow type: system header L3
    252                                            multicast */
    253     BCM_HASH_PKT_FLOW_TYPE_TUNNEL_VXLAN = 10, /* Packet flow tunnel type: VXLAN. */
    254     BCM_HASH_PKT_FLOW_TYPE_TUNNEL_NVGRE = 11, /* Packet flow tunnel type: NVGRE. */
    255     BCM_HASH_PKT_FLOW_TYPE_TUNNEL_MIM = 12, /* Packet flow tunnel type: MIM. */
    256     BCM_HASH_PKT_FLOW_TYPE_TUNNEL_IPINIP = 13, /* Packet flow tunnel type: IPINIP. */
    257     BCM_HASH_PKT_FLOW_TYPE_TUNNEL_MPLS = 14, /* Packet flow tunnel type: MPLS. */
    258     BCM_HASH_PKT_FLOW_TYPE_LAYER_L2 = 15, /* Packet flow type: L2. */
    259     BCM_HASH_PKT_FLOW_TYPE_LAYER_L3 = 16, /* Packet flow type: L3. */
    260     BCM_HASH_PKT_TYPE_MAX = 17,         /* The current max number of packet
    261                                            types. */
    262     BCM_HASH_PKT_TYPE_INVALID = 128     /* The number of packet types cannot
    263                                            exceed this number. */
    264 } bcm_hash_pkt_type_t;
    265 
    266 /* Hash flex bin selection packet processing status. */
    267 typedef enum bcm_hash_pkt_status_e {
    268     BCM_HASH_PKT_STATUS_GTP_ENDPOINT_ID = 0, /* GTP endpoint id */
    269     BCM_HASH_PKT_STATUS_L3_FORWARDED = 1, /* L3 forward status */
    270     BCM_HASH_PKT_STATUS_TUNNEL_TERM = 2, /* Tunnel termination status */
    271     BCM_HASH_PKT_STATUS_MAX = 3,        /* The current number of packet status. */
    272     BCM_HASH_PKT_STATUS_INVALID = 64    /* The number of status cannot exceed
    273                                            this number. */
    274 } bcm_hash_pkt_status_t;
    275 
    276 /* A list of flex objects. Do not change. Add new ones at end. */
    277 typedef enum bcm_hash_flex_object_e {
    278     BCM_HASH_FLEX_OBJ_MATCH_ID_ZONE0 = 0, /* flex object match_id zone0 */
    279     BCM_HASH_FLEX_OBJ_MATCH_ID_ZONE1 = 1, /* flex object match_id zone1 */
    280     BCM_HASH_FLEX_OBJ_MATCH_ID_ZONE2 = 2, /* flex object match_id zone2 */
    281     BCM_HASH_FLEX_OBJ_MATCH_ID_ZONE3 = 3, /* flex object match_id zone3 */
    282     BCM_HASH_FLEX_OBJ_MATCH_ID_ZONE4 = 4, /* flex object match_id zone4 */
    283     BCM_HASH_FLEX_OBJ_FLOW_ID_0 = 5,    /* flex object flow id 0 */
    284     BCM_HASH_FLEX_OBJ_FLOW_ID_1 = 6,    /* flex object flow id 1 */
    285     BCM_HASH_FLEX_OBJ_FLOW_ID_2 = 7,    /* flex object flow id 2 */
    286     BCM_HASH_FLEX_OBJ_HVE_CONTROL_1 = 8, /* flex object HVE_CONTROL_1. */
    287     BCM_HASH_FLEX_OBJ_HVE_CONTROL_2 = 9, /* flex object HVE_CONTROL_2. */
    288     BCM_HASH_FLEX_OBJ_MAX = 10          /* Number of flex objects. Must be last. */
    289 } bcm_hash_flex_object_t;
    290 
    291 /* Size constants for array. */
    292 #define BCM_HASH_PKT_TYPE_BIT_MAX   128        
    293 #define BCM_HASH_PKT_STATUS_BIT_MAX 64         
    294 
    295 /* Hash flex bin selection command */
    296 typedef struct bcm_hash_flex_bin_cmd_s {
    297     bcm_hash_flex_bin_id_t bin_id;      /* The bin number for the selected
    298                                            object. */
    299     bcm_hash_flex_bin_object_id_t obj_id; /* The selected object. */
    300     bcm_hash_flex_bin_object_offset_t obj_offset; /* The starting bit of the object. */
    301     uint16 bin_mask;                    /* Mask applied on the selected bin. */
    302 } bcm_hash_flex_bin_cmd_t;
    303 
    304 /* Hash flex bin selection packet type configuration bitmap */
    305 typedef struct bcm_hash_pkt_type_set_s {
    306     SHR_BITDCL q_bit[_SHR_BITDCLSIZE(BCM_HASH_PKT_TYPE_BIT_MAX)]; /* Packet type configuration bitmap. */
    307 } bcm_hash_pkt_type_set_t;
    308 
    309 /* Hash flex bin selection packet status configuration bitmap */
    310 typedef struct bcm_hash_pkt_status_set_s {
    311     SHR_BITDCL s_bit[_SHR_BITDCLSIZE(BCM_HASH_PKT_STATUS_BIT_MAX)]; /* Packet processing status
    312                                            configuration bitmap. */
    313 } bcm_hash_pkt_status_set_t;
    314 
    315 #define BCM_HASH_PKT_TYPE_SET_ADD(_set, _q)  SHR_BITSET(((_set).q_bit), (_q)) 
    316 
    317 #define BCM_HASH_PKT_TYPE_SET_REMOVE(_set, _q)  SHR_BITCLR(((_set).q_bit), (_q)) 
    318 
    319 #define BCM_HASH_PKT_TYPE_SET_TEST(_set, _q)  SHR_BITGET(((_set).q_bit), (_q)) 
    320 
    321 #define BCM_HASH_PKT_STATUS_SET_ADD(_set, _q)  SHR_BITSET(((_set).s_bit), (_q)) 
    322 
    323 #define BCM_HASH_PKT_STATUS_SET_REMOVE(_set, _q)  SHR_BITCLR(((_set).s_bit), (_q)) 
    324 
    325 #define BCM_HASH_PKT_STATUS_SET_TEST(_set, _q)  SHR_BITGET(((_set).s_bit), (_q)) 
    326 
    327 /* Hash flex field */
    328 typedef struct bcm_hash_flex_field_s {
    329     uint32 field_id;    /* Flex field ID. */
    330     uint32 value;       /* Flex field value. */
    331     uint32 mask;        /* Flex field mask. */
    332 } bcm_hash_flex_field_t;
    333 
    334 /* Hash flex bin selection configuration */
    335 typedef struct bcm_hash_flex_bin_config_s {
    336     bcm_hash_pkt_type_set_t tset;       /* Packet type set bitmap. */
    337     bcm_hash_pkt_status_set_t sset;     /* Packet processing status set bitmap. */
    338     bcm_hash_pkt_status_set_t sset_mask; /* Packet processing status set mask
    339                                            bitmap. */
    340     uint16 sgpp_ctrl_id;                /* SGPP hash ctrl id. */
    341     uint16 svp_ctrl_id;                 /* SVP hash ctrl id. */
    342     uint16 l3iif_ctrl_id;               /* L3_IIF hash ctrl id. */
    343     uint16 vfi_ctrl_id;                 /* VFI hash ctrl id. */
    344     uint16 vlan_ctrl_id;                /* VLAN hash ctrl id. */
    345     uint16 sgpp_ctrl_id_mask;           /* sgpp_ctrl_id mask. */
    346     uint16 svp_ctrl_id_mask;            /* svp_ctrl_id mask. */
    347     uint16 l3iif_ctrl_id_mask;          /* l3iif_ctrl_id mask. */
    348     uint16 vfi_ctrl_id_mask;            /* vfi_ctrl_id mask. */
    349     uint16 vlan_ctrl_id_mask;           /* vlan_ctrl_id mask. */
    350     int entry_id;                       /* Higher entry ID has high priority. */
    351     uint32 option;                      /* Bitwise flags for operation options. */
    352 } bcm_hash_flex_bin_config_t;
    353 
    354 /* bcm_hash_flex_bin_traverse callback */
    355 typedef int (*bcm_hash_flex_bin_traverse_cb)(
    356     int unit, 
    357     bcm_hash_flex_bin_config_t *cfg, 
    358     int num_bins, 
    359     bcm_hash_flex_bin_cmd_t *bin_cmd, 
    360     int num_fields, 
    361     bcm_hash_flex_field_t *flex_field, 
    362     void *user_data);
    363 
    364 /* Initialize the bcm_hash_flex_bin_config_t structure. */
    365 extern void bcm_hash_flex_bin_config_t_init(
    366     bcm_hash_flex_bin_config_t *cfg);
    367 
    368 #ifndef BCM_HIDE_DISPATCHABLE
    369 
    370 /* Initialize hash module. */
    371 extern int bcm_hash_init(
    372     int unit);
    373 
    374 /* Add a hash flex bin selection rule. */
    375 extern int bcm_hash_flex_bin_add(
    376     int unit, 
    377     bcm_hash_flex_bin_config_t *cfg, 
    378     int num_bins, 
    379     bcm_hash_flex_bin_cmd_t *bin_cmd, 
    380     int num_fields, 
    381     bcm_hash_flex_field_t *flex_field);
    382 
    383 /* Delete a flex bin selection rule for the given entry_id. */
    384 extern int bcm_hash_flex_bin_delete(
    385     int unit, 
    386     int entry_id);
    387 
    388 /* Delete all flex bin selection rules. */
    389 extern int bcm_hash_flex_bin_delete_all(
    390     int unit);
    391 
    392 /* Get the flex bin selection rule for the given entry_id. */
    393 extern int bcm_hash_flex_bin_get(
    394     int unit, 
    395     bcm_hash_flex_bin_config_t *cfg, 
    396     int num_bins, 
    397     bcm_hash_flex_bin_cmd_t *bin_cmd, 
    398     int num_fields, 
    399     bcm_hash_flex_field_t *flex_field);
    400 
    401 /* Traverse flex bin selection entries. */
    402 extern int bcm_hash_flex_bin_traverse(
    403     int unit, 
    404     uint32 option, 
    405     bcm_hash_flex_bin_traverse_cb cb, 
    406     void *user_data);
    407 
    408 /* Get the field id from the field name for the given object. */
    409 extern int bcm_hash_flex_field_id_get(
    410     int unit, 
    411     bcm_hash_flex_object_t object, 
    412     const char *field_name, 
    413     uint32 *field_id);
    414 
    415 /* Get the field name and the flex object for the given field id. */
    416 extern int bcm_hash_flex_field_name_get(
    417     int unit, 
    418     uint32 field_id, 
    419     bcm_hash_flex_object_t *object, 
    420     int size, 
    421     char *field_name);
    422 
    423 #endif /* BCM_HIDE_DISPATCHABLE */
    424 
    425 #endif /* __BCM_HASH_H__ */