/*
 **************************************************************************
 * Copyright (c) 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_vxlan.h
 *	NSS VxLAN interface definitions.
 */

#ifndef __NSS_VXLAN_H
#define __NSS_VXLAN_H

/**
 * @addtogroup nss_vxlan_subsystem
 * @{
 */

/**
 * Maximum number of supported VxLAN tunnel sessions.
 */
#define NSS_VXLAN_MAX_TUNNELS 64

/**
 * Maximum number of supported VxLAN FDB entries.
 */
#define NSS_VXLAN_MACDB_ENTRIES_MAX 1024

/**
 * MAC database entries per message.
 */
#define NSS_VXLAN_MACDB_ENTRIES_PER_MSG 20

/*
 *  VxLAN Rule configure message flags
 */
#define NSS_VXLAN_RULE_FLAG_GBP_ENABLED 0x0001			/**< Group Policy ID is eanbled. */
#define NSS_VXLAN_RULE_FLAG_INHERIT_TOS 0x0002			/**< Use inner TOS for encapsulation. */
#define NSS_VXLAN_RULE_FLAG_ENCAP_L4_CSUM_REQUIRED 0x0004	/**< Generate transmit checksum. */
#define NSS_VXLAN_RULE_FLAG_IPV4 0x0010				/**< IPv4 tunnel. */
#define NSS_VXLAN_RULE_FLAG_IPV6 0x0020				/**< IPv6 tunnel. */
#define NSS_VXLAN_RULE_FLAG_UDP 0x0100				/**< UDP tunnel. */

/**
 * nss_vxlan_msg_type
 *	Message types for VxLAN tunnel.
 */
enum nss_vxlan_msg_type {
	NSS_VXLAN_MSG_TYPE_STATS_SYNC,		/**< Statistics synchronization message. */
	NSS_VXLAN_MSG_TYPE_TUN_CONFIGURE,	/**< Creating tunnel rule. */
	NSS_VXLAN_MSG_TYPE_TUN_UNCONFIGURE,	/**< Destroying tunnel rule. */
	NSS_VXLAN_MSG_TYPE_TUN_ENABLE,		/**< Enable the tunnel. */
	NSS_VXLAN_MSG_TYPE_TUN_DISABLE,		/**< Disable the tunnel. */
	NSS_VXLAN_MSG_TYPE_MAC_ADD,		/**< Add MAC rule to the database. */
	NSS_VXLAN_MSG_TYPE_MAC_DEL,		/**< Remove MAC rule from the database. */
	NSS_VXLAN_MSG_TYPE_MACDB_STATS,		/**< MAC database statistics synchronization message. */
	NSS_VXLAN_MSG_TYPE_MAX,			/**< Maximum message type. */
};

/**
 * nss_vxlan_error_response_types
 *	Error types for VxLAN responses to messages from the host.
 */
enum nss_vxlan_error_type {
	NSS_VXLAN_ERROR_TYPE_NONE = 1,			/**< Unknown type error. */
	NSS_VXLAN_ERROR_TYPE_DECAP_REGISTER_FAIL,	/**< Decapsulation node registration failed. */
	NSS_VXLAN_ERROR_TYPE_DEST_IP_MISMATCH,		/**< Destination IP address mismatch. */
	NSS_VXLAN_ERROR_TYPE_INVALID_VNI,		/**< Invalid virtual network ID. */
	NSS_VXLAN_ERROR_TYPE_INVALID_L3_PROTO,		/**< L3 Protocol is invalid error. */
	NSS_VXLAN_ERROR_TYPE_INVALID_UDP_PROTO,		/**< UDP Protocol is invalid error. */
	NSS_VXLAN_ERROR_TYPE_INVALID_SRC_PORT,		/**< Source port range is invalid. */
	NSS_VXLAN_ERROR_TYPE_MAC_BAD_ENTRY,		/**< MAC table has a bad entry. */
	NSS_VXLAN_ERROR_TYPE_MAC_EXISTS,		/**< MAC entry exists in the table error. */
	NSS_VXLAN_ERROR_TYPE_MAC_NOT_EXIST,		/**< MAC does not exist in the table error. */
	NSS_VXLAN_ERROR_TYPE_MAC_ENTRY_UNHASHED,	/**< MAC entry is not hashed in table. */
	NSS_VXLAN_ERROR_TYPE_MAC_ENTRY_ALLOC_FAILED,	/**< MAC entry allocation failed. */
	NSS_VXLAN_ERROR_TYPE_MAC_ENTRY_DELETE_FAILED,	/**< MAC entry deletion failed. */
	NSS_VXLAN_ERROR_TYPE_MAC_TABLE_FULL,		/**< MAC table is full error. */
	NSS_VXLAN_ERROR_TYPE_SIBLING_NODE_NOT_EXIST,	/**< Sibling node does not exist. */
	NSS_VXLAN_ERROR_TYPE_TUNNEL_CONFIGURED,		/**< Tunnel is already configured. */
	NSS_VXLAN_ERROR_TYPE_TUNNEL_UNCONFIGURED,	/**< Tunnel is not configured. */
	NSS_VXLAN_ERROR_TYPE_TUNNEL_ADD_FAILED,		/**< Adding tunnel information failed. */
	NSS_VXLAN_ERROR_TYPE_TUNNEL_DISABLED,		/**< Tunnel is already disabled error. */
	NSS_VXLAN_ERROR_TYPE_TUNNEL_ENABLED,		/**< Tunnel is already enabled error. */
	NSS_VXLAN_ERROR_TYPE_TUNNEL_ENTRY_EXISTS,	/**< Tunnel already exists. */
	NSS_VXLAN_ERROR_TYPE_MAX,			/**< Maximum error type. */
};

/**
 * nss_vxlan_stats_msg
 *	Per-tunnel statistics messages from the NSS firmware.
 */
struct nss_vxlan_stats_msg {
	struct nss_cmn_node_stats node_stats;	/**< Common firmware statistics. */
	uint32_t except_mac_db_lookup_failed;	/**< MAC database look up failed. */
	uint32_t except_mac_move;		/**< User is moved. */
	uint32_t except_low_hroom;		/**< Transmit exception due to insufficient headroom. */
	uint32_t except_no_policy_id;		/**< Policy ID does not exist. */
	uint32_t except_extra_vxlan_hdr_flags;	/**< More flags are set than NSS can process. */
	uint32_t except_vni_lookup_failed;	/**< Virtual network ID look up failed. */
	uint32_t dropped_malformed;		/**< Packet is malformed. */
	uint32_t dropped_next_node_queue_full;	/**< Next node dropped the packet. */
	uint32_t except_inner_hash;		/**< Inner hash calculation failed. */
};

/**
 * nss_vxlan_rule_msg
 *	 VxLAN rule message.
 *
 * The same rule structure applies for both encapsulation and decapsulation
 * in a tunnel.
 */
struct nss_vxlan_rule_msg {
	/*
	 * VxLAN Rules
	 */
	uint32_t sibling_if_num;	/**< Sibling node interface number. */
	uint32_t vni;			/**< Virtual network ID. */
	uint16_t tunnel_flags;		/**< VxLAN tunnel flags. */

	/*
	 * IP rules
	 */
	uint16_t flow_label;		/**< Flow label. */
	uint8_t tos;			/**< Type of service/traffic class. */
	uint8_t ttl;			/**< TTL/hop limit. */

	/*
	 * L4 rules
	 */
	uint16_t src_port_min;		/**< Minimum permissible port number. */
	uint16_t src_port_max;		/**< Maximum permissible port number. */
	uint16_t dest_port;		/**< UDP destination port. */
};

/**
 * nss_vxlan_encap_rule
 *	Encapsulation information for a VxLAN tunnel.
 */
struct nss_vxlan_encap_rule {
	uint32_t src_ip[4];	/**< Source IP. */
	uint32_t dest_ip[4];	/**< Destination IP. */
};

/**
 * nss_vxlan_mac_msg
 *	VxLAN MAC message structure.
 */
struct nss_vxlan_mac_msg {
	struct nss_vxlan_encap_rule encap;
					/**< Tunnel encapsulation header. */
	uint32_t vni;			/**< VxLAN network identifier. */
	uint16_t mac_addr[3];		/**< MAC address. */
};

/**
 * nss_vxlan_macdb_stats_entry
 *	MAC database statistics entry.
 */
struct nss_vxlan_macdb_stats_entry {
	uint32_t hits;			/**< Total hash hits on this hash entry. */
	uint16_t mac[3];		/**< MAC address. */
};

/**
 * nss_vxlan_macdb_stats_msg
 *	VxLAN MAC database statistics.
 */
struct nss_vxlan_macdb_stats_msg {
	uint16_t cnt;			/**< Number of MAC database entries copied. */
	uint16_t reserved;		/**< Reserved for future use. */
	struct nss_vxlan_macdb_stats_entry entry[NSS_VXLAN_MACDB_ENTRIES_PER_MSG];
					/**< MAC database entries. */
};

/**
 * nss_vxlan_msg
 *	Data structure for sending and receiving VxLAN messages.
 */
struct nss_vxlan_msg {
	struct nss_cmn_msg cm;			/**< Common message header. */

	/**
	 * Payload of a VxLAN message.
	 */
	union {
		struct nss_vxlan_stats_msg stats;
				/**< Synchronized statistics for the VxLAN interface. */
		struct nss_vxlan_rule_msg vxlan_create;
				/**< Allocate VxLAN tunnel node. */
		struct nss_vxlan_rule_msg vxlan_destroy;
				/**< Destroy VxLAN tunnel node. */
		struct nss_vxlan_mac_msg mac_add;
				/**< MAC add message for UDP encapsulation. */
		struct nss_vxlan_mac_msg mac_del;
				/**< MAC delete message. */
		struct nss_vxlan_macdb_stats_msg db_stats;
				/**< MAC database statistics. */
	} msg;			/**< Payload for VxLAN tunnel messages exchanged with the NSS core. */
};

/**
 * Callback function for receiving VxLAN tunnel 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_vxlan_buf_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi);

/**
 * Callback function for receiving VxLAN messages.
 *
 * @datatypes
 * nss_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_vxlan_msg_callback_t)(void *app_data, struct nss_cmn_msg *msg);

/**
 * nss_vxlan_tx_msg
 *	Sends VxLAN tunnel messages to the NSS.
 *
 * Do not call this function from a softirq or interrupt because it
 * might sleep if the NSS firmware is busy serving another host thread.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_vxlan_msg
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] nvm      Pointer to the message data.
 *
 * @return
 * Status of the Tx operation.
 */
extern nss_tx_status_t nss_vxlan_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_vxlan_msg *nvm);

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

/**
 * nss_vxlan_unregister_if
 *	Deregisters the VxLAN interface from the NSS.
 *
 * @param[in] if_num  NSS interface number.
 *
 * @return
 * None.
 */
extern bool nss_vxlan_unregister_if(uint32_t if_num);

/**
 * nss_vxlan_register_if
 *	Registers the VxLAN interface with the NSS.
 *
 * @datatypes
 * nss_vxlan_buf_callback_t \n
 * nss_vxlan_msg_callback_t \n
 * net_device
 *
 * @param[in] if_num             NSS interface number.
 * @param[in] type               Dynamic interface type.
 * @param[in] data_cb            Callback for the data.
 * @param[in] notify_cb          Callback for the message.
 * @param[in] netdev             Pointer to the associated network device.
 * @param[in] features           Data socket buffer types supported by this interface.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_vxlan_register_if(uint32_t if_num, uint32_t type, nss_vxlan_buf_callback_t data_cb,
					nss_vxlan_msg_callback_t notify_cb, struct net_device *netdev, uint32_t features);

/**
 * nss_vxlan_register_handler
 *	Initializes VxLAN module in NSS
 *
 * @return
 * None.
 */
extern void nss_vxlan_init(void);

/**
 * nss_vxlan_msg_init
 *	Initializes a VxLAN message.
 *
 * @datatypes
 * nss_vxlan_msg \n
 * nss_vxlan_msg_callback_t
 *
 * @param[in,out] nvm       Pointer to the VxLAN tunnel message.
 * @param[in]     if_num    NSS interface number.
 * @param[in]     type      Type of message.
 * @param[in]     len       Size of the message.
 * @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_vxlan_msg_init(struct nss_vxlan_msg *nvm, uint16_t if_num, uint32_t type, uint32_t len,
				nss_vxlan_msg_callback_t cb, void *app_data);

/**
 * nss_vxlan_get_ctx()
 *	Get VxLAN context.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_vxlan_get_ctx(void);

/**
 * @}
 */

#endif
/* __NSS_VXLAN_H */
