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

#ifndef __NSS_IF_H
#define __NSS_IF_H

#define NSS_IF_TX_TIMEOUT 3000 /* 3 Seconds */

/**
 * @addtogroup nss_driver_subsystem
 * @{
 */

/**
 * nss_if_message_types
 *	Message types for the NSS interface.
 */
enum nss_if_message_types {
	NSS_IF_OPEN,
	NSS_IF_CLOSE,
	NSS_IF_LINK_STATE_NOTIFY,
	NSS_IF_MTU_CHANGE,
	NSS_IF_MAC_ADDR_SET,
	NSS_IF_STATS,
	NSS_IF_ISHAPER_ASSIGN,
	NSS_IF_BSHAPER_ASSIGN,
	NSS_IF_ISHAPER_UNASSIGN,
	NSS_IF_BSHAPER_UNASSIGN,
	NSS_IF_ISHAPER_CONFIG,
	NSS_IF_BSHAPER_CONFIG,
	NSS_IF_PAUSE_ON_OFF,
	NSS_IF_VSI_ASSIGN,
	NSS_IF_VSI_UNASSIGN,
	NSS_IF_SET_NEXTHOP,
	NSS_IF_SET_IGS_NODE,
	NSS_IF_CLEAR_IGS_NODE,
	NSS_IF_RESET_NEXTHOP,
	NSS_IF_PPE_PORT_CREATE,
	NSS_IF_PPE_PORT_DESTROY,
	NSS_IF_MAX_MSG_TYPES = 9999,
};

/**
 * nss_if_error_types
 *	Error types for the NSS interface.
 */
enum nss_if_error_types {
	NSS_IF_ERROR_NO_ISHAPERS,
	NSS_IF_ERROR_NO_BSHAPERS,
	NSS_IF_ERROR_NO_ISHAPER,
	NSS_IF_ERROR_NO_BSHAPER,
	NSS_IF_ERROR_ISHAPER_OLD,
	NSS_IF_ERROR_BSHAPER_OLD,
	NSS_IF_ERROR_ISHAPER_CONFIG_FAILED,
	NSS_IF_ERROR_BSHAPER_CONFIG_FAILED,
	NSS_IF_ERROR_TYPE_UNKNOWN,
	NSS_IF_ERROR_TYPE_EOPEN,
	NSS_IF_ERROR_TYPE_INVALID_MTU,
	NSS_IF_ERROR_TYPE_INVALID_MAC_ADDR,
	NSS_IF_ERROR_TYPE_VSI_NOT_MATCH,
	NSS_IF_ERROR_TYPE_VSI_REASSIGN,
	NSS_IF_ERROR_TYPE_VSI_INVALID,
	NSS_IF_ERROR_TYPE_MAX = 9999,
};

/**
 * nss_if_data_align
 *	Data alignment modes for the NSS interface.
 */
enum nss_if_data_align {
	NSS_IF_DATA_ALIGN_2BYTE = 0,
	NSS_IF_DATA_ALIGN_4BYTE = 2,
};

/**
 * nss_if_open
 *	Message information for opening the NSS interface.
 */
struct nss_if_open {
	uint32_t tx_desc_ring;	/**< Tx descriptor ring address. */
	uint32_t rx_desc_ring;	/**< Rx descriptor ring address. */
	uint32_t rx_forward_if;	/**< Forward received packets to this interface. */
	uint32_t alignment_mode;/**< Header alignment mode. */
};

/**
 * nss_if_close
 *	Message information for closing the NSS interface.
 */
struct nss_if_close {
	uint32_t reserved;	/**< Placeholder for the structure. */
};

/**
 * nss_if_link_state_notify
 *	Link state notification sent to the NSS interface.
 */
struct nss_if_link_state_notify {
	uint32_t state;
			/**< Link state UP is bit 0 set. Other bits are as defined by Linux to indicate speed and duplex. */
};

/**
 * nss_if_mtu_change
 *	MTU change for the NSS interface.
 */
struct nss_if_mtu_change {
	uint16_t min_buf_size;	/**< Changed value for the minimum buffer size. */
};

/**
 * nss_if_pause_on_off
 *	Enables or disables a pause frame for the NSS interface.
 */
struct nss_if_pause_on_off {
	uint32_t pause_on;	/**< Turn the pause frame ON or OFF. */
};

/**
 * nss_if_mac_address_set
 *	MAC address setting.
 */
struct nss_if_mac_address_set {
	uint8_t mac_addr[ETH_ALEN];	/**< MAC address. */
};

/**
 * nss_if_shaper_assign
 *	Shaper assignment message.
 */
struct nss_if_shaper_assign {
	uint32_t shaper_id;		/**< ID of the request. */
	uint32_t new_shaper_id;		/**< ID of the response. */
};

/**
 * nss_if_shaper_unassign
 *	Shaper unassign message.
 */
struct nss_if_shaper_unassign {
	uint32_t shaper_id;		/**< ID of the request. */
};

/**
 * nss_if_shaper_configure
 *	Shaper configuration message.
 */
struct nss_if_shaper_configure {
	struct nss_shaper_configure config;	/**< Specific shaper message for a particular interface. */
};

/**
 * nss_if_vsi_assign
 *	VSI assignment message.
 */
struct nss_if_vsi_assign {
	uint32_t vsi;		/**< Virtual interface number. */
};

/**
 * nss_if_vsi_unassign
 *	VSI unassign message.
 */
struct nss_if_vsi_unassign {
	uint32_t vsi;		/**< Virtual interface number. */
};

/**
 * nss_if_set_nexthop
 *	Message to set nexthop for an interface.
 */
struct nss_if_set_nexthop {
	uint32_t nexthop;	/**< Nexthop interface number. */
};

/**
 * nss_if_igs_config
 *	Ingress shaper set/clear configure message structure.
 */
struct nss_if_igs_config {
	int32_t igs_num;	/**< Ingress shaper interface number. */
};

/**
 * nss_if_ppe_port_create
 *	Message to create PPE port.
 */
struct nss_if_ppe_port_create {
	int32_t ppe_port_num;	/**< PPE port number returned by NSS. */
};

/**
 * nss_if_msgs
 *	Information for physical NSS interface command messages.
 */
union nss_if_msgs {
	struct nss_if_link_state_notify link_state_notify;
			/**< Link status notification. */
	struct nss_if_open open;
			/**< Open the NSS interface. */
	struct nss_if_close close;
			/**< Close the NSS interface. */
	struct nss_if_mtu_change mtu_change;
			/**< MTU change notification. */
	struct nss_if_mac_address_set mac_address_set;
			/**< MAC address setting. */
	struct nss_cmn_node_stats stats;
			/**< Synchronize the satistics. */
	struct nss_if_shaper_assign shaper_assign;
			/**< Assign the shaper. */
	struct nss_if_shaper_unassign shaper_unassign;
			/**< Unassign the shaper. */
	struct nss_if_shaper_configure shaper_configure;
			/**< Configure the shaper. */
	struct nss_if_pause_on_off pause_on_off;
			/**< ON or OFF notification for a Pause frame. */
	struct nss_if_vsi_assign vsi_assign;
			/**< Assign the VSI. */
	struct nss_if_vsi_unassign vsi_unassign;
			/**< Remove the VSI assignment. */
	struct nss_if_set_nexthop set_nexthop;
			/**< Set nexthop of interface. */
	struct nss_if_igs_config config_igs;
			/**< Configure an ingress shaper interface. */
	struct nss_if_ppe_port_create ppe_port_create;
			/**< Create a PPE port. */
};

/**
 * nss_if_msg
 *	Data for sending and receiving base class messages for all interface types.
 */
struct nss_if_msg {
	struct nss_cmn_msg cm;		/**< Common message header. */
	union nss_if_msgs msg;		/**< Message payload. */
};

/**
 * Callback function for receiving NSS interface messages.
 *
 * @datatypes
 * nss_if_msg
 *
 * @param[in] app_data  Pointer to the application context of the message.
 * @param[in] msg       Pointer to the message data.
 */
typedef void (*nss_if_msg_callback_t)(void *app_data, struct nss_if_msg *msg);

/**
 * Callback function for receiving NSS interface data.
 *
 * TODO: Adjust to pass app_data as unknown to the
 * list layer and netdev/sk as known.
 *
 * @datatypes
 * net_device \n
 * sk_buff
 *
 * @param[in] netdev  Pointer to the associated network device.
 * @param[in] skb     Pointer to the data socket buffer.
 */
typedef void (*nss_if_rx_callback_t)(struct net_device *netdev, struct sk_buff *skb);

/**
 * nss_if_register
 *	Registers the NSS interface for sending and receiving GMAC packets and messages.
 *
 * @datatypes
 * nss_if_rx_callback_t \n
 * nss_if_msg_callback_t \n
 * net_device
 *
 * @param[in] if_num        NSS interface number.
 * @param[in] rx_callback   Receive callback for the packet.
 * @param[in] msg_callback  Receive callback for message.
 * @param[in] if_ctx        Pointer to the interface context provided in the
                            callback. This context must be the OS network
                            device context pointer (net_device in Linux).
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_if_register(uint32_t if_num,
					nss_if_rx_callback_t rx_callback,
					nss_if_msg_callback_t msg_callback,
					struct net_device *if_ctx);

/**
 * nss_if_tx_buf
 *	Sends GMAC packets to a specific physical or virtual network interface.
 *
 * @datatypes
 * nss_ctx_instance \n
 * sk_buff
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] os_buf   Pointer to the OS buffer (e.g., skbuff).
 * @param[in] if_num   Network physical or virtual interface number.
 *
 * @return
 * Status of the Tx operation.
 */
extern nss_tx_status_t nss_if_tx_buf(struct nss_ctx_instance *nss_ctx, struct sk_buff *os_buf, uint32_t if_num);

/**
 * nss_if_tx_msg
 *	Sends a message to the NSS interface.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_if_msg
 *
 * @param[in,out] nss_ctx  Pointer to the NSS context.
 * @param[in]     nim      Pointer to the NSS interface message.
 *
 * @return
 * Status of the Tx operation.
 */
nss_tx_status_t nss_if_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_if_msg *nim);

/**
 * nss_if_msg_sync
 *	Sends a message to the NSS interface and waits for the response.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_if_msg
 *
 * @param[in,out] nss_ctx  Pointer to the NSS context.
 * @param[in]     nim      Pointer to the NSS interface message.
 *
 * @return
 * Status of the Tx operation.
 */
nss_tx_status_t nss_if_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_if_msg *nim);

/**
 * nss_if_set_nexthop
 *	Configure the next hop for an interface.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] if_num   NSS interface number.
 * @param[in] nexthop  NSS interface number for next hop node.
 *
 * @return
 * Status of the Tx operation.
 */
nss_tx_status_t nss_if_set_nexthop(struct nss_ctx_instance *nss_ctx, uint32_t if_num, uint32_t nexthop);

/**
 * nss_if_reset_nexthop
 *	De-configure the next hop for an interface.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] if_num   NSS interface number.
 *
 * @return
 * Status of the Tx operation.
 */
nss_tx_status_t nss_if_reset_nexthop(struct nss_ctx_instance *nss_ctx, uint32_t if_num);

/**
 * nss_if_change_mtu
 *	Changes the MTU of the interface.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] if_num   NSS interface number.
 * @param[in] mtu      New MTU.
 *
 * @return
 * Status of the transmit operation.
 */
nss_tx_status_t nss_if_change_mtu(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint16_t mtu);

/**
 * nss_if_change_mac_addr
 *	Changes the MAC address of the interface.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] if_num   NSS interface number.
 * @param[in] mac_addr New MAC address.
 *
 * @return
 * Status of the transmit operation.
 */
nss_tx_status_t nss_if_change_mac_addr(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint8_t *mac_addr);

/**
 * nss_if_vsi_unassign
 *	Detaches the VSI ID from the given interface.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] if_num   NSS interface number.
 * @param[in] vsi      VSI ID.
 *
 * @return
 * Status of the transmit operation.
 */
nss_tx_status_t nss_if_vsi_unassign(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint32_t vsi);

/**
 * nss_if_vsi_assign
 *	Attaches the VSI ID to the given interface.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] if_num   NSS interface number.
 * @param[in] vsi      VSI ID.
 *
 * @return
 * Status of the transmit operation.
 */
nss_tx_status_t nss_if_vsi_assign(struct nss_ctx_instance *nss_ctx, nss_if_num_t if_num, uint32_t vsi);

/**
 * @}
 */

#endif /*  __NSS_IF_H */
