mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 17:42:41 +00:00
351 lines
11 KiB
C
351 lines
11 KiB
C
/*
|
|
**************************************************************************
|
|
* 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 */
|