/* SPDX-License-Identifier: BSD-3-Clause
 * Copyright 2008-2012 Freescale Semiconductor Inc.
 * Copyright 2017-2020 NXP
 */

#ifndef __FM_PCD_EXT_H
#define __FM_PCD_EXT_H

#include "ncsw_ext.h"
#include "net_ext.h"
#include "fm_ext.h"

/*
 * @Description	  FM PCD ...
 * @Group	  lnx_ioctl_FM_grp Frame Manager Linux IOCTL API
 * @Description	  Frame Manager Linux ioctls definitions and enums
 * @{
 */

/*
 * @Group	  lnx_ioctl_FM_PCD_grp FM PCD
 * @Description	  Frame Manager PCD API functions, definitions and enums
 *
 *		  The FM PCD module is responsible for the initialization of all
 *		  global classifying FM modules. This includes the parser
 *		  general and common registers, the key generator global and
 *		  common registers, and the policer global and common registers.
 *		  In addition, the FM PCD SW module will initialize all required
 *		  key generator schemes, coarse classification flows, and
 *		  policer profiles. When an FM module is configured to work with
 *		  one of these entities, it will register to it using the FM
 *		  PORT API. The PCD module will manage the PCD resources - i.e.
 *		  resource management of KeyGen schemes, etc.
 *
 * @{
 */

/*
 * @Collection	General PCD defines
 */
#define IOC_FM_PCD_MAX_NUM_OF_PRIVATE_HDRS		2
/**< Number of units/headers saved for user */

#define IOC_FM_PCD_PRS_NUM_OF_HDRS			16
/**< Number of headers supported by HW parser */
#define IOC_FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS \
	(32 - IOC_FM_PCD_MAX_NUM_OF_PRIVATE_HDRS)
/**< Number of distinction units is limited by register size (32 bits) minus
 * reserved bits for private headers.
 */
#define IOC_FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS	4
/**< Maximum number of interchangeable headers in a distinction unit */
#define IOC_FM_PCD_KG_NUM_OF_GENERIC_REGS		8
/**< Total number of generic KeyGen registers */
#define IOC_FM_PCD_KG_MAX_EXTRACTS_PER_KEY	35
/**< Max number allowed on any configuration; For HW implementation reasons,
 * in most cases less than this will be allowed; The driver will return an
 * initialization error if resource is unavailable.
 */
#define IOC_FM_PCD_KG_NUM_OF_EXTRACT_MASKS		4
/**< Total number of masks allowed on KeyGen extractions. */
#define IOC_FM_PCD_KG_NUM_OF_DEFAULT_GROUPS		16
/**< Number of default value logical groups */
#define IOC_FM_PCD_PRS_NUM_OF_LABELS			32
/**< Maximum number of SW parser labels */
#define IOC_FM_PCD_SW_PRS_SIZE			0x00000800
/**< Total size of SW parser area */

#define IOC_FM_PCD_MAX_MANIP_INSRT_TEMPLATE_SIZE	128
/**< Maximum size of insertion template for insert manipulation */

#define IOC_FM_PCD_FRM_REPLIC_MAX_NUM_OF_ENTRIES	64
/**< Maximum possible entries for frame replicator group */
/* @} */

/*
 * @Group	  lnx_ioctl_FM_PCD_init_grp FM PCD Initialization Unit
 *
 * @Description   Frame Manager PCD Initialization Unit API
 *
 * @{
 */

/*
 * @Description   PCD counters
 *		  (must match enum ioc_fm_pcd_counters defined in fm_pcd_ext.h)
 */
typedef enum ioc_fm_pcd_counters {
	e_IOC_FM_PCD_KG_COUNTERS_TOTAL,		/**< KeyGen counter */
	e_IOC_FM_PCD_PLCR_COUNTERS_RED,
	/**< Policer counter - counts the total number of RED packets that exit
	 * the Policer.
	 */
	e_IOC_FM_PCD_PLCR_COUNTERS_YELLOW,
	/**< Policer counter - counts the total number of YELLOW packets that
	 * exit the Policer.
	 */
	e_IOC_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED,
	/**< Policer counter - counts the number of packets that changed color
	 * to RED by the Policer; This is a subset of
	 * e_IOC_FM_PCD_PLCR_COUNTERS_RED packet count, indicating active color
	 * changes.
	 */
	e_IOC_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW,
	/**< Policer counter - counts the number of packets that changed color
	 * to YELLOW by the Policer; This is a subset of
	 * e_IOC_FM_PCD_PLCR_COUNTERS_YELLOW packet count, indicating active
	 * color changes.
	 */
	e_IOC_FM_PCD_PLCR_COUNTERS_TOTAL,
	/**< Policer counter - counts the total number of packets passed in the
	 * Policer.
	 */
	e_IOC_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH,
	/**< Policer counter - counts the number of packets with length
	 * mismatch.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH,
	/**< Parser counter - counts the number of times the parser block is
	 * dispatched.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED,
	/**< Parser counter - counts the number of times L2 parse result is
	 * returned (including errors).
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED,
	/**< Parser counter - counts the number of times L3 parse result is
	 * returned (including errors).
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED,
	/**< Parser counter - counts the number of times L4 parse result is
	 * returned (including errors).
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED,
	/**< Parser counter - counts the number of times SHIM parse result is
	 * returned (including errors).
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR,
	/**< Parser counter - counts the number of times L2 parse result is
	 * returned with errors.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR,
	/**< Parser counter - counts the number of times L3 parse result is
	 * returned with errors.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR,
	/**< Parser counter - counts the number of times L4 parse result is
	 * returned with errors.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR,
	/**< Parser counter - counts the number of times SHIM parse result is
	 * returned with errors.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES,
	/**< Parser counter - counts the number of cycles spent executing soft
	 * parser instruction (including stall cycles).
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES,
	/**< Parser counter - counts the number of cycles stalled waiting for
	 * parser internal memory reads while executing soft parser instruction.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES,
	/**< Parser counter - counts the number of cycles spent executing hard
	 * parser (including stall cycles).
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES,
	/**< MURAM counter - counts the number of cycles while performing FMan
	 * Memory read.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES,
	/**< MURAM counter - counts the number of cycles stalled while
	 * performing FMan Memory read.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES,
	/**< MURAM counter - counts the number of cycles while performing FMan
	 * Memory write.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES,
	/**< MURAM counter - counts the number of cycles stalled while
	 * performing FMan Memory write.
	 */
	e_IOC_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES
	/**< FPM counter - counts the number of cycles stalled while performing
	 * a FPM Command.
	 */
} ioc_fm_pcd_counters;

/*
 * @Description   PCD interrupts
 *		  (must match enum ioc_fm_pcd_exceptions defined in
 *		  fm_pcd_ext.h)
 */
typedef enum ioc_fm_pcd_exceptions {
	e_IOC_FM_PCD_KG_EXCEPTION_DOUBLE_ECC,
	/**< KeyGen double-bit ECC error is detected on internal memory read
	 * access.
	 */
	e_IOC_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW,
	/**< KeyGen scheme configuration error indicating a key size larger than
	 * 56 bytes.
	 */
	e_IOC_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC,
	/**< Policer double-bit ECC error has been detected on PRAM read access.
	 */
	e_IOC_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR,
	/**< Policer access to a non-initialized profile has been detected. */
	e_IOC_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE,
	/**< Policer RAM self-initialization complete */
	e_IOC_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE,
	/**< Policer atomic action complete */
	e_IOC_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC,
	/**< Parser double-bit ECC error */
	e_IOC_FM_PCD_PRS_EXCEPTION_SINGLE_ECC
	/**< Parser single-bit ECC error */
} ioc_fm_pcd_exceptions;

/** @} */ /* end of lnx_ioctl_FM_PCD_init_grp group */

/*
 * @Group	  lnx_ioctl_FM_PCD_Runtime_grp FM PCD Runtime Unit
 *
 * @Description   Frame Manager PCD Runtime Unit
 *
 *		  The runtime control allows creation of PCD infrastructure
 *		  modules such as Network Environment Characteristics,
 *		  Classification Plan Groups and Coarse Classification Trees.
 *		  It also allows on-the-fly initialization, modification and
 *		  removal of PCD modules such as KeyGen schemes, coarse
 *		  classification nodes and Policer profiles.
 *
 *		  In order to explain the programming model of the PCD driver
 *		  interface a few terms should be explained, and will be used
 *		  below.
 *		  - Distinction Header - One of the 16 protocols supported by
 *		    the FM parser, or one of the SHIM headers (1 or 2). May be a
 *		    header with a special option (see below).
 *		  - Interchangeable Headers Group - This is a group of Headers
 *		    recognized by either one of them. For example, if in a
 *		    specific context the user chooses to treat IPv4 and IPV6 in
 *		    the same way, they may create an interchangeable Headers
 *		    Unit consisting of these 2 headers.
 *		  - A Distinction Unit - a Distinction Header or an
 *		    Interchangeable Headers Group.
 *		  - Header with special option - applies to Ethernet, MPLS,
 *		    VLAN, IPv4 and IPv6, includes multicast, broadcast and other
 *		    protocol specific options. In terms of hardware it relates
 *		    to the options available in the classification plan.
 *		  - Network Environment Characteristics - a set of Distinction
 *		    Units that define the total recognizable header selection
 *		    for a certain environment. This is NOT the list of all
 *		    headers that will ever appear in a flow, but rather
 *		    everything that needs distinction in a flow, where
 *		    distinction is made by KeyGen schemes and coarse
 *		    classification action descriptors.
 *
 *		  The PCD runtime modules initialization is done in stages. The
 *		  first stage after initializing the PCD module itself is to
 *		  establish a Network Flows Environment Definition. The
 *		  application may choose to establish one or more such
 *		  environments. Later, when needed, the application will have to
 *		  state, for some of its modules, to which single environment it
 *		  belongs.
 *
 * @{
 */

/*
 * @Description   structure for FM counters
 */
typedef struct ioc_fm_pcd_counters_params_t {
	ioc_fm_pcd_counters cnt;	/**< The requested counter */
	uint32_t	val;
			/**< The requested value to get/set from/into the
			 * counter
			 */
} ioc_fm_pcd_counters_params_t;

/*
 * @Description   structure for FM exception definitions
 */
typedef struct ioc_fm_pcd_exception_params_t {
	ioc_fm_pcd_exceptions exception;	/**< The requested exception */
	bool		enable;
			/**< TRUE to enable interrupt, FALSE to mask it. */
} ioc_fm_pcd_exception_params_t;

/*
 * @Description   A structure for SW parser labels (must be identical to struct
 *		  t_fm_pcd_prs_label_params defined in fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_prs_label_params_t {
	uint32_t instruction_offset;
		/**< SW parser label instruction offset (2 bytes resolution),
		 * relative to Parser RAM
		 */
	ioc_net_header_type	hdr;
		/**< The existence of this header will invoke the SW parser
		 * code.
		 */
	uint8_t	index_per_hdr;
		/**< Normally 0, if more than one SW parser attachments for the
		 * same header, use this index to distinguish between them.
		 */
} ioc_fm_pcd_prs_label_params_t;

/*
 * @Description   A structure for SW parser (Must match struct
 *		  ioc_fm_pcd_prs_sw_params_t defined in fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_prs_sw_params_t {
	bool		override;
			/**< FALSE to invoke a check that nothing else was
			 * loaded to this address, including internal patches.
			 * TRUE to override any existing code.
			 */
	uint32_t	size;		/**< SW parser code size */
	uint16_t	base;
			/**< SW parser base (in instruction counts! must be
			 * larger than 0x20)
			 */
	uint8_t		*p_code;	/**< SW parser code */
	uint32_t	sw_prs_data_params[IOC_FM_PCD_PRS_NUM_OF_HDRS];
					/**< SW parser data (parameters) */
	uint8_t		num_of_labels;	/**< Number of labels for SW parser. */
	ioc_fm_pcd_prs_label_params_t
			labels_table[IOC_FM_PCD_PRS_NUM_OF_LABELS];
			/**< SW parser labels table, containing num_of_labels
			 * entries
			 */
} ioc_fm_pcd_prs_sw_params_t;

/*
 * @Description   A structure to set the a KeyGen default value
 */
typedef struct ioc_fm_pcd_kg_dflt_value_params_t {
	uint8_t		value_id;/**< 0,1 - one of 2 global default values */
	uint32_t	value;	/**< The requested default value */
} ioc_fm_pcd_kg_dflt_value_params_t;

/*
 * @Function	  fm_pcd_enable
 *
 * @Description   This routine should be called after PCD is initialized for
 *		  enabling all PCD engines according to their existing
 *		  configuration.
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only when PCD is disabled.
 */
#define FM_PCD_IOC_ENABLE  _IO(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(1))

/*
 * @Function	  fm_pcd_disable
 *
 * @Description   This routine may be called when PCD is enabled in order to
 *		  disable all PCD engines. It may be called only when none of
 *		  the ports in the system are using the PCD.
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only when PCD is enabled.
 */
#define FM_PCD_IOC_DISABLE  _IO(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(2))

/*
 * @Function	  fm_pcd_prs_load_sw
 *
 * @Description   This routine may be called only when all ports in the
 *		  system are actively using the classification plan scheme.
 *		  In such cases it is recommended in order to save resources.
 *		  The driver automatically saves 8 classification plans for
 *		  ports that do NOT use the classification plan mechanism, to
 *		  avoid this (in order to save those entries) this routine may
 *		  be called.
 *
 * @Param[in]	  ioc_fm_pcd_prs_sw_params_t
 *		  A pointer to the image of the software parser code.
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only when PCD is disabled.
 */
#define FM_PCD_IOC_PRS_LOAD_SW \
	_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(3), ioc_fm_pcd_prs_sw_params_t)

/*
 * @Function	  fm_pcd_kg_set_dflt_value
 *
 * @Description   Calling this routine sets a global default value to be used
 *		  by the KeyGen when parser does not recognize a required
 *		  field/header.
 *		  default value is 0.
 *
 * @Param[in]	  ioc_fm_pcd_kg_dflt_value_params_t	A pointer to a structure
 *							with the relevant
 *							parameters
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only when PCD is disabled.
 */
#define FM_PCD_IOC_KG_SET_DFLT_VALUE \
	_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(6), \
	     ioc_fm_pcd_kg_dflt_value_params_t)

/*
 * @Function	  fm_pcd_kg_set_additional_data_after_parsing
 *
 * @Description   Calling this routine allows the keygen to access data past
 *		  the parser finishing point.
 *
 * @Param[in]	  uint8_t	payload-offset; the number of bytes beyond the
 *				parser location.
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only when PCD is disabled.
 */
#define FM_PCD_IOC_KG_SET_ADDITIONAL_DATA_AFTER_PARSING \
	_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(7), uint8_t)

/*
 * @Function	  fm_pcd_set_exception
 *
 * @Description   Calling this routine enables/disables PCD interrupts.
 *
 * @Param[in]	  ioc_fm_pcd_exception_params_t
 *		  Arguments struct with exception to be enabled/disabled.
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_SET_EXCEPTION \
	_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(8), ioc_fm_pcd_exception_params_t)

/*
 * @Function	  fm_pcd_get_counter
 *
 * @Description   Reads one of the FM PCD counters.
 *
 * @Param[in,out] ioc_fm_pcd_counters_params_t The requested counter parameters.
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  It is user's responsibility to call this routine only
 *		  for enabled counters, and there will be no indication if a
 *		  disabled counter is accessed.
 */
#define FM_PCD_IOC_GET_COUNTER \
	_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(9), ioc_fm_pcd_counters_params_t)

/*
 * @Function	  fm_pcd_kg_scheme_get_counter
 *
 * @Description   Reads scheme packet counter.
 *
 * @Param[in]	  h_scheme	scheme handle as returned by
 *				fm_pcd_kg_scheme_set().
 *
 * @Return	  Counter's current value.
 *
 * @Cautions	  Allowed only following fm_pcd_init() & fm_pcd_kg_scheme_set().
 */
#define FM_PCD_IOC_KG_SCHEME_GET_CNTR \
	_IOR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(4), ioc_fm_pcd_kg_scheme_spc_t)

/*
 * @Function	  FM_PCD_ForceIntr
 *
 * @Description   Causes an interrupt event on the requested source.
 *
 * @Param[in]	  ioc_fm_pcd_exceptions - An exception to be forced.
 *
 * @Return	  0 on success; error code if the exception is not enabled,
 *		  or is not able to create interrupt.
 */
#define FM_PCD_IOC_FORCE_INTR \
	_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(11), ioc_fm_pcd_exceptions)

/*
 * @Collection	Definitions of coarse classification parameters as required by
 *		KeyGen (when coarse classification is the next engine after this
 *		scheme).
 */
#define IOC_FM_PCD_MAX_NUM_OF_CC_TREES		8
#define IOC_FM_PCD_MAX_NUM_OF_CC_GROUPS		16
#define IOC_FM_PCD_MAX_NUM_OF_CC_UNITS		4
#define IOC_FM_PCD_MAX_NUM_OF_KEYS		256
#define IOC_FM_PCD_MAX_NUM_OF_FLOWS		(4 * KILOBYTE)
#define IOC_FM_PCD_MAX_SIZE_OF_KEY		56
#define IOC_FM_PCD_MAX_CC_ENTRY_IN_GRP		16
#define IOC_FM_PCD_LAST_KEY_INDEX		0xffff
#define IOC_FM_PCD_MANIP_DSCP_VALUES		64
/* @} */

/*
 * @Collection	A set of definitions to allow protocol
 *		special option description.
 */
typedef uint32_t		ioc_protocol_opt_t;
		/**< A general type to define a protocol option. */

typedef ioc_protocol_opt_t  ioc_eth_protocol_opt_t;
			/**< Ethernet protocol options. */
#define IOC_ETH_BROADCAST		0x80000000   /**< Ethernet Broadcast. */
#define IOC_ETH_MULTICAST		0x40000000   /**< Ethernet Multicast. */

typedef ioc_protocol_opt_t  ioc_vlan_protocol_opt_t;
				/**< Vlan protocol options. */
#define IOC_VLAN_STACKED		0x20000000   /**< Stacked VLAN. */

typedef ioc_protocol_opt_t  ioc_mpls_protocol_opt_t;
				/**< MPLS protocol options. */
#define IOC_MPLS_STACKED		0x10000000   /**< Stacked MPLS. */

typedef ioc_protocol_opt_t  ioc_ipv4_protocol_opt_t;
			/**< IPv4 protocol options. */
#define IOC_IPV4_BROADCAST_1		0x08000000   /**< IPv4 Broadcast. */
#define IOC_IPV4_MULTICAST_1		0x04000000   /**< IPv4 Multicast. */
#define IOC_IPV4_UNICAST_2		0x02000000
					/**< Tunneled IPv4 - Unicast.
					 */
#define IOC_IPV4_MULTICAST_BROADCAST_2  0x01000000
					/**< Tunneled IPv4 -
					 * Broadcast/Multicast.
					 */

#define IOC_IPV4_FRAG_1		0x00000008
				/**< IPV4 reassembly option. IPV4
				 * Reassembly manipulation requires network
				 * environment with IPV4 header and IPV4_FRAG_1
				 * option
				 */

typedef ioc_protocol_opt_t  ioc_ipv6_protocol_opt_t;
					/**< IPv6 protocol options. */
#define IOC_IPV6_MULTICAST_1		0x00800000   /**< IPv6 Multicast. */
#define IOC_IPV6_UNICAST_2		0x00400000
					/**< Tunneled IPv6 - Unicast. */
#define IOC_IPV6_MULTICAST_2		0x00200000
					/**< Tunneled IPv6 - Multicast. */

#define IOC_IPV6_FRAG_1		0x00000004
				/**< IPV6 reassembly option. IPV6 Reassembly
				 * manipulation requires network environment
				 * with IPV6 header and IPV6_FRAG_1 option
				 */
typedef ioc_protocol_opt_t   ioc_capwap_protocol_opt_t;
					/**< CAPWAP protocol options. */
#define CAPWAP_FRAG_1		0x00000008
				/**< CAPWAP reassembly option. CAPWAP Reassembly
				 * manipulation requires network environment
				 * with CAPWAP header and CAPWAP_FRAG_1 option;
				 * in case where fragment found, the
				 * fragment-extension offset may be found at
				 * 'shim2' (in parser-result).
				 */

/* @} */

#define IOC_FM_PCD_MANIP_MAX_HDR_SIZE		256
#define IOC_FM_PCD_MANIP_DSCP_TO_VLAN_TRANS	64
/**
 * @Collection	A set of definitions to support Header Manipulation selection.
 */
typedef uint32_t			ioc_hdr_manip_flags_t;
	/**< A general type to define a HMan update command flags. */

typedef ioc_hdr_manip_flags_t	ioc_ipv4_hdr_manip_update_flags_t;
	/**< IPv4 protocol HMan update command flags. */

#define IOC_HDR_MANIP_IPV4_TOS	0x80000000
			/**< update TOS with the given value ('tos' field of
			 * ioc_fm_pcd_manip_hdr_field_update_ipv4_t)
			 */
#define IOC_HDR_MANIP_IPV4_ID	0x40000000
			/**< update IP ID with the given value ('id' field of
			 * ioc_fm_pcd_manip_hdr_field_update_ipv4_t)
			 */
#define IOC_HDR_MANIP_IPV4_TTL	0x20000000	/**< Decrement TTL by 1 */
#define IOC_HDR_MANIP_IPV4_SRC	0x10000000
		/**< update IP source address with the given value ('src' field
		 * of ioc_fm_pcd_manip_hdr_field_update_ipv4_t)
		 */
#define IOC_HDR_MANIP_IPV4_DST	0x08000000
		/**< update IP destination address with the given value
		 * ('dst' field of ioc_fm_pcd_manip_hdr_field_update_ipv4_t)
		 */

typedef ioc_hdr_manip_flags_t	ioc_ipv6_hdr_manip_update_flags_t;
			/**< IPv6 protocol HMan update command flags. */

#define IOC_HDR_MANIP_IPV6_TC	0x80000000
	/**< update Traffic Class address with the given value ('traffic_class'
	 * field of ioc_fm_pcd_manip_hdr_field_update_ipv6_t)
	 */
#define IOC_HDR_MANIP_IPV6_HL	0x40000000	/**< Decrement Hop Limit by 1 */
#define IOC_HDR_MANIP_IPV6_SRC	0x20000000
		/**< update IP source address with the given value ('src' field
		 * of ioc_fm_pcd_manip_hdr_field_update_ipv6_t)
		 */
#define IOC_HDR_MANIP_IPV6_DST	0x10000000
		/**< update IP destination address with the given value ('dst'
		 * field of ioc_fm_pcd_manip_hdr_field_update_ipv6_t)
		 */

typedef ioc_hdr_manip_flags_t	ioc_tcp_udp_hdr_manip_update_flags_t;
		/**< TCP/UDP protocol HMan update command flags. */

#define IOC_HDR_MANIP_TCP_UDP_SRC	0x80000000
		/**< update TCP/UDP source address with the given value
		 * ('src' field of ioc_fm_pcd_manip_hdr_field_update_tcp_udp_t)
		 */
#define IOC_HDR_MANIP_TCP_UDP_DST	0x40000000
		/**< update TCP/UDP destination address with the given value
		 * ('dst' field of ioc_fm_pcd_manip_hdr_field_update_tcp_udp_t)
		 */
#define IOC_HDR_MANIP_TCP_UDP_CHECKSUM  0x20000000
		/**< update TCP/UDP checksum */

/* @} */

/*
 * @Description   A type used for returning the order of the key extraction.
 *		  each value in this array represents the index of the
 *		  extraction command as defined by the user in the
 *		  initialization extraction array. The valid size of this array
 *		  is the user define number of extractions required (also
 *		  marked by the second '0' in this array).
 */
typedef	uint8_t
	ioc_fm_pcd_kg_key_order_t [IOC_FM_PCD_KG_MAX_EXTRACTS_PER_KEY];

/*
 *@Description   All PCD engines
 *		(must match enum e_FmPcdEngine defined in fm_pcd_ext.h)
 */

typedef enum ioc_fm_pcd_engine {
	e_IOC_FM_PCD_INVALID = 0,   /**< Invalid PCD engine */
	e_IOC_FM_PCD_DONE,	/**< No PCD Engine indicated */
	e_IOC_FM_PCD_KG,		/**< KeyGen */
	e_IOC_FM_PCD_CC,		/**< Coarse Classifier */
	e_IOC_FM_PCD_PLCR,	/**< Policer */
	e_IOC_FM_PCD_PRS,	/**< Parser */
	e_IOC_FM_PCD_FR,	/**< Frame Replicator */
	e_IOC_FM_PCD_HASH	/**< Hash Table */
} ioc_fm_pcd_engine;

/*
 * @Description   An enum for selecting extraction by header types
 *		  (Must match enum e_FmPcdExtractByHdrType defined in
 *		  fm_pcd_ext.h)
 */
typedef enum ioc_fm_pcd_extract_by_hdr_type {
	e_IOC_FM_PCD_EXTRACT_FROM_HDR,	/**< Extract bytes from header */
	e_IOC_FM_PCD_EXTRACT_FROM_FIELD,/**< Extract bytes from header field */
	e_IOC_FM_PCD_EXTRACT_FULL_FIELD	/**< Extract a full field */
} ioc_fm_pcd_extract_by_hdr_type;

/*
 * @Description   An enum for selecting extraction source (when it is not the
 *		  header) (Must match enum e_FmPcdExtractFrom defined in
 *		  fm_pcd_ext.h)
 */
typedef enum ioc_fm_pcd_extract_from {
	e_IOC_FM_PCD_EXTRACT_FROM_FRAME_START,
			/**< KG & CC: Extract from beginning of frame */
	e_IOC_FM_PCD_EXTRACT_FROM_DFLT_VALUE,
				/**< KG only: Extract from a default value */
	e_IOC_FM_PCD_EXTRACT_FROM_CURR_END_OF_PARSE,
			/**< KG only: Extract from the point where parsing had
			 * finished
			 */
	e_IOC_FM_PCD_EXTRACT_FROM_KEY,	/**< CC only: Field where saved KEY */
	e_IOC_FM_PCD_EXTRACT_FROM_HASH,	/**< CC only: Field where saved HASH */
	e_IOC_FM_PCD_EXTRACT_FROM_PARSE_RESULT,
				/**< KG & CC: Extract from the parser result */
	e_IOC_FM_PCD_EXTRACT_FROM_ENQ_FQID,
				/**< KG & CC: Extract from enqueue FQID */
	e_IOC_FM_PCD_EXTRACT_FROM_FLOW_ID
				/**< CC only: Field where saved Dequeue FQID */
} ioc_fm_pcd_extract_from;

/*
 * @Description   An enum for selecting extraction type
 */
typedef enum ioc_fm_pcd_extract_type {
	e_IOC_FM_PCD_EXTRACT_BY_HDR,	/**< Extract according to header */
	e_IOC_FM_PCD_EXTRACT_NON_HDR,
		/**< Extract from data that is not the header */
	e_IOC_FM_PCD_KG_EXTRACT_PORT_PRIVATE_INFO
			/**< Extract private info as specified by user */
} ioc_fm_pcd_extract_type;

/*
 * @Description   An enum for selecting a default
 */
typedef enum ioc_fm_pcd_kg_extract_dflt_select {
	e_IOC_FM_PCD_KG_DFLT_GBL_0,
		/**< Default selection is KG register 0 */
	e_IOC_FM_PCD_KG_DFLT_GBL_1,
		/**< Default selection is KG register 1 */
	e_IOC_FM_PCD_KG_DFLT_PRIVATE_0,
		/**< Default selection is a per scheme register 0 */
	e_IOC_FM_PCD_KG_DFLT_PRIVATE_1,
		/**< Default selection is a per scheme register 1 */
	e_IOC_FM_PCD_KG_DFLT_ILLEGAL	/**< Illegal selection */
} ioc_fm_pcd_kg_extract_dflt_select;

/*
 * @Description   Enumeration type defining all default groups - each group
 *		  shares a default value, one of four user-initialized values.
 */
typedef enum ioc_fm_pcd_kg_known_fields_dflt_types {
	e_IOC_FM_PCD_KG_MAC_ADDR,		/**< MAC Address */
	e_IOC_FM_PCD_KG_TCI,			/**< TCI field */
	e_IOC_FM_PCD_KG_ENET_TYPE,		/**< ENET Type */
	e_IOC_FM_PCD_KG_PPP_SESSION_ID,		/**< PPP Session id */
	e_IOC_FM_PCD_KG_PPP_PROTOCOL_ID,	/**< PPP Protocol id */
	e_IOC_FM_PCD_KG_MPLS_LABEL,		/**< MPLS label */
	e_IOC_FM_PCD_KG_IP_ADDR,		/**< IP addr */
	e_IOC_FM_PCD_KG_PROTOCOL_TYPE,		/**< Protocol type */
	e_IOC_FM_PCD_KG_IP_TOS_TC,		/**< TOS or TC */
	e_IOC_FM_PCD_KG_IPV6_FLOW_LABEL,	/**< IPV6 flow label */
	e_IOC_FM_PCD_KG_IPSEC_SPI,		/**< IPSEC SPI */
	e_IOC_FM_PCD_KG_L4_PORT,		/**< L4 Port */
	e_IOC_FM_PCD_KG_TCP_FLAG,		/**< TCP Flag */
	e_IOC_FM_PCD_KG_GENERIC_FROM_DATA,
		/**< grouping implemented by SW, any data extraction that is not
		 * the full field described above
		 */
	e_IOC_FM_PCD_KG_GENERIC_FROM_DATA_NO_V,
		/**< grouping implemented by SW, any data extraction without
		 * validation
		 */
	e_IOC_FM_PCD_KG_GENERIC_NOT_FROM_DATA
		/**< grouping implemented by SW, extraction from parser result
		 * or direct use of default value
		 */
} ioc_fm_pcd_kg_known_fields_dflt_types;

/*
 * @Description   Enumeration type for defining header index for scenarios with
 *		  multiple (tunneled) headers
 */
typedef enum ioc_fm_pcd_hdr_index {
	e_IOC_FM_PCD_HDR_INDEX_NONE	=   0,
				/**< used when multiple headers not used, also
				 * to specify regular IP (not tunneled).
				 */
	e_IOC_FM_PCD_HDR_INDEX_1,/**< may be used for VLAN, MPLS, tunneled IP */
	e_IOC_FM_PCD_HDR_INDEX_2,/**< may be used for MPLS, tunneled IP */
	e_IOC_FM_PCD_HDR_INDEX_3,/**< may be used for MPLS */
	e_IOC_FM_PCD_HDR_INDEX_LAST =   0xFF /**< may be used for VLAN, MPLS */
} ioc_fm_pcd_hdr_index;

/*
 * @Description   Enumeration type for selecting the policer profile functional
 *		  type
 */
typedef enum ioc_fm_pcd_profile_type_selection {
	e_IOC_FM_PCD_PLCR_PORT_PRIVATE,		/**< Port dedicated profile */
	e_IOC_FM_PCD_PLCR_SHARED
			/**< Shared profile (shared within partition) */
} ioc_fm_pcd_profile_type_selection;

/*
 * @Description   Enumeration type for selecting the policer profile algorithm
 */
typedef enum ioc_fm_pcd_plcr_algorithm_selection {
	e_IOC_FM_PCD_PLCR_PASS_THROUGH, /**< Policer pass through */
	e_IOC_FM_PCD_PLCR_RFC_2698,	/**< Policer algorithm RFC 2698 */
	e_IOC_FM_PCD_PLCR_RFC_4115	/**< Policer algorithm RFC 4115 */
} ioc_fm_pcd_plcr_algorithm_selection;

/*
 * @Description   Enumeration type for selecting a policer profile color mode
 */
typedef enum ioc_fm_pcd_plcr_color_mode {
	e_IOC_FM_PCD_PLCR_COLOR_BLIND,  /**< Color blind */
	e_IOC_FM_PCD_PLCR_COLOR_AWARE   /**< Color aware */
} ioc_fm_pcd_plcr_color_mode;

/*
 * @Description   Enumeration type for selecting a policer profile color
 */
typedef enum ioc_fm_pcd_plcr_color {
	e_IOC_FM_PCD_PLCR_GREEN,	/**< Green */
	e_IOC_FM_PCD_PLCR_YELLOW,	/**< Yellow */
	e_IOC_FM_PCD_PLCR_RED,		/**< Red */
	e_IOC_FM_PCD_PLCR_OVERRIDE	/**< Color override */
} ioc_fm_pcd_plcr_color;

/*
 * @Description   Enumeration type for selecting the policer profile packet
 *		  frame length selector
 */
typedef enum ioc_fm_pcd_plcr_frame_length_select {
	e_IOC_FM_PCD_PLCR_L2_FRM_LEN,	/**< L2 frame length */
	e_IOC_FM_PCD_PLCR_L3_FRM_LEN,	/**< L3 frame length */
	e_IOC_FM_PCD_PLCR_L4_FRM_LEN,	/**< L4 frame length */
	e_IOC_FM_PCD_PLCR_FULL_FRM_LEN	/**< Full frame length */
} ioc_fm_pcd_plcr_frame_length_select;

/*
 * @Description   Enumeration type for selecting roll-back frame
 */
typedef enum ioc_fm_pcd_plcr_roll_back_frame_select {
	e_IOC_FM_PCD_PLCR_ROLLBACK_L2_FRM_LEN,	/**< Rollback L2 frame length */
	e_IOC_FM_PCD_PLCR_ROLLBACK_FULL_FRM_LEN
				/**< Rollback Full frame length */
} ioc_fm_pcd_plcr_roll_back_frame_select;

/*
 * @Description   Enumeration type for selecting the policer profile packet or
 *		  byte mode
 */
typedef enum ioc_fm_pcd_plcr_rate_mode {
	e_IOC_FM_PCD_PLCR_BYTE_MODE,	/**< Byte mode */
	e_IOC_FM_PCD_PLCR_PACKET_MODE   /**< Packet mode */
} ioc_fm_pcd_plcr_rate_mode;

/*
 * @Description   Enumeration type for defining action of frame
 */
typedef enum ioc_fm_pcd_done_action {
	e_IOC_FM_PCD_ENQ_FRAME = 0,	/**< Enqueue frame */
	e_IOC_FM_PCD_DROP_FRAME	/**< Drop frame */
} ioc_fm_pcd_done_action;

/*
 * @Description   Enumeration type for selecting the policer counter
 */
typedef enum ioc_fm_pcd_plcr_profile_counters {
	e_IOC_FM_PCD_PLCR_PROFILE_GREEN_PACKET_TOTAL_COUNTER,
					/**< Green packets counter */
	e_IOC_FM_PCD_PLCR_PROFILE_YELLOW_PACKET_TOTAL_COUNTER,
					/**< Yellow packets counter */
	e_IOC_FM_PCD_PLCR_PROFILE_RED_PACKET_TOTAL_COUNTER,
					/**< Red packets counter */
	e_IOC_FM_PCD_PLCR_PROFILE_RECOLOURED_YELLOW_PACKET_TOTAL_COUNTER,
					/**< Recolored yellow packets counter */
	e_IOC_FM_PCD_PLCR_PROFILE_RECOLOURED_RED_PACKET_TOTAL_COUNTER
					/**< Recolored red packets counter */
} ioc_fm_pcd_plcr_profile_counters;

/*
 * @Description   Enumeration type for selecting the PCD action after extraction
 */
typedef enum ioc_fm_pcd_action {
	e_IOC_FM_PCD_ACTION_NONE,		/**< NONE  */
	e_IOC_FM_PCD_ACTION_EXACT_MATCH,
		/**< Exact match on the selected extraction */
	e_IOC_FM_PCD_ACTION_INDEXED_LOOKUP
		/**< Indexed lookup on the selected extraction */
} ioc_fm_pcd_action;

/*
 * @Description   Enumeration type for selecting type of insert manipulation
 */
typedef enum ioc_fm_pcd_manip_hdr_insrt_type {
	e_IOC_FM_PCD_MANIP_INSRT_GENERIC,
		/**< Insert according to offset & size */
	e_IOC_FM_PCD_MANIP_INSRT_BY_HDR,
		/**< Insert according to protocol */
} ioc_fm_pcd_manip_hdr_insrt_type;

/*
 * @Description   Enumeration type for selecting type of remove manipulation
 */
typedef enum ioc_fm_pcd_manip_hdr_rmv_type {
	e_IOC_FM_PCD_MANIP_RMV_GENERIC,
		/**< Remove according to offset & size */
	e_IOC_FM_PCD_MANIP_RMV_BY_HDR
		/**< Remove according to offset & size */
} ioc_fm_pcd_manip_hdr_rmv_type;

/*
 * @Description   An enum for selecting specific L2 fields removal
 */
typedef enum ioc_fm_pcd_manip_hdr_rmv_specific_l2 {
	e_IOC_FM_PCD_MANIP_HDR_RMV_ETHERNET,	/**< Ethernet/802.3 MAC */
	e_IOC_FM_PCD_MANIP_HDR_RMV_STACKED_QTAGS,	/**< stacked QTags */
	e_IOC_FM_PCD_MANIP_HDR_RMV_ETHERNET_AND_MPLS,
			/**< MPLS and Ethernet/802.3 MAC header until the header
			 * which follows the MPLS header
			 */
	e_IOC_FM_PCD_MANIP_HDR_RMV_MPLS
			/**< Remove MPLS header (Unlimited MPLS labels) */
} ioc_fm_pcd_manip_hdr_rmv_specific_l2;

/*
 * @Description   Enumeration type for selecting specific fields updates
 */
typedef enum ioc_fm_pcd_manip_hdr_field_update_type {
	e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN,	/**< VLAN updates */
	e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV4,	/**< IPV4 updates */
	e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV6,	/**< IPV6 updates */
	e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_TCP_UDP,	/**< TCP_UDP updates */
} ioc_fm_pcd_manip_hdr_field_update_type;

/*
 * @Description   Enumeration type for selecting VLAN updates
 */
typedef enum ioc_fm_pcd_manip_hdr_field_update_vlan {
	e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN_VPRI,
				/**< Replace VPri of outer most VLAN tag. */
	e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN
				/**< DSCP to VLAN priority bits translation */
} ioc_fm_pcd_manip_hdr_field_update_vlan;

/*
 * @Description   Enumeration type for selecting specific L2 fields removal
 */
typedef enum ioc_fm_pcd_manip_hdr_insrt_specific_l2 {
	e_IOC_FM_PCD_MANIP_HDR_INSRT_MPLS
		/**< Insert MPLS header (Unlimited MPLS labels) */
} ioc_fm_pcd_manip_hdr_insrt_specific_l2;

/*
 * @Description   Enumeration type for selecting QoS mapping mode
 *
 *		  Note: In all cases except
 *		  'e_FM_PCD_MANIP_HDR_QOS_MAPPING_NONE' User should instruct the
 *		  port to read the parser-result
 */
typedef enum ioc_fm_pcd_manip_hdr_qos_mapping_mode {
	e_IOC_FM_PCD_MANIP_HDR_QOS_MAPPING_NONE = 0,
			/**< No mapping, QoS field will not be changed */
	e_IOC_FM_PCD_MANIP_HDR_QOS_MAPPING_AS_IS,
			/**< QoS field will be overwritten by the last byte in
			 * the parser-result.
			 */
} ioc_fm_pcd_manip_hdr_qos_mapping_mode;

/*
 * @Description   Enumeration type for selecting QoS source
 *
 *		  Note: In all cases except 'e_FM_PCD_MANIP_HDR_QOS_SRC_NONE'
 *		  User should left room for the parser-result on input/output
 *		  buffer and instruct the port to read/write the parser-result
 *		  to the buffer (RPD should be set)
 */
typedef enum ioc_fm_pcd_manip_hdr_qos_src {
	e_IOC_FM_PCD_MANIP_HDR_QOS_SRC_NONE = 0,
			/**< TODO */
	e_IOC_FM_PCD_MANIP_HDR_QOS_SRC_USER_DEFINED,
			/**< QoS will be taken from the last byte in the
			 * parser-result.
			 */
} ioc_fm_pcd_manip_hdr_qos_src;

/*
 * @Description   Enumeration type for selecting type of header insertion
 */
typedef enum ioc_fm_pcd_manip_hdr_insrt_by_hdr_type {
	e_IOC_FM_PCD_MANIP_INSRT_BY_HDR_SPECIFIC_L2,
			/**< Specific L2 fields insertion */
	e_IOC_FM_PCD_MANIP_INSRT_BY_HDR_IP,		/**< IP insertion */
	e_IOC_FM_PCD_MANIP_INSRT_BY_HDR_UDP,		/**< UDP insertion */
	e_IOC_FM_PCD_MANIP_INSRT_BY_HDR_UDP_LITE,
			/**< UDP lite insertion */
	e_IOC_FM_PCD_MANIP_INSRT_BY_HDR_CAPWAP		/**< CAPWAP insertion */
} ioc_fm_pcd_manip_hdr_insrt_by_hdr_type;

/*
 * @Description   Enumeration type for selecting specific custom command
 */
typedef enum ioc_fm_pcd_manip_hdr_custom_type {
	e_IOC_FM_PCD_MANIP_HDR_CUSTOM_IP_REPLACE,
			/**< Replace IPv4/IPv6 */
	e_IOC_FM_PCD_MANIP_HDR_CUSTOM_GEN_FIELD_REPLACE,
} ioc_fm_pcd_manip_hdr_custom_type;

/*
 * @Description   Enumeration type for selecting specific custom command
 */
typedef enum ioc_fm_pcd_manip_hdr_custom_ip_replace {
	e_IOC_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV4_BY_IPV6,
					/**< Replace IPv4 by IPv6 */
	e_IOC_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4
					/**< Replace IPv6 by IPv4 */
} ioc_fm_pcd_manip_hdr_custom_ip_replace;

/*
 * @Description   Enumeration type for selecting type of header removal
 */
typedef enum ioc_fm_pcd_manip_hdr_rmv_by_hdr_type {
	e_IOC_FM_PCD_MANIP_RMV_BY_HDR_SPECIFIC_L2 = 0,
			/**< Specific L2 fields removal */
	e_IOC_FM_PCD_MANIP_RMV_BY_HDR_CAPWAP,	/**< CAPWAP removal */
	e_IOC_FM_PCD_MANIP_RMV_BY_HDR_FROM_START,
				/**< Locate from data that is not the header */
} ioc_fm_pcd_manip_hdr_rmv_by_hdr_type;

/*
 * @Description   Enumeration type for selecting type of timeout mode
 */
typedef enum ioc_fm_pcd_manip_reassem_time_out_mode {
	e_IOC_FM_PCD_MANIP_TIME_OUT_BETWEEN_FRAMES,
					/**< Limits the time of the reassembly
					 * process from the first fragment to
					 * the last
					 */
	e_IOC_FM_PCD_MANIP_TIME_OUT_BETWEEN_FRAG
					/**< Limits the time of receiving the
					 * fragment
					 */
} ioc_fm_pcd_manip_reassem_time_out_mode;

/*
 * @Description   Enumeration type for selecting type of WaysNumber mode
 */
typedef enum ioc_fm_pcd_manip_reassem_ways_number {
	e_IOC_FM_PCD_MANIP_ONE_WAY_HASH = 1,	/**< One way hash    */
	e_IOC_FM_PCD_MANIP_TWO_WAYS_HASH,	/**< Two ways hash   */
	e_IOC_FM_PCD_MANIP_THREE_WAYS_HASH,	/**< Three ways hash */
	e_IOC_FM_PCD_MANIP_FOUR_WAYS_HASH,	/**< Four ways hash  */
	e_IOC_FM_PCD_MANIP_FIVE_WAYS_HASH,	/**< Five ways hash  */
	e_IOC_FM_PCD_MANIP_SIX_WAYS_HASH,	/**< Six ways hash   */
	e_IOC_FM_PCD_MANIP_SEVEN_WAYS_HASH,	/**< Seven ways hash */
	e_IOC_FM_PCD_MANIP_EIGHT_WAYS_HASH	/**< Eight ways hash */
} ioc_fm_pcd_manip_reassem_ways_number;

/*
 * @Description   Enumeration type for selecting manipulation type
 */
typedef enum ioc_fm_pcd_manip_type {
	e_IOC_FM_PCD_MANIP_HDR = 0,		/**< Header manipulation */
	e_IOC_FM_PCD_MANIP_REASSEM,		/**< Reassembly */
	e_IOC_FM_PCD_MANIP_FRAG,		/**< Fragmentation */
	e_IOC_FM_PCD_MANIP_SPECIAL_OFFLOAD	/**< Special Offloading */
} ioc_fm_pcd_manip_type;

/*
 * @Description   Enumeration type for selecting type of statistics mode
 */
typedef enum ioc_fm_pcd_cc_stats_mode {
	e_IOC_FM_PCD_CC_STATS_MODE_NONE = 0,	/**< No statistics support */
	e_IOC_FM_PCD_CC_STATS_MODE_FRAME,	/**< Frame count statistics */
	e_IOC_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME,
			/**< Byte and frame count statistics */
	e_IOC_FM_PCD_CC_STATS_MODE_RMON,
			/**< Byte and frame length range count statistics */
} ioc_fm_pcd_cc_stats_mode;

/*
 * @Description   Enumeration type for determining the action in case an IP
 *		  packet is larger than MTU but its DF (Don't Fragment) bit is
 *		  set.
 */
typedef enum ioc_fm_pcd_manip_donot_frag_action {
	e_IOC_FM_PCD_MANIP_DISCARD_PACKET = 0,	/**< Discard packet */
	e_IOC_FM_PCD_MANIP_ENQ_TO_ERR_Q_OR_DISCARD_PACKET =
			e_IOC_FM_PCD_MANIP_DISCARD_PACKET,
				/**< Obsolete, cannot enqueue to error queue; In
				 * practice, selects to discard packets; Will be
				 * removed in the future
				 */
	e_IOC_FM_PCD_MANIP_FRAGMENT_PACKECT,
				/**< Fragment packet and continue normal
				 * processing
				 */
	e_IOC_FM_PCD_MANIP_CONTINUE_WITHOUT_FRAG
				/**< Continue normal processing without
				 * fragmenting the packet
				 */
} ioc_fm_pcd_manip_donot_frag_action;

/*
 * @Description   Enumeration type for selecting type of special offload
 *		  manipulation
 */
typedef enum ioc_fm_pcd_manip_special_offload_type {
	e_IOC_FM_PCD_MANIP_SPECIAL_OFFLOAD_IPSEC,
					/**< IPSec offload manipulation */
	e_IOC_FM_PCD_MANIP_SPECIAL_OFFLOAD_CAPWAP
					/**< CAPWAP offload manipulation */
} ioc_fm_pcd_manip_special_offload_type;

/*
 * @Description   A union of protocol dependent special options
 *		  (Must match union u_FmPcdHdrProtocolOpt defined in
 *		  fm_pcd_ext.h)
 */
typedef union ioc_fm_pcd_hdr_protocol_opt_u {
	ioc_eth_protocol_opt_t	eth_opt;	/**< Ethernet options */
	ioc_vlan_protocol_opt_t   vlan_opt;	/**< Vlan options */
	ioc_mpls_protocol_opt_t   mpls_opt;	/**< MPLS options */
	ioc_ipv4_protocol_opt_t   ipv4_opt;	/**< IPv4 options */
	ioc_ipv6_protocol_opt_t   ipv6_opt;	/**< IPv6 options */
	ioc_capwap_protocol_opt_t capwap_opt;  /**< CAPWAP options */
} ioc_fm_pcd_hdr_protocol_opt_u;

/*
 * @Description   A union holding all known protocol fields
 */
typedef union ioc_fm_pcd_fields_u {
	ioc_header_field_eth_t		eth;		/**< Ethernet*/
	ioc_header_field_vlan_t		vlan;		/**< VLAN*/
	ioc_header_field_llc_snap_t	llc_snap;	/**< LLC SNAP*/
	ioc_header_field_pppoe_t		pppoe;	/**< PPPoE*/
	ioc_header_field_mpls_t		mpls;		/**< MPLS*/
	ioc_header_field_ip_t		ip;		/**< IP	*/
	ioc_header_field_ipv4_t		ipv4;		/**< IPv4*/
	ioc_header_field_ipv6_t		ipv6;		/**< IPv6*/
	ioc_header_field_udp_t		udp;		/**< UDP	*/
	ioc_header_field_udp_lite_t	udp_lite;	/**< UDP_Lite*/
	ioc_header_field_tcp_t		tcp;		/**< TCP	*/
	ioc_header_field_sctp_t		sctp;		/**< SCTP*/
	ioc_header_field_dccp_t		dccp;		/**< DCCP*/
	ioc_header_field_gre_t		gre;		/**< GRE	*/
	ioc_header_field_minencap_t	minencap;/**< Minimal Encapsulation  */
	ioc_header_field_ipsec_ah_t	ipsec_ah;	/**< IPSec AH*/
	ioc_header_field_ipsec_esp_t	ipsec_esp;	/**< IPSec ESP*/
	ioc_header_field_udp_encap_esp_t	udp_encap_esp;
						/**< UDP Encapsulation ESP  */
} ioc_fm_pcd_fields_u;

/*
 * @Description   Parameters for defining header extraction for key generation
 */
typedef struct ioc_fm_pcd_from_hdr_t {
	uint8_t		size;	/**< Size in byte */
	uint8_t		offset;	/**< Byte offset */
} ioc_fm_pcd_from_hdr_t;

/*
 * @Description   Parameters for defining field extraction for key generation
 */
typedef struct ioc_fm_pcd_from_field_t {
	ioc_fm_pcd_fields_u field;	/**< Field selection */
	uint8_t		size;	/**< Size in byte */
	uint8_t		offset;	/**< Byte offset */
} ioc_fm_pcd_from_field_t;

/*
 * @Description   Parameters for defining a single network environment unit
 *		  A distinction unit should be defined if it will later be used
 *		  by one or more PCD engines to distinguish between flows.
 *		  (Must match struct t_FmPcdDistinctionUnit defined in
 *		  fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_distinction_unit_t {
	struct {
	ioc_net_header_type	hdr;
				/**< One of the headers supported by the FM */
	ioc_fm_pcd_hdr_protocol_opt_u  opt;	/**< Select only one option! */
	} hdrs[IOC_FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS];
} ioc_fm_pcd_distinction_unit_t;

/*
 * @Description   Parameters for defining all different distinction units
 *		  supported by a specific PCD Network Environment
 *		  Characteristics module.
 *
 *		  Each unit represent a protocol or a group of protocols that
 *		  may be used later by the different PCD engines to distinguish
 *		  between flows.
 *		  (Must match struct t_FmPcdNetEnvParams defined in
 *		  fm_pcd_ext.h)
 */
struct fm_pcd_net_env_params_t {
	uint8_t num_of_distinction_units;
	/**< Number of different units to be identified */
	ioc_fm_pcd_distinction_unit_t
		units[IOC_FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS];
	/**< An array of num_of_distinction_units of the different units to be
	 * identified
	 */
};

typedef struct ioc_fm_pcd_net_env_params_t {
	struct fm_pcd_net_env_params_t param;
	void				*id;
		/**< Output parameter; Returns the net-env Id to be used */
} ioc_fm_pcd_net_env_params_t;

/*
 * @Description   Parameters for defining a single extraction action when
 *		  creating a key
 */
typedef struct ioc_fm_pcd_extract_entry_t {
	ioc_fm_pcd_extract_type		type;	/**< Extraction type select */
	union {
	struct {
		ioc_net_header_type	hdr;		/**< Header selection */
		bool			ignore_protocol_validation;
					/**< Ignore protocol validation */
		ioc_fm_pcd_hdr_index	hdr_index;
					/**< Relevant only for MPLS, VLAN and
					 * tunneled IP. Otherwise should be
					 * cleared.
					 */
		ioc_fm_pcd_extract_by_hdr_type  type;
					/**< Header extraction type select */
		union {
		ioc_fm_pcd_from_hdr_t	from_hdr;
					/**< Extract bytes from header
					 * parameters
					 */
		ioc_fm_pcd_from_field_t	from_field;
					/**< Extract bytes from field parameters
					 */
		ioc_fm_pcd_fields_u	full_field;
					/**< Extract full field parameters */
		} extract_by_hdr_type;
	} extract_by_hdr;/**< Used when type = e_IOC_FM_PCD_KG_EXTRACT_BY_HDR */
	struct {
		ioc_fm_pcd_extract_from	src;
					/**< Non-header extraction source */
		ioc_fm_pcd_action	action;	/**< Relevant for CC Only */
		uint16_t	ic_indx_mask;
				/**< Relevant only for CC whenaction =
				 * e_IOC_FM_PCD_ACTION_INDEXED_LOOKUP; Note that
				 * the number of bits that are set within this
				 * mask must be log2 of the CC-node
				 * 'num_of_keys'. Note that the mask cannot be
				 * set on the lower bits.
				 */
		uint8_t			offset;	/**< Byte offset */
		uint8_t			size;	/**< Size in bytes */
	} extract_non_hdr;
		/**< Used when type = e_IOC_FM_PCD_KG_EXTRACT_NON_HDR */
	} extract_params;
} ioc_fm_pcd_extract_entry_t;

/*
 * @Description   A structure for defining masks for each extracted
 *		  field in the key.
 */
typedef struct ioc_fm_pcd_kg_extract_mask_t {
	uint8_t		extract_array_index;
				/**< Index in the extraction array, as
				 * initialized by user
				 */
	uint8_t		offset;	/**< Byte offset */
	uint8_t		mask;
			/**< A byte mask (selected bits will be ignored) */
} ioc_fm_pcd_kg_extract_mask_t;

/*
 * @Description   A structure for defining default selection per groups of
 *		  fields
 */
typedef struct ioc_fm_pcd_kg_extract_dflt_t {
	ioc_fm_pcd_kg_known_fields_dflt_types	type;
						/**< Default type select */
	ioc_fm_pcd_kg_extract_dflt_select	dflt_select;
						/**< Default register select */
} ioc_fm_pcd_kg_extract_dflt_t;


/*
 * @Description   A structure for defining all parameters needed for
 *		  generation a key and using a hash function
 */
typedef struct ioc_fm_pcd_kg_key_extract_and_hash_params_t {
	uint32_t			private_dflt0;
					/**< Scheme default register 0 */
	uint32_t			private_dflt1;
					/**< Scheme default register 1 */
	uint8_t				num_of_used_extracts;
					/**< defines the valid size of the
					 * following array
					 */
	ioc_fm_pcd_extract_entry_t
			extract_array[IOC_FM_PCD_KG_MAX_EXTRACTS_PER_KEY];
					/**< An array of extraction definitions.
					 */
	uint8_t				num_of_used_dflts;
					/**< defines the valid size of the
					 * following array
					 */
	ioc_fm_pcd_kg_extract_dflt_t
				dflts[IOC_FM_PCD_KG_NUM_OF_DEFAULT_GROUPS];
					/**< For each extraction used in this
					 * scheme, specify the required default
					 * register to be used when header is
					 * not found. types not specified in
					 * this array will get undefined value.
					 */
	uint8_t				num_of_used_masks;
					/**< Defines the valid size of the
					 * following array
					 */
	ioc_fm_pcd_kg_extract_mask_t
				masks[IOC_FM_PCD_KG_NUM_OF_EXTRACT_MASKS];
	uint8_t				hash_shift;
					/**< Hash result right shift. Selects
					 * the 24 bits out of the 64 hash
					 * result. 0 means using the 24 LSB's,
					 * otherwise use the 24 LSB's after
					 * shifting right.
					 */
	uint32_t			hash_dist_num_of_fqids;
					/**< must be > 1 and a power of 2.
					 * Represents the range of queues for
					 * the key and hash functionality
					 */
	uint8_t				hash_distribution_fqids_shift;
					/**< selects the FQID bits that will be
					 * effected by the hash
					 */
	bool				symmetric_hash;
					/**< TRUE to generate the same hash for
					 * frames with swapped source and
					 * destination fields on all layers; If
					 * TRUE, driver will check that for all
					 * layers, if SRC extraction is
					 * selected, DST extraction must also be
					 * selected, and vice versa.
					 */
} ioc_fm_pcd_kg_key_extract_and_hash_params_t;

/*
 * @Description   A structure of parameters for defining a single Qid mask
 *		  (extracted OR).
 */
typedef struct ioc_fm_pcd_kg_extracted_or_params_t {
	ioc_fm_pcd_extract_type		type;
					/**< Extraction type select */
	union {
	struct {
			/**< used when type = e_IOC_FM_PCD_KG_EXTRACT_BY_HDR */
		ioc_net_header_type		hdr;
		ioc_fm_pcd_hdr_index		hdr_index;
						/**< Relevant only for MPLS,
						 * VLAN and tunneled IP.
						 * Otherwise should be cleared.
						 */
		bool				ignore_protocol_validation;

	} extract_by_hdr;
	ioc_fm_pcd_extract_from		src;
					/**< used when type =
					 * e_IOC_FM_PCD_KG_EXTRACT_NON_HDR
					 */
	} extract_params;
	uint8_t				extraction_offset;
					/**< Offset for extraction */
	ioc_fm_pcd_kg_extract_dflt_select	dflt_value;
					/**< Select register from which
					 * extraction is taken if field not
					 * found
					 */
	uint8_t				mask;
					/**< Mask LSB byte of extraction
					 * (specified bits are ignored)
					 */

	uint8_t			bit_offset_in_fqid;
		/**< 0-31, Selects which bits of the 24 FQID bits to effect
		 * using the extracted byte; Assume byte is placed as the 8
		 * MSB's in a 32 bit word where the lower bits are the FQID; i.e
		 * if bitOffsetInFqid=1 than its LSB will effect the FQID MSB,
		 * if bitOffsetInFqid=24 than the extracted byte will effect the
		 * 8 LSB's of the FQID, if bitOffsetInFqid=31 than the byte's
		 * MSB will effect the FQID's LSB; 0 means - no effect on FQID;
		 * Note that one, and only one of bitOffsetInFqid or
		 * bitOffsetInPlcrProfile must be set (i.e, extracted byte must
		 * effect either FQID or Policer profile).
		 */
	uint8_t			bit_offset_in_plcr_profile;
		/**< 0-15, Selects which bits of the 8 policer profile id bits
		 * to effect using the extracted byte; Assume byte is placed as
		 * the 8 MSB's in a 16 bit word where the lower bits are the
		 * policer profile id; i.e if bitOffsetInPlcrProfile=1 than its
		 * LSB will effect the profile MSB, if bitOffsetInFqid=8 than
		 * the extracted byte will effect the whole policer profile id,
		 * if bitOffsetInFqid=15 than the byte's MSB will effect the
		 * Policer Profile id's LSB; 0 means - no effect on policer
		 * profile; Note that one, and only one of bitOffsetInFqid or
		 * bitOffsetInPlcrProfile must be set (i.e, extracted byte must
		 * effect either FQID or Policer profile).
		 */
} ioc_fm_pcd_kg_extracted_or_params_t;

/*
 * @Description   A structure for configuring scheme counter
 */
typedef struct ioc_fm_pcd_kg_scheme_counter_t {
	bool		update;
			/**< FALSE to keep the current counter state and
			 * continue from that point, TRUE to update/reset the
			 * counter when the scheme is written.
			 */
	uint32_t	value;
			/**< If update=TRUE, this value will be written into the
			 * counter; clear this field to reset the counter.
			 */
} ioc_fm_pcd_kg_scheme_counter_t;


/*
 * @Description   A structure for retrieving FMKG_SE_SPC
 */
typedef struct ioc_fm_pcd_kg_scheme_spc_t {
	uint32_t	val;	/**< return value */
	void	*id;		/**< scheme handle */
} ioc_fm_pcd_kg_scheme_spc_t;

/*
 * @Description   A structure for defining policer profile parameters as
 *		  required by keygen (when policer is the next engine after this
 *		  scheme).
 *		  (Must match struct t_FmPcdKgPlcrProfile defined in
 *		  fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_kg_plcr_profile_t {
	bool		shared_profile;
			/**< TRUE if this profile is shared between ports (i.e.
			 * managed by primary partition) May not be TRUE if
			 * profile is after Coarse Classification
			 */
	bool		direct;
			/**< If TRUE, direct_relative_profile_id only selects
			 * the profile id, if FALSE
			 * fqid_offset_relative_profile_id_base is used together
			 * with fqid_offset_shift and num_of_profiles
			 * parameters, to define a range of profiles from which
			 * the KeyGen result will determine the destination
			 * policer profile.
			 */
	union {
	uint16_t	direct_relative_profile_id;
			/**< Used if 'direct' is TRUE, to select policer
			 * profile. This parameter should indicate the policer
			 * profile offset within the port's policer profiles or
			 * SHARED window.
			 */
	struct {
		uint8_t	fqid_offset_shift;
			/**< Shift of KG results without the qid base */
		uint8_t	fqid_offset_relative_profile_id_base;
			/**< OR of KG results without the qid base This
			 * parameter should indicate the policer profile offset
			 * within the port's policer profiles window or SHARED
			 * window depends on shared_profile
			 */
		uint8_t	num_of_profiles;
			/**< Range of profiles starting at base */
	} indirect_profile;		/**< Indirect profile parameters */
	} profile_select;
			/**< Direct/indirect profile selection and parameters */
} ioc_fm_pcd_kg_plcr_profile_t;

/*
 * @Description   Parameters for configuring a storage profile for a KeyGen
 *		  scheme.
 */
typedef struct ioc_fm_pcd_kg_storage_profile_t {
	bool	direct;
		/**< If TRUE, directRelativeProfileId only selects the profile
		 * id; If FALSE, fqidOffsetRelativeProfileIdBase is used
		 * together with fqidOffsetShift and num_of_profiles parameters
		 * to define a range of profiles from which the KeyGen result
		 * will determine the destination storage profile.
		 */
	union {
		uint16_t	direct_relative_profile_id;
		/**< Used when 'direct' is TRUE, to select a storage profile;
		 * should indicate the storage profile offset within the port's
		 * storage profiles window.
		 */
		struct {
			uint8_t	fqid_offset_shift;
			/**< Shift of KeyGen results without the FQID base */
			uint8_t	fqid_offset_relative_profile_id_base;
			/**< OR of KeyGen results without the FQID base; should
			 * indicate the policer profile offset within the port's
			 * storage profiles window.
			 */
			uint8_t	num_of_profiles;
			/**< Range of profiles starting at base. */
		} indirect_profile;
		/**< Indirect profile parameters. */
	} profile_select;
	/**< Direct/indirect profile selection and parameters. */
} ioc_fm_pcd_kg_storage_profile_t;

/*
 * @Description   Parameters for defining CC as the next engine after KeyGen
 *		  (Must match struct t_FmPcdKgCc defined in fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_kg_cc_t {
	void				*tree_id;
					/**< CC Tree id */
	uint8_t				grp_id;
					/**< CC group id within the CC tree */
	bool				plcr_next;
					/**< TRUE if after CC, in case of data
					 * frame, policing is required.
					 */
	bool				bypass_plcr_profile_generation;
					/**< TRUE to bypass KeyGen policer
					 * profile generation; selected profile
					 * is the one set at port initialization
					 */
	ioc_fm_pcd_kg_plcr_profile_t	plcr_profile;
					/**< Valid only if plcr_next = TRUE and
					 * bypass_plcr_profile_generation =
					 * FALSE
					 */
} ioc_fm_pcd_kg_cc_t;

/*
 * @Description   Parameters for defining initializing a KeyGen scheme (Must
 *		  match struct t_FmPcdKgSchemeParams defined in fm_pcd_ext.h)
 */
struct fm_pcd_kg_scheme_params_t {
	bool modify;	/**< TRUE to change an existing scheme */
	union {
		uint8_t relative_scheme_id;
		/**< if modify=FALSE: partition-relative scheme id */
		void *scheme_id;
		/**< if modify=TRUE: the id of an existing scheme */
	} scm_id;
	bool always_direct;
		/**< This scheme is reached only directly, i.e. no need for
		 * match vector; KeyGen will ignore it when matching
		 */
	struct {
		/**< HL relevant only if always_direct=FALSE */
		void *net_env_id;
		/**< The id of the Network Environment as returned
		 * by fm_pcd_net_env_characteristics_set()
		 */
		uint8_t num_of_distinction_units;
		/**< Number of NetEnv units listed in unit_ids array */
		uint8_t unit_ids[IOC_FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS];
		/**< Indexes as passed to SetNetEnvCharacteristics (?) array */
	} net_env_params;
	bool use_hash;
		/**< use the KG Hash functionality */
	ioc_fm_pcd_kg_key_extract_and_hash_params_t key_ext_and_hash;
		/**< used only if useHash = TRUE */
	bool bypass_fqid_generation;
		/**< Normally - FALSE, TRUE to avoid FQID update in the IC; In
		 * such a case FQID after KG will be the default FQID defined
		 * for the relevant port, or the FQID defined by CC in cases
		 * where CC was the previous engine.
		 */
	uint32_t base_fqid;
		/**< Base FQID; Relevant only if bypass_fqid_generation = FALSE;
		 * If hash is used and an even distribution is expected
		 * according to hash_dist_num_of_fqids, base_fqid must
		 * be aligned to hash_dist_num_of_fqids.
		 */
	uint8_t num_of_used_extracted_ors;
		/**< Number of FQID masks listed in extracted_ors array*/
	ioc_fm_pcd_kg_extracted_or_params_t
		extracted_ors[IOC_FM_PCD_KG_NUM_OF_GENERIC_REGS];
		/**< IOC_FM_PCD_KG_NUM_OF_GENERIC_REGS registers are shared
		 * between qid_masks functionality and some of the extraction
		 * actions; Normally only some will be used for qid_mask. Driver
		 * will return error if resource is full at initialization time.
		 */
	bool override_storage_profile;
		/**< TRUE if KeyGen override previously decided storage profile
		 */
	ioc_fm_pcd_kg_storage_profile_t storage_profile;
		/**< Used when override_storage_profile=TRUE */
	ioc_fm_pcd_engine next_engine;
		/**< may be BMI, PLCR or CC */
	union {
		/**< depends on nextEngine */
		ioc_fm_pcd_done_action done_action;
		/**< Used when next engine is BMI (done) */
		ioc_fm_pcd_kg_plcr_profile_t plcr_profile;
		/**< Used when next engine is PLCR */
		ioc_fm_pcd_kg_cc_t cc;
		/**< Used when next engine is CC */
	} kg_next_engine_params;
	ioc_fm_pcd_kg_scheme_counter_t scheme_counter;
		/**< A structure of parameters for updating the scheme counter*/
};

typedef struct ioc_fm_pcd_kg_scheme_params_t {
	struct fm_pcd_kg_scheme_params_t param;
	void *id;		/**< Returns the scheme Id to be used */
} ioc_fm_pcd_kg_scheme_params_t;

/*
 * @Collection
 */
#define IOC_FM_PCD_CC_STATS_MAX_FLR	10
			/* Maximal supported number of frame length ranges */
#define IOC_FM_PCD_CC_STATS_FLR_SIZE		2
			/* Size in bytes of a frame length range limit */
#define IOC_FM_PCD_CC_STATS_FLR_COUNT_SIZE	4
			/* Size in bytes of a frame length range counter */
/* @} */

/*
 * @Description   Parameters for defining CC as the next engine after a CC node.
 *		  (Must match struct t_FmPcdCcNextCcParams defined in
 *		  fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_cc_next_cc_params_t {
	void	*cc_node_id;			/**< Id of the next CC node */
} ioc_fm_pcd_cc_next_cc_params_t;

/*
 * @Description   A structure for defining Frame Replicator as the next engine
 *		  after a CC node. (Must match struct t_FmPcdCcNextFrParams
 *		  defined in fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_cc_next_fr_params_t {
	void *frm_replic_id;
			/**< The id of the next frame replicator group */
} ioc_fm_pcd_cc_next_fr_params_t;

/*
 * @Description   A structure for defining PLCR params when PLCR is the
 *		  next engine after a CC node
 *		  (Must match struct t_FmPcdCcNextPlcrParams defined in
 *		  fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_cc_next_plcr_params_t {
	bool	override_params;
		/**< TRUE if CC override previously decided parameters*/
	bool	shared_profile;
		/**< Relevant only if overrideParams=TRUE: TRUE if this profile
		 * is shared between ports
		 */
	uint16_t	new_relative_profile_id;
		/**< Relevant only if overrideParams=TRUE: (otherwise profile id
		 * is taken from keygen); This parameter should indicate the
		 * policer profile offset within the port's policer profiles or
		 * from SHARED window.
		 */
	uint32_t	new_fqid;
		/**< Relevant only if overrideParams=TRUE: FQID for enquing the
		 * frame; In earlier chips  if policer next engine is KEYGEN,
		 * this parameter can be 0, because the KEYGEN always decides
		 * the enqueue FQID.
		 */
	uint8_t	new_relative_storage_profile_id;
		/**< Indicates the relative storage profile offset within the
		 * port's storage profiles window; Relevant only if the port was
		 * configured with VSP.
		 */
} ioc_fm_pcd_cc_next_plcr_params_t;

/*
 * @Description   A structure for defining enqueue params when BMI is the next
 *		  engine after a CC node (Must match struct
 *		  t_FmPcdCcNextEnqueueParams defined in fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_cc_next_enqueue_params_t {
	ioc_fm_pcd_done_action  action;
				/**< Action - when next engine is BMI (done) */
	bool			override_fqid;
				/**< TRUE if CC override previously decided fqid
				 * and vspid, relevant if action =
				 * e_IOC_FM_PCD_ENQ_FRAME
				 */
	uint32_t		new_fqid;
				/**< Valid if overrideFqid=TRUE, FQID for
				 * enqueuing the frame (otherwise FQID is taken
				 * from KeyGen), relevant if action =
				 * e_IOC_FM_PCD_ENQ_FRAME
				 */
	uint8_t		new_relative_storage_profile_id;
			/**< Valid if override_fqid=TRUE, Indicates the relative
			 * virtual storage profile offset within the port's
			 * storage profiles window; Relevant only if the port
			 * was configured with VSP.
			 */

} ioc_fm_pcd_cc_next_enqueue_params_t;

/*
 * @Description   A structure for defining KG params when KG is the next engine
 *		  after a CC node (Must match struct t_FmPcdCcNextKgParams
 *		  defined in fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_cc_next_kg_params_t {
	bool	override_fqid;
		/**< TRUE if CC override previously decided fqid and vspid,
		 * Note - this parameters are irrelevant for earlier chips
		 */
	uint32_t   new_fqid;
		/**< Valid if overrideFqid=TRUE, FQID for enqueuing the frame
		 * (otherwise FQID is taken from KeyGen),
		 * Note - this parameters are irrelevant for earlier chips
		 */
	uint8_t   new_relative_storage_profile_id;
		/**< Valid if override_fqid=TRUE, Indicates the relative virtual
		 * storage profile offset within the port's storage profiles
		 * window; Relevant only if the port was configured with VSP.
		 */
	void	*p_direct_scheme;	/**< Direct scheme id to go to. */
} ioc_fm_pcd_cc_next_kg_params_t;

/*
 * @Description   Parameters for defining the next engine after a CC node.
 *		  (Must match struct ioc_fm_pcd_cc_next_engine_params_t defined
 *		  in fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_cc_next_engine_params_t {
	ioc_fm_pcd_engine			next_engine;
				/**< User has to initialize parameters according
				 * to nextEngine definition
				 */
	union {
		ioc_fm_pcd_cc_next_cc_params_t	cc_params;
				/**< Parameters in case next engine is CC */
		ioc_fm_pcd_cc_next_plcr_params_t	plcr_params;
				/**< Parameters in case next engine is PLCR */
		ioc_fm_pcd_cc_next_enqueue_params_t enqueue_params;
				/**< Parameters in case next engine is BMI */
		ioc_fm_pcd_cc_next_kg_params_t	kg_params;
				/**< Parameters in case next engine is KG */
		ioc_fm_pcd_cc_next_fr_params_t	fr_params;
				/**< Parameters in case next engine is FR */
	} params;
		/**< Union used for all the next-engine parameters options */
	void					*manip_id;
				/**< Handle to Manipulation object. Relevant if
				 * next engine is of type result
				 * (e_IOC_FM_PCD_PLCR, e_IOC_FM_PCD_KG,
				 * e_IOC_FM_PCD_DONE)
				 */
	bool					statistics_en;
				/**< If TRUE, statistics counters are
				 * incremented for each frame passing through
				 * this Coarse Classification entry.
				 */
} ioc_fm_pcd_cc_next_engine_params_t;

/*
 * @Description   Parameters for defining a single CC key
 */
typedef struct ioc_fm_pcd_cc_key_params_t {
	uint8_t		*p_key;
			/**< pointer to the key of the size defined in key_size
			 */
	uint8_t		*p_mask;
			/**< pointer to the Mask per key of the size defined in
			 * key_size. p_key and p_mask (if defined) has to be of
			 * the same size defined in the key_size
			 */
	ioc_fm_pcd_cc_next_engine_params_t  cc_next_engine_params;
			/**< parameters for the next for the defined Key in
			 * p_key
			 */

} ioc_fm_pcd_cc_key_params_t;

/*
 * @Description   Parameters for defining CC keys parameters
 *		  The driver supports two methods for CC node allocation:
 *		  dynamic and static. Static mode was created in order to
 *		  prevent runtime alloc/free of FMan memory (MURAM), which may
 *		  cause fragmentation; in this mode, the driver automatically
 *		  allocates the memory according to 'max_num_of_keys' parameter.
 *		  The driver calculates the maximal memory size that may be used
 *		  for this CC-Node taking into consideration 'mask_support' and
 *		  'statistics_mode' parameters. When 'action' =
 *		  e_IOC_FM_PCD_ACTION_INDEXED_LOOKUP in the extraction
 *		  parameters of this node, 'max_num_of_keys' must be equal to
 *		  'num_of_keys'. In dynamic mode, 'max_num_of_keys' must be
 *		  zero. At initialization, all required structures are allocated
 *		  according to 'num_of_keys' parameter. During runtime
 *		  modification, these structures are re-allocated according to
 *		  the updated number of keys.
 *		  Please note that 'action' and 'ic_indx_mask' mentioned in the
 *		  specific parameter explanations are passed in the extraction
 *		  parameters of the node (fields of
 *		  extractccparams.extractnonhdr).
 */
typedef struct ioc_keys_params_t {
	uint16_t		max_num_of_keys;
			/**< Maximum number of keys that will (ever) be used in
			 * this CC-Node; A value of zero may be used for dynamic
			 * memory allocation.
			 */
	bool			mask_support;
			/**< This parameter is relevant only if a node is
			 * initialized with action =
			 * e_IOC_FM_PCD_ACTION_EXACT_MATCH and max_num_of_keys >
			 * 0; Should be TRUE to reserve table memory for key
			 * masks, even if initial keys do not contain masks, or
			 * if the node was initialized as 'empty' (without
			 * keys); this will allow user to add keys with masks at
			 * runtime.
			 */
	ioc_fm_pcd_cc_stats_mode	statistics_mode;
			/**< Determines the supported statistics mode for all
			 * node's keys. To enable statistics gathering,
			 * statistics should be enabled per every key, using
			 * 'statistics_en' in next engine parameters structure
			 * of that key; If 'max_num_of_keys' is set, all
			 * required structures will be preallocated for all keys
			 */
	uint16_t	frame_length_ranges[IOC_FM_PCD_CC_STATS_MAX_FLR];
		/**< Relevant only for 'RMON' statistics mode (this feature is
		 * supported only on B4860 device); Holds a list of programmable
		 * thresholds. For each received frame, its length in bytes is
		 * examined against these range thresholds and the appropriate
		 * counter is incremented by 1. For example, to belong to range
		 * i, the following should hold: range i-1 threshold < frame
		 * length <= range i threshold Each range threshold must be
		 * larger then its preceding range threshold. Last range
		 * threshold must be 0xFFFF.
		 */
	uint16_t			num_of_keys;
		/**< Number of initial keys; Note that in case of 'action' =
		 * e_IOC_FM_PCD_ACTION_INDEXED_LOOKUP, this field should be
		 * power-of-2 of the number of bits that are set in
		 * 'ic_indx_mask'.
		 */
	uint8_t			key_size;
		/**< Size of key - for extraction of type FULL_FIELD, 'key_size'
		 * has to be the standard size of the selected key; For other
		 * extraction types, 'key_size' has to be as size of extraction;
		 * When 'action' = e_IOC_FM_PCD_ACTION_INDEXED_LOOKUP,
		 * 'key_size' must be 2.
		 */
	ioc_fm_pcd_cc_key_params_t  key_params[IOC_FM_PCD_MAX_NUM_OF_KEYS];
		/**< An array with 'num_of_keys' entries, each entry specifies
		 * the corresponding key parameters; When 'action' =
		 * e_IOC_FM_PCD_ACTION_EXACT_MATCH, this value must not exceed
		 * 255 (IOC_FM_PCD_MAX_NUM_OF_KEYS-1) as the last entry is saved
		 * for the 'miss' entry.
		 */
	ioc_fm_pcd_cc_next_engine_params_t  cc_next_engine_params_for_miss;
		/**< Parameters for defining the next engine when a key is not
		 * matched; Not relevant if action =
		 * e_IOC_FM_PCD_ACTION_INDEXED_LOOKUP.
		 */
} ioc_keys_params_t;

/*
 * @Description   Parameters for defining a CC node
 */
struct fm_pcd_cc_node_params_t {
	ioc_fm_pcd_extract_entry_t extract_cc_params;
	/**< Extraction parameters */
	ioc_keys_params_t keys_params;
	/**< Keys definition matching the selected extraction */
};

typedef struct ioc_fm_pcd_cc_node_params_t {
	struct fm_pcd_cc_node_params_t param;
	void *id;
	/**< Output parameter; returns the CC node Id to be used */
} ioc_fm_pcd_cc_node_params_t;

/*
 * @Description   Parameters for defining a hash table
 *		  (Must match struct ioc_fm_pcd_hash_table_params_t defined in
 *		  fm_pcd_ext.h)
 */
struct fm_pcd_hash_table_params_t {
	uint16_t max_num_of_keys;
		/**< Maximum Number Of Keys that will (ever) be used in this
		 * Hash-table
		 */
	ioc_fm_pcd_cc_stats_mode statistics_mode;
		/**< If not e_IOC_FM_PCD_CC_STATS_MODE_NONE, the required
		 * structures for the requested statistics mode will be
		 * allocated according to max_num_of_keys.
		 */
	uint8_t kg_hash_shift;
		/**< KG-Hash-shift as it was configured in the KG-scheme that
		 * leads to this hash-table.
		 */
	uint16_t hash_res_mask;
		/**< Mask that will be used on the hash-result; The
		 * number-of-sets for this hash will be calculated as (2^(number
		 * of bits set in 'hash_res_mask')); The 4 lower bits must be
		 * cleared.
		 */
	uint8_t hash_shift;
		/**< Byte offset from the beginning of the KeyGen hash result to
		 * the 2-bytes to be used as hash index.
		 */
	uint8_t match_key_size;
		/**< Size of the exact match keys held by the hash buckets */

	ioc_fm_pcd_cc_next_engine_params_t cc_next_engine_params_for_miss;
		/**< Parameters for defining the next engine when a key is not
		 * matched
		 */
};

typedef struct ioc_fm_pcd_hash_table_params_t {
	struct fm_pcd_hash_table_params_t param;
	void *id;
} ioc_fm_pcd_hash_table_params_t;

/*
 * @Description   A structure with the arguments for the
 *		  fm_pcd_hash_table_add_key ioctl() call
 */
typedef struct ioc_fm_pcd_hash_table_add_key_params_t {
	void			*p_hash_tbl;
	uint8_t			key_size;
	ioc_fm_pcd_cc_key_params_t  key_params;
} ioc_fm_pcd_hash_table_add_key_params_t;

/*
 * @Description   Parameters for defining a CC tree group.
 *
 *		  This structure defines a CC group in terms of NetEnv units and
 *		  the action to be taken in each case. The unit_ids list must be
 *		  given in order from low to high indices.
 *		  ioc_fm_pcd_cc_next_engine_params_t is a list of
 *		  2^num_of_distinction_units structures where each defines the
 *		  next action to be taken for each units combination. for
 *		  example: num_of_distinction_units = 2 unit_ids = {1,3}
 *		  next_engine_per_entries_in_grp[0] =
 *		  ioc_fm_pcd_cc_next_engine_params_t for the case that unit 1 -
 *		  not found; unit 3 - not found;
 *		  next_engine_per_entries_in_grp[1] =
 *		  ioc_fm_pcd_cc_next_engine_params_t for the case that unit 1 -
 *		  not found; unit 3 - found;
 *		  next_engine_per_entries_in_grp[2] =
 *		  ioc_fm_pcd_cc_next_engine_params_t for the case that unit 1 -
 *		  found; unit 3 - not found;
 *		  next_engine_per_entries_in_grp[3] =
 *		  ioc_fm_pcd_cc_next_engine_params_t for the case that unit 1 -
 *		  found; unit 3 - found;
 */
typedef struct ioc_fm_pcd_cc_grp_params_t {
	uint8_t		num_of_distinction_units;   /**< Up to 4 */
	uint8_t		unit_ids[IOC_FM_PCD_MAX_NUM_OF_CC_UNITS];
		/**< Indexes of the units as defined in
		 * fm_pcd_net_env_characteristics_set()
		 */
	ioc_fm_pcd_cc_next_engine_params_t
		next_engine_per_entries_in_grp[IOC_FM_PCD_MAX_CC_ENTRY_IN_GRP];
		/**< Maximum entries per group is 16 */
} ioc_fm_pcd_cc_grp_params_t;

/*
 * @Description   Parameters for defining the CC tree groups
 *		  (Must match struct ioc_fm_pcd_cc_tree_params_t defined in
 *		  fm_pcd_ext.h)
 */
typedef struct ioc_fm_pcd_cc_tree_params_t {
	void		*net_env_id;
			/**< Id of the Network Environment as returned
			 * by fm_pcd_net_env_characteristics_set()
			 */
	uint8_t		num_of_groups;
			/**< Number of CC groups within the CC tree */
	ioc_fm_pcd_cc_grp_params_t
			fm_pcd_cc_group_params[IOC_FM_PCD_MAX_NUM_OF_CC_GROUPS];
			/**< Parameters for each group. */
	void		*id;
			/**< Output parameter; Returns the tree Id to be used */
} ioc_fm_pcd_cc_tree_params_t;

/*
 * @Description   Parameters for defining policer byte rate
 */
typedef struct ioc_fm_pcd_plcr_byte_rate_mode_param_t {
	ioc_fm_pcd_plcr_frame_length_select	frame_length_selection;
			/**< Frame length selection */
	ioc_fm_pcd_plcr_roll_back_frame_select  roll_back_frame_selection;
			/**< relevant option only e_IOC_FM_PCD_PLCR_L2_FRM_LEN,
			 * e_IOC_FM_PCD_PLCR_FULL_FRM_LEN
			 */
} ioc_fm_pcd_plcr_byte_rate_mode_param_t;

/*
 * @Description   Parameters for defining the policer profile (based on
 *		  RFC-2698 or RFC-4115 attributes).
 */
typedef struct ioc_fm_pcd_plcr_non_passthrough_alg_param_t {
	ioc_fm_pcd_plcr_rate_mode		rate_mode;
			/**< Byte / Packet */
	ioc_fm_pcd_plcr_byte_rate_mode_param_t  byte_mode_param;
			/**< Valid for Byte NULL for Packet */
	uint32_t				committed_info_rate;
			/**< KBits/Sec or Packets/Sec */
	uint32_t				committed_burst_size;
			/**< KBits or Packets */
	uint32_t				peak_or_excess_info_rate;
			/**< KBits/Sec or Packets/Sec */
	uint32_t				peak_or_excess_burst_size;
			/**< KBits or Packets */
} ioc_fm_pcd_plcr_non_passthrough_alg_param_t;

/*
 * @Description   Parameters for defining the next engine after policer
 */
typedef union ioc_fm_pcd_plcr_next_engine_params_u {
	ioc_fm_pcd_done_action	action;
				/**< Action - when next engine is BMI (done) */
	void			*p_profile;
				/**< Policer profile handle -  used when next
				 * engine is PLCR, must be a SHARED profile
				 */
	void			*p_direct_scheme;
				/**< Direct scheme select - when next engine is
				 * Keygen
				 */
} ioc_fm_pcd_plcr_next_engine_params_u;

typedef struct ioc_fm_pcd_port_params_t {
	ioc_fm_port_type			port_type;
				/**< Type of port for this profile */
	uint8_t				port_id;
				/**< FM-Port id of port for this profile */
} ioc_fm_pcd_port_params_t;

/*
 * @Description   Parameters for defining the policer profile entry
 *		  (Must match struct ioc_fm_pcd_plcr_profile_params_t defined in
 *		  fm_pcd_ext.h)
 */
struct fm_pcd_plcr_profile_params_t {
	bool modify;
		/**< TRUE to change an existing profile */
	union {
		struct {
			ioc_fm_pcd_profile_type_selection profile_type;
				/**< Type of policer profile */
			ioc_fm_pcd_port_params_t *p_fm_port;
				/**< Relevant for per-port profiles only */
			uint16_t relative_profile_id;
				/**< Profile id - relative to shared group or to
				 * port
				 */
		} new_params;
			/**< Use it when modify = FALSE */
		void *p_profile;
			/**< A handle to a profile - use it when modify=TRUE */
	} profile_select;
	ioc_fm_pcd_plcr_algorithm_selection alg_selection;
	/**< Profile Algorithm PASS_THROUGH, RFC_2698, RFC_4115 */
	ioc_fm_pcd_plcr_color_mode color_mode;
	/**< COLOR_BLIND, COLOR_AWARE */

	union {
		ioc_fm_pcd_plcr_color dflt_color;
		/**< For Color-Blind Pass-Through mode; the policer will
		 * re-color any incoming packet with the default value.
		 */
		ioc_fm_pcd_plcr_color override;
		/**< For Color-Aware modes; the profile response to a pre-color
		 * value of 2'b11.
		 */
	} color;

	ioc_fm_pcd_plcr_non_passthrough_alg_param_t
		non_passthrough_alg_param;
		/**< RFC2698 or RFC4115 parameters */

	ioc_fm_pcd_engine next_engine_on_green;
		/**< Next engine for green-colored frames */
	ioc_fm_pcd_plcr_next_engine_params_u params_on_green;
		/**< Next engine parameters for green-colored frames */

	ioc_fm_pcd_engine next_engine_on_yellow;
		/**< Next engine for yellow-colored frames */
	ioc_fm_pcd_plcr_next_engine_params_u params_on_yellow;
		/**< Next engine parameters for yellow-colored frames */

	ioc_fm_pcd_engine next_engine_on_red;
		/**< Next engine for red-colored frames */
	ioc_fm_pcd_plcr_next_engine_params_u params_on_red;
		/**< Next engine parameters for red-colored frames */

	bool trap_profile_on_flow_A;
		/**< Obsolete - do not use */
	bool trap_profile_on_flow_B;
		/**< Obsolete - do not use */
	bool trap_profile_on_flow_C;
		/**< Obsolete - do not use */
};

typedef struct ioc_fm_pcd_plcr_profile_params_t {
	struct fm_pcd_plcr_profile_params_t param;
	void	*id;
		/**< output parameter; Returns the profile Id to be used */
} ioc_fm_pcd_plcr_profile_params_t;

/*
 * @Description   A structure for modifying CC tree next engine
 */
typedef struct ioc_fm_pcd_cc_tree_modify_next_engine_params_t {
	void				*id;
			/**< CC tree Id to be used */
	uint8_t				grp_indx;
			/**< A Group index in the tree */
	uint8_t				indx;
			/**< Entry index in the group defined by grp_index */
	ioc_fm_pcd_cc_next_engine_params_t  cc_next_engine_params;
			/**< Parameters for the next for the defined Key in the
			 * p_key
			 */
} ioc_fm_pcd_cc_tree_modify_next_engine_params_t;

/*
 * @Description   A structure for modifying CC node next engine
 */
typedef struct ioc_fm_pcd_cc_node_modify_next_engine_params_t {
	void				*id;
			/**< CC node Id to be used */
	uint16_t				key_indx;
			/**< Key index for Next Engine Params modifications;
			 * NOTE: This parameter is IGNORED for miss-key!
			 */
	uint8_t				key_size;
			/**< Key size of added key */
	ioc_fm_pcd_cc_next_engine_params_t  cc_next_engine_params;
			/**< parameters for the next for the defined Key in the
			 * p_key
			 */
} ioc_fm_pcd_cc_node_modify_next_engine_params_t;

/*
 * @Description   A structure for remove CC node key
 */
typedef struct ioc_fm_pcd_cc_node_remove_key_params_t {
	void				*id;
			/**< CC node Id to be used */
	uint16_t				key_indx;
			/**< Key index for Next Engine Params modifications;
			 * NOTE: This parameter is IGNORED for miss-key!
			 */
} ioc_fm_pcd_cc_node_remove_key_params_t;

/*
 * @Description   A structure for modifying CC node key and next engine
 */
typedef struct ioc_fm_pcd_cc_node_modify_key_and_next_engine_params_t {
	void				*id;
			/**< CC node Id to be used */
	uint16_t				key_indx;
			/**< Key index for Next Engine Params modifications;
			 * NOTE: This parameter is IGNORED for miss-key!
			 */
	uint8_t				key_size;
			/**< Key size of added key */
	ioc_fm_pcd_cc_key_params_t	key_params;
			/**< it's array with num_of_keys entries each entry in
			 * the array of the type ioc_fm_pcd_cc_key_params_t
			 */
} ioc_fm_pcd_cc_node_modify_key_and_next_engine_params_t;

/*
 * @Description   A structure for modifying CC node key
 */
typedef struct ioc_fm_pcd_cc_node_modify_key_params_t {
	void				*id;
			/**< CC node Id to be used */
	uint16_t				key_indx;
			/**< Key index for Next Engine Params modifications;
			 * NOTE: This parameter is IGNORED for miss-key!
			 */
	uint8_t				key_size;
			/**< Key size of added key */
	uint8_t				*p_key;
			/**< Pointer to the key of the size defined in key_size
			 */
	uint8_t				*p_mask;
			/**< Pointer to the Mask per key of the size defined in
			 * key_size. p_key and p_mask (if defined) have to be of
			 * the same size as defined in the key_size
			 */
} ioc_fm_pcd_cc_node_modify_key_params_t;

/*
 * @Description   A structure with the arguments for the
 *		  fm_pcd_hash_table_remove_key ioctl() call
 */
typedef struct ioc_fm_pcd_hash_table_remove_key_params_t {
	void	*p_hash_tbl;	/**< The id of the hash table */
	uint8_t	key_size;	/**< The size of the key to remove */
	uint8_t	*p_key;		/**< Pointer to the key to remove */
} ioc_fm_pcd_hash_table_remove_key_params_t;

/*
 * @Description   Parameters for selecting a location for requested manipulation
 */
typedef struct ioc_fm_manip_hdr_info_t {
	ioc_net_header_type		hdr;		/**< Header selection */
	ioc_fm_pcd_hdr_index		hdr_index;
			/**< Relevant only for MPLS, VLAN and tunneled IP.
			 * Otherwise should be cleared.
			 */
	bool				by_field;
			/**< TRUE if the location of manipulation is according
			 * to some field in the specific header
			 */
	ioc_fm_pcd_fields_u		full_field;
			/**< Relevant only when by_field = TRUE: Extract field
			 */
} ioc_fm_manip_hdr_info_t;

/*
 * @Description   Parameters for defining header removal by header type
 */
typedef struct ioc_fm_pcd_manip_hdr_rmv_by_hdr_params_t {
	ioc_fm_pcd_manip_hdr_rmv_by_hdr_type	type;
			/**< Selection of header removal location */
	union {
	ioc_fm_manip_hdr_info_t		hdr_info;
		/**< Relevant when type = e_FM_PCD_MANIP_RMV_BY_HDR_FROM_START
		 */
	ioc_fm_pcd_manip_hdr_rmv_specific_l2	specific_l2;
		/**< Relevant when type = e_IOC_FM_PCD_MANIP_BY_HDR_SPECIFIC_L2;
		 * Defines which L2 headers to remove.
		 */
	} u;
} ioc_fm_pcd_manip_hdr_rmv_by_hdr_params_t;

/*
 * @Description   Parameters for configuring IP fragmentation manipulation
 */
typedef struct ioc_fm_pcd_manip_frag_ip_params_t {
	uint16_t			size_for_fragmentation;
		/**< If length of the frame is greater than this value, IP
		 * fragmentation will be executed.
		 */
	bool			sg_bpid_en;
		/**< Enable a dedicated buffer pool id for the Scatter/Gather
		 * buffer allocation; If disabled, the Scatter/Gather buffer
		 * will be allocated from the same pool as the received frame's
		 * buffer.
		 */
	uint8_t			sg_bpid;
		/**< Scatter/Gather buffer pool id; This parameter is relevant
		 * when 'sg_bpid_en=TRUE'; Same LIODN number is used for these
		 * buffers as for the received frames buffers, so buffers of
		 * this pool need to be allocated in the same memory area as the
		 * received buffers. If the received buffers arrive from
		 * different sources, the Scatter/Gather BP id should be mutual
		 * to all these sources.
		 */
	ioc_fm_pcd_manip_donot_frag_action  donot_frag_action;
		/**< Don't Fragment Action - If an IP packet is larger than MTU
		 * and its DF bit is set, then this field will determine the
		 * action to be taken.
		 */
} ioc_fm_pcd_manip_frag_ip_params_t;

/*
 * @Description   Parameters for configuring IP reassembly manipulation.
 *
 *		  This is a common structure for both IPv4 and IPv6 reassembly
 *		  manipulation. For reassembly of both IPv4 and IPv6, make sure
 *		  to set the 'hdr' field in ioc_fm_pcd_manip_reassem_params_t to
 *		  IOC_header_type_ipv_6.
 */
typedef struct ioc_fm_pcd_manip_reassem_ip_params_t {
	uint8_t			relative_scheme_id[2];
			/**< Partition relative scheme id: relativeSchemeId[0] -
			 * Relative scheme ID for IPV4 Reassembly manipulation;
			 * relativeSchemeId[1] -  Relative scheme ID for IPV6
			 * Reassembly manipulation; NOTE: The following comment
			 * is relevant only for FMAN v2 devices: Relative scheme
			 * ID for IPv4/IPv6 Reassembly manipulation must be
			 * smaller than the user schemes id to ensure that the
			 * reassembly's schemes will be first match. The
			 * remaining schemes, if defined, should have higher
			 * relative scheme ID.
			 */
	uint32_t			non_consistent_sp_fqid;
			/**< In case that other fragments of the frame
			 * corresponds to different storage profile than the
			 * opening fragment (Non-Consistent-SP state) then one
			 * of two possible scenarios occurs: if
			 * 'nonConsistentSpFqid != 0', the reassembled frame
			 * will be enqueued to this fqid, otherwise a 'Non
			 * Consistent SP' bit will be set in the FD[status].
			 */
	uint8_t				data_mem_id;
			/**< Memory partition ID for the IPR's external tables
			 * structure
			 */
	uint16_t			data_liodn_offset;
			/**< LIODN offset for access the IPR's external tables
			 * structure.
			 */
	uint16_t			min_frag_size[2];
			/**< Minimum fragment size: minFragSize[0] - for ipv4,
			 * minFragSize[1] - for ipv6
			 */
	ioc_fm_pcd_manip_reassem_ways_number   num_of_frames_per_hash_entry[2];
			/**< Number of frames per hash entry needed for
			 * reassembly process: num_of_frames_per_hash_entry[0] -
			 * for ipv4 (max value is
			 * e_IOC_FM_PCD_MANIP_EIGHT_WAYS_HASH);
			 * num_of_frames_per_hash_entry[1] - for ipv6 (max value
			 * is e_IOC_FM_PCD_MANIP_SIX_WAYS_HASH).
			 */
	uint16_t			max_num_frames_in_process;
			/**< Number of frames which can be processed by
			 * Reassembly in the same time; Must be power of 2; In
			 * the case num_of_frames_per_hash_entry ==
			 * e_IOC_FM_PCD_MANIP_FOUR_WAYS_HASH,
			 * max_num_frames_in_process has to be in the range of
			 * 4 - 512; In the case num_of_frames_per_hash_entry ==
			 * e_IOC_FM_PCD_MANIP_EIGHT_WAYS_HASH,
			 * max_num_frames_in_process has to be in the range of
			 * 8 - 2048.
			 */
	ioc_fm_pcd_manip_reassem_time_out_mode  time_out_mode;
			/**< Expiration delay initialized by Reassembly process
			 */
	uint32_t			fqid_for_time_out_frames;
			/**< FQID in which time out frames will enqueue during
			 * Time Out Process
			 */
	uint32_t			timeout_threshold_for_reassm_process;
			/**< Represents the time interval in microseconds which
			 * defines if opened frame (at least one fragment was
			 * processed but not all the fragments)is found as too
			 * old
			 */
} ioc_fm_pcd_manip_reassem_ip_params_t;

/*
 * @Description   Parameters for defining IPSEC manipulation
 */
typedef struct ioc_fm_pcd_manip_special_offload_ipsec_params_t {
	bool	decryption;
			/**< TRUE if being used in decryption direction;
			 * FALSE if being used in encryption direction.
			 */
	bool	ecn_copy;
			/**< TRUE to copy the ECN bits from inner/outer to
			 * outer/inner (direction depends on the 'decryption'
			 * field).
			 */
	bool	dscp_copy;
			/**< TRUE to copy the DSCP bits from inner/outer to
			 * outer/inner (direction depends on the 'decryption'
			 * field).
			 */
	bool	variable_ip_hdr_len;
			/**< TRUE for supporting variable IP header length in
			 * decryption.
			 */
	bool	variable_ip_version;
			/**< TRUE for supporting both IP version on the same SA
			 * in encryption
			 */
	uint8_t outer_ip_hdr_len;
			/**< If 'variable_ip_version == TRUE' than this field
			 * must be set to non-zero value; It is specifies the
			 * length of the outer IP header that was configured in
			 * the corresponding SA.
			 */
	uint16_t	arw_size;
			/**< if <> '0' then will perform ARW check for this SA;
			 * The value must be a multiplication of 16
			 */
	void	*arw_addr;
			/**< if arwSize <> '0' then this field must be set to
			 * non-zero value; MUST be allocated from FMAN's MURAM
			 * that the post-sec op-port belong Must be 4B aligned.
			 * Required MURAM size is
			 * '(NEXT_POWER_OF_2(arwSize+32))/8+4' Bytes
			 */
} ioc_fm_pcd_manip_special_offload_ipsec_params_t;

/*
 * @Description   Parameters for configuring CAPWAP fragmentation manipulation
 *
 *		  Restrictions:
 *		  - Maximum number of fragments per frame is 16.
 *		  - Transmit confirmation is not supported.
 *		  - Fragmentation nodes must be set as the last PCD action (i.e.
 *		    the corresponding CC node key must have next engine set to
 *		    e_FM_PCD_DONE).
 *		  - Only BMan buffers shall be used for frames to be fragmented.
 *		  - NOTE: The following comment is relevant only for FMAN v3
 *		    devices: IPF does not support VSP. Therefore, on the same
 *		    port where we have IPF we cannot support VSP.
 */
typedef struct ioc_fm_pcd_manip_frag_capwap_params_t {
	uint16_t	size_for_fragmentation;
			/**< If length of the frame is greater than this value,
			 * CAPWAP fragmentation will be executed.
			 */
	bool		sg_bpid_en;
			/**< Enable a dedicated buffer pool id for the
			 * Scatter/Gather buffer allocation; If disabled, the
			 * Scatter/Gather buffer will be allocated from the same
			 * pool as the received frame's buffer.
			 */
	uint8_t		sg_bpid;
			/**< Scatter/Gather buffer pool id; This parameters is
			 * relevant when 'sg_bpidEn=TRUE'; Same LIODN number is
			 * used for these buffers as for the received frames
			 * buffers, so buffers of this pool need to be allocated
			 * in the same memory area as the received buffers. If
			 * the received buffers arrive from different sources,
			 * the Scatter/Gather BP id should be mutual to all
			 * these sources.
			 */
	bool	compress_mode_en;
			/**< CAPWAP Header Options Compress Enable mode; When
			 * this mode is enabled then only the first fragment
			 * include the CAPWAP header options field (if user
			 * provides it in the input frame) and all other
			 * fragments exclude the CAPWAP options field (CAPWAP
			 * header is updated accordingly).
			 */
} ioc_fm_pcd_manip_frag_capwap_params_t;

/*
 * @Description   Parameters for configuring CAPWAP reassembly manipulation.
 *
 *		  Restrictions:
 *		  - Application must define one scheme to catch the reassembled
 *		    frames.
 *		  - Maximum number of fragments per frame is 16.
 */
typedef struct ioc_fm_pcd_manip_reassem_capwap_params_t {
	uint8_t		relative_scheme_id;
			/**< Partition relative scheme id; NOTE: this id must be
			 * smaller than the user schemes id to ensure that the
			 * reassembly scheme will be first match; Rest schemes,
			 * if defined, should have higher relative scheme ID.
			 */
	uint8_t		data_mem_id;
			/**< Memory partition ID for the IPR's external tables
			 * structure
			 */
	uint16_t	data_liodn_offset;
			/**< LIODN offset for access the IPR's external tables
			 * structure.
			 */
	uint16_t	max_reassembled_frame_length;
			/**< The maximum CAPWAP reassembled frame length in
			 * bytes; If maxReassembledFrameLength == 0, any
			 * successful reassembled frame length is considered as
			 * a valid length; if maxReassembledFrameLength > 0, a
			 * successful reassembled frame which its length exceeds
			 * this value is considered as an error frame (FD
			 * status[CRE] bit is set).
			 */
	ioc_fm_pcd_manip_reassem_ways_number   num_of_frames_per_hash_entry;
			/**< Number of frames per hash entry needed for
			 * reassembly process
			 */
	uint16_t	max_num_frames_in_process;
			/**< Number of frames which can be processed by
			 * reassembly in the same time; Must be power of 2; In
			 * the case num_of_frames_per_hash_entry ==
			 * e_FM_PCD_MANIP_FOUR_WAYS_HASH,
			 * max_num_frames_in_process has to be in the range of
			 * 4 - 512; In the case num_of_frames_per_hash_entry ==
			 * e_FM_PCD_MANIP_EIGHT_WAYS_HASH,
			 * max_num_frames_in_process has to be in the range of
			 * 8 - 2048.
			 */
	ioc_fm_pcd_manip_reassem_time_out_mode  time_out_mode;
			/**< Expiration delay initialized by Reassembly process
			 */
	uint32_t	fqid_for_time_out_frames;
			/**< FQID in which time out frames will enqueue during
			 * Time Out Process; Recommended value for this field is
			 * 0; in this way timed-out frames will be discarded
			 */
	uint32_t	timeout_threshold_for_reassm_process;
			/**< Represents the time interval in microseconds which
			 * defines if opened frame (at least one fragment was
			 * processed but not all the fragments)is found as too
			 * old
			 */
} ioc_fm_pcd_manip_reassem_capwap_params_t;

/*
 * @Description   structure for defining CAPWAP manipulation
 */
typedef struct ioc_fm_pcd_manip_special_offload_capwap_params_t {
	bool			dtls;
			/**< TRUE if continue to SEC DTLS encryption */
	ioc_fm_pcd_manip_hdr_qos_src   qos_src;
			/**< TODO */
} ioc_fm_pcd_manip_special_offload_capwap_params_t;

/*
 * @Description   Parameters for defining special offload manipulation
 */
typedef struct ioc_fm_pcd_manip_special_offload_params_t {
	ioc_fm_pcd_manip_special_offload_type		type;
		/**< Type of special offload manipulation */
	union {
	ioc_fm_pcd_manip_special_offload_ipsec_params_t ipsec;
		/**< Parameters for IPSec; Relevant when type =
		 * e_IOC_FM_PCD_MANIP_SPECIAL_OFFLOAD_IPSEC
		 */

	ioc_fm_pcd_manip_special_offload_capwap_params_t capwap;
		/**< Parameters for CAPWAP; Relevant when type =
		 * e_FM_PCD_MANIP_SPECIAL_OFFLOAD_CAPWAP
		 */
	} u;
} ioc_fm_pcd_manip_special_offload_params_t;

/*
 * @Description   Parameters for defining generic removal manipulation
 */
typedef struct ioc_fm_pcd_manip_hdr_rmv_generic_params_t {
	uint8_t			offset;
		/**< Offset from beginning of header to the start location of
		 * the removal
		 */
	uint8_t			size;	/**< Size of removed section */
} ioc_fm_pcd_manip_hdr_rmv_generic_params_t;

/*
 * @Description   Parameters for defining insertion manipulation
 */
typedef struct ioc_fm_pcd_manip_hdr_insrt_t {
	uint8_t size;		/**< size of inserted section */
	uint8_t *p_data;	/**< data to be inserted */
} ioc_fm_pcd_manip_hdr_insrt_t;

/*
 * @Description   Parameters for defining generic insertion manipulation
 */
typedef struct ioc_fm_pcd_manip_hdr_insrt_generic_params_t {
	uint8_t			offset;
			/**< Offset from beginning of header to the start
			 * location of the insertion
			 */
	uint8_t			size;	/**< Size of inserted section */
	bool			replace;
			/**< TRUE to override (replace) existing data at
			 * 'offset', FALSE to insert
			 */
	uint8_t			*p_data;
			/**< Pointer to data to be inserted */
} ioc_fm_pcd_manip_hdr_insrt_generic_params_t;

/*
 * @Description   Parameters for defining header manipulation VLAN DSCP To Vpri
 *		  translation
 */
typedef struct ioc_fm_pcd_manip_hdr_field_update_vlan_dscp_to_vpri_t {
	uint8_t		dscp_to_vpri_table[IOC_FM_PCD_MANIP_DSCP_TO_VLAN_TRANS];
		/**< A table of VPri values for each DSCP value; The index is
		 * the D_SCP value (0-0x3F) and the value is the corresponding
		 * VPRI (0-15).
		 */
	uint8_t		vpri_def_val;
		/**< 0-7, Relevant only if update_type =
		 * e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN, this field
		 * is the Q Tag default value if the IP header is not found.
		 */
} ioc_fm_pcd_manip_hdr_field_update_vlan_dscp_to_vpri_t;

/*
 * @Description   Parameters for defining header manipulation VLAN fields
 *		  updates
 */
typedef struct ioc_fm_pcd_manip_hdr_field_update_vlan_t {
	ioc_fm_pcd_manip_hdr_field_update_vlan  update_type;
		/**< Selects VLAN update type */
	union {
	uint8_t					vpri;
		/**< 0-7, Relevant only if If update_type =
		 * e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN_PRI, this is the new
		 * VLAN pri.
		 */
	ioc_fm_pcd_manip_hdr_field_update_vlan_dscp_to_vpri_t	dscp_to_vpri;
		/**<  Parameters structure, Relevant only if update_type =
		 * e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_DSCP_TO_VLAN.
		 */
	} u;
} ioc_fm_pcd_manip_hdr_field_update_vlan_t;

/*
 * @Description   Parameters for defining header manipulation IPV4 fields
 *		  updates
 */
typedef struct ioc_fm_pcd_manip_hdr_field_update_ipv4_t {
	ioc_ipv4_hdr_manip_update_flags_t	valid_updates;
			/**< ORed flag, selecting the required updates */
	uint8_t		tos;
			/**< 8 bit New TOS; Relevant if valid_updates contains
			 * IOC_HDR_MANIP_IPV4_TOS
			 */
	uint16_t	id;
			/**< 16 bit New IP ID; Relevant only if
			 * valid_updates contains IOC_HDR_MANIP_IPV4_ID
			 */
	uint32_t	src;
			/**< 32 bit New IP SRC; Relevant only if
			 * valid_updates contains IOC_HDR_MANIP_IPV4_SRC
			 */
	uint32_t	dst;
			/**< 32 bit New IP DST; Relevant only if
			 * valid_updates contains IOC_HDR_MANIP_IPV4_DST
			 */
} ioc_fm_pcd_manip_hdr_field_update_ipv4_t;

/*
 * @Description   Parameters for defining header manipulation IPV6 fields
 *		  updates
 */
typedef struct ioc_fm_pcd_manip_hdr_field_update_ipv6_t {
	ioc_ipv6_hdr_manip_update_flags_t	valid_updates;
			/**< ORed flag, selecting the required updates */
	uint8_t		traffic_class;
			/**< 8 bit New Traffic Class; Relevant if valid_updates
			 * contains IOC_HDR_MANIP_IPV6_TC
			 */
	uint8_t		src[ioc_net_hf_ipv6_addr_size];
			/**< 16 byte new IP SRC; Relevant only if valid_updates
			 * contains IOC_HDR_MANIP_IPV6_SRC
			 */
	uint8_t		dst[ioc_net_hf_ipv6_addr_size];
			/**< 16 byte new IP DST; Relevant only if valid_updates
			 * contains IOC_HDR_MANIP_IPV6_DST
			 */
} ioc_fm_pcd_manip_hdr_field_update_ipv6_t;

/*
 * @Description   Parameters for defining header manipulation TCP/UDP fields
 *		  updates
 */
typedef struct ioc_fm_pcd_manip_hdr_field_update_tcp_udp_t {
	ioc_tcp_udp_hdr_manip_update_flags_t	valid_updates;
			/**< ORed flag, selecting the required updates */
	uint16_t	src;
			/**< 16 bit New TCP/UDP SRC; Relevant only if
			 * valid_updates contains IOC_HDR_MANIP_TCP_UDP_SRC
			 */
	uint16_t	dst;
			/**< 16 bit New TCP/UDP DST; Relevant only if
			 * valid_updates contains IOC_HDR_MANIP_TCP_UDP_DST
			 */
} ioc_fm_pcd_manip_hdr_field_update_tcp_udp_t;

/*
 * @Description   Parameters for defining header manipulation fields updates
 */
typedef struct ioc_fm_pcd_manip_hdr_field_update_params_t {
	ioc_fm_pcd_manip_hdr_field_update_type	type;
			/**< Type of header field update manipulation */
	union {
	ioc_fm_pcd_manip_hdr_field_update_vlan_t	vlan;
			/**< Parameters for VLAN update. Relevant when type =
			 * e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_VLAN
			 */
	ioc_fm_pcd_manip_hdr_field_update_ipv4_t	ipv4;
			/**< Parameters for IPv4 update. Relevant when type =
			 * e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV4
			 */
	ioc_fm_pcd_manip_hdr_field_update_ipv6_t	ipv6;
			/**< Parameters for IPv6 update. Relevant when type =
			 * e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_IPV6
			 */
	ioc_fm_pcd_manip_hdr_field_update_tcp_udp_t tcp_udp;
			/**< Parameters for TCP/UDP update. Relevant when type =
			 * e_IOC_FM_PCD_MANIP_HDR_FIELD_UPDATE_TCP_UDP
			 */
	} u;
} ioc_fm_pcd_manip_hdr_field_update_params_t;

/*
 * @Description   Parameters for defining custom header manipulation for IP
 *		  replacement
 */
typedef struct ioc_fm_pcd_manip_hdr_custom_ip_hdr_replace_t {
	ioc_fm_pcd_manip_hdr_custom_ip_replace  replace_type;
			/**< Selects replace update type */
	bool	dec_ttl_hl;
			/**< Decrement TTL (IPV4) or Hop limit (IPV6) by 1 */
	bool	update_ipv4_id;
			/**< Relevant when replace_type =
			 * e_IOC_FM_PCD_MANIP_HDR_CUSTOM_REPLACE_IPV6_BY_IPV4
			 */
	uint16_t id;
		/**< 16 bit New IP ID; Relevant only if update_ipv4_id = TRUE */
	uint8_t	hdr_size;
			/**< The size of the new IP header */
	uint8_t	hdr[IOC_FM_PCD_MANIP_MAX_HDR_SIZE];
			/**< The new IP header */
} ioc_fm_pcd_manip_hdr_custom_ip_hdr_replace_t;

/*
 * @Description   Parameters for defining custom header manipulation
 */
typedef struct ioc_fm_pcd_manip_hdr_custom_params_t {
	ioc_fm_pcd_manip_hdr_custom_type		type;
			/**< Type of header field update manipulation */
	union {
	ioc_fm_pcd_manip_hdr_custom_ip_hdr_replace_t	ip_hdr_replace;
			/**< Parameters IP header replacement */
	} u;
} ioc_fm_pcd_manip_hdr_custom_params_t;

/*
 * @Description   Parameters for defining specific L2 insertion manipulation
 */
typedef struct ioc_fm_pcd_manip_hdr_insrt_specific_l2_params_t {
	ioc_fm_pcd_manip_hdr_insrt_specific_l2  specific_l2;
			/**< Selects which L2 headers to insert */
	bool					update;
			/**< TRUE to update MPLS header */
	uint8_t				size;
			/**< size of inserted section */
	uint8_t				*p_data;
			/**< data to be inserted */
} ioc_fm_pcd_manip_hdr_insrt_specific_l2_params_t;

/*
 * @Description   Parameters for defining IP insertion manipulation
 */
typedef struct ioc_fm_pcd_manip_hdr_insrt_ip_params_t {
	bool	calc_l4_checksum;
			/**< Calculate L4 checksum. */
	ioc_fm_pcd_manip_hdr_qos_mapping_mode   mapping_mode;
			/**< TODO */
	uint8_t last_pid_offset;
			/**< the offset of the last Protocol within the inserted
			 * header
			 */
	uint16_t  id;	/**< 16 bit New IP ID */
	bool	donot_frag_overwrite;
			/**< IPv4 only. DF is overwritten with the hash-result
			 * next-to-last byte. This byte is configured to be
			 * overwritten when RPD is set.
			 */
	uint8_t	last_dst_offset;
			/**< IPv6 only. if routing extension exist, user should
			 * set the offset of the destination address in order
			 * to calculate UDP checksum pseudo header; Otherwise
			 * set it to '0'.
			 */
	ioc_fm_pcd_manip_hdr_insrt_t insrt;
			/**< size and data to be inserted. */
} ioc_fm_pcd_manip_hdr_insrt_ip_params_t;

/*
 * @Description   Parameters for defining header insertion manipulation by
 *		  header type
 */
typedef struct ioc_fm_pcd_manip_hdr_insrt_by_hdr_params_t {
	ioc_fm_pcd_manip_hdr_insrt_by_hdr_type	type;
			/**< Selects manipulation type */
	union {
	ioc_fm_pcd_manip_hdr_insrt_specific_l2_params_t  specific_l2_params;
			/**< Used when type =
			 * e_IOC_FM_PCD_MANIP_INSRT_BY_HDR_SPECIFIC_L2: Selects
			 * which L2 headers to remove
			 */
	ioc_fm_pcd_manip_hdr_insrt_ip_params_t	ip_params;
			/**< Used when type = e_FM_PCD_MANIP_INSRT_BY_HDR_IP */
	ioc_fm_pcd_manip_hdr_insrt_t		insrt;
			/**< Used when type is one of
			 * e_FM_PCD_MANIP_INSRT_BY_HDR_UDP,
			 * e_FM_PCD_MANIP_INSRT_BY_HDR_UDP_LITE, or
			 * e_FM_PCD_MANIP_INSRT_BY_HDR_CAPWAP
			 */
	} u;
} ioc_fm_pcd_manip_hdr_insrt_by_hdr_params_t;

/*
 * @Description   Parameters for defining header insertion manipulation
 */
typedef struct ioc_fm_pcd_manip_hdr_insrt_params_t {
	ioc_fm_pcd_manip_hdr_insrt_type			type;
			/**< Type of insertion manipulation */
	union {
	ioc_fm_pcd_manip_hdr_insrt_by_hdr_params_t	by_hdr;
			/**< Parameters for defining header insertion
			 * manipulation by header type, relevant if 'type' =
			 * e_IOC_FM_PCD_MANIP_INSRT_BY_HDR
			 */
	ioc_fm_pcd_manip_hdr_insrt_generic_params_t	generic;
			/**< Parameters for defining generic header insertion
			 * manipulation, relevant if type =
			 * e_IOC_FM_PCD_MANIP_INSRT_GENERIC
			 */
	} u;
} ioc_fm_pcd_manip_hdr_insrt_params_t;

/*
 * @Description   Parameters for defining header removal manipulation
 */
typedef struct ioc_fm_pcd_manip_hdr_rmv_params_t {
	ioc_fm_pcd_manip_hdr_rmv_type		type;
			/**< Type of header removal manipulation */
	union {
	ioc_fm_pcd_manip_hdr_rmv_by_hdr_params_t   by_hdr;
			/**< Parameters for defining header removal manipulation
			 * by header type, relevant if type =
			 * e_IOC_FM_PCD_MANIP_RMV_BY_HDR
			 */
	ioc_fm_pcd_manip_hdr_rmv_generic_params_t  generic;
			/**< Parameters for defining generic header removal
			 * manipulation, relevant if type =
			 * e_IOC_FM_PCD_MANIP_RMV_GENERIC
			 */
	} u;
} ioc_fm_pcd_manip_hdr_rmv_params_t;

/*
 * @Description   Parameters for defining header manipulation node
 */
typedef struct ioc_fm_pcd_manip_hdr_params_t {
	bool					rmv;
			/**< TRUE, to define removal manipulation */
	ioc_fm_pcd_manip_hdr_rmv_params_t	rmv_params;
			/**< Parameters for removal manipulation, relevant if
			 * 'rmv' = TRUE
			 */

	bool					insrt;
			/**< TRUE, to define insertion manipulation */
	ioc_fm_pcd_manip_hdr_insrt_params_t	insrt_params;
			/**< Parameters for insertion manipulation, relevant if
			 * 'insrt' = TRUE
			 */

	bool					field_update;
			/**< TRUE, to define field update manipulation */
	ioc_fm_pcd_manip_hdr_field_update_params_t  field_update_params;
			/**< Parameters for field update manipulation, relevant
			 * if 'fieldUpdate' = TRUE
			 */

	bool					custom;
			/**< TRUE, to define custom manipulation */
	ioc_fm_pcd_manip_hdr_custom_params_t	custom_params;
			/**< Parameters for custom manipulation, relevant if
			 * 'custom' = TRUE
			 */

	bool				donot_parse_after_manip;
			/**< FALSE to activate the parser a second time after
			 * completing the manipulation on the frame
			 */
} ioc_fm_pcd_manip_hdr_params_t;

/*
 * @Description   structure for defining fragmentation manipulation
 */
typedef struct ioc_fm_pcd_manip_frag_params_t {
	ioc_net_header_type			hdr;
			/**< Header selection */
	union {
	ioc_fm_pcd_manip_frag_capwap_params_t	capwap_frag;
			/**< Parameters for defining CAPWAP fragmentation,
			 * relevant if 'hdr' = HEADER_TYPE_CAPWAP
			 */
	ioc_fm_pcd_manip_frag_ip_params_t   ip_frag;
			/**< Parameters for defining IP fragmentation, relevant
			 * if 'hdr' = HEADER_TYPE_Ipv4 or HEADER_TYPE_Ipv6
			 */
	} u;
} ioc_fm_pcd_manip_frag_params_t;

/*
 * @Description   structure for defining reassemble manipulation
 */
typedef struct ioc_fm_pcd_manip_reassem_params_t {
	ioc_net_header_type			hdr;
			/**< Header selection */
	union {
	ioc_fm_pcd_manip_reassem_capwap_params_t capwap_reassem;
			/**< Parameters for defining CAPWAP reassembly, relevant
			 * if 'hdr' = HEADER_TYPE_CAPWAP
			 */
	ioc_fm_pcd_manip_reassem_ip_params_t	ip_reassem;
			/**< Parameters for defining IP reassembly, relevant if
			 * 'hdr' = HEADER_TYPE_Ipv4 or HEADER_TYPE_Ipv6
			 */
	} u;
} ioc_fm_pcd_manip_reassem_params_t;

/*
 * @Description   Parameters for defining a manipulation node
 */
struct fm_pcd_manip_params_t {
	ioc_fm_pcd_manip_type type;
		/**< Selects type of manipulation node */
	union {
		ioc_fm_pcd_manip_hdr_params_t hdr;
			/**< Parameters for defining header manipulation node */
		ioc_fm_pcd_manip_reassem_params_t reassem;
			/**< Parameters for defining reassembly manipulation
			 * node
			 */
		ioc_fm_pcd_manip_frag_params_t frag;
			/**< Parameters for defining fragmentation manipulation
			 * node
			 */
		ioc_fm_pcd_manip_special_offload_params_t special_offload;
			/**< Parameters for defining special offload
			 * manipulation node
			 */
	} u;
	void *p_next_manip;
		/**< Handle to another (previously defined) manipulation node;
		 * Allows concatenation of manipulation actions. This parameter
		 * is optional and may be NULL.
		 */
};

typedef struct ioc_fm_pcd_manip_params_t {
	struct fm_pcd_manip_params_t param;
	void *id;
} ioc_fm_pcd_manip_params_t;

/*
 * @Description   Structure for retrieving IP reassembly statistics
 */
typedef struct ioc_fm_pcd_manip_reassem_ip_stats_t {
	/* common counters for both IPv4 and IPv6 */
	uint32_t	timeout;
		/**< Counts the number of TimeOut occurrences */
	uint32_t	rfd_pool_busy;
		/**< Counts the number of failed attempts to allocate a
		 * Reassembly Frame Descriptor
		 */
	uint32_t	internal_buffer_busy;
		/**< Counts the number of times an internal buffer busy occurred
		 */
	uint32_t	external_buffer_busy;
		/**< Counts the number of times external buffer busy occurred */
	uint32_t	sg_fragments;
		/**< Counts the number of Scatter/Gather fragments */
	uint32_t	dma_semaphore_depletion;
		/**< Counts the number of failed attempts to allocate a DMA
		 * semaphore
		 */
	uint32_t	non_consistent_sp;
		/**< Counts the number of Non Consistent Storage Profile events
		 * for successfully reassembled frames
		 */
struct {
	uint32_t	successfully_reassembled;
		/**< Counts the number of successfully reassembled frames */
	uint32_t	valid_fragments;
		/**< Counts the total number of valid fragments that have been
		 * processed for all frames
		 */
	uint32_t	processed_fragments;
		/**< Counts the number of processed fragments (valid and error
		 * fragments) for all frames
		 */
	uint32_t	malformed_fragments;
		/**< Counts the number of malformed fragments processed for all
		 * frames
		 */
	uint32_t	discarded_fragments;
		/**< Counts the number of fragments discarded by the reassembly
		 * process
		 */
	uint32_t	auto_learn_busy;
		/**< Counts the number of times a busy condition occurs when
		 * attempting to access an IP-Reassembly Automatic Learning Hash
		 * set
		 */
	uint32_t	more_than16fragments;
		/**< Counts the fragment occurrences in which the number of
		 * fragments-per-frame exceeds 16
		 */
	} specific_hdr_statistics[2];
		/**< slot '0' is for IPv4, slot '1' is for IPv6 */
} ioc_fm_pcd_manip_reassem_ip_stats_t;

/*
 * @Description   Structure for retrieving IP fragmentation statistics
 */
typedef struct ioc_fm_pcd_manip_frag_ip_stats_t {
	uint32_t	total_frames;
			/**< Number of frames that passed through the
			 * manipulation node
			 */
	uint32_t	fragmented_frames;
			/**< Number of frames that were fragmented */
	uint32_t	generated_fragments;
			/**< Number of fragments that were generated */
} ioc_fm_pcd_manip_frag_ip_stats_t;

/*
 * @Description   Structure for retrieving CAPWAP reassembly statistics
 */
typedef struct ioc_fm_pcd_manip_reassem_capwap_stats_t {
	uint32_t	timeout;
			/**< Counts the number of timeout occurrences */
	uint32_t	rfd_pool_busy;
			/**< Counts the number of failed attempts to allocate a
			 * Reassembly Frame Descriptor
			 */
	uint32_t	internal_buffer_busy;
			/**< Counts the number of times an internal buffer busy
			 * occurred
			 */
	uint32_t	external_buffer_busy;
			/**< Counts the number of times external buffer busy
			 * occurred
			 */
	uint32_t	sg_fragments;
			/**< Counts the number of Scatter/Gather fragments */
	uint32_t	dma_semaphore_depletion;
			/**< Counts the number of failed attempts to allocate a
			 * DMA semaphore
			 */
	uint32_t	successfully_reassembled;
			/**< Counts the number of successfully reassembled
			 * frames
			 */
	uint32_t	valid_fragments;
			/**< Counts the total number of valid fragments that
			 * have been processed for all frames
			 */
	uint32_t	processed_fragments;
			/**< Counts the number of processed fragments (valid and
			 * error fragments) for all frames
			 */
	uint32_t	malformed_fragments;
			/**< Counts the number of malformed fragments processed
			 * for all frames
			 */
	uint32_t	auto_learn_busy;
			/**< Counts the number of times a busy condition occurs
			 * when attempting to access an Reassembly Automatic
			 * Learning Hash set
			 */
	uint32_t	discarded_fragments;
			/**< Counts the number of fragments discarded by the
			 * reassembly process
			 */
	uint32_t	more_than16fragments;
			/**< Counts the fragment occurrences in which the number
			 * of fragments-per-frame exceeds 16
			 */
	uint32_t	exceed_max_reassembly_frame_len;
			/**< ounts the number of times that a successful
			 * reassembled frame length exceeds
			 * MaxReassembledFrameLength value
			 */
} ioc_fm_pcd_manip_reassem_capwap_stats_t;

/*
 * @Description   Structure for retrieving CAPWAP fragmentation statistics
 */
typedef struct ioc_fm_pcd_manip_frag_capwap_stats_t {
	uint32_t	total_frames;
			/**< Number of frames that passed through the
			 * manipulation node
			 */
	uint32_t	fragmented_frames;
			/**< Number of frames that were fragmented */
	uint32_t	generated_fragments;
			/**< Number of fragments that were generated */
#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
	uint8_t	sg_allocation_failure;
			/**< Number of allocation failure of s/g buffers */
#endif /* (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) */
} ioc_fm_pcd_manip_frag_capwap_stats_t;

/*
 * @Description   Structure for retrieving reassembly statistics
 */
typedef struct ioc_fm_pcd_manip_reassem_stats_t {
	union {
	ioc_fm_pcd_manip_reassem_ip_stats_t  ip_reassem;
			/**< Structure for IP reassembly statistics */
	ioc_fm_pcd_manip_reassem_capwap_stats_t  capwap_reassem;
			/**< Structure for CAPWAP reassembly statistics */
	} u;
} ioc_fm_pcd_manip_reassem_stats_t;

/*
 * @Description   structure for retrieving fragmentation statistics
 */
typedef struct ioc_fm_pcd_manip_frag_stats_t {
	union {
	ioc_fm_pcd_manip_frag_ip_stats_t	ip_frag;
			/**< Structure for IP fragmentation statistics */
	ioc_fm_pcd_manip_frag_capwap_stats_t capwap_frag;
			/**< Structure for CAPWAP fragmentation statistics */
	} u;
} ioc_fm_pcd_manip_frag_stats_t;

/*
 * @Description   structure for defining manipulation statistics
 */
typedef struct ioc_fm_pcd_manip_stats_t {
	union {
	ioc_fm_pcd_manip_reassem_stats_t  reassem;
				/**< Structure for reassembly statistics */
	ioc_fm_pcd_manip_frag_stats_t	frag;
				/**< Structure for fragmentation statistics */
	} u;
} ioc_fm_pcd_manip_stats_t;

/*
 * @Description   Parameters for acquiring manipulation statistics
 */
typedef struct ioc_fm_pcd_manip_get_stats_t {
	void				*id;
	ioc_fm_pcd_manip_stats_t	stats;
} ioc_fm_pcd_manip_get_stats_t;

/*
 * @Description   Parameters for defining frame replicator group and its members
 */
struct fm_pcd_frm_replic_group_params_t {
	uint8_t			max_num_of_entries;
				/**< Maximal number of members in the group -
				 * must be at least two
				 */
	uint8_t			num_of_entries;
				/**< Number of members in the group - must be at
				 * least 1
				 */
	ioc_fm_pcd_cc_next_engine_params_t
		next_engine_params[IOC_FM_PCD_FRM_REPLIC_MAX_NUM_OF_ENTRIES];
				/**< Array of members' parameters */
};

typedef struct ioc_fm_pcd_frm_replic_group_params_t {
	struct fm_pcd_frm_replic_group_params_t param;
	void *id;
} ioc_fm_pcd_frm_replic_group_params_t;

typedef struct ioc_fm_pcd_frm_replic_member_t {
	void *h_replic_group;
	uint16_t member_index;
} ioc_fm_pcd_frm_replic_member_t;

typedef struct ioc_fm_pcd_frm_replic_member_params_t {
	ioc_fm_pcd_frm_replic_member_t member;
	ioc_fm_pcd_cc_next_engine_params_t next_engine_params;
} ioc_fm_pcd_frm_replic_member_params_t;


typedef struct ioc_fm_pcd_cc_key_statistics_t {
	uint32_t	byte_count;
			/**< This counter reflects byte count of frames that
			 * were matched by this key.
			 */
	uint32_t	frame_count;
			/**< This counter reflects count of frames that were
			 * matched by this key.
			 */
	uint32_t	frame_length_range_count[IOC_FM_PCD_CC_STATS_MAX_FLR];
			/**< These counters reflect how many frames matched this
			 * key in 'RMON' statistics mode: Each counter holds the
			 * number of frames of a specific frames length range,
			 * according to the ranges provided at initialization.
			 */
} ioc_fm_pcd_cc_key_statistics_t;


typedef struct ioc_fm_pcd_cc_tbl_get_stats_t {
	void				*id;
	uint16_t			key_index;
	ioc_fm_pcd_cc_key_statistics_t  statistics;
} ioc_fm_pcd_cc_tbl_get_stats_t;

/*
 * @Function	  fm_pcd_match_table_get_key_statistics
 *
 * @Description   This routine may be used to get statistics counters of
 *		  specific key in a CC Node.
 *
 *		  If 'e_FM_PCD_CC_STATS_MODE_FRAME' and
 *		  'e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME' were set for this
 *		  node, these counters reflect how many frames passed that were
 *		  matched this key; The total frames count will be returned in
 *		  the counter of the first range (as only one frame length range
 *		  was defined). If 'e_FM_PCD_CC_STATS_MODE_RMON' was set for
 *		  this node, the total frame count will be separated to frame
 *		  length counters, based on provided frame length ranges.
 *
 * @Param[in]	  h_cc_node		A handle to the node
 * @Param[in]	  key_index		Key index for adding
 * @Param[out]	  p_key_statistics	Key statistics counters
 *
 * @Return	  The specific key statistics.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set().
 */
#define FM_PCD_IOC_MATCH_TABLE_GET_KEY_STAT \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(12), \
		      ioc_fm_pcd_cc_tbl_get_stats_t)

/*
 * @Function	  fm_pcd_match_table_get_miss_statistics
 *
 * @Description   This routine may be used to get statistics counters of miss
 *		  entry in a CC Node.
 *
 *		  If 'e_FM_PCD_CC_STATS_MODE_FRAME' and
 *		  'e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME' were set for this
 *		  node, these counters reflect how many frames were not matched
 *		  to any existing key and therefore passed through the miss
 *		  entry; The total frames count will be returned in the counter
 *		  of the first range (as only one frame length range was
 *		  defined).
 *
 * @Param[in]	  h_cc_node		A handle to the node
 * @Param[out]	  p_miss_statistics	Statistics counters for 'miss'
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set().
 */

#define FM_PCD_IOC_MATCH_TABLE_GET_MISS_STAT \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(13), \
		      ioc_fm_pcd_cc_tbl_get_stats_t)

/*
 * @Function	  fm_pcd_hash_table_get_miss_statistics
 *
 * @Description   This routine may be used to get statistics counters of 'miss'
 *		  entry of the a hash table.
 *
 *		  If 'e_FM_PCD_CC_STATS_MODE_FRAME' and
 *		  'e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME' were set for this
 *		  node, these counters reflect how many frames were not matched
 *		  to any existing key and therefore passed through the miss
 *		  entry;
 *
 * @Param[in]	  h_hash_tbl		A handle to a hash table
 * @Param[out]	  p_miss_statistics	Statistics counters for 'miss'
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set().
 */
#define FM_PCD_IOC_HASH_TABLE_GET_MISS_STAT \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(14), \
		      ioc_fm_pcd_cc_tbl_get_stats_t)

/*
 * @Function	  fm_pcd_net_env_characteristics_set
 *
 * @Description   Define a set of Network Environment Characteristics.
 *
 *		  When setting an environment it is important to understand its
 *		  application. It is not meant to describe the flows that will
 *		  run on the ports using this environment, but what the user
 *		  means TO DO with the PCD mechanisms in order to
 *		  parse-classify-distribute those frames.
 *		  By specifying a distinction unit, the user means it would use
 *		  that option for distinction between frames at either a KeyGen
 *		  scheme or a coarse classification action descriptor. Using
 *		  interchangeable headers to define a unit means that the user
 *		  is indifferent to which of the interchangeable headers is
 *		  present in the frame, and wants the distinction to be based on
 *		  the presence of either one of them.
 *
 *		  Depending on context, there are limitations to the use of
 *		  environments. A port using the PCD functionality is bound to
 *		  an environment. Some or even all ports may share an
 *		  environment but also an environment per port is possible. When
 *		  initializing a scheme, a classification plan group (see
 *		  below), or a coarse classification tree, one of the
 *		  initialized environments must be stated and related to. When a
 *		  port is bound to a scheme, a classification plan group, or a
 *		  coarse classification tree, it MUST be bound to the same
 *		  environment.
 *
 *		  The different PCD modules, may relate (for flows definition)
 *		  ONLY on distinction units as defined by their environment.
 *		  When initializing a scheme for example, it may not choose to
 *		  select IPV4 as a match for recognizing flows unless it was
 *		  defined in the relating environment. In fact, to guide the
 *		  user through the configuration of the PCD, each module's
 *		  characterization in terms of flows is not done using protocol
 *		  names, but using environment indexes.
 *
 *		  In terms of HW implementation, the list of distinction units
 *		  sets the LCV vectors and later used for match vector,
 *		  classification plan vectors and coarse classification
 *		  indexing.
 *
 * @Param[in,out] ioc_fm_pcd_net_env_params_t	A structure defining the
 *						distinction units for this
 *						configuration.
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_NET_ENV_CHARACTERISTICS_SET \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(20), \
		      ioc_fm_pcd_net_env_params_t)

/*
 * @Function	  fm_pcd_net_env_characteristics_delete
 *
 * @Description   Deletes a set of Network Environment Characteristics.
 *
 * @Param[in]	  ioc_fm_obj_t		The id of a Network Environment object.
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_NET_ENV_CHARACTERISTICS_DELETE \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(21), ioc_fm_obj_t)

/*
 * @Function	  fm_pcd_kg_scheme_set
 *
 * @Description   Initializing or modifying and enabling a scheme for the
 *		  KeyGen. This routine should be called for adding or modifying
 *		  a scheme. When a scheme needs modifying, the API requires that
 *		  it will be rewritten. In such a case 'modify' should be TRUE.
 *		  If the routine is called for a valid scheme and 'modify' is
 *		  FALSE, it will return error.
 *
 * @Param[in,out] ioc_fm_pcd_kg_scheme_params_t		A structure of
 *							parameters for defining
 *							the scheme
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_KG_SCHEME_SET \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(24), \
		      ioc_fm_pcd_kg_scheme_params_t)

/*
 * @Function	  fm_pcd_kg_scheme_delete
 *
 * @Description   Deleting an initialized scheme.
 *
 * @Param[in]	  ioc_fm_obj_t	scheme id as initialized by application at
 *				FM_PCD_IOC_KG_SET_SCHEME
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_KG_SCHEME_DELETE \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(25), ioc_fm_obj_t)

/*
 * @Function	  fm_pcd_cc_root_build
 *
 * @Description   This routine must be called to define a complete coarse
 *		  classification tree. This is the way to define coarse
 *		  classification to a certain flow - the KeyGen schemes may
 *		  point only to trees defined in this way.
 *
 * @Param[in,out] ioc_fm_pcd_cc_tree_params_t	A structure of parameters to
 *						define the tree.
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_CC_ROOT_BUILD \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(26), void *)
		/* workaround ...*/

/*
 * @Function	  fm_pcd_cc_root_delete
 *
 * @Description   Deleting a built tree.
 *
 * @Param[in]	  ioc_fm_obj_t - The id of a CC tree.
 */
#define FM_PCD_IOC_CC_ROOT_DELETE \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(27), ioc_fm_obj_t)

/*
 * @Function	  fm_pcd_match_table_set
 *
 * @Description   This routine should be called for each CC (coarse
 *		  classification) node. The whole CC tree should be built bottom
 *		  up so that each node points to already defined nodes. p_NodeId
 *		  returns the node Id to be used by other nodes.
 *
 * @Param[in,out] ioc_fm_pcd_cc_node_params_t	A structure for defining the CC
 *						node params
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_MATCH_TABLE_SET \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(28), void *)
		/* workaround ...*/

/*
 * @Function	  fm_pcd_match_table_delete
 *
 * @Description   Deleting a built node.
 *
 * @Param[in]	  ioc_fm_obj_t - The id of a CC node.
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_MATCH_TABLE_DELETE \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(29), ioc_fm_obj_t)

/*
 * @Function	  fm_pcd_cc_root_modify_next_engine
 *
 * @Description   Modify the Next Engine Parameters in the entry of the tree.
 *
 * @Param[in]	  ioc_fm_pcd_cc_tree_modify_next_engine_params_t
 *		  Pointer to a structure with the relevant parameters
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_cc_root_build().
 */
#define FM_PCD_IOC_CC_ROOT_MODIFY_NEXT_ENGINE \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(30), \
		     ioc_fm_pcd_cc_tree_modify_next_engine_params_t)

/*
 * @Function	  fm_pcd_match_table_modify_next_engine
 *
 * @Description   Modify the Next Engine Parameters in the relevant key entry of
 *		  the node.
 *
 * @Param[in]	  ioc_fm_pcd_cc_node_modify_next_engine_params_t
 *		  A pointer to a structure with the relevant parameters
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set().
 */
#define FM_PCD_IOC_MATCH_TABLE_MODIFY_NEXT_ENGINE \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(31), \
		     ioc_fm_pcd_cc_node_modify_next_engine_params_t)

/*
 * @Function	  fm_pcd_match_table_modify_miss_next_engine
 *
 * @Description   Modify the Next Engine Parameters of the Miss key case of the
 *		  node.
 *
 * @Param[in]	  ioc_fm_pcd_cc_node_modify_next_engine_params_t
 *		  Pointer to a structure with the relevant parameters
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set().
 */
#define FM_PCD_IOC_MATCH_TABLE_MODIFY_MISS_NEXT_ENGINE \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(32), \
		     ioc_fm_pcd_cc_node_modify_next_engine_params_t)

/*
 * @Function	  fm_pcd_match_table_remove_key
 *
 * @Description   Remove the key (including next engine parameters of this key)
 *		  defined by the index of the relevant node.
 *
 * @Param[in]	  ioc_fm_pcd_cc_node_remove_key_params_t
 *		  A pointer to a structure with the relevant parameters
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only after fm_pcd_match_table_set() has been called
 *		  for this node and for all of the nodes that lead to it.
 */
#define FM_PCD_IOC_MATCH_TABLE_REMOVE_KEY \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(33), \
		     ioc_fm_pcd_cc_node_remove_key_params_t)

/*
 * @Function	  fm_pcd_match_table_add_key
 *
 * @Description   Add the key (including next engine parameters of this key in
 *		  the index defined by the key_index. Note that
 *		  'FM_PCD_LAST_KEY_INDEX' may be used when the user don't care
 *		  about the position of the key in the table - in that case, the
 *		  key will be automatically added by the driver in the last
 *		  available entry.
 *
 * @Param[in]	  ioc_fm_pcd_cc_node_modify_key_and_next_engine_params_t
 *		  A pointer to a structure with the relevant parameters
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only after fm_pcd_match_table_set() has been called
 *		  for this node and for all of the nodes that lead to it.
 */
#define FM_PCD_IOC_MATCH_TABLE_ADD_KEY \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(34), \
		     ioc_fm_pcd_cc_node_modify_key_and_next_engine_params_t)

/*
 * @Function	  fm_pcd_match_table_modify_key_and_next_engine
 *
 * @Description   Modify the key and Next Engine Parameters of this key in the
 *		  index defined by key_index.
 *
 * @Param[in]	  ioc_fm_pcd_cc_node_modify_key_and_next_engine_params_t
 *		  A pointer to a structure with the relevant parameters
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set() not only of
 *		  the relevant node but also the node that points to this node.
 */
#define FM_PCD_IOC_MATCH_TABLE_MODIFY_KEY_AND_NEXT_ENGINE \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(35), \
		     ioc_fm_pcd_cc_node_modify_key_and_next_engine_params_t)

/*
 * @Function	  fm_pcd_match_table_modify_key
 *
 * @Description   Modify the key at the index defined by key_index.
 *
 * @Param[in]	  ioc_fm_pcd_cc_node_modify_key_params_t - Pointer to a
 * structure with the relevant parameters
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only after fm_pcd_match_table_set() has been called
 *		  for this node and for all of the nodes that lead to it.
 */
#define FM_PCD_IOC_MATCH_TABLE_MODIFY_KEY \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(36), \
		     ioc_fm_pcd_cc_node_modify_key_params_t)

/*
 * @Function	  fm_pcd_hash_table_set
 *
 * @Description   This routine initializes a hash table structure.
 *		  KeyGen hash result determines the hash bucket.
 *		  Next, KeyGen key is compared against all keys of this bucket
 *		  (exact match).
 *		  Number of sets (number of buckets) of the hash equals to the
 *		  number of 1-s in 'hash_res_mask' in the provided parameters.
 *		  Number of hash table ways is then calculated by dividing
 *		  'max_num_of_keys' equally between the hash sets. This is the
 *		  maximal number of keys that a hash bucket may hold.
 *		  The hash table is initialized empty and keys may be added to
 *		  it following the initialization. Keys masks are not supported
 *		  in current hash table implementation. The initialized hash
 *		  table can be integrated as a node in a CC tree.
 *
 * @Param[in,out] ioc_fm_pcd_hash_table_params_t	Pointer to a structure
 *							with the relevant
 *							parameters.
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_HASH_TABLE_SET \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(37), \
		      ioc_fm_pcd_hash_table_params_t)

/*
 * @Function	  fm_pcd_hash_table_delete
 *
 * @Description   This routine deletes the provided hash table and released all
 *		  its allocated resources.
 *
 * @Param[in]	  ioc_fm_obj_t		The ID of a hash table.
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	Allowed only following fm_pcd_hash_table_set().
 */
#define FM_PCD_IOC_HASH_TABLE_DELETE \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(37), ioc_fm_obj_t)

/*
 * @Function	  fm_pcd_hash_table_add_key
 *
 * @Description   This routine adds the provided key (including next engine
 *		  parameters of this key) to the hash table.
 *		  The key is added as the last key of the bucket that it is
 *		  mapped to.
 *
 * @Param[in]	  ioc_fm_pcd_hash_table_add_key_params_t
 *		  Pointer to a structure with the relevant parameters
 *
 * @Return	  0 on success; error code otherwise.
 *
 * @Cautions	Allowed only following fm_pcd_hash_table_set().
 */
#define FM_PCD_IOC_HASH_TABLE_ADD_KEY \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(39), \
		     ioc_fm_pcd_hash_table_add_key_params_t)

/*
 * @Function	  fm_pcd_hash_table_remove_key
 *
 * @Description   This routine removes the requested key (including next engine
 *		  parameters of this key) from the hash table.
 *
 * @Param[in]	  ioc_fm_pcd_hash_table_remove_key_params_t - Pointer to a
 *		  structure with the relevant parameters
 *
 * @Return	  0 on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set().
 */
#define FM_PCD_IOC_HASH_TABLE_REMOVE_KEY \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(40), \
		     ioc_fm_pcd_hash_table_remove_key_params_t)

/*
 * @Function	  fm_pcd_plcr_profile_set
 *
 * @Description   Sets a profile entry in the policer profile table.
 *		  The routine overrides any existing value.
 *
 * @Param[in,out] ioc_fm_pcd_plcr_profile_params_t	A structure of
 *							parameters for defining
 *							a policer profile entry.
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_PLCR_PROFILE_SET \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(41), \
		      ioc_fm_pcd_plcr_profile_params_t)

/*
 * @Function	  fm_pcd_plcr_profile_delete
 *
 * @Description   Delete a profile entry in the policer profile table.
 *		  The routine set entry to invalid.
 *
 * @Param[in]	  ioc_fm_obj_t		The id of a policer profile.
 *
 * @Return	  0 on success; Error code otherwise.
 */
#define FM_PCD_IOC_PLCR_PROFILE_DELETE  \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(41), ioc_fm_obj_t)

/*
 * @Function	  fm_pcd_manip_node_set
 *
 * @Description   This routine should be called for defining a manipulation
 *		  node. A manipulation node must be defined before the CC node
 *		  that precedes it.
 *
 * @Param[in]	  ioc_fm_pcd_manip_params_t	A structure of parameters
 *						defining the manipulation.
 *
 * @Return	  A handle to the initialized object on success; NULL code
 *		  otherwise.
 */
#define FM_PCD_IOC_MANIP_NODE_SET \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(43), \
		      ioc_fm_pcd_manip_params_t)

/*
 * @Function	  fm_pcd_manip_node_replace
 *
 * @Description   Change existing manipulation node to be according to new
 *		  requirement. (Here, it's implemented as a variant of the same
 *		  IOCTL as for fm_pcd_manip_node_set(), and one that when
 *		  called, the 'id' member in its 'ioc_fm_pcd_manip_params_t'
 *		  argument is set to contain the manip node's handle)
 *
 * @Param[in]	  ioc_fm_pcd_manip_params_t	A structure of parameters
 *						defining the manipulation.
 *
 * @Return	  0 on success; error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_manip_node_set().
 */
#define FM_PCD_IOC_MANIP_NODE_REPLACE	FM_PCD_IOC_MANIP_NODE_SET

/*
 * @Function	  fm_pcd_manip_node_delete
 *
 * @Description   Delete an existing manipulation node.
 *
 * @Param[in]	  ioc_fm_obj_t	The id of the manipulation node to delete.
 *
 * @Return	  0 on success; error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_manip_node_set().
 */
#define FM_PCD_IOC_MANIP_NODE_DELETE \
		_IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(44), ioc_fm_obj_t)

/*
 * @Function	  fm_pcd_manip_get_statistics
 *
 * @Description   Retrieve the manipulation statistics.
 *
 * @Param[in]	  h_manip_node		A handle to a manipulation node.
 * @Param[out]	  p_fm_pcd_manip_stats	A structure for retrieving the
 *					manipulation statistics.
 *
 * @Return	E_OK on success; Error code otherwise.
 *
 * @Cautions	Allowed only following fm_pcd_manip_node_set().
 */
#define FM_PCD_IOC_MANIP_GET_STATS \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(50), \
		      ioc_fm_pcd_manip_get_stats_t)

/*
 * @Function	  fm_pcd_set_advanced_offload_support
 *
 * @Description   This routine must be called in order to support the following
 *		  features: IP-fragmentation, IP-reassembly, IPsec,
 *		  Header-manipulation, frame-replicator.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 *
 * @Return	  0 on success; error code otherwise.
 *
 * @Cautions	  Allowed only when PCD is disabled.
 */
#define FM_PCD_IOC_SET_ADVANCED_OFFLOAD_SUPPORT \
		_IO(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(45))

/*
 * @Function	  fm_pcd_frm_replic_set_group
 *
 * @Description   Initialize a Frame Replicator group.
 *
 * @Param[in]	  h_fm_pcd			FM PCD module descriptor.
 * @Param[in]	  p_frm_replic_group_param	A structure of parameters for
 *						the initialization of the frame
 *						replicator group.
 *
 * @Return	  A handle to the initialized object on success; NULL code
 *		  otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
#define FM_PCD_IOC_FRM_REPLIC_GROUP_SET \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(46), \
		      ioc_fm_pcd_frm_replic_group_params_t)

/*
 * @Function	  fm_pcd_frm_replic_delete_group
 *
 * @Description   Delete a Frame Replicator group.
 *
 * @Param[in]	  h_frm_replic_group  A handle to the frame replicator group.
 *
 * @Return	  E_OK on success;  Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_frm_replic_set_group().
 */
#define FM_PCD_IOC_FRM_REPLIC_GROUP_DELETE \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(47), ioc_fm_obj_t)

/*
 * @Function	  fm_pcd_frm_replic_add_member
 *
 * @Description   Add the member in the index defined by the member_index.
 *
 * @Param[in]	  h_frm_replic_group	A handle to the frame replicator group.
 * @Param[in]	  member_index		Member index for adding.
 * @Param[in]	  p_member_params	A pointer to the new member parameters.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_frm_replic_set_group() of this
 *		  group.
 */
#define FM_PCD_IOC_FRM_REPLIC_MEMBER_ADD \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(48), \
			ioc_fm_pcd_frm_replic_member_params_t)

/*
 * @Function	  fm_pcd_frm_replic_remove_member
 *
 * @Description   Remove the member defined by the index from the relevant group
 *
 * @Param[in]	  h_frm_replic_group	A handle to the frame replicator group.
 * @Param[in]	  member_index		Member index for removing.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_frm_replic_set_group() of this
 *		  group.
 */
#define FM_PCD_IOC_FRM_REPLIC_MEMBER_REMOVE \
		_IOWR(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(49), \
		      ioc_fm_pcd_frm_replic_member_t)

/*
 * @Group	  FM_grp Frame Manager API
 *
 * @Description   Frame Manager Application Programming Interface
 *
 * @{
 */

/*
 * @Group	  FM_PCD_grp FM PCD
 *
 * @Description   Frame Manager PCD (Parse-Classify-Distribute) API.
 *
 *		  The FM PCD module is responsible for the initialization of all
 *		  global classifying FM modules. This includes the parser
 *		  general and common registers, the key generator global and
 *		  common registers, and the policer global and common registers.
 *		  In addition, the FM PCD SW module will initialize all required
 *		  key generator schemes, coarse classification flows, and
 *		  policer profiles. When FM module is configured to work with
 *		  one of these entities, it will register to it using the FM
 *		  PORT API. The PCD module will manage the PCD resources - i.e.
 *		  resource management of KeyGen schemes, etc.
 *
 * @{
 */

/*
 * @Collection	  General PCD defines
 */
#define FM_PCD_MAX_NUM_OF_PRIVATE_HDRS		2
/**< Number of units/headers saved for user */

#define FM_PCD_PRS_NUM_OF_HDRS			16
/**< Number of headers supported by HW parser */
#define FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS \
		(32 - FM_PCD_MAX_NUM_OF_PRIVATE_HDRS)
/**< Number of distinction units is limited by register size (32 bits) minus
 *reserved bits for private headers.
 */
#define FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS	4
/**< Maximum number of interchangeable headers in a distinction unit */
#define FM_PCD_KG_NUM_OF_GENERIC_REGS		FM_KG_NUM_OF_GENERIC_REGS
/**< Total number of generic KeyGen registers */
#define FM_PCD_KG_MAX_NUM_OF_EXTRACTS_PER_KEY	35
/**< Max number allowed on any configuration; For HW implementation reasons, in
 * most cases less than this will be allowed; The driver will return an
 * initialization error if resource is unavailable.
 */
#define FM_PCD_KG_NUM_OF_EXTRACT_MASKS		4
/**< Total number of masks allowed on KeyGen extractions. */
#define FM_PCD_KG_NUM_OF_DEFAULT_GROUPS		16
/**< Number of default value logical groups */

#define FM_PCD_PRS_NUM_OF_LABELS			32
/**< Maximum number of SW parser labels */
#define FM_SW_PRS_MAX_IMAGE_SIZE \
	(FM_PCD_SW_PRS_SIZE \
	 /*- FM_PCD_PRS_SW_OFFSET -FM_PCD_PRS_SW_TAIL_SIZE*/ \
	 - FM_PCD_PRS_SW_PATCHES_SIZE)
/**< Maximum size of SW parser code */

#define FM_PCD_MAX_MANIP_INSRT_TEMPLATE_SIZE	128
/**< Maximum size of insertion template for insert manipulation */

#define FM_PCD_FRM_REPLIC_MAX_NUM_OF_ENTRIES	64
/**< Maximum possible entries for frame replicator group */
/* @} */

/*
 * @Group	  FM_PCD_init_grp FM PCD Initialization Unit
 *
 * @Description   Frame Manager PCD Initialization Unit API
 *
 * @{
 */

/*
 * @Description   Exceptions user callback routine, will be called upon an
 *		  exception passing the exception identification.
 *
 * @Param[in]	  h_app		User's application descriptor.
 * @Param[in]	  exception	The exception.
 */
typedef void (t_fm_pcd_exception_callback) (t_handle h_app,
					ioc_fm_pcd_exceptions exception);

/*
 * @Description   Exceptions user callback routine, will be called upon an
 *		  exception passing the exception identification.
 *
 * @Param[in]	  h_app		User's application descriptor.
 * @Param[in]	  exception	The exception.
 * @Param[in]	  index		id of the relevant source (may be scheme or
 *				profile id).
 */
typedef void (t_fm_pcd_id_exception_callback) (t_handle	h_app,
					ioc_fm_pcd_exceptions  exception,
					uint16_t	index);

/*
 * @Description   A callback for enqueuing frame onto a QM queue.
 *
 * @Param[in]	  h_qm_arg	Application's handle passed to QM module on
 *				enqueue.
 * @Param[in]	  p_fd		Frame descriptor for the frame.
 *
 * @Return	  E_OK on success; Error code otherwise.
 */
typedef uint32_t (t_fm_pcd_qm_enqueue_callback) (t_handle h_qm_arg, void *p_fd);

/*
 * @Description   Host-Command parameters structure.
 *
 *		  When using Host command for PCD functionalities, a dedicated
 *		  port must be used. If this routine is called for a PCD in a
 *		  single partition environment, or it is the Master partition in
 *		  a Multi-partition environment, The port will be initialized by
 *		  the PCD driver initialization routine.
 */
typedef struct t_fm_pcd_hc_params {
	uintptr_t		port_base_addr;
	/**< Virtual Address of Host-Command Port memory mapped registers.*/
	uint8_t			port_id;
	/**< Port Id (0-6 relative to Host-Command/Offline-Parsing ports);
	 * NOTE: When configuring Host Command port for FMANv3 devices
	 * (DPAA_VERSION 11 and higher), port_id=0 MUST be used.
	 */
	uint16_t			liodn_base;
	/**< LIODN base for this port, to be used together with LIODN offset
	 * (irrelevant for P4080 revision 1.0)
	 */
	uint32_t			err_fqid;
	/**< Host-Command Port error queue Id. */
	uint32_t			conf_fqid;
	/**< Host-Command Port confirmation queue Id. */
	uint32_t			qm_channel;
	/**< QM channel dedicated to this Host-Command port; will be used by the
	 * FM for dequeue.
	 */
	t_fm_pcd_qm_enqueue_callback	*f_qm_enqueue;
	/**< Callback routine for enqueuing a frame to the QM */
	t_handle			h_qm_arg;
	/**< Application's handle passed to QM module on enqueue */
} t_fm_pcd_hc_params;

/*
 * @Description   The main structure for PCD initialization
 */
typedef struct t_fm_pcd_params {
	bool			prs_support;
	/**< TRUE if Parser will be used for any of the FM ports. */
	bool			cc_support;
	/**< TRUE if Coarse Classification will be used for any of the FM ports.
	 */
	bool			kg_support;
	/**< TRUE if KeyGen will be used for any of the FM ports. */
	bool			plcr_support;
	/**< TRUE if Policer will be used for any of the FM ports. */
	t_handle		h_fm;
	/**< A handle to the FM module. */
	uint8_t			num_schemes;
	/**< Number of schemes dedicated to this partition.
	 * this parameter is relevant if 'kg_support'=TRUE.
	 */
	bool			use_host_command;
	/**< Optional for single partition, Mandatory for Multi partition */
	t_fm_pcd_hc_params		hc;
	/**< Host Command parameters, relevant only if 'use_host_command'=TRUE;
	 * Relevant when FM not runs in "guest-mode".
	 */
	t_fm_pcd_exception_callback	*f_exception;
	/**< Callback routine for general PCD exceptions; Relevant when FM not
	 * runs in "guest-mode".
	 */
	t_fm_pcd_id_exception_callback	*f_exception_id;
	/**< Callback routine for specific KeyGen scheme or Policer profile
	 * exceptions; Relevant when FM not runs in "guest-mode".
	 */
	t_handle		h_app;
	/**< A handle to an application layer object; This handle will be passed
	 * by the driver upon calling the above callbacks; Relevant when FM not
	 * runs in "guest-mode".
	 */
	uint8_t			part_plcr_profiles_base;
	/**< The first policer-profile-id dedicated to this partition. this
	 * parameter is relevant if 'plcr_support'=TRUE. NOTE: this parameter
	 * relevant only when working with multiple partitions.
	 */
	uint16_t		part_num_of_plcr_profiles;
	/**< Number of policer-profiles dedicated to this partition. This
	 * parameter is relevant if 'plcr_support'=TRUE. NOTE: this parameter
	 * relevant only when working with multiple partitions.
	 */
} t_fm_pcd_params;

typedef struct t_fm_pcd_prs_label_params {
	uint32_t instruction_offset;
	ioc_net_header_type hdr;
	uint8_t index_per_hdr;
} t_fm_pcd_prs_label_params;

typedef struct t_fm_pcd_prs_sw_params {
	bool override;
	uint32_t size;
	uint16_t base;
	uint8_t *p_code;
	uint32_t sw_prs_data_params[FM_PCD_PRS_NUM_OF_HDRS];
	uint8_t num_of_labels;
	t_fm_pcd_prs_label_params labels_table[FM_PCD_PRS_NUM_OF_LABELS];
} t_fm_pcd_prs_sw_params;

/*
 * @Function	  fm_pcd_config
 *
 * @Description   Basic configuration of the PCD module.
 *		  Creates descriptor for the FM PCD module.
 *
 * @Param[in]	  p_fm_pcd_params	A structure of parameters for the
					initialization of PCD.
 *
 * @Return	  A handle to the initialized module.
 */
t_handle fm_pcd_config(t_fm_pcd_params *p_fm_pcd_params);

/*
 * @Function	  fm_pcd_init
 *
 * @Description   Initialization of the PCD module.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 *
 * @Return	  E_OK on success; Error code otherwise.
 */
uint32_t fm_pcd_init(t_handle h_fm_pcd);

/*
 * @Function	  fm_pcd_free
 *
 * @Description   Frees all resources that were assigned to FM module.
 *		  Calling this routine invalidates the descriptor.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 *
 * @Return	  E_OK on success; Error code otherwise.
 */
uint32_t fm_pcd_free(t_handle h_fm_pcd);

/*
 * @Group	  FM_PCD_advanced_cfg_grp	FM PCD Advanced Configuration
 *						Unit
 *
 * @Description   Frame Manager PCD Advanced Configuration API.
 *
 * @{
 */

/*
 * @Function	  fm_pcd_config_exception
 *
 * @Description   Calling this routine changes the internal driver data base
 *		  from its default selection of exceptions enabling.
 *		  [DEFAULT_num_of_shared_plcr_profiles].
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  exception	The exception to be selected.
 * @Param[in]	  enable	TRUE to enable interrupt, FALSE to mask it.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  This routine should NOT be called from guest-partition (i.e.
 *		  guestId != NCSW_PRIMARY_ID)
 */
uint32_t fm_pcd_config_exception(t_handle h_fm_pcd,
		ioc_fm_pcd_exceptions exception, bool enable);

/*
 * @Function	  fm_pcd_config_hc_frames_data_memory
 *
 * @Description   Configures memory-partition-id for FMan-Controller
 *		  Host-Command frames. Calling this routine changes the internal
 *		  driver data base from its default configuration [0].
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  mem_id	Memory partition ID.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  This routine may be called only if 'use_host_command' was TRUE
 *		  when fm_pcd_config() routine was called.
 */
uint32_t fm_pcd_config_hc_frames_data_memory(t_handle h_fm_pcd, uint8_t mem_id);

/*
 * @Function	  fm_pcd_config_plcr_num_of_shared_profiles
 *
 * @Description   Calling this routine changes the internal driver data base
 *		  from its default selection of exceptions enablement.
 *		  [DEFAULT_num_of_shared_plcr_profiles].
 *
 * @Param[in]	  h_fm_pcd			FM PCD module descriptor.
 * @Param[in]	  num_of_shared_plcr_profiles	Number of profiles to be shared
 *						between ports on this partition
 *
 * @Return	  E_OK on success; Error code otherwise.
 */
uint32_t fm_pcd_config_plcr_num_of_shared_profiles(t_handle h_fm_pcd,
		uint16_t num_of_shared_plcr_profiles);

/*
 * @Function	  fm_pcd_config_plcr_auto_refresh_mode
 *
 * @Description   Calling this routine changes the internal driver data base
 *		  from its default selection of exceptions enablement. By
 *		  default auto-refresh is [DEFAULT_plcrAutoRefresh].
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  enable	TRUE to enable, FALSE to disable
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  This routine should NOT be called from guest-partition
 *		  (i.e. guestId != NCSW_PRIMARY_ID)
 */
uint32_t fm_pcd_config_plcr_auto_refresh_mode(t_handle h_fm_pcd, bool enable);

/*
 * @Function	  fm_pcd_config_prs_max_cycle_limit
 *
 * @Description   Calling this routine changes the internal data structure for
 *		  the maximum parsing time from its default value
 *		  [DEFAULT_MAX_PRS_CYC_LIM].
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  value		0 to disable the mechanism, or new maximum
 *				parsing time.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  This routine should NOT be called from guest-partition
 *		  (i.e. guestId != NCSW_PRIMARY_ID)
 */
uint32_t fm_pcd_config_prs_max_cycle_limit(t_handle h_fm_pcd, uint16_t value);

/** @} */ /* end of FM_PCD_advanced_cfg_grp group */
/** @} */ /* end of FM_PCD_init_grp group */

/*
 * @Group	  FM_PCD_Runtime_grp FM PCD Runtime Unit
 *
 * @Description   Frame Manager PCD Runtime Unit API
 *
 *		  The runtime control allows creation of PCD infrastructure
 *		  modules such as Network Environment Characteristics,
 *		  Classification Plan Groups and Coarse Classification Trees.
 *		  It also allows on-the-fly initialization, modification and
 *		  removal of PCD modules such as KeyGen schemes, coarse
 *		  classification nodes and Policer profiles.
 *
 *		  In order to explain the programming model of the PCD driver
 *		  interface a few terms should be explained, and will be used
 *		  below.
 *		  - Distinction Header - One of the 16 protocols supported by
 *		    the FM parser, or one of the SHIM headers (1 or 2). May be a
 *		    header with a special option (see below).
 *		  - Interchangeable Headers Group - This is a group of Headers
 *		    recognized by either one of them. For example, if in a
 *		    specific context the user chooses to treat IPv4 and IPV6 in
 *		    the same way, they may create an interchangeable Headers
 *		    Unit consisting of these 2 headers.
 *		  - A Distinction Unit - a Distinction Header or an
 *		    Interchangeable Headers Group.
 *		  - Header with special option - applies to Ethernet, MPLS,
 *		    VLAN, IPv4 and IPv6, includes multicast, broadcast and other
 *		    protocol specific options. In terms of hardware it relates
 *		    to the options available in the classification plan.
 *		  - Network Environment Characteristics - a set of Distinction
 *		    Units that define the total recognizable header selection
 *		    for a certain environment. This is NOT the list of all
 *		    headers that will ever appear in a flow, but rather
 *		    everything that needs distinction in a flow, where
 *		    distinction is made by KeyGen schemes and coarse
 *		    classification action descriptors.
 *
 *		  The PCD runtime modules initialization is done in stages. The
 *		  first stage after initializing the PCD module itself is to
 *		  establish a Network Flows Environment Definition. The
 *		  application may choose to establish one or more such
 *		  environments. Later, when needed, the application will have to
 *		  state, for some of its modules, to which single environment it
 *		  belongs.
 *
 * @{
 */

t_handle fm_pcd_open(t_fm_pcd_params *p_fm_pcd_params);
void fm_pcd_close(t_handle h_fm_pcd);

/*
 * @Function	  fm_pcd_enable
 *
 * @Description   This routine should be called after PCD is initialized for
 *		  enabling all PCD engines according to their existing
 *		  configuration.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init() and when PCD is disabled.
 */
uint32_t fm_pcd_enable(t_handle h_fm_pcd);

/*
 * @Function	  fm_pcd_disable
 *
 * @Description   This routine may be called when PCD is enabled in order to
 *		  disable all PCD engines. It may be called only when none of
 *		  the ports in the system are using the PCD.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init() and when PCD is enabled.
 */
uint32_t fm_pcd_disable(t_handle h_fm_pcd);

/*
 * @Function	  fm_pcd_get_counter
 *
 * @Description   Reads one of the FM PCD counters.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  counter	The requested counter.
 *
 * @Return	  Counter's current value.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 *		  Note that it is user's responsibility to call this routine
 *		  only for enabled counters, and there will be no indication if
 *		  a disabled counter is accessed.
 */
uint32_t fm_pcd_get_counter(t_handle h_fm_pcd, ioc_fm_pcd_counters counter);

/*
 * @Function	fm_pcd_prs_load_sw
 *
 * @Description	This routine may be called in order to load software parsing
 *		code.
 *
 * @Param[in]	h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	p_sw_prs	A pointer to a structure of software
 *				parser parameters, including the software
 *				parser image.
 *
 * @Return	E_OK on success; Error code otherwise.
 *
 * @Cautions	Allowed only following fm_pcd_init() and when PCD is disabled.
 *		This routine should NOT be called from guest-partition
 *		(i.e. guestId != NCSW_PRIMARY_ID)
 */
uint32_t fm_pcd_prs_load_sw(t_handle h_fm_pcd,
		ioc_fm_pcd_prs_sw_params_t *p_sw_prs);

/*
 * @Function	  fm_pcd_set_advanced_offload_support
 *
 * @Description   This routine must be called in order to support the following
 *		  features: IP-fragmentation, IP-reassembly, IPsec,
 *		  Header-manipulation, frame-replicator.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init() and when PCD is disabled.
 *		  This routine should NOT be called from guest-partition
 *		  (i.e. guestId != NCSW_PRIMARY_ID)
 */
uint32_t fm_pcd_set_advanced_offload_support(t_handle h_fm_pcd);

/*
 * @Function	  fm_pcd_kg_set_dflt_value
 *
 * @Description   Calling this routine sets a global default value to be used
 *		  by the KeyGen when parser does not recognize a required
 *		  field/header.
 *		  default value is 0.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  value_id	0,1 - one of 2 global default values.
 * @Param[in]	  value		The requested default value.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init() and when PCD is disabled.
 *		  This routine should NOT be called from guest-partition
 *		  (i.e. guestId != NCSW_PRIMARY_ID)
 */
uint32_t fm_pcd_kg_set_dflt_value(t_handle h_fm_pcd,
		uint8_t value_id, uint32_t value);

/*
 * @Function	  fm_pcd_kg_set_additional_data_after_parsing
 *
 * @Description   Calling this routine allows the KeyGen to access data past
 *		  the parser finishing point.
 *
 * @Param[in]	  h_fm_pcd		FM PCD module descriptor.
 * @Param[in]	  payload_offset	the number of bytes beyond the parser
 *					location.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init() and when PCD is disabled.
 *		  This routine should NOT be called from guest-partition (i.e.
 *		  guestId != NCSW_PRIMARY_ID)
 */
uint32_t fm_pcd_kg_set_additional_data_after_parsing(t_handle h_fm_pcd,
		uint8_t payload_offset);

/*
 * @Function	  fm_pcd_set_exception
 *
 * @Description   Calling this routine enables/disables PCD interrupts.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  exception	The exception to be selected.
 * @Param[in]	  enable	TRUE to enable interrupt, FALSE to mask it.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 *		  This routine should NOT be called from guest-partition
 *		  (i.e. guestId != NCSW_PRIMARY_ID)
 */
uint32_t fm_pcd_set_exception(t_handle h_fm_pcd,
		ioc_fm_pcd_exceptions exception, bool enable);

/*
 * @Function	  fm_pcd_modify_counter
 *
 * @Description   Sets a value to an enabled counter. Use "0" to reset the
 *		  counter.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  counter	The requested counter.
 * @Param[in]	  value		The requested value to be written into the
 *				counter.
 *
 * @Return	E_OK on success; Error code otherwise.
 *
 * @Cautions	Allowed only following fm_pcd_init().
 *		This routine should NOT be called from guest-partition
 *		(i.e. guestId != NCSW_PRIMARY_ID)
 */
uint32_t fm_pcd_modify_counter(t_handle h_fm_pcd,
		ioc_fm_pcd_counters counter, uint32_t value);

/*
 * @Function	  fm_pcd_set_plcr_statistics
 *
 * @Description   This routine may be used to enable/disable policer statistics
 *		  counter. By default the statistics is enabled.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor
 * @Param[in]	  enable	TRUE to enable, FALSE to disable.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 *		  This routine should NOT be called from guest-partition
 *		  (i.e. guestId != NCSW_PRIMARY_ID)
 */
uint32_t fm_pcd_set_plcr_statistics(t_handle h_fm_pcd, bool enable);

/*
 * @Function	  fm_pcd_set_prs_statistics
 *
 * @Description   Defines whether to gather parser statistics including all
 *		  ports.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  enable	TRUE to enable, FALSE to disable.
 *
 * @Return	  None
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 *		  This routine should NOT be called from guest-partition
 *		  (i.e. guestId != NCSW_PRIMARY_ID)
 */
void fm_pcd_set_prs_statistics(t_handle h_fm_pcd, bool enable);

#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
/*
 * @Function	  fm_pcd_dump_regs
 *
 * @Description   Dumps all PCD registers
 *
 * @Param[in]	  h_fm_pcd	A handle to an FM PCD Module.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 *		  NOTE: this routine may be called only for FM in master mode
 *		  (i.e. 'guestId'=NCSW_PRIMARY_ID) or in a case that the
 *		  registers are mapped.
 */
uint32_t fm_pcd_dump_regs(t_handle h_fm_pcd);

/*
 * @Function	  fm_pcd_kg_dump_regs
 *
 * @Description   Dumps all PCD KG registers
 *
 * @Param[in]	  h_fm_pcd	A handle to an FM PCD Module.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 *		  NOTE: this routine may be called only for FM in master mode
 *		  (i.e. 'guestId'=NCSW_PRIMARY_ID) or in a case that the
 *		  registers are mapped.
 */
uint32_t fm_pcd_kg_dump_regs(t_handle h_fm_pcd);

/*
 * @Function	  fm_pcd_plcr_dump_regs
 *
 * @Description   Dumps all PCD Policer registers
 *
 * @Param[in]	  h_fm_pcd	A handle to an FM PCD Module.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 *		  NOTE: this routine may be called only for FM in master mode
 *		  (i.e. 'guestId'=NCSW_PRIMARY_ID) or in a case that the
 *		  registers are mapped.
 */
uint32_t fm_pcd_plcr_dump_regs(t_handle h_fm_pcd);

/*
 * @Function	  fm_pcd_plcr_profile_dump_regs
 *
 * @Description   Dumps all PCD Policer profile registers
 *
 * @Param[in]	  h_profile	A handle to a Policer profile.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 *		  NOTE: this routine may be called only for FM in master mode
 *		  (i.e. 'guestId'=NCSW_PRIMARY_ID) or in a case that the
 *		  registers are mapped.
 */
uint32_t fm_pcd_plcr_profile_dump_regs(t_handle h_profile);

/*
 * @Function	  fm_pcd_prs_dump_regs
 *
 * @Description   Dumps all PCD Parser registers
 *
 * @Param[in]	  h_fm_pcd	A handle to an FM PCD Module.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 *		  NOTE: this routine may be called only for FM in master mode
 *		  (i.e. 'guestId'=NCSW_PRIMARY_ID) or in a case that the
 *		  registers are mapped.
 */
uint32_t fm_pcd_prs_dump_regs(t_handle h_fm_pcd);

/*
 * @Function	  fm_pcd_hc_dump_regs
 *
 * @Description   Dumps HC Port registers
 *
 * @Param[in]	  h_fm_pcd	A handle to an FM PCD Module.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 *		  NOTE: this routine may be called only for FM in master mode
 *		  (i.e. 'guestId'=NCSW_PRIMARY_ID).
 */
uint32_t	fm_pcd_hc_dump_regs(t_handle h_fm_pcd);
#endif /* (defined(DEBUG_ERRORS) && ... */


/*
 * KeyGen	  FM_PCD_Runtime_build_grp FM PCD Runtime Building Unit
 *
 * @Description   Frame Manager PCD Runtime Building API
 *
 *		  This group contains routines for setting, deleting and
 *		  modifying PCD resources, for defining the total PCD tree.
 * @{
 */

/*
 * @Collection	  Definitions of coarse classification
 *		  parameters as required by KeyGen (when coarse classification
 *		  is the next engine after this scheme).
 */
#define FM_PCD_MAX_NUM_OF_CC_TREES		8
#define FM_PCD_MAX_NUM_OF_CC_GROUPS		16
#define FM_PCD_MAX_NUM_OF_CC_UNITS		4
#define FM_PCD_MAX_NUM_OF_KEYS		256
#define FM_PCD_MAX_NUM_OF_FLOWS		(4 * KILOBYTE)
#define FM_PCD_MAX_SIZE_OF_KEY		56
#define FM_PCD_MAX_NUM_OF_CC_ENTRIES_IN_GRP	16
#define FM_PCD_LAST_KEY_INDEX		0xffff

#define FM_PCD_MAX_NUM_OF_CC_NODES	255
			/* Obsolete, not used - will be removed in the future */
/* @} */

/*
 * @Collection	  A set of definitions to allow protocol
 *		  special option description.
 */
typedef uint32_t	protocol_opt_t;
			/**< A general type to define a protocol option. */

typedef protocol_opt_t   eth_protocol_opt_t;
			/**< Ethernet protocol options. */
#define ETH_BROADCAST		0x80000000  /**< Ethernet Broadcast. */
#define ETH_MULTICAST		0x40000000  /**< Ethernet Multicast. */

typedef protocol_opt_t   vlan_protocol_opt_t;	/**< VLAN protocol options. */
#define VLAN_STACKED		0x20000000  /**< Stacked VLAN. */

typedef protocol_opt_t   mpls_protocol_opt_t;	/**< MPLS protocol options. */
#define MPLS_STACKED		0x10000000  /**< Stacked MPLS. */

typedef protocol_opt_t   ipv_4protocol_opt_t;	/**< IPv4 protocol options. */
#define IPV4_BROADCAST_1		0x08000000  /**< IPv4 Broadcast. */
#define IPV4_MULTICAST_1		0x04000000  /**< IPv4 Multicast. */
#define IPV4_UNICAST_2		0x02000000  /**< Tunneled IPv4 - Unicast. */
#define IPV4_MULTICAST_BROADCAST_2  0x01000000
				/**< Tunneled IPv4 - Broadcast/Multicast. */

#define IPV4_FRAG_1		0x00000008
				/**< IPV4 reassembly option. IPV4 Reassembly
				 * manipulation requires network environment
				 * with IPV4 header and IPV4_FRAG_1 option
				 */

typedef protocol_opt_t   ipv_6protocol_opt_t;	/**< IPv6 protocol options. */
#define IPV6_MULTICAST_1	0x00800000  /**< IPv6 Multicast. */
#define IPV6_UNICAST_2		0x00400000  /**< Tunneled IPv6 - Unicast. */
#define IPV6_MULTICAST_2	0x00200000  /**< Tunneled IPv6 - Multicast. */

#define IPV6_FRAG_1		0x00000004
				/**< IPV6 reassembly option. IPV6 Reassembly
				 * manipulation requires network environment
				 * with IPV6 header and IPV6_FRAG_1 option; in
				 * case where fragment found, the
				 * fragment-extension offset may be found at
				 * 'shim2' (in parser-result).
				 */
typedef protocol_opt_t   capwap_protocol_opt_t;	/**< CAPWAP protocol options. */
#define CAPWAP_FRAG_1		0x00000008
				/**< CAPWAP reassembly option. CAPWAP Reassembly
				 * manipulation requires network environment
				 * with CAPWAP header and CAPWAP_FRAG_1 option;
				 * in case where fragment found, the
				 * fragment-extension offset may be found at
				 * 'shim2' (in parser-result).
				 */

/* @} */

#define FM_PCD_MANIP_MAX_HDR_SIZE	256
#define FM_PCD_MANIP_DSCP_TO_VLAN_TRANS	64

/*
 * @Collection	  A set of definitions to support Header Manipulation selection.
 */
typedef uint32_t		hdr_manip_flags_t;
		/**< A general type to define a HMan update command flags. */

typedef hdr_manip_flags_t	ipv_4hdr_manip_update_flags_t;
		/**< IPv4 protocol HMan update command flags. */

#define HDR_MANIP_IPV4_TOS	0x80000000
			/**< update TOS with the given value ('tos' field
			 * of t_FmPcdManipHdrFieldUpdateIpv4)
			 */
#define HDR_MANIP_IPV4_ID	0x40000000
			/**< update IP ID with the given value ('id' field
			 * of t_FmPcdManipHdrFieldUpdateIpv4)
			 */
#define HDR_MANIP_IPV4_TTL	0x20000000
			/**< Decrement TTL by 1 */
#define HDR_MANIP_IPV4_SRC	0x10000000
			/**< update IP source address with the given value
			 * ('src' field of t_FmPcdManipHdrFieldUpdateIpv4)
			 */
#define HDR_MANIP_IPV4_DST	0x08000000
			/**< update IP destination address with the given value
			 * ('dst' field of t_FmPcdManipHdrFieldUpdateIpv4)
			 */

typedef hdr_manip_flags_t	ipv_6hdr_manip_update_flags_t;
			/**< IPv6 protocol HMan update command flags. */

#define HDR_MANIP_IPV6_TC	0x80000000
			/**< update Traffic Class address with the given value
			 * ('trafficClass' field of
			 * t_FmPcdManipHdrFieldUpdateIpv6)
			 */
#define HDR_MANIP_IPV6_HL	0x40000000
			/**< Decrement Hop Limit by 1 */
#define HDR_MANIP_IPV6_SRC	0x20000000
			/**< update IP source address with the given value
			 * ('src' field of t_FmPcdManipHdrFieldUpdateIpv6)
			 */
#define HDR_MANIP_IPV6_DST	0x10000000
			/**< update IP destination address with the given value
			 * ('dst' field of t_FmPcdManipHdrFieldUpdateIpv6)
			 */

typedef hdr_manip_flags_t	tcp_udp_hdr_manip_update_flags_t;
		/**< TCP/UDP protocol HMan update command flags. */

#define HDR_MANIP_TCP_UDP_SRC	0x80000000
		/**< update TCP/UDP source address with the given value
		 * ('src' field of t_FmPcdManipHdrFieldUpdateTcpUdp)
		 */
#define HDR_MANIP_TCP_UDP_DST	0x40000000
		/**< update TCP/UDP destination address with the given value
		 * ('dst' field of t_FmPcdManipHdrFieldUpdateTcpUdp)
		 */
#define HDR_MANIP_TCP_UDP_CHECKSUM  0x20000000
		/**< update TCP/UDP checksum */

/* @} */

/*
 * @Description   A type used for returning the order of the key extraction.
 *		  each value in this array represents the index of the
 *		  extraction command as defined by the user in the
 *		  initialization extraction array. The valid size of this array
 *		  is the user define number of extractions required (also marked
 *		  by the second '0' in this array).
 */
typedef	uint8_t	t_fm_pcd_kg_key_order[FM_PCD_KG_MAX_NUM_OF_EXTRACTS_PER_KEY];

/*
 * @Collection	  Definitions for CC statistics
 */
#define FM_PCD_CC_STATS_MAX_NUM_OF_FLR	10
	/* Maximal supported number of frame length ranges */
#define FM_PCD_CC_STATS_FLR_SIZE	2
	/* Size in bytes of a frame length range limit */
#define FM_PCD_CC_STATS_COUNTER_SIZE	4
	/* Size in bytes of a frame length range counter */
/* @} */

/*
 * @Description   Parameters for defining CC keys parameters
 *		  The driver supports two methods for CC node allocation:
 *		  dynamic and static. Static mode was created in order to
 *		  prevent runtime alloc/free of FMan memory (MURAM), which may
 *		  cause fragmentation; in this mode, the driver automatically
 *		  allocates the memory according to 'max_num_of_keys' parameter.
 *		  The driver calculates the maximal memory size that may be used
 *		  for this CC-Node taking into consideration 'mask_support' and
 *		  'statistics_mode' parameters. When 'action' =
 *		  e_FM_PCD_ACTION_INDEXED_LOOKUP in the extraction parameters of
 *		  this node, 'max_num_of_keys' must be equal to 'num_of_keys'.
 *		  In dynamic mode, 'max_num_of_keys' must be zero. At
 *		  initialization, all required structures are allocated
 *		  according to 'num_of_keys' parameter. During runtime
 *		  modification, these structures are re-allocated according to
 *		  the updated number of keys.
 *
 *		  Please note that 'action' and 'icIndxMask' mentioned in the
 *		  specific parameter explanations are passed in the extraction
 *		  parameters of the node (fields of
 *		  extractCcParams.extractNonHdr).
 */
typedef struct t_keys_params {
	uint16_t	max_num_of_keys;
		/**< Maximum number of keys that will (ever) be used in this
		 * CC-Node; A value of zero may be used for dynamic memory
		 * allocation.
		 */
	bool		mask_support;
		/**< This parameter is relevant only if a node is initialized
		 * with 'action' = e_FM_PCD_ACTION_EXACT_MATCH and
		 * max_num_of_keys > 0; Should be TRUE to reserve table memory
		 * for key masks, even if initial keys do not contain masks, or
		 * if the node was initialized as 'empty' (without keys); this
		 * will allow user to add keys with masks at runtime.
		 * NOTE that if user want to use only global-masks (i.e. one
		 * common mask for all the entries within this table, this
		 * parameter should set to 'FALSE'.
		 */
	ioc_fm_pcd_cc_stats_mode	statistics_mode;
		/**< Determines the supported statistics mode for all node's
		 * keys. To enable statistics gathering, statistics should be
		 * enabled per every key, using 'statisticsEn' in next engine
		 * parameters structure of that key; If 'max_num_of_keys' is
		 * set, all required structures will be preallocated for all
		 * keys.
		 */
	uint16_t	frame_length_ranges[FM_PCD_CC_STATS_MAX_NUM_OF_FLR];
		/**< Relevant only for 'RMON' statistics mode (this feature is
		 * supported only on B4860 device); Holds a list of programmable
		 * thresholds - for each received frame, its length in bytes is
		 * examined against these range thresholds and the appropriate
		 * counter is incremented by 1 - for example, to belong to range
		 * i, the following should hold: range i-1 threshold < frame
		 * length <= range i threshold. Each range threshold must be
		 * larger then its preceding range threshold, and last range
		 * threshold must be 0xFFFF.
		 */
	uint16_t	num_of_keys;
		/**< Number of initial keys; Note that in case of 'action' =
		 * e_FM_PCD_ACTION_INDEXED_LOOKUP, this field should be
		 * power-of-2 of the number of bits that are set in 'icIndxMask'
		 */
	uint8_t		key_size;
		/**< Size of key - for extraction of type FULL_FIELD, 'key_size'
		 * has to be the standard size of the selected key; For other
		 * extraction types, 'key_size' has to be as size of extraction;
		 * When 'action' = e_FM_PCD_ACTION_INDEXED_LOOKUP, 'key_size'
		 * must be 2.
		 */
	ioc_fm_pcd_cc_key_params_t	key_params[FM_PCD_MAX_NUM_OF_KEYS];
		/**< An array with 'num_of_keys' entries, each entry specifies
		 * the corresponding key parameters; When 'action' =
		 * e_FM_PCD_ACTION_EXACT_MATCH, this value must not exceed 255
		 * (FM_PCD_MAX_NUM_OF_KEYS-1) as the last entry is saved for the
		 * 'miss' entry.
		 */
	ioc_fm_pcd_cc_next_engine_params_t   cc_next_engine_params_for_miss;
		/**< Parameters for defining the next engine when a key is not
		 * matched; Not relevant if action =
		 * e_FM_PCD_ACTION_INDEXED_LOOKUP.
		 */
} t_keys_params;

/*
 * @Description   Parameters for defining custom header manipulation for generic
 *		  field replacement
 */
typedef struct ioc_fm_pcd_manip_hdr_custom_gen_field_replace {
	uint8_t		src_offset;
			/**< Location of new data - Offset from Parse Result
			 * (>= 16, src_offset+size <= 32, )
			 */
	uint8_t		dst_offset;
			/**< Location of data to be overwritten - Offset from
			 * start of frame (dst_offset + size <= 256).
			 */
	uint8_t		size;
			/**< The number of bytes (<=16) to be replaced */
	uint8_t		mask;
			/**< Optional 1 byte mask. Set to select bits for
			 * replacement (1 - bit will be replaced); Clear to use
			 * field as is.
			 */
	uint8_t		mask_offset;
			/**< Relevant if mask != 0; Mask offset within the
			 * replaces "size"
			 */
} ioc_fm_pcd_manip_hdr_custom_gen_field_replace;

/*
 * @Function	  fm_pcd_net_env_characteristics_set
 *
 * @Description   Define a set of Network Environment Characteristics.
 *
 *		  When setting an environment it is important to understand its
 *		  application. It is not meant to describe the flows that will
 *		  run on the ports using this environment, but what the user
 *		  means TO DO with the PCD mechanisms in order to
 *		  parse-classify-distribute those frames.
 *		  By specifying a distinction unit, the user means it would use
 *		  that option for distinction between frames at either a KeyGen
 *		  scheme or a coarse classification action descriptor. Using
 *		  interchangeable headers to define a unit means that the user
 *		  is indifferent to which of the interchangeable headers is
 *		  present in the frame, and wants the distinction to be based on
 *		  the presence of either one of them.
 *
 *		  Depending on context, there are limitations to the use of
 *		  environments. A port using the PCD functionality is bound to
 *		  an environment. Some or even all ports may share an
 *		  environment but also an environment per port is possible. When
 *		  initializing a scheme, a classification plan group (see
 *		  below), or a coarse classification tree, one of the
 *		  initialized environments must be stated and related to. When a
 *		  port is bound to a scheme, a classification plan group, or a
 *		  coarse classification tree, it MUST be bound to the same
 *		  environment.
 *
 *		  The different PCD modules, may relate (for flows definition)
 *		  ONLY on distinction units as defined by their environment.
 *		  When initializing a scheme for example, it may not choose to
 *		  select IPV4 as a match for recognizing flows unless it was
 *		  defined in the relating environment. In fact, to guide the
 *		  user through the configuration of the PCD, each module's
 *		  characterization in terms of flows is not done using protocol
 *		  names, but using environment indexes.
 *
 *		  In terms of HW implementation, the list of distinction units
 *		  sets the LCV vectors and later used for match vector,
 *		  classification plan vectors and coarse classification
 *		  indexing.
 *
 * @Param[in]	  h_fm_pcd		FM PCD module descriptor.
 * @Param[in]	  p_netenv_params	A structure of parameters for the
 *					initialization of the network
 *					environment.
 *
 * @Return	  A handle to the initialized object on success; NULL code
 *		  otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
t_handle fm_pcd_net_env_characteristics_set(t_handle h_fm_pcd,
				 ioc_fm_pcd_net_env_params_t *p_netenv_params);

/*
 * @Function	  fm_pcd_net_env_characteristics_delete
 *
 * @Description   Deletes a set of Network Environment Characteristics.
 *
 * @Param[in]	  h_net_env	A handle to the Network environment.
 *
 * @Return	  E_OK on success; Error code otherwise.
 */
uint32_t fm_pcd_net_env_characteristics_delete(t_handle h_net_env);

/*
 * @Function	  fm_pcd_kg_scheme_set
 *
 * @Description   Initializing or modifying and enabling a scheme for the
 *		  KeyGen. This routine should be called for adding or modifying
 *		  a scheme. When a scheme needs modifying, the API requires that
 *		  it will be rewritten. In such a case 'modify' should be TRUE.
 *		  If the routine is called for a valid scheme and 'modify' is
 *		  FALSE, it will return error.
 *
 * @Param[in]	  h_fm_pcd		If this is a new scheme - A handle to an
 *					FM PCD Module. Otherwise NULL (ignored
 *					by driver).
 * @Param[in,out] p_scheme_params	A structure of parameters for defining
 *					the scheme
 *
 * @Return	  A handle to the initialized scheme on success; NULL code
 *		  otherwise. When used as "modify" (rather than for setting a
 *		  new scheme), p_scheme_params->id.h_scheme will return NULL if
 *		  action fails due to scheme BUSY state.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
t_handle fm_pcd_kg_scheme_set(t_handle h_fm_pcd,
			    ioc_fm_pcd_kg_scheme_params_t *p_scheme_params);

/*
 * @Function	  fm_pcd_kg_scheme_delete
 *
 * @Description   Deleting an initialized scheme.
 *
 * @Param[in]	  h_scheme	scheme handle as returned by
 *				fm_pcd_kg_scheme_set()
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init() & fm_pcd_kg_scheme_set().
 */
uint32_t	fm_pcd_kg_scheme_delete(t_handle h_scheme);

/*
 * @Function	  fm_pcd_kg_scheme_get_counter
 *
 * @Description   Reads scheme packet counter.
 *
 * @Param[in]	  h_scheme	scheme handle as returned by
 *				fm_pcd_kg_scheme_set().
 *
 * @Return	  Counter's current value.
 *
 * @Cautions	  Allowed only following fm_pcd_init() & fm_pcd_kg_scheme_set().
 */
uint32_t  fm_pcd_kg_scheme_get_counter(t_handle h_scheme);

/*
 * @Function	  fm_pcd_kg_scheme_set_counter
 *
 * @Description   Writes scheme packet counter.
 *
 * @Param[in]	  h_scheme	scheme handle as returned by
 *				fm_pcd_kg_scheme_set().
 * @Param[in]	  value		New scheme counter value - typically '0' for
 *				resetting the counter.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init() & fm_pcd_kg_scheme_set().
 */
uint32_t  fm_pcd_kg_scheme_set_counter(t_handle h_scheme,
			uint32_t value);

/*
 * @Function	  fm_pcd_plcr_profile_set
 *
 * @Description   Sets a profile entry in the policer profile table.
 *		  The routine overrides any existing value.
 *
 * @Param[in]	  h_fm_pcd	A handle to an FM PCD Module.
 * @Param[in]	  p_profile	A structure of parameters for defining a
 *				policer profile entry.
 *
 * @Return	  A handle to the initialized object on success; NULL code
 *		  otherwise. When used as "modify" (rather than for setting a
 *		  new profile), p_profile->id.h_profile will return NULL if
 *		  action fails due to profile BUSY state.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
t_handle fm_pcd_plcr_profile_set(t_handle h_fm_pcd,
			       ioc_fm_pcd_plcr_profile_params_t  *p_profile);

/*
 * @Function	  fm_pcd_plcr_profile_delete
 *
 * @Description   Delete a profile entry in the policer profile table.
 *		  The routine set entry to invalid.
 *
 * @Param[in]	  h_profile	A handle to the profile.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
uint32_t fm_pcd_plcr_profile_delete(t_handle h_profile);

/*
 * @Function	  fm_pcd_plcr_profile_get_counter
 *
 * @Description   Sets an entry in the classification plan.
 *		  The routine overrides any existing value.
 *
 * @Param[in]	  h_profile	A handle to the profile.
 * @Param[in]	  counter	Counter selector.
 *
 * @Return	  specific counter value.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
uint32_t fm_pcd_plcr_profile_get_counter(t_handle	h_profile,
			ioc_fm_pcd_plcr_profile_counters	counter);

/*
 * @Function	  fm_pcd_plcr_profile_set_counter
 *
 * @Description   Sets an entry in the classification plan.
 *		  The routine overrides any existing value.
 *
 * @Param[in]	  h_profile	A handle to the profile.
 * @Param[in]	  counter	Counter selector.
 * @Param[in]	  value		value to set counter with.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
uint32_t fm_pcd_plcr_profile_set_counter(t_handle h_profile,
				      ioc_fm_pcd_plcr_profile_counters counter,
					uint32_t		value);

/*
 * @Function	  fm_pcd_cc_root_build
 *
 * @Description   This routine must be called to define a complete coarse
 *		  classification tree. This is the way to define coarse
 *		  classification to a certain flow - the KeyGen schemes may
 *		  point only to trees defined in this way.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  p_params	A structure of parameters to define the tree.
 *
 * @Return	  A handle to the initialized object on success; NULL code
 *		  otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
t_handle fm_pcd_cc_root_build(t_handle h_fm_pcd,
			     ioc_fm_pcd_cc_tree_params_t  *p_params);

/*
 * @Function	  fm_pcd_cc_root_delete
 *
 * @Description   Deleting an built tree.
 *
 * @Param[in]	  h_cc_tree	A handle to a CC tree.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
uint32_t fm_pcd_cc_root_delete(t_handle h_cc_tree);

/*
 * @Function	  fm_pcd_cc_root_modify_next_engine
 *
 * @Description   Modify the Next Engine Parameters in the entry of the tree.
 *
 * @Param[in]	  h_cc_tree			A handle to the tree
 * @Param[in]	  grp_id			A Group index in the tree
 * @Param[in]	  index				Entry index in the group
 *						defined by grp_id
 * @Param[in]	  p_fm_pcd_cc_next_engine	Pointer to new next
 *						engine parameters
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following FM_PCD_CcBuildTree().
 */
uint32_t fm_pcd_cc_root_modify_next_engine(t_handle h_cc_tree,
		uint8_t		grp_id,
		uint8_t		index,
		ioc_fm_pcd_cc_next_engine_params_t *p_fm_pcd_cc_next_engine);

/*
 * @Function	  fm_pcd_match_table_set
 *
 * @Description   This routine should be called for each CC (coarse
 *		  classification) node. The whole CC tree should be built bottom
 *		  up so that each node points to already defined nodes.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  p_param	A structure of parameters defining the CC node
 *
 * @Return	  A handle to the initialized object on success; NULL code
 *		  otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
t_handle   fm_pcd_match_table_set(t_handle h_fm_pcd,
		ioc_fm_pcd_cc_node_params_t *p_param);

/*
 * @Function	  fm_pcd_match_table_delete
 *
 * @Description   Deleting an built node.
 *
 * @Param[in]	  h_cc_node	A handle to a CC node.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
uint32_t fm_pcd_match_table_delete(t_handle h_cc_node);

/*
 * @Function	  fm_pcd_match_table_modify_miss_next_engine
 *
 * @Description   Modify the Next Engine Parameters of the Miss key case of the
 *		  node.
 *
 * @Param[in]	  h_cc_node				A handle to the node
 * @Param[in]	  p_fm_pcd_cc_next_engine_params	Parameters for defining
 *							next engine
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set(); Not
 *		  relevant in the case the node is of type 'INDEXED_LOOKUP'.
 *		  When configuring nextEngine = e_FM_PCD_CC, note that
 *		  p_fm_pcd_cc_next_engine_params->ccParams.h_cc_node must be
 *		  different from the currently changed table.
 *
 */
uint32_t fm_pcd_match_table_modify_miss_next_engine(t_handle h_cc_node,
	ioc_fm_pcd_cc_next_engine_params_t *p_fm_pcd_cc_next_engine_params);

/*
 * @Function	  fm_pcd_match_table_remove_key
 *
 * @Description   Remove the key (including next engine parameters of this key)
 *		  defined by the index of the relevant node.
 *
 * @Param[in]	  h_cc_node	A handle to the node
 * @Param[in]	  key_index	Key index for removing
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set() was called for
 *		  this node and the nodes that lead to it.
 */
uint32_t fm_pcd_match_table_remove_key(t_handle h_cc_node,
			uint16_t key_index);

/*
 * @Function	  fm_pcd_match_table_add_key
 *
 * @Description   Add the key (including next engine parameters of this key in
 *		  the index defined by the key_index. Note that
 *		  'FM_PCD_LAST_KEY_INDEX' may be used by user that don't care
 *		  about the position of the key in the table - in that case, the
 *		  key will be automatically added by the driver in the last
 *		  available entry.
 *
 * @Param[in]	  h_cc_node	A handle to the node
 * @Param[in]	  key_index	Key index for adding.
 * @Param[in]	  key_size	Key size of added key
 * @Param[in]	  p_key_params	A pointer to the parameters includes new key
 *				with Next Engine Parameters
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set() was called for
 *		  this node and the nodes that lead to it.
 */
uint32_t fm_pcd_match_table_add_key(t_handle h_cc_node,
				uint16_t		key_index,
				uint8_t		key_size,
				ioc_fm_pcd_cc_key_params_t  *p_key_params);

/*
 * @Function	  fm_pcd_match_table_modify_next_engine
 *
 * @Description   Modify the Next Engine Parameters in the relevant key entry of
 *		  the node.
 *
 * @Param[in]	  h_cc_node			A handle to the node
 * @Param[in]	  key_index			Key index for Next
 *						Engine modifications
 * @Param[in]	  p_fm_pcd_cc_next_engine	Parameters for defining
 *						next engine
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set(). When
 *		  configuring nextEngine = e_FM_PCD_CC, note that
 *		  p_fm_pcd_cc_next_engine_params->ccParams.h_cc_node must be
 *		  different from the currently changed table.
 *
 */
uint32_t fm_pcd_match_table_modify_next_engine(t_handle h_cc_node,
		uint16_t		key_index,
		ioc_fm_pcd_cc_next_engine_params_t *p_fm_pcd_cc_next_engine);

/*
 * @Function	  fm_pcd_match_table_modify_key_and_next_engine
 *
 * @Description   Modify the key and Next Engine Parameters of this key in the
 *		  index defined by the key_index.
 *
 * @Param[in]	  h_cc_node		A handle to the node
 * @Param[in]	  key_index		Key index for adding
 * @Param[in]	  key_size		Key size of added key
 * @Param[in]	  p_key_params		A pointer to the parameters includes
 *					modified key and modified Next Engine
 *					Params
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	Allowed only following fm_pcd_match_table_set() was called for
 *		this node and the nodes that lead to it. When configuring
 *		nextEngine = e_FM_PCD_CC, note that
 *		p_fm_pcd_cc_next_engine_params->ccParams.h_cc_node must be
 *		different from the currently changed table.
 */
uint32_t fm_pcd_match_table_modify_key_and_next_engine(t_handle h_cc_node,
				uint16_t		key_index,
				uint8_t		key_size,
				ioc_fm_pcd_cc_key_params_t  *p_key_params);

/*
 * @Function	  fm_pcd_match_table_modify_key
 *
 * @Description   Modify the key in the index defined by the key_index.
 *
 * @Param[in]	  h_cc_node		A handle to the node
 * @Param[in]	  key_index		Key index for adding
 * @Param[in]	  key_size		Key size of added key
 * @Param[in]	  p_key			A pointer to the new key
 * @Param[in]	  p_mask		A pointer to the new mask if relevant,
 *					otherwise pointer to NULL
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set() was called for
 *		  this node and the nodes that lead to it.
 */
uint32_t fm_pcd_match_table_modify_key(t_handle h_cc_node,
				uint16_t key_index,
				uint8_t  key_size,
				uint8_t  *p_key,
				uint8_t  *p_mask);

/*
 * @Function	  fm_pcd_match_table_find_nremove_key
 *
 * @Description   Remove the key (including next engine parameters of this key)
 *		  defined by the key and mask. Note that this routine will
 *		  search the node to locate the index of the required key
 *		  (& mask) to remove.
 *
 * @Param[in]	  h_cc_node	A handle to the node
 * @Param[in]	  key_size	Key size of the one to remove.
 * @Param[in]	  p_key		A pointer to the requested key to remove.
 * @Param[in]	  p_mask	A pointer to the mask if relevant,
 *				otherwise pointer to NULL
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set() was called for
 *		  this node and the nodes that lead to it.
 */
uint32_t fm_pcd_match_table_find_nremove_key(t_handle h_cc_node,
					uint8_t  key_size,
					uint8_t  *p_key,
					uint8_t  *p_mask);

/*
 * @Function	  fm_pcd_match_table_find_nmodify_next_engine
 *
 * @Description   Modify the Next Engine Parameters in the relevant key entry of
 *		  the node. Note that this routine will search the node to
 *		  locate the index of the required key (& mask) to modify.
 *
 * @Param[in]	  h_cc_node		A handle to the node
 * @Param[in]	  key_size		Key size of the one to modify.
 * @Param[in]	  p_key			A pointer to the requested key to modify
 * @Param[in]	  p_mask		A pointer to the mask if relevant,
 *					otherwise pointer to NULL
 * @Param[in]	  p_fm_pcd_cc_next_engine	Parameters for defining
 *							next engine
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set(). When
 *		  configuring nextEngine = e_FM_PCD_CC, note that
 *		  p_fm_pcd_cc_next_engine_params->ccParams.h_cc_node must be
 *		  different from the currently changed table.
 */
uint32_t fm_pcd_match_table_find_nmodify_next_engine(t_handle h_cc_node,
		uint8_t		key_size,
		uint8_t		*p_key,
		uint8_t		*p_mask,
		ioc_fm_pcd_cc_next_engine_params_t *p_fm_pcd_cc_next_engine);

/*
 * @Function	 fm_pcd_match_table_find_nmodify_key_and_next_engine
 *
 * @Description   Modify the key and Next Engine Parameters of this key in the
 *		  index defined by the key_index. Note that this routine will
 *		  search the node to locate the index of the required key
 *		  (& mask) to modify.
 *
 * @Param[in]	  h_cc_node		A handle to the node
 * @Param[in]	  key_size		Key size of the one to modify.
 * @Param[in]	  p_key			A pointer to the requested key to modify
 * @Param[in]	  p_mask		A pointer to the mask if relevant,
 *					otherwise pointer to NULL
 * @Param[in]	  p_key_params		A pointer to the parameters includes
 *					modified key and modified Next Engine
 *					Params
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set() was called for
 *		  this node and the nodes that lead to it.
 *		  When configuring nextEngine = e_FM_PCD_CC, note that
 *		  p_fm_pcd_cc_next_engine_params->ccParams.h_cc_node must be
 *		  different from the currently changed table.
 */
uint32_t fm_pcd_match_table_find_nmodify_key_and_next_engine(t_handle h_cc_node,
				uint8_t key_size,
				uint8_t *p_key,
				uint8_t *p_mask,
				ioc_fm_pcd_cc_key_params_t *p_key_params);

/*
 * @Function	  fm_pcd_match_table_find_nmodify_key
 *
 * @Description   Modify the key  in the index defined by the key_index. Note
 *		  that this routine will search the node to locate the index of
 *		  the required key (& mask) to modify.
 *
 * @Param[in]	  h_cc_node	A handle to the node
 * @Param[in]	  key_size	Key size of the one to modify.
 * @Param[in]	  p_key		A pointer to the requested key to modify.
 * @Param[in]	  p_mask	A pointer to the mask if relevant,
 *				otherwise pointer to NULL
 * @Param[in]	  p_new_key	A pointer to the new key
 * @Param[in]	  p_new_mask	A pointer to the new mask if relevant,
 *				otherwise pointer to NULL
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set() was called for
 *		  this node and the nodes that lead to it.
 */
uint32_t fm_pcd_match_table_find_nmodify_key(t_handle h_cc_node,
					uint8_t  key_size,
					uint8_t  *p_key,
					uint8_t  *p_mask,
					uint8_t  *p_new_key,
					uint8_t  *p_new_mask);

/*
 * @Function	  fm_pcd_match_table_get_key_counter
 *
 * @Description   This routine may be used to get a counter of specific key in a
 *		  CC Node; This counter reflects how many frames passed that
 *		  were matched this key.
 *
 * @Param[in]	  h_cc_node	A handle to the node
 * @Param[in]	  key_index	Key index for adding
 *
 * @Return	  The specific key counter.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set().
 */
uint32_t fm_pcd_match_table_get_key_counter(t_handle h_cc_node,
				uint16_t key_index);

/*
 * @Function	  fm_pcd_match_table_get_key_statistics
 *
 * @Description   This routine may be used to get statistics counters of
 *		  specific key in a CC Node.
 *
 *		  If 'e_FM_PCD_CC_STATS_MODE_FRAME' and
 *		  'e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME' were set for this
 *		  node, these counters reflect how many frames passed that were
 *		  matched this key; The total frames count will be returned in
 *		  the counter of the first range (as only one frame length range
 *		  was defined). If 'e_FM_PCD_CC_STATS_MODE_RMON' was set for
 *		  this node, the total frame count will be separated to frame
 *		  length counters, based on provided frame length ranges.
 *
 * @Param[in]	  h_cc_node		A handle to the node
 * @Param[in]	  key_index		Key index for adding
 * @Param[out]	  p_key_statistics	Key statistics counters
 *
 * @Return	  The specific key statistics.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set().
 */
uint32_t fm_pcd_match_table_get_key_statistics(t_handle h_cc_node,
			uint16_t		key_index,
			ioc_fm_pcd_cc_key_statistics_t	*p_key_statistics);

/*
 * @Function	  fm_pcd_match_table_get_miss_statistics
 *
 * @Description   This routine may be used to get statistics counters of miss
 *		  entry in a CC Node.
 *
 *		  If 'e_FM_PCD_CC_STATS_MODE_FRAME' and
 *		  'e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME' were set for this
 *		  node, these counters reflect how many frames were not matched
 *		  to any existing key and therefore passed through the miss
 *		  entry; The total frames count will be returned in the counter
 *		  of the first range (as only one frame length range was
 *		  defined).
 *
 * @Param[in]	  h_cc_node		A handle to the node
 * @Param[out]	  p_miss_statistics	Statistics counters for 'miss'
 *
 * @Return	  The statistics for 'miss'.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set().
 */
uint32_t fm_pcd_match_table_get_miss_statistics(t_handle h_cc_node,
		    ioc_fm_pcd_cc_key_statistics_t	*p_miss_statistics);

/*
 * @Function	  fm_pcd_match_table_find_nget_key_statistics
 *
 * @Description   This routine may be used to get statistics counters of
 *		  specific key in a CC Node.
 *
 *		  If 'e_FM_PCD_CC_STATS_MODE_FRAME' and
 *		  'e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME' were set for this
 *		  node, these counters reflect how many frames passed that were
 *		  matched this key; The total frames count will be returned in
 *		  the counter of the first range (as only one frame length range
 *		  was defined). If 'e_FM_PCD_CC_STATS_MODE_RMON' was set for
 *		  this node, the total frame count will be separated to frame
 *		  length counters, based on provided frame length ranges.
 *		  Note that this routine will search the node to locate the
 *		  index of the required key based on received key parameters.
 *
 * @Param[in]	  h_cc_node		A handle to the node
 * @Param[in]	  key_size		Size of the requested key
 * @Param[in]	  p_key			A pointer to the requested key
 * @Param[in]	  p_mask		A pointer to the mask if relevant,
 *					otherwise pointer to NULL
 * @Param[out]	  p_key_statistics	Key statistics counters
 *
 * @Return	  The specific key statistics.
 *
 * @Cautions	  Allowed only following fm_pcd_match_table_set().
 */
uint32_t fm_pcd_match_table_find_nget_key_statistics(t_handle h_cc_node,
			uint8_t		key_size,
			uint8_t		*p_key,
			uint8_t		*p_mask,
			ioc_fm_pcd_cc_key_statistics_t   *p_key_statistics);

/*
 * @Function	  fm_pcd_match_table_get_next_engine
 *
 * @Description   Gets NextEngine of the relevant key_index.
 *
 * @Param[in]	  h_cc_node				A handle to the node.
 * @Param[in]	  key_index				key_index in the
 *							relevant node.
 * @Param[out]	  p_fm_pcd_cc_next_engine_params	here updated
 *							nextEngine parameters
 *							for the relevant
 *							key_index of the CC Node
 *							received as parameter to
 *							this function
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
uint32_t fm_pcd_match_table_get_next_engine(t_handle	h_cc_node,
	uint16_t			key_index,
	ioc_fm_pcd_cc_next_engine_params_t *p_fm_pcd_cc_next_engine_params);

/*
 * @Function	  fm_pcd_match_table_get_indexed_hash_bucket
 *
 * @Description   This routine simulates KeyGen operation on the provided key
 *		  and calculates to which hash bucket it will be mapped.
 *
 * @Param[in]	  h_cc_node			A handle to the node.
 * @Param[in]	  kg_key_size			Key size as it was configured in
 *						the KG scheme that leads to this
 *						hash.
 * @Param[in]	  p_kg_key			Pointer to the key; must be like
 *						the key that the KG is
 *						generated, i.e. the same
 *						extraction and with mask if
 *						exist.
 * @Param[in]	  kg_hash_shift			Hash-shift as it was configured
 *						in the KG scheme that leads to
 *						this hash.
 * @Param[out]	  p_cc_node_bucket_handle	Pointer to the bucket of the
 *						provided key.
 * @Param[out]	  p_bucket_index		Index to the bucket of the
 *						provided key
 * @Param[out]	  p_last_index			Pointer to last index in the
 *						bucket of the provided key.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set()
 */
uint32_t fm_pcd_match_table_get_indexed_hash_bucket(t_handle h_cc_node,
				uint8_t	kg_key_size,
				uint8_t	*p_kg_key,
				uint8_t	kg_hash_shift,
				t_handle	*p_cc_node_bucket_handle,
				uint8_t	*p_bucket_index,
				uint16_t	*p_last_index);

/*
 * @Function	  fm_pcd_hash_table_set
 *
 * @Description   This routine initializes a hash table structure.
 *		  KeyGen hash result determines the hash bucket.
 *		  Next, KeyGen key is compared against all keys of this bucket
 *		  (exact match).
 *		  Number of sets (number of buckets) of the hash equals to the
 *		  number of 1-s in 'hashResMask' in the provided parameters.
 *		  Number of hash table ways is then calculated by dividing
 *		  'max_num_of_keys' equally between the hash sets. This is the
 *		  maximal number of keys that a hash bucket may hold.
 *		  The hash table is initialized empty and keys may be added to
 *		  it following the initialization. Keys masks are not supported
 *		  in current hash table implementation.
 *		  The initialized hash table can be integrated as a node in a CC
 *		  tree.
 *
 * @Param[in]	  h_fm_pcd	FM PCD module descriptor.
 * @Param[in]	  p_param	A structure of parameters defining the hash
 *				table
 *
 * @Return	  A handle to the initialized object on success; NULL code
 *		  otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
t_handle fm_pcd_hash_table_set(t_handle h_fm_pcd,
	ioc_fm_pcd_hash_table_params_t *p_param);

/*
 * @Function	  fm_pcd_hash_table_delete
 *
 * @Description   This routine deletes the provided hash table and released all
 *		  its allocated resources.
 *
 * @Param[in]	  h_hash_tbl	A handle to a hash table
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set().
 */
uint32_t fm_pcd_hash_table_delete(t_handle h_hash_tbl);

/*
 * @Function	  fm_pcd_hash_table_add_key
 *
 * @Description   This routine adds the provided key (including next engine
 *		  parameters of this key) to the hash table.
 *		  The key is added as the last key of the bucket that it is
 *		  mapped to.
 *
 * @Param[in]	  h_hash_tbl	A handle to a hash table
 * @Param[in]	  key_size	Key size of added key
 * @Param[in]	  p_key_params  A pointer to the parameters includes
 *				new key with next engine parameters; The pointer
 *				to the key mask must be NULL, as masks are not
 *				supported in hash table implementation.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set().
 */
uint32_t fm_pcd_hash_table_add_key(t_handle h_hash_tbl,
				uint8_t		key_size,
				ioc_fm_pcd_cc_key_params_t  *p_key_params);

/*
 * @Function	  fm_pcd_hash_table_remove_key
 *
 * @Description   This routine removes the requested key (including next engine
 *		  parameters of this key) from the hash table.
 *
 * @Param[in]	  h_hash_tbl	A handle to a hash table
 * @Param[in]	  key_size	Key size of the one to remove.
 * @Param[in]	  p_key		A pointer to the requested key to remove.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set().
 */
uint32_t fm_pcd_hash_table_remove_key(t_handle h_hash_tbl,
				uint8_t  key_size,
				uint8_t  *p_key);

/*
 * @Function	  fm_pcd_hash_table_modify_next_engine
 *
 * @Description   This routine modifies the next engine for the provided key.
 *		  The key should be previously added to the hash table.
 *
 * @Param[in]	  h_hash_tbl			A handle to a hash table
 * @Param[in]	  key_size			Key size of the key to modify.
 * @Param[in]	  p_key				A pointer to the requested key
 *						to modify.
 * @Param[in]	  p_fm_pcd_cc_next_engine	A structure for defining
 *						new next engine parameters.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set().
 *		  When configuring nextEngine = e_FM_PCD_CC, note that
 *		  p_fm_pcd_cc_next_engine_params->ccParams.h_cc_node must be
 *		  different from the currently changed table.
 */
uint32_t fm_pcd_hash_table_modify_next_engine(t_handle h_hash_tbl,
		uint8_t		key_size,
		uint8_t		*p_key,
		ioc_fm_pcd_cc_next_engine_params_t *p_fm_pcd_cc_next_engine);

/*
 * @Function	  fm_pcd_hash_table_modify_miss_next_engine
 *
 * @Description   This routine modifies the next engine on key match miss.
 *
 * @Param[in]	  h_hash_tbl			A handle to a hash table
 * @Param[in]	  p_fm_pcd_cc_next_engine	A structure for defining
 *						new next engine parameters.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set().
 *		  When configuring nextEngine = e_FM_PCD_CC, note that
 *		  p_fm_pcd_cc_next_engine_params->ccParams.h_cc_node must be
 *		  different from the currently changed table.
 */
uint32_t fm_pcd_hash_table_modify_miss_next_engine(t_handle h_hash_tbl,
	      ioc_fm_pcd_cc_next_engine_params_t *p_fm_pcd_cc_next_engine);

/*
 * @Function	  fm_pcd_hash_table_get_miss_next_engine
 *
 * @Description   Gets NextEngine in case of key match miss.
 *
 * @Param[in]	  h_hash_tbl				A handle to a hash table
 * @Param[out]	  p_fm_pcd_cc_next_engine_params	Next engine parameters
 *							for the specified hash
 *							table.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set().
 */
uint32_t fm_pcd_hash_table_get_miss_next_engine(t_handle	h_hash_tbl,
	ioc_fm_pcd_cc_next_engine_params_t *p_fm_pcd_cc_next_engine_params);

/*
 * @Function	  fm_pcd_hash_table_find_nget_key_statistics
 *
 * @Description   This routine may be used to get statistics counters of
 *		  specific key in a hash table.
 *
 *		  If 'e_FM_PCD_CC_STATS_MODE_FRAME' and
 *		  'e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME' were set for this
 *		  node, these counters reflect how many frames passed that were
 *		  matched this key; The total frames count will be returned in
 *		  the counter of the first range (as only one frame length range
 *		  was defined). If 'e_FM_PCD_CC_STATS_MODE_RMON' was set for
 *		  this node, the total frame count will be separated to frame
 *		  length counters, based on provided frame length ranges. Note
 *		  that this routine will identify the bucket of this key in the
 *		  hash table and will search the bucket to locate the index of
 *		  the required key based on received key parameters.
 *
 * @Param[in]	  h_hash_tbl		A handle to a hash table
 * @Param[in]	  key_size		Size of the requested key
 * @Param[in]	  p_key			A pointer to the requested key
 * @Param[out]	  p_key_statistics	Key statistics counters
 *
 * @Return	  The specific key statistics.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set().
 */
uint32_t fm_pcd_hash_table_find_nget_key_statistics(t_handle h_hash_tbl,
			uint8_t		key_size,
			uint8_t		*p_key,
			ioc_fm_pcd_cc_key_statistics_t   *p_key_statistics);

/*
 * @Function	  fm_pcd_hash_table_get_miss_statistics
 *
 * @Description   This routine may be used to get statistics counters of 'miss'
 *		  entry of the a hash table.
 *
 *		  If 'e_FM_PCD_CC_STATS_MODE_FRAME' and
 *		  'e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME' were set for this
 *		  node, these counters reflect how many frames were not matched
 *		  to any existing key and therefore passed through the miss
 *		  entry;
 *
 * @Param[in]	  h_hash_tbl		A handle to a hash table
 * @Param[out]	  p_miss_statistics	Statistics counters for 'miss'
 *
 * @Return	  The statistics for 'miss'.
 *
 * @Cautions	  Allowed only following fm_pcd_hash_table_set().
 */
uint32_t fm_pcd_hash_table_get_miss_statistics(t_handle	h_hash_tbl,
			ioc_fm_pcd_cc_key_statistics_t   *p_miss_statistics);

/*
 * @Function	  fm_pcd_manip_node_set
 *
 * @Description   This routine should be called for defining a manipulation
 *		  node. A manipulation node must be defined before the CC node
 *		  that precedes it.
 *
 * @Param[in]	  h_fm_pcd			FM PCD module descriptor.
 * @Param[in]	  p_fm_pcd_manip_params		A structure of parameters
 *						defining the manipulation
 *
 * @Return	  A handle to the initialized object on success; NULL code
 *		  otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
t_handle fm_pcd_manip_node_set(t_handle h_fm_pcd,
	ioc_fm_pcd_manip_params_t *p_fm_pcd_manip_params);

/*
 * @Function	  fm_pcd_manip_node_delete
 *
 * @Description   Delete an existing manipulation node.
 *
 * @Param[in]	  h_manip_node		A handle to a manipulation node.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_manip_node_set().
 */
uint32_t  fm_pcd_manip_node_delete(t_handle h_manip_node);

/*
 * @Function	  fm_pcd_manip_get_statistics
 *
 * @Description   Retrieve the manipulation statistics.
 *
 * @Param[in]	  h_manip_node		A handle to a manipulation node.
 * @Param[out]	  p_fm_pcd_manip_stats	A structure for retrieving the
 *					manipulation statistics
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_manip_node_set().
 */
uint32_t fm_pcd_manip_get_statistics(t_handle h_manip_node,
	ioc_fm_pcd_manip_stats_t *p_fm_pcd_manip_stats);

/*
 * @Function	  fm_pcd_manip_node_replace
 *
 * @Description   Change existing manipulation node to be according to new
 *		  requirement.
 *
 * @Param[in]	  h_manip_node		A handle to a manipulation node.
 * @Param[out]	  p_manip_params	A structure of parameters defining the
 *					change requirement
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_manip_node_set().
 */
uint32_t fm_pcd_manip_node_replace(t_handle h_manip_node,
ioc_fm_pcd_manip_params_t *p_manip_params);

/*
 * @Function	  fm_pcd_frm_replic_set_group
 *
 * @Description   Initialize a Frame Replicator group.
 *
 * @Param[in]	  h_fm_pcd			FM PCD module descriptor.
 * @Param[in]	  p_frm_replic_group_param	A structure of parameters for
 *						the initialization of the frame
 *						replicator group.
 *
 * @Return	  A handle to the initialized object on success; NULL code
 *		  otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_init().
 */
t_handle fm_pcd_frm_replic_set_group(t_handle h_fm_pcd,
		ioc_fm_pcd_frm_replic_group_params_t *p_frm_replic_group_param);

/*
 * @Function	  fm_pcd_frm_replic_delete_group
 *
 * @Description   Delete a Frame Replicator group.
 *
 * @Param[in]	  h_frm_replic_group	A handle to the frame replicator group.
 *
 * @Return	  E_OK on success;  Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_frm_replic_set_group().
 */
uint32_t fm_pcd_frm_replic_delete_group(t_handle h_frm_replic_group);

/*
 * @Function	  fm_pcd_frm_replic_add_member
 *
 * @Description   Add the member in the index defined by the member_index.
 *
 * @Param[in]	  h_frm_replic_group	A handle to the frame replicator group.
 * @Param[in]	  member_index		member index for adding.
 * @Param[in]	  p_member_params	A pointer to the new member parameters.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_frm_replic_set_group() of this
 *		  group.
 */
uint32_t fm_pcd_frm_replic_add_member(t_handle h_frm_replic_group,
			uint16_t		member_index,
			ioc_fm_pcd_cc_next_engine_params_t *p_member_params);

/*
 * @Function	  fm_pcd_frm_replic_remove_member
 *
 * @Description   Remove the member defined by the index from the relevant
 *		  group.
 *
 * @Param[in]	  h_frm_replic_group	A handle to the frame replicator group.
 * @Param[in]	  member_index		member index for removing.
 *
 * @Return	  E_OK on success; Error code otherwise.
 *
 * @Cautions	  Allowed only following fm_pcd_frm_replic_set_group() of this
 * group.
 */
uint32_t fm_pcd_frm_replic_remove_member(t_handle h_frm_replic_group,
				      uint16_t member_index);

/** @} */ /* end of FM_PCD_Runtime_build_grp group */
/** @} */ /* end of FM_PCD_Runtime_grp group */
/** @} */ /* end of FM_PCD_grp group */
/** @} */ /* end of FM_grp group */

#endif /* __FM_PCD_EXT_H */
