NOTICE OF RELOCATION
[keystone-rtos/pa-lld.git] / pa.h
1 #ifndef _PA_H
2 #define _PA_H
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
8 /* System level header files */
9 #include <stdint.h>
10 #include <stdlib.h>
12 /* 
13  * Shut off: remark #880-D: parameter "descType" was never referenced
14  *
15  * This is better than removing the argument since removal would break
16  * backwards compatibility
17  */
18 #ifdef _TMS320C6X
19 #pragma diag_suppress 880
20 #pragma diag_suppress 681
21 #elif defined(__GNUC__)
22 /* Same for GCC:
23  * warning: unused parameter descType [-Wunused-parameter]
24  * expectation is all these catch up with some other intelligent 
25  * tools like coverity, Klocwork etc, instead of dump GNU 
26  * warnings
27  */
28 #pragma GCC diagnostic push
29 #pragma GCC diagnostic ignored "-Wunused-parameter"
30 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
31 #endif
34 #include <ti/drv/pa/paver.h>
36 /* ============================================================= */
37 /**
38  *   @file  pa.h
39  *
40  *   path  ti/drv/pa/pa.h
41  *
42  *   @brief  Packet Accelerator (PA) sub-system LLD API and Data Definitions
43  *
44  *  ============================================================================
45  *  Copyright (c) Texas Instruments Incorporated 2009-2014
46  * 
47  *  Redistribution and use in source and binary forms, with or without 
48  *  modification, are permitted provided that the following conditions 
49  *  are met:
50  *
51  *    Redistributions of source code must retain the above copyright 
52  *    notice, this list of conditions and the following disclaimer.
53  *
54  *    Redistributions in binary form must reproduce the above copyright
55  *    notice, this list of conditions and the following disclaimer in the 
56  *    documentation and/or other materials provided with the   
57  *    distribution.
58  *
59  *    Neither the name of Texas Instruments Incorporated nor the names of
60  *    its contributors may be used to endorse or promote products derived
61  *    from this software without specific prior written permission.
62  *
63  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
64  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
65  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
66  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
67  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
68  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
69  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
70  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
71  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
72  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
73  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
74  *
75 */
76  
77 /**  @mainpage Packet Accelerator Low Level Driver
78  *
79  *   \image html doxydoc.wmf
80  *
81  *   @section intro  Introduction
82  *
83  *   The packet accelerator sub-system (PASS) is designed to provide the input packet classification, checksum/CRC 
84  *   verification and generation, data manipulation and etc. The first generation PASS consists of the following 
85  *   resources
86  *      - Six PDSPs for packet and command processing
87  *      - Three 64-entry LUT1 (connected to PDSP0, PDSP1 and PDSP2) for Layer 2/3 or custom LUT1 lookup
88  *      - One 8192-entry LUT2 (connected to PDSP3) for Layer 4/5 or custom LUT2 lookup
89  *      - Six programmable CRC engines (connected to each PDSP respectively) for CRC computation and verification
90  *      - Six 16-bit general purpose timers
91  *
92  *   The packet accelerator low level driver (PA LLD) provides configuration and control of the packet accelerator
93  *   sub-system (PASS). The sub-system provides from network packet classification and routing based on  
94  *   network header information (see @ref netlayers). The packet accelerator low level driver module 
95  *   (referred to as the module) provides APIs to configure the criteria used for from-network packet
96  *   routing.
97  *
98  *   The module attempts to abstract the operation of the PASS from the application. The module uses the following rules 
99  *   when configuring the PASS:
100  *      - All received packets from Ethernet and/or SRIO are routed to PDSP0
101  *      - PDSP0 does L0-L2 (MAC/SRIO) lookup using LUT1-0. If the packet is IP, it is forwarded to PDSP1
102  *      - PDSP1 does the outer IP or Custom LUT1 lookup using LUT1-1
103  *      - PDSP2 does any subsequent IP or Custom LUT1 lookup using LUT1-2
104  *      - PDSP3 does all TCP/UDP and Custom LUT2 lookup using LUT2
105  *      - PDSP4 is used for post-lookup processes such as checksum/CRC result verification.
106  *      - PDSP4/5 can be used for pre-transmission operation such as transmit checksum generation.
107  *
108  *   With the exception of some initial setup functions, the module does not communicate directly with
109  *   the sub-system. The output of the module is a formatted data block along with a destination address.
110  *   The module user must send the formatted data to the sub-system. This is typically done by linking the
111  *   created data block to a host packet descriptor, and then using the addressing information to send
112  *   the created packet to the sub-system through the queue manager and PKTDMA.
113  *
114  *   For packets to the network, the sub-system provides ones complement checksum or CRC generation over
115  *   a range provided by the module user. The range is not determined by sub-system by parsing the
116  *   to-network packet, since it is assumed that the creator of the packet already has the start offset,
117  *   length, initial checksum value and etc.
118  *
119  *   The low level driver maintains two tables of layer 2 and layer 3 configuration information. The memory 
120  *   for these tables is provided by the module user at run time. The module maintains ownership of these 
121  *   tables and the module user must not write to the memory once provided to the module.
122  *
123  *   In multi-core devices the module can be used in two different configurations. In independent core
124  *   mode each core in a device has a unique set of tables. Although it is legal for any core to
125  *   reference handles from other cores, this is not typically done. In this case cache coherency and
126  *   cross core semaphores are not implemented by the module user. In common core mode there is only
127  *   one set of tables and they are shared by all cores. Each core that uses the module must initialize
128  *   it, but each core will provide the exact same buffers to the module. The module user will have
129  *   the first core to initialize the module also initialize the table. Other cores will initialize their
130  *   internal state but not initialize the table. In this mode @ref cache coherency and cross core @ref semaphores
131  *   must be implemented by the module user to insure the integrity of the tables.
132  *
133  *   The second generation of the packet accelerator sub-system (PASS) of the new Keystone2 device is enhanced to
134  *   support fully-offloaded fast-path operations in both ingress and egress directions. The second generation PASS 
135  *   provides the following functionalities:
136  *      - Ethernet and SRIO packet classification
137  *      - Stateless L3/L4 Firewall (ACL)
138  *      - Outer and Inner IP packet classification
139  *      - Ethernet OAM classification
140  *      - Outer and inner IP reassembly
141  *      - TCP/UDP/GTPU based LUT2 classification
142  *      - IPv4 and TCP/UDP checksum generation and verification
143  *      - SCTP or custom CRC generation and verification
144  *      - Programmable system statistics
145  *      - Post-Classification operation such as packet patch, protocol header and/or trailer removal
146  *      - Egress or forwarding traffic flow cache operations
147  *          - Inner IP L3/L4 patching
148  *          - Inner IP fragmentation
149  *          - Outer IP insertion/update 
150  *          - Pre-IPSEC and Post-IPSEC processing
151  *          - Outer IP fragmentation
152  *          - L2 header insertion/update
153  *
154  *   The second generation PASS consists of five ingress stages (Ingress0-4), a post-processing stage (Post) 
155  *   and three egress stages (Egress 0-2). Each stage has its intended function, which is described briefly in 
156  *   the sub-sections below.  Ingress packets (from the Ethernet Switch through PA to the host) are expected to 
157  *   follow the flow Ingress 0 -> Ingress 1 -> Ingress 2 -> Ingress 3-> Ingress 4 -> Post -> Host.  Egress packets 
158  *   (from the host through PA out the switch) are expected to follow the flow Egress 0 -> Egress 1 -> Egress 2 -> 
159  *   Ethernet Switch.  Ingress packets can be directly routed to egress path without host intervention. The packets 
160  *   can also be routed between PASS and SASS (Security Accelerator sub-system) multiple times to perform encryption,  
161  *   decryption and authentication operation. 
162  *      - Ingress 0 (2 PDSPs and 2 256-entry LUT1 engines): 
163  *         - PDSP0 and LUT1_0: SRIO/MAC header parsing and classification
164  *         - PDSP1 and LUT1_1 (normal mode): L3/L4 header parsing and pre-IPSEC firewall (ACL) lookup
165  *         - PDSP1 and LUT1_1 (Eoam mode): L2 header parsing and Ethernet OAM lookup.
166  *      - Ingress 1 (2 PDSPs and 2 256-entry LUT1 engines):
167  *        - PDSP0 and LUT1_0: Outer IP or custom header parsing and classification
168  *        - PDSP1 and LUT1_1: IPSEC NAT-T detection, IPSEC header parsing and classification
169  *      - Ingress 2 (1 PDSP and 1 256-entry LUT1 engine):
170  *        - PDSP0 and LUT1_0: 2nd IPSEC Header parsing and classification
171  *      - Ingress 3 (1 PDSP and 1 256-entry LUT1 engine):
172  *        - PDSP0 and LUT1_0: L3/L4 hearer parsing and post-IPSEC firewall (ACL) lookup
173  *      - Ingress 4 (2 PDSPs, 1 256-entry LUT1 engine and 1 3000-entry LUT2 engine)
174  *        - PDSP0 and LUT1_0: Inner IP or custom header parsing and classification
175  *        - PDSP1 and LUT2: TCP/UDP/GTPU/Custom header parsing and LUT2 lookup
176  *      - Post (2 PDSPs): Post-classification processing
177  *      - Egress 0 (3 PDSPs and 1 256-entry LUT1 engine)
178  *        - PDSP0: and LUT1_0: Inner L3/L4 header parsing and Flow cache lookup
179  *        - PDSP1: Inner L3/L4 Header update and Tx command processing
180  *        - PDSP2: Outer IP insertion/update, IPSEC pre-processing, inner IP fragmentation and Tx command processing
181  *      - Egress 1 (1 PDSP): NAT-T header insertion or IPSEC pre-processing
182  *      - Egress 2 (1 PDSP)  L2 header insertion/update and outer IP fragmentation
183  *  
184  *  The second generation PASS also provides a Reassembly engine (RA) which can be connected from Ingress 0 and Ingress 3
185  *  stage to perform outer and inner IP reassembly and the reassembled packets will be delivered to Ingress 1 and Ingress 4
186  *  stage respectively. Besides, there is a programmable statistics engine which is used to provide PASS system statistics, 
187  *  ACL and Flow cache pre-entry statistics and user-defined statistics.
188  *
189  *  To maintain backward compatibility, the second generation PASS LLD maintains the same APIs of the first generation LLD.
190  *  New APIs are added for the new features such as ACL, Flow Cache and etc only.
191  *
192  */
193  
194 /* Define PALLD Module as a master group in Doxygen format and add all PA LLD API 
195    definitions to this group. */
196 /** @defgroup palld_module PA LLD Module API
197  *  @{
198  */
199 /** @} */
200    
201 /** @defgroup palld_api_functions PA LLD Functions
202  *  @ingroup palld_module
203  */
204  
205 /** @defgroup palld_api_macros PA LLD Macros
206  *  @ingroup palld_module
207  */
209 /** @defgroup palld_api_structures PA LLD Data Structures
210  *  @ingroup palld_module
211  */
213 /** @defgroup palld_api_constants PA LLD Constants (enum's and define's)
214  *  @ingroup palld_module
215  */
216  
217 /**
218  *  @def  pa_PARAMS_NOT_SPECIFIED
219  *        Used for unspecified classification parameters
220  */
221 #define pa_PARAMS_NOT_SPECIFIED                      0xFFFF
223 /**
224  *  @def  pa_LUT_INST_NOT_SPECIFIED
225  *        Used if LUT1(or LUT2) instance is not specified
226  *        In the case, the PA LLD will decide which LUT instance to use based on the API type and the previous link information 
227  */
228 #define pa_LUT_INST_NOT_SPECIFIED                    -1
230 /**
231  *  @def  pa_LUT1_INDEX_NOT_SPECIFIED
232  *        Used if LUT1 index is not specified
233  *        In the case, the PASS will use the first available entry 
234  */
235 #define pa_LUT1_INDEX_NOT_SPECIFIED                  -1
237 /**
238  *  @def  pa_MAX_NUM_LUT1_ENTRIES
239  *        The maximum number of LUT1 entries
240  *
241  *  @note These definitions are not used by LLD. They are defined here for reference
242  *        purpose only.
243  *         
244  */
245 #define pa_MAX_NUM_LUT1_ENTRIES_GEN1                 64
246 #define pa_MAX_NUM_LUT1_ENTRIES_GEN2                256
247 #ifndef NSS_GEN2
248 #define pa_MAX_NUM_LUT1_ENTRIES                      pa_MAX_NUM_LUT1_ENTRIES_GEN1
249 #else 
250 #define pa_MAX_NUM_LUT1_ENTRIES                      pa_MAX_NUM_LUT1_ENTRIES_GEN2
251 #endif
253 /**
254  *  @defgroup  ReturnValues  Function Return Values
255  *  @ingroup palld_api_constants
256  *  @{
257  *
258  *  @name PALLD Function Return Codes
259  *
260  *  Error codes returned by PALLD API functions.
261  */
262 /*@{*/
263 /**
264  *  @def  pa_OK
265  *        PA return code -- Function executed successfully
266  */
267 #define pa_OK                                    0
269 /**
270  *  @def  pa_ERR_CONFIG
271  *        Invalid configuration provided to PA
272  */
273 #define pa_ERR_CONFIG                          -10
275 /**
276  *   @def pa_INSUFFICIENT_CMD_BUFFER_SIZE
277  *        The provided buffer was too small to hold the command
278  */
279 #define pa_INSUFFICIENT_CMD_BUFFER_SIZE        -11
281 /**
282  *  @def pa_INVALID_CMD_REPLY_DEST
283  *       An invalid destination was provided for command replies
284  */
285 #define pa_INVALID_CMD_REPLY_DEST              -12
287 /**
288  *   @def  pa_DUP_ENTRY
289  *         A duplicate active entry was found in the handle table.
290  *         If the module user intends to replace the associate routing 
291  *         information for the same entry, command packet should be
292  *         delivered to the PASS via the PKTDMA sub-system     
293  *         Otherwise, module user may decide to drop the command packet and 
294  *         free the buffer.
295  */ 
296 #define pa_DUP_ENTRY                           -13
298 /**
299  *   @def  pa_INVALID_DUP_ENTRY
300  *         A duplicate pending entry was found in the handle table
301  *         This entry can not be handled until the pending entry
302  *         becomes active
303  */ 
304 #define pa_INVALID_DUP_ENTRY                   -14
306 /**
307  *   @def  pa_INVALID_TABLE_MORE_SPECIFIC_ENTRY_PRESENT
308  *         A more specific entry was found in the handle table
309  *
310  *   @note: This error is depreciated at the next generation keystone device
311  */
312 #define pa_INVALID_TABLE_MORE_SPECIFIC_ENTRY_PRESENT   -15
314 /**
315  *   @def  pa_INVALID_MPLS_LABEL
316  *         An MPLS label exceeded 20 bits
317  */
318 #define pa_INVALID_MPLS_LABEL                  -16
320 /**
321  *   @def  pa_HANDLE_TABLE_FULL
322  *         No room for an entry in the L2 table
323  */
324 #define pa_HANDLE_TABLE_FULL                   -17
326 /**
327  *   @def  pa_INVALID_INPUT_HANDLE
328  *         Invalid handle provided
329  */
330 #define pa_INVALID_INPUT_HANDLE                -18
332 /**
333  *   @def  pa_HANDLE_INACTIVE
334  *         Operation requested on an inactive handle
335  */
336 #define pa_HANDLE_INACTIVE                     -19
337  
338 /**
339  *   @def  pa_INVALID_IP_FLOW
340  *         A flow label exceeded 20 bits
341  */ 
342 #define  pa_INVALID_IP_FLOW                    -20
344 /**
345  *   @def  pa_WARN_ACTIVE_HANDLE_ACKED
346  *         Sub-system reported activation of a handle already marked active
347  */
348 #define pa_WARN_ACTIVE_HANDLE_ACKED            -21
350 /**
351  *   @def  pa_LUT_ENTRY_FAILED
352  *         Sub-system could not make an entry to the LUT1 table
353  */
354 #define pa_LUT_ENTRY_FAILED                    -22
357 /**
358  *   @def  pa_RESUBMIT_COMMAND
359  *         Sub-system could not handle the command due to memory. Command must be resubmitted
360  */
361 #define pa_RESUBMIT_COMMAND                    -23
363 /**
364  *   @def  pa_SYSTEM_STATE_INVALID
365  *         Tried to download an image to a running PDSP
366  */
367 #define pa_SYSTEM_STATE_INVALID                -24
369 /**
370  *   @def  pa_INVALID_LUT1_INDEX
371  *         LUT1 index exceeds the LUT1 table range
372  */
373 #define pa_INVALID_LUT1_INDEX                  -25
375 /**
376  *   @def  pa_WARN_LNK_CNT_UNSYNC
377  *         Warning: Link counter out of sync
378  */
379 #define pa_WARN_LNK_CNT_UNSYNC                 -26
381 /**
382  *   @def pa_CMDSET_TOO_BIG
383  *        The total length of commads in the command set exceeds the limit
384  */
385 #define pa_CMDSET_TOO_BIG                      -27
387 /**
388  *   @def  pa_INVALID_LUT_INST
389  *         The specified LUT1 or LUT2 instance does not exist
390  */
391 #define pa_INVALID_LUT_INST                    -28
393 /** 
394   *  @def pa_RESOURCE_INIT_DENIED
395   *       The resource initialization permission denied 
396   */
397 #define pa_RESOURCE_INIT_DENIED                -29
399 /** 
400   *  @def pa_RESOURCE_USE_DENIED
401   *       The resource usage permission denied 
402   */
403 #define pa_RESOURCE_USE_DENIED                 -30
406 /** 
407   *  @def pa_RESOURCE_FREE_DENIED
408   *       The resource free permission denied 
409   */
410 #define pa_RESOURCE_FREE_DENIED                -31
412 /** 
413   *  @def pa_FIRMWARE_REVISION_DIFFERENCE
414   *       The firmware revision difference 
415   */
416 #define pa_FIRMWARE_REVISION_DIFFERENCE        -32
418 /** 
419   *  @def pa_VIRTUAL_LINK_TABLE_FULL
420   *       Virtual link table is full 
421   */
422 #define pa_VIRTUAL_LINK_TABLE_FULL             -33
423 /**
424  *   @def  pa_INVALID_DUP_ACL_ENTRY
425  *         A duplicate ACL entry is found in the ACL table
426  *         The ACL entry should be deleted before the same 
427  *         entry with updated action can be added.  
428  *         
429  */ 
430 #define pa_INVALID_DUP_ACL_ENTRY               -34
432 /**
433  *   @def  pa_INVALID_ACL_ACTION
434  *         The specified ACL action is not supported
435  */
436 #define pa_INVALID_ACL_ACTION                  -35
438 /**
439  *   @def  pa_INVALID_EF_REC_INDEX
440  *         The index of Egress Flow record is out of range 
441  */
442 #define pa_INVALID_EF_REC_INDEX                -36
445 /**
446  *   @def  pa_EF_REC_CONFIG_ERR
447  *         Egress Flow record update is rejected by PASS 
448  */
449 #define pa_EF_REC_CONFIG_ERR                   -37
451 /**
452  *   @def  pa_PENDING_FC_ENTRY
453  *         A pending Flow Cache entry is intended to be replaced
454  *         with another entry by invoking API Pa_addFc() while
455  *         it is still pending to be added into PASS LUT1 table. 
456  *         This entry can not be replaced until it becomes active
457  */ 
458 #define pa_PENDING_FC_ENTRY                    -38
460 /** 
461   *  @def pa_API_UNSUPPORTED
462   *       The API is not supported by this generation of PASS
463   */
464 #define pa_API_UNSUPPORTED                     -39
466 /** 
467   *  @def pa_INVALID_INPUT_POINTER
468   *       Some of required input pointers are null
469   */
470 #define pa_INVALID_INPUT_POINTER               -40
472 /** 
473   *  @def pa_ACL_BUSY
474   *       PASS ACL is busy and can not accept new operations, please retry after the time
475   *       as specified by the @ref Pa_addAcl API
476   */
477 #define pa_ACL_BUSY                            -41
479 /** 
480   *  @def pa_SUB_SYSTEM_BASE_ADDR_NULL
481   *       PASS Base address configured in PA LLD is NULL - serious error
482   */
483 #define pa_SUB_SYSTEM_BASE_ADDR_NULL           -42
486 /** 
487   *  @def pa_LUT2_TABLE_FULL
488   *       PASS LUT2 Table is full, no more entries can be added unless an
489   *       entry is deleted to create a room to a next entry 
490   */
491 #define pa_LUT2_TABLE_FULL                     -43
494 /*@}*/
495 /** @} */
498 /**
499  *  @defgroup  cmdMinBufSize Command buffer minimum size requirements
500  *  @ingroup palld_api_constants
501  *  @{
502  *
503  *  @name Command buffer minimum sizes
504  *
505  *  Define command buffer minimum size requirements.
506  */
507 /* @{ */
509 /**
510  *  @def  pa_ADD_LUT1_MIN_CMD_BUF_SIZE_BYTES
511  *        The minimum command buffer size required when using the @ref Pa_addSrio and @ref Pa_addCustomLUT1 function
512  */
513 #define pa_ADD_LUT1_MIN_CMD_BUF_SIZE_BYTES          124
515 /**
516  *  @def  pa_ADD_MAC_MIN_CMD_BUF_SIZE_BYTES
517  *        The minimum command buffer size required when using the @ref Pa_addMac and @ref Pa_addMac2 function
518  */
519 #define pa_ADD_MAC_MIN_CMD_BUF_SIZE_BYTES           pa_ADD_LUT1_MIN_CMD_BUF_SIZE_BYTES
521 /**
522  *  @def  pa_DEL_HANDLE_MIN_CMD_BUF_SIZE_BYTES
523  *        The minimum command buffer size required when using the @ref Pa_delHandle function
524  */
525 #define pa_DEL_HANDLE_MIN_CMD_BUF_SIZE_BYTES        32
527 /**
528  *  @def  pa_DEL_L4_HANDLE_MIN_CMD_BUF_SIZE_BYTES
529  *        The minimum command buffer size required when using the @ref Pa_delL4Handle function
530  */
531 #define pa_DEL_L4_HANDLE_MIN_CMD_BUF_SIZE_BYTES     28
533 /**
534  *  @def  pa_ADD_IP_MIN_CMD_BUF_SIZE_BYTES
535  *        The minimum command buffer size required when using the @ref Pa_addIp and @ref Pa_addIp2 functions
536  */
537 #define pa_ADD_IP_MIN_CMD_BUF_SIZE_BYTES            240 
539 /**
540  *  @def  pa_ADD_LUT2_MIN_CMD_BUF_SIZE_BYTES
541  *        The minimum command buffer size required when using the @ref Pa_addCustomLUT2 function
542  */
543 #define pa_ADD_LUT2_MIN_CMD_BUF_SIZE_BYTES          48
545 /**
546  *  @def  pa_ADD_PORT_MIN_CMD_BUF_SIZE_BYTES
547  *        The minimum command buffer size required when using the @ref Pa_addPort function
548  */
549 #define pa_ADD_PORT_MIN_CMD_BUF_SIZE_BYTES          pa_ADD_LUT2_MIN_CMD_BUF_SIZE_BYTES
551 /**
552  *  @def  pa_CONFIG_EXCEPTION_ROUTE_MIN_CMD_BUF_SIZE_BYTES
553  *        The minimum command buffer size required when using the @ref Pa_configExceptionRoute and @ref Pa_configEflowExceptionRoute function
554  */
555 #define pa_CONFIG_EXCEPTION_ROUTE_MIN_CMD_BUF_SIZE_BYTES   520
557 /**
558  *  @def  pa_CONFIG_CRC_ENGINE_MIN_CMD_BUF_SIZE_BYTES
559  *        The minimum command buffer size required when using the @ref Pa_configCrcEngine function
560  */
561 #define pa_CONFIG_CRC_ENGINE_MIN_CMD_BUF_SIZE_BYTES  88
563 /**
564  *  @def  pa_CONFIG_MULTI_ROUTE_MIN_CMD_BUF_SIZE_BYTES
565  *        The minimum command buffer size required when using the @ref Pa_configMultiRoute function
566  */
567 #define pa_CONFIG_MULTI_ROUTE_MIN_CMD_BUF_SIZE_BYTES 84
569 /**
570  *  @def  pa_SET_CUSTOM_LUT1_MIN_CMD_BUF_SIZE_BYTES
571  *        The minimum command buffer size required when using the @ref Pa_setCustomLUT1 function
572  */
573 #define pa_SET_CUSTOM_LUT1_MIN_CMD_BUF_SIZE_BYTES    60
575 /**
576  *  @def  pa_SET_CUSTOM_LUT2_MIN_CMD_BUF_SIZE_BYTES
577  *        The minimum command buffer size required when using the @ref Pa_setCustomLUT2 function
578  */
579 #define pa_SET_CUSTOM_LUT2_MIN_CMD_BUF_SIZE_BYTES    36
581 /**
582  *  @def  pa_CONFIG_CMD_SET_MIN_CMD_BUF_SIZE_BYTES
583  *        The minimum command buffer size allowed when using the @ref Pa_configCmdSet and @ref Pa_formatTxCmd function
584  */
585 #define pa_CONFIG_CMD_SET_MIN_CMD_BUF_SIZE_BYTES     144
587 /**
588  *  @def  pa_REQUEST_STATS_MIN_CMD_BUF_SIZE_BYTES
589  *        The minimum command buffer size required when using the @ref Pa_requestStats and @ref Pa_requestUsrStats functions
590  */
591 #define pa_REQUEST_STATS_MIN_CMD_BUF_SIZE_BYTES      24
593 /**
594  *  @def  pa_CONFIG_USR_STATS_MIN_CMD_BUF_SIZE_BYTES
595  *        The minmium command buffer size allowed when using the @ref Pa_configUsrStats function with the maximum number of 
596  *        user-defined statistics. The size of command packet is calculated as 20 + (number of statistic entries) * 4. 
597  */
598 #define pa_CONFIG_USR_STATS_MIN_CMD_BUF_SIZE_BYTES   2068
600 /**
601  *  @def  pa_GLOBAL_CONFIG_MIN_CMD_BUF_SIZE_BYTES
602  *        The minmium command buffer size allowed when using the @ref Pa_control (pa_CONTROL_SYS_CONFIG) function to perform PASS 
603  *        global configuration.
604  */
605 #define pa_GLOBAL_CONFIG_MIN_CMD_BUF_SIZE_BYTES      108
607 /**
608  *  @def  pa_802_1ag_DET_MIN_CMD_BUF_SIZE_BYTES
609  *        The minmium command buffer size allowed when using the @ref Pa_control (pa_CONTROL_802_1ag_CONFIG) function to configure 
610  *        the 802.1ag packet detector.
611  */
612 #define pa_802_1ag_DET_MIN_CMD_BUF_SIZE_BYTES        24
614 /**
615  *  @def  pa_IPSEC_NAT_T_DET_MIN_CMD_BUF_SIZE_BYTES
616  *        The minmium command buffer size allowed when using the @ref Pa_control (pa_CONTROL_IPSEC_NAT_T_CONFIG) function to configure 
617  *        the IPSEC NAT-T packet detector.
618  */
619 #define pa_IPSEC_NAT_T_DET_MIN_CMD_BUF_SIZE_BYTES    24
621 /**
622  *  @def  pa_GTPU_CONFIG_MIN_CMD_BUF_SIZE_BYTES
623  *        The minmium command buffer size allowed when using the @ref Pa_control (pa_CONTROL_GTPU_CONFIG) function to configure 
624  *        the GTUP classification operation.
625  */
626 #define pa_GTPU_CONFIG_MIN_CMD_BUF_SIZE_BYTES        24
628 /**
629  *  @def  pa_EMAC_PORT_MIRROR_CONFIG_MIN_CMD_BUF_SIZE_BYTES
630  *        The minmium command buffer size allowed when using the @ref Pa_control (pa_CONTROL_EMAC_PORT_CONFIG, pa_EMAC_PORT_CFG_MIRROR) 
631  *        function to configure EMAC Mirror operation with the maxmium number of EMAC ports.
632  *        The size of command packet is calculated as 24 + (number of configured EMAC ports) * 12.
633  *        
634  */
635 #define pa_EMAC_PORT_MIRROR_CONFIG_MIN_CMD_BUF_SIZE_BYTES   120
636 #define pa_EMAC_PORT_MIRROR_CONFIG_PACKET_SIZE(numPorts)    (24 + (numPorts)*12)
638 /**
639  *  @def  pa_EMAC_PORT_PKT_CAPTURE_CONFIG_MIN_CMD_BUF_SIZE_BYTES
640  *        The minmium command buffer size allowed when using the @ref Pa_control (pa_CONTROL_EMAC_PORT_CONFIG, pa_EMAC_PORT_CFG_PKT_CAPTURE) 
641  *        function to configure EMAC packet capture operation with the maxmium number of CPSW ports.
642  *        The size of command packet is calculated as 24 + (number of configured CPSW ports) * 12.
643  *  
644  *  @note CPPI port (CPSW port 0) packet capture is only applicable at the egress direction.
645  *        
646  */
647 #define pa_EMAC_PORT_PKT_CAPTURE_CONFIG_MIN_CMD_BUF_SIZE_BYTES   136
648 #define pa_EMAC_PORT_PKT_CAPTURE_CONFIG_PACKET_SIZE(numPorts)    (24 + (numPorts)*12)
650 /**
651  *  @def  pa_EMAC_PORT_DEFAULT_ROUTE_CONFIG_MIN_CMD_BUF_SIZE_BYTES
652  *        The minmium command buffer size allowed when using the @ref Pa_control (pa_CONTROL_EMAC_PORT_CONFIG, pa_EMAC_PORT_CFG_DEFAULT_ROUTE) 
653  *        function to configure EMAC default routes with the maxmium number of EMAC ports.
654  *        The size of command packet is calculated as 24 + (number of configured EMAC ports) * 52.
655  *        
656  */
657 #define pa_EMAC_PORT_DEFAULT_ROUTE_CONFIG_MIN_CMD_BUF_SIZE_BYTES   440
658 #define pa_EMAC_PORT_DEFAULT_ROUTE_CONFIG_PACKET_SIZE(numPorts)    (24 + (numPorts)*52)
660 /**
661  *  @def  pa_EMAC_PORT_EQoS_MODE_CONFIG_MIN_CMD_BUF_SIZE_BYTES
662  *        The minmium command buffer size allowed when using the @ref Pa_control (pa_CONTROL_EMAC_PORT_CONFIG, pa_EMAC_PORT_CFG_EQoS_MODE) 
663  *        function to configure EMAC default routes with the maxmium number of EMAC ports.
664  *        The size of command packet is calculated as 24 + (number of configured EMAC ports) * 152.
665  *        
666  */
667 #define pa_EMAC_PORT_EQoS_MODE_CONFIG_MIN_CMD_BUF_SIZE_BYTES   1240
668 #define pa_EMAC_PORT_EQoS_MODE_CONFIG_PACKET_SIZE(numPorts)    (24 + (numPorts)*152)
670 /**
671  *  @def  pa_EMAC_PORT_CONFIG_MIN_CMD_BUF_SIZE_BYTES
672  *        The minmium command buffer size allowed when using the @ref Pa_control (pa_CONTROL_EMAC_PORT_CONFIG) function to configure 
673  *        the ethernet port configuration operations with the maxmium number of EMAC EQoS ports.
674  *        
675  */
676 #define pa_EMAC_PORT_CONFIG_MIN_CMD_BUF_SIZE_BYTES   pa_EMAC_PORT_EQoS_MODE_CONFIG_MIN_CMD_BUF_SIZE_BYTES
678 /**
679  *  @def  pa_MAX_CMD_BUF_SIZE_BYTES
680  *        The maximum command buffer size requested when using any PA API call which generates command packet.
681  */
682 #define pa_MAX_CMD_BUF_SIZE_BYTES                    2068
684 /* @} */  
685 /** @} */
688 /**
689  * @ingroup palld_api_structures
690  * @brief MAC address specification
691  *
692  * @details  This type is used to pass MAC addresses (see @ref netlayers) to the module. The most significant byte
693  *           of the mac address is placed in array element 0.
694  */
695 #define pa_MAC_ADDR_SIZE       6 
696 typedef unsigned char paMacAddr_t[pa_MAC_ADDR_SIZE];
698 /**
699  * @ingroup palld_api_structures
700  * @brief  IPv4 address specification
701  *
702  * @details  This type is used to pass IPv4 addresses (see @ref netlayers) to the module. The most significant byte
703  *           of the IP address is placed in array element 0.
704  */
705 #define pa_IPV4_ADDR_SIZE      4
706 typedef unsigned char paIpv4Addr_t[pa_IPV4_ADDR_SIZE];
708 /**
709  * @ingroup palld_api_structures
710  * @brief  IPv6 address specificiation
711  *
712  * @details  This type is used to pass IPv6 addresses (see @ref netlayers) to the module. The most significant byte
713  *           of the IP address is placed in array element 0.
714  */
715 #define pa_IPV6_ADDR_SIZE      16 
716 typedef unsigned char paIpv6Addr_t[pa_IPV6_ADDR_SIZE];
718 /**
719  * @ingroup palld_api_structures
720  * @brief  IP address specification
721  *
722  * @details  This union is used to specify an IP address to the module. The type in the union is determined
723  *           through other parameters passed to the module (see @ref IpValues).
724  */
725 typedef union  {
727   paIpv6Addr_t  ipv6;   /**< IPv6 address */
728   paIpv4Addr_t  ipv4;   /**< IPv4 address */
729   
730 } paIpAddr_t;
732 /**
733  *  @defgroup  IpValues IP types
734  *  @ingroup palld_api_constants
735  *  @{
736  *
737  *  @name   IP Values
738  *  @brief  Defines the IP version type used.
739  *
740  *  @details The packet accelerator module parses both IPv4 and IPv6 network layer headers (see @ref netlayers). 
741  *           This group is used to distinguish which type of header will be used.
742  */
743 /* @{ */
744 /**
745  *  @def  pa_IPV4
746  *        IPv4
747  */
748 #define  pa_IPV4  4
750 /**
751  *  @def   pa_IPV6
752  *        IPv6
753  */
754 #define  pa_IPV6  6
755   
756 /*  @}  */  
757 /** @} */
760 /**
761  * @ingroup palld_api_structures
762  * @brief Specification of Pa_Handle 
763  *
764  * The Pa_Handle is used to identify a PA LLD instance
765  */
766 typedef void*  Pa_Handle;
768 /**
769  * @ingroup palld_api_structures
770  * @brief  PA handle specification for L2 and L3 (LUT1) handles
771  *
772  * @details  This type is used to reference L2 and L3 (LUT1) routing information (see @ref netlayers). The module
773  *           user is responsible for storing the handle and using it to refer to routing information already
774  *           created through calls to @ref Pa_addMac, @ref Pa_addSrio, @ref Pa_addCustomLUT1 and @ref Pa_addIp.
775  */
776 typedef void*  paHandleL2L3_t;
778 /**
779  * @ingroup palld_api_structures
780  * @brief  PA link handle specification for L2, L3 (LUT1) and virtual link handles
781  *
782  * @details  This type is used to reference L2, L3 (LUT1) and virtual link information. The module
783  *           user is responsible for storing the handle and using it to refer to L2/L3/Virtual link handle already
784  *           created through calls to @ref Pa_addMac, @ref Pa_addSrio, @ref Pa_addCustomLUT1, @ref Pa_addIp and
785  *           @ref Pa_addVirtualLink
786  */
787 typedef void* paLnkHandle_t;
789 /**
790  * @ingroup palld_api_structures
791  * @brief  PA handle specification for ACL (LUT1) handles
792  *
793  * @details  This type is used to reference ACL (LUT1) entry with the ACL table. The module
794  *           user is responsible for storing the handle and using it to refer to ACL entry already
795  *           created through calls to @ref Pa_addAcl.
796  */
797 typedef void*  paHandleAcl_t;
799 /**
800  * @ingroup palld_api_structures
801  * @brief  PA handle specification for EOAM (LUT1) handles.
802  *
803  * @details  This type is used to reference EOAM (LUT1) entry with the EOAM table. The module
804  *           user is responsible for storing the handle and using it to refer to EOAM entry already
805  *           created through calls to @ref Pa_addEoamFlow. 
806  *           Please refer to @ref appendix8 for details about EOAM mode.
807  */
808 typedef void*  paHandleEoam_t;
810 /**
811  * @ingroup palld_api_structures
812  * @brief  PA handle specification for Flow Cache (LUT1) handles
813  *
814  * @details  This type is used to reference Flow Cache (LUT1) entry with the Flow Cache (FC) table. The module
815  *           user is responsible for storing the handle and using it to refer to Flow Cache entry already
816  *           created through calls to @ref Pa_addFc.
817  */
818 typedef void*  paHandleFc_t;
820 /**
821  * @brief The un-linked inner IP handle
822  *
823  * @details This handle value is used to specify an inner IP (tunnel) which the application does not
824  *          want to link to an outer IP address.
825  */
826 #define PA_LLD_HANDLE_IP_INNER  ((paHandleL2L3_t)1)
828 /**
829  *  @ingroup palld_api_structures
830  *  @brief  PA handle specification for L4 (LUT2) handles
831  *
832  *  @details  This type is used to reference L4 (LUT2) routing information (see @ref netlayers). The module user
833  *            is responsible for storing the handle. It is used again only to delete a created route.
834  *            
835  */
836 typedef uint32_t paHandleL4_t[3];
839 /**
840  *  @ingroup palld_api_structures
841  *  @brief A generic entry handle types
842  *
843  *  @details  The union of both entry handle types used by the module is used only in function @ref Pa_forwardResult.
844  *            The function will return the corresponding entry type and its handle in the command response packets when a LUT1
845  *            or LUT2 entry is added into the LUT1/LUT2 table successfully.
846  *            The handle entry will be set to zero in all other cases 
847  */
848 typedef union  {
850   paHandleL2L3_t  l2l3Handle;  /**<  Level 2 or level 3 handle created by @ref Pa_addMac @ref Pa_addSrio, @ref Pa_addCustomLUT1 or @ref Pa_addIp */
851   paHandleAcl_t   aclHandle;   /**<  ACL handle created by @ref Pa_addAcl (Gen2 only) */
852   paHandleEoam_t  eoamHandle;  /**<  EOAM handle created by @ref Pa_addEoamFlow (Gen2 only) */
853   paHandleFc_t    fclHandle;   /**<  Flow Cache handle created by @ref Pa_addFc (Gen2 only) */
854   paHandleL4_t    l4Handle;    /**<  Level 4 handle created by @ref Pa_addPort or @ref Pa_addCustomLUT2 */
856 } paEntryHandle_t;
858 /**
859  *  @ingroup palld_api_constants
860  *  @{
861  *  @brief  The number of bytes available for custom lookup
862  *
863  *  @details Custom lookup sizes are fixed by hardware
864  */
865 #define pa_NUM_BYTES_CUSTOM_LUT1  32
866 #define pa_NUM_BYTES_CUSTOM_LUT2   4
867 /** @} */
869 /**
870  *  @defgroup HandleTypes Handle Types
871  *
872  *  @ingroup palld_api_constants
873  *  @{
874  *
875  *  @name Handle Types
876  *
877  *  @brief  These values are used to describe what type of handle is referenced.
878  *
879  *  @details  These values are used only for function @ref Pa_forwardResult. The function returns with a copy
880  *            of the handle, which the module user should already have, along with the type of handle. The
881  *            module user can use this information to verify that a particular handle has been fully activated
882  *            and can be used for linking reference in calls to @ref Pa_addIp, @ref Pa_addCustomLUT1, 
883  *            @ref Pa_addCustomLUT2,  @ref Pa_addPort or @ref Pa_addAcl.
884  */
885 /*  @{  */
886 /**
887  *
888   *  @def  pa_L2_HANDLE
889   *        Level 2 (MAC/SRIO) handle
890   */
891 #define  pa_L2_HANDLE   2
893 /**
894  *  @def  pa_L3_HANDLE
895  *        Level 3 (IP, Custom LUT1) handle
896  */
897 #define  pa_L3_HANDLE   3
899 /**
900  *  @def  pa_L4_HANDLE
901  *        Level 4 (TCP/UDP/GTP-U/Custom LUT2) handle
902  */
903 #define  pa_L4_HANDLE   4
905 /**
906  *  @def  pa_ACL_HANDLE
907  *        ACL (Access Control List) handle
908  */
909 #define  pa_ACL_HANDLE  10 
911 /**
912  *  @def  pa_FC_HANDLE
913  *        FC (Flow Cache) handle
914  */
915 #define  pa_FC_HANDLE   11 
917 /**
918  *  @def  pa_EOAM_HANDLE
919  *        EOAM (Ethernet OAM) handle
920  */
921 #define  pa_EOAM_HANDLE   12 
923 /**
924  *  @def  pa_INVALID_HANDLE
925  *        Invalid handle type
926  */
927 #define pa_INVALID_HANDLE   -1
929 /*  @}  */  
930 /** @} */
932 /**
933  *  @defgroup ErouteTypes Exception Route Types
934  *  @ingroup palld_api_constants
935  *  @{
936  *
937  *  @name Exception Route Types
938  *
939  *  @brief  These values are used to define exception route conditions.
940  *
941  *  @details  The exception route defines the global routing information when the exception condition such
942  *            as LUT1 lookup failure, packet parsing failure, broadcast packet detection and etc. Multiple
943  *            exception routes can be configured through @ref Pa_configExceptionRoute. All the exception
944  *            routes are disabled by default.
945  */
946 /*  @{  */
947 /**
948  *
949  *   @def  pa_EROUTE_L2L3_FAIL
950  *         packet failed to match in L2/L3 (LUT1) table
951  */
952 #define pa_EROUTE_L2L3_FAIL         0
954 /**
955  *  @def  pa_EROUTE_VLAN_MAX_DEPTH
956  *        packet exceeded maximum number of VLAN tags
957  */
958 #define pa_EROUTE_VLAN_MAX_DEPTH    1
960 /**
961  *  @def  pa_EROUTE_IP_MAX_DEPTH
962  *        packet exceeded maximum number of IP headers
963  */
964 #define pa_EROUTE_IP_MAX_DEPTH      2
966 /**
967  *  @def  pa_EROUTE_MPLS_MAX_DEPTH
968  *        packet exceeded maximum number of MPLS headers
969  */
970 #define pa_EROUTE_MPLS_MAX_DEPTH    3
972 /**
973  *  @def  pa_EROUTE_GRE_MAX_DEPTH
974  *        packet exceeded maximum number of GRE headers
975  */
976 #define pa_EROUTE_GRE_MAX_DEPTH     4
978 /**
979  *  @def pa_EROUTE_PARSE_FAIL
980  *       packet failed to parse
981  */
982 #define pa_EROUTE_PARSE_FAIL        5
984 /**
985  *  @def pa_EROUTE_L4_FAIL
986  *       packet failed to match in L4 (LUT2) table
987  */
988 #define pa_EROUTE_L4_FAIL           6
990 /**
991  *  @def pa_EROUTE_IP_FRAG
992  *       IP fragmented packet 
993  */
994 #define pa_EROUTE_IP_FRAG           7
996 /**
997  *  @def pa_EROUTE_IPV6_OPT_FAIL
998  *       Packet failed due to unsupported IPV6 option header
999  */
1000 #define pa_EROUTE_IPV6_OPT_FAIL     8
1002 /**
1003  *  @def pa_EROUTE_UDP_LITE_FAIL
1004  *       UDP lite packet had invalid checksum coverage
1005  */
1006 #define pa_EROUTE_UDP_LITE_FAIL     9
1008 /**
1009  *  @def pa_EROUTE_ROUTE_OPTION
1010  *       IP routing had incomplete routes
1011  */
1012 #define pa_EROUTE_ROUTE_OPTION      10
1014 /**
1015  *  @def  pa_EROUTE_SYSTEM_FAIL
1016  *        Sub-system detected internal error
1017  */
1018 #define pa_EROUTE_SYSTEM_FAIL       11
1020 /**
1021  *  @def pa_EROUTE_MAC_BROADCAST
1022  *       MAC broadcast packet which is not specified at the lookup table
1023  */
1024 #define pa_EROUTE_MAC_BROADCAST     12
1026 /**
1027  *  @def pa_EROUTE_MAC_MULTICAST
1028  *       MAC multicast packet which is not specified at the lookup table
1029  */
1030 #define pa_EROUTE_MAC_MULTICAST     13
1032 /**
1033  *  @def pa_EROUTE_IP_BROADCAST
1034  *       IP broadcast packet which is not specified at the lookup table
1035  */
1036 #define pa_EROUTE_IP_BROADCAST      14
1038 /**
1039  *  @def pa_EROUTE_IP_MULTICAST
1040  *       IP multicast packet which is not specified at the lookup table
1041  */
1042 #define pa_EROUTE_IP_MULTICAST      15
1044 /**
1045  *  @def pa_EROUTE_GTPU_MESSAGE_TYPE_1
1046  *       GTP-U PING Request packet
1047  */
1048 #define pa_EROUTE_GTPU_MESSAGE_TYPE_1      16
1050 /**
1051  *  @def pa_EROUTE_GTPU_MESSAGE_TYPE_2
1052  *       GTP-U PING Response packet
1053  */
1054 #define pa_EROUTE_GTPU_MESSAGE_TYPE_2      17
1056 /**
1057  *  @def pa_EROUTE_GTPU_MESSAGE_TYPE_26
1058  *       GTP-U Error Indication packet
1059  */
1060 #define pa_EROUTE_GTPU_MESSAGE_TYPE_26     18
1062 /**
1063  *  @def pa_EROUTE_GTPU_MESSAGE_TYPE_31
1064  *       GTP-U Supported Header Notification packet
1065  */
1066 #define pa_EROUTE_GTPU_MESSAGE_TYPE_31     19
1068 /**
1069  *  @def pa_EROUTE_GTPU_MESSAGE_TYPE_254
1070  *       GTP-U End Marker packet
1071  */
1072 #define pa_EROUTE_GTPU_MESSAGE_TYPE_254    20
1074 /**
1075  *  @def pa_EROUTE_GTPU_FAIL
1076  *       Packet failed due to GTPU parsing error or unsupporte dmessage types
1077  */
1078 #define pa_EROUTE_GTPU_FAIL                21
1080 /**
1081  *  @def pa_EROUTE_PPPoE_FAIL
1082  *       Packet failed due to PPPoE session packet parsing error
1083  */
1084 #define pa_EROUTE_PPPoE_FAIL               22
1086 /**
1087  *  @def pa_EROUTE_PPPoE_CTRL
1088  *       PPPoE session stage non-IP packets
1089  */
1090 #define pa_EROUTE_PPPoE_CTRL               23
1092 /**
1093  *  @def pa_EROUTE_802_1ag
1094  *       802.1ag Packet
1095  */
1096 #define pa_EROUTE_802_1ag                  24
1098 /**
1099  *  @def pa_EROUTE_IP_FAIL
1100  *       Packet failed due to invalid IP header
1101  */
1102 #define pa_EROUTE_IP_FAIL                  25
1104 /**
1105  *  @def pa_EROUTE_NAT_T_KEEPALIVE
1106  *       NAT-T Keep Alive packet where UDP Length = 9, data = 0xFF
1107  */
1108 #define pa_EROUTE_NAT_T_KEEPALIVE          26
1110 /**
1111  *  @def pa_EROUTE_NAT_T_CTRL
1112  *       NAT-T control packet where UDP Length > 12 and the first 4 payload bytes are equal to 0
1113  */
1114 #define pa_EROUTE_NAT_T_CTRL               27
1116 /**
1117  *  @def pa_EROUTE_NAT_T_DATA
1118  *       NAT-T IPSEC ESP data packet where UDP Length > 12 and the first 4 payload bytes are not equal to 0
1119  */
1120 #define pa_EROUTE_NAT_T_DATA               28
1122 /**
1123  *  @def pa_EROUTE_NAT_T_FAIL
1124  *       Invalid NAT-T packet
1125  */
1126 #define pa_EROUTE_NAT_T_FAIL               29
1128 /**
1129  *  @def pa_EROUTE_GTPU_MATCH_FAIL
1130  *       GTPU match failed 
1131  */
1132 #define pa_EROUTE_GTPU_MATCH_FAIL          30
1134 /**
1135  *  @def   pa_EROUTE_MAX
1136  *         The maximum number of global route types
1137  */
1138 #define pa_EROUTE_MAX                      31
1140 /*  @}  */  
1141 /** @} */
1144 /**
1145  *  @defgroup NextHeaderTypes Next Header types 
1146  *  @ingroup palld_api_constants
1147  *  @{
1148  *
1149  *  @name Next Header types
1150  *
1151  *  @brief  These values are used to define the next header (protocol) types for continus parsing after the 
1152  *          SRIO and custom parsing.
1153  *
1154  *  @details  The next header type can be derived from the upper layer header in a standard Ethernet packet.
1155  *            For SRIO and custom LUT1 lookup, the next header type should be provided by the user in function
1156  *            @ref Pa_setCustomLUT1 and @ref Pa_addSrio. 
1157  */
1158 /*  @{  */
1159 /**
1160  *
1161  *   @def  pa_HDR_TYPE_MAC
1162  *         MAC header
1163  */
1164 #define pa_HDR_TYPE_MAC         0
1166 /**
1167  *
1168  *  @def   pa_HDR_TYPE_IPV4
1169  *         IPv4 header
1170  */
1171 #define pa_HDR_TYPE_IPV4        1
1174 /**
1175  *
1176  *  @def   pa_HDR_TYPE_IPV6
1177  *         IPv6 header
1178  */
1179 #define pa_HDR_TYPE_IPV6        2
1181 /**
1182  *
1183  *  @def   pa_HDR_TYPE_CUSTOM_LUT1
1184  *         Custom LUT1 header
1185  */
1186 #define pa_HDR_TYPE_CUSTOM_LUT1 3
1188 /**
1189  *
1190  *  @def   pa_HDR_TYPE_UDP
1191  *         UDP header
1192  */
1193 #define pa_HDR_TYPE_UDP         4
1195 /**
1196  *
1197  *  @def   pa_HDR_TYPE_UDP_LITE
1198  */
1199 #define pa_HDR_TYPE_UDP_LITE    5
1201 /**
1202  *
1203  *  @def   pa_HDR_TYPE_TCP
1204  *         TCP header
1205  */
1206 #define pa_HDR_TYPE_TCP         6
1208 /**
1209  *
1210  *  @def   pa_HDR_TYPE_CUSTOM_LUT2
1211  *         Custom LUT2 header
1212  */
1213 #define pa_HDR_TYPE_CUSTOM_LUT2 7
1215 /**
1216  *
1217  *  @def   pa_HDR_TYPE_UNKNOWN
1218  *         next header type is not specified 
1219  */
1220 #define pa_HDR_TYPE_UNKNOWN     8
1221  
1222 /*  @}  */  
1223 /** @} */
1225 /** 
1226  * @ingroup palld_api_structures
1227  * @brief pa RM Handle
1228  */
1229 typedef void *  pa_RmHnd;
1231 /** 
1232  * @ingroup palld_api_structures
1233  * @brief PA start configuration structure
1234  */
1235 typedef struct
1236 {    
1237     pa_RmHnd  rmServiceHandle;         /**< Resource Manager service handle */
1238     uint32_t  baseAddr;                /**< Specify the PASS base address */
1239     void*     instPoolBaseAddr;        /**< Base address of the global shared memory pool from which global
1240                                             LLD instance & channel instance memory is allocated */
1241 } paStartCfg_t;
1243 /**
1244  *  @ingroup palld_api_structures
1245  *  @brief  Pointer to the buffer where the PASS command is placed
1246  *
1247  *  @details  Functions in this module produce formatted commands that must be sent to the packet accelerator
1248  *            sub-system. These commands are always referred to through this type.
1249  */
1250 typedef void*  paCmd_t;
1252 /**
1253  * @ingroup palld_api_structures
1254  * @brief  PA Ip traffic flow information structure
1255  *
1256  * @details Snap shot of the PA Reassembly traffic flow information structure
1257  */
1258 typedef struct
1260     int32_t  index;       /** < active traffic flow index, -1:for inactive traffic flow */
1261     uint32_t srcIp;       /** < source IP address: complete IP address for IPv4 OR lower 32 bits in IPv6 */
1262     uint32_t dstIp;       /** < destination IP address:  complete IP address for IPv4 OR lower 32 bits in IPv6 */
1263     uint16_t proto;       /** < protocol field in IP header */
1264     uint16_t count;       /** < number of pending fragments and non-fragmented pkts */
1265 } pa_ReassemblyFlow_t;
1267 /**
1268  * @ingroup palld_api_structures
1269  * @brief  PA Ip Reassembly control context snap shot Information Structure
1270  *
1271  * @details The PA Reassembly control context structure contains the snap shot of the
1272  *         reassembly context information.
1273  */
1274 typedef struct
1276   uint16_t    numTF;       /** < Maximum number of traffic flow entries */
1277   uint16_t    numActiveTF; /** < number of active traffic flows */
1278   uint16_t    queue;       /** < The destination queue where PASS will deliver
1279                                 the packets which require reassembly assistance */
1280   uint16_t    flowId;      /** < CPPI Flow which instructs how free queues are used
1281                                 for receiving the packets */
1282   pa_ReassemblyFlow_t    traffic_flow[32];    /**< traffic flow snap shot */
1283 } pa_trafficFlow_t;
1285 typedef struct
1287     pa_trafficFlow_t  outer; /** < Outer IP traffic flow Reassembly context */
1288     pa_trafficFlow_t  inner; /** < Inner IP traffic flow Reassembly context */
1289 } pa_ReassemblyContext_t;
1293 /**
1294  *  @defgroup dbgInfoType  PA Packet Debug Operation type Definitions
1295  *  @ingroup palld_api_constants
1296  *  @{
1297  *
1298  *  @name PA Packet Debug information type
1299  *
1300  *  Debug information type in @ref paSnapShotDebugInfo_t
1301  *
1302  */
1303 /*@{*/
1305 /**
1306  *  @def  pa_DBG_INFO_TYPE_REASSEMBLY_ENABLE
1307  *        Debug Info -- Set: Perform snap shot of reassembly control information
1308  *                      Clear: Snap shot operation is not performed
1309  */
1310 #define pa_DBG_INFO_TYPE_REASSEMBLY_ENABLE       0x0001
1312 /*@}*/
1313 /** @} */
1315 /**
1316  * @ingroup palld_api_structures
1317  * @brief  PA Debug Information Structure
1318  *
1319  * @details The PA debug information structure contains the snap shot of the
1320  *          hardware registers sampled at a particular time.
1321  */
1322 typedef struct
1324     uint32_t    debugInfoType; /**< Debug extract operation control
1325                                     information as defined at @ref dbgInfoType */
1327     union {
1328         pa_ReassemblyContext_t reassemContext;
1329     } u;
1330 } paSnapShotDebugInfo_t;
1332 /**
1333  * @ingroup palld_api_structures
1334  * @brief  PA Size Configuration Structure
1335  *
1336  * @details The module is configured at run time with a maximum number of handles supported. The module
1337  *          maintains a set of handles and links between handles.
1338  */
1339 typedef struct  {
1341   int nMaxL2;   /**< Maximum number of L2 handles supported */
1342   int nMaxL3;   /**< Maximum number of L3 handles supported */
1343   int nUsrStats;/**< Maximum number of user-defined statistics supported (maximum: 512)*/
1344   int nMaxVlnk; /**< Maximum number of virtual links supported */
1345   int nMaxAcl;  /**< Maximum number of Stateless ACL handles supported (Gen2 only)*/
1346   int nMaxFc;   /**< Maximum number of Flow Cache Hanndles supported (Gen2 only) */
1347   int nMaxEoam; /**< Maximum number of EOAM Hanndles supported (Gen2 only). Please refer to @ref appendix8 for details about EOAM mode. */  
1348 } paSizeInfo_t;
1350 /**
1351  *  @ingroup salld_api_constants
1352  *  @{
1353  *  @brief  PA Reassembly Engine related constant definitions
1354  */
1355 #define pa_RA_MAX_HEAP_REGIONS    2    /**< Maxmium number of RA Heap Regions */ 
1356 #define pa_RA_NUM_GROUPS          2    /**< Number of RA groups */
1358 /**
1359  *  @ingroup palld_api_structures
1360  *  @brief PA Reassembly  Engine global config structure
1361  *
1362  *  @details The parameters in this structure are used to configure the Reassembly
1363  *           engine with PASS
1364  */
1365 typedef struct  {
1366   int           ipv4MinPktSize;     /**< Specify the minimum packet size in bytes for a fragment of an
1367                                          Ipv4 packet that is not the last fragment. The deafult value 
1368                                          is 68 byte to contain 60 bytes of IP header including options
1369                                          plus 8-byte of payload */
1370   int           numCxts;            /**< Total number of contexts the RA handles. This value affects 
1371                                          the amount of heap memory that needs to be allocated. This 
1372                                          value must be between 0x1 and 0x400 (1k). If set to 0, all 
1373                                          fragments will be discarded. The default value is 0x400. 
1374                                          Note: Each context requires 65kB heap memory */
1375   int           cxtDiscardThresh;   /**< Number of concurrent contexts that, once reached, causes the 
1376                                          oldest current context to be forcibly timed out.  To prevent 
1377                                          this behavior, this value should be programmed to be equal to 
1378                                          or greater than the Total Contexts. This value must be between 
1379                                          0x1 and 0x400 (1k). The default value is 0x400. */
1380   int           nodeDiscardThresh;  /**< Number of Nodes that, once reached, causes the oldest current 
1381                                          context to be forcibly timed out.  To prevent this behavior, 
1382                                          this value should be programmed to be the maximum value 
1383                                          (there are 4K total nodes). This value must be between 0x1 
1384                                          and 0x1000 (4K). The default value is 0xFFF. */
1385   int           cxtTimeout;         /**< Amount of time (in ms) after a new context has been allocated until 
1386                                          that context times out.  If timeout occurs before a packet is completely 
1387                                          reassembled and the SOP fragment has been received, a packet containing 
1388                                          the IP header and the first 8 bytes of data is forwarded up to the host 
1389                                          that it can respond with an ICPM Time Exceeded message as per RFC 792.  
1390                                          If a context times out and the SOP fragment has not been received, 
1391                                          the packet is discarded and the context freed. */ 
1392   int           clockRate;          /**< Clock rate of the Reassembly engine in MHz. */                                        
1393   int           heapRegionThresh;   /**< Number of contexts handled in Region 0 of the Reassembly Heap. All contexts 
1394                                          in excess of this number are handled in Region 1. If Region 1 is not used, 
1395                                          this value should be set equal to (or higher) than Total Contexts. */
1396   uint64_t      heapBase[pa_RA_MAX_HEAP_REGIONS];   /**< Reassembly Heap addresses which should be 64-byte aligned */                                                                                                                                                                                                                                       
1397 } paRaConfig_t;
1399 /**
1400  * @ingroup palld_api_structures
1401  * @brief  PA LUT1 Information Structure
1402  *
1403  * @details LLD can return the LUT1 information using @ref Pa_getLUT1Info API calls.
1404  */
1405 typedef struct {
1406   int lut1Inst;   /**< which LUT1 (0-2) Instance is used */
1407   int lut1Index; /**< which LUT1 entry (0-63) is used  */
1408 } paLUT1Info_t;
1410 /**
1411  *  @ingroup palld_api_structures
1412  *  @brief PA Initialization config structure
1413  *
1414  *  @details The parameters in this structure are used to do initial setup
1415  *           of the driver including its base address and other default settings.
1416  *           
1417  *  @note    The stream interface switch controls the destination of the traffic
1418  *           from the Ethernet switch. The default setting of the streaming
1419  *           interface switch is to route all traffic to host queues.  
1420  *           This module is designed to receive the incoming packets at the PDSP0.
1421  *           If the initDeafultRoute is set to TRUE, this module will re-configure
1422  *           the stream interface switch to route all traffic to PDSP0. Otherwise,
1423  *           it is the module user's reponsibility to deliver incoming packets
1424  *           to PDSP0 via the CPPI/QMSS interface.           
1425  */
1426 typedef struct  {
1427   uint16_t      initTable;          /**< If True then the L2/L3/ACL tables are initialized */
1428   uint16_t      initDefaultRoute;   /**< If True then the switch default route is set to PASS PDSP0 */
1429   uint32_t      baseAddr;           /**< Specify the PASS base address */
1430   void*             instPoolBaseAddr;   /**< Base address of the global shared memory pool from which global 
1431                                                                              LLD instance & channel instance memory is allocated */
1432   pa_RmHnd      rmServiceHandle;    /**< Resource Manager service handle */
1433   paSizeInfo_t* sizeCfg;            /**< Pointer to the size configuration information */
1434   paRaConfig_t* raCfg;              /**< Pointer to the RA global configuration information (Gen2 only) */
1435 } paConfig_t;
1437 /**
1438  *  @ingroup salld_api_constants
1439  *  @{
1440  *  @brief  Protocol Limit related constant definitions
1441  */
1442 #define pa_PROTOCOL_LIMIT_NUM_VLANS_DEF    2    /**< Number of VLAN supported: default value */ 
1443 #define pa_PROTOCOL_LIMIT_NUM_IP_DEF       2    /**< Number of IP layers supported: default value */ 
1444 #define pa_PROTOCOL_LIMIT_NUM_GRE_DEF      2    /**< Number of GRE layers supported: default value */
1445 #define pa_PROTOCOL_LIMIT_NUM_VLANS_MAX    3    /**< Number of VLAN supported: maximum value */ 
1446 #define pa_PROTOCOL_LIMIT_NUM_IP_MAX       7    /**< Number of IP layers supported: maximum value */ 
1447 #define pa_PROTOCOL_LIMIT_NUM_GRE_MAX      7    /**< Number of GRE layers supported: maximum value */
1449 /** @} */
1451 /**
1452  *  @ingroup palld_api_structures
1453  *  @brief  Protocol-specific Limitations.
1454  *
1455  *  @details  paProtocolLimit_t is used to defines the protocol-specific restrictions. For example, 
1456  *            it is necessary to limit the number of protocol layers such as GRE of the input packets 
1457  *            to prevent the irregular packets take too much processing time. 
1458  *            The PASS will detect the packets which violate the protocol-specific restrictions and either discard 
1459  *            or forward the packets to host queues which can be specified through API @ref Pa_configExceptionRoute.
1460  * 
1461  *  @note     The PASS will work when non-default values are used. However, it may limit the supported packet rate 
1462  *            below wire rate.
1463  */
1464 typedef struct {
1466   uint8_t vlanMax; /**< Maximum number of VLANs supported, default = 2, maximum = 3 */
1467   uint8_t ipMax;   /**< Maximum number of IP layers supported, default = 2, maximum = 7 */
1468   uint8_t greMax;  /**< Maximum number of GRE layers supported, default = 2, maximum = 7 */
1470 } paProtocolLimit_t;
1472 /**
1473  *  @ingroup palld_api_structures
1474  *  @brief  IP Reassembly Configuration Information.
1475  *
1476  *  @details  paIpReassmConfig_t is used to configure the PA-assisted IP reassembly operation. Two separate structures are used 
1477  *            for the outer IP and inner IP respectively. The IP reassembly assistance feature is disabled until 
1478  *            this information is provided. See section @ref appendix3 for deatiled description. 
1479  *  @note The maximum number of traffic flows is limited due to processing time and internal memory restriction.
1480  */
1481 typedef struct {
1483   uint8_t numTrafficFlow; /**< Maximum number of IP reassembly traffic flows supported, default = 0, maximum = 32 */
1484   uint8_t destFlowId;     /**< CPPI flow which instructs how the link-buffer queues are used for forwarding packets */
1485   uint16_t destQueue;     /**< Destination host queue where PASS will deliver the packets which require IP reassembly assistance */
1487 } paIpReassmConfig_t;
1489 /**
1490  *  @ingroup palld_api_constants
1491  *  @brief   Define the maximum number of IP reassembly traffic flows 
1492  *
1493  */
1494 #define pa_MAX_IP_REASM_TRAFFIC_FLOWS   32 
1496 /**
1497  *  @ingroup palld_api_structures
1498  *  @brief  Command Set Configuration Information.
1499  *
1500  *  @details  paCmdSetConfig_t defines command set configuration parameters such as the maximum number of command sets.
1501  *            The PASS supports either 64 of 64-byte or 32 of 128-byte command sets. The number of command sets should 
1502  *            be configured at system startup. 
1503  */
1504 typedef struct {
1506   uint8_t  numCmdSets; /**<  Number of command sets supported (32, 64), default = 64
1507                              @note If the number of command sets is set to 64, then each command entry will be limited to 64 bytes.
1508                                    If the number of command sets is set to 32, then each command entry will be limited to 128 bytes */
1509 } paCmdSetConfig_t;
1511 /**
1512  *  @ingroup palld_api_structures
1513  *  @brief  User-defined Statistics Configuration Information.
1514  *
1515  *  @details  paUsrStatsConfig_t defines the configuration parameters for multi-level hierarchical user-defined statistics 
1516  *            operation such as the number of user-defined counters. There are up to 512 user-defined statistics consisting of 
1517  *            some 64-bit counters and some 32-bit counters whereas the total size of all counters cannot exceed 2048 bytes. 
1518  *            The user-defined statistics feature is disabled until this configuration is invoked through API @ref Pa_control. 
1519  *
1520  *            - 64-bit Counters index: 0 - (num64bCounters - 1)
1521  *            - 32-bit Counters index: num64bCounters - (numCounters - 1)
1522  */
1523 typedef struct {
1525   uint16_t numCounters;     /**< Total number of user-defined counters, default = 0, maximum = 512 */
1526   uint16_t num64bCounters;  /**< Number of 64-bit user-defined counters, default = 0, maximum = 256 */
1527    
1528 } paUsrStatsConfig_t;
1529  
1530 /**
1531  *  @ingroup salld_api_constants
1532  *  @brief   Define the maximum number of user-defined statistics the module supports.
1533  *
1534  */
1535 #define pa_USR_STATS_MAX_COUNTERS        512
1537 /**
1538  *  @ingroup salld_api_constants
1539  *  @brief   Define the maximum number of user-defined 64-bit statistics 
1540  *
1541  */
1542 #define pa_USR_STATS_MAX_64B_COUNTERS    (pa_USR_STATS_MAX_COUNTERS/2)
1543 /**
1544  *  @ingroup salld_api_constants
1545  *  @brief   Define the maximum number of user-defined 32-bit statistics 
1546  *
1547  */
1548 #define pa_USR_STATS_MAX_32B_COUNTERS    pa_USR_STATS_MAX_COUNTERS
1550 /**
1551  *  @defgroup paUsrStatsSizes PA User-defined Ststaistics Counter Sizes
1552  *  @ingroup palld_api_constants
1553  *  @{
1554  *
1555  *  @name User-defined Ststaistics Counter Sizes
1556  *
1557  *  Definition of Counter size of the User-defined Statistics
1558  */ 
1559 /** @ingroup paUsrStatsSizes */
1560 /*@{*/
1561 typedef enum {
1562   pa_USR_STATS_SIZE_32B = 0,   /**< 32-bit Counter */
1563   pa_USR_STATS_SIZE_64B        /**< 64-bit Counter */
1564 } paUsrStatsSizes_e;
1565 /*@}*/
1566 /** @} */
1569 /**
1570  *  @ingroup palld_api_structures
1571  *  @brief  Queue Diversion Configuration Information.
1572  *
1573  *  @details  The PASS supports optional queue diversion operation per LUT2 entry replacement. 
1574  *            paQueueDivertConfigl_t contains configuration information for the atomic queue diversion operation.
1575  *            The queue diversion feature is disabled until this configuration is invoked through API @ref Pa_control. 
1576  *
1577  */
1578 typedef struct {
1580   uint16_t destQueue;     /**< Destination queue where PASS will deliver the LUT2 response packet which contains the 
1581                                queue diversion information */
1582   uint8_t  destFlowId;    /**< CPPI flow which instructs how the link-buffer queues are used for forwarding 
1583                                the LUT2 response packets */
1584 } paQueueDivertConfig_t;
1587 /**
1588  *  @defgroup paPktControlInfo  PA Packet Control Bit Definitions
1589  *  @ingroup palld_api_constants
1590  *  @{
1591  *
1592  *  @name PA Packet Control Bit Definitions
1593  *
1594  *  Bitmap definition of the ctrlBitMap in @ref paPacketControlConfig_t
1595  *  and @ref paPacketControl2Config_t. 
1596  */ 
1597 /*@{*/
1598 /**
1599  *  @def  pa_PKT_CTRL_HDR_VERIFY_PPPoE
1600  *        Control Info -- Set: Perform enhanced error check of the PPPoE header
1601  *                        Clear: Perform basic error check of the PPPoE header
1602  */
1603 #define pa_PKT_CTRL_HDR_VERIFY_PPPoE               0x0001 
1604 /**
1605  *  @def  pa_PKT_CTRL_HDR_VERIFY_IP
1606  *        Control Info -- Set: Perform enhanced error check of the IP header
1607  *                        Clear: Perform basic error check of the IP header
1608  */
1609 #define pa_PKT_CTRL_HDR_VERIFY_IP                  0x0002 
1610 /**
1611  *  @def  pa_PKT_CTRL_MAC_PADDING_CHK
1612  *        Control Info -- Set: Perform MAC (802.3) padding check
1613  *                             The packet with illegal padding will be dropped  
1614  *                        Clear: Do not perform MAC (802.3) padding check
1615  */
1616 #define pa_PKT_CTRL_MAC_PADDING_CHK                0x0004 
1617 /**
1618  *  @def  pa_PKT_CTRL_IP_FRAGS_TO_EROUTE
1619  *        Control Info -- Set: Forward IP Fragments through the exception route regardless of the routing destination 
1620  *                        Clear: Forward IP Fragments through the exception route only if the routing destination is set to SASS or CONTINUE_PARSE
1621  */
1622 #define pa_PKT_CTRL_IP_FRAGS_TO_EROUTE             0x0008 
1623 /**
1624  *  @def  pa_PKT_CTRL_L3OFFSET_TO_INNER_IP
1625  *        Control Info -- Set: L3offset of the packet information points to the inner IP header prior to payload
1626  *                        Clear: L3offset of the packet information points to the outer IP header (default)
1627  */
1628 #define pa_PKT_CTRL_L3OFFSET_TO_INNER_IP           0x0010 
1630 /**
1631  *  @def  pa_PKT_CTRL_EMAC_IF_IGRESS_CLONE
1632  *        Control Info -- Set: Enable EMAC interface-based packet capture/mirror for ingress ethernet traffic
1633  *                        Clear: disable EMAC interface-based packet capture/mirror (default) for ingress ethernet traffic
1634  *  @note This definition is only vaild at @ref paPacketControl2Config_t. 
1635  */
1636 #define pa_PKT_CTRL_EMAC_IF_IGRESS_CLONE           0x0020
1638 /**
1639  *  @def  pa_PKT_CTRL_EMAC_IF_EGRESS_CLONE
1640  *        Control Info -- Set: Enable EMAC interface-based packet capture/mirror for egress ethernet traffic
1641  *                        Clear: disable EMAC interface-based packet capture/mirror (default) for egress ethernet traffic
1642  *  @note This definition is only vaild at @ref paPacketControl2Config_t. 
1643  */
1644 #define pa_PKT_CTRL_EMAC_IF_EGRESS_CLONE           0x0040
1646 /**
1647  *  @def  pa_PKT_CTRL_EMAC_IF_INGRESS_DEFAULT_ROUTE   
1648  *        Control Info -- Set: Enable EMAC interface-based ingress packet default route
1649  *                        Clear: disable EMAC interface-based ingress packet default route
1650  *  @note This definition is only vaild at @ref paPacketControl2Config_t. 
1651  */
1652 #define pa_PKT_CTRL_EMAC_IF_INGRESS_DEFAULT_ROUTE  0x0080
1654 /**
1655  *  @def  pa_PKT_CTRL_EMAC_IF_EGRESS_EQoS_MODE
1656  *        Control Info -- Set: Enable EMAC interface-based enhanced QoS Mode for egress ethernet traffic
1657  *                        Clear: Disable EMAC interface-based enhanced QoS Mode for egress ethernet traffic
1658  *  @note This definition is only vaild at @ref paPacketControl2Config_t. 
1659  */
1660 #define pa_PKT_CTRL_EMAC_IF_EGRESS_EQoS_MODE       0x0100
1662 /*@}*/
1663 /** @} */
1665 /**
1666  *  @ingroup palld_api_structures
1667  *  @brief  Packet Control Configuration Information.
1668  *
1669  *  @details  This data structure defines miscellaneous packet control information for some non-default PASS operations. 
1670  *            For example, PASS always performs basic protocol header verification to ensure that it can continue parsing the  
1671  *            current and next protocol header. The PASS will perform enhanced error check of protocol headers specified
1672  *            by this configuration. For example,
1673  *            PPPoE header in session mode:
1674  *              - Version = 1
1675  *              - Type = 1
1676  *              - Code = 0
1677  *
1678  *            IPv4 header:
1679  *              - Header length >= 20
1680  *              - Total length > 20
1681  *              - Source address is not broadcast
1682  *              - Destination address is not 0
1683  *              - TTL is not 0
1684  *
1685  *  @note refer to the @ref ErouteTypes for the corresponding exception routes.
1686  *  @note This data structure will be depreciated and replaced with paPacketControl2Config_t due to its limitation that
1687  *        all desired control bits and other parameters must be provided when it is invoked every time.
1688  */
1689 typedef struct {
1691   uint16_t ctrlBitMap;              /**< Packet control bit as defined at @ref paPktControlInfo */
1692   uint16_t rxPaddingErrStatsIndex;  /**< Specify the user statistics index of Rx padding error counter */
1693   uint16_t txPaddingStatsIndex;     /**< Specify the user statistics index of Tx MAC padding counter */
1695 } paPacketControlConfig_t;
1697 /**
1698  *  @defgroup paPktControlValidBits  PA Packet Control Valid Bit Definitions
1699  *  @ingroup palld_api_constants
1700  *  @{
1701  *
1702  *  @name PA Packet Control Valid Bit Definitions
1703  *
1704  *  Bitmap definition of the validBitmap in @ref paPacketControl2Config_t. 
1705  */ 
1706 /*@{*/
1708 /**
1709  *  @def  pa_PKT_CTRL2_VALID_PPPoE_HDR_CHECK
1710  *        - Header check configuration for PPPoE is present in the configuration
1711  */
1712 #define pa_PKT_CTRL2_VALID_PPPoE_HDR_CHECK     pa_PKT_CTRL_HDR_VERIFY_PPPoE
1714 /**
1715  *  @def  pa_PKT_CTRL2_VALID_IP_HDR_CHECK
1716  *        - Header check configuration for IP is present in the configuration
1717  */
1718 #define pa_PKT_CTRL2_VALID_IP_HDR_CHECK        pa_PKT_CTRL_HDR_VERIFY_IP
1720 /**
1721  *  @def  pa_PKT_CTRL2_VALID_MAC_PADDING_CHECK
1722  *        - MAC padding check configuration is present in the configuration
1723  */
1724 #define pa_PKT_CTRL2_VALID_MAC_PADDING_CHECK   pa_PKT_CTRL_MAC_PADDING_CHK
1726 /**
1727  *  @def  pa_PKT_CTRL2_VALID_IP_FRAGS_TO_EROUTE
1728  *        - IP fragmentation exception routing configuration is present in the configuration
1729  */
1730 #define pa_PKT_CTRL2_VALID_IP_FRAGS_TO_EROUTE  pa_PKT_CTRL_IP_FRAGS_TO_EROUTE
1732 /**
1733  *  @def  pa_PKT_CTRL2_VALID_L3_OFFSET
1734  *        - L3 offset to inner/outer IP configuration is present in the configuration
1735  */
1736 #define pa_PKT_CTRL2_VALID_L3_OFFSET           pa_PKT_CTRL_L3OFFSET_TO_INNER_IP
1738 /**
1739  *  @def  pa_PKT_CTRL2_VALID_EMAC_IF_IGRESS_CLONE
1740  *        - Valid Ingress packet capture/mirror configuration is present in the configuration
1741  */
1742 #define pa_PKT_CTRL2_VALID_EMAC_IF_IGRESS_CLONE        pa_PKT_CTRL_EMAC_IF_IGRESS_CLONE
1744 /**
1745  *  @def  pa_PKT_CTRL2_VALID_EMAC_IF_EGRESS_CLONE
1746  *        - Valid Egress packet capture/mirror configuration is present in the configuration
1747  */
1748 #define pa_PKT_CTRL2_VALID_EMAC_IF_EGRESS_CLONE        pa_PKT_CTRL_EMAC_IF_EGRESS_CLONE
1749 /**
1750  *  @def  pa_PKT_CTRL2_VALID_EMAC_IF_INGRESS_DEFAULT_ROUTE   
1751  *        - Valid emac interface ingress default route configuration is present
1752  */
1753 #define pa_PKT_CTRL2_VALID_EMAC_IF_INGRESS_DEFAULT_ROUTE pa_PKT_CTRL_EMAC_IF_INGRESS_DEFAULT_ROUTE
1755 /**
1756  *  @def  pa_PKT_CTRL2_VALID_EMAC_IF_EGRESS_EQoS_MODE 
1757  *        - Valid emac interface egress enhanced QoS mode is present
1758  */
1759 #define pa_PKT_CTRL2_VALID_EMAC_IF_EGRESS_EQoS_MODE      pa_PKT_CTRL_EMAC_IF_EGRESS_EQoS_MODE
1761 /**
1762  *  @def  pa_PKT_CTRL2_VALID_PADDING_STATS_INDEX 
1763  *        - Valid rxPaddingErrStatsIndex and txPaddingStatsIndex are present
1764  */
1765 #define pa_PKT_CTRL2_VALID_PADDING_STATS_INDEX           0x8000
1767 /* @} */ 
1768 /** @} */
1770 /**
1771  *  @ingroup palld_api_structures
1772  *  @brief  Packet Control Configuration2 Information.
1773  *
1774  *  @brief  Enhanced Packet Control configuration structure
1775  *
1776  *  @details  paPacketControl2Config_t is the upgraded version of paPacketControlConfig_t to support 
1777  *            individual feature control without affecting the other feature operations. It is achieved
1778  *            by introducing the parameter validBitMap where only the valid control bits and their
1779  *            associated parameters will be processed by PASS and the other feature operations will
1780  *            not be affected. 
1781  */
1782 typedef struct {
1784   uint16_t validBitMap;             /**< Valid control bits as defined at @ref paPktControlValidBits */
1785   uint16_t ctrlBitMap;              /**< Packet control bit as defined at @ref paPktControlInfo */
1786   uint16_t rxPaddingErrStatsIndex;  /**< Specify the user statistics index of Rx padding error counter 
1787                                          note This parameter is valid only if pa_PKT_CTRL2_VALID_PADDING_STATS_INDEX is set.*/
1788   uint16_t txPaddingStatsIndex;     /**< Specify the user statistics index of Tx MAC padding counter 
1789                                          note This parameter is valid only if pa_PKT_CTRL2_VALID_PADDING_STATS_INDEX is set.*/
1790   uint8_t  egressDefPri;            /**< Specify the global default priority for untagged non IP egress traffic 
1791                                          for enhanced QoS mode (refer to @ref appendix7)
1792                                          @note This parameter is valid only if both pa_PKT_CTRL2_VALID_EMAC_IF_EGRESS_EQoS_MODE 
1793                                          and the corresponding enable bit are set. */
1794    
1795 } paPacketControl2Config_t;
1798 /**
1799  *  @defgroup  paAclActionTypes PA ACL action types
1800  *  @ingroup palld_api_constants
1801  *  @{
1802  *
1803  *  @name   PA ACL action types
1804  *  @brief  Define the ACL action types.
1805  *
1806  *  @details Define actions to be taken when an ACL entry is matched
1807  */
1808 /* @{ */
1809 /**
1810  *  @def  pa_ACL_ACTION_PERMIT
1811  *        Allow matched packets to be forwarded to the next stage
1812  */
1813 #define  pa_ACL_ACTION_PERMIT    0
1815 /**
1816  *  @def  pa_ACL_ACTION_DENY
1817  *        Matched packets should be dropped
1818  */
1819 #define  pa_ACL_ACTION_DENY      1
1821 /**
1822  *  @def  pa_ACL_ACTION_MARK
1823  *        Matched packets should be forwarded with a mark which may be used later by hardware or software
1824  */
1825 #define  pa_ACL_ACTION_MARK      2
1827 /**
1828  *
1829  *   @def  pa_ACL_ACTION_HOST
1830  *         The packet should be forwarded to host for further processing 
1831  *   @note This action is only applicable to default rule
1832  */
1833 #define pa_ACL_ACTION_HOST       3
1835 #define pa_ACL_ACTION_MAX        pa_ACL_ACTION_HOST
1836   
1837 /*  @}  */  
1838 /** @} */
1840 /**
1841  *  @defgroup  paAclInsertModes PA ACL insert modes
1842  *  @ingroup palld_api_constants
1843  *  @{
1844  *
1845  *  @name   PA ACL Insert Modes
1846  *  @brief  Define the ACL insert mode types.
1847  *
1848  *  @details ACL entries are ordered entries, each entry having a priority associated with it.
1849  *
1850  *           When application has a prior knowledge about the 
1851  *           new (latest) entry being inserted typically has highest priority against the 
1852  *           entries already done OR 
1853  *           new (latest) entry being inserted typically has lowest priority against the 
1854  *           entries already done OR 
1855  *           has no prior information on the priority of the new entry, it can indicate it 
1856  *           in the ACL insert mode parameter during the ACL configuration @ref paAclConfig_t
1857  *        
1858  *           This information can be used inside LLD to minimize the manual re-score operations as a result of
1859  *           inserting ordered entries
1860  */
1861 /* @{ */
1862 /**
1863  *  @def  pa_ACL_INSERT_TOP
1864  *        Application adds new ACL entry to the top of the ACL table typically (typically new entry that is going to be inserted has highest priority).
1865  */
1866 #define  pa_ACL_INSERT_TOP         2
1868 /**
1869  *  @def  pa_ACL_INSERT_BOTTOM
1870  *        Application adds new ACL entry to the bottom of the ACL table typically (typically new entry  that is going to be inserted has lowest priority).
1871  */
1872 #define  pa_ACL_INSERT_BOTTOM      1
1874 /**
1875  *  @def  pa_ACL_INSERT_RANDOM
1876  *        Application adds new ACL entry in any order (application has no prior knowledge on the priority of the new entries that are going to be inserted).
1877  */
1878 #define  pa_ACL_INSERT_RANDOM      0
1879  
1880 /*  @}  */  
1881 /** @} */
1884 /**
1885  *  @ingroup palld_api_structures
1886  *  @brief  Stateless ACL Configuration Information.
1887  *
1888  *  @details  paAclConfig_t is used to configure the default rule of stateless ACL operation. The PASS will follow
1889  *            this rule if no matches are found at the ACL table. Two separate structures are used 
1890  *            for the outer ACL and inner ACL respectively. The default rule is set to packet FORWARDING until  
1891  *            this information is provided. 
1892  */
1893 typedef struct {
1895   int      action;      /**< Default action (Deny/Permit/Host) as sepcified at @ref paAclActionTypes */
1896   uint8_t  destFlowId;  /**< CPPI flow which instructs how the link-buffer queues are used for forwarding packets to host. 
1897                              (valid only if action = pa_ACL_ACTION_HOST) */
1898   uint16_t destQueue;   /**< Destination host queue where PASS will deliver the packets if no ACL matches found 
1899                              (valid only if action = pa_ACL_ACTION_HOST) */
1900   int      insertMode;  /**< Typical insert order (Top/Bottom/Random) as specified at @ref paAclInsertModes */                              
1901 } paAclConfig_t;
1903 /**
1904  *  @defgroup paRACtrlInfo  PA RA Control Bit Definitions
1905  *  @ingroup palld_api_constants
1906  *  @{
1907  *
1908  *  @name PA RA Control Bit Definitions
1909  *
1910  *  Bitmap definition of the ctrlBitMap in @ref paRaGroupConfig_t. 
1911  *         
1912  */ 
1913 /*@{*/
1914 /**
1915  *  @def  pa_RA_CTRL_ENABLE
1916  *        Control Info -- Set: Enable Reassembly operation, forward all packets to RA
1917  *                        Clear: Disable Reassembly operation, bypass RA
1918  */
1919 #define pa_RA_CTRL_ENABLE           0x0001 
1920 /*@}*/
1921 /**
1922  *  @def  pa_RA_CTRL_USE_LOCAL_DMA
1923  *        Control Info -- Set: Use NetCP internal DMA to send packets from PASS to RA engine
1924  *                        Clear: Use global DMA to send packets from PASS to RA engine
1925  */
1926 #define pa_RA_CTRL_USE_LOCAL_DMA    0x0002 
1927 /**
1928  *  @def  pa_RA_CTRL_TO_QUEUE
1929  *        Control Info -- Set: Forward RA output packets to the host queue specified by the RA output CPPI flow
1930  *                        Clear: Forward RA output pakets to the next PASS classification stage
1931  *  @note: The lower 8-bit of source tag of the input CPPI flow should be set to the output CPPI flow when this set
1932  *         this bit is set and the default queue of the output CPPI flow should be set to the desired destination queue 
1933  */
1934 #define pa_RA_CTRL_TO_QUEUE         0x0004 
1935 /*@}*/
1936 /** @} */
1938 /**
1939  *  @ingroup palld_api_structures
1940  *  @brief  RA exception Route Information.
1941  *
1942  *  @details  The reassembly engine is degined to forward packets to host queue specified by user when timwout or other
1943  *            error condition occurs. paRaERouteInfo_t contains the routing information required for this operation. 
1944  */
1945 typedef struct  {
1947   int      dest;      /**<  Packet destination as defined at @ref pktDest (Host and Discard only) */
1948   uint8_t  flowId;    /**<  Specifies CPPI flow which defines free queues are used for receiving packets */
1949   uint16_t queue;     /**<  Specifies the destination host queue */
1950 } paRaERouteInfo_t;
1952 /**
1953  *  @ingroup palld_api_structures
1954  *  @brief  PA Reassembly Engine Group Configuration Information.
1955  *
1956  *  @details  paRaGroupConfig_t is used to specify the group specific configuration parameters of the PASS 
1957  *            reassembly Engine.  Two separate structures are used for the outer IP and inner IP reassembly 
1958  *            respectively. 
1959  */
1960 typedef struct {
1961   uint16_t              ctrlBitMap;    /**< RA control info as defined at @ref paRACtrlInfo */
1962   uint8_t               flowId;        /**< Specify the RA CPPI flow which defines free queues and other paramters 
1963                                             for sending packets from PASS to RA */ 
1964   paRaERouteInfo_t      timeoutER;     /**< Specify exception route for timeout packets */
1965   paRaERouteInfo_t      critErrER;     /**< Specify exception route for packets with critical error */
1966   paRaERouteInfo_t      genErrER;      /**< Specify exception route for packets with non-critical error*/
1967 } paRaGroupConfig_t;
1969 /**
1970  *  @ingroup palld_api_constants
1971  *  @brief   Define the maximum number ethernet protocol types to be excluded from EOAM classification 
1972  *
1973  *  @details The application can specify the list of ethernet types to be excluded from EOAM classification
1974  *           i.e., the target flow statistics count would not be incremented even though the match happens 
1975  *           when the packet ethernet type matches the list.
1976  *
1977  *           Please refer to @ref appendix8 for details about EOAM mode.
1978  *
1979  */
1980 #define pa_MAX_ETH_PROTO_EOAM_EXCLUSION    8 
1982 /**
1983  *  @ingroup palld_api_structures
1984  *  @brief  PA time offset correction.
1985  *
1986  *  @details  paSetTimeOffset_t is used to set the 1588 time offsets at PASS time 0
1987  *            Please refer to @ref appendix8 for details about EOAM mode.
1988  *
1989  */
1990 typedef struct {
1991   uint32_t           offset_sec;  /**< 1588 Time offset in seconds (needed for features like EOAM) */
1992   uint32_t           offset_ns;   /**< 1588 Time offset in nano seconds (needed for features like EOAM) */  
1993 }paSetTimeOffset_t;
1995 /**
1996  @defgroup paInputFreq Packet Accelerator PLL Frequencies
1997  *  @ingroup palld_api_constants
1998  *  @{
1999  *
2000  *  @name Packet Accelerator PLL input frequency (Gen2 only)
2001  *
2002  *  paInputFreq_e is used to provide the input frequency to PASS programmed either through PA clock or
2003  *  system clock in MHz. This parameter is useful in converting the ticks to seconds and nano seconds.  
2004  *
2005  *  @details This information is required for firmware to convert the time ticks to seconds and nano
2006  *           seconds. The mathematical operations and the scheme involved in such conversion
2007  *           requires the input frequency. Hence, not all possible frequencies are supported. 
2008  *           The converted time can be used to patch the time in the message using 
2009  *           @ref pa_CMD_PATCH_TIME. The mathematical operations
2010  *           in firmware are optimized for these frequency lists.
2011  *
2012  *  @note This parameter can be ignored if EOAM mode is not enabled and the message is not patched 
2013  *        for time.
2014  */ 
2015 /** @ingroup paInputFreq */
2016 /*@{*/
2017 typedef enum {
2018   pa_INPUT_FREQ_1000MHZ = 1,       /**< PASS Input frequency is 1000 MHz */
2019   pa_INPUT_FREQ_1050MHZ,           /**< PASS Input frequency is 1050 MHz */
2020   pa_INPUT_FREQ_1049p6MHZ          /**< PASS Input frequency is 1049.6 MHz */
2021 } paInputFreq_e;
2023 /*@}*/
2024 /** @} */
2026 /**
2027  *  @ingroup palld_api_structures
2028  *  @brief  PA Ethernet OAM target flow match Statistics control configuration Information.
2029  *
2030  *  @details  paEoamTfExcCtrlConfig_t is used to exclude few ethernet types from EOAM target classification
2031  *            Please refer to @ref appendix8 for details about EOAM mode.
2032  *
2033  */
2034 typedef struct {
2035   uint8_t                  numProtoExcl;                          /**< Number of protocol to be excluded from EOAM target classifiation */
2036   uint16_t                 exclEthTypes[pa_MAX_ETH_PROTO_EOAM_EXCLUSION]; /**< maximum number of ethernet types to be excluded from EOAM target classification */  
2037 } paEoamTfExcCtrlConfig_t;
2039 /**
2040  *  @defgroup paEoamGlobalValidInfo  PA EOAM Global Configuration Valid Bit Definitions
2041  *  @ingroup palld_api_constants
2042  *  @{
2043  *
2044  *  @name PA Global Config Valid Bit Definitions
2045  *
2046  *  Bitmap definition of the validBitmap in @ref paEoamGlobalConfig_t. 
2047  */ 
2048 /*@{*/
2049 /**
2050  *  @def  pa_EOAM_VALID_STATS_CTRL
2051  *        - Control to increment the Ethernet OAM target flow matches is present
2052  */
2053 #define pa_EOAM_VALID_STATS_CTRL              (1<<0)
2055 /* @} */ /* ingroup */
2056 /** @} */
2059 /**
2060  *  @ingroup palld_api_structures
2061  *  @brief  PA Ethernet OAM Global Configuration Information.
2062  *
2063  *  @details  paEoamGlobalConfig_t is used to configure the Ethernet OAM parameters.
2064  *
2065  *            Please refer to @ref appendix8 for details about EOAM mode.
2066  *
2067  *  @warning EOAM mode can not co-exist with Outer ACL firewall operations. Please make sure
2068  *           Outer ACL is not configured during EOAM system configuration. There is no dynamic
2069  *           switching between the original mode and EOAM mode. 
2070  */
2071 typedef struct {
2072   uint32_t                 validBitMap; /**< Valid control bits as defined at @ref paEoamGlobalValidInfo */
2073   uint32_t                 enable;      /**< Enable/Disable EOAM feature, As Outer ACL and EOAM can not co-exist, make sure Outer ACL
2074                                              entries are all removed before adding the EOAM entries in the LUT table */
2075   paInputFreq_e            freq;        /**< Mandatory: PA Input Frequency in MHz as defined at @ref paInputFreq_e */ 
2076   paEoamTfExcCtrlConfig_t  statsCtrl;   /**< Ethernet OAM target flow exclusion protocol control @ref paEoamTfExcCtrlConfig_t */
2077 } paEoamGlobalConfig_t;
2079 /**
2080  *  @defgroup paQueueBounceRoutingClass PA Queue Bounce Routing Class
2081  *  @ingroup palld_api_constants
2082  *  @{
2083  *
2084  *  @name PA Queue Bounce Routing Class
2085  *
2086  *  Definition of PA Queue Bounce Routing Classes
2087  */
2088 /** @ingroup paQueueBounceRoutingClass */
2089 /*@{*/
2090 typedef enum {
2091   pa_QUEUE_BOUNCE_ROUTING_CLASS_CMD_RET = 0,   /**< Command Return */
2092   pa_QUEUE_BOUNCE_ROUTING_CLASS_QoS,           /**< Ingress QoS Packets */
2093   pa_QUEUE_BOUNCE_ROUTING_CLASS_CAPTURE,       /**< Packet Capture */
2094   pa_QUEUE_BOUNCE_ROUTING_CLASS_IP_REASSEMBLY, /**< IP Reassembly-assisted packets */
2095   pa_QUEUE_BOUNCE_ROUTING_CLASS_MISC,          /**< All other Traffic */
2096   PA_MAX_QUEUE_BOUNCE_ROUTING_CLASSES
2097 }paQueueBounceRoutingClass_e ;
2098 /*@}*/
2099 /** @} */
2101 /**
2102  *  @defgroup  paQueueBounceOperationTypes PA Queue Bounce operation modes
2103  *  @ingroup palld_api_constants
2104  *  @{
2105  *
2106  *  @name   PA Queue Bounce operation modes
2107  *  @brief  Define the Queue Bounce operation modes.
2108  */
2109 /* @{ */
2110 /**
2111  *  @def  pa_QUEUE_BOUNCE_OP_NONE
2112  *        No bounce, use the user specified destination queue as it is
2113  */
2114 #define  pa_QUEUE_BOUNCE_OP_NONE    0
2116 /**
2117  *  @def  pa_QUEUE_BOUNCE_OP_DDR
2118  *        Add control bits to indicate bouncing to the DDR Queue
2119  */
2120 #define  pa_QUEUE_BOUNCE_OP_DDR     1
2122 /**
2123  *  @def  pa_QUEUE_BOUNCE_OP_MSMC
2124  *        Add control bits to indicate bouncing to the MSMC queue
2125  */
2126 #define  pa_QUEUE_BOUNCE_OP_MSMC    2
2129 /**
2130  *  @def  pa_QUEUE_BOUNCE_OP_MAX
2131  *        Number of Queue Bounce Operation modes
2132  */
2133 #define pa_QUEUE_BOUNCE_OP_MAX        pa_QUEUE_BOUNCE_OP_MSMC
2134 /*@}*/
2135 /** @} */
2137 /**
2138  *  @ingroup palld_api_structures
2139  *  @brief  PA Queue Bounce Configuration Information.
2140  *
2141  *  @details  paQueueBounceConfig_t is used to configure the PA Queue Bounce operation as described at @ref appendix9.
2142  *
2143  *  @note The Queue Bounce Configuration should be specified at PA system initialization and only once. The dynamic
2144  *  re-configuration is not supported and may cause undefined behaviors.
2145  */
2146 typedef struct {
2148   uint32_t  enable;         /**< Enable/Disable(1/0) Queue Bounce operation, default = 0 (disable) */
2149   uint16_t  ddrQueueId;     /**< Bounce queue where PASS will deliver the host-routed packet with DDR bit set */
2150   uint16_t  msmcQueueId;    /**< Bounce queue where PASS will deliver the host-routed packet with MSMC bit set */
2151   uint16_t  hwQueueBegin;   /**< Queue number of the first NetCP hardware queue */
2152   uint16_t  hwQueueEnd;     /**< Queue number of the last NetCP hardware queue */
2153   uint16_t  defOp[PA_MAX_QUEUE_BOUNCE_ROUTING_CLASSES];  /**< Default Queue Bounce operations per class */
2155 } paQueueBounceConfig_t;
2157 /**
2158  *  @defgroup  paQueueBounceControlBits PA Queue Bounce Control Bits and related definitions
2159  *  @ingroup palld_api_constants
2160  *  @{
2161  *
2162  *  @name   PA Queue Bounce Control Bits
2163  *  @brief  PA Queue Bounce Control Bits and related definitions
2164  */
2165 /* @{ */
2166 /**
2167  *  @def  pa_QUEUE_BOUNCE_CTRL_DEFAULT
2168  *        Use default rule
2169  */
2170 #define  pa_QUEUE_BOUNCE_CTRL_DEFAULT   0
2172 /**
2173  *  @def  pa_QUEUE_BOUNCE_CTRL_DDR
2174  *        Bounce to the DDR Queue
2175  */
2176 #define  pa_QUEUE_BOUNCE_CTRL_DDR       1
2178 /**
2179  *  @def  pa_QUEUE_BOUNCE_CTRL_MSMC
2180  *        Bounce to the MSMC queue
2181  */
2182 #define  pa_QUEUE_BOUNCE_CTRL_MSMC      2
2184 /**
2185  *  @def  pa_QUEUE_BOUNCE_CTRL_NONE
2186  *        No bounce, clear the control bits
2187  */
2188 #define  pa_QUEUE_BOUNCE_CTRL_NONE      3
2190 /**
2191  *  @def  pa_QUEUE_BOUNCE_CTRL_LOC
2192  *        Bit location of the queue bounce control bits
2193  */
2194 #define pa_QUEUE_BOUNCE_CTRL_LOC        14
2196 /**
2197  *  @def  pa_QUEUE_BOUNCE_QUEUE_MASK
2198  *        Actual queue number mask
2199  */
2200 #define pa_QUEUE_BOUNCE_QUEUE_MASK      0x3FFF
2202 /*@}*/
2203 /** @} */
2205 /**
2206  *  @defgroup PA_queue_bounce_op_macros  PA Queue Bounce Operation Macros
2207  *  @ingroup palld_api_macros
2208  *  @{
2209  *  @name PA Queue Bounce Operation Macros
2210  *  Macros used by the PA Queue Bounce Operation to insert/clear control bits
2211  */
2212 /*@{*/
2213 #define PA_BOUNCE_QUEUE_DDR(queueId)        (((queueId) & pa_QUEUE_BOUNCE_QUEUE_MASK) | (pa_QUEUE_BOUNCE_CTRL_DDR << pa_QUEUE_BOUNCE_CTRL_LOC))    /**< Insert control bits to indicate DDR queue bouncing */
2214 #define PA_BOUNCE_QUEUE_MSMC(queueId)       (((queueId) & pa_QUEUE_BOUNCE_QUEUE_MASK) | (pa_QUEUE_BOUNCE_CTRL_MSMC << pa_QUEUE_BOUNCE_CTRL_LOC))   /**< Insert control bits to indicate MSMC queue bouncing */
2215 #define PA_BOUNCE_QUEUE_NONE(queueId)       (((queueId) & pa_QUEUE_BOUNCE_QUEUE_MASK) | (pa_QUEUE_BOUNCE_CTRL_NONE << pa_QUEUE_BOUNCE_CTRL_LOC))   /**< Incert control bits to indicate no queue bouncing */
2216 #define PA_BOUNCE_QUEUE_DEFAULT(queueId)    ((queueId) & pa_QUEUE_BOUNCE_QUEUE_MASK)    /**< Clear control bits to indicate default operation */
2218 /*@}*/ /* PA_queue_bounce_op_macros */
2219 /** @}*/ /* PA Queue Bounce Operation Macros */
2221 /**
2222  * @ingroup palld_api_structures
2223  * @brief PA System Configuration Information structure
2224  *
2225  * @details paSysConfig_t contains pointers to the system-level configuration structures defined above. The null pointer 
2226  *          indicates the configuration of the corresponding sub-group is not required.
2227  */
2228 typedef struct {
2229   paProtocolLimit_t*        pProtoLimit;           /**< Pointer to the protocol limit configuration structure */
2230   paIpReassmConfig_t*       pOutIpReassmConfig;    /**< Pointer to the outer IP PASS-assisted Reassembly configuration structure */
2231   paIpReassmConfig_t*       pInIpReassmConfig;     /**< Pointer to the inner IP PASS-assisted Reassembly configuration structure */
2232   paCmdSetConfig_t*         pCmdSetConfig;         /**< Pointer to the command set configuration structure */
2233   paUsrStatsConfig_t*       pUsrStatsConfig;       /**< Pointer to the user-defined statistics configuration structure */
2234   paQueueDivertConfig_t*    pQueueDivertConfig;    /**< Pointer to the queue-diversion configuration structure */
2235   paPacketControlConfig_t*  pPktControl;           /**< Pointer to the packet control configuration structure */
2236   paQueueBounceConfig_t*    pQueueBounceConfig;    /**< Pointer to the Queue Bounce configuration structure */
2237   paAclConfig_t*            pOutAclConfig;         /**< Pointer to the outer ACL configuration structure */
2238   paAclConfig_t*            pInAclConfig;          /**< Pointer to the inner ACL configuration structure */
2239   paRaGroupConfig_t*        pOutIpRaGroupConfig;   /**< Poimter to the outer IP Reassembly group configuration structure */
2240   paRaGroupConfig_t*        pInIpRaGroupConfig;    /**< Poimter to the inner IP Reassembly group configuration structure */
2241   paPacketControl2Config_t* pPktControl2;          /**< Pointer to the packet control 2 configuration structure */
2242   paEoamGlobalConfig_t*     pEoamConfig;           /**< Pointer to the EOAM Global configuration structure */
2243 } paSysConfig_t;
2245 /**
2246  *  @defgroup pa802p1agDetectInfo  PA 802.1ag Detector Control Bit Definitions
2247  *  @ingroup palld_api_constants
2248  *  @{
2249  *
2250  *  @name PA 802.1ag Detector Control Bit Definitions
2251  *
2252  *  Bitmap definition of the ctrlBitMap in @ref pa802p1agDetConfig_t. 
2253  *         
2254  */ 
2255 /*@{*/
2256 /**
2257  *  @def  pa_802_1ag_DETECT_ENABLE
2258  *        Control Info -- Set: Enable 802.1ag Detector
2259  *                        Clear: Disable 802.1ag Detector
2260  */
2261 #define pa_802_1ag_DETECT_ENABLE           0x0001 
2262 /**
2263  *  @def  pa_802_1ag_DETECT_STANDARD
2264  *        Control Info -- Set: Perform 802.1ag packet detection per 802.1ag formal standard
2265  *                        Clear:  Perform 802.1ag packet detection per 802.1ag draft 
2266  */
2267 #define pa_802_1ag_DETECT_STANDARD         0x0002 
2268 /*@}*/
2269 /** @} */
2271 /**
2272  *  @ingroup palld_api_structures
2273  *  @brief   802.1ag Detection Configuration Information.
2274  *
2275  *  @details  The 802.1ag packet can be recognized with ether type equal to 0x8902 normally. However, the PASS can be 
2276  *            configured to further qualify the IEEE 802.1ag packet per one of the following criteria: 
2277  *            - 802.1ag standard: Destion MAC address = 01-80-c2-00-00-3x, Ether type = 0x8902
2278  *            - 802.1ag draft: Destion MAC address = 01-80-c2-xx-xx-xx, Ether type = 0x8902 
2279  *
2280  *  @note The 802.1ag detector is disabled by default.
2281  *  @note refer to the @ref ErouteTypes for the corresponding exception routes.
2282  * 
2283  */
2284 typedef struct {
2285   uint16_t ctrlBitMap;     /**< 802.1ag Detector control info as defined at @ref pa802p1agDetectInfo */
2286 } pa802p1agDetConfig_t;
2289 /**
2290  *  @defgroup ipsecNatTCtrlInfo  PA IPSEC NAT-T Control Bit Definitions
2291  *  @ingroup palld_api_constants
2292  *  @{
2293  *
2294  *  @name PA IPSEC NAT-T Control Bit Definitions
2295  *
2296  *  Bitmap definition of the ctrlBitMap in @ref paIpsecNatTConfig_t. 
2297  *         
2298  */ 
2299 /*@{*/
2300 /**
2301  *  @def  pa_IPSEC_NAT_T_CTRL_ENABLE
2302  *        Control Info -- Set: Enable IPSEC NAT-T packet detection
2303  *                        Clear: Disable IPSEC NAT-T packet detection
2304  */
2305 #define pa_IPSEC_NAT_T_CTRL_ENABLE           0x0001 
2306 /**
2307  *  @def  pa_IPSEC_NAT_T_CTRL_LOC_LUT1
2308  *        Control Info -- Set: Perform IPSEC NAT-T packet detection at Ingress 1 (LUT1) stage
2309  *                        Clear: Perform IPSEC NAT-T packet detection at Ingress 4 (LUT2) stage (default)
2310  *
2311  *  @details The IPSEC ESP NAT-T packet detector is implemented at the processing stage (PDSP3) where 
2312  *           the LUT2 classification occurs at the first generation PASS. The drawback is that the 
2313  *           detected  IPSEC ESP NAT-T packet has to be re-routed into the PASS Outer IP processing 
2314  *           stage (PDSP1) for continuous processing and this operation reduces the overall throughput.
2315  *           In the 2nd generation PASS, the IPSEC NAT-T detector is implemented within Ingress 1 
2316  *           (Outer IP and IPSEC) processing stage to avoid the re-entry operation. However, the detector
2317  *           is also implemented at the Ingress4 (LUT2) stage to maintain backward compatibility.
2318  *           It is recommended to set this flag to one to enable the IPSEC ESP NAT-T detector at Ingress 1
2319  *           stage to maintain the maximum PASS throughput.
2320  *
2321  *  @note: This feature is only supported by the second generation of PASS and this control bit will be 
2322  *         ignored at the device which uses the first generation of PASS.
2323  *         
2324  */
2325 #define pa_IPSEC_NAT_T_CTRL_LOC_LUT1         0x0002 
2326 /*@}*/
2327 /** @} */
2329 /**
2330  *  @ingroup palld_api_structures
2331  *  @brief   IPSEC NAT-T Packet Detection Configuration Information.
2332  *
2333  *  @details  paIpsecNatTConfig_t is used to configure the IPSEC NAT-T packet detector which is disabled
2334  *            until this configuration is invoked through API @ref Pa_control. 
2335  *
2336  *  @note The IPSEC NAT-T packet detector is disabled by default.
2337  *  @note refer to the @ref ErouteTypes for the corresponding exception routes.
2338  * 
2339  */
2340 typedef struct {
2342   uint16_t ctrlBitMap;     /**< IPSEC NAT-T control info as defined at @ref ipsecNatTCtrlInfo */
2343   uint16_t udpPort;        /**< Specify the UDP port number which uniquely identifies the IPSEC NAT-T packets */
2344 } paIpsecNatTConfig_t;
2346 /**
2347  *  @defgroup paGtpuCtrlInfo  PA GTPU Control Bit Definitions
2348  *  @ingroup palld_api_constants
2349  *  @{
2350  *
2351  *  @name PA GTPU Control Bit Definitions
2352  *
2353  *  Bitmap definition of the ctrlBitmap in @ref paGtpuConfig_t. 
2354  *         
2355  */ 
2356 /*@{*/
2357 /**
2358  *  @def  pa_GTPU_CTRL_USE_LINK
2359  *        Control Info -- Set: GTU-U classification vector consists of the least significant 24-bit of tunnel ID and 8-bit link 
2360  *                             of previous matching
2361  *                        Clear: GTU-U classification vector consists of the 32-bit of tunnel ID only (Default)
2362  */
2363 #define pa_GTPU_CTRL_USE_LINK              0x0001 
2365 /**
2366  *  @def  pa_GTPU_CTRL_ROUTE_END_MARKER_AS_GPDU
2367  *        Control Info -- Set: Configures the GTP-U message routing rule such that the packets with message type 254 (end markers)
2368  *                             are routed the same way as message type 255 (G-PDU), meaning GTPU TEID would be recovered and routed for 
2369  *                             LUT2 match.
2370  *                        Clear: End message routing send to a configured flow/exception route (Default)
2371  */
2372 #define pa_GTPU_CTRL_ROUTE_END_MARKER_AS_GPDU  0x0002 
2374 /*@}*/
2375 /** @} */
2377 /**
2378  *  @ingroup palld_api_structures
2379  *  @brief   GTP-U Configuration Information.
2380  *
2381  *  @details  Due to the LUT2 engine using 32-bit matching parameter, the default GTP-U classification is solely based 
2382  *            on its 32-bit tunnel ID. However, it is desirable to match the GTP-U tunnel with both tunnel ID and 
2383  *            previous link information. This configuration can be used to modify GTP-U classification vector by 
2384  *            combining least significant 24-bit of tunnel ID and an 8-bit previous link. It should be passed to
2385  *            @ref Pa_control() API at system startup.
2386  *
2387  *  @note GTP-U configuration should be performed at system startup. PASS does not support GTP-U 
2388  *        reconfiguration at run time.
2389  *  @note This configuration is used at the first generation of PASS and it is still supported by the second generation PASS 
2390  *        for backward compatibility only. It does not have real effect since the advanced LUT2 engine supports GTPU 32-bit 
2391  *        Tunnel-ID classification with L3 link. It is not necessary to restrict the effective tunnel-ID to 24-bit. 
2392  * 
2393  */
2394 typedef struct {
2395   uint16_t ctrlBitMap;     /**< GTP-U configuration control info as defined at @ref paGtpuCtrlInfo */
2396 } paGtpuConfig_t;
2398 /**
2399  *  @ingroup palld_api_structures
2400  *  @brief  The return type for module functions
2401  *
2402  *  @details  Function calls to this module return values used to determine if the command was successful or
2403  *            the reason for failure (see @ref ReturnValues).
2404  */
2406 typedef int paReturn_t;
2408 /**
2409  *   @ingroup palld_api_structures
2410  *   @brief  paCmdReply_t is used to specify command result (from PASS) routing information
2411  *
2412  *   @details Commands sent to packet accelerator sub-system will generate replies. These replies
2413  *            can be either discarded by the sub-system or routed to a queue. Command replies that
2414  *            must be forwarded back to this module are detailed for each command. The module user
2415  *            typically either selects a unique destination queue for command replies, or else supplies
2416  *            a unique value for replyId. This value is placed into software info word 0 in the 
2417  *            packet descriptor for the returned command. The data in the returned packet is not
2418  *            typically examined by the module user, but passed directly back to this module through 
2419  *            API function @ref Pa_forwardResult to examine the results of the command.
2420  */
2421 typedef struct  {
2423   int       dest;        /**<  Packet destination, must be pa_DEST_HOST or pa_DEST_DISCARD, see @ref pktDest */
2424   uint32_t  replyId;     /**<  Value placed in swinfo0 in reply packet */
2425   uint16_t  queue;       /**<  Destination queue for destination pa_DEST_HOST */
2426   uint8_t   flowId;      /**<  Flow ID used on command reply from PASS */
2427   
2428 } paCmdReply_t;
2430 /**
2431  *  @ingroup palld_api_constants
2432  *  @brief   Define the maximum number of buffers the module can request
2433  *
2434  */
2435 #define pa_N_BUFS_GEN1          5
2436 #define pa_N_BUFS_GEN2          8
2437  
2438 #define pa_N_BUFS               pa_N_BUFS_GEN2
2440 /**
2441  *  @defgroup  paBufIndex PA Memory Buffer Index
2442  *  @ingroup palld_api_constants
2443  *  @{
2444  *
2445  *  @name   PA Memory Buffer Index
2446  *  @brief  Define the buffer inedex of the PA LLD memory blocks.
2447  *
2448  */
2449 /* @{ */
2450 /**
2451  *  @def  pa_BUF_INST
2452  *        PA LLD instance buffer
2453  */
2454 #define pa_BUF_INST             0
2455 /**
2456  *  @def  pa_BUF_L2_TABLE
2457  *        PA LLD match table of Layer 2 (MAC/SRIO) entries
2458  */
2459 #define pa_BUF_L2_TABLE         1
2460 /**
2461  *  @def  pa_BUF_L3_TABLE
2462  *        PA LLD match table of Layer 3 (IP/CustomLUT1) entries
2463  */
2464 #define pa_BUF_L3_TABLE         2
2465 /**
2466  *  @def  pa_BUF_USR_STATS_TABLE
2467  *        PA LLD link table of user-defined statistics 
2468  */
2469 #define pa_BUF_USR_STATS_TABLE  3
2470 /**
2471  *  @def  pa_BUF_VLINK_TABLE
2472  *        PA LLD match table of virtual link entries
2473  */
2474 #define pa_BUF_VLINK_TABLE      4
2475 /**
2476  *  @def  pa_BUF_ACL_TABLE
2477  *        PA LLD match table of ACL entries 
2478  *
2479  *  @note This definition is valid for the second generation PASS only.
2480  */
2481 #define pa_BUF_ACL_TABLE        5
2482 /**
2483  *  @def  pa_BUF_FC_TABLE
2484  *        PA LLD match table of Flow Cache entries 
2485  *
2486  *  @note This definition is valid for the second generation PASS only.
2487  */
2488 #define pa_BUF_FC_TABLE         6
2490 /**
2491  *  @def  pa_BUF_EOAM_TABLE
2492  *        PA LLD match table of EOAM entries such as Y1731
2493  *        Please refer to @ref appendix8 for details about EOAM mode.*
2494  *  @note This definition is valid for the second generation PASS only.
2495  */
2496 #define pa_BUF_EOAM_TABLE       7
2498 /*  @}  */  
2499 /** @} */
2502 /**
2503  *  @ingroup palld_api_functions
2504  *  @brief Pa_getBufferReq returns the memory requirements for the PA driver
2505  *
2506  *  @details This function returns the memory buffer requirements in term
2507  *           of the size and alignment array. The PA LLD requires up to 
2508  *           four memory blocks as described below:
2509  *           - PA Instance: PA instance data
2510  *           - L2 Table: Layer-2 (MAC/SRIO) entry information
2511  *           - L3 Table: Layer-3 (IP/Custom LUT1) entry information
2512  *           - User Statistics Link Table: User-defined Statistics entry information (Optional)
2513  *
2514  *  @param[in]   sizeCfg     Size configuration information
2515  *  @param[out]  sizes       Array of size requirements
2516  *  @param[out]  aligns      Array of alignment requirements
2517  *  @retval                  Value (@ref ReturnValues)
2518  *
2519  *  @note This function specifies the minimum memory buffer requirements, it is up to the
2520  *        module user to round up the buffer alignemnt and size to the cache line boundary
2521  *        to ensure cache coherency if cacheable memory is used.
2522  */
2523 paReturn_t Pa_getBufferReq (paSizeInfo_t *sizeCfg, int sizes[], int aligns[]);
2525 /**
2526  *  @ingroup palld_api_functions
2527  *  @brief  Pa_create creates the PA driver instance
2528  *
2529  *  @details This function initializes the PA driver based on user configuration
2530  *
2531  *  @param[in]  cfg     Configuration information
2532  *  @param[in]  bases   Array of the memory buffer base addresses 
2533  *  @param[out] pHandle Instance handle. This is a pointer to an initialized
2534  *                      instance structure. 
2535  *  @retval             Value (@ref ReturnValues)
2536  */
2537 paReturn_t Pa_create (paConfig_t *cfg, void* bases[], Pa_Handle *pHandle);
2539 /**
2540  *  @ingroup palld_api_functions
2541  *  @brief   Pa_startCfg Adds PA configuration
2542  *  @details This function needs to be called from all cores to initialize PA with 
2543  *           per core configurations
2544  *
2545  *  @param[in]  handle  The PA LLD instance identifier
2546  *  @param[in]  startCfg PA start configuration
2547  *  @retval             Value (@ref ReturnValues)
2548  */
2549 paReturn_t Pa_startCfg (Pa_Handle handle, paStartCfg_t *startCfg);
2551 /**
2552  *  @ingroup palld_api_functions
2553  *  @brief Pa_close decativates the PA driver instance
2554  *
2555  *  @details This function deactivates the PA driver instance, all the associated
2556  *           memory buffers can be freed after this call. 
2557  *
2558  *  @param[in]  handle  The PA LLD instance identifier
2559  *  @param[out] bases   Array of the memory buffer base addresses 
2560  *  @retval             Value (@ref ReturnValues)
2561  */
2562 paReturn_t Pa_close (Pa_Handle handle, void* bases[]);
2564 /**
2565  * @defgroup  pktDest Routed Packet Destinations
2566  * @ingroup palld_api_constants
2567  * @{
2568  *
2569  * @name Routed Packet Destinations
2570  *
2571  * @brief The module user specifies packet destinations for packets exiting the packet accelerator sub-system.
2572  *
2573  * @details  The destination of packets that leave the packet accelerator sub-system
2574  *           are provided to the module in the @ref paRouteInfo_t structure and passed
2575  *           to the module through the @ref Pa_addMac, @ref Pa_addSrio, @ref Pa_addIp, @ref Pa_addCustomLUT1, 
2576  *           @ref Pa_addCustomLUT2 and @ref Pa_addPort functions
2577  */
2578 /** @ingroup pktDest */
2579 /* @{ */
2581 /** 
2582  *  @def  pa_DEST_DISCARD
2583  *        packet is discarded
2584  */
2585 #define  pa_DEST_DISCARD  3  /**< Packet is discarded */
2587 /** 
2588  *  @def  pa_DEST_CONTINUE_PARSE_LUT1
2589  *        packet remains in PA sub-system for more parsing and LUT1 classification
2590  */
2591 #define  pa_DEST_CONTINUE_PARSE_LUT1  4 /**< Packet remains in PA sub-system for more parsing and LUT1 classification */
2593 /** 
2594  *  @def  pa_DEST_CONTINUE_PARSE_LUT2
2595  *        packet remains in PA sub-system for more parsing and LUT2 classification. 
2596  */
2597 #define  pa_DEST_CONTINUE_PARSE_LUT2  5  /**< Packet remains in PA sub-system for more parsing and LUT2 classification */
2599 /**
2600  *  @def  pa_DEST_HOST
2601  *        host thread 
2602  */
2603 #define  pa_DEST_HOST   6   /**< Packet is routed to host */
2605 /** 
2606  *  @def  pa_DEST_EMAC
2607  *        ethernet mac port (of the switch)
2608  */
2609 #define  pa_DEST_EMAC   7   /**< Packet is routed to  EMAC */
2611 /** 
2612  *  @def  pa_DEST_SASS
2613  *        security accelerator destination 
2614  */
2615 #define  pa_DEST_SASS   8   /**< Packet is routed to SA */
2617 /** 
2618  *  @def  pa_DEST_SASS_LOC_DMA
2619  *        security accelerator destination via local DMA
2620  *
2621  *  @note This definition is valid for the second generation of PASS only.
2622  */
2623 #define  pa_DEST_SASS_LOC_DMA   11   /**< Packet is routed to SA through local DMA */
2625 /** 
2626  *  @def  pa_DEST_SRIO
2627  *        SRIO interface
2628  */
2629 #define  pa_DEST_SRIO   9   /**< Packet is routed to SRIO */
2631 /** 
2632  *  @def  pa_DEST_CASCADED_FORWARDING_LUT1
2633  *        Cascaded forwarding packet remains in PA sub-system for next LUT1 (IP) parsing. Those packets are expected to
2634  *        be delivered to QoS queues based on the VLAN/DSCP priority at the next stage so that some PASS actions such
2635  *        as IP reassembly and IP fragment exception route will be disabled.
2636  */
2637 #define  pa_DEST_CASCADED_FORWARDING_LUT1  10  
2639 /** 
2640  *  @def  pa_DEST_EFLOW
2641  *        packet remains in PA sub-system for egress flow operation
2642  *
2643  *  @note This definition is valid for the second generation of PASS only.
2644  */
2645 #define  pa_DEST_EFLOW   12   /**< Packet is routed to Egress Flow Path */
2647 /** 
2648  *  @def  pa_DEST_RES_1
2649  *        Reseved destination for internal usage
2650  *
2651  *  @note This definition is valid for the second generation of PASS only.
2652  */
2653 #define  pa_DEST_RES_1  20   
2655 /** 
2656  *  @def  pa_DEST_RES_2
2657  *        Reseved destination for internal usage
2658  *
2659  *  @note This definition is valid for the second generation of PASS only.
2660  */
2661 #define  pa_DEST_RES_2  21   
2663   
2664 /*  @}  */  
2665 /** @} */
2667 /**
2668  * @defgroup  paEmacPort Ethernet MAC port
2669  * @ingroup palld_api_constants
2670  * @{
2671  *
2672  * @name Ethernet MAC port
2673  *
2674  * @brief The module user specifies the Ethernet MAC port of the ingress and egress packets.
2675  *
2676  * @details  In the from-network direction, the module user can specify the input port as one of classification parameters.
2677  *           In the to-network direction, the module user can force the egress packets to be sent over the specified 
2678  *           destination Ethernet MAC port of the switch regreless of its states or configurations.
2679  */
2680 /** @ingroup customType */
2681 /* @{ */
2682 /**
2683  *  @def  pa_EMAC_PORT_NOT_SPECIFIED
2684  *        From-Netwprk: Don't care
2685  *        To-Network: Use standard switch forwarding 
2686  */
2687 #define  pa_EMAC_PORT_NOT_SPECIFIED   0
2689 /* @def   pa_EMAC_PORT_0
2690  *        Use EMAC Port 0
2691  */
2692 #define  pa_EMAC_PORT_0               1   
2694 /* @def   pa_EMAC_PORT_1
2695  *        Use EMAC Port 1
2696  */
2697 #define  pa_EMAC_PORT_1               2   
2699 /* @def   pa_EMAC_PORT_2
2700  *        Use EMAC Port 2
2701  */
2702 #define  pa_EMAC_PORT_2               3   
2704 /* @def   pa_EMAC_PORT_3
2705  *        Use EMAC Port 3
2706  */
2707 #define  pa_EMAC_PORT_3               4   
2709 /* @def   pa_EMAC_PORT_4
2710  *        Use EMAC Port 4
2711  */
2712 #define  pa_EMAC_PORT_4               5   
2714 /* @def   pa_EMAC_PORT_5
2715  *        Use EMAC Port 5
2716  */
2717 #define  pa_EMAC_PORT_5               6   
2719 /* @def   pa_EMAC_PORT_6
2720  *        Use EMAC Port 6
2721  */
2722 #define  pa_EMAC_PORT_6               7   
2724 /* @def   pa_EMAC_PORT_7
2725  *        Use EMAC Port 7
2726  */
2727 #define  pa_EMAC_PORT_7               8
2729 /* @def   pa_CPPI_PORT
2730  *        Use CPPI PORT
2731  */
2732 #define  pa_CPPI_PORT                 pa_EMAC_PORT_NOT_SPECIFIED
2734 /*  @}  */  
2735 /** @} */
2737 /**
2738  * @defgroup emcOutputCtrlBits Ethernet MAC Output Control Bit Definitions
2739  * @ingroup palld_api_constants
2740  * @{
2741  *
2742  * @name Ethernet MAC Output Control Bit Definition
2743  *
2744  * Bitmap definition of the emacCtrl at @ref paRouteInfo_t. 
2745  *  
2746  */ 
2747 /*@{*/
2748 /**
2749  *  @def  pa_EMAC_CTRL_PORT_MASK
2750  *        Control Info -- EMAC port mask
2751  */
2752 #define pa_EMAC_CTRL_PORT_MASK            0x0F 
2753 /**
2754  *  @def  pa_EMAC_CTRL_CRC_DISABLE
2755  *        Control Info -- 0:EMAC port computes and inserts CRC
2756  *                        1:EMAC port does not generate CRC  
2757  */
2758 #define pa_EMAC_CTRL_CRC_DISABLE          0x80 
2760 /*  @}  */  
2761 /** @} */
2763 /**
2764  * @defgroup  customType Custom Classification Types
2765  * @ingroup palld_api_constants
2766  * @{
2767  *
2768  * @name Custom Classification Types
2769  *
2770  * @brief The module user specifies the custom classification types.
2771  *
2772  * @details  The optional custom classification rule may be used to further parse and calssify the incoming
2773  *           packet.
2774  */
2775 /** @ingroup customType */
2776 /* @{ */
2777 /**
2778  *  @def  pa_CUSTOM_TYPE_NONE
2779  *        Use standard classification 
2780  */
2781 #define  pa_CUSTOM_TYPE_NONE   0   
2783 /* @def   pa_CUSTOM_TYPE_LUT1
2784  *        Custom classification with LUT1
2785  */
2786 #define  pa_CUSTOM_TYPE_LUT1   1   
2788 /* @def   pa_CUSTOM_TYPE_LUT2
2789  *        Custom classification with LUT2
2790  */
2791 #define  pa_CUSTOM_TYPE_LUT2   2   
2793 /*  @}  */  
2794 /** @} */
2796 /**
2797  *   @brief  The maximum number of LUT1 Custom Types supported
2798  */
2799 #define pa_MAX_CUSTOM_TYPES_LUT1   4
2802 /**
2803  *   @brief  The maximum number of LUT2 Custom Types supported
2804  */
2805 #define pa_MAX_CUSTOM_TYPES_LUT2   16
2808 /**
2809  * @defgroup  cmdTxDestGen1 Command/Transmit Packet Destinations for first generation NSS
2810  * @ingroup palld_api_constants
2811  * @{
2812  *
2813  * @name Command/Transmit Packet Destinations for first generation NSS
2814  *
2815  * @brief These values specify the offsets to the NSS Tx base queue and they are used by the module user to deliver 
2816  *        the configuration packets to the specific PDSP Cluster within PASS.
2817  *
2818  * @note These values are used by LLD as the return value of cmdDest of PASS configuration APIs. They are defined here
2819  *       for reference purpose only.
2820  */
2821 /* @{ */
2822 /**
2823  *   @def  pa_CMD_TX_DEST_0_GEN1
2824  *         Destination PDSP0
2825  */
2826 #define  pa_CMD_TX_DEST_0_GEN1    0  /**< Packet is sent to PDSP0 */
2828 /**
2829  *   @def  pa_CMD_TX_DEST_1_GEN1
2830  *         Destination PDSP1
2831  */
2832 #define  pa_CMD_TX_DEST_1_GEN1    1  /**< Packet is sent to PDSP1 */
2834 /**
2835  *   @def  pa_CMD_TX_DEST_2_GEN1
2836  *         Destination PDSP2
2837  */
2838 #define  pa_CMD_TX_DEST_2_GEN1    2  /**< Packet is sent to PDSP2 */
2840 /**
2841  *   @def  pa_CMD_TX_DEST_3_GEN1
2842  *         Destination PDSP3
2843  */
2844 #define  pa_CMD_TX_DEST_3_GEN1    3  /**< Packet is sent to PDSP3 */
2846 /**
2847  *   @def  pa_CMD_TX_DEST_4_GEN1
2848  *         Destination PDSP4
2849  */
2850 #define  pa_CMD_TX_DEST_4_GEN1    4  /**< Packet is sent to PDSP4 */
2852 /**
2853  *   @def  pa_CMD_TX_DEST_5_GEN1
2854  *         Destination PDSP5
2855  */
2856 #define  pa_CMD_TX_DEST_5_GEN1    5  /**< Packet is sent to PDSP5  */
2858 /*  @}  */  
2859 /** @} */
2861 /**
2862  * @defgroup  cmdTxDestGen2 Command/Transmit Packet Destinations for second generation NSS
2863  * @ingroup palld_api_constants
2864  * @{
2865  *
2866  * @name Command/Transmit Packet Destinations for second generation NSS
2867  *
2868  * @brief These values specify the offset to the NSS Tx base queue and they are used by the module user to deliver 
2869  *        the configuration packets to the specific PDSP Cluster within PASS.
2870  *
2871  * @note These values are used by LLD as the return value of cmdDest of PASS configuration APIs. They are defined here
2872  *       for reference purpose only.
2873  */
2874 /* @{ */
2875 /**
2876  *   @def  pa_CMD_TX_DEST_0_GEN2
2877  *         Destination CLUSTER0
2878  */
2879 #define  pa_CMD_TX_DEST_0_GEN2    8  /**< Packet is sent to INGRESS0 */
2881 /**
2882  *   @def  pa_CMD_TX_DEST_1_GEN2
2883  *         Destination CLUSTER1
2884  */
2885 #define  pa_CMD_TX_DEST_1_GEN2    9  /**< Packet is sent to INGRESS1 */
2887 /**
2888  *   @def  pa_CMD_TX_DEST_2_GEN2
2889  *         Destination CLUSTER2
2890  */
2891 #define  pa_CMD_TX_DEST_2_GEN2   10  /**< Packet is sent to INGRESS2 */
2893 /**
2894  *   @def  pa_CMD_TX_DEST_3_GEN2
2895  *         Destination CLUSTER3
2896  */
2897 #define  pa_CMD_TX_DEST_3_GEN2   11  /**< Packet is sent to INGRESS3 */
2899 /**
2900  *   @def  pa_CMD_TX_DEST_4_GEN2
2901  *         Destination CLUSTER4
2902  */
2903 #define  pa_CMD_TX_DEST_4_GEN2   12  /**< Packet is sent to INGRESS4 */
2905 /**
2906  *   @def  pa_CMD_TX_DEST_5_GEN2
2907  *         Destination CLUSTER5
2908  */
2909 #define  pa_CMD_TX_DEST_5_GEN2   13  /**< Packet is sent to POST  */
2911 /**
2912  *   @def  pa_CMD_TX_DEST_6_GEN2
2913  *         Destination CLUSTER6
2914  */
2915 #define  pa_CMD_TX_DEST_6_GEN2   14  /**< Packet is sent to EGRESS0  */
2916  
2917 /**
2918  *   @def  pa_CMD_TX_DEST_7_GEN2
2919  *         Destination CLUSTER7
2920  */
2921 #define  pa_CMD_TX_DEST_7_GEN2   15  /**< Packet is sent to EGRESS1  */
2922 /**
2923  *   @def  pa_CMD_TX_DEST_8_GEN2
2924  *         Destination CLUSTER8
2925  */
2926 #define  pa_CMD_TX_DEST_8_GEN2   16  /**< Packet is sent to EGRESS2  */
2927  
2928 /*  @}  */  
2929 /** @} */
2931 /**
2932  * @defgroup  cmdTxDest Command/Transmit Packet Destinations for NSS
2933  * @ingroup palld_api_constants
2934  * @{
2935  *
2936  * @name Command/Transmit Packet Destinations for NSS
2937  *
2938  * @brief Define the command destination based on the compiler switch NSS_GEN2 to cover both @ref cmdTxDestGen1
2939  *        and @ref cmdTxDestGen2. These values are used by the LLD only and are not required by the application.
2940  */
2941 /* @{ */
2942 #ifndef NSS_GEN2
2943 #define  pa_CMD_TX_DEST_0        pa_CMD_TX_DEST_0_GEN1
2944 #define  pa_CMD_TX_DEST_1        pa_CMD_TX_DEST_1_GEN1
2945 #define  pa_CMD_TX_DEST_2        pa_CMD_TX_DEST_2_GEN1
2946 #define  pa_CMD_TX_DEST_3        pa_CMD_TX_DEST_3_GEN1
2947 #define  pa_CMD_TX_DEST_4        pa_CMD_TX_DEST_4_GEN1
2948 #define  pa_CMD_TX_DEST_5        pa_CMD_TX_DEST_5_GEN1
2949 #else
2950 #define  pa_CMD_TX_DEST_0        pa_CMD_TX_DEST_0_GEN2
2951 #define  pa_CMD_TX_DEST_1        pa_CMD_TX_DEST_1_GEN2
2952 #define  pa_CMD_TX_DEST_2        pa_CMD_TX_DEST_2_GEN2
2953 #define  pa_CMD_TX_DEST_3        pa_CMD_TX_DEST_3_GEN2
2954 #define  pa_CMD_TX_DEST_4        pa_CMD_TX_DEST_4_GEN2
2955 #define  pa_CMD_TX_DEST_5        pa_CMD_TX_DEST_5_GEN2
2956 #define  pa_CMD_TX_DEST_6        pa_CMD_TX_DEST_6_GEN2
2957 #define  pa_CMD_TX_DEST_7        pa_CMD_TX_DEST_7_GEN2
2958 #define  pa_CMD_TX_DEST_8        pa_CMD_TX_DEST_8_GEN2
2959 #endif
2961 /*  @}  */  
2962 /** @} */
2964 /**
2965  * @defgroup  paLut1Inst PA LUT1 Instance Destinations
2966  * @ingroup palld_api_constants
2967  * @{
2968  *
2969  * @name PA LUT1 Instance Destinations
2970  *
2971  * @brief These values are used by the module user to specify the LUT1 table instance used by the specified IP, ACL or customLUT1 entry.
2972  * @note PA LLD will determine the appropriate LUT1 instance to add/configure LUT1 entry based on the types of API and the linking information 
2973  *       in normal operation, i.e. when lutInst is set to pa_LUT_INST_NOT_SPECIFIED. These values are only used by module users, who want to maintain their own LUT1 tables, 
2974  *       to overwrite the default rules.  
2975  */
2976 /* @{ */
2977 /**
2978  *   @def  pa_LUT1_INST_0_0
2979  *         LUT1 instance of Ingress0, PDSP0
2980  */
2981 #define  pa_LUT1_INST_0_0    0  /**< LUT1 table connected to Ingress0, PDSP0 */
2983 /**
2984  *   @def  pa_LUT1_INST_0_1
2985  *         LUT1 instance of Ingress0, PDSP1
2986  */
2987 #define  pa_LUT1_INST_0_1    1  /**< LUT1 table connected to Ingress0, PDSP1 */
2989 /**
2990  *   @def  pa_LUT1_INST_1_0
2991  *         LUT1 instance of Ingress1, PDSP0
2992  */
2993 #define  pa_LUT1_INST_1_0    2  /**< LUT1 table connected to Ingress1, PDSP0 */
2995 /**
2996  *   @def  pa_LUT1_INST_0_1
2997  *         LUT1 instance of Ingress1, PDSP1
2998  */
2999 #define  pa_LUT1_INST_1_1    3  /**< LUT1 table connected to Ingress1, PDSP1 */
3001 /**
3002  *   @def  pa_LUT1_INST_2_0
3003  *         LUT1 instance of Ingress2, PDSP0
3004  */
3005 #define  pa_LUT1_INST_2_0    4  /**< LUT1 table connected to Ingress2, PDSP0 */
3007 /**
3008  *   @def  pa_LUT1_INST_3_0
3009  *         LUT1 instance of Ingress3, PDSP0
3010  */
3011 #define  pa_LUT1_INST_3_0    5  /**< LUT1 table connected to Ingress3, PDSP0 */
3013 /**
3014  *   @def  pa_LUT1_INST_4_0
3015  *         LUT1 instance of Ingress4, PDSP0
3016  */
3017 #define  pa_LUT1_INST_4_0    6  /**< LUT1 table connected to Ingress4, PDSP0 */
3019 /**
3020  *   @def  pa_LUT1_INST_5_0
3021  *         LUT1 instance of Egress0, PDSP0
3022  */
3023 #define  pa_LUT1_INST_5_0    7  /**< LUT1 table connected to Egress0, PDSP0 */
3026 /**< LUT1 instances of First Generation PASS */
3027 #define  pa_LUT1_INST_0_GEN1    0   /**< LUT1 table connected to PDSP0 (PASS Gen1)*/
3028 #define  pa_LUT1_INST_1_GEN1    1   /**< LUT1 table connected to PDSP1 (PASS Gen1)*/
3029 #define  pa_LUT1_INST_2_GEN1    2   /**< LUT1 table connected to PDSP2 (PASS Gen1)*/
3030 #define  pa_LUT1_INST_MAX_GEN1  pa_LUT1_INST_2_GEN1   
3033 /**< LUT1 instances of Second Generation PASS */
3034 #define  pa_LUT1_INST_0_GEN2    pa_LUT1_INST_0_0   /**< LUT1 table equivalent to Netcp 1.0 LUT1_0  (Pass Gen2)*/
3035 #define  pa_LUT1_INST_1_GEN2    pa_LUT1_INST_1_0   /**< LUT1 table equivalent to Netcp 1.0 LUT1_1  (Pass Gen2)*/
3036 #define  pa_LUT1_INST_2_GEN2    pa_LUT1_INST_4_0   /**< LUT1 table equivalent to Netcp 1.0 LUT1_2  (Pass Gen2)*/
3037 #define  pa_LUT1_INST_MAX_GEN2  pa_LUT1_INST_5_0   
3039 /**
3040  *
3041  * @name Common LUT1 instance for NSS
3042  *
3043  * @brief Define the LUT1 instance based on the compiler switch NSS_GEN2 to cover both generations of NSS.
3044  *        These values are intended to be used by the LLD only. For the application which maintain the LUT1
3045  *        tables should either use the LUT1 instance definitions with _GEN1 and _GEN2 suffix or these definitions
3046  *        with the compiler switch NSS_GEN2 defined or undefined.
3047  */
3050 #ifndef NSS_GEN2
3051 /**
3052  *   @def  pa_LUT1_INST_0
3053  *         LUT1 instance 0
3054  */
3055 #define  pa_LUT1_INST_0    pa_LUT1_INST_0_GEN1   /**< LUT1 Instance 0 for MAC/SRIO */
3057 /**
3058  *   @def  pa_LUT1_INST_1
3059  *         LUT1 instance 1
3060  */
3061 #define  pa_LUT1_INST_1    pa_LUT1_INST_1_GEN1   /**< LUT1 instance 1 for Outer IP */
3063 /**
3064  *   @def  pa_LUT1_INST_2
3065  *         LUT1 instance 2
3066  */
3067 #define  pa_LUT1_INST_2    pa_LUT1_INST_2_GEN1   /**< LUT1 instance 2 for Inner IP */
3069 /**
3070  *   @def  pa_LUT1_INST_MAX
3071  *         Specify the maximum LUT1 instance
3072  */
3073 #define  pa_LUT1_INST_MAX  pa_LUT1_INST_MAX_GEN1   
3075 #else
3077 /**
3078  *   @def  pa_LUT1_INST_0
3079  *         LUT1 instance 0
3080  */
3081 #define  pa_LUT1_INST_0    pa_LUT1_INST_0_GEN2   /**< LUT1 Instance 0  for MAC/SRIO */
3083 /**
3084  *   @def  pa_LUT1_INST_1
3085  *         LUT1 instance 1
3086  */
3087 #define  pa_LUT1_INST_1    pa_LUT1_INST_1_GEN2   /**< LUT1 instance 1  for Outer IP */
3089 /**
3090  *   @def  pa_LUT1_INST_2
3091  *         LUT1 instance 2
3092  */
3093 #define  pa_LUT1_INST_2    pa_LUT1_INST_2_GEN2   /**< LUT1 Instance 2  for Inner IP */
3095 /**
3096  *   @def  pa_LUT1_INST_MAX
3097  *         Specify the maximum LUT1 instance
3098  */
3099 #define  pa_LUT1_INST_MAX  pa_LUT1_INST_MAX_GEN2   
3101 #endif
3102 /*  @}  */  
3103 /** @} */
3105 /**
3106  * @defgroup  paAclInst PA ACL LUT Instance Destinations
3107  * @ingroup palld_api_constants
3108  * @{
3109  *
3110  * @name PA ACL Lut Instance Destinations
3111  *
3112  * @brief These values are used by the module user to specify the ACL Lut instance 
3113  *
3114  * @note These definitions are valid for the second generation PASS only.
3115  */
3116 /* @{ */
3118 /**
3119  *   @def  pa_ACL_INST_OUTER_IP
3120  *         LUT1 instance of ACL Table 0 for Outer IP
3121  */
3122 #define  pa_ACL_INST_OUTER_IP     pa_LUT1_INST_0_1   /**< LUT1 table used for ACL Table 0  */
3125 /**
3126  *   @def  pa_ACL_INST_INNER_IP
3127  *         LUT1 instance of ACL Table 1 for Inner IP
3128  */
3129 #define  pa_ACL_INST_INNER_IP     pa_LUT1_INST_3_0   /**< LUT1 table used for ACL Table 1  */
3130  
3131 /*  @}  */  
3132 /** @} */
3135 /**
3136  * @defgroup  paCrcInst PA CRC Engine Instance Destinations
3137  * @ingroup palld_api_constants
3138  * @{
3139  *
3140  * @name PA CRC Engine Instance Destinations
3141  *
3142  * @brief These values are used by the module user to specify the CRC Engine instance 
3143  *
3144  * @note These definitions are valid for the second generation PASS only.
3145  */
3146 /* @{ */
3147 /**
3148  *   @def  pa_CRC_INST_0_0
3149  *         CRC instance of Ingress0
3150  */
3151 #define  pa_CRC_INST_0_0    0  /**< CRC Engine between Ingress0, CDE0 and CED1 */
3153 /**
3154  *   @def  pa_CRC_INST_1_0
3155  *         CRC instance of Ingress1
3156  */
3157 #define  pa_CRC_INST_1_0    1  /**< CRC Engine between Ingress1, CDE0 and CED1 */
3159 /**
3160  *   @def  pa_CRC_INST_4_0
3161  *         LUT1 instance of Ingress4
3162  */
3163 #define  pa_CRC_INST_4_0    2  /**< CRC Engine between Ingress4, CDE0 and CED1 */
3165 /**
3166  *   @def  pa_CRC_INST_5_0
3167  *         LUT1 instance of Post
3168  */
3169 #define  pa_CRC_INST_5_0    3  /**< CRC Engine between Post, CDE0 and CED1 */
3171 /**
3172  *   @def  pa_CRC_INST_6_0
3173  *         CRC instance 0 of Egress0
3174  */
3175 #define  pa_CRC_INST_6_0    4  /**< CRC Engine between Egress0, CDE0 and CED1 */
3177 /**
3178  *   @def  pa_CRC_INST_6_1
3179  *         CRC instance 1 of Egress0
3180  */
3181 #define  pa_CRC_INST_6_1    5  /**< CRC Engine between Egress0, CDE1 and CED2 */
3183 /**
3184  *   @def  pa_CRC_INST_MAX
3185  *         Specify the maximum CRC Engine instance
3186  */
3187 #define  pa_CRC_INST_MAX  pa_CRC_INST_6_1   
3188  
3189 /*  @}  */  
3190 /** @} */
3192 /**
3193  * @defgroup  paRaInst PA RA Instance Destinations
3194  * @ingroup palld_api_constants
3195  * @{
3196  *
3197  * @name PA RA Instance Destinations
3198  *
3199  * @brief These values are used by the module user to specify the RA instance (group)
3200  *
3201  * @note These definitions are valid for the second generation PASS only.
3202  */
3203 /* @{ */
3204 /**
3205  *   @def  pa_RA_INST_0
3206  *         RA instance of Outer IP
3207  */
3208 #define  pa_RA_INST_0       0  /**< RA instance to be accessed from Ingress0, PDSP1 for outer IP reassembly */
3211 /**
3212  *   @def  pa_RA_INST_1
3213  *         RA instance of Inner IP
3214  */
3215 #define  pa_RA_INST_1       1  /**< RA instance to be accessed from Ingress3, PDSP0 for inner IP reassembly */
3217 /**
3218  *   @def  pa_RA_INST_MAX
3219  *         Specify the maximum RA instance
3220  */
3221 #define  pa_RA_INST_MAX     pa_RA_INST_1   
3222  
3223 /*  @}  */  
3224 /** @} */
3226 /**
3227  * @defgroup  paCmdCode Command Code
3228  * @ingroup palld_api_constants
3229  * @{
3230  *
3231  * @name PA Command Codes
3232  *
3233  * @brief Define the commands which can be executed in PASS 
3234  *
3235  * @details  A single command or a set of commands can be executed to support fully-offloaded 
3236  *           data path in both the transmit (to network) and receive (from network) directions.  
3237  *           In the to-network direction, the list of commands formatted by the module should 
3238  *           be stored as the protocol-specific information at the packet descriptor with the 
3239  *           packet. The commands will be executed in order at PASS and the associated security
3240  *           accelerator sub-system (SASS). The executed commands will be removed by PASS and 
3241  *           SASS so that the output packet will not contain any command.
3242  *           In the from-network direction, the list of commands formatted by the module will 
3243  *           be stored at the PASS as a command set which can be referred to by the command set 
3244  *           index. A single command including a command set can be executed per the enhanced 
3245  *           routing information @ref paRouteInfo_t after a LUT1 or LUT2 matches.
3246  *
3247  * @note     The packet offset specified at each command of the command list should be strictly 
3248  *           in ascending order becasue the PASS processes the list of commands in order and it
3249  *           can not move backwards. The command violating the order requirement may be detected
3250  *           and rejected by the API @ref Pa_formatTxCmd and @ref Pa_configCmdSet. In the case, 
3251  *           the order constraint can not be validated at the LLD, the violating command will 
3252  *           be ignored by the PASS.    
3253  */
3254 /** @ingroup paCmdCode */
3255 /* @{ */
3256 /**
3257  *  @def  pa_CMD_NONE
3258  *        End of commands 
3259  */
3260 #define  pa_CMD_NONE                        0   
3262 /* @def   pa_CMD_NEXT_ROUTE
3263  *        Specifies next route 
3264  */
3265 #define  pa_CMD_NEXT_ROUTE                  1   
3267 /*  @def  pa_CMD_CRC_OP
3268  *        CRC generation or verification 
3269  */
3270 #define  pa_CMD_CRC_OP                      2   
3272 /*  @def  pa_CMD_COPY_DATA_TO_PSINFO
3273  *        Copy Data from the packet to the PS Info Area in the packet descriptor 
3274  */
3275 #define  pa_CMD_COPY_DATA_TO_PSINFO         3
3277 /*  @def  pa_CMD_PATCH_DATA
3278  *        Insert or patch packet data at the specific location  
3279  */
3280 #define  pa_CMD_PATCH_DATA                  4  
3282 /*  @def  pa_CMD_TX_CHECKSUM
3283  *        Compute and insert checksum  
3284  */
3285 #define  pa_CMD_TX_CHECKSUM                 5 
3287 /*  @def  pa_CMD_MULTI_ROUTE
3288  *        Duplicate packet to multiple destinations  
3289  */
3290 #define  pa_CMD_MULTI_ROUTE                 6  
3292 /*  @def  pa_CMD_REPORT_TX_TIMESTAMP
3293  *        Report the tx packet exit time in term of PASS 48-bit timestamp
3294  */
3295 #define  pa_CMD_REPORT_TX_TIMESTAMP         7 
3297 /*  @def  pa_CMD_REMOVE_HEADER
3298  *        Remove the parsed packet header 
3299  *  @note It should be the first command in the rx command set 
3300  */
3301 #define  pa_CMD_REMOVE_HEADER               8 
3303 /*  @def  pa_CMD_REMOVE_TAIL
3304  *        Remove the parsed packet tail 
3305  *
3306  *  @note It should be the last command next to the next route or multi-route command       
3307  */
3308 #define  pa_CMD_REMOVE_TAIL                 9 
3311 /*  @def  pa_CMD_CMDSET
3312  *        Specify the command set to be executed  
3313  */
3314 #define  pa_CMD_CMDSET                      10   
3316 /*  @def  pa_CMD_SA_PAYLOAD
3317  *        Specify the payload information required by SASS  
3318  */
3319 #define  pa_CMD_SA_PAYLOAD                  11   
3321 /*  @def  pa_CMD_IP_FRAGMENT
3322  *        Perform IPv4 fragmentation  
3323  */
3324 #define  pa_CMD_IP_FRAGMENT                 12 
3326 /*  @def  pa_CMD_USR_STATS
3327  *        Update the specified user-defined counter and the counters which are linked to this counter  
3328  */
3329 #define  pa_CMD_USR_STATS                   13    
3330    
3331    
3332 /*  @def  pa_CMD_CMDSET_AND_USR_STATS
3333  *        Combination of the CMDSET and USR_STATS commands. 
3334  *  @note It is only used as a command executed after the last classification per the enhanced routing 
3335  *        information      
3336  */
3337 #define  pa_CMD_CMDSET_AND_USR_STATS        14   
3339 /*  @def  pa_CMD_PATCH_MSG_LEN
3340  *        Update the message length field within some L2 protocol header such as 802.3 and PPPoE after the
3341  *        potential IP fragmentation operation
3342  *  @note This command is only used in conjunction with the pa_CMD_IP_FRAGMENT command.    
3343  */
3344 #define  pa_CMD_PATCH_MSG_LEN               15 
3346 /*  @def  pa_CMD_VERIFY_PKT_ERROR
3347  *        Verify the packet error based on the CPPI error flags as specified at @ref appendix2 and forward
3348  *        the error packet to the specified destination 
3349  *  @note This packet error verification is not applicable to the CRC verification operation within the same
3350  *        command set.
3351  *  @note This command should be either the last command or the second last to the nextRoute command since 
3352  *        all commands following this operation will be ignored if packet error is found. 
3353  */
3354 #define  pa_CMD_VERIFY_PKT_ERROR            16 
3357 /*  @def  pa_CMD_SPLIT
3358  *        Split the packet into header and payload portion to be delivered to different queues with 
3359  *        different CPPI flows 
3360  *  @note This command is only supported in the from-network direction
3361  *  @note This command should be placed ahead of any pa_CMD_PATCH command so that the header size can be adjusted accordingly
3362  *  @note The first 8-byte of psInfo area is reserved for this operation, therefore, the destOffset of pa_CMD_COPY_DATA_TO_PSINFO
3363  *        commands within the same command set should be 8 or larger.
3364  *        
3365  */
3367 #define  pa_CMD_SPLIT                      17
3369 /*  @def  pa_CMD_EF_OP
3370  *        Egress Flow operation command either triggers flow cache lookup to find the corresponding packet modification records 
3371  *        or provides those records directly. 
3372  *  @note This command can not be combined with any other commands
3373  */
3374 #define  pa_CMD_EF_OP                      18 
3376 /*  @def  pa_CMD_PATCH_TIME
3377  *        Patch the time values in packets (Gen 2 support only)
3378  */
3379 #define  pa_CMD_PATCH_TIME                   19  
3381 /*  @def  pa_CMD_PATCH_COUNT
3382  *        Patch the time values in packets (Gen 2 support only)
3383  */
3384 #define  pa_CMD_PATCH_COUNT                  20
3386 /*  @def  pa_CMD_EMAC_CRC_VERIFY
3387  *        Perfrom the Ethernet CRC verification for egress traffic. (Applicable only for Gen1) 
3388  *        Refer to the description of data structure @ref paCmdEmacCrcVerify_t for details.
3389  */
3391 #define  pa_CMD_EMAC_CRC_VERIFY              21
3392    
3393 /*  @}  */  
3394 /** @} */
3396 /**
3397  *  @defgroup routeCtrlInfo  PA Routing Control Info Bit Definitions
3398  *  @ingroup palld_api_constants
3399  *  @{
3400  *
3401  *  @name PA Routing Control Info Bit Definitions
3402  *
3403  *  Bitmap definition of the ctrlBitField in @ref paCmdNextRoute_t. 
3404  */ 
3405 /*@{*/
3406 /**
3407  *  @def  pa_NEXT_ROUTE_PARAM_PRESENT
3408  *        Control Info -- Set: Routing information such as flowId, queue are in command for egress packets
3409  *                        Clear: Routing information such as flowId, queue are in packet for ingress packets
3410  */
3411 #define pa_NEXT_ROUTE_PARAM_PRESENT              0x0001 
3412 /**
3413  *  @def  pa_NEXT_ROUTE_PROC_NEXT_CMD
3414  *        Control Info -- Set: Process the next command prior to forward the packet to its final destination
3415  *                        Clear: Forward the packet to the next destination without executing any more command
3416  *  @note: The data patch command (pa_CMD_PATCH_DATA) is the only one which can follow the next route command.
3417  *  @note: This option is only valid in the transmit (to-network) direction      
3418  */
3419 #define pa_NEXT_ROUTE_PROC_NEXT_CMD              0x0002 
3420 /**
3421  *  @def  pa_NEXT_ROUTE_PROC_MULTI_ROUTE
3422  *        Control Info -- Set: Multi-route is valid, the packet should be forwarded and then perform multi-route
3423  *                        Clear: Multi-route is invalid
3424  *  @note: This option is only valid in the receive (from-network) direction      
3425  */
3426 #define pa_NEXT_ROUTE_PROC_MULTI_ROUTE           0x0004 
3427 /**
3428  *  @def  pa_NEXT_ROUTE_TX_L2_PADDING
3429  *        Control Info -- Set: Perform MAC padding for packet with size smaller than 60
3430  *                        Clear: Do not perform MAC padding
3431  *  @note: This option is only valid in the transmit (to-network) direction      
3432  */
3433 #define pa_NEXT_ROUTE_TX_L2_PADDING              0x0008 
3434 /**
3435  *  @def  pa_NEXT_ROUTE_PROC_USR_STATS
3436  *        Control Info -- Set: User-defined statistics index is valid, update the chain of user-defined statistics specified
3437  *                             by statsIndex 
3438  *                        Clear: User-defined statistics index is invalid
3439  *  @note: This option is only valid in the egress (to-network) direction      
3440  */
3441 #define pa_NEXT_ROUTE_PROC_USR_STATS             0x0010 
3443 /**
3444  *  @def  pa_NEXT_ROUTE_RPT_TX_TIMESTAMP
3445  *        Control Info -- Set: Instruct switch to report the transmit timestamp with the associated CPTS domain, message type and 
3446  *                             sequence number encoded in the swInfo0. 
3447  *                        Clear: swInfo0 is invalid 
3448  *  @note: This option is only valid in the egress (to-network) direction on NSS_GEN2 devices when dest is set to pa_DEST_EMAC.   
3449  */
3450 #define pa_NEXT_ROUTE_RPT_TX_TIMESTAMP           0x0020 
3452 /*@}*/
3453 /** @} */
3455 /**
3456  *  @ingroup palld_api_macros
3457  *  @brief  pa_FORMAT_REPORT_TIMESTAMP_INFO is used to format the CPTS report timestamp information at swInfo0
3458  *
3459  *  @details  This macro is used to construct the swInfo0 with associated CPTS domain, message type and sequence id where
3460  *            swInfo0 is used to instruct the CPSW to report transmit timestamp as a CPTS event
3461  *
3462  */
3463 #define pa_FORMAT_REPORT_TIMESTAMP_INFO(domain, msgType, seqId)             0x80000000UL              |  \
3464                                                                             (((domain) & 0xFF) << 20) |  \
3465                                                                             (((msgType) & 0x0F) << 16)|  \
3466                                                                             ((seqId & 0xFFFF))
3468 /**
3469  *  @ingroup palld_api_structures
3470  *  @brief  Next Route Command
3471  *
3472  *  @details paCmdNextRoute_t defines the final route information
3473  *           The next route command can be used in both to-network and from-network directions. 
3474  *           In the to-network direction, it may be used multiple times to route traffic between PASS and SASS 
3475  *           before the packet is finally forwarded to the network. For example, the following steps show the 
3476  *           SRTP over IPSEC AH to-network traffic:
3477  *  @verbatim 
3478                1. Packet is delivered to SASS for SRTP operation
3479                2. Packet is delivered to PASS for UDP checksum operation
3480                3. Packet is delivered to SASS for IPSEC AH operation
3481                4. Packet is delivered to PASS for AH authentication tag insertion
3482                5. Packet is delivered to the network.
3483     @endverbatim
3484  *           The next route commands are required for step 3 and 5. The complete routing information should be provided 
3485  *           in the to-network direction.
3486  *
3487  *           In the from-network direction, the next route command is used only if the multiple routes are required or when
3488  *           dest is set to EMAC to forward the ingress packets out to another EMAC port. 
3489  *           In this case, only the parameter "ctrlBitfield", "multiRouteIndex" and/or "dest" are valid. After all the 
3490  *           commands in the command set are executed, the PASS will deliver packets to their desired destination based 
3491  *           on the parameters specified at the routing information upon the LUT1/LUT2 matching.  
3492  *           If the next route command is specified, it must be the last command within a command set. The commands following 
3493  *           the next route command will not be executed.  
3494  */
3496 typedef struct {
3498   uint16_t    ctrlBitfield;    /**< Routing control information as defined at @ref routeCtrlInfo */
3499   int         dest;            /**< Packet destination as defined at @ref pktDest */
3500   uint8_t     pktType_emacCtrl;/**<  For destination SRIO, specify the 5-bit packet type toward SRIO 
3501                                      For destination HOST, EMAC, specify the EMAC control @ref emcOutputCtrlBits to the network */
3502   uint8_t     flowId;          /**< For host, SA or SRIO destinations, specifies return free descriptor setup */
3503   uint16_t    queue;           /**< For host, SA or SRIO destinations, specifies the dest queue */
3504   uint32_t    swInfo0;         /**< Placed in SwInfo0 for packets to host or SA; Placed in the PS Info for packets to SRIO*/
3505   uint32_t    swInfo1;         /**< Placed in SwInfo1 for packets to the SA; Placed in the PS Info for packets to SRIO */
3506   uint16_t    multiRouteIndex; /**< Multi-route index. It is valid in the from-network direction only */
3507   uint16_t    statsIndex;      /**< Index of the first user-defined statistics to be updated. 
3508                                     This optional parameter is valid in the to-network direction only */
3509 } paCmdNextRoute_t;
3511 /**
3512  *  @defgroup  crcFrameTypes CRC Frame types 
3513  *  @ingroup palld_api_constants
3514  *  @{
3515  *
3516  *  @name CRC Frame types
3517  *
3518  *  @brief  Define the frame types which are used to extract and derive the CRC operation parameters such as CRC starting 
3519  *          offset and CRC payload length from the frame header. 
3520  *
3521  *  @details  Both the payload length and the byte location where CRC calculation begins may vary in some protocl 
3522  *            frame such as WCDMA FP HS-DSCH Data Frame type 2 and type 3. The CRC Frame type is used for PASS to
3523  *            extract and/or derive the CRC starting offset and payload length.
3524  *
3525  *  @note     Only the following frame types are supported.
3526  */
3527 /*  @{  */
3528 /**
3529  *
3530  *   @def  pa_CRC_OP_FRAME_TYPE_IUB_FP_HS_DSCH_TYPE2
3531  *         WCDMA FP HS-DSCH Data Frame Type 2
3532  */
3533 #define pa_CRC_OP_FRAME_TYPE_IUB_FP_HS_DSCH_TYPE2         0
3535 /**
3536  *
3537  *  @def   pa_CRC_OP_FRAME_TYPE_IUB_FP_HS_DSCH_TYPE3
3538  *         WCDMA FP HS-DSCH Data Frame Type 3
3539  */
3540 #define pa_CRC_OP_FRAME_TYPE_IUB_FP_HS_DSCH_TYPE3         1
3542 #define pa_CRC_OP_FRAME_TYPE_MAX                          pa_CRC_OP_FRAME_TYPE_IUB_FP_HS_DSCH_TYPE3
3544  
3545 /*  @}  */  
3546 /** @} */
3549 /**
3550  *  @defgroup crcOpCtrlInfo  PA CRC Command Control Info Bit Definitions
3551  *  @ingroup palld_api_constants
3552  *  @{
3553  *
3554  *  @name PA CRC Command Control Info Bit Definitions
3555  *
3556  *  Bitmap definition of the ctrlBitField in @ref paCmdCrcOp_t. 
3557  */ 
3558 /*@{*/
3559 /**
3560  *  @def  pa_CRC_OP_CRC_VALIDATE
3561  *        Control Info -- Set: CRC Validate
3562  *                        Clear: CRC Computation
3563  */
3564 #define pa_CRC_OP_CRC_VALIDATE              0x0001 
3565 /**
3566  *  @def  pa_CRC_OP_PAYLOAD_LENGTH_IN_HEADER
3567  *        Control Info -- Set: CRC length field in the header
3568  *                        Clear: CRC length specified in command
3569  */
3570 #define pa_CRC_OP_PAYLOAD_LENGTH_IN_HEADER  0x0002 
3571 /**
3572  *  @def  pa_CRC_OP_PAYLOAD_LENGTH_OFFSET_IS_NEGATIVE
3573  *        Control Info -- Set: Payload length field resides prior to the parsed header offset 
3574  *                             length field offset = offset from the current parsed header - lenOffset
3575  *                        Clear: Payload length field resides after the parsed header offset
3576  *                             length field offset = offset from the current parsed header + lenOffset
3577  */
3578 #define pa_CRC_OP_PAYLOAD_LENGTH_OFFSET_IS_NEGATIVE  0x0004 
3579 /**
3580  *  @def  pa_CRC_OP_CRC_FRAME_TYPE
3581  *        Control Info -- Set: Frame Type is specified
3582  *                        Clear: Frame Type is not specified, use offset 
3583  *                               parameter
3584  */
3585 #define pa_CRC_OP_CRC_FRAME_TYPE            0x0008 
3586 /**
3587  *  @def  pa_CRC_OP_CRC_RESULT_FOLLOW_PAYLOAD
3588  *        Control Info -- Set: CRC field following payload
3589  *                        Clear: CRC offset specified in command
3590  */
3591 #define pa_CRC_OP_CRC_RESULT_FOLLOW_PAYLOAD 0x0010 
3592 /*@}*/
3593 /** @} */
3595 /**
3596  *  @ingroup palld_api_structures
3597  *  @brief  CRC Generation/Verification Command
3598  *
3599  *  @details paCmdCrcOp_t is used to create CRC operation command instruct the PASS to 
3600  *           perform CRC operation in both to-network and from-network directions. The
3601  *           module user is responsible for configuring the corresponding CRC engines
3602  *           which are used for the specified CRC operation. 
3603  *
3604  *           In the to-network direction, the payload offset, payload length and CRC offset 
3605  *           should be available in the command. The generated CRC will be inserted into
3606  *           the CRC location in the packet.
3607  *
3608  *           In the from-network direction, the payload length is either a constant or 
3609  *           available in the custom header. The CRC verification will be performed by
3610  *           the CRC engine connected to the PDSP where the CRC command is executed. 
3611  *           The CRC verification result will be indicated by the error flags within 
3612  *           the CPPI descriptor as described at section table @ref appendix2 
3613  */
3615 typedef struct {
3617   uint16_t    ctrlBitfield;    /**< CRC operation control information as defined at @ref crcOpCtrlInfo */
3618   uint16_t    startOffset;     /**< Byte location, from SOP/Protocol Header, where the CRC computation begins 
3619                                     if frame type is not specified
3620                                     Byte location, from SOP/Protocol header, where the specific frame header begins
3621                                     if frame type is specified
3622                                     In to-network direction: offset from SOP
3623                                     In from-network direction: offset from the current parsed header 
3624                                     */
3625   uint16_t    len;             /**< Number of bytes covered by the CRC computation 
3626                                     valid only if pa_CRC_OP_PAYLOAD_LENGTH_IN_HEADER is clear */
3627   uint16_t    lenOffset;       /**< Payload length field offset in the custom header */
3628   uint16_t    lenMask;         /**< Payload length field mask */
3629   uint16_t    lenAdjust;       /**< Payload length adjustment: valid only if pa_CRC_OP_PAYLOAD_LENGTH_IN_HEADER is set */
3630   uint16_t    crcOffset;       /**< Offset from CRC computation starting location to the CRC field */
3631   uint16_t    crcSize;         /**< Size of CRC in bytes (PASS Gen2 only) */ 
3632   uint16_t    frameType;       /**< Frame type @ref crcFrameTypes, vaild if pa_CRC_OP_CRC_FRAME_TYPE is set */   
3633   uint32_t    initValue;       /**< CRC initial value (PASS Gen2 only) */   
3634 } paCmdCrcOp_t;
3636 /**
3637  *  @defgroup splitOpCtrlInfo  PA SPLIT Command Control Info Bit Definitions
3638  *  @ingroup palld_api_constants
3639  *  @{
3640  *
3641  *  @name PA SPLIT Command Control Info Bit Definitions
3642  *
3643  *  Bitmap definition of the ctrlBitField in @ref paCmdSplitOp_t. 
3644  */ 
3645 /*@{*/
3646 /**
3647  *  @def  pa_SPLIT_OP_FRAME_TYPE
3648  *        Control Info -- Set: Frame Type is specified
3649  *                        Clear: Frame Type is not specified, use offset 
3650  *                               parameter
3651  */
3652 #define pa_SPLIT_OP_FRAME_TYPE            0x0001 
3653 /*@}*/
3654 /** @} */
3656 /**
3657  *  @ingroup palld_api_structures
3658  *  @brief  Split Command
3659  *
3660  *  @details paCmdSplitOp_t is used to create Split command to instruct the PASS to 
3661  *           divide the ingress packet into the header and payload portion and deliver them
3662  *           to specified destination queues with specified CPPI flows respectively.
3663  *           Where the destination information of the header packet is specified by the 
3664  *           classification routing information and the destination information of the payload  
3665  *           packet is specified in this structure. 
3666  *
3667  */
3668 typedef struct {
3669   uint16_t    ctrlBitfield; /**< Split operation control information as defined at @ref splitOpCtrlInfo */
3670   uint16_t    startOffset;  /**< Byte location, from Protocol Header, where the payload begins 
3671                                  if frame type is not specified
3672                                  Byte location, from Protocol header, where the specific frame header begins
3673                                  if frame type is specified
3674                                  In from-network direction: offset from the current parsed header 
3675                                  */
3676   uint16_t    frameType;    /**< Frame type @ref crcFrameTypes, vaild if pa_SPLIT_OP_FRAME_TYPE is set */         
3677   uint16_t    destQueue;    /**< Host queue for the payload packet */
3678   uint16_t    flowId;       /**< CPPI flow which instructs how link-buffer queues are used for sending payload packets. */   
3679                             
3680 } paCmdSplitOp_t;   
3682 /**
3683  *  @ingroup palld_api_structures
3684  *  @brief  Transmit checksum configuration
3685  *
3686  *  @details  paTxChksum_t is used in the call to @ref Pa_formatTxRoute or @ref Pa_formatTxCmd to create a tx 
3687  *            command header that instructs the packet accelerator sub-system to generate ones' complement
3688  *             checksums into network packets. The checksums are typically used for TCP and UDP payload checksums as
3689  *            well as IPv4 header checksums. In the case of TCP and UDP payload checksums the psuedo header
3690  *            checksum must be pre-calculated and provided, the sub-system does not calculate it.
3691  */
3692 typedef struct {
3694   uint16_t startOffset;   /**<  Byte location, from SOP, where the checksum calculation begins */
3695   uint16_t lengthBytes;   /**<  Number of bytes covered by the checksum. Must be even */
3696   uint16_t resultOffset;  /**<  Byte offset, from startOffset, to place the resulting checksum */
3697   uint16_t initialSum;    /**<  Initial value of the checksum */
3698   uint16_t negative0;     /**<  If TRUE, a computed value of 0 is written as -0 */
3700 } paTxChksum_t;
3702 /**
3703  *  @ingroup palld_api_structures
3704  *  @brief  patch time in EOAM packet configuration
3705  *
3706  *  @details  paPatchTime_t is used in the call @ref Pa_formatTxCmd to create a tx 
3707  *            command header that instructs the packet accelerator sub-system to patch the
3708  *            time bytes in the specified offset of the packet.
3709  *            Please refer to @ref appendix8 for details about EOAM mode.
3710  */
3711 typedef struct {
3712   uint16_t startOffset;   /**<  Byte location, from SOP, to insert 8 bytes time values 4 byte second, 4 byte nano second */
3713 } paPatchTime_t;
3715 /**
3716  *  @ingroup palld_api_structures
3717  *  @brief  patch Count in EOAM packet configuration
3718  *
3719  *  @details  paPatchCount_t is used in the call @ref Pa_formatTxCmd to create a tx 
3720  *            command header that instructs the packet accelerator sub-system to patch the
3721  *            specified user stats counter bytes in the specified offset of the packet.
3722  *            Please refer to @ref appendix8 for details about EOAM mode.
3723  */
3724 typedef struct {
3726   uint16_t startOffset;   /**<  Byte location, from SOP, to insert count values */
3727   uint16_t countIndex;    /**<  Counter index to insert */  
3728 } paPatchCount_t;
3730 /**
3731  *  @defgroup copyCtrlInfo  PA Copy Command Control Info Bit Definitions
3732  *  @ingroup palld_api_constants
3733  *  @{
3734  *
3735  *  @name PA Copy Command Control Info Bit Definitions
3736  *
3737  *  Bitmap definition of the ctrlBitField in @ref paCmdCopy_t. 
3738  *         
3739  */ 
3740 /*@{*/
3741 /**
3742  *  @def  pa_COPY_OP_FROM_END
3743  *        Control Info -- Set: Copy data from the end of the payload
3744  *                        Clear: Copy data from the beginning of the payload
3745  */
3746 #define pa_COPY_OP_FROM_END                 0x0001 
3747 /*@}*/
3748 /** @} */
3749  
3750 /**
3751  *  @ingroup palld_api_structures
3752  *  @brief  Copy Command
3753  *
3754  *  @details paCmdCopy_t is used to define how to copy number of bytes from the data packet to 
3755  *           the descriptor. The copy command is used to instruct the PASS to copy up to 8 byte 
3756  *           from packet to the PS info section in the packet descriptor in the from-network direction. 
3757  *           If the desired copy area crosses over the packet boundary, then garbage data will be copied.
3758  *
3759  *  @note: There are 20-byte packet information stored in the PS Info section. It is recommended to copy 
3760  *         packet data after the packet information area. Otherwise, the packet information will be 
3761  *         overwritten. There are upto 12 bytes can be copied with the packet information or upto
3762  *         32 bytes can be copied without the packet information. 
3763  */
3765 typedef struct {
3767   uint16_t    ctrlBitfield;    /**< Copy operation control information as defined at @ref copyCtrlInfo */
3768   uint16_t    srcOffset;       /**< Offset from the start of current protocol header for the data copy to begin */
3769   uint16_t    destOffset;      /**< Offset from the top of the PSInfo for the data to be copied to */
3770   uint16_t    numBytes;        /**< Number of bytes to be copied */   
3771 } paCmdCopy_t;
3774 /**
3775  *  @ingroup palld_api_structures
3776  *  @brief  Multi-route Command
3777  *
3778  *  @details paCmdMultiRoute_t is used to specify the desired PA multi-route set.
3779  *           The multi-route command instructs the PASS to route the packets to multiple 
3780  *           destinations in the from-network direction only. It must be the last command 
3781  *           within a command set. The commands following the multi-route command will
3782  *           not be executed.  
3783  */
3784 typedef struct {
3786   uint16_t    index;        /**<  Multi-route set Index */
3787 } paCmdMultiRoute_t;
3790 /**
3791  *  @ingroup palld_api_constants
3792  *  @def  pa_MAX_CMD_SETS
3793  *        The maximum number of command sets supported
3794  */
3795 #define pa_MAX_CMD_SETS     64
3797 /**
3798  *  @ingroup palld_api_structures
3799  *  @brief  Command Set Command
3800  *
3801  *  @details paCmdSet_t is used to specify the desired PA command set. The command set command 
3802  *           instructs the PASS to execute a list of commands after a LUT1 or LUT2 match occurs. 
3803  *           It is one of the command which can be embedded within the @ref paRouteInfo_t. 
3804  */
3805 typedef struct {
3807   uint16_t    index;        /**< Command Set Index */
3808 } paCmdSet_t;
3810 /**
3811  *   @ingroup palld_api_constants
3812  *   @def  pa_MAX_PATCH_BYTES
3813  *         The maximum number of bytes that a patch command can accept
3814  */
3815 #define pa_MAX_PATCH_BYTES     16      /**< PATCH Command in to-netweok direction */
3816 #define pa_MAX_RX_PATCH_BYTES  32      /**< PATCH Command within a command set */
3818 /**
3819  *  @defgroup patchCtrlInfo  PA Patch Command Control Info Bit Definitions
3820  *  @ingroup palld_api_constants
3821  *  @{
3822  *
3823  *  @name PA Patch Command Control Info Bit Definitions
3824  *
3825  *  Bitmap definition of the ctrlBitField in @ref paPatchInfo_t. 
3826  *         
3827  */ 
3828 /*@{*/
3829 /**
3830  *  @def  pa_PATCH_OP_INSERT
3831  *        Control Info -- Set: Insert data into the packet
3832  *                        Clear: Patch data replaces existing packet data
3833  */
3834 #define pa_PATCH_OP_INSERT                 0x0001 
3835 /**
3836  *  @def  pa_PATCH_OP_MAC_HDR
3837  *        Control Info -- Set: Replace MAC header with patch data
3838  *                        Clear: Normal Patch/Insert operation
3839  */
3840 #define pa_PATCH_OP_MAC_HDR                0x0002 
3841 /**
3842  *  @def  pa_PATCH_OP_DELETE
3843  *        Control Info -- Set: Delete data in the packet
3844  *                        Clear: Normal Patch/Insert operation
3845  */
3846 #define pa_PATCH_OP_DELETE                 0x0004 
3847 /*@}*/
3848 /** @} */
3851 /**
3852  *  @ingroup palld_api_structures
3853  *  @brief  Packet patching configuration
3854  *
3855  *  @details paPatchInfo_t is used to create data patch command. The patch command is used to patch 
3856  *           existing data or insert data in the packet in both to-network and from-network directions.
3857  *
3858  *           In the to-network direction, it can be used to patch the authentication tag provided by SASS 
3859  *           into the AH header within the packet. In this case, the patch data is not present at the command 
3860  *           when it is formatted and it is appended by the SASS. The @ref Pa_formatRoutePatch is used to create
3861  *           a command block along with a packet routing command to forward the packet after the patch is complete
3862  *
3863  *           In the from-network direction, it can be used to insert up to 32 bytes to the offset location
3864  *           as part of the command set to be executed after a LUT1 or LUT2 match. 
3865  *           This command can be used to patch the entire MAC header for MAC router functionality. It may be further 
3866  *           enhanced and combined with other commands to support IP forwarding operation in the future.
3867  *           A short version of the patch command can be used to insert up to 2 bytes into the current parsing
3868  *           location of the packet after a LUT2 match.
3869  */
3871 typedef struct {
3873   uint16_t   ctrlBitfield;      /**<  Patch operation control information as defined at @ref patchCtrlInfo */
3874   uint16_t   nPatchBytes;       /**<  The number of bytes to be patched */
3875   uint16_t   totalPatchSize;    /**<  The number of patch bytes in the patch command, must be >= to nPatchBytes and a multiple of 4 bytes */
3876   uint16_t   offset;            /**<  Offset from the start of the packet for the patch to begin in the to-network direction 
3877                                       Offset from the start of the current header for the patch to begin in the from-network direction */
3878   uint8_t    *patchData;        /**<  Pointer to the patch data */
3880 } paPatchInfo_t;
3884 /**
3885  *  @ingroup palld_api_structures
3886  *  @brief  paPayloadInfo_t defines the packet payload information in the short format.
3887  *          It is required by the Security Accelerator sub-system (SASS)
3888  *
3889  *  @details paPayloadInfo_t defines the packet parsing information in terms of
3890  *           payload offset and payload length as described below
3891  *  @li      SRTP:      offset to the RTP header; RTP payload length including ICV
3892  *  @li      IPSEC AH:  offset to the Outer IP; IP payload length
3893  *  @li      IPSEC ESP: offset to the ESP header; ESP papload length including ICV
3894  */
3896 typedef struct  {
3897     uint16_t  offset;    /**< The offset to where the SA packet parsing starts */
3898     uint16_t  len;       /**< The total length of the protocal payload to be processed by SA */
3899     uint32_t  supData;   /**< Optional supplement data such as the 32-bit CountC for some 3GPP operation modes */
3900 } paPayloadInfo_t;
3903 /**
3904  *  @ingroup palld_api_structures
3905  *  @brief   Tx timestamp reporting information
3906  *
3907  *  @details paCmdTxTimestamp_t specifies the tx timestamp reporting information. The report tx timestamp command is used to instruct 
3908  *           the PASS to report the PA timestamp when the packet is transmitting out of PASS in a return (null) packet to the specified 
3909  *           host queue. The transmit timestamp may be used for the Precision Timing Protocol (PTP). The reported tx timestamp will be 
3910  *           a 64-bit value, with the lower 32 bits stored in timestamp field, and the upper 32 bits stored in swInfo1.
3911  *
3912  *  @pre     API @ref Pa_configTimestamp() should be called to enable PASS system timestamp.             
3913  */
3915 typedef struct  {
3916     uint16_t  destQueue; /**< Host queue for the tx timestamp reporting packet */
3917     uint16_t  flowId;    /**< CPPI flow which instructs how link-buffer queues are used for sending tx timestamp reporting packets. */
3918     uint32_t  swInfo0;   /**< lower 32 bit value returned in the descriptor as swInfo0 which can be used as event identifier */
3919 } paCmdTxTimestamp_t;
3921 /**
3922  *  @ingroup palld_api_structures
3923  *  @brief   IP fragmentation information
3924  *
3925  *  @details paCmdIpFrag_t is used to create the IPv4 fragment command. The IP fragment command is used to instruct the PASS to 
3926  *           perform IPv4 fragmentation operation. This operation can be applied to both inner IP prior to IPSEC encapsulation and 
3927  *           outer IP after IPSEC encapsulation.  This command should go with a next route command which provides the destination 
3928  *           information prior to the fragmentation operation. 
3929  *    
3930  *           For the inner IP fragmentation, follow the following procedure:
3931  *  @li      Host sends packets with the IP fragment command and the destination queue set to a host queue to PASS PDSP5 
3932  *           for IP fragmentation operation.
3933  *  @li      All fragments will be delivered to the specified host queue.
3934  *  @li      Host adds the outer MAC/IP header, invokes the SA LLD sendData function and then sends the fragments to the SA queue.
3935  *  @li      Each fragment will be encrypted, authenticated and forwarded to the final destination.
3936  *
3937  *           For the outer IP fragmentation, the overall operation is stated below: 
3938  *  @li      Packet is delivered to SASS for IPSEC operation
3939  *  @li      Packet is delivered to PASS for IP Fragmentation operation
3940  *  @li      The entire packet or its fragments are delivered to the network.
3941  *
3942  *  @note the next route command is required for step 2
3943  *  @note The IP fragment command can not be combined with some other tx commands such as checksum and CRC commands since
3944  *        those commands may require the PASS operation across multiple fragments. The workaround is to break the tx commands into
3945  *        two groups. The first group consists of the checksum, CRC, other commands and a next route command which routes the packet
3946  *        back to the same PDSP to execute the second command group which consists of the IP fragment command and the next route 
3947  *        command which points to the final destination.
3948  *
3949  *        The IP fragment command can be combined with a single blind patch command to support the IPSEC AH use case in which the SASS 
3950  *        passes the IPSEC AH packet with the blind patch command to the PASS so that the autentication tag can be inserted into the AH 
3951  *        header. The recommended order of the tx commands is as the followings:
3952  *        - pa_CMD_IP_FRAGMENT
3953  *        - pa_CMD_NEXT_ROUTE with flag pa_NEXT_ROUTE_PROC_NEXT_CMD set
3954  *        - pa_CMD_PATCH_DATA 
3955  *
3956  *        The IP fragment command can be also combined with up to two message length patching commands to support the message length 
3957  *        field updating for each IP fragment. This operation is required for certain L2 header which contains a length field such as
3958  *        802.3 and PPPoE. The order of tx command is as the followings:
3959  *        - pa_CMD_PATCH_MSG_LEN (optional)
3960  *        - pa_CMD_PATCH_MSG_LEN (optional)
3961  *        - pa_CMD_IP_FRAGMENT
3962  *        - pa_CMD_NEXT_ROUTE 
3963  */
3965 typedef struct  {
3966     uint16_t  ipOffset; /**< Offset to the IP header. */
3967     uint16_t  mtuSize;  /**< Size of the maximum transmission unit (>= 68) */
3968 } paCmdIpFrag_t;
3970 /**
3971  *  @ingroup palld_api_structures
3972  *  @brief   Message length patching configuration
3973  *
3974  *  @details paPatchMsgLenInfo_t is used to create message length patch command which is used in conjunction with
3975  *           the Ip fragmentation command. This command instruct the PASS to update the message length field within 
3976  *           some L2 protocol header such as 802.3 and PPPoE after the potential IP fragmentation operation.
3977  *
3978  *           The PASS support up to two message length patching operations per IP fragmentation command.
3979  */
3981 typedef struct {
3983   uint8_t    msgLenSize;    /**<  Size of message length field in bytes (@note only 2-byte and 4=byte message length is supported) */
3984   uint8_t    offset;        /**<  Offset from the start of the packet to the message length field */ 
3985   uint16_t   msgLen;        /**<  Message length excluding the IP header and payload length */
3987 } paPatchMsgLenInfo_t;
3989 /**
3990  *  @ingroup palld_api_structures
3991  *  @brief  User-defined Statistics Command
3992  *
3993  *  @details paCmdUsrStats_t is used to specify the desired User-defined counter. The user stats command 
3994  *           instructs the PASS to update the specified user-defined counter and all the counters which are 
3995  *           linked to this counter 
3996  *           It is one of the command which can be embedded within the @ref paRouteInfo_t. 
3997  */
3998 typedef struct {
3999   uint16_t    index;        /**< User-defined statistics index */
4000 } paCmdUsrStats_t;
4002 /**
4003  *  @ingroup palld_api_structures
4004  *  @brief  Command Set plus User-defined Statistics Command
4005  *
4006  *  @details paCmdSetUsrStats_t is used to specify the desired PA command set and User-defined counter. This command
4007  *           provides the module user a mechanism to specify different user-defined counters with the same command set 
4008  *           for different LUT entries and vice versa. 
4009  *           This command instructs the PASS to update the specified user-defined counter and all the counters which are 
4010  *           linked to this counter and then execute the specified command set.
4011  *           It is one of the command which can be embedded within the @ref paRouteInfo_t. 
4012  */
4013 typedef struct {
4014   uint16_t    setIndex;          /**< Commad Set Index */
4015   uint16_t    statsIndex;        /**< User-defined statistics index */
4016 } paCmdSetUsrStats_t;
4019 /**
4020  *  @defgroup pktErrInfo  PA Packet Error Info Bit Definitions
4021  *  @ingroup palld_api_constants
4022  *  @{
4023  *
4024  *  @name PA Packet Error Info Bit Definitions
4025  *
4026  *  Bitmap definition of the errorBitfield in @ref paCmdVerifyPktErr_t. 
4027  *         
4028  */ 
4029 /*@{*/
4030 /**
4031  *  @def  pa_PKT_ERR_IP_CHECKSUM
4032  *        Control Info -- Set: Re-direct packet if IP checksum error occurs
4033  *                        Clear: Ignore IP checksum Error
4034  */
4035 #define pa_PKT_ERR_IP_CHECKSUM                 0x0001 
4036 /**
4037  *  @def  pa_PKT_ERR_L4_CHECKSUM
4038  *        Control Info -- Set: Re-direct packet if UDP/TCP checksum error occurs
4039  *                        Clear: Ignore UDP/TCP checksum Error
4040  */
4041 #define pa_PKT_ERR_L4_CHECKSUM                 0x0002 
4042 /**
4043  *  @def  pa_PKT_ERR_CRC
4044  *        Control Info -- Set: Re-direct packet if CRC error occurs
4045  *                        Clear: Ignore CRC Error
4046  */
4047 #define pa_PKT_ERR_CRC                         0x0004 
4048 /*@}*/
4049 /** @} */
4050  
4051 /**
4052  *  @ingroup palld_api_structures
4053  *  @brief  Verify Packet Error Command
4054  *
4055  *  @details paCmdVerifyPktErr_t is used to construct the "Verify Packet Error" command. The  
4056  *           IPv4 header checksum, UDP/TCP checksum and SCTP CRC-32c checksum verification are performed by 
4057  *           the PASS autonomously while the CRC verification is performed per command. The corresponding error bit 
4058  *           in the CPPI descriptor will be set and can be verified by the application when packet is delivered 
4059  *           to the host. This command instructs PASS to examine the specified error flags and forward the error 
4060  *           packet accordingly.
4061  */
4063 typedef struct {
4065   uint16_t errorBitfield;   /**<  Packet Error information as defined at @ref pktErrInfo */
4066   uint8_t  dest;            /**<  Packet destination as defined at @ref pktDest */