blob: 5833d350acbd5a8fe2a4e80bf06a494656c3e37b [file] [log] [blame]
/*
**************************************************************************
* Copyright (c) 2014-2020, 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.
**************************************************************************
*/
/**
* nss_capwapmgr.h
* CAPWAP manager for NSS
*/
#ifndef __NSS_CAPWAPMGR_H
#define __NSS_CAPWAPMGR_H
#include <nss_dtlsmgr.h>
/*
* Maximum number of tunnels currently supported
*/
#define NSS_CAPWAPMGR_MAX_TUNNELS 32
#define NSS_CAPWAPMGR_TUNNEL_STATE_CONFIGURED 0x1
/**< Bit is set if tunnel has been configured */
#define NSS_CAPWAPMGR_TUNNEL_STATE_ENABLED 0x2
/**< Bit is set if tunnel has been enabled */
#define NSS_CAPWAPMGR_TUNNEL_STATE_IPRULE_CONFIGURED 0x4
/**< Bit is set if tunnel IP rule exist */
/*
* Tunnel feature flags
*/
#define NSS_CAPWAPMGR_FEATURE_DTLS_ENABLED 0x00000001 /* Tunnel enabled DTLS. */
#define NSS_CAPWAPMGR_FEATURE_INNER_TRUSTSEC_ENABLED 0x00000002 /* Tunnel enabled inner trustsec. */
#define NSS_CAPWAPMGR_FEATURE_OUTER_TRUSTSEC_ENABLED 0x00000004 /* Tunnel enabled outer trustsec. */
#define NSS_CAPWAPMGR_FEATURE_WIRELESS_QOS_ENABLED 0x00000008 /* Tunnel enabled wireless QoS. */
/*
* All CAPWAP messages to NSS FW are sync in nature. It means we have
* to wait for ACK/NACK from NSS FW before proceeding further.
* Keep a NSS FW response table to wakeup sync message caller.
*/
struct nss_capwapmgr_response {
struct semaphore sem;
wait_queue_head_t wq;
enum nss_cmn_response response;
nss_capwap_msg_response_t error;
atomic_t seq;
};
/**
* Mapping table from tunnel-id to if_num and rule.
*/
struct nss_capwapmgr_tunnel {
struct net_device *dtls_dev; /**< DTLS netdevice */
uint32_t if_num_inner; /**< Interface number of the INNER CAPWAP node */
uint32_t if_num_outer; /**< Interface number of the OUTER CAPWAP node */
uint32_t tunnel_state; /**< Tunnel state */
uint16_t type_flags; /**< Tunnel Type to determine header size */
union {
struct nss_ipv4_create v4; /**< IPv4 rule structure */
struct nss_ipv6_create v6; /**< IPv6 rule struture */
} ip_rule;
struct nss_capwap_rule_msg capwap_rule; /**< Copy of CAPWAP rule */
};
/**
* Private structure to store information needed by a nss_capwap net_device
*/
struct nss_capwapmgr_priv {
struct nss_ctx_instance *nss_ctx; /**< Pointer to NSS context */
struct nss_capwapmgr_tunnel *tunnel; /**< Pointer to tunnel data */
uint8_t *if_num_to_tunnel_id; /**< Mapping table from if_num to tunnel_id. */
struct nss_capwapmgr_response *resp; /**< Response housekeeping */
};
/**
* CAPWAP status enums
*/
typedef enum {
/*
* nss_tx_status_t enums
*/
NSS_CAPWAPMGR_SUCCESS = NSS_TX_SUCCESS,
NSS_CAPWAPMGR_FAILURE = NSS_TX_FAILURE,
NSS_CAPWAPMGR_FAILURE_QUEUE = NSS_TX_FAILURE_QUEUE,
NSS_CAPWAPMGR_FAILURE_NOT_READY = NSS_TX_FAILURE_NOT_READY,
NSS_CAPWAPMGR_FAILURE_TOO_LARGE = NSS_TX_FAILURE_TOO_LARGE,
NSS_CAPWAPMGR_FAILURE_TOO_SHORT = NSS_TX_FAILURE_TOO_SHORT,
NSS_CAPWAPMGR_FAILURE_NOT_SUPPORTED = NSS_TX_FAILURE_NOT_SUPPORTED,
NSS_CAPWAPMGR_FAILURE_BAD_PARAM = NSS_TX_FAILURE_BAD_PARAM,
/*
* CAPWAP specific ones.
*/
NSS_CAPWAPMGR_FAILURE_TUNNEL_ENABLED = 100, /**< Tunnel is enabled */
NSS_CAPWAPMGR_FAILURE_TUNNEL_DISABLED, /**< Tunnel is disabled */
NSS_CAPWAPMGR_FAILURE_TUNNEL_NOT_CFG, /**< Tunnel is not configured yet */
NSS_CAPWAPMGR_FAILURE_TUNNEL_EXISTS, /**< Tunnel already exisits */
NSS_CAPWAPMGR_FAILURE_DI_ALLOC_FAILED, /**< Dynamic interface alloc failed */
NSS_CAPWAPMGR_FAILURE_CAPWAP_RULE, /**< Failed to create CAPWAP rule */
NSS_CAPWAPMGR_FAILURE_IP_RULE, /**< Failed to create IP rule */
NSS_CAPWAPMGR_FAILURE_REGISTER_NSS, /**< Failed to register with NSS */
NSS_CAPWAPMGR_FAILURE_CMD_TIMEOUT, /**< NSS Driver Command timed-out */
NSS_CAPWAPMGR_FAILURE_INVALID_REASSEMBLY_TIMEOUT,/**< Invalid reasm timeout */
NSS_CAPWAPMGR_FAILURE_INVALID_PATH_MTU, /**< Invalid path mtu */
NSS_CAPWAPMGR_FAILURE_INVALID_MAX_FRAGMENT, /**< Invalid max fragment */
NSS_CAPWAPMGR_FAILURE_INVALID_BUFFER_SIZE, /**< Invalid buffer size */
NSS_CAPWAPMGR_FAILURE_INVALID_L3_PROTO, /**< Invalid Layer3 protocol */
NSS_CAPWAPMGR_FAILURE_INVALID_UDP_PROTO, /**< Invalid UDP protocol */
NSS_CAPWAPMGR_FAILURE_INVALID_VERSION, /**< Invalid capwap version */
NSS_CAPWAPMGR_FAILURE_IP_DESTROY_RULE, /**< Destroy IP rule failed */
NSS_CAPWAPMGR_FAILURE_CAPWAP_DESTROY_RULE, /**< Destroy capwap rule failed */
NSS_CAPWAPMGR_FAILURE_INVALID_IP_NODE, /**< Invalid tunnel IP node */
NSS_CAPWAPMGR_FAILURE_INVALID_TYPE_FLAG, /**< Invalid type */
NSS_CAPWAPMGR_FAILURE_INVALID_DTLS_CFG, /**< Invalid DTLS configuration */
NSS_CAPWAPMGR_FAILURE_CONFIGURE_TRUSTSEC_TX, /**< Failed to configure trustsectx */
NSS_CAPWAPMGR_FAILURE_UNCONFIGURE_TRUSTSEC_TX, /**< Failed to unconfigure trustsectx */
NSS_CAPWAPMGR_FAILURE_CONFIGURE_DSCP_MAP, /**< Failed to configure dscp_map */
NSS_CAPWAPMGR_FAILURE_CREATE_UDF_PROFILE, /**< Failed creating user defined profile */
NSS_CAPWAPMGR_FAILURE_ACL_RULE_ALREADY_EXIST, /**< ACL rule already exist */
NSS_CAPWAPMGR_FAILURE_ADD_ACL_RULE, /**< Failed adding ACL rule */
NSS_CAPWAPMGR_FAILURE_BIND_ACL_LIST, /**< Failed binding ACL list */
NSS_CAPWAPMGR_FAILURE_ACL_UNAVAILABLE, /**< ACL rule unavailable */
NSS_CAPWAPMGR_FAILURE_MEM_UNAVAILABLE, /**< Failed to alloc memory */
NSS_CAPWAPMGR_FAILURE_DSCP_RULE_ID_INVALID, /**< DSCP rule ID invalid */
NSS_CAPWAPMGR_FAILURE_DSCP_RULE_ID_NOT_IN_USE, /**< DSCP rule not in use */
NSS_CAPWAPMGR_FAILURE_DSCP_RULE_DELETE_FAILED, /**< DSCP rule delete failed */
} nss_capwapmgr_status_t;
/**
* @brief Creates a CAPWAP netdevice
*
* @return Pointer to a newly created netdevice
*
* @note First CAPWAP interface name is capwap0 and so on
*/
extern struct net_device *nss_capwapmgr_netdev_create(void);
/**
* @brief Creates a IPv4 CAPWAP tunnel
*
* @param netdevice
* @param tunnel_id
* @param IPv4 rule structure
* @param CAPWAP rule structure
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_ipv4_tunnel_create(struct net_device *dev, uint8_t tunnel_id,
struct nss_ipv4_create *ip_rule, struct nss_capwap_rule_msg *capwap_rule,
struct nss_dtlsmgr_config *in_data);
/**
* @brief Creates a IPv6 CAPWAP tunnel
*
* @param netdevice
* @param tunnel_id
* @param IPv6 rule structure
* @param CAPWAP rule structure
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_ipv6_tunnel_create(struct net_device *dev, uint8_t tunnel_id,
struct nss_ipv6_create *ip_rule, struct nss_capwap_rule_msg *capwap_rule,
struct nss_dtlsmgr_config *in_data);
/**
* @brief Enable a CAPWAP tunnel
*
* @param netdevice
* @param tunnel_id
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_enable_tunnel(struct net_device *dev, uint8_t tunnel_id);
/**
* @brief Enable a CAPWAP tunnel
*
* @param netdevice
* @param tunnel_id
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_disable_tunnel(struct net_device *dev, uint8_t tunnel_id);
/**
* @brief Updates Path MTU of a CAPWAP tunnel
*
* @param netdevice
* @param tunnel_id
* @param New Path MTU
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_update_path_mtu(struct net_device *dev, uint8_t tunnel_id, uint32_t mtu);
/**
* @brief Updates Destination MAC Address of a CAPWAP tunnel
*
* @param netdevice
* @param tunnel_id
* @param New MAC Address
*
* @return nss_capwapmgr_status_t
*/
nss_capwapmgr_status_t nss_capwapmgr_update_dest_mac_addr(struct net_device *dev, uint8_t tunnel_id, uint8_t *mac_addr);
/**
* @brief Updates Source Interface number
*
* @param netdevice
* @param tunnel_id
* @param source interface number
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_update_src_interface(struct net_device *dev, uint8_t tunnel_id, uint32_t src_interface_num);
/**
* @brief Delete a DSCP prioritization rule that was created.
*
* @param Rule ID
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_dscp_rule_destroy(uint8_t id);
/**
* @brief Prioritize packets with certain dscp value. 0 - lowest priority, 3 - highest priority.
*
* @param DSCP value
* @param DSCP mask
* @param Priority[0-3]
* @param[out] Return rule ID
*
* @return nss_capwapmgr_status_t
*/
nss_capwapmgr_status_t nss_capwapmgr_dscp_rule_create(uint8_t dscp_value, uint8_t dscp_mask, uint8_t pri, uint8_t *id);
/**
* @brief Get the DTLS net_device associated to the CAPWAP tunnel
*
* @param netdevice
* @param tunnel_id
*
* @return Pointer to struct net_device
*
* @note This API hold the NET_DEVICE reference; after use the caller must perform
* "dev_put" to release the reference.
*/
struct net_device *nss_capwapmgr_get_dtls_netdev(struct net_device *dev, uint8_t tunnel_id);
/**
* @brief Changes version of a CAPWAP tunnel
*
* @param netdevice
* @param tunnel_id
* @param New version
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_change_version(struct net_device *dev, uint8_t tunnel_id, uint8_t ver);
/**
* @brief Configure dtls settings of a CAPWAP tunnel
*
* @param netdevice
* @param tunnel_id
* @param enable or disable
* @param dtls configuration
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_configure_dtls(struct net_device *dev, uint8_t tunnel_id,
uint8_t enable_dtls, struct nss_dtlsmgr_config *in_data);
/**
* @brief RX cipher update for a CAPWAP DTLS tunnel
*
* @param netdevice
* @param tunnel_id
* @param dtls configuration update
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_dtls_rekey_rx_cipher_update(struct net_device *dev, uint8_t tunnel_id,
struct nss_dtlsmgr_config_update *udata);
/**
* @brief TX cipher update for a CAPWAP DTLS tunnel
*
* @param netdevice
* @param tunnel_id
* @param dtls configuration update
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_dtls_rekey_tx_cipher_update(struct net_device *dev, uint8_t tunnel_id,
struct nss_dtlsmgr_config_update *udata);
/**
* @brief RX cipher switch for a CAPWAP DTLS tunnel
*
* @param netdevice
* @param tunnel_id
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_dtls_rekey_rx_cipher_switch(struct net_device *dev, uint8_t tunnel_id);
/**
* @brief TX cipher switch for a CAPWAP DTLS tunnel
*
* @param netdevice
* @param tunnel_id
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_dtls_rekey_tx_cipher_switch(struct net_device *dev, uint8_t tunnel_id);
/**
* @brief Destroy a CAPWAP tunnel
*
* @param netdevice
* @param tunnel_id
*
* @return nss_capwapmgr_status_t
*
* @note CAPWAP tunnel must be disabled before destroy operation.
*/
extern nss_capwapmgr_status_t nss_capwapmgr_tunnel_destroy(struct net_device *dev, uint8_t tunnel_id);
/**
* @brief Send a flow rule add message to NSS
*
* @param netdevice
* @param tunnel_id
* @param ip_version
* @param protocol
* @param src_ip
* @param dst_ip
* @param src_port
* @param dst_port
* @param flow_id
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_add_flow_rule(struct net_device *dev, uint8_t tunnel_id, uint16_t ip_version,
uint16_t protocol, uint32_t *src_ip, uint32_t *dst_ip,
uint16_t src_port, uint16_t dst_port, uint32_t flow_id);
/**
* @brief Send a flow rule delete message to NSS
*
* @param netdevice
* @param tunnel_id
* @param ip_version
* @param protocol
* @param src_ip
* @param dst_ip
* @param src_port
* @param dst_port
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_del_flow_rule(struct net_device *dev, uint8_t tunnel_id, uint16_t ip_version,
uint16_t protocol, uint32_t *src_ip, uint32_t *dst_ip,
uint16_t src_port, uint16_t dst_port);
/**
* @brief Destroy a netdevice
*
* @param netdevice
*
* @return nss_capwapmgr_status_t
*
* @note CAPWAP tunnel must be destroyed first.
*/
extern nss_capwapmgr_status_t nss_capwapmgr_netdev_destroy(struct net_device *netdev);
/**
* @brief Gets CAPWAP tunnel stats
*
* @param netdevice
* @param tunnel_id
* @param pointer to struct nss_capwap_tunnel_stats
*
* @return nss_capwapmgr_status_t
*/
extern nss_capwapmgr_status_t nss_capwapmgr_tunnel_stats(struct net_device *dev, uint8_t tunnel_id,
struct nss_capwap_tunnel_stats *stats);
#if defined(NSS_CAPWAPMGR_ONE_NETDEV)
/**
* @brief Returns netdevice used by NSS CAPWAP manager
*
* @param void
*
* @return Pointer to struct net_device
*/
extern struct net_device *nss_capwapmgr_get_netdev(void);
#endif /* NSS_CAPWAPMGR_ONE_NETDEV */
#endif /* __NSS_CAPWAPMGR_H */