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

pktio.h (47144B)


      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_PKTIO_H__
     11 #define __BCM_PKTIO_H__
     12 
     13 #include <shared/bitop.h>
     14 #include <bcm/types.h>
     15 
     16 #define BCM_PKTIO_PMD_SIZE_WORDS    48         /* Packet metadata size. */
     17 
     18 /* Packet metadata information. */
     19 typedef struct bcm_pktio_pmd_s {
     20     uint32 *rxpmd;                      /* RX Packet metadata handle. */
     21     uint32 *txpmd;                      /* TX Packet metadata handle. */
     22     uint32 *higig;                      /* HiGig handle. */
     23     uint32 *lbhdr;                      /* Loopback Header handle. */
     24     uint32 data[BCM_PKTIO_PMD_SIZE_WORDS]; /* Headers' data. */
     25 } bcm_pktio_pmd_t;
     26 
     27 extern void bcm_pktio_pmd_t_init(
     28     bcm_pktio_pmd_t *pmd);
     29 
     30 typedef struct bcm_pktio_pkt_s bcm_pktio_pkt_t;
     31 
     32 /* Packet structure. */
     33 struct bcm_pktio_pkt_s { 
     34     bcm_pktio_pkt_t *next;  /* Point to next packet in the list. */
     35     bcm_pktio_pkt_t *prev;  /* Point to previous packet in the list. */
     36     int unit;               /* Switch unit number. */
     37     uint32 flags;           /* Internal used only. */
     38     uint32 type;            /* Packet forwarding type. */
     39     bcm_pktio_pmd_t pmd;    /* Packet metadata information. */
     40     void *data_buf;         /* Packet data buffer information. */
     41 };
     42 
     43 #define BCM_PKTIO_BUF_F_TX      (0x1 << 0) /* Reserve space for TX overhead. */
     44 
     45 #ifndef BCM_HIDE_DISPATCHABLE
     46 
     47 /* Allocate a packet structure and packet data. */
     48 extern int bcm_pktio_alloc(
     49     int unit, 
     50     uint32 max_size, 
     51     uint32 flags, 
     52     bcm_pktio_pkt_t **packet);
     53 
     54 /* Release packet data buffer and destroy packet object. */
     55 extern int bcm_pktio_free(
     56     int unit, 
     57     bcm_pktio_pkt_t *packet);
     58 
     59 /* Claim the packet. */
     60 extern int bcm_pktio_claim(
     61     int unit, 
     62     bcm_pktio_pkt_t *pkt, 
     63     bcm_pktio_pkt_t **new_pkt);
     64 
     65 /* Retrieve packet data handle and length. */
     66 extern int bcm_pktio_pkt_data_get(
     67     int unit, 
     68     bcm_pktio_pkt_t *packet, 
     69     void **data, 
     70     uint32 *length);
     71 
     72 /* Reserve buffer size in headroom. */
     73 extern int bcm_pktio_reserve(
     74     int unit, 
     75     bcm_pktio_pkt_t *packet, 
     76     uint32 len, 
     77     void **data);
     78 
     79 /* Add extra size in the front of a packet data. */
     80 extern int bcm_pktio_push(
     81     int unit, 
     82     bcm_pktio_pkt_t *packet, 
     83     uint32 len, 
     84     void **data);
     85 
     86 /* Add bytes in the end of a packet data. */
     87 extern int bcm_pktio_put(
     88     int unit, 
     89     bcm_pktio_pkt_t *packet, 
     90     uint32 len, 
     91     void **data);
     92 
     93 /* Remove bytes from the start of packet data. */
     94 extern int bcm_pktio_pull(
     95     int unit, 
     96     bcm_pktio_pkt_t *packet, 
     97     uint32 len, 
     98     void **data);
     99 
    100 /* Remove end from packet buffer. */
    101 extern int bcm_pktio_trim(
    102     int unit, 
    103     bcm_pktio_pkt_t *packet, 
    104     uint32 len);
    105 
    106 #endif /* BCM_HIDE_DISPATCHABLE */
    107 
    108 #define BCM_PKTIO_RXPMD_FLEX_FID_OFFSET     256        /* Offset to be added to
    109                                                           RXPMD FLEX field. */
    110 #define BCM_PKTIO_RXPMD_FLEX_FID_START      (0 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    111 #define BCM_PKTIO_RXPMD_FLEX_ING_TIMESTAMP_15_0 (0 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    112 #define BCM_PKTIO_RXPMD_FLEX_L3_IIF_13_0    (1 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    113 #define BCM_PKTIO_RXPMD_FLEX_EVENT_TRACE_VECTOR_15_0 (2 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    114 #define BCM_PKTIO_RXPMD_FLEX_NHOP_INDEX_1_14_0 (3 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    115 #define BCM_PKTIO_RXPMD_FLEX_VFI_15_0       (4 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    116 #define BCM_PKTIO_RXPMD_FLEX_L2_OIF_10_0    (5 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    117 #define BCM_PKTIO_RXPMD_FLEX_I2E_CLASS_ID_15_0 (6 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    118 #define BCM_PKTIO_RXPMD_FLEX_PKT_MISC_CTRL_0_3_0 (7 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    119 #define BCM_PKTIO_RXPMD_FLEX_DLB_ECMP_DESTINATION_15_0 (8 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    120 #define BCM_PKTIO_RXPMD_FLEX_SVP_NETWORK_GROUP_BITMAP_3_0 (9 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    121 #define BCM_PKTIO_RXPMD_FLEX_SYSTEM_DESTINATION_15_0 (10 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    122 #define BCM_PKTIO_RXPMD_FLEX_L2_IIF_10_0    (11 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    123 #define BCM_PKTIO_RXPMD_FLEX_NHOP_2_OR_ECMP_GROUP_INDEX_1_14_0 (12 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    124 #define BCM_PKTIO_RXPMD_FLEX_L3_OIF_1_13_0  (13 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    125 #define BCM_PKTIO_RXPMD_FLEX_DVP_15_0       (14 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    126 #define BCM_PKTIO_RXPMD_FLEX_EVENT_TRACE_VECTOR_47_32 (15 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    127 #define BCM_PKTIO_RXPMD_FLEX_ENTROPY_LABEL_LOW_15_0 (16 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    128 #define BCM_PKTIO_RXPMD_FLEX_SYSTEM_OPCODE_3_0 (17 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    129 #define BCM_PKTIO_RXPMD_FLEX_ING_TIMESTAMP_31_16 (18 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    130 #define BCM_PKTIO_RXPMD_FLEX_SYSTEM_SOURCE_15_0 (19 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    131 #define BCM_PKTIO_RXPMD_FLEX_ENTROPY_LABEL_HIGH_3_0 (20 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    132 #define BCM_PKTIO_RXPMD_FLEX_L2_IIF_QOS_REMARK_CTRL_3_0 (21 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    133 #define BCM_PKTIO_RXPMD_FLEX_TIMESTAMP_CTRL_3_0 (22 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    134 #define BCM_PKTIO_RXPMD_FLEX_EVENT_TRACE_VECTOR_31_16 (23 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    135 #define BCM_PKTIO_RXPMD_FLEX_INGRESS_PP_PORT_7_0 (24 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    136 #define BCM_PKTIO_RXPMD_FLEX_IFP_TS_CONTROL_ACTION_3_0 (25 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    137 #define BCM_PKTIO_RXPMD_FLEX_EFFECTIVE_TTL_7_0 (26 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    138 #define BCM_PKTIO_RXPMD_FLEX_SVP_15_0       (27 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    139 #define BCM_PKTIO_RXPMD_FLEX_DROP_CODE_15_0 (28 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    140 #define BCM_PKTIO_RXPMD_FLEX_INT_PRI_3_0    (29 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    141 #define BCM_PKTIO_RXPMD_FLEX_TUNNEL_PROCESSING_RESULTS_1_3_0 (30 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    142 #define BCM_PKTIO_RXPMD_FLEX_PARSER_VHLEN_0_15_0 (31 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    143 #define BCM_PKTIO_RXPMD_FLEX_VLAN_TAG_PRESERVE_CTRL_1_0 (32 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    144 #define BCM_PKTIO_RXPMD_FLEX_IFP_IOAM_ACTION_3_0 (33 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    145 #define BCM_PKTIO_RXPMD_FLEX_MPLS_LABEL_DECAP_COUNT_3_0 (34 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    146 #define BCM_PKTIO_RXPMD_FLEX_L3_DNAT_INDEX_15_0 (35 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    147 #define BCM_PKTIO_RXPMD_FLEX_NAT_CTRL_3_0   (36 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    148 #define BCM_PKTIO_RXPMD_FLEX_L3_SNAT_INDEX_15_0 (37 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    149 #define BCM_PKTIO_RXPMD_FLEX_VLAN_TAG_PRESERVE_CTRL_SVP_MIRROR_ENABLE_1_0 (38 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    150 #define BCM_PKTIO_RXPMD_FLEX_NHOP_2_OR_ECMP_GROUP_INDEX_1_15_0 (39 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    151 #define BCM_PKTIO_RXPMD_FLEX_NHOP_INDEX_1_15_0 (40 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    152 #define BCM_PKTIO_RXPMD_FLEX_INGRESS_QOS_REMAP_VALUE_15_0 (41 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    153 #define BCM_PKTIO_RXPMD_FLEX_INGRESS_QOS_REMARK_CTRL_3_0 (42 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    154 #define BCM_PKTIO_RXPMD_FLEX_IFP_TO_EP_MACSEC_INFO_15_0 (43 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    155 #define BCM_PKTIO_RXPMD_FLEX_IFP_OPAQUE_OBJ0_15_0 (44 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    156 #define BCM_PKTIO_RXPMD_FLEX_IFP_IOAM_GBP_ACTION_3_0 (45 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    157 #define BCM_PKTIO_RXPMD_FLEX_EVENT_TRACE_VECTOR_31_0 (46 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    158 #define BCM_PKTIO_RXPMD_FLEX_ING_TIMESTAMP_31_0 (47 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    159 #define BCM_PKTIO_RXPMD_FLEX_EP_NIH_HDR_TIMESTAMP_15_0 (48 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    160 #define BCM_PKTIO_RXPMD_FLEX_EP_NIH_HDR_TIMESTAMP_31_16 (49 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    161 #define BCM_PKTIO_RXPMD_FLEX_EGR_MTOP_INDEX_LO_15_0 (50 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    162 #define BCM_PKTIO_RXPMD_FLEX_EGR_MTOP_INDEX_HI_3_0 (51 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    163 #define BCM_PKTIO_RXPMD_FLEX_IPV4_GATEWAY_LOOKUP_HIT_VRF_STRENGTH_3_3 (52 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    164 #define BCM_PKTIO_RXPMD_FLEX_EM_FT_OPAQUE_OBJ_OR_IFP_OPAQUE_OBJ_15_0 (53 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    165 #define BCM_PKTIO_RXPMD_FLEX_INGRESS_QOS_REMAP_VALUE_OR_IFP_OPAQUE_OBJ_15_0 (54 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    166 #define BCM_PKTIO_RXPMD_FLEX_FID_END        (54 + BCM_PKTIO_RXPMD_FLEX_FID_OFFSET) /* <UNDEF> */
    167 #define BCM_PKTIO_RXPMD_FLEX_FID_COUNT      55         /* <UNDEF> */
    168 
    169 #define BCM_PKTIO_GENERIC_LOOPBACK_T_FID_START 0          /* <UNDEF> */
    170 #define BCM_PKTIO_GENERIC_LOOPBACK_T_INPUT_PRIORITY 0          /* <UNDEF> */
    171 #define BCM_PKTIO_GENERIC_LOOPBACK_T_RESERVED_1 1          /* <UNDEF> */
    172 #define BCM_PKTIO_GENERIC_LOOPBACK_T_RESERVED_0 2          /* <UNDEF> */
    173 #define BCM_PKTIO_GENERIC_LOOPBACK_T_INTERFACE_OBJ 3          /* <UNDEF> */
    174 #define BCM_PKTIO_GENERIC_LOOPBACK_T_PROCESSING_CTRL_1 4          /* <UNDEF> */
    175 #define BCM_PKTIO_GENERIC_LOOPBACK_T_PROCESSING_CTRL_0 5          /* <UNDEF> */
    176 #define BCM_PKTIO_GENERIC_LOOPBACK_T_DESTINATION_OBJ 6          /* <UNDEF> */
    177 #define BCM_PKTIO_GENERIC_LOOPBACK_T_SOURCE_SYSTEM_PORT 7          /* <UNDEF> */
    178 #define BCM_PKTIO_GENERIC_LOOPBACK_T_HEADER_TYPE 8          /* <UNDEF> */
    179 #define BCM_PKTIO_GENERIC_LOOPBACK_T_INTERFACE_CTRL 9          /* <UNDEF> */
    180 #define BCM_PKTIO_GENERIC_LOOPBACK_T_FLAGS  10         /* <UNDEF> */
    181 #define BCM_PKTIO_GENERIC_LOOPBACK_T_ENTROPY_OBJ 11         /* <UNDEF> */
    182 #define BCM_PKTIO_GENERIC_LOOPBACK_T_DESTINATION_TYPE 12         /* <UNDEF> */
    183 #define BCM_PKTIO_GENERIC_LOOPBACK_T_RESERVED_2 13         /* <UNDEF> */
    184 #define BCM_PKTIO_GENERIC_LOOPBACK_T_QOS_OBJ 14         /* <UNDEF> */
    185 #define BCM_PKTIO_GENERIC_LOOPBACK_T_START_BYTE 15         /* <UNDEF> */
    186 #define BCM_PKTIO_GENERIC_LOOPBACK_T_FID_END 15         /* <UNDEF> */
    187 #define BCM_PKTIO_GENERIC_LOOPBACK_T_FID_COUNT 16         /* <UNDEF> */
    188 
    189 #define BCM_PKTIO_HG3_BASE_T_FID_START      0          /* <UNDEF> */
    190 #define BCM_PKTIO_HG3_BASE_T_SYSTEM_SOURCE  0          /* <UNDEF> */
    191 #define BCM_PKTIO_HG3_BASE_T_HG3_RESERVED   1          /* <UNDEF> */
    192 #define BCM_PKTIO_HG3_BASE_T_CN             2          /* <UNDEF> */
    193 #define BCM_PKTIO_HG3_BASE_T_EXT_HDR_PRESENT 3          /* <UNDEF> */
    194 #define BCM_PKTIO_HG3_BASE_T_MIRROR_COPY    4          /* <UNDEF> */
    195 #define BCM_PKTIO_HG3_BASE_T_L3_ROUTED      5          /* <UNDEF> */
    196 #define BCM_PKTIO_HG3_BASE_T_CNG            6          /* <UNDEF> */
    197 #define BCM_PKTIO_HG3_BASE_T_RESERVED_ETYPE 7          /* <UNDEF> */
    198 #define BCM_PKTIO_HG3_BASE_T_VERSION        8          /* <UNDEF> */
    199 #define BCM_PKTIO_HG3_BASE_T_SYSTEM_DESTINATION 9          /* <UNDEF> */
    200 #define BCM_PKTIO_HG3_BASE_T_ENTROPY        10         /* <UNDEF> */
    201 #define BCM_PKTIO_HG3_BASE_T_TC             11         /* <UNDEF> */
    202 #define BCM_PKTIO_HG3_BASE_T_SYSTEM_DESTINATION_TYPE 12         /* <UNDEF> */
    203 #define BCM_PKTIO_HG3_BASE_T_FID_END        12         /* <UNDEF> */
    204 #define BCM_PKTIO_HG3_BASE_T_FID_COUNT      13         /* <UNDEF> */
    205 
    206 #define BCM_PKTIO_HG3_EXT0_FID_OFFSET       32         /* Offset to be added to
    207                                                           higig3 ext0 fids. */
    208 #define BCM_PKTIO_HG3_EXTENSION_0_T_FID_START (0 + BCM_PKTIO_HG3_EXT0_FID_OFFSET) /* <UNDEF> */
    209 #define BCM_PKTIO_HG3_EXTENSION_0_T_FORWARDING_DOMAIN (0 + BCM_PKTIO_HG3_EXT0_FID_OFFSET) /* <UNDEF> */
    210 #define BCM_PKTIO_HG3_EXTENSION_0_T_DVP_OR_L3_IIF (1 + BCM_PKTIO_HG3_EXT0_FID_OFFSET) /* <UNDEF> */
    211 #define BCM_PKTIO_HG3_EXTENSION_0_T_FLAGS   (2 + BCM_PKTIO_HG3_EXT0_FID_OFFSET) /* <UNDEF> */
    212 #define BCM_PKTIO_HG3_EXTENSION_0_T_CLASS_ID (3 + BCM_PKTIO_HG3_EXT0_FID_OFFSET) /* <UNDEF> */
    213 #define BCM_PKTIO_HG3_EXTENSION_0_T_SVP     (4 + BCM_PKTIO_HG3_EXT0_FID_OFFSET) /* <UNDEF> */
    214 #define BCM_PKTIO_HG3_EXTENSION_0_T_FID_END (4 + BCM_PKTIO_HG3_EXT0_FID_OFFSET) /* <UNDEF> */
    215 #define BCM_PKTIO_HG3_EXTENSION_0_T_FID_COUNT 5          /* <UNDEF> */
    216 
    217 #define BCM_PKTIO_BITMAP_WORD_SIZE  16         /* Bitmap array size. */
    218 
    219 typedef struct bcm_pktio_bitmap_s {
    220     uint32 pbits[BCM_PKTIO_BITMAP_WORD_SIZE]; 
    221 } bcm_pktio_bitmap_t;
    222 
    223 #define BCM_PKTIO_FID_INVALID   -1         /* Invalid field id. */
    224 
    225 #define BCM_PKTIO_FID_COUNT     BCM_PKTIO_BITMAP_WORD_SIZE * 32 /* Field id number. */
    226 
    227 /* Packet metadata field ID supported bit array. */
    228 typedef struct bcm_pktio_fid_support_s {
    229     bcm_pktio_bitmap_t txpmd_support;   /* TXPMD field ID supported bit array. */
    230     bcm_pktio_bitmap_t rxpmd_support;   /* RXPMD field ID supported bit array. */
    231     bcm_pktio_bitmap_t gih_support;     /* Generic loopback field ID supported
    232                                            bit array. */
    233     bcm_pktio_bitmap_t rxflex_support;  /* FLEXPMD field ID supported bit array. */
    234     bcm_pktio_bitmap_t higig3_support;  /* Higig3 field ID supported bit array. */
    235 } bcm_pktio_fid_support_t;
    236 
    237 #ifndef BCM_HIDE_DISPATCHABLE
    238 
    239 /* Get the pmd support bitmap of different pmd types. */
    240 extern int bcm_pktio_pmd_fid_support_get(
    241     int unit, 
    242     bcm_pktio_fid_support_t *support);
    243 
    244 /* Get the pmd support bitmap of different pmd types. */
    245 extern int bcm_pktio_raw_pmd_fid_support_get(
    246     int unit, 
    247     bcm_pktio_pmd_t *pmd, 
    248     bcm_pktio_fid_support_t *support);
    249 
    250 #endif /* BCM_HIDE_DISPATCHABLE */
    251 
    252 /* 
    253  * Macro to get a field ID's supported status.
    254  * 
    255  * Returns:
    256  *   zero     => Not supported
    257  *   non-zero => Supported
    258  */
    259 #define BCM_PKTIO_FID_SUPPORT_GET(_support, _fid)  \
    260     SHR_BITGET(((_support).pbits), (_fid)) 
    261 
    262 /* Macro to iterate over all supported field IDs in the _support. */
    263 #define BCM_PKTIO_FID_SUPPORT_ITER(_support, _fid)  \
    264     for ((_fid) = BCM_PKTIO_FID_INVALID + 1; \
    265          (_fid) < BCM_PKTIO_FID_COUNT; \
    266          (_fid)++) \
    267         if (BCM_PKTIO_FID_SUPPORT_GET(_support, _fid)) 
    268 
    269 /* Packet Metadata Types. */
    270 typedef enum bcm_pktio_pmd_type_e {
    271     bcmPktioPmdTypeTx = 0, 
    272     bcmPktioPmdTypeRx = 1, 
    273     bcmPktioPmdTypeGih = 2, 
    274     bcmPktioPmdTypeRxFlex = 3, 
    275     bcmPktioPmdTypeHigig3 = 4 
    276 } bcm_pktio_pmd_type_t;
    277 
    278 #ifndef BCM_HIDE_DISPATCHABLE
    279 
    280 /* Set value into a specific PMD field. */
    281 extern int bcm_pktio_pmd_field_set(
    282     int unit, 
    283     bcm_pktio_pkt_t *packet, 
    284     bcm_pktio_pmd_type_t type, 
    285     int fid, 
    286     uint32 val);
    287 
    288 /* Get value from a specific PMD field. */
    289 extern int bcm_pktio_pmd_field_get(
    290     int unit, 
    291     bcm_pktio_pkt_t *packet, 
    292     bcm_pktio_pmd_type_t type, 
    293     int fid, 
    294     uint32 *val);
    295 
    296 /* Set value into a specific PMD field. */
    297 extern int bcm_pktio_raw_pmd_field_set(
    298     int unit, 
    299     bcm_pktio_pmd_t *pmd, 
    300     bcm_pktio_pmd_type_t type, 
    301     int fid, 
    302     uint32 val);
    303 
    304 /* Get value from a specific PMD field. */
    305 extern int bcm_pktio_raw_pmd_field_get(
    306     int unit, 
    307     bcm_pktio_pmd_t *pmd, 
    308     bcm_pktio_pmd_type_t type, 
    309     int fid, 
    310     uint32 *val);
    311 
    312 #endif /* BCM_HIDE_DISPATCHABLE */
    313 
    314 #define BCM_PKTIO_REASON_NONE   0          /* No reason. */
    315 
    316 #define BCM_PKTIO_RXPMD_FLEX_REASON_CML_FLAGS 0          /* <UNDEF> */
    317 #define BCM_PKTIO_RXPMD_FLEX_REASON_L2_SRC_STATIC_MOVE 1          /* <UNDEF> */
    318 #define BCM_PKTIO_RXPMD_FLEX_REASON_PKT_INTEGRITY_CHECK_FAILED 2          /* <UNDEF> */
    319 #define BCM_PKTIO_RXPMD_FLEX_REASON_PROTOCOL_PKT 3          /* <UNDEF> */
    320 #define BCM_PKTIO_RXPMD_FLEX_REASON_L2_DST_LOOKUP_MISS 4          /* <UNDEF> */
    321 #define BCM_PKTIO_RXPMD_FLEX_REASON_L2_DST_LOOKUP 5          /* <UNDEF> */
    322 #define BCM_PKTIO_RXPMD_FLEX_REASON_L3_DST_LOOKUP_MISS 6          /* <UNDEF> */
    323 #define BCM_PKTIO_RXPMD_FLEX_REASON_L3_DST_LOOKUP 7          /* <UNDEF> */
    324 #define BCM_PKTIO_RXPMD_FLEX_REASON_L3_HDR_ERROR 8          /* <UNDEF> */
    325 #define BCM_PKTIO_RXPMD_FLEX_REASON_L3_TTL_ERROR 9          /* <UNDEF> */
    326 #define BCM_PKTIO_RXPMD_FLEX_REASON_IPMC_L3_IIF_OR_RPA_ID_CHECK_FAILED 10         /* <UNDEF> */
    327 #define BCM_PKTIO_RXPMD_FLEX_REASON_LEARN_CACHE_FULL 11         /* <UNDEF> */
    328 #define BCM_PKTIO_RXPMD_FLEX_REASON_VFP     12         /* <UNDEF> */
    329 #define BCM_PKTIO_RXPMD_FLEX_REASON_IFP     13         /* <UNDEF> */
    330 #define BCM_PKTIO_RXPMD_FLEX_REASON_IFP_METER 14         /* <UNDEF> */
    331 #define BCM_PKTIO_RXPMD_FLEX_REASON_DST_FP  15         /* <UNDEF> */
    332 #define BCM_PKTIO_RXPMD_FLEX_REASON_SVP     16         /* <UNDEF> */
    333 #define BCM_PKTIO_RXPMD_FLEX_REASON_EM_FT   17         /* <UNDEF> */
    334 #define BCM_PKTIO_RXPMD_FLEX_REASON_IVXLT   18         /* <UNDEF> */
    335 #define BCM_PKTIO_RXPMD_FLEX_REASON_MATCHED_RULE_BIT_0 19         /* <UNDEF> */
    336 #define BCM_PKTIO_RXPMD_FLEX_REASON_MATCHED_RULE_BIT_1 20         /* <UNDEF> */
    337 #define BCM_PKTIO_RXPMD_FLEX_REASON_MATCHED_RULE_BIT_2 21         /* <UNDEF> */
    338 #define BCM_PKTIO_RXPMD_FLEX_REASON_MATCHED_RULE_BIT_3 22         /* <UNDEF> */
    339 #define BCM_PKTIO_RXPMD_FLEX_REASON_MATCHED_RULE_BIT_4 23         /* <UNDEF> */
    340 #define BCM_PKTIO_RXPMD_FLEX_REASON_MATCHED_RULE_BIT_5 24         /* <UNDEF> */
    341 #define BCM_PKTIO_RXPMD_FLEX_REASON_MATCHED_RULE_BIT_6 25         /* <UNDEF> */
    342 #define BCM_PKTIO_RXPMD_FLEX_REASON_MATCHED_RULE_BIT_7 26         /* <UNDEF> */
    343 #define BCM_PKTIO_RXPMD_FLEX_REASON_NO_COPY_TO_CPU 27         /* <UNDEF> */
    344 #define BCM_PKTIO_RXPMD_FLEX_REASON_L2_SRC_DISCARD 28         /* <UNDEF> */
    345 #define BCM_PKTIO_RXPMD_FLEX_REASON_MACSA_MULTICAST 29         /* <UNDEF> */
    346 #define BCM_PKTIO_RXPMD_FLEX_REASON_MEMBERSHIP_CHECK_FAILED 30         /* <UNDEF> */
    347 #define BCM_PKTIO_RXPMD_FLEX_REASON_SPANNING_TREE_CHECK_FAILED 31         /* <UNDEF> */
    348 #define BCM_PKTIO_RXPMD_FLEX_REASON_MIRROR_SAMPLER_SAMPLED 32         /* <UNDEF> */
    349 #define BCM_PKTIO_RXPMD_FLEX_REASON_MIRROR_SAMPLER_EGR_SAMPLED 33         /* <UNDEF> */
    350 #define BCM_PKTIO_RXPMD_FLEX_REASON_SER_DROP 34         /* <UNDEF> */
    351 #define BCM_PKTIO_RXPMD_FLEX_REASON_URPF_CHECK_FAILED 35         /* <UNDEF> */
    352 #define BCM_PKTIO_RXPMD_FLEX_REASON_L3_IIF_EQ_L3_OIF 36         /* <UNDEF> */
    353 #define BCM_PKTIO_RXPMD_FLEX_REASON_DLB_ECMP_MONITOR_EN_OR_MEMBER_REASSINED 37         /* <UNDEF> */
    354 #define BCM_PKTIO_RXPMD_FLEX_REASON_DLB_LAG_MONITOR_EN_OR_MEMBER_REASSINED 38         /* <UNDEF> */
    355 #define BCM_PKTIO_RXPMD_FLEX_REASON_MPLS_CTRL_PKT_TO_CPU 39         /* <UNDEF> */
    356 #define BCM_PKTIO_RXPMD_FLEX_REASON_MTOP_IPV4_GATEWAY 40         /* <UNDEF> */
    357 #define BCM_PKTIO_RXPMD_FLEX_REASON_DLB_ECMP_PKT_SAMPLED 41         /* <UNDEF> */
    358 #define BCM_PKTIO_RXPMD_FLEX_REASON_DLB_LAG_PKT_SAMPLED 42         /* <UNDEF> */
    359 #define BCM_PKTIO_RXPMD_FLEX_REASON_TRACE_DO_NOT_MIRROR 43         /* <UNDEF> */
    360 #define BCM_PKTIO_RXPMD_FLEX_REASON_TRACE_DO_NOT_COPY_TO_CPU 44         /* <UNDEF> */
    361 #define BCM_PKTIO_RXPMD_FLEX_REASON_TRACE_DOP 45         /* <UNDEF> */
    362 #define BCM_PKTIO_RXPMD_FLEX_REASON_L2_SRC_LEARN 46         /* <UNDEF> */
    363 #define BCM_PKTIO_RXPMD_FLEX_REASON_L2_SRC_RELEARN 47         /* <UNDEF> */
    364 #define BCM_PKTIO_RXPMD_FLEX_REASON_COUNT   48         /* <UNDEF> */
    365 
    366 #define BCM_PKTIO_REASON_COUNTS BCM_PKTIO_BITMAP_WORD_SIZE * 32 /* Reason id number. */
    367 
    368 /* Packet reasons bitmap. */
    369 typedef struct bcm_pktio_reasons_s {
    370     bcm_pktio_bitmap_t rx_reasons;      /* Packet rx reasons bitmap. */
    371     bcm_pktio_bitmap_t flex_reasons;    /* Packet flex reasons bitmap. */
    372 } bcm_pktio_reasons_t;
    373 
    374 #ifndef BCM_HIDE_DISPATCHABLE
    375 
    376 /* Get RX reasons from RXPMD and RXFLEXPMD. */
    377 extern int bcm_pktio_pmd_reasons_get(
    378     int unit, 
    379     bcm_pktio_pkt_t *packet, 
    380     bcm_pktio_reasons_t *reasons);
    381 
    382 /* Set RX reasons into pmd data. */
    383 extern int bcm_pktio_raw_pmd_reasons_set(
    384     int unit, 
    385     bcm_pktio_pmd_t *pmd, 
    386     bcm_pktio_reasons_t *reasons);
    387 
    388 /* Get RX reasons from pmd data. */
    389 extern int bcm_pktio_raw_pmd_reasons_get(
    390     int unit, 
    391     bcm_pktio_pmd_t *pmd, 
    392     bcm_pktio_reasons_t *reasons);
    393 
    394 #endif /* BCM_HIDE_DISPATCHABLE */
    395 
    396 /* 
    397  * Macro to check if a reason is included in a set of reasons.
    398  * 
    399  * Returns:
    400  *   zero     => reason is not included in the set
    401  *   non-zero => reason is included in the set
    402  */
    403 #define BCM_PKTIO_REASON_GET(_reasons, _reason)  \
    404     SHR_BITGET(((_reasons).pbits), (_reason)) 
    405 
    406 /* Macro to add a reason to a set of reasons. */
    407 #define BCM_PKTIO_REASON_SET(_reasons, _reason)  \
    408     SHR_BITSET(((_reasons).pbits), (_reason)) 
    409 
    410 /* Macro to add all reasons to a set of reasons. */
    411 #define BCM_PKTIO_REASON_SET_ALL(_reasons)  \
    412     SHR_BITSET_RANGE(((_reasons).pbits), 0, BCM_PKTIO_REASON_COUNTS) 
    413 
    414 /* Macro to clear a reason from a set of reasons. */
    415 #define BCM_PKTIO_REASON_CLEAR(_reasons, _reason)  \
    416     SHR_BITCLR(((_reasons).pbits), (_reason)) 
    417 
    418 /* Macro to clear a set of reasons. */
    419 #define BCM_PKTIO_REASON_CLEAR_ALL(_reasons)  \
    420     SHR_BITCLR_RANGE(((_reasons).pbits), 0, BCM_PKTIO_REASON_COUNTS) 
    421 
    422 /* Macro to check if a set of reasons is empty. */
    423 #define BCM_PKTIO_REASON_IS_NULL(_reasons)  \
    424     SHR_BITNULL_RANGE(((_reasons).pbits), 0, BCM_PKTIO_REASON_COUNTS) 
    425 
    426 /* Macro to itterate over a set of reasons. */
    427 #define BCM_PKTIO_REASON_ITER(_reasons, _reason)  \
    428     for((_reason) = BCM_PKTIO_REASON_NONE; \
    429         (_reason) < BCM_PKTIO_REASON_COUNTS; \
    430         (_reason)++) \
    431         if(BCM_PKTIO_REASON_GET(_reasons, _reason)) 
    432 
    433 /* Macro to count number of active reasons in a set of reasons. */
    434 #define BCM_PKTIO_REASON_COUNT(_reasons, _count)  \
    435     SHR_BITCOUNT_RANGE(((_reasons).pbits), _count, 0, BCM_PKTIO_REASON_COUNTS) 
    436 
    437 /* Macro to compare two sets of reasons. */
    438 #define BCM_PKTIO_REASON_EQ(_reasons1, _reasons2)  \
    439     SHR_BITEQ_RANGE(((_reasons1).pbits), ((_reasons2).pbits), \
    440                     0, BCM_PKTIO_REASON_COUNTS) 
    441 
    442 #define BCM_PKTIO_MATCH_ID_NONE 0          /* No match id. */
    443 
    444 #define BCM_PKTIO_MATCH_ID_INNER_L2_HDR_ETAG 0          /* Inner l2 hdr etag */
    445 #define BCM_PKTIO_MATCH_ID_INNER_L2_HDR_ITAG 1          /* Inner l2 hdr itag */
    446 #define BCM_PKTIO_MATCH_ID_INNER_L2_HDR_L2  2          /* Inner l2 hdr l2 */
    447 #define BCM_PKTIO_MATCH_ID_INNER_L2_HDR_OTAG 3          /* Inner l2 hdr otag */
    448 #define BCM_PKTIO_MATCH_ID_INNER_L2_HDR_SNAP_OR_LLC 4          /* Inner l2 hdr snap or
    449                                                           llc */
    450 #define BCM_PKTIO_MATCH_ID_INNER_L2_HDR_VNTAG 5          /* Inner l2 hdr vntag */
    451 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_ARP 6          /* Inner l3 l4 hdr arp */
    452 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_AUTH_EXT_1 7          /* Inner l3 l4 hdr auth
    453                                                           ext 1 */
    454 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_AUTH_EXT_2 8          /* Inner l3 l4 hdr auth
    455                                                           ext 2 */
    456 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_BFD 9          /* Inner l3 l4 hdr bfd */
    457 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_ESP_EXT 10         /* Inner l3 l4 hdr esp
    458                                                           ext */
    459 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_ETHERTYPE 11         /* Inner l3 l4 hdr
    460                                                           ethertype */
    461 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_FRAG_EXT_1 12         /* Inner l3 l4 hdr frag
    462                                                           ext 1 */
    463 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_FRAG_EXT_2 13         /* Inner l3 l4 hdr frag
    464                                                           ext 2 */
    465 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_ICMP 14         /* Inner l3 l4 hdr icmp */
    466 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_IGMP 15         /* Inner l3 l4 hdr igmp */
    467 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_IPV4 16         /* Inner l3 l4 hdr ipv4 */
    468 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_IPV6 17         /* Inner l3 l4 hdr ipv6 */
    469 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_P_1588 18         /* Inner l3 l4 hdr p 1588 */
    470 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_RARP 19         /* Inner l3 l4 hdr rarp */
    471 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_TCP_FIRST_4BYTES 20         /* Inner l3 l4 hdr tcp
    472                                                           first 4bytes */
    473 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_TCP_LAST_16BYTES 21         /* Inner l3 l4 hdr tcp
    474                                                           last 16bytes */
    475 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_UDP 22         /* Inner l3 l4 hdr udp */
    476 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_UNKNOWN_L3 23         /* Inner l3 l4 hdr
    477                                                           unknown l3 */
    478 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_UNKNOWN_L4 24         /* Inner l3 l4 hdr
    479                                                           unknown l4 */
    480 #define BCM_PKTIO_MATCH_ID_INNER_L3_L4_HDR_UNKNOWN_L5 25         /* Inner l3 l4 hdr
    481                                                           unknown l5 */
    482 #define BCM_PKTIO_MATCH_ID_OUTER_L2_HDR_ETAG 26         /* Outer l2 hdr etag */
    483 #define BCM_PKTIO_MATCH_ID_OUTER_L2_HDR_HG3_BASE 27         /* Outer l2 hdr hg3 base */
    484 #define BCM_PKTIO_MATCH_ID_OUTER_L2_HDR_HG3_EXT_0 28         /* Outer l2 hdr hg3 ext 0 */
    485 #define BCM_PKTIO_MATCH_ID_OUTER_L2_HDR_ITAG 29         /* Outer l2 hdr itag */
    486 #define BCM_PKTIO_MATCH_ID_OUTER_L2_HDR_L2  30         /* Outer l2 hdr l2 */
    487 #define BCM_PKTIO_MATCH_ID_OUTER_L2_HDR_OTAG 31         /* Outer l2 hdr otag */
    488 #define BCM_PKTIO_MATCH_ID_OUTER_L2_HDR_SNAP_OR_LLC 32         /* Outer l2 hdr snap or
    489                                                           llc */
    490 #define BCM_PKTIO_MATCH_ID_OUTER_L2_HDR_VNTAG 33         /* Outer l2 hdr vntag */
    491 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_ARP 34         /* Outer l3 l4 hdr arp */
    492 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_AUTH_EXT_1 35         /* Outer l3 l4 hdr auth
    493                                                           ext 1 */
    494 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_AUTH_EXT_2 36         /* Outer l3 l4 hdr auth
    495                                                           ext 2 */
    496 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_BFD 37         /* Outer l3 l4 hdr bfd */
    497 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_ESP_EXT 38         /* Outer l3 l4 hdr esp
    498                                                           ext */
    499 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_ETHERTYPE 39         /* Outer l3 l4 hdr
    500                                                           ethertype */
    501 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_FRAG_EXT_1 40         /* Outer l3 l4 hdr frag
    502                                                           ext 1 */
    503 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_FRAG_EXT_2 41         /* Outer l3 l4 hdr frag
    504                                                           ext 2 */
    505 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_GPE 42         /* Outer l3 l4 hdr gpe */
    506 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_GRE 43         /* Outer l3 l4 hdr gre */
    507 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_GRE_CHKSUM 44         /* Outer l3 l4 hdr gre
    508                                                           chksum */
    509 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_GRE_KEY 45         /* Outer l3 l4 hdr gre
    510                                                           key */
    511 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_GRE_ROUT 46         /* Outer l3 l4 hdr gre
    512                                                           rout */
    513 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_GRE_SEQ 47         /* Outer l3 l4 hdr gre
    514                                                           seq */
    515 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_ICMP 48         /* Outer l3 l4 hdr icmp */
    516 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_IFA_METADATA 49         /* Outer l3 l4 hdr ifa
    517                                                           metadata */
    518 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_IGMP 50         /* Outer l3 l4 hdr igmp */
    519 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_IPV4 51         /* Outer l3 l4 hdr ipv4 */
    520 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_IPV6 52         /* Outer l3 l4 hdr ipv6 */
    521 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_MPLS0 53         /* Outer l3 l4 hdr mpls0 */
    522 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_MPLS1 54         /* Outer l3 l4 hdr mpls1 */
    523 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_MPLS2 55         /* Outer l3 l4 hdr mpls2 */
    524 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_MPLS3 56         /* Outer l3 l4 hdr mpls3 */
    525 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_MPLS4 57         /* Outer l3 l4 hdr mpls4 */
    526 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_MPLS5 58         /* Outer l3 l4 hdr mpls5 */
    527 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_MPLS6 59         /* Outer l3 l4 hdr mpls6 */
    528 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_MPLS_ACH 60         /* Outer l3 l4 hdr mpls
    529                                                           ach */
    530 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_MPLS_CW 61         /* Outer l3 l4 hdr mpls
    531                                                           cw */
    532 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_P_1588 62         /* Outer l3 l4 hdr p 1588 */
    533 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_RARP 63         /* Outer l3 l4 hdr rarp */
    534 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_TCP_FIRST_4BYTES 64         /* Outer l3 l4 hdr tcp
    535                                                           first 4bytes */
    536 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_TCP_LAST_16BYTES 65         /* Outer l3 l4 hdr tcp
    537                                                           last 16bytes */
    538 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_UDP 66         /* Outer l3 l4 hdr udp */
    539 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_UNKNOWN_L3 67         /* Outer l3 l4 hdr
    540                                                           unknown l3 */
    541 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_UNKNOWN_L4 68         /* Outer l3 l4 hdr
    542                                                           unknown l4 */
    543 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_UNKNOWN_L5 69         /* Outer l3 l4 hdr
    544                                                           unknown l5 */
    545 #define BCM_PKTIO_MATCH_ID_OUTER_L3_L4_HDR_VXLAN 70         /* Outer l3 l4 hdr vxlan */
    546 #define BCM_PKTIO_MATCH_ID_SYS_HDR_LOOPBACK 71         /* Sys hdr loopback */
    547 #define BCM_PKTIO_MATCH_ID_COUNT            72         /* Maximum match id
    548                                                           count, always last */
    549 
    550 #ifndef BCM_HIDE_DISPATCHABLE
    551 
    552 /* Get packet format from the match ID array. */
    553 extern int bcm_pktio_pmd_pkt_format_get(
    554     int unit, 
    555     int array_size, 
    556     uint32 *match_id_array, 
    557     int *count, 
    558     bcm_pktio_bitmap_t *pkt_format);
    559 
    560 #endif /* BCM_HIDE_DISPATCHABLE */
    561 
    562 /* 
    563  * Macro to check if a match id is included in a set of match ids.
    564  * 
    565  * Returns:
    566  *   zero     => match id is not included in the set
    567  *   non-zero => match id is included in the set
    568  */
    569 #define BCM_PKTIO_MATCH_ID_GET(_match_ids, _match_id)  \
    570     SHR_BITGET(((_match_ids).pbits), (_match_id)) 
    571 
    572 /* Macro to itterate over a set of match ids. */
    573 #define BCM_PKTIO_MATCH_ID_ITER(_match_ids, _match_id)  \
    574     for((_match_id) = BCM_PKTIO_MATCH_ID_NONE; \
    575         (_match_id) < BCM_PKTIO_MATCH_ID_COUNT; \
    576         (_match_id)++) \
    577         if(BCM_PKTIO_MATCH_ID_GET(_match_ids, _match_id)) 
    578 
    579 #define BCM_PKTIO_TX_MC_QUEUE   0x1        /* Indicates packet goes to MC queue. */
    580 
    581 /* Packet metadata. */
    582 typedef struct bcm_pktio_txpmd_s {
    583     bcm_port_t tx_port; /* TX port. */
    584     uint8 prio_int;     /* Internal priority of the packet. */
    585     uint8 cos;          /* The local COS queue to use. */
    586     uint32 flags;       /* BCM_PKTIO_TX_xxx flags. */
    587 } bcm_pktio_txpmd_t;
    588 
    589 #ifndef BCM_HIDE_DISPATCHABLE
    590 
    591 /* Transmit one packet. */
    592 extern int bcm_pktio_pmd_set(
    593     int unit, 
    594     bcm_pktio_pkt_t *packet, 
    595     bcm_pktio_txpmd_t *txpmd);
    596 
    597 /* Transmit one packet. */
    598 extern int bcm_pktio_tx(
    599     int unit, 
    600     bcm_pktio_pkt_t *packet);
    601 
    602 #endif /* BCM_HIDE_DISPATCHABLE */
    603 
    604 /* Return values from packet I/O RX callout routines. */
    605 typedef enum bcm_pktio_rx_e {
    606     BCM_PKTIO_RX_NOT_HANDLED = 0,   /* Packet not processed. Dispatcher will
    607                                        deliver it to the next callback. */
    608     BCM_PKTIO_RX_HANDLED = 1        /* Packet handled. Dispatcher will skip next
    609                                        callback. */
    610 } bcm_pktio_rx_t;
    611 
    612 /* Callback function type for applications using packet IO facility. */
    613 typedef bcm_pktio_rx_t (*bcm_pktio_rx_cb_f)(
    614     int unit, 
    615     bcm_pktio_pkt_t *packet, 
    616     void *cookie);
    617 
    618 #ifndef BCM_HIDE_DISPATCHABLE
    619 
    620 /* Register receive callbacks for received packets. */
    621 extern int bcm_pktio_rx_register(
    622     int unit, 
    623     const char *name, 
    624     bcm_pktio_rx_cb_f callback, 
    625     uint8 priority, 
    626     void *cookie, 
    627     uint32 flags);
    628 
    629 /* Unregister receive callbacks for received packets. */
    630 extern int bcm_pktio_rx_unregister(
    631     int unit, 
    632     bcm_pktio_rx_cb_f callback, 
    633     uint8 priority);
    634 
    635 #endif /* BCM_HIDE_DISPATCHABLE */
    636 
    637 #define BCM_PKTIO_NETIF_NAME_MAX        16         /* Maximum chars are allowed
    638                                                       in network interface name. */
    639 #define BCM_PKTIO_NETIF_USER_DATA_SIZE  64         /* Network interface user
    640                                                       data size in bytes. */
    641 
    642 #define BCM_PKTIO_NETIF_F_RCPU_ENCAP    (1 << 0)   /* RCPU header encapsulation
    643                                                       is used for delivering
    644                                                       packet metadata to/from
    645                                                       applications.
    646                                                       Applications should
    647                                                       encapsulate RCPU header
    648                                                       when transmitting packets
    649                                                       to the netif,
    650                                                       and may parser RCPU header
    651                                                       when receiving packets
    652                                                       from the netif. */
    653 #define BCM_PKTIO_NETIF_F_BIND_RX_CH    (1 << 1)   /* Bind this netif with a RX
    654                                                       DMA channel. All packets
    655                                                       from
    656                                                       the DMA channel will be
    657                                                       forwarded to this netif. */
    658 #define BCM_PKTIO_NETIF_F_BIND_TX_PORT  (1 << 2)   /* Bind this network
    659                                                       interface to a front-panel
    660                                                       switch port for
    661                                                       transmission.  All packets
    662                                                       from this network
    663                                                       interface will be
    664                                                       forwarded to the bound
    665                                                       switch port. */
    666 #define BCM_PKTIO_NETIF_F_ADD_TAG       (1 << 3)   /* Add VLAN tag for packets
    667                                                       transmitted via this
    668                                                       network interface. */
    669 
    670 /* Packet network interface structure. */
    671 typedef struct bcm_pktio_netif_s {
    672     int id;                             /* Network interface ID. */
    673     uint32 flags;                       /* Creation flag. Refer to
    674                                            BCM_PKTIO_NETIF_F_XXX flags. */
    675     bcm_mac_t mac_addr;                 /* MAC address associated with this
    676                                            network interface. */
    677     uint16 vlan;                        /* Default VLAN ID associated with this
    678                                            network interface. */
    679     bcm_port_t port;                    /* Bind with a network interface for
    680                                            transmit destination port. */
    681     char port_encap[10];                /* port_encap works with port to tell
    682                                            the encapsulation type of the port. */
    683     int port_queue;                     /* port_queue works with port to tell
    684                                            egress queue number. */
    685     int dma_chan_id;                    /* Bind a Rx DMA channel with this
    686                                            netif. */
    687     uint32 max_frame_size;              /* Max packet size is for this netif.
    688                                            Any packet which size is bigger than
    689                                            this setting will be dropped. */
    690     char name[BCM_PKTIO_NETIF_NAME_MAX]; /* Network interface name. */
    691     uint8 user_data[BCM_PKTIO_NETIF_USER_DATA_SIZE]; /* Network interface user data. */
    692 } bcm_pktio_netif_t;
    693 
    694 #ifndef BCM_HIDE_DISPATCHABLE
    695 
    696 /* Create a kernel network interface. */
    697 extern int bcm_pktio_netif_create(
    698     int unit, 
    699     bcm_pktio_netif_t *netif);
    700 
    701 /* Get a kernel network interface configuration. */
    702 extern int bcm_pktio_netif_get(
    703     int unit, 
    704     int netif_id, 
    705     bcm_pktio_netif_t *netif);
    706 
    707 /* Destroy a kernel network interface. */
    708 extern int bcm_pktio_netif_destroy(
    709     int unit, 
    710     int netif_id);
    711 
    712 #endif /* BCM_HIDE_DISPATCHABLE */
    713 
    714 #define BCM_PKTIO_NETIF_LINK_DOWN   0          /* Network interface link down. */
    715 #define BCM_PKTIO_NETIF_LINK_UP     1          /* Network interface link up. */
    716 
    717 #ifndef BCM_HIDE_DISPATCHABLE
    718 
    719 /* Set a kernel network interface link status. */
    720 extern int bcm_pktio_netif_link_status_set(
    721     int unit, 
    722     int netif_id, 
    723     int status);
    724 
    725 #endif /* BCM_HIDE_DISPATCHABLE */
    726 
    727 /* Network interface traverse callback function */
    728 typedef int (*bcm_pktio_netif_traverse_cb_f)(
    729     int unit, 
    730     bcm_pktio_netif_t *netif, 
    731     void *cb_data);
    732 
    733 #ifndef BCM_HIDE_DISPATCHABLE
    734 
    735 /* Traverse kernel network interface objects */
    736 extern int bcm_pktio_netif_traverse(
    737     int unit, 
    738     bcm_pktio_netif_traverse_cb_f cb_func, 
    739     void *cb_data);
    740 
    741 #endif /* BCM_HIDE_DISPATCHABLE */
    742 
    743 #define BCM_PKTIO_FILTER_T_RX_PKT   1          /* Packet filter for RX
    744                                                   direction. */
    745 
    746 #define BCM_PKTIO_FILTER_F_STRIP_TAG    0x00000001 /* Strip VLAN tag from
    747                                                       packets sent to virtual
    748                                                       network interfaces. */
    749 #define BCM_PKTIO_FILTER_F_ANY_DATA     0x00000002 /* Filter will match any
    750                                                       packet. */
    751 
    752 #define BCM_PKTIO_DEST_T_NULL       0          /* Null destination (drop
    753                                                   packet). */
    754 #define BCM_PKTIO_DEST_T_NETIF      1          /* Send packet to virtual network
    755                                                   interface. */
    756 #define BCM_PKTIO_DEST_T_BCM_RX_API 2          /* Send packet to BCM Rx API. */
    757 #define BCM_PKTIO_DEST_T_CALLBACK   3          /* Send packet to kernel 
    758                                                   call-back function. */
    759 
    760 #define BCM_PKTIO_FILTER_M_RAW          0x00000001 /* Match raw packet data. */
    761 #define BCM_PKTIO_FILTER_M_VLAN         0x00000002 /* Match VLAN ID. */
    762 #define BCM_PKTIO_FILTER_M_INGPORT      0x00000004 /* Match local ingress port. */
    763 #define BCM_PKTIO_FILTER_M_SRC_MODPORT  0x00000008 /* Match source module port. */
    764 #define BCM_PKTIO_FILTER_M_SRC_MODID    0x00000010 /* Match source module ID. */
    765 #define BCM_PKTIO_FILTER_M_REASON       0x00000020 /* Match copy-to-CPU reason
    766                                                       code */
    767 #define BCM_PKTIO_FILTER_M_FP_RULE      0x00000040 /* Match filter processor
    768                                                       rule number. */
    769 #define BCM_PKTIO_FILTER_M_ERROR        0x00000080 /* Match error bit. */
    770 #define BCM_PKTIO_FILTER_M_CPU_QUEUE    0x00000100 /* Match CPU queue (rx
    771                                                       queue). */
    772 #define BCM_PKTIO_FILTER_M_PMD          0x00000200 /* Match pmd data. */
    773 
    774 #define BCM_PKTIO_FILTER_DESC_MAX       32         /* Filter description maximum
    775                                                       size. */
    776 #define BCM_PKTIO_FILTER_SIZE_MAX       256        /* Packet raw data maximum
    777                                                       size. */
    778 #define BCM_PKTIO_FILTER_USER_DATA_SIZE 64         /* Filter user data size in
    779                                                       bytes. */
    780 
    781 /* Packet filter structure. */
    782 typedef struct bcm_pktio_filter_s {
    783     int id;                             /* Filter ID. */
    784     uint32 type;                        /* Filter type. Refer to
    785                                            BCM_PKTIO_FILTER_T_XXX. */
    786     uint32 flags;                       /* Filter flags. Refer to
    787                                            BCM_PKTIO_FILTER_F_XXX. */
    788     uint32 priority;                    /* Filter priority (0 is highest). */
    789     uint32 dest_type;                   /* Destination type. Refer to
    790                                            BCM_PKTIO_DEST_T_XXX. */
    791     int dest_id;                        /* Filter destination ID. */
    792     uint16 dest_proto;                  /* If non-zero this value overrides the
    793                                            default protocol type when matching
    794                                            packet is passed to network stack. */
    795     uint32 mirror_type;                 /* Destination type. Refer to
    796                                            BCM_PKTIO_DEST_T_XXX. */
    797     int mirror_id;                      /* Mirror destination ID. */
    798     uint16 mirror_proto;                /* If non-zero this value overrides the
    799                                            default protocol type when matching
    800                                            packet is passed to network stack. */
    801     int dma_chan;                       /* Source RX DMA channel to match. */
    802     uint32 match_flags;                 /* Refert to BCM_PKTIO_FILTER_M_XXX. */
    803     char desc[BCM_PKTIO_FILTER_DESC_MAX]; /* Filter description (optional). */
    804     uint16 m_vlan;                      /* VLAN ID to match. */
    805     bcm_port_t m_ingport;               /* Local ingress port to match. */
    806     bcm_port_t m_src_modport;           /* Source module port to match. */
    807     int m_src_modid;                    /* Source module ID to match. */
    808     int m_cpu_queue;                    /* Source CPU port queue to match. */
    809     bcm_pktio_bitmap_t m_reason;        /* Copy-to-CPU reason to match. */
    810     bcm_pktio_bitmap_t m_flex_reason;   /* Copy-to-CPU flex reason to match. */
    811     uint32 m_fp_rule;                   /* Filter processor rule to match. */
    812     bcm_pktio_pmd_t m_pmd_data;         /* Pmd data to match. */
    813     bcm_pktio_pmd_t m_pmd_mask;         /* Pmd data mask to match. */
    814     uint32 raw_size;                    /* Size of valid raw data and mask. */
    815     uint8 m_raw_data[BCM_PKTIO_FILTER_SIZE_MAX]; /* Raw data to match. */
    816     uint8 m_raw_mask[BCM_PKTIO_FILTER_SIZE_MAX]; /* Raw data mask to match. */
    817     uint8 user_data[BCM_PKTIO_FILTER_USER_DATA_SIZE]; /* User data. */
    818 } bcm_pktio_filter_t;
    819 
    820 extern void bcm_pktio_filter_t_init(
    821     bcm_pktio_filter_t *filter);
    822 
    823 #ifndef BCM_HIDE_DISPATCHABLE
    824 
    825 /* Create a kernel packet filter. */
    826 extern int bcm_pktio_filter_create(
    827     int unit, 
    828     bcm_pktio_filter_t *filter);
    829 
    830 /* Get a kernel packet filter configuration. */
    831 extern int bcm_pktio_filter_get(
    832     int unit, 
    833     int filter_id, 
    834     bcm_pktio_filter_t *filter);
    835 
    836 /* Destroy a kernel packet filter. */
    837 extern int bcm_pktio_filter_destroy(
    838     int unit, 
    839     int filter_id);
    840 
    841 #endif /* BCM_HIDE_DISPATCHABLE */
    842 
    843 /* Network interface traverse callback function */
    844 typedef int (*bcm_pktio_filter_traverse_cb_f)(
    845     int unit, 
    846     bcm_pktio_filter_t *filter, 
    847     void *cb_data);
    848 
    849 #ifndef BCM_HIDE_DISPATCHABLE
    850 
    851 /* Traverse kernel packet filter objects */
    852 extern int bcm_pktio_filter_traverse(
    853     int unit, 
    854     bcm_pktio_filter_traverse_cb_f cb_func, 
    855     void *cb_data);
    856 
    857 #endif /* BCM_HIDE_DISPATCHABLE */
    858 
    859 #define BCM_PKTIO_TRACE_LEARN   0x1        /* Learning enable on trace packet. */
    860 #define BCM_PKTIO_TRACE_NO_IFP  0x2        /* Disable ingress field processor
    861                                               lookup on trace packet. */
    862 #define BCM_PKTIO_TRACE_DROP_TM 0x4        /* Drop trace packet to TM. */
    863 
    864 /* Trace information used to construct trace packet. */
    865 typedef struct bcm_pktio_trace_pkt_s {
    866     uint32 flags;       /* Trace flags refer to BCM_PKTIO_TRACE_XXX. */
    867     bcm_port_t port;    /* Local front panel port that acts as a masquerade
    868                            port. */
    869     int len;            /* Trace packet length. */
    870     uint8 *pkt;         /* Trace packet data. */
    871 } bcm_pktio_trace_pkt_t;
    872 
    873 #define BCM_PKTIO_TRACE_SIZE_BYTES  112        /* Maximum size of raw trace data
    874                                                   (in bytes). */
    875 
    876 /* Raw trace data. */
    877 typedef struct bcm_pktio_trace_data_s {
    878     uint32 len;                         /* Amount of available trace data. */
    879     uint8 buf[BCM_PKTIO_TRACE_SIZE_BYTES]; /* Trace data buffer. */
    880 } bcm_pktio_trace_data_t;
    881 
    882 #ifndef BCM_HIDE_DISPATCHABLE
    883 
    884 /* Send out a trace packet and get trace raw data. */
    885 extern int bcm_pktio_trace_data_collect(
    886     int unit, 
    887     bcm_pktio_trace_pkt_t *trace_pkt, 
    888     bcm_pktio_trace_data_t *trace_data);
    889 
    890 /* Get value of an trace info field. */
    891 extern int bcm_pktio_trace_field_get(
    892     int unit, 
    893     bcm_pktio_trace_data_t *trace_data, 
    894     int fid, 
    895     uint32 *val);
    896 
    897 /* 
    898  * Get drop reason of trace info. Setting all bits 1 in trace_data can
    899  * get supported drop reason bitmap.
    900  */
    901 extern int bcm_pktio_trace_drop_reasons_get(
    902     int unit, 
    903     bcm_pktio_trace_data_t *trace_data, 
    904     bcm_pktio_bitmap_t *bitmap);
    905 
    906 /* 
    907  * Get counter of trace info. Setting all bits 1 in trace_data can get
    908  * supported trace counter bitmap.
    909  */
    910 extern int bcm_pktio_trace_counter_get(
    911     int unit, 
    912     bcm_pktio_trace_data_t *trace_data, 
    913     bcm_pktio_bitmap_t *bitmap);
    914 
    915 #endif /* BCM_HIDE_DISPATCHABLE */
    916 
    917 #define BCM_PKTIO_TRACE_BITMAP_GET(_bitmap, _bit)  \
    918     SHR_BITGET(((_bitmap).pbits), (_bit)) 
    919 
    920 #define BCM_PKTIO_TRACE_BITMAP_SET(_bitmap, _bit)  \
    921     SHR_BITSET(((_bitmap).pbits), (_bit)) 
    922 
    923 #define BCM_PKTIO_TRACE_BITMAP_CLEAR_ALL(_bitmap)  \
    924     SHR_BITCLR_RANGE(((_bitmap).pbits), 0, BCM_PKTIO_BITMAP_WORD_SIZE * 32) 
    925 
    926 #ifndef BCM_HIDE_DISPATCHABLE
    927 
    928 /* Send out a trace packet. */
    929 extern int bcm_pktio_trace_tx(
    930     int unit, 
    931     bcm_pktio_trace_pkt_t *trace_pkt);
    932 
    933 /* Collect DOP raw data. */
    934 extern int bcm_pktio_trace_dop_data_collect(
    935     int unit, 
    936     bcm_port_t port, 
    937     uint32 dop_id, 
    938     bcm_pktio_trace_data_t *trace_data);
    939 
    940 /* Initialize packet IO module. */
    941 extern int bcm_pktio_init(
    942     int unit);
    943 
    944 /* Cleanup packet IO module. */
    945 extern int bcm_pktio_cleanup(
    946     int unit);
    947 
    948 #endif /* BCM_HIDE_DISPATCHABLE */
    949 
    950 #endif /* __BCM_PKTIO_H__ */