blob: 39e024bfbf3de2557bf88a4ce357f91c0e22d374 [file] [log] [blame]
/*
**************************************************************************
* 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_gre_redir_mark.h
* NSS GRE Redirect mark interface definitions.
*/
#ifndef __NSS_GRE_REDIR_MARK_H
#define __NSS_GRE_REDIR_MARK_H
#define NSS_GRE_REDIR_MARK_HLOS_MAGIC 0xaade /**< Metadata magic set by HLOS. */
#define NSS_GRE_REDIR_MARK_NSS_MAGIC 0xaadf /**< Metadata magic set by NSS. */
extern struct nss_gre_redir_mark_stats gre_mark_stats;
/**
* nss_gre_redir_mark messages
* Message types for GRE redirect mark requests and responses.
*/
enum nss_gre_redir_mark_msg_types {
NSS_GRE_REDIR_MARK_REG_CB_MSG, /**< Register callback configuration message. */
NSS_GRE_REDIR_MARK_STATS_SYNC_MSG, /**< Statistics synchronization message. */
NSS_GRE_REDIR_MARK_MSG_MAX, /**< Maximum message type. */
};
/**
* nss_gre_redir_mark errors
* Error codes for GRE redirect mark configuration message.
*/
enum nss_gre_redir_mark_error_types {
NSS_GRE_REDIR_MARK_ERROR_NONE, /**< Configuration successful. */
NSS_GRE_REDIR_MARK_ERROR_INV_IF_NUM, /**< Invalid interface number for callback registration. */
NSS_GRE_REDIR_MARK_ERROR_INV_ETH_TYPE, /**< Invalid Ethernet type for the destination interface. */
NSS_GRE_REDIR_MARK_ERROR_TYPE_MAX
};
/**
* nss_gre_redir_mark_stats_types
* GRE redirect mark statistics types.
*/
enum nss_gre_redir_mark_stats_types {
NSS_GRE_REDIR_MARK_STATS_HLOS_MAGIC_FAILED = NSS_STATS_NODE_MAX,
/**< HLOS magic fail count. */
NSS_GRE_REDIR_MARK_STATS_INV_DST_IF_DROPS, /**< Invalid transmit interface drop count. */
NSS_GRE_REDIR_MARK_STATS_DST_IF_ENQUEUE, /**< Next egress interface enqueue success count. */
NSS_GRE_REDIR_MARK_STATS_DST_IF_ENQUEUE_DROPS, /**< Next egress interface enqueue drop count. */
NSS_GRE_REDIR_MARK_STATS_INV_APPID, /**< Invalid application ID for the transmit completion packets. */
NSS_GRE_REDIR_MARK_STATS_HEADROOM_UNAVAILABLE, /**< Packet headroom unavailable to write metadata. */
NSS_GRE_REDIR_MARK_STATS_TX_COMPLETION_SUCCESS, /**< Transmit completion host enqueue success count. */
NSS_GRE_REDIR_MARK_STATS_TX_COMPLETION_DROPS, /**< Transmit completion host enqueue drop count. */
NSS_GRE_REDIR_MARK_STATS_MAX /**< Maximum statistics type. */
};
/**
* nss_gre_redir_mark_metadata
* HLOS to NSS per packet downstream metadata.
*/
struct nss_gre_redir_mark_metadata {
uint32_t dst_ifnum; /**< Destination Tx interface number. */
uint8_t wifi_tid; /**< TID value. */
uint8_t app_id; /**< Application ID. */
uint16_t hw_hash_idx; /**< Hardware AST hash index value. */
uint32_t tx_status; /**< Transmit status. */
uint16_t offset; /**< Buffer offset from the metadata. */
uint16_t magic; /**< Metadata magic. */
};
/**
* nss_gre_redir_mark_stats
* GRE redirect mark statistics.
*/
struct nss_gre_redir_mark_stats_sync_msg {
struct nss_cmn_node_stats node_stats; /**< Common node statistics. */
uint32_t hlos_magic_fail; /**< HLOS magic fail count. */
uint32_t invalid_dst_drop; /**< Invalid transmit interface drop count. */
uint32_t dst_enqueue_success; /**< Next egress interface enqueue success count. */
uint32_t dst_enqueue_drop; /**< Next egress interface enqueue drop count. */
uint32_t inv_appid; /**< Invalid application ID for the transmit completion packets. */
uint32_t headroom_unavail; /**< Packet headroom unavailable to write metadata. */
uint32_t tx_completion_success; /**< Transmit completion host enqueue success count. */
uint32_t tx_completion_drop; /**< Transmit completion host enqueue drop count. */
};
/**
* nss_gre_redir_mark_register_cb_msg
* Transmit completion function register configuration message.
*/
struct nss_gre_redir_mark_register_cb_msg {
uint32_t nss_if_num; /**< NSS transmit interface number on which callback needs to be registered. */
};
/**
* nss_gre_redir_mark_stats_notification
* GRE redirect mark transmission statistics structure.
*/
struct nss_gre_redir_mark_stats_notification {
uint64_t stats_ctx[NSS_GRE_REDIR_MARK_STATS_MAX]; /**< Context transmission statistics. */
uint32_t core_id; /**< Core ID. */
uint32_t if_num; /**< Interface number. */
};
/**
* nss_gre_redir_mark_msg
* Structure that describes the interface message.
*/
struct nss_gre_redir_mark_msg {
struct nss_cmn_msg cm; /**< Common message. */
/**
* Payload of a GRE redirect mark message.
*/
union {
struct nss_gre_redir_mark_register_cb_msg reg_cb_msg;
/**< Configuration message to register for callback on completion. */
struct nss_gre_redir_mark_stats_sync_msg stats_sync;
/**< Mark node statistics synchronization. */
} msg; /**< Message payload for GRE redirect mark messages exchanged with NSS core. */
};
/**
* Callback function for receiving GRE redirect mark 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_redir_mark_data_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi);
/**
* Callback function for receiving GRE redirect mark 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_gre_redir_mark_msg_callback_t)(void *app_data, struct nss_cmn_msg *msg);
/**
* nss_gre_redir_mark_unregister_if
* Deregisters a GRE redirect mark interface from the NSS.
*
* @param[in] if_num GRE redirect mark interface number.
*
* @return
* None.
*
* @dependencies
* The GRE redirect mark interface must have been previously registered.
*
* @return
* True if successful, else false.
*/
extern bool nss_gre_redir_mark_unregister_if(uint32_t if_num);
/**
* nss_gre_redir_mark_tx_buf
* Sends data buffers to NSS firmware asynchronously.
*
* @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 GRE redirect mark interface number.
*
* @return
* Status of the Tx operation.
*/
extern nss_tx_status_t nss_gre_redir_mark_tx_buf(struct nss_ctx_instance *nss_ctx, struct sk_buff *os_buf,
uint32_t if_num);
/**
* nss_gre_redir_mark_reg_cb
* Configure a callback on VAP for downstream application flows.
*
* @datatypes
* nss_gre_redir_mark_register_cb_msg
*
* @param[in] ifnum NSS interface number.
* @param[in] ngrcm Downstream application callback registration message.
*
* @return
* Status of Tx operation.
*/
extern nss_tx_status_t nss_gre_redir_mark_reg_cb(int ifnum,
struct nss_gre_redir_mark_register_cb_msg *ngrcm);
/**
* nss_gre_redir_mark_tx_msg
* Sends GRE redirect mark messages.
*
* @datatypes
* nss_ctx_instance \n
* nss_gre_redir_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_redir_mark_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_gre_redir_mark_msg *msg);
/**
* nss_gre_redir_mark_tx_msg_sync
* Sends messages to NSS firmware synchronously.
*
* @datatypes
* nss_ctx_instance \n
* nss_gre_redir_mark_msg
*
* @param[in] nss_ctx NSS core context.
* @param[in] ngrm Pointer to GRE redirect mark message data.
*
* @return
* Status of Tx operation.
*/
extern nss_tx_status_t nss_gre_redir_mark_tx_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_gre_redir_mark_msg *ngrm);
/**
* nss_gre_redir_mark_stats_get
* Gets GRE redirect mark statistics.
*
* @datatypes
* nss_gre_redir_mark_stats
*
* @param[out] stats Pointer to the memory address, which must be large enough to
* hold all the statistics.
*
* @return
* TRUE or FALSE.
*/
extern bool nss_gre_redir_mark_stats_get(struct nss_gre_redir_mark_stats *stats);
/**
* nss_gre_redir_alloc_and_register_node
* Registers GRE redirect mark static node with NSS.
*
* @datatypes
* net_device \n
* nss_gre_redir_mark_data_callback_t \n
* nss_gre_redir_mark_msg_callback_t
*
* @param[in] netdev Pointer to the associated network device.
* @param[in] if_num NSS interface number.
* @param[in] cb_func_data Callback for the data.
* @param[in] cb_func_msg Callback for the message.
* @param[in] features Data socket buffer types supported by this interface.
*
* @return
* NSS interface number allocated.
*/
extern struct nss_ctx_instance *nss_gre_redir_mark_register_if(struct net_device *netdev, uint32_t if_num,
nss_gre_redir_mark_data_callback_t cb_func_data, nss_gre_redir_mark_msg_callback_t cb_func_msg,
uint32_t features);
/**
* nss_gre_redir_mark_get_context
* Gets the GRE redirect mark context.
*
* @return
* Pointer to the NSS core context.
*/
extern struct nss_ctx_instance *nss_gre_redir_mark_get_context(void);
/**
* nss_gre_redir_mark_get_dentry
* Returns directory entry created in debug filesystem for statistics.
*
* @return
* Pointer to created directory entry for GRE redirect mark.
*/
extern struct dentry *nss_gre_redir_mark_get_dentry(void);
/*
* nss_gre_redir_mark_get_device
* Gets the original device from probe.
*
* @return
* Pointer to the device.
*/
extern struct device *nss_gre_redir_mark_get_device(void);
/**
* nss_gre_redir_mark_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_redir_mark_stats_unregister_notifier(struct notifier_block *nb);
/**
* nss_gre_redir_mark_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_redir_mark_stats_register_notifier(struct notifier_block *nb);
/**
* @}
*/
#endif /* __NSS_GRE_REDIR_MARK_H */