/*
 **************************************************************************
 * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all copies.
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 **************************************************************************
 */

/**
 * @file nss_ipsec_cmn.h
 *	NSS IPsec interface definitions.
 */

#ifndef __NSS_IPSEC_CMN_H_
#define __NSS_IPSEC_CMN_H_

/**
 * @addtogroup nss_ipsec_subsystem
 * @{
 */

#define NSS_IPSEC_CMN_ARPHRD_IPSEC 31 /**< ARP (iana.org) hardware type for an IPsec tunnel. */

/**
 * Flags for SA configuration.
 */
#define NSS_IPSEC_CMN_FLAG_IPV6 (0x1 << 0)		/**< IPv6 header. */
#define NSS_IPSEC_CMN_FLAG_IPV4_NATT (0x1 << 1)		/**< IPv4 NAT traversal. */
#define NSS_IPSEC_CMN_FLAG_IPV4_UDP (0x1 << 2)		/**< IPv4 UDP traversal. */
#define NSS_IPSEC_CMN_FLAG_ESP_ESN (0x1 << 3)		/**< Enable ESP extended sequence number. */
#define NSS_IPSEC_CMN_FLAG_ESP_SKIP (0x1 << 4)		/**< Skip ESP sequence number and ICV. */
#define NSS_IPSEC_CMN_FLAG_ESP_REPLAY (0x1 << 5)	/**< Check ESP replay counter. */
#define NSS_IPSEC_CMN_FLAG_CIPHER_NULL (0x1 << 6)	/**< NULL cipher mode. */
#define NSS_IPSEC_CMN_FLAG_CIPHER_GCM (0x1 << 7)	/**< Galios counter mode. */
#define NSS_IPSEC_CMN_FLAG_COPY_DSCP (0x1 << 8)		/**< Copy DSCP from inner to outer header. */
#define NSS_IPSEC_CMN_FLAG_COPY_DF (0x1 << 9)		/**< Copy DF from inner node to outer node. */
#define NSS_IPSEC_CMN_FLAG_MODE_TRANS (0x1 << 10)	/**< Encapsulate or decapsulate in transport mode (default is tunnel mode). */

#define NSS_IPSEC_CMN_FLAG_HDR_MASK \
	(NSS_IPSEC_CMN_FLAG_IPV6 | NSS_IPSEC_CMN_FLAG_IPV4_NATT | NSS_IPSEC_CMN_FLAG_IPV4_UDP)
							/**< Flag header mask. */

#define NSS_IPSEC_CMN_FEATURE_INLINE_ACCEL 0x1		/**< Interface enabled for inline exception. */

#define NSS_IPSEC_CMN_MDATA_VERSION 0x01		/**< Metadata version. */
#define NSS_IPSEC_CMN_MDATA_MAGIC 0x8893		/**< Metadata magic. */
#define NSS_IPSEC_CMN_MDATA_ORIGIN_HOST 0x01		/**< Metadata originates at the host. */
#define NSS_IPSEC_CMN_MDATA_ALIGN_SZ sizeof(uint32_t)	/**< Metadata alignment size. */
/**
 * nss_ipsec_cmn_msg_type
 *	IPsec message types.
 */
enum nss_ipsec_cmn_msg_type {
	NSS_IPSEC_CMN_MSG_TYPE_NONE = 0,		/**< Nothing to do. */
	NSS_IPSEC_CMN_MSG_TYPE_NODE_CONFIG = 1,		/**< Configure IPsec node. */
	NSS_IPSEC_CMN_MSG_TYPE_CTX_CONFIG = 2,		/**< Configure IPsec dynamic node. */
	NSS_IPSEC_CMN_MSG_TYPE_CTX_SYNC = 3,		/**< Synchronize context statistics to host. */
	NSS_IPSEC_CMN_MSG_TYPE_SA_CREATE = 4,		/**< Create SA. */
	NSS_IPSEC_CMN_MSG_TYPE_SA_DESTROY = 5,		/**< Destroy SA. */
	NSS_IPSEC_CMN_MSG_TYPE_SA_SYNC = 6,		/**< Synchronize SA statistics to host. */
	NSS_IPSEC_CMN_MSG_TYPE_FLOW_CREATE = 7,		/**< Create flow. */
	NSS_IPSEC_CMN_MSG_TYPE_FLOW_DESTROY = 8,	/**< Delete flow. */
	NSS_IPSEC_CMN_MSG_TYPE_MAX
};

/**
 * nss_ipsec_cmn_msg_error
 *	IPsec message error types.
 */
enum nss_ipsec_cmn_msg_error {
	NSS_IPSEC_CMN_MSG_ERROR_NONE = 0,		/**< No error. */
	NSS_IPSEC_CMN_MSG_ERROR_CTX_INVAL = 1,		/**< Invalid context. */
	NSS_IPSEC_CMN_MSG_ERROR_SA_ALLOC = 2,		/**< Failed to allocate SA. */
	NSS_IPSEC_CMN_MSG_ERROR_SA_INVAL = 3,		/**< Invalid SA. */
	NSS_IPSEC_CMN_MSG_ERROR_SA_DUP = 4,			/**< SA exists. */
	NSS_IPSEC_CMN_MSG_ERROR_SA_INUSE = 5,		/**< SA is in use. */
	NSS_IPSEC_CMN_MSG_ERROR_FLOW_ALLOC = 6,		/**< Failed to allocate flow. */
	NSS_IPSEC_CMN_MSG_ERROR_FLOW_INVAL = 7,		/**< Flow not found. */
	NSS_IPSEC_CMN_MSG_ERROR_FLOW_DUP = 8,		/**< Duplicate flow. */
	NSS_IPSEC_CMN_MSG_ERROR_FLOW_SA = 9,		/**< Failed to find SA for the flow. */
	NSS_IPSEC_CMN_MSG_ERROR_NODE_REG_DYNIF = 10,
							/**< Error registering dynamic interface. */
	NSS_IPSEC_CMN_MSG_ERROR_UNHANDLED_MSG= 11,	/**< Unhandled message type. */
	NSS_IPSEC_CMN_MSG_ERROR_MAX			/**< Maximum error message. */
};

/**
 * nss_ipsec_cmn_ctx_type
 *	IPsec context type.
 */
enum nss_ipsec_cmn_ctx_type {
	NSS_IPSEC_CMN_CTX_TYPE_NONE = 0,	/**< Invalid direction. */
	NSS_IPSEC_CMN_CTX_TYPE_INNER,		/**< Encapsulation. */
	NSS_IPSEC_CMN_CTX_TYPE_MDATA_INNER,	/**< Metadata for encapsulation. */
	NSS_IPSEC_CMN_CTX_TYPE_OUTER,		/**< Decapsulation. */
	NSS_IPSEC_CMN_CTX_TYPE_MDATA_OUTER,	/**< Metadata for decapsulation. */
	NSS_IPSEC_CMN_CTX_TYPE_REDIR,		/**< Redirect. */
	NSS_IPSEC_CMN_CTX_TYPE_MAX
};

/**
 * nss_ipsec_cmn_stats_types
 *	IPsec common statistics types.
 */
enum nss_ipsec_cmn_stats_types {
	NSS_IPSEC_CMN_STATS_FAIL_HEADROOM = NSS_STATS_NODE_MAX,
						/**< Failure in headroom check. */
	NSS_IPSEC_CMN_STATS_FAIL_TAILROOM,	/**< Failure in tailroom check. */
	NSS_IPSEC_CMN_STATS_FAIL_REPLAY,	/**< Failure in anti-replay check. */
	NSS_IPSEC_CMN_STATS_FAIL_REPLAY_DUP,	/**< Failure in anti-replay; duplicate records. */
	NSS_IPSEC_CMN_STATS_FAIL_REPLAY_WIN,	/**< Failure in anti-replay; packet outside the window. */
	NSS_IPSEC_CMN_STATS_FAIL_PBUF_CRYPTO,	/**< Failure in crypto pbuf allocation. */
	NSS_IPSEC_CMN_STATS_FAIL_QUEUE,		/**< Failure due to queue full in IPsec. */
	NSS_IPSEC_CMN_STATS_FAIL_QUEUE_CRYPTO,	/**< Failure due to queue full in crypto. */
	NSS_IPSEC_CMN_STATS_FAIL_QUEUE_NEXTHOP,	/**< Failure due to queue full in next hop. */
	NSS_IPSEC_CMN_STATS_FAIL_PBUF_ALLOC,	/**< Failure in pbuf allocation. */
	NSS_IPSEC_CMN_STATS_FAIL_PBUF_LINEAR,	/**< Failure in pbuf linearization. */
	NSS_IPSEC_CMN_STATS_FAIL_PBUF_STATS,	/**< Failure in pbuf allocation for statistics. */
	NSS_IPSEC_CMN_STATS_FAIL_PBUF_ALIGN,	/**< Failure in pbuf access due to non-word alignmnt */
	NSS_IPSEC_CMN_STATS_FAIL_CIPHER,	/**< Failure in decrypting the data. */
	NSS_IPSEC_CMN_STATS_FAIL_AUTH,		/**< Failure in authenticating the data. */
	NSS_IPSEC_CMN_STATS_FAIL_SEQ_OVF,	/**< Failure due to sequence number rollover. */
	NSS_IPSEC_CMN_STATS_FAIL_BLK_LEN,	/**< Failure in decapsulation due to bad cipher block length. */
	NSS_IPSEC_CMN_STATS_FAIL_HASH_LEN,	/**< Failure in decapsulation due to bad hash block length. */
	NSS_IPSEC_CMN_STATS_FAIL_TRANSFORM,	/**< Failure in transformation; general error. */
	NSS_IPSEC_CMN_STATS_FAIL_CRYPTO,	/**< Failure in crypto transformation. */
	NSS_IPSEC_CMN_STATS_FAIL_CLE,		/**< Failure in classification; general failure. */
	NSS_IPSEC_CMN_STATS_IS_STOPPED,		/**< Indicates if SA is stopped; for example: sequence overflow. */
	NSS_IPSEC_CMN_STATS_MAX,		/**< Maximum statistics type. */
};

/**
 * nss_ipsec_cmn_flow_tuple
 *	IPsec tuple for creating flow entries.
 *
 * Note: This is a common selector which is used for preparing
 * a lookup tuple for incoming packets. The tuple is used
 * for computing the hash index in the flow table. There are multiple
 * fields in the tuple and the recipient node decides which fields
 * it must use from the tuple to calculate the hash index. The host
 * has no view of the hash index and hence must compute its own index
 * based on the tuple.
 */
struct nss_ipsec_cmn_flow_tuple {
	uint32_t dest_ip[4];		/**< Destination IP. */
	uint32_t src_ip[4];		/**< Source IP. */
	uint32_t spi_index;		/**< ESP SPI index. */

	uint16_t dst_port;		/**< Destination L4 port. */
	uint16_t src_port;		/**< Source L4 port. */

	uint8_t user_pattern;		/**< User defined field. */
	uint8_t protocol;		/**< IP protocol types. */
	uint8_t ip_ver;			/**< IP version. */
};

/**
 *nss_ipsec_cmn_sa_tuple
 *	IPsec outer header configuration.
 */
struct nss_ipsec_cmn_sa_tuple {
	uint32_t dest_ip[4];		/**< Destination IP. */
	uint32_t src_ip[4];		/**< Source IP. */
	uint32_t spi_index;		/**< ESP SPI index. */

	uint16_t dest_port;		/* Destination L4 port. */
	uint16_t src_port;		/* Source L4 port. */

	uint16_t crypto_index;		/**< Crypto index for the SA. */
	uint8_t protocol;		/**< Outer protocol. */
	uint8_t ip_ver;			/**< IP version. */

	uint8_t hop_limit;		/**< Time-to-Live or next hop limit. */
	uint8_t res[3];			/**< Reserved. */
};

/**
 *nss_ipsec_cmn_sa_data
 *	IPsec SA data used for transformation.
 */
struct nss_ipsec_cmn_sa_data {
	uint32_t seq_start;		/**< Starting sequence number. */
	uint32_t flags;			/**< Configuration flags. */

	uint16_t window_size;		/**< ESP sequence number window. */
	uint8_t dscp;			/**< Default DSCP value of the SA. */
	uint8_t df;			/**< Default do not fragment value of the SA. */

	uint8_t blk_len;		/**< Cipher block length. */
	uint8_t iv_len;			/**< IV length. */
	uint8_t icv_len;		/**< ESP trailers ICV length to apply. */
	uint8_t res1;			/**< Reserved. */

	uint32_t res2[4];		/**< Reserved for future use. */
};

/**
 * nss_ipsec_cmn_flow
 *	IPsec flow configuration message.
 */
struct nss_ipsec_cmn_flow {
	struct nss_ipsec_cmn_flow_tuple flow_tuple;	/**< Flow tuple. */
	struct nss_ipsec_cmn_sa_tuple sa_tuple;		/**< SA tuple. */
};

/**
 * nss_ipsec_cmn_sa
 *	IPsec SA configuration message.
 */
struct nss_ipsec_cmn_sa {
	struct nss_ipsec_cmn_sa_tuple sa_tuple;		/**< SA tuple. */
	struct nss_ipsec_cmn_sa_data sa_data;		/**< SA data. */
};

/**
 * nss_ipsec_cmn_ctx
 *	IPsec context configuration.
 */
struct nss_ipsec_cmn_ctx {
	enum nss_ipsec_cmn_ctx_type type;	/**< Node type. */
	uint32_t except_ifnum;			/**< Exception interface for egress. */
	uint32_t sibling_ifnum;			/**< Sibling interface. */
};

/**
 * nss_ipsec_cmn_node
 *	IPsec node configuration.
 */
struct nss_ipsec_cmn_node {
	bool dma_redirect;		/**< Enable redirect DMA ring. */
	bool dma_lookaside;		/**< Enable lookaside DMA ring. */
	uint16_t max_sa;		/**< Maximum number of SA(s) supported. */
};

/**
 * nss_ipsec_cmn_sa_replay
 *	IPsec replay statistics
 */
struct nss_ipsec_cmn_sa_replay {
	uint64_t seq_start;		/**< Start of replay window. */
	uint64_t seq_cur;		/**< Current sequence number. */
	uint16_t window_size;		/**< Window size. */
	uint8_t res[6];			/**< Reserved for future use. */
};

/**
 * nss_ipsec_cmn_sa_stats
 *	IPsec SA statistics.
 */
struct nss_ipsec_cmn_sa_stats {
	struct nss_cmn_node_stats cmn_stats;	/**< Packet statistics. */
	uint32_t fail_headroom;			/**< Failed headroom check. */
	uint32_t fail_tailroom;			/**< Failed tailroom check. */
	uint32_t fail_replay;			/**< Failure in anti-replay check. */
	uint32_t fail_replay_dup;		/**< Failure in anti-replay; duplicate records. */
	uint32_t fail_replay_win;		/**< Failure in anti-replay; packet outside the window. */
	uint32_t fail_pbuf_crypto;		/**< Failed to allocate crypto pbuf. */
	uint32_t fail_queue;			/**< Failure due to queue full in IPsec. */
	uint32_t fail_queue_crypto;		/**< Failure due to queue full in crypto. */
	uint32_t fail_queue_nexthop;		/**< Failure due to queue full in next hop. */
	uint32_t fail_pbuf_alloc;		/**< Failure in pbuf allocation. */
	uint32_t fail_pbuf_linear;		/**< Failure in pbuf linearization. */
	uint32_t fail_pbuf_stats;		/**< Failure in pbuf allocation for statistics. */
	uint32_t fail_pbuf_align;		/**< Failure in pbuf access due to non-word alignment. */
	uint32_t fail_cipher;			/**< Failure in decrypting the data. */
	uint32_t fail_auth;			/**< Failure in authenticating the data. */
	uint32_t fail_seq_ovf;			/**< Failure due to sequence number rollover. */
	uint32_t fail_blk_len;			/**< Failure in decapsulation due to bad cipher block length. */
	uint32_t fail_hash_len;			/**< Failure in decapsulation due to bad hash block length. */
	uint32_t fail_transform;		/**< Failure in transformation; general error. */
	uint32_t fail_crypto;			/**< Failure in crypto transformation. */
	uint32_t fail_cle;			/**< Failure in classification; general failure. */
	uint32_t is_stopped;			/**< Indicates if SA is stopped; for example, sequence overflow. */
};

/**
 * nss_ipsec_cmn_sa_sync
 *	IPsec SA sync message.
 */
struct nss_ipsec_cmn_sa_sync {
	struct nss_ipsec_cmn_sa_replay replay;	/**< Replay statistics. */
	struct nss_ipsec_cmn_sa_tuple sa_tuple;	/**< SA tuple. */
	struct nss_ipsec_cmn_sa_stats stats;	/**< Packet and failure statistics. */
};

/**
 * nss_ipsec_cmn_ctx_stats
 *	IPsec context statistics.
 */
struct nss_ipsec_cmn_ctx_stats {
	struct nss_cmn_node_stats cmn_stats;
					/**< Packet statistics. */
	uint32_t exceptioned;		/**< Exceptioned to host. */
	uint32_t linearized;		/**< Linearized packets. */
	uint32_t redirected;		/**< Redirected from inline. */
	uint32_t dropped;		/**< Total dropped packets. */
	uint32_t fail_sa;		/**< Failed to find SA. */
	uint32_t fail_flow;		/**< Failed to find flow. */
	uint32_t fail_stats;		/**< Failed to send statistics. */
	uint32_t fail_exception;	/**< Failed to exception. */
	uint32_t fail_transform;	/**< Failed to produce output. */
	uint32_t fail_linearized;	/**< Failed to linearize. */
	uint32_t fail_mdata_ver;	/**< Invalid metadata version. */
	uint32_t fail_ctx_active;	/**< Failed to queue as context is not active. */
	uint32_t fail_pbuf_crypto;	/**< Failed to allocate pbuf for crypto operation. */
	uint32_t fail_queue_crypto;	/**< Failed to queue pbuf to crypto pnode. */
};

/**
 * nss_ipsec_cmn_ctx_sync
 *	IPsec context synchronous message.
 */
struct nss_ipsec_cmn_ctx_sync {
	enum nss_ipsec_cmn_ctx_type type;	/**< IPsec context type. */
	struct nss_ipsec_cmn_ctx_stats stats;	/**< Context statistics. */
};

/**
 * nss_ipsec_cmn_mdata_cmn
 *	IPsec common metadata information.
 */
struct nss_ipsec_cmn_mdata_cmn {
	uint8_t version;		/**< Metadata version. */
	uint8_t origin;			/**< Metadata origin (host or NSS). */
	uint16_t len;			/**< Metadata length including extra bytes. */
	uint8_t res[2];			/**< Reserved for future. */
	uint16_t magic;			/**< Metadata magic. */
};

/**
 * nss_ipsec_cmn_mdata_encap
 *	IPsec encapsulation metadata information.
 */
struct nss_ipsec_cmn_mdata_encap {
	struct nss_ipsec_cmn_sa_tuple sa;	/**< SA tuple. */
	uint32_t seq_num;			/**< Sequence number for encapsulation (zero disables it). */
	uint16_t data_len;			/**< Length of data to encapsulate. */
	uint16_t flags;				/**< Encapsulation metadata flags. */
};

/**
 * nss_ipsec_cmn_mdata_decap
 *	IPsec decapsulation metadata information.
 */
struct nss_ipsec_cmn_mdata_decap {
	struct nss_ipsec_cmn_sa_tuple sa;	/**< SA tuple. */
};

/**
 * nss_ipsec_cmn_mdata
 *	IPsec metadata for host originated packets.
 */
struct nss_ipsec_cmn_mdata {
	struct nss_ipsec_cmn_mdata_cmn cm;		/**< Common metadata. */

	union {
		struct nss_ipsec_cmn_mdata_encap encap;	/**< Encapsulation metadata. */
		struct nss_ipsec_cmn_mdata_decap decap;	/**< Decapsulation metadata. */
	} data;						/**< Metadata payload. */
};

/**
 * nss_ipsec_cmn_stats_notification
 *	IPsec common transmission statistics structure.
 */
struct nss_ipsec_cmn_stats_notification {
	uint64_t stats_ctx[NSS_IPSEC_CMN_STATS_MAX];	/**< Context transmission statistics. */
	uint32_t core_id;				/**< Core ID. */
	uint32_t if_num;				/**< Interface number. */
};

/**
 * nss_ipsec_cmn_msg
 *	Message structure for NSS IPsec messages.
 */
struct nss_ipsec_cmn_msg {
	struct nss_cmn_msg cm;				/**< Common message header. */

	/**
	 * Payload of IPsec interface message.
	 */
	union {
		struct nss_ipsec_cmn_node node;		/**< Node configuration message. */
		struct nss_ipsec_cmn_ctx ctx;		/**< Context configuration message. */
		struct nss_ipsec_cmn_sa sa;		/**< SA configuration message. */
		struct nss_ipsec_cmn_flow flow;		/**< Flow configuration message. */
		struct nss_ipsec_cmn_sa_sync sa_sync;	/**< SA statistics message. */
		struct nss_ipsec_cmn_ctx_sync ctx_sync; /**< Context statistics message. */
	} msg;						/**< Message payload. */
};

/**
 * nss_ipsec_cmn_mdata_init
 *	Initialize the metadata common fields.
 *
 * @datatypes
 * nss_ipsec_cmn_mdata
 *
 * @param[in] mdata Metadata pointer.
 * @param[in] len   Metadata length including extra bytes.
 *
 * @return
 * Pointer to metadata payload.
 */
static inline void *nss_ipsec_cmn_mdata_init(struct nss_ipsec_cmn_mdata *mdata, uint16_t len)
{
	mdata->cm.len = len;
	mdata->cm.magic = NSS_IPSEC_CMN_MDATA_MAGIC;
	mdata->cm.version = NSS_IPSEC_CMN_MDATA_VERSION;
	mdata->cm.origin = NSS_IPSEC_CMN_MDATA_ORIGIN_HOST;

	return &mdata->data;
}

/**
 * Callback function for receiving message notifications.
 *
 * @datatypes
 * nss_ipsec_cmn_msg
 *
 * @param[in] app_data  Pointer to the application context of the message.
 * @param[in] msg       Pointer to the message data.
 */
typedef void (*nss_ipsec_cmn_msg_callback_t)(void *app_data, struct nss_cmn_msg *msg);

/**
 * Callback function for receiving data.
 *
 * @datatypes
 * net_device \n
 * sk_buff \n
 * napi_struct
 *
 * @param[in] netdev  Pointer to the associated network device.
 * @param[in] skb     Pointer to the message data.
 * @param[in] napi    Pointer to the NAPI structure.
 */
typedef void (*nss_ipsec_cmn_data_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi);

/**
 * nss_ipsec_cmn_get_context
 *	Gets the NSS context for the IPsec handle.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_ipsec_cmn_get_context(void);

/**
 * nss_ipsec_cmn_get_ifnum_with_coreid
 *	Gets the IPsec interface number with a core ID.
 *
 * @param[in] ifnum  NSS interface number.
 *
 * @return
 * Interface number with the core ID.
 */
extern uint32_t nss_ipsec_cmn_get_ifnum_with_coreid(int32_t ifnum);

/**
 * nss_ipsec_cmn_unregister_if
 *	Deregisters an IPSEC tunnel interface from the NSS.
 *
 * @param[in] if_num  NSS interface number.
 *
 * @return
 * None.
 *
 * @dependencies
 * The tunnel interface must have been previously registered.
 *
 * @return
 * True if successful, else false.
 */
extern bool nss_ipsec_cmn_unregister_if(uint32_t if_num);

/**
 * nss_ipsec_cmn_register_if
 *	Registers the IPsec interface with the NSS for sending and
 *	receiving messages.
 *
 * @datatypes
 * nss_ipsec_cmn_data_callback_t \n
 * nss_ipsec_cmn_msg_callback_t \n
 * nss_dynamic_interface_type \n
 * net_device
 *
 * @param[in] if_num        NSS interface number.
 * @param[in] netdev        Pointer to the associated network device.
 * @param[in] cb_data       Callback for the data.
 * @param[in] cb_msg        Callback for the message.
 * @param[in] features      Socket buffer types supported by this interface.
 * @param[in] type          Dynamic interface type.
 * @param[in] app_data      Application context.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_ipsec_cmn_register_if(uint32_t if_num, struct net_device *netdev,
						nss_ipsec_cmn_data_callback_t cb_data,
						nss_ipsec_cmn_msg_callback_t cb_msg,
						uint32_t features, enum nss_dynamic_interface_type type, void *app_data);

/**
 * nss_ipsec_cmn_notify_unregister
 *	Deregisters the message notifier from the HLOS driver.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in,out] ctx     Pointer to the context of the HLOS driver.
 * @param[in]     if_num  NSS interface number.
 *
 * @return
 * None.
 *
 * @dependencies
 * The message notifier must have been previously registered.
 */
extern void nss_ipsec_cmn_notify_unregister(struct nss_ctx_instance *ctx, uint32_t if_num);

/**
 * nss_ipsec_cmn_notify_register
 *	Registers an event callback to handle notifications from the IPsec firmware package.
 *
 * @datatypes
 * nss_ipsec_cmn_msg_callback_t \n
 *
 * @param[in] ifnum     NSS interface number.
 * @param[in] cb        Callback for IPsec message.
 * @param[in] app_data  Pointer to the application context.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_ipsec_cmn_notify_register(uint32_t ifnum, nss_ipsec_cmn_msg_callback_t cb, void *app_data);

/**
 * nss_ipsec_cmn_msg_init
 *	Initializes an IPsec message.
 *
 * @datatypes
 * nss_ipsec_cmn_msg \n
 * nss_ipsec_cmn_msg_type \n
 * nss_ipsec_cmn_msg_callback_t
 *
 * @param[in,out] nim       Pointer to the NSS interface message.
 * @param[in]     if_num    NSS interface number.
 * @param[in]     type      Type of message.
 * @param[in]     len       Size of the payload.
 * @param[in]     cb        Callback function for the message.
 * @param[in]     app_data  Pointer to the application context of the message.
 *
 * @return
 * None.
 */
extern void nss_ipsec_cmn_msg_init(struct nss_ipsec_cmn_msg *nim, uint16_t if_num, enum nss_ipsec_cmn_msg_type type,
				uint16_t len, nss_ipsec_cmn_msg_callback_t cb, void *app_data);

/**
 * nss_ipsec_cmn_tx_msg
 *	Sends an asynchronous IPsec message to the NSS.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_ipsec_cmn_msg
 *
 * @param[in] nss_ctx  Pointer to the NSS HLOS driver context.
 * @param[in] msg      Pointer to the message data.
 *
 * @return
 * Status of the Tx operation.
 */
extern nss_tx_status_t nss_ipsec_cmn_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_ipsec_cmn_msg *msg);

/**
 * nss_ipsec_cmn_tx_msg_sync
 *	Sends a synchronous IPsec message to the NSS.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_ipsec_cmn_msg_type \n
 * nss_ipsec_cmn_msg
 *
 * @param[in]  nss_ctx  Pointer to the NSS HLOS driver context.
 * @param[in]  if_num   NSS interface number.
 * @param[in]  type     Type of message.
 * @param[in]  len      Size of the payload.
 * @param[in]  nicm     Pointer to the NSS IPsec message.
 *
 * @return
 * Status of the Tx operation.
 */
extern nss_tx_status_t nss_ipsec_cmn_tx_msg_sync(struct nss_ctx_instance *nss_ctx, uint32_t if_num,
						enum nss_ipsec_cmn_msg_type type, uint16_t len,
						struct nss_ipsec_cmn_msg *nicm);

/**
 * nss_ipsec_cmn_tx_buf
 *	Sends a buffer to NSS for IPsec encapsulation or de-capsulation.
 *
 * @datatypes
 * sk_buff \n
 * nss_ctx_instance
 *
 * @param[in] nss_ctx Pointer to the NSS HLOS driver context.
 * @param[in] skb     Pointer to the message data.
 * @param[in] if_num  Pointer to the NSS interface number.
 *
 * @return
 * Status of the Tx operation.
 */
extern nss_tx_status_t nss_ipsec_cmn_tx_buf(struct nss_ctx_instance *nss_ctx, struct sk_buff *skb, uint32_t if_num);

/**
 * nss_ipsec_cmn_ppe_port_config
 *	Configure Packet Processing Engine IPsec port.
 *
 * @datatypes
 * nss_ctx_instance \n
 * net_device
 *
 * @param[in] ctx     Pointer to the context of the HLOS driver.
 * @param[in] netdev  Pointer to the associated network device.
 * @param[in] if_num  Data interface number.
 * @param[in] vsi_num Virtual switch instance number.
 *
 * @return
 * True if successful, else false.
 */
extern bool nss_ipsec_cmn_ppe_port_config(struct nss_ctx_instance *ctx, struct net_device *netdev,
					uint32_t if_num, uint32_t vsi_num);

/**
 * nss_ipsec_cmn_ppe_mtu_update()
 *	Configure Packet Processing Engine MTU for IPsec inline.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] ctx     Pointer to the context of the HLOS driver.
 * @param[in] if_num  Data interface number.
 * @param[in] mtu     Maximum transmission unit of interface number.
 * @param[in] mru     Maximum receive unit of interface number.
 *
 * @return
 * True if successful, else false.
 */
bool nss_ipsec_cmn_ppe_mtu_update(struct nss_ctx_instance *ctx, uint32_t if_num, uint16_t mtu, uint16_t mru);

/**
 * nss_ipsec_cmn_stats_unregister_notifier
 *	Deregisters a statistics notifier.
 *
 * @datatypes
 *	notifier_block
 *
 * @param[in] nb Notifier block.
 *
 * @return
 * 0 on success or non-zero on failure.
 */
extern int nss_ipsec_cmn_stats_unregister_notifier(struct notifier_block *nb);

/**
 * nss_ipsec_cmn_stats_register_notifier
 *	Registers a statistics notifier.
 *
 * @datatypes
 *	notifier_block
 *
 * @param[in] nb Notifier block.
 *
 * @return
 * 0 on success or non-zero on failure.
 */
extern int nss_ipsec_cmn_stats_register_notifier(struct notifier_block *nb);

/**
 * @}
 */

#endif /* !__NSS_IPSEC_CMN_H */
