NOTICE OF RELOCATION
[keystone-rtos/pa-lld.git] / pa_fc.h
1 #ifndef _PA_FC_H
2 #define _PA_FC_H
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
8 /* System level header files */
9 #include <stdint.h>
10 #include <stdlib.h>
12 #include <ti/drv/pa/pa.h>
14 /* ============================================================= */
15 /**
16  *   @file  pa_fc.h
17  *
18  *   path  ti/drv/pa/pa_fc.h
19  *
20  *   @brief  Packet Accelerator (PA) sub-system LLD Flow Cache related API and Data Definitions
21  *
22  *  ============================================================================
23  *  Copyright (c) Texas Instruments Incorporated 2013
24  * 
25  *  Redistribution and use in source and binary forms, with or without 
26  *  modification, are permitted provided that the following conditions 
27  *  are met:
28  *
29  *    Redistributions of source code must retain the above copyright 
30  *    notice, this list of conditions and the following disclaimer.
31  *
32  *    Redistributions in binary form must reproduce the above copyright
33  *    notice, this list of conditions and the following disclaimer in the 
34  *    documentation and/or other materials provided with the   
35  *    distribution.
36  *
37  *    Neither the name of Texas Instruments Incorporated nor the names of
38  *    its contributors may be used to endorse or promote products derived
39  *    from this software without specific prior written permission.
40  *
41  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
42  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
43  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
44  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
45  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
46  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
47  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
48  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
49  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
50  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
51  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52  *
53 */
55 /**
56  *  @page appendix4 Flow Cache 
57  *
58  *  The PASS Flow Cache operation consits of the following three sub-operations:
59  *      - Flow Cache Classification: Classify up to 256 established egress flows based on  
60  *                                   the inner IP and L4 parameters. 
61  *      - Egress Flow Operation: Perform up to 4-level packet modification such as IP mangling,  
62  *                               IPSEC framing and encryption, L2 framing and etc per packet 
63  *                               modification records.
64  *      - Ingress Packet Forwarding: Route the ingress packets to the Egress processing unit  
65  *                                   as one of the classification routing options.
66  *
67  *  The flow cache operation can be used to help glue the ingress path to the egress path to 
68  *  establish a fully automated processing chain without host intervention. It may be only 
69  *  applied to egress packets from the host to establish fully-offloaded egress chain operation 
70  *  with or without flow cache classification. 
71  *
72  *  The flow cache classification module resides at PASS Egress0 clsuter and it supports 256
73  *  LUT1 entries, each entry consists of any combination of IP and UDP/TCP parameters as defined
74  *  at @ref paFcInfo_t. Each flow cache entry is also assocaited with a pre-determined egress flow
75  *  where the egress packets will undertake up to 4-level of packet modification defined by
76  *  the egress flow packet modification records, which are described at the next section. The API 
77  *  @ref Pa_addFc() and @ref Pa_delFcHandle are used to add and delete the Flow Cache entries respectively. 
78  *
79  *  Each egress flow consists of up to four packet modification stages where the packet can undergo  
80  *  transformations in the egress path, before it is sent out from PASS. The four packet modification
81  *  stages are 
82  *  @li Inner L3/L4 Processing  
83  *  @li Outer L3/IPSEC Processing
84  *  @li IPSEC AH/ NAT Processing
85  *  @li L2 Processing
86  *
87  *  The detailed operation of each packet modification stage is defined at its corresponding egress flow 
88  *  record defintion sections(@ref paEfRecLevel1_t, @ref paEfRecLevel2_t, @ref paEfRecLevel3_t and
89  *  @ref paEfRecLevel4_t) The API @ref Pa_configEflowRecords is used to add/delete single or multiple
90  *  packet modification records.
91  *
92  *  The ingress traffic may be routed to the egress path at each of the following four classification stages:
93  *  - L2 classification: Only L2 processing is allowed at the egress path to support application 
94  *                       such as MAC routing
95  *  - Outer IP classification: Support outer L3/IPSEC and L2 processing only without Flow Cache classification
96  *                             Support all four egress stages with Flow Cache classification
97  *  - Inner IP classification: Support all four egress stages with and without Flow Cache classification 
98  *  - L4 classification: Support all four egress stages with and without Flow Cache classification 
99  *
100  *  The advanced routing information data structure @ref paRouteInfo2_t with flow cache operation
101  *  data structure @ref paEfOpInfo_t are used to define flow cache route.
102  */
104 /**
105  *  @defgroup paEflowErouteTypes PA Egress Flow Exception Route Types
106  *  @ingroup palld_api_constants
107  *  @{
108  *
109  *  @name PA Egress Flow Exception Route Types
110  *
111  *  @brief  These values are used to define exception route conditions in egress path.
112  *
113  *  @details  The Egress Flow exception route defines the global routing information when the exception 
114  *            condition such as Flow Cache lookup failure, packet parsing failure, TCP control detection 
115  *            and etc. Multiple exception routes can be configured through @ref Pa_configEflowExceptionRoute. 
116  *            The PASS will drop all exception route packets by default until the corresponding exception
117  *            route is configured.
118  */
119 /*  @{  */
120 /**
121  *
122  *   @def  pa_EFLOW_EROUTE_FC_FAIL
123  *         packet failed to match in Flow Cache (LUT1) table
124  */
125 #define pa_EFLOW_EROUTE_FC_FAIL         0
127 /**
128  *  @def pa_EFLOW_EROUTE_PARSE_FAIL
129  *       packet failed to parse
130  */
131 #define pa_EFLOW_EROUTE_PARSE_FAIL      1
133 /**
134  *  @def pa_EFLOW_EROUTE_IP_FRAG
135  *       IP fragmented packet 
136  */
137 #define pa_EFLOW_EROUTE_IP_FRAG         2
139 /**
140  *  @def pa_EFLOW_EROUTE_IPV6_OPT_FAIL
141  *       Packet failed due to unsupported IPV6 option header
142  */
143 #define pa_EFLOW_EROUTE_IPV6_OPT_FAIL   3
145 /**
146  *  @def pa_EFLOW_EROUTE_IP_OPTIONS
147  *       IP packet with IPv4 options or IPv6 extension headers
148  */
149 #define pa_EFLOW_EROUTE_IP_OPTIONS      4
151 /**
152  *  @def pa_EFLOW_EROUTE_IP_EXPIRE
153  *       IP packet with TTL expired or Hop Limitis reached
154  */
155 #define pa_EFLOW_EROUTE_IP_EXPIRE       5
157 /**
158  *  @def pa_EFLOW_EROUTE_TCP_CTRL
159  *       TCP Control packets where one or more control bits 
160  *       (SYN, FIN, and RST) are set
161  */
162 #define pa_EFLOW_EROUTE_TCP_CTRL        6
164 /**
165  *  @def pa_EFLOW_EROUTE_INVALID_REC
166  *       Invalid Egree Flow Records
167  */
168 #define pa_EFLOW_EROUTE_INVALID_REC     7
171 /**
172  *  @def  pa_EFLOW_EROUTE_SYSTEM_FAIL
173  *        Sub-system detected internal error
174  */
175 #define pa_EFLOW_EROUTE_SYSTEM_FAIL     10
177 /**
178  *  @def   pa_EFLOW_EROUTE_MAX
179  *         The maximum number of global route types
180  */
181 #define pa_EFLOW_EROUTE_MAX             11
183 /*  @}  */  
184 /** @} */
186 /**
187  *  @ingroup palld_api_functions
188  *  @brief  Pa_configEflowExceptionRoute configures the routing of packets based on an exception condition such as
189  *          no match, parsing failure, TCP control packet etc in the egress direction (PASS Gen2 only)
190  *
191  *  @details  This function is used to configure the sub-system to route packets that satisfy an exception 
192  *            rule or condition (see @ref paEflowErouteTypes) in the egress direction. For example,
193  *            - failure to flow cache table match
194  *            - parsing error i.e. the sub-system is not able to continue parsing the packets
195  *            - TCP contrl packet
196  *            - system failure  
197  *
198  *            From one to @ref pa_EFLOW_EROUTE_MAX routes can be specified through a single call to this
199  *            function.  Parameter nRoute is used to specify how many routes are contained in the
200  *            routeTypes and eRoutes arrays. A value of 0 nRoutes results in no action by the function.
201  *
202  *            By default when each exception type is detected the packet is discarded silently. Once the
203  *            route is changed through a call to this function it remains in the new state until the
204  *            function is called again to explicitly change that route. The only way to revert back
205  *            to the default of silent discard is to call this function again.
206  *
207  *            On return the command buffer (cmd) contains a formatted command for the sub-system. 
208  *            The destination for the command is provided in cmdDest. The module user must send the
209  *            formatted command to the sub-system. The sub-system will generate a reply and this reply
210  *            must be sent back to this module through the API @ref Pa_forwardResult.
211  *
212  *  @param[in]    iHandle     The driver instance handle
213  *  @param[in]    nRoute      The number of exception routes specified
214  *  @param[in]    routeTypes  Array of exception routing types (@ref paEflowErouteTypes)
215  *  @param[in]    eRoutes     Array of exception packet routing configuration
216  *  @param[out]   cmd         Buffer where the sub-system command is created
217  *  @param[in]    cmdSize     The size of the passCmd buffer
218  *  @param[in]    reply       Where the response to the PASS command is routed
219  *  @param[out]   cmdDest     Value (@ref cmdTxDest)
220  *  @retval                   Value (@ref ReturnValues)
221  *  @pre                      A driver instance must be created and tables initialized
222  *
223  *  @note: This API is not supported at the first generation PASS
224  */
225 paReturn_t Pa_configEflowExceptionRoute (Pa_Handle       iHandle,
226                                          int             nRoute,
227                                          int            *routeTypes,
228                                          paRouteInfo_t  *eRoutes,
229                                          paCmd_t         cmd,
230                                          uint16_t       *cmdSize,
231                                          paCmdReply_t   *reply,
232                                          int            *cmdDest);
234 /**
235  *  @defgroup paEflowRecTypes PA Egress Flow Record types 
236  *  @ingroup palld_api_constants
237  *  @{
238  *
239  *  @name PA Egress Flow Record types
240  *
241  *  @brief  These values are used to define the modification record types in the egress flow operation 
242  *
243  */
244 /*  @{  */
245 /**
246  *
247  *   @def  pa_EFLOW_REC_TYPE_LVL1
248  *         Level1: Inner L3/L4 Processing
249  */
250 #define pa_EFLOW_REC_TYPE_LVL1         1
252 /**
253  *
254  *   @def  pa_EFLOW_REC_TYPE_LVL2
255  *         Level2: Outer L3/IPSEC Processing 
256  */
257 #define pa_EFLOW_REC_TYPE_LVL2         2
258 /**
259  *
260  *   @def  pa_EFLOW_REC_TYPE_LVL3
261  *         Level3: IPSEC AH/IPSEC ESP NAT-T Processing 
262  */
263 #define pa_EFLOW_REC_TYPE_LVL3         3
265 /**
266  *
267  *   @def  pa_EFLOW_REC_TYPE_LVL4
268  *         Level1: L2 Processing
269  */
270 #define pa_EFLOW_REC_TYPE_LVL4         4
272  
273 /*  @}  */  
274 /** @} */
277 /**
278  *  @defgroup paEfLvl1RecordValidBits  PA Egress Flow Level One Record Valid Bit Definitions
279  *  @ingroup palld_api_constants
280  *  @{
281  *
282  *  @name PA Egress Flow Level One Record Valid Bit Definitions
283  *
284  *  Bitmap definition of the validBitMap in @ref paEfRecLevel1_t. 
285  */ 
286 /*@{*/
287 /**
288  *  @def  pa_EF_LVL1_RECORD_VALID_CTRL_FLAGS
289  *        - Level One record control flags is present
290  */
291 #define pa_EF_LVL1_RECORD_VALID_CTRL_FLAGS         0x0001
293 /**
294  *  @def  pa_EF_LVL1_RECORD_VALID_IP_SRC
295  *        - Source IP address in packet should be replaced with the one in record
296  */
297 #define pa_EF_LVL1_RECORD_VALID_IP_SRC             0x0002
299 /**
300  *  @def  pa_EF_LVL1_RECORD_VALID_IP_DST
301  *        - Destination IP address in packet should be replaced with the one in record
302  */
303 #define pa_EF_LVL1_RECORD_VALID_IP_DST             0x0004
305 /**
306  *  @def  pa_EF_LVL1_RECORD_VALID_FLOW_LABEL
307  *        - IPv6 flow label in packet should be replaced with the one in record
308  */
309 #define pa_EF_LVL1_RECORD_VALID_FLOW_LABEL         0x0008
311 /**
312  *  @def  pa_EF_LVL1_RECORD_VALID_TOS_CLASS
313  *        - IPv4 type of service or IPv6 traffic class in packet should be replaced with the one in record
314  */
315 #define pa_EF_LVL1_RECORD_VALID_TOS_CLASS          0x0010
317 /**
318  *  @def  pa_EF_LVL1_RECORD_VALID_IP_MTU
319  *        Inner IP MTU is specified, perform Inner IP fragmentation is necessary 
320  */
321 #define pa_EF_LVL1_RECORD_VALID_IP_MTU             0x0020 
323 /**
324  *  @def  pa_EF_LVL1_RECORD_VALID_SRC_PORT
325  *        TCP/UDP source port in packet should be replaced with the one in record 
326  */
327 #define pa_EF_LVL1_RECORD_VALID_SRC_PORT           0x0040 
328 /**
329  *  @def  pa_EF_LVL1_RECORD_VALID_DST_PORT
330  *        TCP/UDP destination port in packet should be replaced with the one in record 
331  */
332 #define pa_EF_LVL1_RECORD_VALID_DST_PORT           0x0080 
335 /* @} */ /* ingroup */
336 /** @} */
338 /**
339  *  @defgroup paEfLvl1RecordCtrlFlags  PA Egress Flow Level One Record Control Flag Definitions
340  *  @ingroup palld_api_constants
341  *  @{
342  *
343  *  @name PA Egress Flow Level One Record Control Flag Definitions
344  *  Bitmap definition of the ctrlFlags in @ref paEfRecLevel1_t. 
345  */ 
346 /*@{*/
347 /**
348  *  @def  pa_EF_LVL1_RECORD_CONTROL_FLAG_IP_CKSUM
349  *        Flag -- 1: Recalculate IP header Checksum 
350  */
351 #define pa_EF_LVL1_RECORD_CONTROL_FLAG_IP_CKSUM         0x0001 
352 /**
353  *  @def  pa_EF_LVL1_RECORD_CONTROL_FLAG_L4_CKSUM
354  *        Flag -- 1: Recalculate TCP/UDP Checksum
355  */
356 #define pa_EF_LVL1_RECORD_CONTROL_FLAG_L4_CKSUM         0x0002 
357 /**
358  *  @def  pa_EF_LVL1_RECORD_CONTROL_FLAG_TTL_DEC
359  *        Flag -- 1: Decrement TTL
360  */
361 #define pa_EF_LVL1_RECORD_CONTROL_FLAG_TTL_DEC          0x0004 
362 /**
363  *  @def  pa_EF_LVL1_RECORD_CONTROL_FLAG_EXP_TCP_CTRL
364  *        Flag -- 1: Detect and forward TCP control packet through egress flow exception route
365  */
366 #define pa_EF_LVL1_RECORD_CONTROL_FLAG_EXP_TCP_CTRL     0x0008 
367 /**
368  *  @def  pa_EF_LVL1_RECORD_CONTROL_FLAG_EXP_IP_OPTION
369  *        Flag -- 1: Detect and forward IP packet with IPv4 options or IPv6 extension headers through egress flow exception route
370  */
371 #define pa_EF_LVL1_RECORD_CONTROL_FLAG_EXP_IP_OPTION    0x0010 
372 /**
373  *  @def  pa_EF_LVL1_RECORD_CONTROL_FLAG_EXP_IP_FRAGMENT
374  *        Flag -- 1: Detect and forward fragmented IP packet through egress flow exception route
375  */
376 #define pa_EF_LVL1_RECORD_CONTROL_FLAG_EXP_IP_FRAGMENT  0x0020 
377 /**
378  *  @def  pa_EF_LVL1_RECORD_CONTROL_FLAG_EXP_IP_EXPIRE
379  *        Flag -- 1: Detect and forward expired IP packet through egress flow exception route
380  */
381 #define pa_EF_LVL1_RECORD_CONTROL_FLAG_EXP_IP_EXPIRE    0x0040 
382 /**
383  *  @def  pa_EF_LVL1_RECORD_CONTROL_REMOVE_OUTER_IP_HDR_TRAIL
384  *        Flag -- 1: Remove outer IP header up to the inner IP and the associated trail
385  *
386  *  @note: The option is used to remove the outer IP and associated trail from the forwarding
387  *         packets where only L2 header needs to be replaced.
388  */
389 #define pa_EF_LVL1_RECORD_CONTROL_REMOVE_OUTER_IP_HDR_TRAIL    0x0080 
392 /*@}*/
393 /** @} */
395 /**
396  *  @ingroup palld_api_structures
397  *  @brief  PA Egress Flow Level One Record data structure
398  *
399  *  @details  The PA Egress Flow level one record is used to instruct PASS to perform Inner L3/L4 Processing as specified below:
400  *            -IP header updates
401  *              - Source/Destination addresses 
402  *              - TOS/Traffic Class
403  *              - Flow Label
404  *              - TTL
405  *            -IPv4 header checksum calculation
406  *            -TCP/UDP header updates
407  *              - Source/Destination Port
408  *            -TCP/UDP checksum calculation
409  *            -Inner IP Fragmentation pre-processing
410  *            
411  *            paEfRecLevel1_t defines the configuration parameters of the egress flow level one record
412  *            Since not all fields are used all the time, validBitMap is used to specify which optional field 
413  *            is used for packet modification. 
414  */
415 typedef struct  {
416   uint16_t    validBitMap;/**< Valid Bitmap corresponding to each optional field as defined at @ref paEfLvl1RecordValidBits */
417   uint16_t    ctrlBitMap; /**< Level one record control flag Bitmap as defined at @ref paEfLvl1RecordCtrlFlags */
418   int         ipType;     /**< IP type (Mandatory if srcIp or dest Ip is sepcified) @ref IpValues */
419   paIpAddr_t  src;        /**< Source IP address */
420   paIpAddr_t  dst;        /**< Destination IP address */
421   uint32_t    flow;       /**< IPv6 flow label in 20 lsbs */
422   uint8_t     tos;        /**< IP Type of Service (IPv4) / Traffic class (IPv6) */
423   uint16_t    mtu;        /**< IP MTU size */
424   uint16_t    srcPort;    /**< TCP/UDP Source Port Number */
425   uint16_t    dstPort;    /**< TCP/UDP Destinatio Port Number */
426 } paEfRecLevel1_t;
428 /**
429  *  @defgroup paIpsecProto IPSEC Protocols
430  *  @ingroup palld_api_constants
431  *  @{
432  *
433  *  @name IPSEC Protocols
434  *
435  *  Parameter ipsecProto of paEfRecIpsecParams_t should be set to
436  *  one of these types.
437  */ 
438 /*@{*/
439 typedef enum {
440   pa_IPSEC_PROTO_ESP = 0,             
441   pa_IPSEC_PROTO_AH                    
442 } paIpsecProto_e;
443 /*@}*/
444 /** @} */
446 /**
447  *  @defgroup paEfRecIpsecConfigCtrlBit  PA Egress Flow Record IPSEC Configuration Control Bit Definitions
448  *  @ingroup palld_api_constants
449  *  @{
450  *
451  *  @name PA Egress Flow Record IPSEC Configuration Control Bit Definitions
452  *
453  *  Bitmap definition of the ctrlBitMap in paEfRecIpsecParams_t. 
454  *  
455  */ 
456 /*@{*/
457 /**
458  *  @def  pa_EF_RECORD_IPSEC_USE_LOC_DMA
459  *        Control Info -- 0:Use PASS global DMA to forward packets to SA (default)
460  *                        1:Use PASS local DMA to forward packets to SA  
461  */
462 #define pa_EF_RECORD_IPSEC_USE_LOC_DMA       0x0001 
463 /*@}*/
464 /** @} */
467 /**
468  * @ingroup palld_api_structures
469  * @brief Egress Flow IPSEC Configuration Parameters structure
470  *
471  * Data structure defines the IPSEC specific configuration parameters within the egress flow record
472  *
473  */
474 typedef struct {
475   uint16_t    ipsecProto; /**< Specify the IPSEC protocol as defined at @ref paIpsecProto */
476   uint16_t    ctrlBitMap; /**< Various control information as specified at @ref paEfRecIpsecConfigCtrlBit */                                                                       
477   uint8_t     encBlkSize; /**< Specify the encryption block size 
478                                1: Stream encryption and no alignment requirement
479                                4: AES-CTR or other stream-like encryption with 4-byte 
480                                   alignment
481                                   block size: block encryption algorithm */
482   uint8_t     ivSize;     /**< Specify the size of the initialization vector in bytes */  
483   uint8_t     macSize;    /**< Specify the size of the authentication tag in bytes */ 
484   uint8_t     flowId;     /**< Specify the 8-bit CPPI Flow ID which instructs how the link-buffer queues are used for forwarding packets */
485   uint16_t    queueId;    /**< Specify the 16-bit SA input queue ID */
486   uint32_t    spi;        /**< Specify the SPI (Security Parameter Index) */
487   uint32_t    saInfo0;    /**< Specify SA-specific software info word 0 */
488   uint32_t    saInfo1;    /**< Specify SA-specific software info word 1 */
489 } paEfRecIpsecParams_t;
491 /**
492  *  @defgroup paEfLvl2RecordValidBits  PA Egress Flow Level two Record Valid Bit Definitions
493  *  @ingroup palld_api_constants
494  *  @{
495  *
496  *  @name PA Egress Flow Level two Record Valid Bit Definitions
497  *
498  *  Bitmap definition of the validBitMap in @ref paEfRecLevel2_t. 
499  */ 
500 /*@{*/
501 /**
502  *  @def  pa_EF_LVL2_RECORD_VALID_CTRL_FLAGS
503  *        - Level two record control flags is present
504  */
505 #define pa_EF_LVL2_RECORD_VALID_CTRL_FLAGS         0x0001
507 /**
508  *  @def  pa_EF_LVL2_RECORD_VALID_IP_MTU
509  *        Outer IP MTU is specified, perform Outer IP fragmentation is necessary 
510  */
511 #define pa_EF_LVL2_RECORD_VALID_IP_MTU             0x0002 
513 /**
514  *  @def  pa_EF_LVL2_RECORD_VALID_IPSEC
515  *        - IPSEC parameters are present
516  */
517 #define pa_EF_LVL2_RECORD_VALID_IPSEC              0x0004
519 /* @} */ /* ingroup */
520 /** @} */
522 /**
523  *  @defgroup paEfLvl2RecordCtrlFlags  PA EgressFlow Level Two Record Control Flag Definitions
524  *  @ingroup palld_api_constants
525  *  @{
526  *
527  *  @name PA EgressFlow Level Two Record Control Flag Definitions
528  *  Bitmap definition of the ctrlFlags in @ref paEfRecLevel2_t. 
529  */ 
530 /*@{*/
532 /**
533  *  @def  pa_EF_LVL2_RECORD_CONTROL_SINGLE_IP
534  *        Flag -- 1: There is only one IP layer, i.e. there is no inner IP
535  *
536  *  @note This flag should be set in IPSEC transport mode where only one IP layer is present. 
537  */
538 #define pa_EF_LVL2_RECORD_CONTROL_SINGLE_IP                 0x0001 
539 /**
540  *  @def  pa_EF_LVL2_RECORD_CONTROL_INSERT_IPSEC_HDR_TRAIL
541  *        Flag -- 1: Format and insert IPSEC ESP/AH header and trailer into the packets
542  *                0: Use the IPSEC ESP/AH header and trailer existing in the packet
543  *
544  *  @note: The option is only valid if the outer IP header is not inserted or replaced
545  *         by this record.
546  */
547 #define pa_EF_LVL2_RECORD_CONTROL_INSERT_IPSEC_HDR_TRAIL    0x0002 
548 /**
549  *  @def  pa_EF_LVL2_RECORD_CONTROL_FLAG_TTL_DEC
550  *        Flag -- 1: Decrement TTL at the outer IP header
551  */
552 #define pa_EF_LVL2_RECORD_CONTROL_FLAG_TTL_DEC              0x0004 
553 /**
554  *  @def  pa_EF_LVL2_RECORD_CONTROL_FLAG_EXP_IP_OPTION
555  *        Flag -- 2: Detect and forward IP packet with IPv4 options or IPv6 extension headers through egress flow exception route
556  */
557 #define pa_EF_LVL2_RECORD_CONTROL_FLAG_EXP_IP_OPTION        0x0008 
558 /**
559  *  @def  pa_EF_LVL2_RECORD_CONTROL_FLAG_EXP_IP_FRAGMENT
560  *        Flag -- 1: Detect and forward fragmented IP packet through egress flow exception route
561  */
562 #define pa_EF_LVL2_RECORD_CONTROL_FLAG_EXP_IP_FRAGMENT      0x0010 
563 /**
564  *  @def  pa_EF_LVL2_RECORD_CONTROL_FLAG_EXP_IP_EXPIRE
565  *        Flag -- 1: Detect and forward expired IP packet through egress flow exception route
566  */
567 #define pa_EF_LVL2_RECORD_CONTROL_FLAG_EXP_IP_EXPIRE        0x0020 
568 /*@}*/
569 /** @} */
571 /**
572  *   @ingroup palld_api_constants
573  *   @def  pa_MAX_EF_REC_IP_HDR_LEN
574  *         The maximum IP Header Length in bytes within an egress flow level 2 record
575  */
576 #define pa_MAX_EF_REC_IP_HDR_LEN        40 
578 /**
579  *  @ingroup palld_api_structures
580  *  @brief  PA Egress Flow Level Two Record data structure
581  *
582  *  @details  The PA Egress Flow level two record is used to instruct PASS to perform outer L3 and IPSEC Processing as specified below:
583  *            - Insert/Update outer IP header
584  *              - Update payload length
585  *              - Update protocol/nextHeader if IPSEC is enabled
586  *              - Update TTL
587  *              - IPv4 header checksum calculation
588  *            - Insert/Update IPSEC ESP/AH header
589  *            - Replace/Insert IPSEC ESP Trailer
590  *            - Replace/Insert IPSEC ESP ICV
591  *            - Complete Inner IP Fragmentation from previous stage
592  *            - Outer IP fragmentation pre-processing 
593  *            
594  *            paEfRecLevel2_t defines the configuration parameters of the egress flow level two record
595  *            Since not all fields are used all the time, validBitMap is used to specify which optional field 
596  *            is used for packet modification.
597  *
598  *  @note: The egress flow level two record should be provided if outer IP is present and/or IPSEC operation is required. 
599  */
600 typedef struct  {
601   uint16_t    validBitMap;/**< Valid Bitmap corresponding to each optional field as defined at @ref paEfLvl2RecordValidBits */
602   uint16_t    ctrlBitMap; /**< Level two record control flag Bitmap as defined at @ref paEfLvl2RecordCtrlFlags */
603   uint16_t    mtu;        /**< Outer IP MTU size */
604   uint16_t    ipHdrSize;  /**< IP header size in bytes (0:Retain the outer IP header in the packet */
605   uint8_t*    ipHdr;      /**< Pointer to the IP header */     
606   paEfRecIpsecParams_t  ipsec;  /**< IPSEC related parameters */
607 } paEfRecLevel2_t;
609 /**
610  *  @defgroup paEfLvl3RecordValidBits  PA Egress Flow Level Three Record Valid Bit Definitions
611  *  @ingroup palld_api_constants
612  *  @{
613  *
614  *  @name PA Egress Flow Level Three Record Valid Bit Definitions
615  *
616  *  Bitmap definition of the validBitMap in @ref paEfRecLevel3_t. 
617  */ 
618 /*@{*/
619 /**
620  *  @def  pa_EF_LVL3_RECORD_VALID_CTRL_FLAGS
621  *        - Level three record control flags is present
622  */
623 #define pa_EF_LVL3_RECORD_VALID_CTRL_FLAGS         0x0001
624 /**
625  *  @def  pa_EF_LVL3_RECORD_VALID_IP_MTU
626  *        IP MTU is specified, perform IP fragmentation adjustment due to the extra header insertion
627  *
628  *  @note: The MTU sise should be consistent with the one at the corresponding level 2 or level 1
629  *         record. 
630  */
631 #define pa_EF_LVL3_RECORD_VALID_IP_MTU             0x0002 
632 /**
633  *  @def  pa_EF_LVL3_RECORD_VALID_IPSEC
634  *        - 1: IPSEC AH parameters are present
635  *          0: NAT-T parameters are present
636  */
637 #define pa_EF_LVL3_RECORD_VALID_IPSEC              0x0004
639 /* @} */ /* ingroup */
640 /** @} */
642 /**
643  *  @defgroup paEfLvl3RecordCtrlFlags  PA EgressFlow Level Three Record Control Flag Definitions
644  *  @ingroup palld_api_constants
645  *  @{
646  *
647  *  @name PA EgressFlow Level Three Record Control Flag Definitions
648  *  Bitmap definition of the ctrlFlags in @ref paEfRecLevel3_t. 
649  */ 
650 /*@{*/
651 /**
652  *  @def  pa_EF_LVL3_RECORD_CONTROL_REPLACE_HDR
653  *        Flag -- 1: Replace IPSEC AH or NAT-T header in the packet
654  *                0: Format and insert IPSEC AH and NAT-T header into the packet
655  */
656 #define pa_EF_LVL3_RECORD_CONTROL_REPLACE_HDR               0x0001 
657 /*@}*/
658 /** @} */
660 /**
661  *  @ingroup palld_api_structures
662  *  @brief  PA Egress Flow Level Three Record data structure
663  *
664  *  @details  The PA Egress Flow level three record is used to instruct PASS to perform IPSEC AH or IPSEC ESP NAT-T 
665  *            Processing as specified below:
666  *            - Update outer IP header
667  *              - Update payload length
668  *              - Update protocol/nextHeader
669  *              - IPv4 header checksum calculation
670  *            - Insert/Update IPSEC AH header
671  *            - Insert/Update IPSEC NAT-T UDP header
672  *            - Outer IP fragmentation pre-processing 
673  *            
674  *            paEfRecLevel3_t defines the configuration parameters of the egress flow level three record
675  *            Since not all fields are used all the time, validBitMap is used to specify which optional field 
676  *            is used for packet modification. 
677  */
678 typedef struct  {
679   uint16_t    validBitMap;/**< Valid Bitmap corresponding to each optional field as defined at @ref paEfLvl3RecordValidBits */
680   uint16_t    ctrlBitMap; /**< Level three record control flag Bitmap as defined at @ref paEfLvl3RecordCtrlFlags */
681   uint16_t    mtu;        /**< Outer IP MTU size */
682   uint16_t    srcPort;    /**< Source port number of NAT-T UDP header */
683   uint16_t    dstPort;    /**< Destination port number of NAT-T UDP header */
684   paEfRecIpsecParams_t  ipsec;  /**< IPSEC related parameters */
685 } paEfRecLevel3_t;
687 /**
688  *  @defgroup paEfLvl4RecordValidBits  PA Egress Flow Level Four Record Valid Bit Definitions
689  *  @ingroup palld_api_constants
690  *  @{
691  *
692  *  @name PA Egress Flow Level Four Record Valid Bit Definitions
693  *
694  *  Bitmap definition of the validBitMap in @ref paEfRecLevel4_t. 
695  */ 
696 /**
697  *  @def  pa_EF_LVL4_RECORD_VALID_CTRL_FLAGS
698  *        - Level four record control flags is present
699  */
700 #define pa_EF_LVL4_RECORD_VALID_CTRL_FLAGS              0x0001
702 /**
703  *  @def  pa_EF_LVL4_RECORD_VALID_802_3
704  *        - L2 is 802.3 and the length filed offset of the 802.3 header is valid
705  */
706 #define pa_EF_LVL4_RECORD_VALID_802_3                   0x0002
708 /**
709  *  @def  pa_EF_LVL4_RECORD_VALID_PPPoE
710  *        - L2 header include PPPoE and the length filed offset of PPPoE header is valid
711  */
712 #define pa_EF_LVL4_RECORD_VALID_PPPoE                   0x0004
714 /**
715  *  @def  pa_EF_LVL4_RECORD_VALID_VLAN1
716  *        - Inner VLAN (0x8100) in the packet should be replaced with the one in record
717  *          Inner VLAN (0x8100,VLAN1) should be inserted into the L2 header if it is
718  *          not in the packet.
719  */
720 #define pa_EF_LVL4_RECORD_VALID_VLAN1                   0x0008
722 /**
723  *  @def  pa_EF_LVL4_RECORD_VALID_VLAN1
724  *        - Outer VLAN (0x88a8) in the packet should be replaced with the one in record
725  *          Outer VLAN (0x88a8,VLAN2) should be inserted into the L2 header if it is
726  *          not in the packet.
727  *
728  */
729 #define pa_EF_LVL4_RECORD_VALID_VLAN2                   0x0010
731 /**
732  *  @def  pa_EF_LVL4_RECORD_VALID_MIN_PKTSIZE
733  *        - Perform tx padding check to ensure the minimum packet size as specified by minPktSize
734  */
735 #define pa_EF_LVL4_RECORD_VALID_MIN_PKTSIZE             0x0020
737 /**
738  *  @def  pa_REF_LVL4_RECORD_VALID_ROUTE_PRIORITY_TYPE
739  *        - Optional parameter priorityType when Host routing is valid
740  */
741 #define pa_REF_LVL4_RECORD_VALID_ROUTE_PRIORITY_TYPE    0x0040
743 /* @} */ /* ingroup */
744 /** @} */
746 /**
747  *  @defgroup paEfLvl4RecordCtrlFlags  PA EgressFlow Level Four Record Control Flag Definitions
748  *  @ingroup palld_api_constants
749  *  @{
750  *
751  *  @name PA EgressFlow Level Four Record Control Flag Definitions
752  *  Bitmap definition of the ctrlFlags in @ref paEfRecLevel4_t. 
753  */ 
754 /*@{*/
756 /*@}*/
757 /** @} */
759 /**
760  *   @ingroup palld_api_constants
761  *   @def  pa_MAX_EF_REC_L2_HDR_LEN
762  *         The maximum Layer 2 Header Length in bytes within an egress flow level four record
763  */
764 #define pa_MAX_EF_REC_L2_HDR_LEN        40 
766 /**
767  *  @ingroup palld_api_structures
768  *  @brief  PA Egress Flow Level Four Record data structure
769  *
770  *  @details  The PA Egress Flow level four record is used to instruct PASS to perform L2 Processing as specified below:
771  *            - Insert/Update L2 header
772  *              - Update 802.3 payload length
773  *              - Update PPPoE payload length
774  *              - Insert/update QinQ VLAN
775  *              - Insert/update VLAN
776  *            - Patch AH Header with the ICV from SA
777  *            - Outer IP Fragmentation
778  *            
779  *            paEfRecLevel4_t defines the configuration parameters of the egress flow level one record
780  *            Since not all fields are used all the time, validBitMap is used to specify which optional field 
781  *            is used for packet modification. 
782  *
783  *  @note Egress flow level four record is mandatory for all egress flows.
784  */
785 typedef struct  {
786   uint16_t    validBitMap;/**< Valid Bitmap corresponding to each optional field as defined at @ref paEfLvl4RecordValidBits */
787   uint16_t    ctrlBitMap; /**< Level four record control flag Bitmap as defined at @ref paEfLvl4RecordCtrlFlags */
788   uint16_t    lenOffsetPPPoE; /**< offset to the PPPoE header */
789   uint16_t    lenOffset802p3; /**< offset to the length field within 802.3 header */
790   uint16_t    vlan1;       /**< inner VLAN (0x8100) */
791   uint16_t    vlan2;       /**< outer VLAN (QinQ) */
792   uint16_t    l2HdrSize;   /**< L2 header size in bytes */
793   uint8_t*    l2Hdr;       /**< Pointer to the L2 header */     
794   uint8_t     minPktSize;  /**< Minimum tx packet size: tx padding of zero is required if the length of tx packet is smaller than this value */
795   uint8_t     dest;        /**< Specify egress destination (HOST, EMAC and SRIO) */
796   uint8_t     flowId;      /**< Specify the 8-bit CPPI Flow ID which instructs how the link-buffer queues are used for forwarding packets */
797   uint8_t     pktType_emacCtrl;/**<  For destination SRIO, specify the 5-bit packet type toward SRIO 
798                                      For destination HOST, EMAC, specify the EMAC control @ref emcOutputCtrlBits to the network */
799   uint32_t    swInfo0;     /**< Placed in SwInfo0 for packets to host; Placed in the PS Info for packets to SRIO*/
800   uint32_t    swInfo1;     /**< Placed in the PS Info for packets to SRIO */
801   uint16_t    queueId;     /**< Specify the 16-bit egress queue ID */
802   uint16_t    priIfType;   /**< For Host route only, specify priority-based and/or interfcae-based routing mode as
803                                 defined at @ref paRoutePriIntf_e */
804 } paEfRecLevel4_t;
806 /**
807  *  @defgroup paEfRecordCtrlFlags  PA EgressFlow Record Control Flag Definitions
808  *  @ingroup palld_api_constants
809  *  @{
810  *
811  *  @name PA Egress Flow Record Control Flag Definitions
812  *  Bitmap definition of the ctrlBitMap in @ref paEfRec_t. 
813  */ 
814 /*@{*/
815 /**
816  *  @def  pa_EF_RECORD_CONTROL_ENABLE
817  *        Flag -- 0: Enable the egress flow record
818  *                1: Disable the egress flow record 
819  */
820 #define pa_EF_RECORD_CONTROL_ENABLE                         0x0001 
821 /*@}*/
822 /** @} */
824 /**
825  *  @ingroup palld_api_constants
826  *  @brief   Define the maximum number of PASS egress flow records 
827  *
828  */
829 #define pa_MAX_EF_LVL1_RECORDS      256
830 #define pa_MAX_EF_LVL2_RECORDS      256
831 #define pa_MAX_EF_LVL3_RECORDS      256
832 #define pa_MAX_EF_LVL4_RECORDS      256
834 /**
835  * @ingroup palld_api_structures
836  * @brief PA Egress Flow Record data structure
837  *
838  * Data structure defines the configuration parameters of the egress flow record 
839  */
840 typedef struct {
841   uint16_t        index;       /**< The record index of the egress flow table of the type specified here */
842   uint16_t        type;        /**< Egress flow record type as defined at @ref paEflowRecTypes */
843   uint16_t        ctrlBitMap;  /**< Egrss flow record control flag Bitmap as defined at @ref paEfRecordCtrlFlags */
844   union {
845     paEfRecLevel1_t    level1; /**< Specify the level one record */  
846     paEfRecLevel2_t    level2; /**< Specify the level two record */  
847     paEfRecLevel3_t    level3; /**< Specify the level three record */  
848     paEfRecLevel4_t    level4; /**< Specify the level four record */  
849   } u;                         /**< Specify the configurtaion parameters of the specified record type */
850 } paEfRec_t;
852 /**
853  *  @ingroup palld_api_functions
854  *  @brief  Pa_configEflowRecords configures the egress flow records  (PASS Gen2 only)
855  *
856  *  @details  This function is used to configure multiple egress flow records. Each egress flow 
857  *            consists of up to 4-level of operations which are defined by the egress flow record 
858  *            of each level respectively.
859  *            Refer to the egress flow record defintions for detailed actions and configuration 
860  *            parameters of each record level.
861  *
862  *            Each egress flow record is created and refered to based on its record index.  
863  *            Once the record is created through a call to this function it remains effective 
864  *            until this function is called again to explicitly overwrite its content. It is not 
865  *            recommended to update a record when it is still used by one or more packet routes.  
866  *           
867  *            The recommended Egress Flow Record update procedure is as the followings:
868  *            - Step 1: Call @ref Pa_delFcHandle to remove all egress flows which invokes 
869  *                      the egress flow records to be updated and wait for the corresponding
870  *                      command acknowledge packet.
871  *            - Step 2: Remove all IP forwarding flows, which invoke the egress flow records
872  *                      to be updated, in the ingress path.
873  *            - Step 3: Wait for a short period of time such as 1us to allow the remaining 
874  *                      egress packets to pass through the PASS.
875  *            - Step 4: Call this API to re-configure the egress flow records.
876  *
877  *  @param[in]    iHandle     The driver instance handle
878  *  @param[in]    nRecords    The number of egress flow records specified
879  *  @param[out]   nRecProc    The number of egress flow records processed successfuly
880  *  @param[in]    records     Array of egress flow records
881  *  @pre                      A driver instance must be created and tables initialized
882  *
883  *  @note: This API is not supported at the first generation PASS
884  */
885 paReturn_t Pa_configEflowRecords (Pa_Handle       iHandle,
886                                   int             nRecords,
887                                   int            *nRecProc,    
888                                   paEfRec_t      *records
889                                   );
890                                   
891 /**
892  *  @defgroup paFcInfoValidBit  PA Flow Cache Matching Info Valid Bit Definitions
893  *  @ingroup palld_api_constants
894  *  @{
895  *
896  *  @name PA Flow Cache Matching Info Valid Bit Definitions
897  *  Bitmap definition of the validBitfield in paFcInfo_t. 
898  *  It allows selective Flow Cache matching parameters
899  */ 
900 /*@{*/
901 /**
902  *  @def  pa_FC_INFO_VALID_SRC_IP
903  *        srcIp is present
904  */
905 #define pa_FC_INFO_VALID_SRC_IP            0x0001 
906 /**
907  *  @def  pa_FC_INFO_VALID_SRC_IP_MASK
908  *        srcIpMask is present. This flag is valid only if srcIp is present.
909  *        If srcIp is present and this flag is clear, it means all IP address bits are valid.
910  *  @note: only IP subnet mask is supported.
911  */
912 #define pa_FC_INFO_VALID_SRC_IP_MASK       0x0002 
913 /**
914  *  @def  pa_FC_INFO_VALID_DST_IP
915  *        dstIp is present
916  */
917 #define pa_FC_INFO_VALID_DST_IP            0x0004 
918 /**
919  *  @def  pa_FC_INFO_VALID_DST_IP_MASK
920  *        dstIpMask is present. This flag is valid only if dstIp is present.
921  *        If dstIp is present and this flag is clear, it means all IP address bits are valid.
922  *  @note: only IP subnet mask is supported.
923  */
924 #define pa_FC_INFO_VALID_DST_IP_MASK       0x0008 
925 /**
926  *  @def  pa_FC_INFO_VALID_CTRL_FLAG
927  *        ctrlFlag and ctrlFlagMask are present
928  */
929 #define pa_FC_INFO_VALID_CTRL_FLAG         0x0010
930 /**
931  *  @def  pa_FC_INFO_VALID_PROTO
932  *        proto is present
933  */
934 #define pa_FC_INFO_VALID_PROTO             0x0020 
935 /**
936  *  @def  pa_FC_INFO_VALID_DSCP
937  *        dscp is present
938  */
939 #define pa_FC_INFO_VALID_DSCP              0x0040 
940 /**
941  *  @def  pa_FC_INFO_VALID_SRC_PORT
942  *        srcPortBegin and srcPortEnd  are present 
943  */
944 #define pa_FC_INFO_VALID_SRC_PORT          0x0100 
945 /**
946  *  @def  pa_FC_INFO_VALID_DST_PORT
947  *        dstPortBegin and dstPortEnd are present 
948  */
949 #define pa_FC_INFO_VALID_DST_PORT          0x0200 
951 /*@}*/
952 /** @} */
954 /**
955  *  @defgroup paFcInfoCtrlFlags  PA Flow Cache Info Control Flag Definitions
956  *  @ingroup palld_api_constants
957  *  @{
958  *
959  *  @name PA Flow Cache Info Control Flag Definitions
960  *  Bitmap definition of the ctrlFlags and ctrlFlagsMask in @ref paFcInfo_t. 
961  */ 
962 /*@{*/
963 /**
964  *  @def  pa_FC_INFO_CONTROL_FLAG_FRAG
965  *        Flag -- 1: IP fragments 
966  */
967 #define pa_FC_INFO_CONTROL_FLAG_FRAG           0x0001 
968 /**
969  *  @def  pa_FC_INFO_CONTROL_FLAG_CONTAIN_L4
970  *        Flag -- 1: Packet or fragment which conatins L4 header 
971  */
972 #define pa_FC_INFO_CONTROL_FLAG_CONTAIN_L4     0x0002 
973 /*@}*/
974 /** @} */
976 /**
977  *  @ingroup palld_api_structures
978  *  @brief  Flow cache lookup information
979  *
980  *  @details  paFcInfo_t is used to specifiy the Flow cache matching parameters.
981  */
982 typedef struct  {
983   uint16_t    validBitMap;  /**< Specify valid parameters as defined at @ref paFcInfoValidBit */
984   uint16_t    ctrlFlag;     /**< Specify Flow Cache control flags as defined at @ref paFcInfoCtrlFlags */
985   uint16_t    ctrlFlagMask; /**< Flow Cache control flag valid masks */
986   uint16_t    ipType;       /**< @ref IpValues */
987   paIpAddr_t  srcIp;        /**< Source IP address */
988   paIpAddr_t  srcIpMask;    /**< Source IP subnet mask*/
989   paIpAddr_t  dstIp;        /**< Destination IP address */
990   paIpAddr_t  dstIpMask;    /**< Destination IP subnet mask */
991   uint8_t     proto;        /**< IP Protocol (IPv4) / Next Header (IPv6) */
992   uint8_t     dscp;         /**< DSCP value */
993   uint16_t    srcPortBegin; /**< Minimum Source Port Number */
994   uint16_t    srcPortEnd;   /**< Maximum Source Port Number */
995   uint16_t    dstPortBegin; /**< Minimum Destinatio Port Number */
996   uint16_t    dstPortEnd;   /**< Maximum Destinatio Port Number */
997 } paFcInfo_t;
999 /**
1000  * @ingroup palld_api_structures
1001  * @brief PA Flow Cache Entry Statistics Structure
1002  *
1003  * @details This structures define the PA Flow Cache per-entry statistics provided 
1004  *          with API function @ref Pa_queryFcStats ().
1005  */
1007 typedef struct paFcStats_s  {
1008   uint32_t   nMatchPackets;     /**< Number of packets which matchs the ACL rule */
1009 } paFcStats_t;
1011 /**
1012  *   @ingroup palld_api_functions
1013  *   @brief  Pa_addFc adds a Flow Cache entry to the Flow Cache table  (PASS Gen2 only)
1014  *
1015  *   @details  This function is used to add or replace an entry in the Flow Cache table.
1016  *             A new entry is added if the Flow Cache configuration does not match the value of any existing entry
1017  *             in the module handle table. If the Flow Cache configuration is same of an existing entry then the 
1018  *             egress flow operation information for the existing entry is changed to the values provided with the 
1019  *             input parameter efOpInfo.
1020  *
1021  *             The caller can also force the existing entry to be replaced by the new one by passing the handle of
1022  *             the existing entry through retHandle. 
1023  *
1024  *             On return the command buffer (cmd) contains a formatted command for the sub-system. The
1025  *             destination for the command is provided in cmdDest. The module user must send the formatted
1026  *             command to the sub-system. The sub-system will generate a reply and this reply must be
1027  *             sent back to this module through the API @ref Pa_forwardResult.
1028  *
1029  *             The flow cache entry should be deleted by invoking API @ref Pa_delFcHandle.
1030  *             @note The existing entry can not be replaced when it is still at pending response state. The return code
1031  *                   pa_INVALID_DUP_ENTRY or pa_PENDING_FC_ENTRY will be used in this case. 
1032  *
1033  *   @param[in]    iHandle     The driver instance handle
1034  *   @param[in]    index       Specify the index of the LUT1 entry (0-63). Set to pa_LUT1_INDEX_NOT_SPECIFIED if not specified
1035  *   @param[in]    efOpInfo    Specify egress flow operation per match as @ref paEfOpInfo_t
1036  *   @param[in]    fcInfo      Value @ref paFcInfo_t
1037  *   @param[out]   retHandle   Pointer to the returned FC handle
1038  *   @param[out]   cmd         Buffer where the PASS command is created
1039  *   @param[in]    cmdSize     The size of the cmd buffer
1040  *   @param[in]    reply       Where the response to the PASS command is routed
1041  *   @param[out]   cmdDest     Value (@ref cmdTxDest)
1042  *   @retval                   Value (@ref ReturnValues)
1043  *   @pre                      A driver instance must be created and tables initialized
1044  *
1045  *  @note: This API is not supported at the first generation PASS
1046  */
1047 paReturn_t  Pa_addFc   (Pa_Handle         iHandle,
1048                         int               index,
1049                         paEfOpInfo_t      *efOpInfo,
1050                         paFcInfo_t        *fcInfo,
1051                         paHandleFc_t      *retHandle,
1052                         paCmd_t           cmd,
1053                         uint16_t          *cmdSize,
1054                         paCmdReply_t      *reply,
1055                         int               *cmdDest );
1056                         
1057 /**
1058  *   @ingroup palld_api_functions
1059  *   @brief  Pa_delFcHandle deletes a Flow Cache handle (PASS Gen2 only)
1060  *
1061  *   @details  This function is used to remove an entry from the LUT1-FC lookup table
1062  *
1063  *   @param[in]     iHandle     The driver instance handle
1064  *   @param[in]     handle      Pointer to the FC handle to delete
1065  *   @param[out]    cmd         Where the created command is placed
1066  *   @param[in]     cmdSize     The size of the cmd buffer
1067  *   @param[in]     reply       Where the sub-system sends the command reply
1068  *   @param[out]    cmdDest     Value (@ref cmdTxDest)
1069  *   @retval                    Value (@ref ReturnValues)
1070  *   @pre                       A driver instance must be created and tables initialized
1071  *
1072  *  @note: This API is not supported at the first generation PASS
1073  */
1074 paReturn_t Pa_delFcHandle (Pa_Handle       iHandle,
1075                            paHandleFc_t    *handle, 
1076                            paCmd_t         cmd,
1077                            uint16_t        *cmdSize,
1078                            paCmdReply_t    *reply,
1079                            int             *cmdDest );
1080                            
1081 /**
1082  *  @ingroup palld_api_functions
1083  *  @brief  Pa_queryFcStats queries Flow Cache per-entry statistics (PASS Gen2 only)
1084  *
1085  *  @details  This function is used to query the Flow Cache per-entry statistics. 
1086  *            The statistics can be optionally cleared after reading through the doClear parameter.
1087  *
1088  *  @param[in]    iHandle    The driver instance handle
1089  *  @param[in]    fcHandle   The FC handle
1090  *  @param[in]    doClear    If TRUE then stats are cleared after being read
1091  *  @param[out]   pFcStats   Pointer to the FcStats buffer
1092  *  @retval                  Value (@ref ReturnValues)
1093  *  @pre                     A driver instance must be created and tables initialized
1094  *
1095  *  @note: This API is not supported at the first generation PASS
1096  */
1097 paReturn_t Pa_queryFcStats (Pa_Handle     iHandle,
1098                             paHandleFc_t  fcHandle,
1099                             uint16_t      doClear, 
1100                             paFcStats_t   *pFcStats);
1101                            
1102                         
1104 #ifdef __cplusplus
1106 #endif
1107   
1109 #endif  /* _PA_FC_H */
1111