blob: 594c4a253addca291b844e71364b918d417061cd [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_vxlan.h
* NSS VxLAN interface definitions.
*/
#ifndef __NSS_VXLAN_H
#define __NSS_VXLAN_H
/**
* @addtogroup nss_vxlan_subsystem
* @{
*/
/**
* Maximum number of supported VxLAN tunnel sessions.
*/
#define NSS_VXLAN_MAX_TUNNELS 64
/**
* Maximum number of supported VxLAN FDB entries.
*/
#define NSS_VXLAN_MACDB_ENTRIES_MAX 1024
/**
* MAC database entries per message.
*/
#define NSS_VXLAN_MACDB_ENTRIES_PER_MSG 20
/*
* VxLAN Rule configure message flags
*/
#define NSS_VXLAN_RULE_FLAG_GBP_ENABLED 0x0001 /**< Group Policy ID is eanbled. */
#define NSS_VXLAN_RULE_FLAG_INHERIT_TOS 0x0002 /**< Use inner TOS for encapsulation. */
#define NSS_VXLAN_RULE_FLAG_ENCAP_L4_CSUM_REQUIRED 0x0004 /**< Generate transmit checksum. */
#define NSS_VXLAN_RULE_FLAG_IPV4 0x0010 /**< IPv4 tunnel. */
#define NSS_VXLAN_RULE_FLAG_IPV6 0x0020 /**< IPv6 tunnel. */
#define NSS_VXLAN_RULE_FLAG_UDP 0x0100 /**< UDP tunnel. */
/**
* nss_vxlan_msg_type
* Message types for VxLAN tunnel.
*/
enum nss_vxlan_msg_type {
NSS_VXLAN_MSG_TYPE_STATS_SYNC, /**< Statistics synchronization message. */
NSS_VXLAN_MSG_TYPE_TUN_CONFIGURE, /**< Creating tunnel rule. */
NSS_VXLAN_MSG_TYPE_TUN_UNCONFIGURE, /**< Destroying tunnel rule. */
NSS_VXLAN_MSG_TYPE_TUN_ENABLE, /**< Enable the tunnel. */
NSS_VXLAN_MSG_TYPE_TUN_DISABLE, /**< Disable the tunnel. */
NSS_VXLAN_MSG_TYPE_MAC_ADD, /**< Add MAC rule to the database. */
NSS_VXLAN_MSG_TYPE_MAC_DEL, /**< Remove MAC rule from the database. */
NSS_VXLAN_MSG_TYPE_MACDB_STATS, /**< MAC database statistics synchronization message. */
NSS_VXLAN_MSG_TYPE_MAX, /**< Maximum message type. */
};
/**
* nss_vxlan_error_response_types
* Error types for VxLAN responses to messages from the host.
*/
enum nss_vxlan_error_type {
NSS_VXLAN_ERROR_TYPE_NONE = 1, /**< Unknown type error. */
NSS_VXLAN_ERROR_TYPE_DECAP_REGISTER_FAIL, /**< Decapsulation node registration failed. */
NSS_VXLAN_ERROR_TYPE_DEST_IP_MISMATCH, /**< Destination IP address mismatch. */
NSS_VXLAN_ERROR_TYPE_INVALID_VNI, /**< Invalid virtual network ID. */
NSS_VXLAN_ERROR_TYPE_INVALID_L3_PROTO, /**< L3 Protocol is invalid error. */
NSS_VXLAN_ERROR_TYPE_INVALID_UDP_PROTO, /**< UDP Protocol is invalid error. */
NSS_VXLAN_ERROR_TYPE_INVALID_SRC_PORT, /**< Source port range is invalid. */
NSS_VXLAN_ERROR_TYPE_MAC_BAD_ENTRY, /**< MAC table has a bad entry. */
NSS_VXLAN_ERROR_TYPE_MAC_EXISTS, /**< MAC entry exists in the table error. */
NSS_VXLAN_ERROR_TYPE_MAC_NOT_EXIST, /**< MAC does not exist in the table error. */
NSS_VXLAN_ERROR_TYPE_MAC_ENTRY_UNHASHED, /**< MAC entry is not hashed in table. */
NSS_VXLAN_ERROR_TYPE_MAC_ENTRY_ALLOC_FAILED, /**< MAC entry allocation failed. */
NSS_VXLAN_ERROR_TYPE_MAC_ENTRY_DELETE_FAILED, /**< MAC entry deletion failed. */
NSS_VXLAN_ERROR_TYPE_MAC_TABLE_FULL, /**< MAC table is full error. */
NSS_VXLAN_ERROR_TYPE_SIBLING_NODE_NOT_EXIST, /**< Sibling node does not exist. */
NSS_VXLAN_ERROR_TYPE_TUNNEL_CONFIGURED, /**< Tunnel is already configured. */
NSS_VXLAN_ERROR_TYPE_TUNNEL_UNCONFIGURED, /**< Tunnel is not configured. */
NSS_VXLAN_ERROR_TYPE_TUNNEL_ADD_FAILED, /**< Adding tunnel information failed. */
NSS_VXLAN_ERROR_TYPE_TUNNEL_DISABLED, /**< Tunnel is already disabled error. */
NSS_VXLAN_ERROR_TYPE_TUNNEL_ENABLED, /**< Tunnel is already enabled error. */
NSS_VXLAN_ERROR_TYPE_TUNNEL_ENTRY_EXISTS, /**< Tunnel already exists. */
NSS_VXLAN_ERROR_TYPE_MAX, /**< Maximum error type. */
};
/**
* nss_vxlan_stats_msg
* Per-tunnel statistics messages from the NSS firmware.
*/
struct nss_vxlan_stats_msg {
struct nss_cmn_node_stats node_stats; /**< Common firmware statistics. */
uint32_t except_mac_db_lookup_failed; /**< MAC database look up failed. */
uint32_t except_mac_move; /**< User is moved. */
uint32_t except_low_hroom; /**< Transmit exception due to insufficient headroom. */
uint32_t except_no_policy_id; /**< Policy ID does not exist. */
uint32_t except_extra_vxlan_hdr_flags; /**< More flags are set than NSS can process. */
uint32_t except_vni_lookup_failed; /**< Virtual network ID look up failed. */
uint32_t dropped_malformed; /**< Packet is malformed. */
uint32_t dropped_next_node_queue_full; /**< Next node dropped the packet. */
uint32_t except_inner_hash; /**< Inner hash calculation failed. */
};
/**
* nss_vxlan_rule_msg
* VxLAN rule message.
*
* The same rule structure applies for both encapsulation and decapsulation
* in a tunnel.
*/
struct nss_vxlan_rule_msg {
/*
* VxLAN Rules
*/
uint32_t sibling_if_num; /**< Sibling node interface number. */
uint32_t vni; /**< Virtual network ID. */
uint16_t tunnel_flags; /**< VxLAN tunnel flags. */
/*
* IP rules
*/
uint16_t flow_label; /**< Flow label. */
uint8_t tos; /**< Type of service/traffic class. */
uint8_t ttl; /**< TTL/hop limit. */
/*
* L4 rules
*/
uint16_t src_port_min; /**< Minimum permissible port number. */
uint16_t src_port_max; /**< Maximum permissible port number. */
uint16_t dest_port; /**< UDP destination port. */
};
/**
* nss_vxlan_encap_rule
* Encapsulation information for a VxLAN tunnel.
*/
struct nss_vxlan_encap_rule {
uint32_t src_ip[4]; /**< Source IP. */
uint32_t dest_ip[4]; /**< Destination IP. */
};
/**
* nss_vxlan_mac_msg
* VxLAN MAC message structure.
*/
struct nss_vxlan_mac_msg {
struct nss_vxlan_encap_rule encap;
/**< Tunnel encapsulation header. */
uint32_t vni; /**< VxLAN network identifier. */
uint16_t mac_addr[3]; /**< MAC address. */
};
/**
* nss_vxlan_macdb_stats_entry
* MAC database statistics entry.
*/
struct nss_vxlan_macdb_stats_entry {
uint32_t hits; /**< Total hash hits on this hash entry. */
uint16_t mac[3]; /**< MAC address. */
};
/**
* nss_vxlan_macdb_stats_msg
* VxLAN MAC database statistics.
*/
struct nss_vxlan_macdb_stats_msg {
uint16_t cnt; /**< Number of MAC database entries copied. */
uint16_t reserved; /**< Reserved for future use. */
struct nss_vxlan_macdb_stats_entry entry[NSS_VXLAN_MACDB_ENTRIES_PER_MSG];
/**< MAC database entries. */
};
/**
* nss_vxlan_msg
* Data structure for sending and receiving VxLAN messages.
*/
struct nss_vxlan_msg {
struct nss_cmn_msg cm; /**< Common message header. */
/**
* Payload of a VxLAN message.
*/
union {
struct nss_vxlan_stats_msg stats;
/**< Synchronized statistics for the VxLAN interface. */
struct nss_vxlan_rule_msg vxlan_create;
/**< Allocate VxLAN tunnel node. */
struct nss_vxlan_rule_msg vxlan_destroy;
/**< Destroy VxLAN tunnel node. */
struct nss_vxlan_mac_msg mac_add;
/**< MAC add message for UDP encapsulation. */
struct nss_vxlan_mac_msg mac_del;
/**< MAC delete message. */
struct nss_vxlan_macdb_stats_msg db_stats;
/**< MAC database statistics. */
} msg; /**< Payload for VxLAN tunnel messages exchanged with the NSS core. */
};
/**
* Callback function for receiving VxLAN tunnel 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_vxlan_buf_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi);
/**
* Callback function for receiving VxLAN 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_vxlan_msg_callback_t)(void *app_data, struct nss_cmn_msg *msg);
/**
* nss_vxlan_tx_msg
* Sends VxLAN tunnel messages to the NSS.
*
* Do not call this function from a softirq or interrupt because it
* might sleep if the NSS firmware is busy serving another host thread.
*
* @datatypes
* nss_ctx_instance \n
* nss_vxlan_msg
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] nvm Pointer to the message data.
*
* @return
* Status of the Tx operation.
*/
extern nss_tx_status_t nss_vxlan_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_vxlan_msg *nvm);
/**
* nss_vxlan_tx_msg_sync
* Sends a VxLAN message to the NSS synchronously.
*
* @datatypes
* nss_ctx_instance \n
* nss_vxlan_msg
*
* @param[in] nss_ctx Pointer to the NSS context.
* @param[in] nvm Pointer to the message data.
*
* @return
* Status of the Tx operation.
*/
extern nss_tx_status_t nss_vxlan_tx_msg_sync(struct nss_ctx_instance *nss_ctx, struct nss_vxlan_msg *nvm);
/**
* nss_vxlan_unregister_if
* Deregisters the VxLAN interface from the NSS.
*
* @param[in] if_num NSS interface number.
*
* @return
* None.
*/
extern bool nss_vxlan_unregister_if(uint32_t if_num);
/**
* nss_vxlan_register_if
* Registers the VxLAN interface with the NSS.
*
* @datatypes
* nss_vxlan_buf_callback_t \n
* nss_vxlan_msg_callback_t \n
* net_device
*
* @param[in] if_num NSS interface number.
* @param[in] type Dynamic interface type.
* @param[in] data_cb Callback for the data.
* @param[in] notify_cb Callback for the 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_vxlan_register_if(uint32_t if_num, uint32_t type, nss_vxlan_buf_callback_t data_cb,
nss_vxlan_msg_callback_t notify_cb, struct net_device *netdev, uint32_t features);
/**
* nss_vxlan_register_handler
* Initializes VxLAN module in NSS
*
* @return
* None.
*/
extern void nss_vxlan_init(void);
/**
* nss_vxlan_msg_init
* Initializes a VxLAN message.
*
* @datatypes
* nss_vxlan_msg \n
* nss_vxlan_msg_callback_t
*
* @param[in,out] nvm Pointer to the VxLAN tunnel message.
* @param[in] if_num NSS interface number.
* @param[in] type Type of message.
* @param[in] len Size of the message.
* @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_vxlan_msg_init(struct nss_vxlan_msg *nvm, uint16_t if_num, uint32_t type, uint32_t len,
nss_vxlan_msg_callback_t cb, void *app_data);
/**
* nss_vxlan_get_ctx()
* Get VxLAN context.
*
* @return
* Pointer to the NSS core context.
*/
extern struct nss_ctx_instance *nss_vxlan_get_ctx(void);
/**
* @}
*/
#endif
/* __NSS_VXLAN_H */