/*
 ****************************************************************************
 * Copyright (c) 2017-2019, 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_gre.h
 *	NSS GRE interface definitions.
 */
#ifndef _NSS_GRE_H_
#define _NSS_GRE_H_

#include <net/ip_tunnels.h>
#include <net/ip6_tunnel.h>

/**
 * @addtogroup nss_gre_subsystem
 * @{
 */

/**
 * Maximum number of session debug statistics
 */
#define NSS_GRE_MAX_DEBUG_SESSION_STATS 16

/**
 * GRE flags
 */
#define NSS_GRE_CONFIG_IKEY_VALID	0x00000001	/**< Incoming key of GRE header. */
#define NSS_GRE_CONFIG_OKEY_VALID	0x00000002	/**< Key for outgoing GRE header. */
#define NSS_GRE_CONFIG_ISEQ_VALID	0x00000004	/**< Enable sequence checking for incoming GRE traffic. */
#define NSS_GRE_CONFIG_OSEQ_VALID	0x00000008	/**< Add sequence number for out going GRE packets. */
#define NSS_GRE_CONFIG_ICSUM_VALID	0x00000010	/**< Validate incoming GRE header checksum. */
#define NSS_GRE_CONFIG_OCSUM_VALID	0x00000020	/**< Add checksum header to GRE header. */
#define NSS_GRE_CONFIG_TOS_INHERIT	0x00000040	/**< Inherit inner IP TOS to tunnel header, if not set configure provided TOS. */
#define NSS_GRE_CONFIG_TTL_INHERIT	0x00000080	/**< Inherit inner IP TTL to tunnel header, if not set configure provided TTL. */
#define NSS_GRE_CONFIG_SET_DF		0x00000100	/**< Enable DF bit on tunnel IP header. */
#define NSS_GRE_CONFIG_SET_MAC		0x00000200	/**< Add MAC header to GRE+IP tunnel header. */
#define NSS_GRE_CONFIG_SET_PADDING	0x00000400	/**< Add PADDING to align tunnel IP/GRE header. */
#define NSS_GRE_CONFIG_NEXT_NODE_AVAILABLE  0x00000800	/**< Use provided next node instead of existing next node. */
#define NSS_GRE_CONFIG_COPY_METADATA 	0x00001000	/**< Enable metadata copy in NSS during alignment. */
#define NSS_GRE_CONFIG_USE_UNALIGNED 	0x00002000	/**< Use unaligned infrastructure in NSS. */
#define NSS_GRE_CONFIG_DSCP_VALID	0x00004000	/**< Add DSCP per packet. */

/**
 * nss_gre_error_types.
 *	Error types for GRE configuration messages.
 */
enum nss_gre_error_types {
	NSS_GRE_ERR_UNKNOWN_MSG = 1,		/**< Unknown message. */
	NSS_GRE_ERR_IF_INVALID = 2,		/**< Invalid interface. */
	NSS_GRE_ERR_MODE_INVALID = 3,		/**< Invalid mode type. */
	NSS_GRE_ERR_IP_INVALID = 4,		/**< Invalid IP type. */
	NSS_GRE_ERR_GRE_SESSION_PARAMS_INVALID = 5,	/**< Invalid GRE session parameters provided. */
	NSS_GRE_ERR_DSCP_CFG_INVALID = 6,	/**< Both TOS and DSCP flags are enabled. */
	NSS_GRE_ERR_MAX,			/**< Maximum GRE error. */
};

/**
 * nss_gre_info
 *	GRE private information.
 */
struct nss_gre_info {
	/**
	 * Union of IPv4/IPv6 tunnel.
	 */
	union {
		struct ip_tunnel t4;		/**< IPv4 tunnel. */
		struct ip6_tnl t6;		/**< IPv6 tunnel. */
	} t;		/**< IPv4 and IPv6 tunnel. */
	int nss_if_number_inner;		/**< NSS interface number for GRE inner. */
	struct net_device *next_dev_inner;	/**< Next network device for inner flow. */
	struct net_device *next_dev_outer;	/**< Next network device for outer flow. */
	uint8_t gre_hlen;			/**< GRE header length. */
	uint8_t pad_len;			/**< Pad length. */
};

/**
 * nss_gre_msg_types
 *	Message types for GRE requests and responses.
 */
enum nss_gre_msg_types {
	NSS_GRE_MSG_ENCAP_CONFIGURE = NSS_IF_MAX_MSG_TYPES + 1,
	NSS_GRE_MSG_DECAP_CONFIGURE,
	NSS_GRE_MSG_ENCAP_DECONFIGURE,
	NSS_GRE_MSG_DECAP_DECONFIGURE,
	NSS_GRE_MSG_SESSION_STATS,
	NSS_GRE_MSG_BASE_STATS,
	NSS_GRE_MSG_MAX
};

/**
 * GRE mode types.
 */
enum nss_gre_mode {
	NSS_GRE_MODE_TUN,	/**< GRE tunnel interface. */
	NSS_GRE_MODE_TAP,	/**< GRE TAP interface. */
	NSS_GRE_MODE_MAX	/**< Maxmum GRE mode. */
};

/**
 * GRE IP types.
 */
enum nss_gre_ip_types {
	NSS_GRE_IP_IPV4,	/**<  Outer Tunnel is IPV4. */
	NSS_GRE_IP_IPV6,	/**<  Outer Tunnel is IPV6. */
	NSS_GRE_IP_MAX,		/**<  Maximum IP Types. */
};

/**
 * nss_gre_base_types
 *	GRE base debug statistics.
 */
enum nss_gre_base_types {
	NSS_GRE_BASE_RX_PACKETS,		/**< Receive packet count. */
	NSS_GRE_BASE_RX_DROPPED,		/**< Number of packet dropped at receive. */
	NSS_GRE_BASE_EXP_ETH_HDR_MISSING,	/**< Ethernet header missing. */
	NSS_GRE_BASE_EXP_ETH_TYPE_NON_IP,	/**< Packet is not IPV4 or IPV6. */
	NSS_GRE_BASE_EXP_IP_UNKNOWN_PROTOCOL,	/**< Packet protocol is unknown. */
	NSS_GRE_BASE_EXP_IP_HEADER_INCOMPLETE,	/**< Bad IP header. */
	NSS_GRE_BASE_EXP_IP_BAD_TOTAL_LENGTH,	/**< IP total length is invalid. */
	NSS_GRE_BASE_EXP_IP_BAD_CHECKSUM,	/**< IP checksum is bad. */
	NSS_GRE_BASE_EXP_IP_DATAGRAM_INCOMPLETE,/**< Bad packet. */
	NSS_GRE_BASE_EXP_IP_FRAGMENT,		/**< IP packet is a fragment. */
	NSS_GRE_BASE_EXP_IP_OPTIONS_INCOMPLETE,	/**< IP option is invalid. */
	NSS_GRE_BASE_EXP_IP_WITH_OPTIONS,	/**< IP packet with options. */
	NSS_GRE_BASE_EXP_IPV6_UNKNOWN_PROTOCOL,	/**< Protocol is unknown. */
	NSS_GRE_BASE_EXP_IPV6_HEADER_INCOMPLETE,/**< Incomplete ipv6 header. */
	NSS_GRE_BASE_EXP_GRE_UNKNOWN_SESSION,	/**< Unknown GRE session. */
	NSS_GRE_BASE_EXP_GRE_NODE_INACTIVE,	/**< GRE node is inactive. */
	NSS_GRE_BASE_DEBUG_MAX,			/**< GRE base debug maximum. */
};

/**
 * nss_gre_session_types
 *	GRE session packet drop and exception events.
 */
enum nss_gre_session_types {
	NSS_GRE_SESSION_PBUF_ALLOC_FAIL,		/**< Pbuf allocation failure. */
	NSS_GRE_SESSION_DECAP_FORWARD_ENQUEUE_FAIL,	/**< Receive forward enqueue failure. */
	NSS_GRE_SESSION_ENCAP_FORWARD_ENQUEUE_FAIL,	/**< Transmit forward enqueue failure. */
	NSS_GRE_SESSION_DECAP_TX_FORWARDED,		/**< Number of packets forwarded after decapsulation. */
	NSS_GRE_SESSION_ENCAP_RX_RECEIVED,		/**< Number of packets received for encapsulation. */
	NSS_GRE_SESSION_ENCAP_RX_DROPPED,		/**< Packets dropped while enqueuing for encapsulation. */
	NSS_GRE_SESSION_ENCAP_RX_LINEAR_FAIL,		/**< Packets dropped during encapsulation linearization. */
	NSS_GRE_SESSION_EXP_RX_KEY_ERROR,		/**< Receive key error. */
	NSS_GRE_SESSION_EXP_RX_SEQ_ERROR,		/**< Receive Sequence number error. */
	NSS_GRE_SESSION_EXP_RX_CS_ERROR,		/**< Receive checksum error */
	NSS_GRE_SESSION_EXP_RX_FLAG_MISMATCH,		/**< Receive flag mismatch. */
	NSS_GRE_SESSION_EXP_RX_MALFORMED,		/**< Receive packet is malformed. */
	NSS_GRE_SESSION_EXP_RX_INVALID_PROTOCOL,	/**< Receive packet protocol is invalid. */
	NSS_GRE_SESSION_EXP_RX_NO_HEADROOM,		/**< Packet does not have enough headroom. */
	NSS_GRE_SESSION_DEBUG_MAX,			/**< Session debug maximum. */
};

/**
 * GRE create message structure.
 */
struct nss_gre_config_msg {
	uint32_t src_ip[4];			/**< Source IPv4 or IPv6 address. */
	uint32_t dest_ip[4];			/**< Destination IPv4 or IPv6 address. */
	uint32_t flags;				/**< GRE Flags. */
	uint32_t ikey;				/**< GRE Rx key.*/
	uint32_t okey;				/**< GRE Tx key. */
	uint32_t mode;				/**< GRE TUN or TAP. */
	uint32_t ip_type;			/**< IPv4 or IPv6 type. */
	uint32_t next_node_if_num;		/**< To whom to forward packets. */
	uint32_t sibling_if_num;        	/**< Sibling interface number. */
	uint16_t src_mac[3];			/**< Source MAC address. */
	uint16_t dest_mac[3];			/**< Destination MAC address. */
	uint8_t ttl;				/**< TTL or HOPLIMIT. */
	uint8_t tos;				/**< Type of service. */
	uint16_t metadata_size;			/**< Metadata copy size. */
};

/**
 * GRE link up message structure.
 */
struct nss_gre_linkup_msg {
	int if_number;			/**< Interface number. */
};

/**
 * GRE link down message structure
 */
struct nss_gre_linkdown_msg {
	int if_number;			/**< Interface number. */
};

/**
 * GRE deconfig message structure
 */
struct nss_gre_deconfig_msg {
	int if_number;			/**< Interface number. */
};

/**
 * GRE session statistics message.
 */
struct nss_gre_session_stats_msg {
	struct nss_cmn_node_stats node_stats;		/**< Common node statistics. */
	uint32_t stats[NSS_GRE_SESSION_DEBUG_MAX];	/**< Session debug statistics. */
};

/**
 * GRE base statistics message.
 */
struct nss_gre_base_stats_msg {
	uint32_t stats[NSS_GRE_BASE_DEBUG_MAX];		/**< Base debug statistics. */
};

/**
 * nss_gre_base_stats_notification
 *	GRE transmission statistics structure.
 */
struct nss_gre_base_stats_notification {
	uint64_t stats_base_ctx[NSS_GRE_BASE_DEBUG_MAX];	/**< Base debug transmission statistics. */
	uint32_t core_id;					/**< Core ID. */
};

/**
 * nss_gre_session_stats_notification
 *	GRE transmission statistics structure.
 */
struct nss_gre_session_stats_notification {
	uint64_t stats_session_ctx[NSS_GRE_SESSION_DEBUG_MAX];		/**< Session debug transmission statistics. */
	uint32_t core_id;						/**< Core ID. */
	uint32_t if_num;						/**< Interface number. */
};

/**
 * nss_gre_msg
 *	Message structure to send/receive GRE messages.
 */
struct nss_gre_msg {
	struct nss_cmn_msg cm;					/**< Common message header. */

	/**
	 * Payload of a GRE message.
	 */
	union {
		struct nss_gre_config_msg cmsg;			/**< GRE session config message. */
		struct nss_gre_deconfig_msg dmsg;		/**< GRE session deconfig message. */
		struct nss_gre_linkup_msg linkup;		/**< GRE link up message. */
		struct nss_gre_linkdown_msg linkdown;		/**< GRE link down message. */
		struct nss_gre_session_stats_msg sstats;	/**< GRE session statistics message. */
		struct nss_gre_base_stats_msg bstats;		/**< Base statistics message. */
	} msg;							/**< Message payload. */
};

/**
 * Callback function to receive GRE messages
 *
 * @datatypes
 * nss_gre_msg
 *
 * @param[in] app_data  Pointer to the application context of the message.
 * @param[in] msg       Pointer to the message data.
 */
typedef void (*nss_gre_msg_callback_t)(void *app_data, struct nss_gre_msg *msg);

/**
 * nss_gre_tx_msg
 *	Sends GRE messages to the NSS.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_gre_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_gre_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_gre_msg *msg);

/**
 * nss_gre_tx_msg_sync
 *	Sends GRE messages to the NSS synchronously.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_gre_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_gre_tx_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_gre_msg *msg);

/**
 * nss_gre_tx_buf
 *	Sends a packet to the NSS.
 *
 * @datatypes
 * nss_ctx_instance \n
 * sk_buff
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] if_num   Nss interface number.
 * @param[in] skb      Pointer to sk_buff.
 *
 * @return Tx status
 */
extern nss_tx_status_t nss_gre_tx_buf(struct nss_ctx_instance *nss_ctx, uint32_t if_num, struct sk_buff *skb);

/**
 * nss_gre_get_context.
 *	Gets the GRE context used in nss_gre_tx.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_gre_get_context(void);

/**
 *
 * nss_gre_ifnum_with_core_id
 * 	Append core ID on GRE interface.
 *
 * @param[in] if_num   NSS interface number.
 *
 * @return
 * GRE interface number with core ID.
 */
extern int nss_gre_ifnum_with_core_id(int if_num);

/**
 * Callback function for receiving GRE session 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 data socket buffer.
 * @param[in] napi    Pointer to the NAPI structure.
 */
typedef void (*nss_gre_data_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi);

/**
 * nss_gre_register_if
 *	Registers the GRE interface with the NSS for sending and
 *	receiving messages.
 *
 * @datatypes
 * nss_gre_data_callback_t \n
 * nss_gre_msg_callback_t \n
 * net_device
 *
 * @param[in] if_num         NSS interface number.
 * @param[in] type           NSS interface type.
 * @param[in] gre_callback   Callback for the data.
 * @param[in] msg_callback   Callback for the message.
 * @param[in] netdev         Pointer to the associated network device.
 * @param[in] features       Socket buffer types supported by this interface.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_gre_register_if(uint32_t if_num, uint32_t type, nss_gre_data_callback_t gre_callback,
					nss_gre_msg_callback_t msg_callback, struct net_device *netdev, uint32_t features);

/**
 * nss_gre_unregister_if
 *	Deregisters the GRE interface from the NSS.
 *
 * @param[in] if_num  NSS interface number.
. *
 * @return
 * None.
 *
 * @dependencies
 * The tunnel interface must have been previously registered.
 */
extern void nss_gre_unregister_if(uint32_t if_num);

/**
 * nss_gre_msg_init
 *	Initializes a GRE message.
 *
 * @datatypes
 * nss_gre_msg
 *
 * @param[in,out] ncm       Pointer to the message.
 * @param[in]     if_num    Interface number
 * @param[in]     type      Type of message.
 * @param[in]     len       Size of the payload.
 * @param[in]     cb        Pointer to the message callback.
 * @param[in]     app_data  Pointer to the application context of the message.
 *
 * @return
 * None.
 */
extern void nss_gre_msg_init(struct nss_gre_msg *ncm, uint16_t if_num, uint32_t type,  uint32_t len, void *cb, void *app_data);

/**
 * nss_gre_register_handler
 *	Registers the GRE interface with the NSS debug statistics handler.
 *
 * @return
 * None.
 */
extern void nss_gre_register_handler(void);

/**
 * Callback function for updating stats.
 *
 * @datatypes
 * net_device \n
 * sk_buff \n
 *
 * @param[in] netdev  Pointer to the associated network device.
 * @param[in] skb     Pointer to the data socket buffer.
 *
 * @return
 * None.
 */
typedef void (*nss_gre_pkt_callback_t)(struct net_device *netdev, struct sk_buff *skb);

/**
 * nss_gre_register_pkt_callback
 *	Register for rx packet call back.
 *
 * @datatypes
 * nss_gre_pkt_callback_t
 *
 * @param[in] cb  Call back function which needs to be registered.
 *
 * @return
 * None.
 */
extern void nss_gre_register_pkt_callback(nss_gre_pkt_callback_t cb);

/**
 * nss_gre_unregister_pkt_callback
 *	Unregister for rx packet call back.
 *
 * @datatypes
 * nss_gre_pkt_callback_t
 *
 * @return
 * None.
 */
extern void nss_gre_unregister_pkt_callback(void);

/**
 * nss_gre_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_gre_stats_unregister_notifier(struct notifier_block *nb);

/**
 * nss_gre_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_gre_stats_register_notifier(struct notifier_block *nb);

/**
 * @}
 */

#endif /* _NSS_GRE_H_ */
