blob: 39853e5ce38e13b07ac3b79ac98c6f3d44402875 [file] [log] [blame]
/*
**************************************************************************
* Copyright (c) 2020-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_mirror.h
* NSS mirror interface definitions.
*/
#ifndef _NSS_MIRROR_H_
#define _NSS_MIRROR_H_
/**
* @addtogroup nss_mirror_subsystem
* @{
*/
/**
* Maximum number of supported mirror interfaces.
*/
#define NSS_MAX_MIRROR_DYNAMIC_INTERFACES 8
/**
* nss_mirror_msg_types
* Message types for mirror interface requests and responses.
*/
enum nss_mirror_msg_types {
NSS_MIRROR_MSG_CONFIGURE, /**< Configure message type. */
NSS_MIRROR_MSG_ENABLE, /**< Enable message type. */
NSS_MIRROR_MSG_DISABLE, /**< Disable message type. */
NSS_MIRROR_MSG_SET_NEXTHOP, /**< Set nexthop message type. */
NSS_MIRROR_MSG_RESET_NEXTHOP, /**< Reset nexthop message type. */
NSS_MIRROR_MSG_SYNC_STATS, /**< Statistics synchronization message type. */
NSS_MIRROR_MSG_MAX /**< Maximum message type. */
};
/**
* nss_mirror_pkt_clone_point
* Clone point to use for mirroring the packet.
*/
enum nss_mirror_pkt_clone_point {
NSS_MIRROR_PKT_CLONE_POINT_DEFAULT = 1, /**< Clone the packet from the start. */
NSS_MIRROR_PKT_CLONE_POINT_BEFORE_PACKET_START, /**< Clone n-bytes before packet start. */
NSS_MIRROR_PKT_CLONE_POINT_AFTER_PACKET_START, /**< Clone n-bytes after packet start. */
NSS_MIRROR_PKT_CLONE_POINT_MAX
};
/**
* nss_mirror_error_type
* Error types for mirror responses to messages from the host.
*/
enum nss_mirror_error_type {
NSS_MIRROR_ERROR_TYPE_NONE, /**< No error. */
NSS_MIRROR_ERROR_TYPE_NO_MEMORY, /**< No memory to copy. */
NSS_MIRROR_ERROR_TYPE_TX_FAILURE, /**< Transmit failure. */
NSS_MIRROR_ERROR_TYPE_BAD_PARAM, /**< Bad parameter. */
NSS_MIRROR_ERROR_TYPE_BAD_CLONE_POINT, /**< Bad packet clone point. */
NSS_MIRROR_ERROR_TYPE_INSTANCE_CONFIGURED, /**< Instance already active. */
NSS_MIRROR_ERROR_TYPE_INSTANCE_DISABLED, /**< Instance already disabled. */
NSS_MIRROR_ERROR_TYPE_BAD_NEXTHOP, /**< Incorrect nexthop interface. */
NSS_MIRROR_ERROR_TYPE_NEXTHOP_CONFIGURED, /**< Nexthop already interface. */
NSS_MIRROR_ERROR_TYPE_NEXTHOP_RESET, /**< Nexthop already reset. */
NSS_MIRROR_ERROR_TYPE_UNKNOWN_MSG, /**< Unknown message. */
NSS_MIRROR_ERROR_TYPE_MAX, /**< Maximum message type. */
};
/**
* nss_mirror_stats
* Mirror interface debug statistics.
*/
enum nss_mirror_stats {
NSS_MIRROR_STATS_PKTS, /**< Number of packets exceptioned to host. */
NSS_MIRROR_STATS_BYTES, /**< Number of bytes exceptioned to host. */
NSS_MIRROR_STATS_TX_SEND_FAIL, /**< Transmit send failures. */
NSS_MIRROR_STATS_DEST_LOOKUP_FAIL, /**< Destination lookup failures. */
NSS_MIRROR_STATS_MEM_ALLOC_FAIL, /**< Memory allocation failures. */
NSS_MIRROR_STATS_COPY_FAIL, /**< Copy failures. */
NSS_MIRROR_STATS_MAX /**< Maximum statistics count. */
};
/**
* nss_mirror_configure_msg
* Mirror interface configuration information.
*/
struct nss_mirror_configure_msg {
uint32_t pkt_clone_point; /**< Point in the packet to copy from. */
uint16_t pkt_clone_size; /**< Number of bytes to copy. */
uint16_t pkt_clone_offset; /**< Copy offset. */
};
/**
* nss_mirror_set_nexthop_msg
* Mirror interface set nexthop information.
*/
struct nss_mirror_set_nexthop_msg {
uint32_t if_num; /**< Nexthop interface number. */
};
/**
* nss_mirror_node_stats
* Mirror interface debug statistics structure.
*/
struct nss_mirror_node_stats {
uint32_t mirror_pkts; /**< Number of packets exceptioned to host. */
uint32_t mirror_bytes; /**< Number of bytes exceptioned to host. */
uint32_t tx_send_fail; /**< Transmit send failures. */
uint32_t dest_lookup_fail; /**< Destination lookup failures. */
uint32_t mem_alloc_fail; /**< Memory allocation failures. */
uint32_t copy_fail; /**< Copy failures. */
uint32_t bad_param; /**< Bad parameter. */
};
/**
* nss_mirror_stats_sync_msg
* Message information for mirror interface synchronization statistics.
*/
struct nss_mirror_stats_sync_msg {
struct nss_cmn_node_stats node_stats; /**< Common node statistics. */
struct nss_mirror_node_stats mirror_stats; /**< Debug statistics for mirror. */
};
/**
* nss_mirror_stats_notification
* Mirror transmission statistics structure.
*/
struct nss_mirror_stats_notification {
uint64_t stats_ctx[NSS_MIRROR_STATS_MAX]; /**< Context transmission statistics. */
uint32_t core_id; /**< Core ID. */
uint32_t if_num; /**< Interface number. */
};
/**
* nss_mirror_msg
* Data for sending and receiving mirror interface messages.
*/
struct nss_mirror_msg {
struct nss_cmn_msg cm; /**< Common message header. */
/**
* Payload of a mirror interface message.
*/
union {
struct nss_mirror_configure_msg config;
/**< Mirror interface configure message. */
struct nss_mirror_set_nexthop_msg nexthop;
/**< Mirror interface set nexthop message. */
struct nss_mirror_stats_sync_msg stats;
/**< Statistics message to host. */
} msg; /**< Message payload. */
};
/**
* Callback function for receiving mirror instance 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_mirror_data_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi);
/**
* Callback function for receiving mirror interface 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_mirror_msg_callback_t)(void *app_data, struct nss_cmn_msg *msg);
/**
* nss_mirror_get_context
* Gets the mirror interface context.
*
* @return
* Pointer to the NSS core context.
*/
extern struct nss_ctx_instance *nss_mirror_get_context(void);
/**
* nss_mirror_tx_msg
* Sends mirror interface messages to the NSS.
*
* @datatypes
* nss_ctx_instance \n
* nss_mirror_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_mirror_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_mirror_msg *msg);
/**
* nss_mirror_tx_msg_sync
* Sends a mirror interface message to the NSS synchronously.
*
* @datatypes
* nss_ctx_instance \n
* nss_mirror_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_mirror_tx_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_mirror_msg *msg);
/**
* nss_mirror_unregister_if
* Deregisters a mirror interface from the NSS.
*
* @param[in] if_num NSS interface number.
*
* @return
* None.
*/
extern void nss_mirror_unregister_if(uint32_t if_num);
/**
* nss_mirror_register_if
* Registers a mirror interface with the NSS for sending and receiving messages.
*
* @datatypes
* nss_mirror_data_callback_t \n
* nss_mirror_msg_callback_t \n
* net_device
*
* @param[in] if_num NSS interface number.
* @param[in] data_callback Callback for the mirror interface data.
* @param[in] event_callback Callback for the mirror interface 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_mirror_register_if(uint32_t if_num,
nss_mirror_data_callback_t data_callback,
nss_mirror_msg_callback_t event_callback,
struct net_device *netdev, uint32_t features);
/**
* nss_mirror_verify_if_num
* Verify whether the interface is an mirror interface or not.
*
* @param[in] if_num NSS interface number.
*
* @return
* True if the interface is an mirror interface.
*/
extern bool nss_mirror_verify_if_num(uint32_t if_num);
/**
* nss_mirror_register_handler
* Registers the mirror interface debug statistics handler with the NSS.
*
* @return
* None.
*/
extern void nss_mirror_register_handler(void);
/**
* nss_mirror_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_mirror_stats_unregister_notifier(struct notifier_block *nb);
/**
* nss_mirror_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_mirror_stats_register_notifier(struct notifier_block *nb);
/**
* @}
*/
#endif