blob: 6e5c41e218280270c23140ab7824190250c9b092 [file] [log] [blame]
/*
**************************************************************************
* Copyright (c) 2014, 2016-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_cmn.h
* NSS Common Message Structure and APIs
*/
#ifndef __NSS_CMN_H
#define __NSS_CMN_H
/**
* @addtogroup nss_common_subsystem
* @{
*/
/**
* Interface Number 1 Valid 7 Core 8 Type 16 Index
*/
typedef int32_t nss_if_num_t;
#define NSS_IF_IS_TYPE_DYNAMIC(if_num) (if_num != -1)
#define NSS_IF_IS_VALID(if_num) (if_num < NSS_MAX_NET_INTERFACES)
/**
* @struct nss_ctx_instance
* Forward declaration for structure that contains instance data for each
* NSS core. Contents of structure are private to the NSS driver.
*/
struct nss_ctx_instance;
/*
* The first 8 bits of an interfaces number is representing the core_id,
* 0 means local core.
*/
#define NSS_CORE_ID_SHIFT 24 /**< Number of bits to shift a core local interface number. */
/**
* Macro that appends the core identifier to an interface number.
*/
#define NSS_INTERFACE_NUM_APPEND_COREID(nss_ctx, interface) ((interface) | ((nss_ctx->id + 1) << NSS_CORE_ID_SHIFT))
/**
* Macro to obtain a core local interface number.
*/
#define NSS_INTERFACE_NUM_GET(interface) ((interface) & 0xffffff)
/**
* Macro to obtain an interface core number.
*/
#define NSS_INTERFACE_NUM_GET_COREID(interface) ((interface >> NSS_CORE_ID_SHIFT) & 0xff)
/*
* Common enumerations.
*/
/**
* nss_tx_status_t
* Tx command failure results.
*
* Types starting with NSS_TX_FAILURE_SYNC_ are only used by synchronous messages.
*/
typedef enum {
NSS_TX_SUCCESS = 0,
NSS_TX_FAILURE,
NSS_TX_FAILURE_QUEUE,
NSS_TX_FAILURE_NOT_READY,
NSS_TX_FAILURE_TOO_LARGE,
NSS_TX_FAILURE_TOO_SHORT,
NSS_TX_FAILURE_NOT_SUPPORTED,
NSS_TX_FAILURE_BAD_PARAM,
NSS_TX_FAILURE_NOT_ENABLED,
NSS_TX_FAILURE_SYNC_BAD_PARAM,
NSS_TX_FAILURE_SYNC_TIMEOUT,
NSS_TX_FAILURE_SYNC_FW_ERR,
NSS_TX_FAILURE_MAX,
} nss_tx_status_t;
/**
* nss_state_t
* Initialization states.
*/
typedef enum {
NSS_STATE_UNINITIALIZED = 0,
NSS_STATE_INITIALIZED
} nss_state_t;
/**
* nss_core_id_t
* NSS core IDs.
*/
typedef enum {
NSS_CORE_0 = 0,
NSS_CORE_1,
NSS_CORE_MAX
} nss_core_id_t;
/**
* nss_cb_register_status_t
* Callback registration states.
*/
typedef enum {
NSS_CB_REGISTER_SUCCESS = 0,
NSS_CB_REGISTER_FAILED,
} nss_cb_register_status_t;
/**
* nss_cb_unregister_status_t
* Callback deregistration states.
*/
typedef enum {
NSS_CB_UNREGISTER_SUCCESS = 0,
NSS_CB_UNREGISTER_FAILED,
} nss_cb_unregister_status_t;
/**
* nss_cmn_response
* Responses for a common message.
*/
enum nss_cmn_response {
NSS_CMN_RESPONSE_ACK,
NSS_CMN_RESPONSE_EVERSION,
NSS_CMN_RESPONSE_EINTERFACE,
NSS_CMN_RESPONSE_ELENGTH,
NSS_CMN_RESPONSE_EMSG,
NSS_CMN_RESPONSE_NOTIFY,
NSS_CMN_RESPONSE_LAST
};
/**
* Array of log messages for common NSS responses.
*/
extern int8_t *nss_cmn_response_str[NSS_CMN_RESPONSE_LAST];
/**
* nss_cmn_msg
* Common message information.
*/
struct nss_cmn_msg {
uint16_t version; /**< Version ID for the main message format. */
uint16_t len; /**< Length of the message, excluding the header. */
uint32_t interface; /**< Primary key for all messages. */
enum nss_cmn_response response;
/**< Primary response. All messages must specify one of these responses. */
uint32_t type; /**< Decentralized request number used to match response numbers. */
uint32_t error; /**< Decentralized specific error message (response == EMSG). */
/**
* Padding used to start the callback from a 64-bit boundary. This field can be reused.
*/
uint32_t reserved;
nss_ptr_t cb; /**< Contains the callback pointer. */
#ifndef __LP64__
uint32_t padding1; /**< Padding used to fit 64 bits. Do not reuse. */
#endif
nss_ptr_t app_data; /**< Contains the application data. */
#ifndef __LP64__
uint32_t padding2; /**< Padding used to fit 64 bits. Do not reuse. */
#endif
};
/**
* nss_cmn_node_stats
* Common per-node statistics.
*/
struct nss_cmn_node_stats {
uint32_t rx_packets; /**< Number of packets received. */
uint32_t rx_bytes; /**< Number of bytes received. */
uint32_t tx_packets; /**< Number of packets transmitted. */
uint32_t tx_bytes; /**< Number of bytes transmitted. */
uint32_t rx_dropped[NSS_MAX_NUM_PRI]; /**< Packets dropped on receive due to queue full. */
};
/**
* nss_cmn_get_msg_len
* Gets the message length of a host-to-NSS message.
*
* @datatypes
* nss_cmn_get_msg_len
*
* @param[in] ncm Pointer to the common message.
*
* @return
* Length of the message specified in the argument to this function.
*/
static inline uint32_t nss_cmn_get_msg_len(struct nss_cmn_msg *ncm)
{
return ncm->len + sizeof(struct nss_cmn_msg);
}
#ifdef __KERNEL__ /* only for kernel to use. */
/**
* nss_cmn_msg_init
* Initializes the common area of an asynchronous host-to-NSS message.
*
* @datatypes
* nss_cmn_msg
*
* @param[in,out] ncm Pointer to the common message.
* @param[in] if_num NSS interface number.
* @param[in] type Type of message.
* @param[in] len Size of the payload.
* @param[in] cb Pointer to the callback function.
* @param[in] app_data Pointer to the application context for this message.
*
* @return
* None.
*/
extern void nss_cmn_msg_init(struct nss_cmn_msg *ncm, uint32_t if_num, uint32_t type, uint32_t len,
void *cb, void *app_data);
/**
* nss_cmn_msg_sync_init
* Initializes the common message of a synchronous host-to-NSS message.
*
* @datatypes
* nss_cmn_msg
*
* @param[in,out] ncm Pointer to the common message.
* @param[in] if_num NSS interface number.
* @param[in] type Type of message.
* @param[in] len Size of the payload.
*
* @return
* None.
*/
extern void nss_cmn_msg_sync_init(struct nss_cmn_msg *ncm, uint32_t if_num, uint32_t type, uint32_t len);
/**
* nss_cmn_get_interface_number
* Gets the interface number.
*
* @datatypes
* nss_ctx_instance \n
* net_device
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] dev Pointer to the OS network device pointer.
*
* @return
* Interface number.
*/
extern int32_t nss_cmn_get_interface_number(struct nss_ctx_instance *nss_ctx, struct net_device *dev);
/**
* nss_cmn_get_interface_number_by_dev
* Gets the interface number of a device.
*
* @datatypes
* net_device
*
* @param[in] dev Pointer to the OS network device pointer.
*
* @return
* Interface number, or -1 on failure.
*/
extern int32_t nss_cmn_get_interface_number_by_dev(struct net_device *dev);
/**
* nss_cmn_get_interface_number_by_dev_and_type
* Gets the interface number by a device and its type.
*
* @datatypes
* net_device
*
* @param[in] dev Pointer to the OS network device pointer.
* @param[in] type Type of this interface.
*
* @return
* Interface number, or -1 on failure.
*/
extern int32_t nss_cmn_get_interface_number_by_dev_and_type(struct net_device *dev, uint32_t type);
/**
* nss_cmn_interface_is_redirect
* Determines if the interface number is a redirect interface.
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] interface_num NSS interface number.
*
* @return
* TRUE if the number is a redirect interface. Otherwise FALSE.
*/
extern bool nss_cmn_interface_is_redirect(struct nss_ctx_instance *nss_ctx, int32_t interface_num);
/**
* nss_cmn_append_core_id
* Append core ID on NSS interface number.
*
* @datatypes
* nss_ctx_instance
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] if_num NSS interface number.
*
* @return
* Interface number with core ID.
*/
extern int nss_cmn_append_core_id(struct nss_ctx_instance *nss_ctx, int if_num);
/**
* nss_cmn_get_interface_dev
* Gets an interface device pointer.
*
* @datatypes
* nss_ctx_instance
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] if_num NSS interface number.
*
* @return
* Interface device pointer.
*/
extern struct net_device *nss_cmn_get_interface_dev(struct nss_ctx_instance *nss_ctx, uint32_t if_num);
/**
* nss_cmn_get_state
* Obtains the NSS state.
*
* @datatypes
* nss_ctx_instance
*
* @param[in] nss_ctx Pointer to the NSS context.
*
* @return
* NSS state that indicates whether the NSS core is initialized. For possible values, see nss_state_t.
*/
extern nss_state_t nss_cmn_get_state(struct nss_ctx_instance *nss_ctx);
/**
* Callback function for queue decongestion messages.
*
* @param[in] app_data Pointer to the application context for this message.
*/
typedef void (*nss_cmn_queue_decongestion_callback_t)(void *app_data);
/**
* nss_cmn_register_queue_decongestion
* Registers a queue for a decongestion event.
*
* The callback function is called with the spinlock held. The function should avoid deadlocks
* caused by attempting to acquire multiple spinlocks.
* @datatypes
* nss_ctx_instance \n
* nss_cmn_queue_decongestion_callback_t
*
* @param[in,out] nss_ctx Pointer to the NSS context.
* @param[in] event_callback Callback for the message.
* @param[in] app_data Pointer to the application context to be returned in the
* callback.
*
* @return
* #NSS_CB_REGISTER_SUCCESS if registration is successful.
* @par
* Otherwise, #NSS_CB_REGISTER_FAILED.
*/
extern nss_cb_register_status_t nss_cmn_register_queue_decongestion(struct nss_ctx_instance *nss_ctx, nss_cmn_queue_decongestion_callback_t event_callback, void *app_data);
/**
* nss_cmn_unregister_queue_decongestion
* Deregisters a queue from receiving a decongestion event.
*
* @datatypes
* nss_ctx_instance \n
* nss_cmn_queue_decongestion_callback_t
*
* @param[in,out] nss_ctx Pointer to the NSS context.
* @param[in] event_callback Callback for the message.
*
* @return
* #NSS_CB_REGISTER_SUCCESS if registration is successful.
* @par
* Otherwise, #NSS_CB_REGISTER_FAILED.
*
* @dependencies
* The callback function must have been previously registered.
*/
extern nss_cb_unregister_status_t nss_cmn_unregister_queue_decongestion(struct nss_ctx_instance *nss_ctx, nss_cmn_queue_decongestion_callback_t event_callback);
/**
* Callback function for packets with service code.
*
* @param[in] app_data Pointer to the application context for this message.
* @param[in] nbuf Pointer to the socket buffer.
*/
typedef void (*nss_cmn_service_code_callback_t)(void *app_data, struct sk_buff *nbuf);
/**
* nss_cmn_register_service_code
* Registers a callback for a service code.
*
* @datatypes
* nss_ctx_instance \n
* nss_cmn_service_code_callback_t
*
* @param[in,out] nss_ctx Pointer to the NSS context.
* @param[in] cb Callback for the message.
* @param[in] service_code Service code found attached to the packet.
* @param[in] app_data Pointer to the application context to be returned in the
* callback.
*
* @return
* #NSS_CB_REGISTER_SUCCESS if registration is successful.
* @par
* Otherwise, #NSS_CB_REGISTER_FAILED.
*/
extern nss_cb_register_status_t nss_cmn_register_service_code(struct nss_ctx_instance *nss_ctx, nss_cmn_service_code_callback_t cb, uint8_t service_code, void *app_data);
/**
* nss_cmn_unregister_service_code
* Deregisters a callback for the given service code.
*
* @datatypes
* nss_ctx_instance \n
* nss_cmn_service_code_callback_t
*
* @param[in,out] nss_ctx Pointer to the NSS context.
* @param[in] cb Callback for the message.
* @param[in] service_code Service code found attached to the packet.
*
* @return
* #NSS_CB_REGISTER_SUCCESS if registration is successful.
* @par
* Otherwise, #NSS_CB_REGISTER_FAILED.
*
* @dependencies
* The callback function must have been previously registered.
*/
extern nss_cb_unregister_status_t nss_cmn_unregister_service_code(struct nss_ctx_instance *nss_ctx, nss_cmn_service_code_callback_t cb, uint8_t service_code);
/**
* nss_cmn_get_nss_enabled
* Checks whether the NSS mode is supported on the platform.
*
* @return
* TRUE if NSS is supported. \n
* Otherwise, FALSE.
*/
extern bool nss_cmn_get_nss_enabled(void);
/**
* nss_cmn_rx_dropped_sum
* Sums dropped packet count of all NSS pnode queues.
*
* @datatypes
* nss_cmn_node_stats \n
*
* @param[in] node_stats Pointer to node statistics.
*
* @return
* Total dropped packets count.
*/
extern uint32_t nss_cmn_rx_dropped_sum(struct nss_cmn_node_stats *node_stats);
#endif /* __KERNEL__ */
/**
* @}
*/
#endif /* __NSS_CMN_MSG_H */