diff mbox

api:crypto: Adding IPSEC protocol APIs.

Message ID 20160923154219.28000-1-nikhil.agarwal@linaro.org
State New
Headers show

Commit Message

Nikhil Agarwal Sept. 23, 2016, 3:42 p.m. UTC
TODO items:
- Event Notification(Eg. Seq Number overflow, SA not found, SA hard/soft expiry)
- statistics APIs
- Encrpt and send APIs

Signed-off-by: Nikhil Agarwal <nikhil.agarwal@linaro.org>

---
 include/odp/api/spec/crypto.h       |  29 +++
 include/odp/api/spec/crypto_ipsec.h | 345 ++++++++++++++++++++++++++++++++++++
 2 files changed, 374 insertions(+)
 create mode 100644 include/odp/api/spec/crypto_ipsec.h

-- 
2.9.3

Comments

Maxim Uvarov Sept. 23, 2016, 1:38 p.m. UTC | #1
patch prefix has to be API-NEXT
and comments <*! - looks very stange. At least we did not have such 
styled comments before.

Maxim.

On 09/23/16 18:42, Nikhil Agarwal wrote:
> TODO items:

> - Event Notification(Eg. Seq Number overflow, SA not found, SA hard/soft expiry)

> - statistics APIs

> - Encrpt and send APIs

>

> Signed-off-by: Nikhil Agarwal <nikhil.agarwal@linaro.org>

> ---

>   include/odp/api/spec/crypto.h       |  29 +++

>   include/odp/api/spec/crypto_ipsec.h | 345 ++++++++++++++++++++++++++++++++++++

>   2 files changed, 374 insertions(+)

>   create mode 100644 include/odp/api/spec/crypto_ipsec.h

>

> diff --git a/include/odp/api/spec/crypto.h b/include/odp/api/spec/crypto.h

> index dea1fe9..b629b82 100644

> --- a/include/odp/api/spec/crypto.h

> +++ b/include/odp/api/spec/crypto.h

> @@ -144,6 +144,27 @@ typedef union odp_crypto_auth_algos_t {

>   	uint32_t all_bits;

>   } odp_crypto_auth_algos_t;

>   

> +

> +/**

> + * Network security protocols in bit field structure

> + */

> +typedef union odp_crypto_protocol_t {

> +	/** Network security protocols */

> +	struct {

> +		/** ODP_AUTH_ALG_NULL */

> +		uint32_t ipsec_esp    : 1;

> +

> +		/** ODP_AUTH_ALG_MD5_96 */

> +		uint32_t ipsec_ah     : 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_crypto_protocol_t;

>   /**

>    * Crypto API key structure

>    */

> @@ -264,6 +285,8 @@ typedef enum {

>   	ODP_CRYPTO_SES_CREATE_ERR_INV_CIPHER,

>   	/** Creation failed, bad auth params */

>   	ODP_CRYPTO_SES_CREATE_ERR_INV_AUTH,

> +	/** Creation failed, bad protocol params */

> +	ODP_CRYPTO_SES_CREATE_ERR_INV_PROTO,

>   } odp_crypto_ses_create_err_t;

>   

>   /**

> @@ -332,6 +355,12 @@ typedef struct odp_crypto_capability_t {

>   	/** Authentication algorithms implemented with HW offload */

>   	odp_crypto_auth_algos_t   hw_auths;

>   

> +	/** Supported authentication algorithms */

> +	odp_crypto_protocol_t   protocols;

> +

> +	/** Authentication algorithms implemented with HW offload */

> +	odp_crypto_protocol_t   hw_protocols;

> +

>   } odp_crypto_capability_t;

>   

>   /**

> diff --git a/include/odp/api/spec/crypto_ipsec.h b/include/odp/api/spec/crypto_ipsec.h

> new file mode 100644

> index 0000000..6a0cee0

> --- /dev/null

> +++ b/include/odp/api/spec/crypto_ipsec.h

> @@ -0,0 +1,345 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * Copyright (c) 2015 - 2016 Freescale Semiconductor, Inc.

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:	BSD-3-Clause

> + */

> +

> +/**

> + * @file

> + *

> + * ODP crypto IPSec extension

> + */

> +

> +#ifndef ODP_API_CRYPTO_IPSEC_H_

> +#define ODP_API_CRYPTO_IPSEC_H_

> +

> +#ifdef __cplusplus

> +extern "C" {

> +#endif

> +

> +

> +typedef enum odp_ipsec_mode {

> +	ODP_IPSEC_MODE_TUNNEL,	    /**< IPSec tunnel mode */

> +	ODP_IPSEC_MODE_TRANSPORT,   /**< IPSec transport mode */

> +} odp_ipsec_mode_t;

> +

> +typedef enum odp_ipsec_proto {

> +	ODP_IPSEC_ESP,		   /**< ESP protocol */

> +} odp_ipsec_proto_t;

> +

> +typedef enum odp_ipsec_outhdr_type {

> +	ODP_IPSEC_OUTHDR_IPV4,	  /**< Outer header is IPv4 */

> +	ODP_IPSEC_OUTHDR_IPV6,	  /**< Outer header is IPv6 */

> +} odp_ipsec_outhdr_type_t;

> +

> +typedef enum odp_ipsec_ar_ws {

> +	ODP_IPSEC_AR_WS_NONE,	   /**< Anti-replay is not enabled */

> +	ODP_IPSEC_AR_WS_32,	   /**< Anti-replay window size 32 */

> +	ODP_IPSEC_AR_WS_64,	   /**< Anti-replay window size 64 */

> +	ODP_IPSEC_AR_WS_128,	   /**< Anti-replay window size 128 */

> +} odp_ipsec_ar_ws_t;

> +

> +typedef struct odp_ipsec_params {

> +	odp_ipsec_mode_t ipsec_mode; /** Transport or Tunnel */

> +	uint32_t spi;		 /** SPI value */

> +	uint32_t seq;		 /** Initial SEQ number */

> +	odp_ipsec_ar_ws_t ar_ws; /** Anti-replay window size -

> +					inbound session with authentication */

> +	odp_bool_t esn;		/** Use extended sequence numbers */

> +	odp_bool_t auto_iv;	/** Auto IV generation for each operation. */

> +	uint16_t out_hdr_size;	 /** outer header size - tunnel mode */

> +	uint8_t *out_hdr;	 /** outer header - tunnel mode */

> +	odp_ipsec_outhdr_type_t out_hdr_type; /* outer header type -

> +						    tunnel mode */

> +	odp_bool_t ip_csum;	/** update/verify ip header checksum */

> +	odp_bool_t ip_dttl;	/** decrement ttl - tunnel mode encap & decap */

> +	odp_bool_t remove_outer_hdr; /** remove outer header - tunnel mode decap */

> +	odp_bool_t copy_dscp;	/** DiffServ Copy - Copy the IPv4 TOS or

> +				    IPv6 Traffic Class byte from the inner/outer

> +				    IP header to the outer/inner IP header -

> +				    tunnel mode encap & decap */

> +	odp_bool_t copy_df;	/** Copy DF bit - copy the DF bit from

> +				    the inner IP header to the

> +				    outer IP header - tunnel mode encap */

> +	odp_bool_t nat_t;	/** NAT-T encapsulation enabled - tunnel mode */

> +	odp_bool_t udp_csum;    /** Update/verify UDP csum when NAT-T enabled */

> +

> +} odp_ipsec_esp_params_t;

> +

> +/**

> + * Configure crypto session for IPsec processing

> + *

> + * Configures a crypto session for IPSec protocol processing.

> + * Packets submitted to an IPSec enabled session will have

> + * relevant IPSec headers/trailers and tunnel headers

> + * added/removed by the crypto implementation.

> + * For example, the input packet for an IPSec ESP transport

> + * enabled session should be the clear text packet with

> + * no ESP headers/trailers prepared in advance for crypto operation.

> + * The output packet will have ESP header, IV, trailer and the ESP ICV

> + * added by crypto implementation.

> + * Depending on the particular capabilities of an implementation and

> + * the parameters enabled by application, the application may be

> + * partially or completely offloaded from IPSec protocol processing.

> + * For example, if an implementation does not support checksum

> + * update for IP header after adding ESP header the application

> + * should update after crypto IPSec operation.

> + *

> + * If an implementation does not support a particular set of

> + * arguments it should return error.

> + *

> + * @param session	    Session handle

> + * @param ipsec_proto	    IPSec protocol

> + * @param ipsec_params	    IPSec parameters. Parameters which are not

> + *			    relevant for selected protocol & mode are ignored -

> + *			    e.g. outer_hdr/size set for ESP transport mode.

> + * @retval 0 on success

> + * @retval <0 on failure

> + */

> +int odp_crypto_ipsec_session_create(odp_crypto_session_params_t *ses_params,

> +				    odp_ipsec_proto_t ipsec_proto,

> +				    odp_ipsec_params_t *ipsec_params,

> +				    odp_crypto_session_t *session_out,

> +				    odp_crypto_ses_create_err_t *status);

> +

> +

> +/*!

> + * SPD Policy/SA direction information

> + */

> +enum odp_ipsec_direction {

> +	ODP_IPSEC_INBOUND =1, 	/**< Inbound Direction */

> +	ODP_IPSEC_OUTBOUND 	/**< Outbound Direction */

> +};

> +

> +

> +/*!

> + * DSCP Range information

> + */

> +struct odp_ipsec_policy_rule_dscprange {

> +	uint8_t start; 	/**< Start value in Range */

> +	uint8_t end; 	/**< End value  in Range */

> +};

> +

> +/*!

> + * Fragmentation Before Encapsulation (Redside Fragmentation)

> + */

> +enum odp_ipsec_policy_redside_fragmentation {

> +	ODP_IPSEC_POLICY_REDSIDE_FRAGMENTATION_DISABLE = 0,

> +	/**< Diasable Redside fragmentation in IPSec Policy */

> +	ODP_IPSEC_POLICY_REDSIDE_FRAGMENTATION_ENABLE

> +		/**< Enable Redside fragmentation in IPSec Policy */

> +};

> +

> +/*!

> + * Input parameters to SPD Policy addition

> + */

> +struct odp_ipsec_spd_params{

> +	uint32_t tunnel_id;

> +	/**< Tunnel ID */

> +	enum odp_ipsec_direction dir;

> +	/**< Direction: Inbound or Outbound */

> +	uint32_t n_dscp_ranges;

> +	/**< Number of DSCP Ranges */

> +	struct odp_ipsec_policy_rule_dscprange *dscp_ranges;

> +	/**< Array of DSCP Ranges */

> +	enum odp_ipsec_policy_redside_fragmentation redside;

> +	/**< Fragmentation before Encapsulation option: TRUE/FALSE */

> +	uint32_t n_selectors;

> +	/**< Number of selectors */

> +	const odp_pmr_param_t *selectors;

> +	/**< Array of Selectors */

> +};

> +

> +/*!

> + * Output parameters to SPD Policy addition

> + */

> +typedef struct odp_ipsec_spd_add_err{

> +	int32_t result;

> +	/**< 0:Success; Non Zero value: Error code indicating failure */

> +}odp_ipsec_pol_add_err_t;

> +

> +/*!

> + * @brief This API is used to add Inbound/Outbound SPD policy to SPD policy

> + * database.  This database is maintained per Name Space and Tunnel instance.

> + * This function first validates the incoming parameters

> + * and if all validations succeed, new SPD policy is added to the database.

> + *

> + * @param[in] params	Pointer to input param structure which contains

> + *			spd policy information.

> + * @param[out] policy 	Handle to the IPSEC policy.

> + * @param[out] resp	Failure code if unsuccessful.

> + *

> + * @returns 0 on Success or negative value on failure.

> + *

> + */

> +int32_t odp_ipsec_spd_add(

> +		const struct odp_ipsec_spd_params *params,

> +		odp_ipsec_policy_t *policy,

> +		odp_ipsec_pol_add_err_t *resp);

> +

> +/*!

> + * @brief This API is used to delete Inbound/Outbound SPD policy from SPD policy

> + * database.

> + *

> + * @param[in] policy 	Handle to the IPSEC policy.

> + *

> + * @returns 0 on Success or negative value on failure.

> + *

> + */

> +int32_t odp_ipsec_spd_del(odp_ipsec_policy_t policy);

> +

> +/*!

> + * @brief This API is used to flush/delete all Inbound and Outbound SPD

> + * policies.

> + *

> + * @returns 0 on Success or negative value on failure.

> + *

> + */

> +int32_t odp_ipsec_spd_flush();

> +

> +/*!

> + * @brief This API maps an IPSEC policy to an IPSEC crypto session.

> + *

> + * @param[in] policy - Handle to the IPSEC policy.

> + * @param[in] session - Handle to the IPSEC session(SA).

> + *

> + * @returns SUCCESS on success; FAILURE otherwise

> + *

> + */

> +int32_t odp_ipsec_map_pol_session(odp_ipsec_policy_t policy

> +				odp_crypto_session_t session);

> +

> +/*!

> + * @brief This API unmaps an IPSEC policy to an IPSEC crypto session.

> + *

> + * @param[in] policy - Handle to the IPSEC policy.

> + * @param[in] session - Handle to the IPSEC session(SA).

> + *

> + * @returns SUCCESS on success; FAILURE otherwise

> + *

> + */

> +int32_t odp_ipsec_unmap_pol_session(odp_ipsec_policy_t policy

> +				odp_crypto_session_t session);

> +

> +/*!

> + * SPD Policy Statistics information structure

> + */

> +typedef struct odp_ipsec_spd_stats {

> +	uint64_t received_pkts;

> +	/**< Received Outbound/Inbound packets */

> +	uint64_t processed_pkts;

> +	/**< Processed Outbound/Inbound packets */

> +	uint64_t processed_bytes;

> +	/**< Number of bytes processed on Inbound/Outbound policy */

> +

> +	/*! Struct details

> +	 */

> +	struct {

> +		uint32_t crypto_op_failed;

> +		/**< Crypto operations failed */

> +	}protocol_violation_errors;

> +	/**< Protocol violation errors */

> +

> +	/*! Struct details

> +	 */

> +	struct {

> +		uint32_t no_matching_dscp_range;

> +		/**< Matching dscp range not found in the SPD policy */

> +

> +		uint32_t submit_to_sec_failed;

> +		/**< Submission to SEC failed for crypto operations */

> +		uint32_t no_outb_sa;

> +		/**< Outbound SA not found */

> +		uint32_t frag_failed;

> +		/**< Fragmentation failed */

> +		uint32_t mem_alloc_failed;

> +		/**< Memory allocation failed for SA/SPD/descriptor etc.*/

> +		uint32_t internal_error;

> +		/**< All other errors locally encountered */

> +	}local_errors;

> +	/**< Local/internal errors */

> +

> +}odp_ipsec_spd_stats_t;

> +

> +/*!

> + * @brief This API fetches global statistics.

> + *

> + * @param[out] stats  Pointer to statistics structure filled by this API.

> + *

> + * @returns 0 on Success or negative value on failure.

> + *

> + */

> +int32_t odp_ipsec_global_stats_get(odp_ipsec_spd_stats_t *stats);

> +

> +/*!

> + * IPSec Module Capabilities

> + */

> +struct odp_ipsec_capabilities {

> +	/*! This parameter indicates if IPSec-DP is capable of doing SPD

> +	 * rule search for incoming or outgoing datagrams

> +	 */

> +

> +	uint32_t sel_store_in_spd : 1,

> +

> +		 /*! Authentication Header processing */

> +		 ah_protocol:1,

> +

> +		 /*! ESP Header processing */

> +		 esp_protocol:1,

> +

> +		 /*! IPComp related processing */

> +		 ipcomp_protocol:1,

> +

> +		 /*! IPSec Tunnel Mode processing */

> +		 tunnel_mode:1,

> +

> +		 /*! IPSec Tunnel Mode processing */

> +		 transport_mode:1,

> +

> +		 /*! This indicates if IPSec has capability to generate

> +		  * (for Outbound) and verify (for Inbound) extended sequence numbers.

> +		  */

> +		 esn:1,

> +

> +		 /*! This option indicates whether IPSec can

> +		  * handle the necessary UDP Encapsulation required at

> +		  * IPSec level for traversing NAT boxes.

> +		  */

> +		 udp_encap:1,

> +

> +		 /*! This option indicates whether IPSec can fragment packets

> +		  * before IPSec encryption, so that the resulting IPSec encrypted

> +		  * fragments do not exceed MTU

> +		  */

> +		 redside_frag:1,

> +

> +

> +	/*! Indicates the maximum number of IN and OUT SPD policies. */

> +	uint32_t	    max_spd_policies;

> +

> +	/*! Indicates the maximum number of IN and OUT IPSec SAs. */

> +	uint32_t	     max_sas;

> +}odp_ipsec_capabilities_t;

> +

> +/*!

> + * @brief This API fetches IPSec module Capabilities

> + *

> + * @param[out] capa - capabilities structure filled by API.

> + *

> + * @returns SUCCESS on success; FAILURE otherwise

> + *

> + */

> +int32_t odp_ipsec_capabilities_get(odp_ipsec_capabilities_t *capa);

> +

> +

> +#endif /* __IPSEC_API_H */

> +/**

> + * @}

> + */

> +

> +#ifdef __cplusplus

> +}

> +#endif

> +

> +#endif
Bill Fischofer Sept. 23, 2016, 7:09 p.m. UTC | #2
On Fri, Sep 23, 2016 at 8:38 AM, Maxim Uvarov <maxim.uvarov@linaro.org>
wrote:

> patch prefix has to be API-NEXT

>


It should also be marked RFC, since this isn't a complete patch, but that's
fine for review purposes


> and comments <*! - looks very stange. At least we did not have such styled

> comments before.



The ODP doxygen convention is to use comments that begin /**, not /*!.
Again a small point for the review.

Thanks, Nikhil. We'll include this in Monday's discussions.


>

>

> Maxim.

>

>

> On 09/23/16 18:42, Nikhil Agarwal wrote:

>

>> TODO items:

>> - Event Notification(Eg. Seq Number overflow, SA not found, SA hard/soft

>> expiry)

>> - statistics APIs

>> - Encrpt and send APIs

>>

>> Signed-off-by: Nikhil Agarwal <nikhil.agarwal@linaro.org>

>> ---

>>   include/odp/api/spec/crypto.h       |  29 +++

>>   include/odp/api/spec/crypto_ipsec.h | 345

>> ++++++++++++++++++++++++++++++++++++

>>   2 files changed, 374 insertions(+)

>>   create mode 100644 include/odp/api/spec/crypto_ipsec.h

>>

>> diff --git a/include/odp/api/spec/crypto.h b/include/odp/api/spec/crypto.

>> h

>> index dea1fe9..b629b82 100644

>> --- a/include/odp/api/spec/crypto.h

>> +++ b/include/odp/api/spec/crypto.h

>> @@ -144,6 +144,27 @@ typedef union odp_crypto_auth_algos_t {

>>         uint32_t all_bits;

>>   } odp_crypto_auth_algos_t;

>>   +

>> +/**

>> + * Network security protocols in bit field structure

>> + */

>> +typedef union odp_crypto_protocol_t {

>> +       /** Network security protocols */

>> +       struct {

>> +               /** ODP_AUTH_ALG_NULL */

>> +               uint32_t ipsec_esp    : 1;

>> +

>> +               /** ODP_AUTH_ALG_MD5_96 */

>> +               uint32_t ipsec_ah     : 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_crypto_protocol_t;

>>   /**

>>    * Crypto API key structure

>>    */

>> @@ -264,6 +285,8 @@ typedef enum {

>>         ODP_CRYPTO_SES_CREATE_ERR_INV_CIPHER,

>>         /** Creation failed, bad auth params */

>>         ODP_CRYPTO_SES_CREATE_ERR_INV_AUTH,

>> +       /** Creation failed, bad protocol params */

>> +       ODP_CRYPTO_SES_CREATE_ERR_INV_PROTO,

>>   } odp_crypto_ses_create_err_t;

>>     /**

>> @@ -332,6 +355,12 @@ typedef struct odp_crypto_capability_t {

>>         /** Authentication algorithms implemented with HW offload */

>>         odp_crypto_auth_algos_t   hw_auths;

>>   +     /** Supported authentication algorithms */

>> +       odp_crypto_protocol_t   protocols;

>> +

>> +       /** Authentication algorithms implemented with HW offload */

>> +       odp_crypto_protocol_t   hw_protocols;

>> +

>>   } odp_crypto_capability_t;

>>     /**

>> diff --git a/include/odp/api/spec/crypto_ipsec.h

>> b/include/odp/api/spec/crypto_ipsec.h

>> new file mode 100644

>> index 0000000..6a0cee0

>> --- /dev/null

>> +++ b/include/odp/api/spec/crypto_ipsec.h

>> @@ -0,0 +1,345 @@

>> +/* Copyright (c) 2014, Linaro Limited

>> + * Copyright (c) 2015 - 2016 Freescale Semiconductor, Inc.

>> + * All rights reserved.

>> + *

>> + * SPDX-License-Identifier:    BSD-3-Clause

>> + */

>> +

>> +/**

>> + * @file

>> + *

>> + * ODP crypto IPSec extension

>> + */

>> +

>> +#ifndef ODP_API_CRYPTO_IPSEC_H_

>> +#define ODP_API_CRYPTO_IPSEC_H_

>> +

>> +#ifdef __cplusplus

>> +extern "C" {

>> +#endif

>> +

>> +

>> +typedef enum odp_ipsec_mode {

>> +       ODP_IPSEC_MODE_TUNNEL,      /**< IPSec tunnel mode */

>> +       ODP_IPSEC_MODE_TRANSPORT,   /**< IPSec transport mode */

>> +} odp_ipsec_mode_t;

>> +

>> +typedef enum odp_ipsec_proto {

>> +       ODP_IPSEC_ESP,             /**< ESP protocol */

>> +} odp_ipsec_proto_t;

>> +

>> +typedef enum odp_ipsec_outhdr_type {

>> +       ODP_IPSEC_OUTHDR_IPV4,    /**< Outer header is IPv4 */

>> +       ODP_IPSEC_OUTHDR_IPV6,    /**< Outer header is IPv6 */

>> +} odp_ipsec_outhdr_type_t;

>> +

>> +typedef enum odp_ipsec_ar_ws {

>> +       ODP_IPSEC_AR_WS_NONE,      /**< Anti-replay is not enabled */

>> +       ODP_IPSEC_AR_WS_32,        /**< Anti-replay window size 32 */

>> +       ODP_IPSEC_AR_WS_64,        /**< Anti-replay window size 64 */

>> +       ODP_IPSEC_AR_WS_128,       /**< Anti-replay window size 128 */

>> +} odp_ipsec_ar_ws_t;

>> +

>> +typedef struct odp_ipsec_params {

>> +       odp_ipsec_mode_t ipsec_mode; /** Transport or Tunnel */

>> +       uint32_t spi;            /** SPI value */

>> +       uint32_t seq;            /** Initial SEQ number */

>> +       odp_ipsec_ar_ws_t ar_ws; /** Anti-replay window size -

>> +                                       inbound session with

>> authentication */

>> +       odp_bool_t esn;         /** Use extended sequence numbers */

>> +       odp_bool_t auto_iv;     /** Auto IV generation for each

>> operation. */

>> +       uint16_t out_hdr_size;   /** outer header size - tunnel mode */

>> +       uint8_t *out_hdr;        /** outer header - tunnel mode */

>> +       odp_ipsec_outhdr_type_t out_hdr_type; /* outer header type -

>> +                                                   tunnel mode */

>> +       odp_bool_t ip_csum;     /** update/verify ip header checksum */

>> +       odp_bool_t ip_dttl;     /** decrement ttl - tunnel mode encap &

>> decap */

>> +       odp_bool_t remove_outer_hdr; /** remove outer header - tunnel

>> mode decap */

>> +       odp_bool_t copy_dscp;   /** DiffServ Copy - Copy the IPv4 TOS or

>> +                                   IPv6 Traffic Class byte from the

>> inner/outer

>> +                                   IP header to the outer/inner IP

>> header -

>> +                                   tunnel mode encap & decap */

>> +       odp_bool_t copy_df;     /** Copy DF bit - copy the DF bit from

>> +                                   the inner IP header to the

>> +                                   outer IP header - tunnel mode encap */

>> +       odp_bool_t nat_t;       /** NAT-T encapsulation enabled - tunnel

>> mode */

>> +       odp_bool_t udp_csum;    /** Update/verify UDP csum when NAT-T

>> enabled */

>> +

>> +} odp_ipsec_esp_params_t;

>> +

>> +/**

>> + * Configure crypto session for IPsec processing

>> + *

>> + * Configures a crypto session for IPSec protocol processing.

>> + * Packets submitted to an IPSec enabled session will have

>> + * relevant IPSec headers/trailers and tunnel headers

>> + * added/removed by the crypto implementation.

>> + * For example, the input packet for an IPSec ESP transport

>> + * enabled session should be the clear text packet with

>> + * no ESP headers/trailers prepared in advance for crypto operation.

>> + * The output packet will have ESP header, IV, trailer and the ESP ICV

>> + * added by crypto implementation.

>> + * Depending on the particular capabilities of an implementation and

>> + * the parameters enabled by application, the application may be

>> + * partially or completely offloaded from IPSec protocol processing.

>> + * For example, if an implementation does not support checksum

>> + * update for IP header after adding ESP header the application

>> + * should update after crypto IPSec operation.

>> + *

>> + * If an implementation does not support a particular set of

>> + * arguments it should return error.

>> + *

>> + * @param session          Session handle

>> + * @param ipsec_proto      IPSec protocol

>> + * @param ipsec_params     IPSec parameters. Parameters which are not

>> + *                         relevant for selected protocol & mode are

>> ignored -

>> + *                         e.g. outer_hdr/size set for ESP transport

>> mode.

>> + * @retval 0 on success

>> + * @retval <0 on failure

>> + */

>> +int odp_crypto_ipsec_session_create(odp_crypto_session_params_t

>> *ses_params,

>> +                                   odp_ipsec_proto_t ipsec_proto,

>> +                                   odp_ipsec_params_t *ipsec_params,

>> +                                   odp_crypto_session_t *session_out,

>> +                                   odp_crypto_ses_create_err_t *status);

>> +

>> +

>> +/*!

>> + * SPD Policy/SA direction information

>> + */

>> +enum odp_ipsec_direction {

>> +       ODP_IPSEC_INBOUND =1,   /**< Inbound Direction */

>> +       ODP_IPSEC_OUTBOUND      /**< Outbound Direction */

>> +};

>> +

>> +

>> +/*!

>> + * DSCP Range information

>> + */

>> +struct odp_ipsec_policy_rule_dscprange {

>> +       uint8_t start;  /**< Start value in Range */

>> +       uint8_t end;    /**< End value  in Range */

>> +};

>> +

>> +/*!

>> + * Fragmentation Before Encapsulation (Redside Fragmentation)

>> + */

>> +enum odp_ipsec_policy_redside_fragmentation {

>> +       ODP_IPSEC_POLICY_REDSIDE_FRAGMENTATION_DISABLE = 0,

>> +       /**< Diasable Redside fragmentation in IPSec Policy */

>> +       ODP_IPSEC_POLICY_REDSIDE_FRAGMENTATION_ENABLE

>> +               /**< Enable Redside fragmentation in IPSec Policy */

>> +};

>> +

>> +/*!

>> + * Input parameters to SPD Policy addition

>> + */

>> +struct odp_ipsec_spd_params{

>> +       uint32_t tunnel_id;

>> +       /**< Tunnel ID */

>> +       enum odp_ipsec_direction dir;

>> +       /**< Direction: Inbound or Outbound */

>> +       uint32_t n_dscp_ranges;

>> +       /**< Number of DSCP Ranges */

>> +       struct odp_ipsec_policy_rule_dscprange *dscp_ranges;

>> +       /**< Array of DSCP Ranges */

>> +       enum odp_ipsec_policy_redside_fragmentation redside;

>> +       /**< Fragmentation before Encapsulation option: TRUE/FALSE */

>> +       uint32_t n_selectors;

>> +       /**< Number of selectors */

>> +       const odp_pmr_param_t *selectors;

>> +       /**< Array of Selectors */

>> +};

>> +

>> +/*!

>> + * Output parameters to SPD Policy addition

>> + */

>> +typedef struct odp_ipsec_spd_add_err{

>> +       int32_t result;

>> +       /**< 0:Success; Non Zero value: Error code indicating failure */

>> +}odp_ipsec_pol_add_err_t;

>> +

>> +/*!

>> + * @brief This API is used to add Inbound/Outbound SPD policy to SPD

>> policy

>> + * database.  This database is maintained per Name Space and Tunnel

>> instance.

>> + * This function first validates the incoming parameters

>> + * and if all validations succeed, new SPD policy is added to the

>> database.

>> + *

>> + * @param[in] params   Pointer to input param structure which contains

>> + *                     spd policy information.

>> + * @param[out] policy  Handle to the IPSEC policy.

>> + * @param[out] resp    Failure code if unsuccessful.

>> + *

>> + * @returns 0 on Success or negative value on failure.

>> + *

>> + */

>> +int32_t odp_ipsec_spd_add(

>> +               const struct odp_ipsec_spd_params *params,

>> +               odp_ipsec_policy_t *policy,

>> +               odp_ipsec_pol_add_err_t *resp);

>> +

>> +/*!

>> + * @brief This API is used to delete Inbound/Outbound SPD policy from

>> SPD policy

>> + * database.

>> + *

>> + * @param[in] policy   Handle to the IPSEC policy.

>> + *

>> + * @returns 0 on Success or negative value on failure.

>> + *

>> + */

>> +int32_t odp_ipsec_spd_del(odp_ipsec_policy_t policy);

>> +

>> +/*!

>> + * @brief This API is used to flush/delete all Inbound and Outbound SPD

>> + * policies.

>> + *

>> + * @returns 0 on Success or negative value on failure.

>> + *

>> + */

>> +int32_t odp_ipsec_spd_flush();

>> +

>> +/*!

>> + * @brief This API maps an IPSEC policy to an IPSEC crypto session.

>> + *

>> + * @param[in] policy - Handle to the IPSEC policy.

>> + * @param[in] session - Handle to the IPSEC session(SA).

>> + *

>> + * @returns SUCCESS on success; FAILURE otherwise

>> + *

>> + */

>> +int32_t odp_ipsec_map_pol_session(odp_ipsec_policy_t policy

>> +                               odp_crypto_session_t session);

>> +

>> +/*!

>> + * @brief This API unmaps an IPSEC policy to an IPSEC crypto session.

>> + *

>> + * @param[in] policy - Handle to the IPSEC policy.

>> + * @param[in] session - Handle to the IPSEC session(SA).

>> + *

>> + * @returns SUCCESS on success; FAILURE otherwise

>> + *

>> + */

>> +int32_t odp_ipsec_unmap_pol_session(odp_ipsec_policy_t policy

>> +                               odp_crypto_session_t session);

>> +

>> +/*!

>> + * SPD Policy Statistics information structure

>> + */

>> +typedef struct odp_ipsec_spd_stats {

>> +       uint64_t received_pkts;

>> +       /**< Received Outbound/Inbound packets */

>> +       uint64_t processed_pkts;

>> +       /**< Processed Outbound/Inbound packets */

>> +       uint64_t processed_bytes;

>> +       /**< Number of bytes processed on Inbound/Outbound policy */

>> +

>> +       /*! Struct details

>> +        */

>> +       struct {

>> +               uint32_t crypto_op_failed;

>> +               /**< Crypto operations failed */

>> +       }protocol_violation_errors;

>> +       /**< Protocol violation errors */

>> +

>> +       /*! Struct details

>> +        */

>> +       struct {

>> +               uint32_t no_matching_dscp_range;

>> +               /**< Matching dscp range not found in the SPD policy */

>> +

>> +               uint32_t submit_to_sec_failed;

>> +               /**< Submission to SEC failed for crypto operations */

>> +               uint32_t no_outb_sa;

>> +               /**< Outbound SA not found */

>> +               uint32_t frag_failed;

>> +               /**< Fragmentation failed */

>> +               uint32_t mem_alloc_failed;

>> +               /**< Memory allocation failed for SA/SPD/descriptor etc.*/

>> +               uint32_t internal_error;

>> +               /**< All other errors locally encountered */

>> +       }local_errors;

>> +       /**< Local/internal errors */

>> +

>> +}odp_ipsec_spd_stats_t;

>> +

>> +/*!

>> + * @brief This API fetches global statistics.

>> + *

>> + * @param[out] stats  Pointer to statistics structure filled by this API.

>> + *

>> + * @returns 0 on Success or negative value on failure.

>> + *

>> + */

>> +int32_t odp_ipsec_global_stats_get(odp_ipsec_spd_stats_t *stats);

>> +

>> +/*!

>> + * IPSec Module Capabilities

>> + */

>> +struct odp_ipsec_capabilities {

>> +       /*! This parameter indicates if IPSec-DP is capable of doing SPD

>> +        * rule search for incoming or outgoing datagrams

>> +        */

>> +

>> +       uint32_t sel_store_in_spd : 1,

>> +

>> +                /*! Authentication Header processing */

>> +                ah_protocol:1,

>> +

>> +                /*! ESP Header processing */

>> +                esp_protocol:1,

>> +

>> +                /*! IPComp related processing */

>> +                ipcomp_protocol:1,

>> +

>> +                /*! IPSec Tunnel Mode processing */

>> +                tunnel_mode:1,

>> +

>> +                /*! IPSec Tunnel Mode processing */

>> +                transport_mode:1,

>> +

>> +                /*! This indicates if IPSec has capability to generate

>> +                 * (for Outbound) and verify (for Inbound) extended

>> sequence numbers.

>> +                 */

>> +                esn:1,

>> +

>> +                /*! This option indicates whether IPSec can

>> +                 * handle the necessary UDP Encapsulation required at

>> +                 * IPSec level for traversing NAT boxes.

>> +                 */

>> +                udp_encap:1,

>> +

>> +                /*! This option indicates whether IPSec can fragment

>> packets

>> +                 * before IPSec encryption, so that the resulting IPSec

>> encrypted

>> +                 * fragments do not exceed MTU

>> +                 */

>> +                redside_frag:1,

>> +

>> +

>> +       /*! Indicates the maximum number of IN and OUT SPD policies. */

>> +       uint32_t            max_spd_policies;

>> +

>> +       /*! Indicates the maximum number of IN and OUT IPSec SAs. */

>> +       uint32_t             max_sas;

>> +}odp_ipsec_capabilities_t;

>> +

>> +/*!

>> + * @brief This API fetches IPSec module Capabilities

>> + *

>> + * @param[out] capa - capabilities structure filled by API.

>> + *

>> + * @returns SUCCESS on success; FAILURE otherwise

>> + *

>> + */

>> +int32_t odp_ipsec_capabilities_get(odp_ipsec_capabilities_t *capa);

>> +

>> +

>> +#endif /* __IPSEC_API_H */

>> +/**

>> + * @}

>> + */

>> +

>> +#ifdef __cplusplus

>> +}

>> +#endif

>> +

>> +#endif

>>

>

>

>
diff mbox

Patch

diff --git a/include/odp/api/spec/crypto.h b/include/odp/api/spec/crypto.h
index dea1fe9..b629b82 100644
--- a/include/odp/api/spec/crypto.h
+++ b/include/odp/api/spec/crypto.h
@@ -144,6 +144,27 @@  typedef union odp_crypto_auth_algos_t {
 	uint32_t all_bits;
 } odp_crypto_auth_algos_t;
 
+
+/**
+ * Network security protocols in bit field structure
+ */
+typedef union odp_crypto_protocol_t {
+	/** Network security protocols */
+	struct {
+		/** ODP_AUTH_ALG_NULL */
+		uint32_t ipsec_esp    : 1;
+
+		/** ODP_AUTH_ALG_MD5_96 */
+		uint32_t ipsec_ah     : 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_crypto_protocol_t;
 /**
  * Crypto API key structure
  */
@@ -264,6 +285,8 @@  typedef enum {
 	ODP_CRYPTO_SES_CREATE_ERR_INV_CIPHER,
 	/** Creation failed, bad auth params */
 	ODP_CRYPTO_SES_CREATE_ERR_INV_AUTH,
+	/** Creation failed, bad protocol params */
+	ODP_CRYPTO_SES_CREATE_ERR_INV_PROTO,
 } odp_crypto_ses_create_err_t;
 
 /**
@@ -332,6 +355,12 @@  typedef struct odp_crypto_capability_t {
 	/** Authentication algorithms implemented with HW offload */
 	odp_crypto_auth_algos_t   hw_auths;
 
+	/** Supported authentication algorithms */
+	odp_crypto_protocol_t   protocols;
+
+	/** Authentication algorithms implemented with HW offload */
+	odp_crypto_protocol_t   hw_protocols;
+
 } odp_crypto_capability_t;
 
 /**
diff --git a/include/odp/api/spec/crypto_ipsec.h b/include/odp/api/spec/crypto_ipsec.h
new file mode 100644
index 0000000..6a0cee0
--- /dev/null
+++ b/include/odp/api/spec/crypto_ipsec.h
@@ -0,0 +1,345 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * Copyright (c) 2015 - 2016 Freescale Semiconductor, Inc.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:	BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP crypto IPSec extension
+ */
+
+#ifndef ODP_API_CRYPTO_IPSEC_H_
+#define ODP_API_CRYPTO_IPSEC_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef enum odp_ipsec_mode {
+	ODP_IPSEC_MODE_TUNNEL,	    /**< IPSec tunnel mode */
+	ODP_IPSEC_MODE_TRANSPORT,   /**< IPSec transport mode */
+} odp_ipsec_mode_t;
+
+typedef enum odp_ipsec_proto {
+	ODP_IPSEC_ESP,		   /**< ESP protocol */
+} odp_ipsec_proto_t;
+
+typedef enum odp_ipsec_outhdr_type {
+	ODP_IPSEC_OUTHDR_IPV4,	  /**< Outer header is IPv4 */
+	ODP_IPSEC_OUTHDR_IPV6,	  /**< Outer header is IPv6 */
+} odp_ipsec_outhdr_type_t;
+
+typedef enum odp_ipsec_ar_ws {
+	ODP_IPSEC_AR_WS_NONE,	   /**< Anti-replay is not enabled */
+	ODP_IPSEC_AR_WS_32,	   /**< Anti-replay window size 32 */
+	ODP_IPSEC_AR_WS_64,	   /**< Anti-replay window size 64 */
+	ODP_IPSEC_AR_WS_128,	   /**< Anti-replay window size 128 */
+} odp_ipsec_ar_ws_t;
+
+typedef struct odp_ipsec_params {
+	odp_ipsec_mode_t ipsec_mode; /** Transport or Tunnel */
+	uint32_t spi;		 /** SPI value */
+	uint32_t seq;		 /** Initial SEQ number */
+	odp_ipsec_ar_ws_t ar_ws; /** Anti-replay window size -
+					inbound session with authentication */
+	odp_bool_t esn;		/** Use extended sequence numbers */
+	odp_bool_t auto_iv;	/** Auto IV generation for each operation. */
+	uint16_t out_hdr_size;	 /** outer header size - tunnel mode */
+	uint8_t *out_hdr;	 /** outer header - tunnel mode */
+	odp_ipsec_outhdr_type_t out_hdr_type; /* outer header type -
+						    tunnel mode */
+	odp_bool_t ip_csum;	/** update/verify ip header checksum */
+	odp_bool_t ip_dttl;	/** decrement ttl - tunnel mode encap & decap */
+	odp_bool_t remove_outer_hdr; /** remove outer header - tunnel mode decap */
+	odp_bool_t copy_dscp;	/** DiffServ Copy - Copy the IPv4 TOS or
+				    IPv6 Traffic Class byte from the inner/outer
+				    IP header to the outer/inner IP header -
+				    tunnel mode encap & decap */
+	odp_bool_t copy_df;	/** Copy DF bit - copy the DF bit from
+				    the inner IP header to the
+				    outer IP header - tunnel mode encap */
+	odp_bool_t nat_t;	/** NAT-T encapsulation enabled - tunnel mode */
+	odp_bool_t udp_csum;    /** Update/verify UDP csum when NAT-T enabled */
+
+} odp_ipsec_esp_params_t;
+
+/**
+ * Configure crypto session for IPsec processing
+ *
+ * Configures a crypto session for IPSec protocol processing.
+ * Packets submitted to an IPSec enabled session will have
+ * relevant IPSec headers/trailers and tunnel headers
+ * added/removed by the crypto implementation.
+ * For example, the input packet for an IPSec ESP transport
+ * enabled session should be the clear text packet with
+ * no ESP headers/trailers prepared in advance for crypto operation.
+ * The output packet will have ESP header, IV, trailer and the ESP ICV
+ * added by crypto implementation.
+ * Depending on the particular capabilities of an implementation and
+ * the parameters enabled by application, the application may be
+ * partially or completely offloaded from IPSec protocol processing.
+ * For example, if an implementation does not support checksum
+ * update for IP header after adding ESP header the application
+ * should update after crypto IPSec operation.
+ *
+ * If an implementation does not support a particular set of
+ * arguments it should return error.
+ *
+ * @param session	    Session handle
+ * @param ipsec_proto	    IPSec protocol
+ * @param ipsec_params	    IPSec parameters. Parameters which are not
+ *			    relevant for selected protocol & mode are ignored -
+ *			    e.g. outer_hdr/size set for ESP transport mode.
+ * @retval 0 on success
+ * @retval <0 on failure
+ */
+int odp_crypto_ipsec_session_create(odp_crypto_session_params_t *ses_params,
+				    odp_ipsec_proto_t ipsec_proto,
+				    odp_ipsec_params_t *ipsec_params,
+				    odp_crypto_session_t *session_out,
+				    odp_crypto_ses_create_err_t *status);
+
+
+/*!
+ * SPD Policy/SA direction information
+ */
+enum odp_ipsec_direction {
+	ODP_IPSEC_INBOUND =1, 	/**< Inbound Direction */
+	ODP_IPSEC_OUTBOUND 	/**< Outbound Direction */
+};
+
+
+/*!
+ * DSCP Range information
+ */
+struct odp_ipsec_policy_rule_dscprange {
+	uint8_t start; 	/**< Start value in Range */
+	uint8_t end; 	/**< End value  in Range */
+};
+
+/*!
+ * Fragmentation Before Encapsulation (Redside Fragmentation)
+ */
+enum odp_ipsec_policy_redside_fragmentation {
+	ODP_IPSEC_POLICY_REDSIDE_FRAGMENTATION_DISABLE = 0,
+	/**< Diasable Redside fragmentation in IPSec Policy */
+	ODP_IPSEC_POLICY_REDSIDE_FRAGMENTATION_ENABLE
+		/**< Enable Redside fragmentation in IPSec Policy */
+};
+
+/*!
+ * Input parameters to SPD Policy addition
+ */
+struct odp_ipsec_spd_params{
+	uint32_t tunnel_id;
+	/**< Tunnel ID */
+	enum odp_ipsec_direction dir;
+	/**< Direction: Inbound or Outbound */
+	uint32_t n_dscp_ranges;
+	/**< Number of DSCP Ranges */
+	struct odp_ipsec_policy_rule_dscprange *dscp_ranges;
+	/**< Array of DSCP Ranges */
+	enum odp_ipsec_policy_redside_fragmentation redside;
+	/**< Fragmentation before Encapsulation option: TRUE/FALSE */
+	uint32_t n_selectors;
+	/**< Number of selectors */
+	const odp_pmr_param_t *selectors;
+	/**< Array of Selectors */
+};
+
+/*!
+ * Output parameters to SPD Policy addition
+ */
+typedef struct odp_ipsec_spd_add_err{
+	int32_t result;
+	/**< 0:Success; Non Zero value: Error code indicating failure */
+}odp_ipsec_pol_add_err_t;
+
+/*!
+ * @brief This API is used to add Inbound/Outbound SPD policy to SPD policy
+ * database.  This database is maintained per Name Space and Tunnel instance.
+ * This function first validates the incoming parameters
+ * and if all validations succeed, new SPD policy is added to the database.
+ *
+ * @param[in] params	Pointer to input param structure which contains
+ *			spd policy information.
+ * @param[out] policy 	Handle to the IPSEC policy.
+ * @param[out] resp	Failure code if unsuccessful.
+ *
+ * @returns 0 on Success or negative value on failure.
+ *
+ */
+int32_t odp_ipsec_spd_add(
+		const struct odp_ipsec_spd_params *params,
+		odp_ipsec_policy_t *policy,
+		odp_ipsec_pol_add_err_t *resp);
+
+/*!
+ * @brief This API is used to delete Inbound/Outbound SPD policy from SPD policy
+ * database.
+ *
+ * @param[in] policy 	Handle to the IPSEC policy.
+ *
+ * @returns 0 on Success or negative value on failure.
+ *
+ */
+int32_t odp_ipsec_spd_del(odp_ipsec_policy_t policy);
+
+/*!
+ * @brief This API is used to flush/delete all Inbound and Outbound SPD
+ * policies.
+ *
+ * @returns 0 on Success or negative value on failure.
+ *
+ */
+int32_t odp_ipsec_spd_flush();
+
+/*!
+ * @brief This API maps an IPSEC policy to an IPSEC crypto session.
+ *
+ * @param[in] policy - Handle to the IPSEC policy.
+ * @param[in] session - Handle to the IPSEC session(SA).
+ *
+ * @returns SUCCESS on success; FAILURE otherwise
+ *
+ */
+int32_t odp_ipsec_map_pol_session(odp_ipsec_policy_t policy
+				odp_crypto_session_t session);
+
+/*!
+ * @brief This API unmaps an IPSEC policy to an IPSEC crypto session.
+ *
+ * @param[in] policy - Handle to the IPSEC policy.
+ * @param[in] session - Handle to the IPSEC session(SA).
+ *
+ * @returns SUCCESS on success; FAILURE otherwise
+ *
+ */
+int32_t odp_ipsec_unmap_pol_session(odp_ipsec_policy_t policy
+				odp_crypto_session_t session);
+
+/*!
+ * SPD Policy Statistics information structure
+ */
+typedef struct odp_ipsec_spd_stats {
+	uint64_t received_pkts;
+	/**< Received Outbound/Inbound packets */
+	uint64_t processed_pkts;
+	/**< Processed Outbound/Inbound packets */
+	uint64_t processed_bytes;
+	/**< Number of bytes processed on Inbound/Outbound policy */
+
+	/*! Struct details
+	 */
+	struct {
+		uint32_t crypto_op_failed;
+		/**< Crypto operations failed */
+	}protocol_violation_errors;
+	/**< Protocol violation errors */
+
+	/*! Struct details
+	 */
+	struct {
+		uint32_t no_matching_dscp_range;
+		/**< Matching dscp range not found in the SPD policy */
+
+		uint32_t submit_to_sec_failed;
+		/**< Submission to SEC failed for crypto operations */
+		uint32_t no_outb_sa;
+		/**< Outbound SA not found */
+		uint32_t frag_failed;
+		/**< Fragmentation failed */
+		uint32_t mem_alloc_failed;
+		/**< Memory allocation failed for SA/SPD/descriptor etc.*/
+		uint32_t internal_error;
+		/**< All other errors locally encountered */
+	}local_errors;
+	/**< Local/internal errors */
+
+}odp_ipsec_spd_stats_t;
+
+/*!
+ * @brief This API fetches global statistics.
+ *
+ * @param[out] stats  Pointer to statistics structure filled by this API.
+ *
+ * @returns 0 on Success or negative value on failure.
+ *
+ */
+int32_t odp_ipsec_global_stats_get(odp_ipsec_spd_stats_t *stats);
+
+/*!
+ * IPSec Module Capabilities
+ */
+struct odp_ipsec_capabilities {
+	/*! This parameter indicates if IPSec-DP is capable of doing SPD
+	 * rule search for incoming or outgoing datagrams
+	 */
+
+	uint32_t sel_store_in_spd : 1,
+
+		 /*! Authentication Header processing */
+		 ah_protocol:1,
+
+		 /*! ESP Header processing */
+		 esp_protocol:1,
+
+		 /*! IPComp related processing */
+		 ipcomp_protocol:1,
+
+		 /*! IPSec Tunnel Mode processing */
+		 tunnel_mode:1,
+
+		 /*! IPSec Tunnel Mode processing */
+		 transport_mode:1,
+
+		 /*! This indicates if IPSec has capability to generate
+		  * (for Outbound) and verify (for Inbound) extended sequence numbers.
+		  */
+		 esn:1,
+
+		 /*! This option indicates whether IPSec can
+		  * handle the necessary UDP Encapsulation required at
+		  * IPSec level for traversing NAT boxes.
+		  */
+		 udp_encap:1,
+
+		 /*! This option indicates whether IPSec can fragment packets
+		  * before IPSec encryption, so that the resulting IPSec encrypted
+		  * fragments do not exceed MTU
+		  */
+		 redside_frag:1,
+
+
+	/*! Indicates the maximum number of IN and OUT SPD policies. */
+	uint32_t	    max_spd_policies;
+
+	/*! Indicates the maximum number of IN and OUT IPSec SAs. */
+	uint32_t	     max_sas;
+}odp_ipsec_capabilities_t;
+
+/*!
+ * @brief This API fetches IPSec module Capabilities
+ *
+ * @param[out] capa - capabilities structure filled by API.
+ *
+ * @returns SUCCESS on success; FAILURE otherwise
+ *
+ */
+int32_t odp_ipsec_capabilities_get(odp_ipsec_capabilities_t *capa);
+
+
+#endif /* __IPSEC_API_H */
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif