/*
 **************************************************************************
 * Copyright (c) 2016-2017, 2020, 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_trustsec_tx.h
 *	NSS TrustSec interface definitions.
 */

#ifndef __NSS_TRUSTSEC_TX_H
#define __NSS_TRUSTSEC_TX_H

/**
 * @addtogroup nss_trustsec_tx_subsystem
 * @{
 */

/**
 * nss_trustsec_tx_msg_types
 *	Message types for TrustSec Tx requests and responses.
 */
enum nss_trustsec_tx_msg_types {
	NSS_TRUSTSEC_TX_MSG_CONFIGURE,		/** Configure the TrustSec node. */
	NSS_TRUSTSEC_TX_MSG_UNCONFIGURE,	/** Unconfigure the TrustSec node. */
	NSS_TRUSTSEC_TX_MSG_STATS_SYNC,		/** Statistics sychronization. */
	NSS_TRUSTSEC_TX_MSG_UPDATE_NEXTHOP,	/** Update next hop. */
	NSS_TRUSTSEC_TX_MSG_MAX			/** Maximum message type. */
};

/**
 * nss_trustsec_tx_error_types
 *	Error types for the TrustSec Tx interface.
 */
enum nss_trustsec_tx_error_types {
	NSS_TRUSTSEC_TX_ERR_NONE,		/** No error. */
	NSS_TRUSTSEC_TX_ERR_INVAL_SRC_IF,	/** Source interface is invalid. */
	NSS_TRUSTSEC_TX_ERR_RECONFIGURE_SRC_IF,	/** Source interface is already configured. */
	NSS_TRUSTSEC_TX_ERR_DEST_IF_NOT_FOUND,	/** Destination interface is not found. */
	NSS_TRUSTSEC_TX_ERR_NOT_CONFIGURED,	/** Source interface is not configured. */
	NSS_TRUSTSEC_TX_ERR_SGT_MISMATCH,	/** SGT mismatches. */
	NSS_TRUSTSEC_TX_ERR_UNKNOWN,		/** Error is unknown. */
	NSS_TRUSTSEC_TX_ERR_MAX,		/** Maximum error message. */
};

/**
 * nss_trustsec_tx_configure_msg
 *	Message information for configuring a TrustSec Tx interface.
 */
struct nss_trustsec_tx_configure_msg {
	uint32_t src;	/**< Interface number of the source tunnel. */
	uint32_t dest;	/**< Outgoing interface number. */
	uint16_t sgt;	/**< Security Group Tag value to embed in the TrustSec header. */
	uint8_t reserved[2];	/**< Reserved for word alignment. */
};

/**
 * nss_trustsec_tx_unconfigure_msg
 *	Message information for de-configuring a TrustSec Tx interface.
 */
struct nss_trustsec_tx_unconfigure_msg {
	uint32_t src;		/**< Interface number of the source tunnel. */
	uint16_t sgt;		/**< Security Group Tag value configured for this interface. */
	uint8_t reserved[2];	/**< Reserved for word alignment. */
};

/**
 * nss_trustsec_tx_stats_sync_msg
 *	Statistics synchronization message for the TrustSec Tx interface.
 */
struct nss_trustsec_tx_stats_sync_msg {
	struct nss_cmn_node_stats node_stats;	/**< Common node statistics. */
	uint32_t invalid_src;		/**< Received packets with an invalid source interface. */
	uint32_t unconfigured_src;	/**< Received packets with a de-configured source interface. */
	uint32_t headroom_not_enough;	/**< Not enough headroom to insert a TrustSec header. */
};

/**
 * nss_trustsec_tx_update_nexthop_msg
 *	Message information for updating the next hop for a TrustSec Tx interface.
 */
struct nss_trustsec_tx_update_nexthop_msg {
	uint32_t src;	/**< Interface number of the source tunnel. */
	uint32_t dest;	/**< Outgoing interface number. */
	uint16_t sgt;	/**< Security Group Tag value to embed in the TrustSec header. */
	uint8_t reserved[2];	/**< Reserved for word alignment. */
};

/**
 * nss_trustsec_tx_msg
 *	Data for sending and receiving TrustSec Tx messages.
 */
struct nss_trustsec_tx_msg {
	struct nss_cmn_msg cm;		/**< Common message header. */

	/**
	 * Payload of a TrustSec Tx message.
	 */
	union {
		struct nss_trustsec_tx_configure_msg configure;
				/**< Configure TrustSec Tx. */
		struct nss_trustsec_tx_unconfigure_msg unconfigure;
				/**< De-configure TrustSec Tx. */
		struct nss_trustsec_tx_stats_sync_msg stats_sync;
				/**< Synchronize TrustSec Tx statistics. */
		struct nss_trustsec_tx_update_nexthop_msg upd_nexthop;
				/**< Update next hop of TrustSec Tx. */
	} msg;			/**< Message payload. */
};

/**
 * Callback function for receiving TrustSec Tx messages.
 *
 * @datatypes
 * nss_trustsec_tx_msg
 *
 * @param[in] app_data  Pointer to the application context of the message.
 * @param[in] msg       Pointer to the message data.
 */
typedef void (*nss_trustsec_tx_msg_callback_t)(void *app_data, struct nss_trustsec_tx_msg *npm);

/**
 * nss_trustsec_tx_msg_init
 *	Initializes a TrustSec Tx message.
 *
 * @datatypes
 * nss_trustsec_tx_msg
 *
 * @param[in,out] npm       Pointer to the NSS Profiler message.
 * @param[in]     if_num    NSS interface number.
 * @param[in]     type      Type of message.
 * @param[in]     len       Size of the message.
 * @param[in]     cb        Callback function for the message.
 * @param[in]     app_data  Pointer to the application context of the message.
 *
 * @return
 * TRUE or FALSE.
 */
extern void nss_trustsec_tx_msg_init(struct nss_trustsec_tx_msg *npm, uint16_t if_num, uint32_t type, uint32_t len,
							nss_trustsec_tx_msg_callback_t cb, void *app_data);

/**
 * nss_trustsec_tx_msg
 *	Sends a TrustSec Tx message to the NSS.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_trustsec_tx_msg
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] msg      Pointer to the message data.
 *
 * @return
 * Status of the Tx operation.
 */
extern nss_tx_status_t nss_trustsec_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_trustsec_tx_msg *msg);

/**
 * nss_trustsec_tx_msg_sync
 *	Sends a TrustSec Tx message to the NSS and waits for a response.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_trustsec_tx_msg
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] msg      Pointer to the message data.
 *
 * @return
 * Status of the Tx operation.
 */
extern nss_tx_status_t nss_trustsec_tx_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_trustsec_tx_msg *msg);

/**
 * nss_trustsec_tx_update_nexthop
 *	Updates the next hop of the TrustSec.
 *
 * @param[in] src   Source interface number.
 * @param[in] dest  Destination interface number.
 * @param[in] sgt   Security Group Tag value.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern nss_tx_status_t nss_trustsec_tx_update_nexthop(uint32_t src, uint32_t dest, uint16_t sgt);

/**
 * nss_trustsec_tx_get_ctx
 *	Gets the NSS context.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_trustsec_tx_get_ctx(void);

/**
 * nss_trustsec_tx_configure_sgt
 *	Configures the Security Group Tag value for a source interface.
 *
 * @param[in] src   Source interface number.
 * @param[in] dest  Destination interface number.
 * @param[in] sgt   Security Group Tag value.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern nss_tx_status_t nss_trustsec_tx_configure_sgt(uint32_t src, uint32_t dest, uint16_t sgt);

/**
 * nss_trustsec_tx_unconfigure_sgt
 *	De-configures the Security Group Tag value for a source interface.
 *
 * @param[in] src  Source interface number.
 * @param[in] sgt  Security Group Tag value.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern nss_tx_status_t nss_trustsec_tx_unconfigure_sgt(uint32_t src, uint16_t sgt);

/** @} */ /* end_addtogroup nss_trustsec_tx_subsystem */

#endif /* __NSS_TRUSTSEC_TX_H */
