Hi, My understanding is that: - compression can be used in stateless or statefull mode. How can we differentiate between the two configurations: by specifying a special algorithm on session creation or by setting "last" field to "true" for every operation? Do we need this setting per operation or per session? - stateless mode may be used by IPComp (RFC3173) - it will be application job to add IPComp header between IP header and payload - statefull mode requires a connection oriented protocol (TCP) support to take care of delivering date in order and without drops. How will receiver know if payload is clear text or compressed? Should use a well-known port?
- on statefull mode, it will always be an output for every input or algorithm may decide to concat consecutive packets and output fewer? - in-place vs. new packet: in-place processing will be added later - you should take care on what you to copy between input and output packets - user area, pkt user pointer, etc. Is my understanding correct? BR, Bogdan On 17 March 2017 at 14:20, Mahipal Challa <mahipalreddy2...@gmail.com> wrote: > From: Shally Verma <shally.ve...@cavium.com> > > An API set to add compression/decompression support in ODP > interface. > > Signed-off-by: Shally Verma <shally.ve...@cavium.com> > Signed-off-by: Mahipal Challa <mahipal.cha...@cavium.com> > --- > include/odp/api/spec/comp.h | 668 > ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 668 insertions(+) > > diff --git a/include/odp/api/spec/comp.h b/include/odp/api/spec/comp.h > new file mode 100644 > index 0000000..d8f6c68 > --- /dev/null > +++ b/include/odp/api/spec/comp.h > @@ -0,0 +1,668 @@ > +/* Copyright (c) 2017, Linaro Limited > + * All rights reserved. > + * > + * SPDX-License-Identifier: BSD-3-Clause > + */ > + > +/** > + * @file > + * > + * ODP Compression > + */ > + > +#ifndef ODP_API_COMP_H_ > +#define ODP_API_COMP_H_ > +#include <odp/visibility_begin.h> > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +/** @defgroup odp_compression ODP COMP > + * ODP Compression defines interface to compress/decompress and authenticate > + * data. > + * > + * Compression here implicilty refer to both compression and decompression. > + * Example, compression algo 'deflate' mean both 'deflate' and 'inflate'. > + * > + * if opcode = ODP_COMP_COMPRESS, then it will Compress, > + * if opcode = ODP_COMP_DECOMPRESS, then it will Decompress. > + * > + * Current version of Interface allow Compression ONLY,Authentication ONLY > or > + * both Compression + Auth ONLY sessions. > + * > + * Macros, enums, types and operations to utilise compression. > + * @{ > + */ > + > +/** > + * @def ODP_COMP_SESSION_INVALID > + * Invalid session handle > + */ > + > +/** > + * @typedef odp_comp_session_t (platform dependent) > + * Comp API opaque session handle > + */ > + > +/** > + * @typedef odp_comp_compl_t > +* Compression API completion event (platform dependent) > +*/ > + > +/** > + * Compression API operation mode > + */ > +typedef enum { > + /** Synchronous, return results immediately */ > + ODP_COMP_SYNC, > + /** Asynchronous, return results via event */ > + ODP_COMP_ASYNC, > +} odp_comp_op_mode_t; > + > +/** > + * Comp API operation type > + */ > +typedef enum { > + /** Compress and/or Compute ICV */ > + ODP_COMP_OP_COMPRESS, > + /** Decompress and/or Compute ICV */ > + ODP_COMP_OP_DECOMPRESS, > +} odp_comp_op_t; > + > +/** > + * Comp API compression algorithm > + * > + * Enum listing support Compression algo. Currently one > + * Compressor corresponds to 1 compliant decompressor. > + * > + */ > +typedef enum { > + /** No algorithm specified */ > + ODP_COMP_ALG_NULL, > + /** DEFLATE - > + * > + * implicit Inflate in case of decode operation > + * > + */ > + ODP_COMP_ALG_DEFLATE, > + /** ZLIB */ > + ODP_COMP_ALG_ZLIB, > + /** LZS*/ > + ODP_COMP_ALG_LZS, > + /** SHA1 > + * > + * When given, imply Authentication ONLY operation > + * > + */ > + ODP_COMP_ALG_SHA1, > + /** SHA256 > + * > + * When given, imply Authentication ONLY operation > + * > + */ > + ODP_COMP_ALG_SHA256, > + /** DEFLATE+SHA1 */ > + ODP_COMP_ALG_DEFLATE_SHA1, > + /** DEFLATE+SHA256 */ > + ODP_COMP_ALG_DEFLATE_SHA256, > + /** ZLIB+SHA */ > + ODP_COMP_ALG_ZLIB_SHA1, > + /** ZLIB+SHA256 */ > + ODP_COMP_ALG_ZLIB_SHA256, > + /** LZS+SHA1 */ > + ODP_COMP_ALG_LZS_SHA1, > + /** LZS+SHA256 */ > + ODP_COMP_ALG_LZS_SHA256 > +} odp_comp_alg_t; > + > +/** > + * Comp API session creation return code > + */ > +typedef enum { > + /** Session created */ > + ODP_COMP_SES_CREATE_ERR_NONE, > + /** Creation failed, no resources */ > + ODP_COMP_SES_CREATE_ERR_ENOMEM, > + /** Creation failed, bad compression params */ > + ODP_COMP_SES_CREATE_ERR_INV_COMP, > + /** Creation failed,requested configuration not supported*/ > + ODP_COMP_SES_CREATE_ERR_NOT_SUPPORTED > +} odp_comp_ses_create_err_t; > + > +/** Comp API operation return codes */ > +typedef enum { > + /** Operation completed successfully */ > + ODP_COMP_ERR_NONE, > + /** Invalid user data pointers */ > + ODP_COMP_ERR_DATA_PTR, > + /** Invalid input data size */ > + ODP_COMP_ERR_DATA_SIZE, > + /** Compression Algo fail error */ > + ODP_COMP_ERR_COMP_FAIL, > + /** Error detected during DMA of data */ > + ODP_COMP_ERR_DMA, > + /** Operation failed due to insufficient output buffer */ > + ODP_COMP_ERR_OUT_OF_SPACE, > +} odp_comp_err_t; > + > +/** Comp API enumeration for preferred compression level/speed. > +* > +* trade-off between speed and compression ratio. > +* > +* Please note this enumeration is only a peferential selection > +* but may not guarantee operation to committed level depending > +* on implementation support. Ex. SPEED_FASTEST and SPEED_FAST may > +* give same result on some platforms. > +* > +*/ > +typedef enum { > + /* Use implementaion default between ratio and speed */ > + ODP_COMP_SPEED_DEFAULT, > + /** fastest speed, lowest compression */ > + ODP_COMP_SPEED_FASTEST, > + /** fast speed, lower compression */ > + ODP_COMP_SPEED_FAST, > + /** medium speed, medium compression */ > + ODP_COMP_SPEED_MED, > + /** slowest speed, maximum compression */ > + ODP_COMP_SPEED_SLOWEST, > + > +} odp_comp_speed_t; > + > +/** Comp API enumeration for encoding type > +* > +*/ > +typedef enum { > + /** use implementation default to choose between compression codes */ > + ODP_COMP_CODE_DEFAULT, > + /** use fixed huffman codes */ > + ODP_COMP_CODE_FIX_HUFFMAN, > + /** use dynamic huffman coding */ > + ODP_COMP_CODE_DYN_HUFFMAN, > +} odp_comp_code_t; > + > +/** > + * Comp algorithms in a bit field structure > + * > + */ > +typedef union odp_comp_algos_t { > + /** Compression algorithms */ > + struct { > + /** ODP_COMP_ALG_NULL */ > + uint32_t null : 1; > + > + /** ODP_COMP_ALG_DEFLATE */ > + uint32_t deflate : 1; > + > + /** ODP_COMP_ALG_ZLIB */ > + uint32_t zlib : 1; > + > + /** ODP_COMP_ALG_LZS */ > + uint32_t lzs :1; > + > + /** ODP_COMP_ALG_SHA1 */ > + uint32_t sha1 :1; > + > + /** ODP_COMP_ALG_SHA256 */ > + uint32_t sha256 :1; > + > + /** ODP_COMP_ALG_DEFLATE_SHA1 */ > + uint32_t deflate_sha1:1; > + > + /** ODP_COMP_ALG_DEFLATE_SHA256 */ > + uint32_t deflate_sha256:1; > + > + /** ODP_COMP_ALG_ZLIB_SHA1 */ > + uint32_t zlib_sha1:1; > + > + /** ODP_COMP_ALG_ZLIB_SHA256 */ > + uint32_t zlib_sha256:1; > + > + /** ODP_COMP_ALG_LZS */ > + uint32_t lzs_sha1:1; > + > + /** ODP_COMP_ALG_LZS */ > + uint32_t lzs_sha256:1; > + } bit; > + > + /** All bits of the bit field structure > + * > + * This field can be used to set/clear all flags, or bitwise > + * operations over the entire structure. */ > + uint32_t all_bits; > +} odp_comp_algos_t; > + > +/** > + * Compression Interface Capabilities > + * > + */ > +typedef struct odp_comp_capability_t { > + /** Maximum number of sessions */ > + uint32_t max_sessions; > + > + /** Supported compression algorithms */ > + odp_comp_algos_t comps; > + > +} odp_comp_capability_t; > + > +/** > + * Compression algorithm capabilities > + * structure for each algorithm. > + * > + */ > +typedef struct odp_comp_alg_capability_t { > + /** Boolean indicating alg support dictionary load > + * > + * true: yes > + * false : no > + * > + */ > + odp_bool_t support_dict; > + > + /** Optional Maximum length of dictionary supported > + * by implementation of the algorithm. > + * > + * Invalid if support_dict == false. > + * > + * Implementation not supporting this may still allow a dictionary > + * load during odp_comp_operation() where Implementation may > + * use allowed length. In such case, implementation keep > responsibility > + * to update user discarded dictionary length. > + * > + */ > + uint32_t dict_len; > + /** key size in bytes for hash */ > + uint32_t key_size; > + > + /** Digest length in bytes for hash */ > + uint32_t digest_len; > + > + /** NULL-terminated Optional identifier of the algo > (platform-dependent) > + */ > + void *name; > + > + /** NULL-terminated optional description message (platform-dependent) > */ > + void *description; > + > +} odp_comp_alg_capability_t; > + > +/** > + * Comp API data range specifier > + */ > +typedef struct odp_comp_data_range_t { > + /** Offset from beginning of data pointer */ > + uint32_t offset; > + > + /** Length of data to operate on */ > + uint32_t length; > + > +} odp_comp_data_range_t; > + > +/** > + * Comp API key structure > + */ > +typedef struct odp_comp_auth_key_t { > + /** Key data */ > + uint8_t *data; > + > + /** Key length in bytes */ > + uint32_t length; > +} odp_comp_auth_key_t; > + > + /** > + * Comp API session creation parameters > + */ > +typedef struct odp_comp_session_param_t { > + /** Compress vs. Decompress operation */ > + odp_comp_op_t op; > + > + /** Preferred sync vs. async > + * > + * Indicate user preferred mode of operartion. > + * Implementation may still choose sync or async depending > + * upon which one gives better performance in a particular > + * operational environment > + * > + */ > + odp_comp_op_mode_t pref_mode; > + > + /** force the requested op_mode. > + * > + * Indicates user request to enforce requested > + * operation mode. > + */ > + odp_bool_t force_mode; > + > + /** Compression algorithm > + * > + * Use odp_comp_capability() for supported algorithms. > + */ > + odp_comp_alg_t comp_alg; > + > + /** Compression preferred encoding mode > + * > + */ > + > + odp_comp_code_t comp_code; > + > + /** Compression preferred speed > + * > + */ > + odp_comp_speed_t comp_speed; > + > + /** auth parameters during session creation > + * These will remain valid till session life duration. > + * > + */ > + odp_comp_auth_key_t auth_key; > + > + /** Async mode completion event queue > + * > + * When odp_comp_operation() returns result with 'posted' set to > 'true', > + * the completion queue is > + * used to return the completion status of the operation to the > + * application. > + */ > + odp_queue_t compl_queue; > + > + /** Pool used by user for input/output data > + * > + * used by implementation to have user pool information. > + * Helps to map input/output data pointer to appropriate type > + * and other pool related operations. > + * > + */ > + > + odp_pool_t pool; > +} odp_comp_session_param_t; > + > +/** > + * Comp API operation parameters. > + * Called to process each data unit > + * Data unit can be packet type/buffer type > + * determined based on pool used by app > + * > + */ > +typedef struct odp_comp_op_param_t { > + /** Session handle from creation */ > + odp_comp_session_t session; > + > + /** User context */ > + void *ctx; > + > + /** Boolean indicating End of data > + * for stateless compressions (ex ipcomp), it should always be 'true' > + * > + * true : last chunk > + * false: more to follow > + * > + */ > + odp_bool_t last; > + > + /** Input packet */ > + odp_packet_t in_data; > + > + /** input data range w.r.t in_data */ > + odp_comp_data_range_t in_data_range; > + > + /** Output packet. > + * Stores both processed and hashed output (for Auth and Comp+Auth > algo) > + * > + * User is expected to pass a valid output packet in > + * current version of API set. > + * > + * In case of output packet is ODP_PACKET_INVALID, then > + * Auto-allocation and/or in-place support for output packet > + * to be considered later. > + * > + */ > + odp_packet_t out_data; > + > + /** output data range w.r.t out_data. > + * length at input specifies length of available output buffer, > + * offset marks beginning of output buffer. > + * This may be updated after operation completion. > + * > + */ > + odp_comp_data_range_t out_data_range; > + > + /** dictionary - Optional Pointer to dictionary as passed by user.*/ > + void *dict; > + > + /** Length of dictionary */ > + uint32_t dict_len; > + > +} odp_comp_op_param_t; > + > +/** > + * Comp API per operation result > + */ > +typedef struct odp_comp_op_result_t { > + /** Indicate state of packet operation. Must be checked > + * at the return of odp_comp_operation() > + * > + * TRUE- Submitted but not completed (typical async op) > + * FALSE - Completed > + * > + */ > + odp_bool_t posted; > + > + /** User context from request */ > + void *ctx; > + > + /** Operation Return Code */ > + odp_comp_err_t err; > + > + /** pointer to output buffer. > + * Contains both processed output and hash for > + * Authentication and Compression+Authentication > + * Operations. > + * Valid when odp_comp_err_t is ODP_COMP_ERR_NONE > + */ > + odp_packet_t out_data; > + > + /** length of processed data */ > + odp_comp_data_range_t out_data_range; > + > +} odp_comp_op_result_t; > + > +/** > + * Query comp capabilities > + * > + * Outputs comp capabilities on success. > + * > + * @param[out] capa Pointer to capability structure for output > + * > + * @retval 0 on success > + * @retval <0 on failure > + */ > +int odp_comp_capability(odp_comp_capability_t *capa); > + > +/** > + * Query supported compression algorithm capabilities > + * > + * Outputs all supported configuration options for the algorithm. > + * > + * @param comp Compression algorithm > + * @param[out] capa Array of capability structures for output > + * @param num Maximum number of capability structures to output > + * > + * @return Number of capability structures for the algorithm. If this is > larger > + * than 'num', only 'num' first structures were output and > application > + * may call the function again with a larger value of 'num'. > + * @retval <0 on failure > + */ > +int odp_comp_alg_capability(odp_comp_alg_t comp, > + odp_comp_alg_capability_t capa[], int num); > + > + /** > + * Initialize comp session parameters > + * > + * Initialize an odp_comp_session_param_t to its default values for > + * all fields. > + * > + * @param param Pointer to odp_comp_session_param_t to be initialized > + */ > +void odp_comp_session_param_init(odp_comp_session_param_t *param); > + > + /** > + * Compression session creation > + * > + * Create a comp session according to the session parameters. Use > + * odp_comp_session_param_init() to initialize parameters into their > + * default values. > + * > + * @param param Session parameters > + * @param session Created session else ODP_COMP_SESSION_INVALID > + * @param status Failure code if unsuccessful > + * > + * @retval 0 on success > + * @retval <0 on failure > + */ > +int odp_comp_session_create(odp_comp_session_param_t *param, > + odp_comp_session_t *session, > + odp_comp_ses_create_err_t *status); > + > + /** > + * Comp session destroy > + * > + * Destroy an unused session. Result is undefined if session is being used > + * (i.e. asynchronous operation is in progress). > + * > + * @param session Session handle > + * > + * @retval 0 on success > + * @retval <0 on failure > + */ > +int odp_comp_session_destroy(odp_comp_session_t session); > + > + /** > + * Compression operation > + * > + * Each data operation call will route data > + * through each components set up in engine. For example if > + * user created Compression+Authentication(example, zlib_sha1) session, then > + * data will be passed to both compression and authentication > + * block. > + * > + * After every API call , if result parameter has 'posted' set to 'false', > + * means operation is complete and results are immediately available in > + * odp_comp_op_result_t. > + * > + * If 'posted' set to 'true' , means operation request has been submitted but > + * not completed. operation result will be delivered by completion queue. > + * > + * Application should always check 'posted' regardless of operation mode type > + * (sync/async) as some implementation may do some operation synchornously > even > + * for async requests. > + * > + * if operation returns ODP_COMP_ERR_OUT_OF_SPACE, then application should > call > + * API again with valid output buffer to continue processing of last input > + * request. > + * > + * @param param[in] Operation parameters. > + * @param result[out] Results of operation. Successful and Completed > + * call returns length of processed data in result > + * > + * @retval 0 on success > + * @retval <0 on failure > + */ > +int odp_comp_operation(odp_comp_op_param_t *param, > + odp_comp_op_result_t *result); > + > + /** > + * Return Compression completion handle that is associated with event > + * > + * Note: any invalid parameters will cause undefined behavior and may cause > + * the application to abort or crash. > + * > + * @param ev ODP_EVENT_COMP_COMPL Event Handle > + * > + * @return Compression Completion Handle > + * > + */ > +odp_comp_compl_t odp_comp_compl_from_event(odp_event_t ev); > + > + /** > + * Query result from completion event > + * > + * @param completion_event Event containing operation results > + * @param result[out] Pointer to result structure > + * > + * Example usecase by user > + * > + * odp_event_t ev; > + * odp_comp_op_result_t result; > + * odp_comp_compl_t compl; > + * odp_queue_t ev_queue; > + * odp_queue_param_t qparam; > + * > + * qparam.type = ODP_QUEUE_TYPE_PLAIN; > + * ev_queue = odp_queue_create("comp-out", &qparam); > + * > + * // do some work.. after it is completed > + * > + * ev = odp_queue_deq(ev_queue); > + * > + * compl=odp_comp_compl_from_event(ev); > + * > + * odp_comp_compl_result(compl,&result); > + * > + * > + */ > +void odp_comp_compl_result(odp_comp_compl_t event, > + odp_comp_op_result_t *result); > + > + /** > + * Convert comp completion handle to event handle > + * > + * @param completion_event Completion event to convert to generic event > + * > + * @return Event handle > + */ > +odp_event_t odp_comp_compl_to_event(odp_comp_compl_t completion_event); > + > + /** > + * Release comp completion event > + * > + * @param completion_event Completion event we are done accessing > + */ > +void odp_comp_compl_free(odp_comp_compl_t completion_event); > + > +/** > + * Get printable value for an odp_comp_session_t > + * > + * @param hdl odp_comp_session_t handle to be printed > + * @return uint64_t value that can be used to print/display this > + * handle > + * > + * @note This routine is intended to be used for diagnostic purposes > + * to enable applications to generate a printable value that represents > + * an odp_comp_session_t handle. > + */ > +uint64_t odp_comp_session_to_u64(odp_comp_session_t hdl); > + > +/** > + * Get printable value for an odp_comp_compl_t > + * > + * @param hdl odp_comp_compl_t handle to be printed > + * @return uint64_t value that can be used to print/display this > + * handle > + * > + * @note This routine is intended to be used for diagnostic purposes > + * to enable applications to generate a printable value that represents > + * an odp_comp_compl_t handle. > + */ > +uint64_t odp_comp_compl_to_u64(odp_comp_compl_t hdl); > + > +/** > + * @} > + */ > + > +#ifdef __cplusplus > +} > +#endif > + > +#include <odp/visibility_end.h> > +#endif > -- > 1.9.1 >