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