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__ */