blob: 7f3056e42deaf929235a9ae6e58aedf9ad04539a [file] [log] [blame]
/*
****************************************************************************
* Copyright (c) 2017-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.h
* NSS GRE interface definitions.
*/
#ifndef _NSS_GRE_H_
#define _NSS_GRE_H_
#include <net/ip_tunnels.h>
#include <net/ip6_tunnel.h>
/**
* @addtogroup nss_gre_subsystem
* @{
*/
/**
* Maximum number of session debug statistics
*/
#define NSS_GRE_MAX_DEBUG_SESSION_STATS 16
/**
* GRE flags
*/
#define NSS_GRE_CONFIG_IKEY_VALID 0x00000001 /**< Incoming key of GRE header. */
#define NSS_GRE_CONFIG_OKEY_VALID 0x00000002 /**< Key for outgoing GRE header. */
#define NSS_GRE_CONFIG_ISEQ_VALID 0x00000004 /**< Enable sequence checking for incoming GRE traffic. */
#define NSS_GRE_CONFIG_OSEQ_VALID 0x00000008 /**< Add sequence number for out going GRE packets. */
#define NSS_GRE_CONFIG_ICSUM_VALID 0x00000010 /**< Validate incoming GRE header checksum. */
#define NSS_GRE_CONFIG_OCSUM_VALID 0x00000020 /**< Add checksum header to GRE header. */
#define NSS_GRE_CONFIG_TOS_INHERIT 0x00000040 /**< Inherit inner IP TOS to tunnel header, if not set configure provided TOS. */
#define NSS_GRE_CONFIG_TTL_INHERIT 0x00000080 /**< Inherit inner IP TTL to tunnel header, if not set configure provided TTL. */
#define NSS_GRE_CONFIG_SET_DF 0x00000100 /**< Enable DF bit on tunnel IP header. */
#define NSS_GRE_CONFIG_SET_MAC 0x00000200 /**< Add MAC header to GRE+IP tunnel header. */
#define NSS_GRE_CONFIG_SET_PADDING 0x00000400 /**< Add PADDING to align tunnel IP/GRE header. */
#define NSS_GRE_CONFIG_NEXT_NODE_AVAILABLE 0x00000800 /**< Use provided next node instead of existing next node. */
#define NSS_GRE_CONFIG_COPY_METADATA 0x00001000 /**< Enable metadata copy in NSS during alignment. */
#define NSS_GRE_CONFIG_USE_UNALIGNED 0x00002000 /**< Use unaligned infrastructure in NSS. */
#define NSS_GRE_CONFIG_DSCP_VALID 0x00004000 /**< Add DSCP per packet. */
/**
* nss_gre_error_types.
* Error types for GRE configuration messages.
*/
enum nss_gre_error_types {
NSS_GRE_ERR_UNKNOWN_MSG = 1, /**< Unknown message. */
NSS_GRE_ERR_IF_INVALID = 2, /**< Invalid interface. */
NSS_GRE_ERR_MODE_INVALID = 3, /**< Invalid mode type. */
NSS_GRE_ERR_IP_INVALID = 4, /**< Invalid IP type. */
NSS_GRE_ERR_GRE_SESSION_PARAMS_INVALID = 5, /**< Invalid GRE session parameters provided. */
NSS_GRE_ERR_DSCP_CFG_INVALID = 6, /**< Both TOS and DSCP flags are enabled. */
NSS_GRE_ERR_MAX, /**< Maximum GRE error. */
};
/**
* nss_gre_info
* GRE private information.
*/
struct nss_gre_info {
/**
* Union of IPv4/IPv6 tunnel.
*/
union {
struct ip_tunnel t4; /**< IPv4 tunnel. */
struct ip6_tnl t6; /**< IPv6 tunnel. */
} t; /**< IPv4 and IPv6 tunnel. */
int nss_if_number_inner; /**< NSS interface number for GRE inner. */
struct net_device *next_dev_inner; /**< Next network device for inner flow. */
struct net_device *next_dev_outer; /**< Next network device for outer flow. */
uint8_t gre_hlen; /**< GRE header length. */
uint8_t pad_len; /**< Pad length. */
};
/**
* nss_gre_msg_types
* Message types for GRE requests and responses.
*/
enum nss_gre_msg_types {
NSS_GRE_MSG_ENCAP_CONFIGURE = NSS_IF_MAX_MSG_TYPES + 1,
NSS_GRE_MSG_DECAP_CONFIGURE,
NSS_GRE_MSG_ENCAP_DECONFIGURE,
NSS_GRE_MSG_DECAP_DECONFIGURE,
NSS_GRE_MSG_SESSION_STATS,
NSS_GRE_MSG_BASE_STATS,
NSS_GRE_MSG_MAX
};
/**
* GRE mode types.
*/
enum nss_gre_mode {
NSS_GRE_MODE_TUN, /**< GRE tunnel interface. */
NSS_GRE_MODE_TAP, /**< GRE TAP interface. */
NSS_GRE_MODE_MAX /**< Maxmum GRE mode. */
};
/**
* GRE IP types.
*/
enum nss_gre_ip_types {
NSS_GRE_IP_IPV4, /**< Outer Tunnel is IPV4. */
NSS_GRE_IP_IPV6, /**< Outer Tunnel is IPV6. */
NSS_GRE_IP_MAX, /**< Maximum IP Types. */
};
/**
* nss_gre_base_types
* GRE base debug statistics.
*/
enum nss_gre_base_types {
NSS_GRE_BASE_RX_PACKETS, /**< Receive packet count. */
NSS_GRE_BASE_RX_DROPPED, /**< Number of packet dropped at receive. */
NSS_GRE_BASE_EXP_ETH_HDR_MISSING, /**< Ethernet header missing. */
NSS_GRE_BASE_EXP_ETH_TYPE_NON_IP, /**< Packet is not IPV4 or IPV6. */
NSS_GRE_BASE_EXP_IP_UNKNOWN_PROTOCOL, /**< Packet protocol is unknown. */
NSS_GRE_BASE_EXP_IP_HEADER_INCOMPLETE, /**< Bad IP header. */
NSS_GRE_BASE_EXP_IP_BAD_TOTAL_LENGTH, /**< IP total length is invalid. */
NSS_GRE_BASE_EXP_IP_BAD_CHECKSUM, /**< IP checksum is bad. */
NSS_GRE_BASE_EXP_IP_DATAGRAM_INCOMPLETE,/**< Bad packet. */
NSS_GRE_BASE_EXP_IP_FRAGMENT, /**< IP packet is a fragment. */
NSS_GRE_BASE_EXP_IP_OPTIONS_INCOMPLETE, /**< IP option is invalid. */
NSS_GRE_BASE_EXP_IP_WITH_OPTIONS, /**< IP packet with options. */
NSS_GRE_BASE_EXP_IPV6_UNKNOWN_PROTOCOL, /**< Protocol is unknown. */
NSS_GRE_BASE_EXP_IPV6_HEADER_INCOMPLETE,/**< Incomplete ipv6 header. */
NSS_GRE_BASE_EXP_GRE_UNKNOWN_SESSION, /**< Unknown GRE session. */
NSS_GRE_BASE_EXP_GRE_NODE_INACTIVE, /**< GRE node is inactive. */
NSS_GRE_BASE_DEBUG_MAX, /**< GRE base debug maximum. */
};
/**
* nss_gre_session_types
* GRE session packet drop and exception events.
*/
enum nss_gre_session_types {
NSS_GRE_SESSION_PBUF_ALLOC_FAIL, /**< Pbuf allocation failure. */
NSS_GRE_SESSION_DECAP_FORWARD_ENQUEUE_FAIL, /**< Receive forward enqueue failure. */
NSS_GRE_SESSION_ENCAP_FORWARD_ENQUEUE_FAIL, /**< Transmit forward enqueue failure. */
NSS_GRE_SESSION_DECAP_TX_FORWARDED, /**< Number of packets forwarded after decapsulation. */
NSS_GRE_SESSION_ENCAP_RX_RECEIVED, /**< Number of packets received for encapsulation. */
NSS_GRE_SESSION_ENCAP_RX_DROPPED, /**< Packets dropped while enqueuing for encapsulation. */
NSS_GRE_SESSION_ENCAP_RX_LINEAR_FAIL, /**< Packets dropped during encapsulation linearization. */
NSS_GRE_SESSION_EXP_RX_KEY_ERROR, /**< Receive key error. */
NSS_GRE_SESSION_EXP_RX_SEQ_ERROR, /**< Receive Sequence number error. */
NSS_GRE_SESSION_EXP_RX_CS_ERROR, /**< Receive checksum error */
NSS_GRE_SESSION_EXP_RX_FLAG_MISMATCH, /**< Receive flag mismatch. */
NSS_GRE_SESSION_EXP_RX_MALFORMED, /**< Receive packet is malformed. */
NSS_GRE_SESSION_EXP_RX_INVALID_PROTOCOL, /**< Receive packet protocol is invalid. */
NSS_GRE_SESSION_EXP_RX_NO_HEADROOM, /**< Packet does not have enough headroom. */
NSS_GRE_SESSION_DEBUG_MAX, /**< Session debug maximum. */
};
/**
* GRE create message structure.
*/
struct nss_gre_config_msg {
uint32_t src_ip[4]; /**< Source IPv4 or IPv6 address. */
uint32_t dest_ip[4]; /**< Destination IPv4 or IPv6 address. */
uint32_t flags; /**< GRE Flags. */
uint32_t ikey; /**< GRE Rx key.*/
uint32_t okey; /**< GRE Tx key. */
uint32_t mode; /**< GRE TUN or TAP. */
uint32_t ip_type; /**< IPv4 or IPv6 type. */
uint32_t next_node_if_num; /**< To whom to forward packets. */
uint32_t sibling_if_num; /**< Sibling interface number. */
uint16_t src_mac[3]; /**< Source MAC address. */
uint16_t dest_mac[3]; /**< Destination MAC address. */
uint8_t ttl; /**< TTL or HOPLIMIT. */
uint8_t tos; /**< Type of service. */
uint16_t metadata_size; /**< Metadata copy size. */
};
/**
* GRE link up message structure.
*/
struct nss_gre_linkup_msg {
int if_number; /**< Interface number. */
};
/**
* GRE link down message structure
*/
struct nss_gre_linkdown_msg {
int if_number; /**< Interface number. */
};
/**
* GRE deconfig message structure
*/
struct nss_gre_deconfig_msg {
int if_number; /**< Interface number. */
};
/**
* GRE session statistics message.
*/
struct nss_gre_session_stats_msg {
struct nss_cmn_node_stats node_stats; /**< Common node statistics. */
uint32_t stats[NSS_GRE_SESSION_DEBUG_MAX]; /**< Session debug statistics. */
};
/**
* GRE base statistics message.
*/
struct nss_gre_base_stats_msg {
uint32_t stats[NSS_GRE_BASE_DEBUG_MAX]; /**< Base debug statistics. */
};
/**
* nss_gre_base_stats_notification
* GRE transmission statistics structure.
*/
struct nss_gre_base_stats_notification {
uint64_t stats_base_ctx[NSS_GRE_BASE_DEBUG_MAX]; /**< Base debug transmission statistics. */
uint32_t core_id; /**< Core ID. */
};
/**
* nss_gre_session_stats_notification
* GRE transmission statistics structure.
*/
struct nss_gre_session_stats_notification {
uint64_t stats_session_ctx[NSS_GRE_SESSION_DEBUG_MAX]; /**< Session debug transmission statistics. */
uint32_t core_id; /**< Core ID. */
uint32_t if_num; /**< Interface number. */
};
/**
* nss_gre_msg
* Message structure to send/receive GRE messages.
*/
struct nss_gre_msg {
struct nss_cmn_msg cm; /**< Common message header. */
/**
* Payload of a GRE message.
*/
union {
struct nss_gre_config_msg cmsg; /**< GRE session config message. */
struct nss_gre_deconfig_msg dmsg; /**< GRE session deconfig message. */
struct nss_gre_linkup_msg linkup; /**< GRE link up message. */
struct nss_gre_linkdown_msg linkdown; /**< GRE link down message. */
struct nss_gre_session_stats_msg sstats; /**< GRE session statistics message. */
struct nss_gre_base_stats_msg bstats; /**< Base statistics message. */
} msg; /**< Message payload. */
};
/**
* Callback function to receive GRE messages
*
* @datatypes
* nss_gre_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_msg_callback_t)(void *app_data, struct nss_gre_msg *msg);
/**
* nss_gre_tx_msg
* Sends GRE messages to the NSS.
*
* @datatypes
* nss_ctx_instance \n
* nss_gre_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_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_gre_msg *msg);
/**
* nss_gre_tx_msg_sync
* Sends GRE messages to the NSS synchronously.
*
* @datatypes
* nss_ctx_instance \n
* nss_gre_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_tx_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_gre_msg *msg);
/**
* nss_gre_tx_buf
* Sends a packet to the NSS.
*
* @datatypes
* nss_ctx_instance \n
* sk_buff
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] if_num Nss interface number.
* @param[in] skb Pointer to sk_buff.
*
* @return Tx status
*/
extern nss_tx_status_t nss_gre_tx_buf(struct nss_ctx_instance *nss_ctx, uint32_t if_num, struct sk_buff *skb);
/**
* nss_gre_get_context.
* Gets the GRE context used in nss_gre_tx.
*
* @return
* Pointer to the NSS core context.
*/
extern struct nss_ctx_instance *nss_gre_get_context(void);
/**
*
* nss_gre_ifnum_with_core_id
* Append core ID on GRE interface.
*
* @param[in] if_num NSS interface number.
*
* @return
* GRE interface number with core ID.
*/
extern int nss_gre_ifnum_with_core_id(int if_num);
/**
* Callback function for receiving GRE session 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_data_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi);
/**
* nss_gre_register_if
* Registers the GRE interface with the NSS for sending and
* receiving messages.
*
* @datatypes
* nss_gre_data_callback_t \n
* nss_gre_msg_callback_t \n
* net_device
*
* @param[in] if_num NSS interface number.
* @param[in] type NSS interface type.
* @param[in] gre_callback Callback for the data.
* @param[in] msg_callback Callback for the message.
* @param[in] netdev Pointer to the associated network device.
* @param[in] features Socket buffer types supported by this interface.
*
* @return
* Pointer to the NSS core context.
*/
extern struct nss_ctx_instance *nss_gre_register_if(uint32_t if_num, uint32_t type, nss_gre_data_callback_t gre_callback,
nss_gre_msg_callback_t msg_callback, struct net_device *netdev, uint32_t features);
/**
* nss_gre_unregister_if
* Deregisters the GRE interface from the NSS.
*
* @param[in] if_num NSS interface number.
. *
* @return
* None.
*
* @dependencies
* The tunnel interface must have been previously registered.
*/
extern void nss_gre_unregister_if(uint32_t if_num);
/**
* nss_gre_msg_init
* Initializes a GRE message.
*
* @datatypes
* nss_gre_msg
*
* @param[in,out] ncm Pointer to the message.
* @param[in] if_num Interface number
* @param[in] type Type of message.
* @param[in] len Size of the payload.
* @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_gre_msg_init(struct nss_gre_msg *ncm, uint16_t if_num, uint32_t type, uint32_t len, void *cb, void *app_data);
/**
* nss_gre_register_handler
* Registers the GRE interface with the NSS debug statistics handler.
*
* @return
* None.
*/
extern void nss_gre_register_handler(void);
/**
* Callback function for updating stats.
*
* @datatypes
* net_device \n
* sk_buff \n
*
* @param[in] netdev Pointer to the associated network device.
* @param[in] skb Pointer to the data socket buffer.
*
* @return
* None.
*/
typedef void (*nss_gre_pkt_callback_t)(struct net_device *netdev, struct sk_buff *skb);
/**
* nss_gre_register_pkt_callback
* Register for rx packet call back.
*
* @datatypes
* nss_gre_pkt_callback_t
*
* @param[in] cb Call back function which needs to be registered.
*
* @return
* None.
*/
extern void nss_gre_register_pkt_callback(nss_gre_pkt_callback_t cb);
/**
* nss_gre_unregister_pkt_callback
* Unregister for rx packet call back.
*
* @datatypes
* nss_gre_pkt_callback_t
*
* @return
* None.
*/
extern void nss_gre_unregister_pkt_callback(void);
/**
* nss_gre_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_stats_unregister_notifier(struct notifier_block *nb);
/**
* nss_gre_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_stats_register_notifier(struct notifier_block *nb);
/**
* @}
*/
#endif /* _NSS_GRE_H_ */