1/* 2 ************************************************************************** 3 * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all copies. 7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 10 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 12 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 13 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 ************************************************************************** 15 */ 16 17 /* 18 * nss_capwapmgr.h 19 * CAPWAP manager for NSS 20 */ 21#ifndef __NSS_CAPWAPMGR_H 22#define __NSS_CAPWAPMGR_H 23 24/* 25 * Maximum number of tunnels currently supported 26 */ 27#define NSS_CAPWAPMGR_MAX_TUNNELS 32 28 29#define NSS_CAPWAPMGR_TUNNEL_STATE_CONFIGURED 0x1 30 /**< Bit is set if tunnel has been configured */ 31#define NSS_CAPWAPMGR_TUNNEL_STATE_ENABLED 0x2 32 /**< Bit is set if tunnel has been enabled */ 33 34/* 35 * All CAPWAP messages to NSS FW are sync in nature. It means we have 36 * to wait for ACK/NACK from NSS FW before proceeding further. 37 * Keep a NSS FW response table to wakeup sync message caller. 38 */ 39struct nss_capwapmgr_response { 40 atomic_t seq; 41 struct semaphore sem; 42 wait_queue_head_t wq; 43 enum nss_cmn_response response; 44 nss_capwap_msg_response_t error; 45}; 46 47/** 48 * Mapping table from tunnel-id to if_num and rule. 49 */ 50struct nss_capwapmgr_tunnel { 51 uint32_t if_num; /**< Interface number of NSS */ 52 uint32_t tunnel_state; /**< Tunnel state */ 53 union { 54 struct nss_ipv4_create v4; /**< IPv4 rule structure */ 55 struct nss_ipv6_create v6; /**< IPv6 rule struture */ 56 } ip_rule; 57 struct nss_capwap_rule_msg capwap_rule; /**< Copy of CAPWAP rule */ 58}; 59 60struct nss_capwapmgr_priv { 61 struct nss_ctx_instance *nss_ctx; /**< Pointer to NSS context */ 62 struct nss_capwapmgr_tunnel *tunnel; /**< Pointer to tunnel data */ 63 uint8_t *if_num_to_tunnel_id; /**< Mapping table from if_num to tunnel_id. */ 64 struct nss_capwapmgr_response *resp; /**< Response housekeeping */ 65}; 66 67/* 68 * CAPWAP status enums 69 */ 70typedef enum { 71 /* 72 * nss_tx_status_t enums 73 */ 74 NSS_CAPWAPMGR_SUCCESS = NSS_TX_SUCCESS, 75 NSS_CAPWAPMGR_FAILURE = NSS_TX_FAILURE, 76 NSS_CAPWAPMGR_FAILURE_QUEUE = NSS_TX_FAILURE_QUEUE, 77 NSS_CAPWAPMGR_FAILURE_NOT_READY = NSS_TX_FAILURE_NOT_READY, 78 NSS_CAPWAPMGR_FAILURE_TOO_LARGE = NSS_TX_FAILURE_TOO_LARGE, 79 NSS_CAPWAPMGR_FAILURE_TOO_SHORT = NSS_TX_FAILURE_TOO_SHORT, 80 NSS_CAPWAPMGR_FAILURE_NOT_SUPPORTED = NSS_TX_FAILURE_NOT_SUPPORTED, 81 NSS_CAPWAPMGR_FAILURE_BAD_PARAM = NSS_TX_FAILURE_BAD_PARAM, 82 83 /* 84 * CAPWAP specific ones. 85 */ 86 NSS_CAPWAPMGR_FAILURE_TUNNEL_ENABLED = 100, /**< Tunnel is enabled */ 87 NSS_CAPWAPMGR_FAILURE_TUNNEL_DISABLED, /**< Tunnel is disabled */ 88 NSS_CAPWAPMGR_FAILURE_TUNNEL_NOT_CFG, /**< Tunnel is not configured yet */ 89 NSS_CAPWAPMGR_FAILURE_TUNNEL_EXISTS, /**< Tunnel already exisits */ 90 NSS_CAPWAPMGR_FAILURE_DI_ALLOC_FAILED, /**< Dynamic interface alloc failed */ 91 NSS_CAPWAPMGR_FAILURE_CAPWAP_RULE, /**< Failed to create CAPWAP rule */ 92 NSS_CAPWAPMGR_FAILURE_IP_RULE, /**< Failed to create IP rule */ 93 NSS_CAPWAPMGR_FAILURE_REGISTER_NSS, /**< Failed to register with NSS */ 94 NSS_CAPWAPMGR_FAILURE_CMD_TIMEOUT, /**< NSS Driver Command timed-out */ 95 NSS_CAPWAPMGR_FAILURE_INVALID_REASSEMBLY_TIMEOUT, 96 NSS_CAPWAPMGR_FAILURE_INVALID_PATH_MTU, 97 NSS_CAPWAPMGR_FAILURE_INVALID_MAX_FRAGMENT, 98 NSS_CAPWAPMGR_FAILURE_INVALID_BUFFER_SIZE, 99 NSS_CAPWAPMGR_FAILURE_INVALID_L3_PROTO, 100 NSS_CAPWAPMGR_FAILURE_INVALID_UDP_PROTO, 101 NSS_CAPWAPMGR_FAILURE_INVALID_VERSION, 102 NSS_CAPWAPMGR_FAILURE_IP_DESTROY_RULE, 103 NSS_CAPWAPMGR_FAILURE_CAPWAP_DESTROY_RULE, 104} nss_capwapmgr_status_t; 105 106/** 107 * @brief Creates a CAPWAP netdevice 108 * 109 * @return Pointer to a newly created netdevice 110 * 111 * @note First CAPWAP interface name is capwap0 and so on 112 */ 113extern struct net_device *nss_capwapmgr_netdev_create(void); 114 115/** 116 * @brief Creates a IPv4 CAPWAP tunnel 117 * 118 * @param netdevice 119 * @param tunnel_id 120 * @param IPv4 rule structure 121 * @param CAPWAP rule structure 122 * 123 * @return nss_capwapmgr_status_t 124 */ 125extern nss_capwapmgr_status_t nss_capwapmgr_ipv4_tunnel_create(struct net_device *dev, uint8_t tunnel_id, 126 struct nss_ipv4_create *ip_rule, struct nss_capwap_rule_msg *capwap_rule); 127 128/** 129 * @brief Creates a IPv6 CAPWAP tunnel 130 * 131 * @param netdevice 132 * @param tunnel_id 133 * @param IPv6 rule structure 134 * @param CAPWAP rule structure 135 * 136 * @return nss_capwapmgr_status_t 137 */ 138extern nss_capwapmgr_status_t nss_capwapmgr_ipv6_tunnel_create(struct net_device *dev, uint8_t tunnel_id, 139 struct nss_ipv6_create *ip_rule, struct nss_capwap_rule_msg *capwap_rule); 140 141/** 142 * @brief Enable a CAPWAP tunnel 143 * 144 * @param netdevice 145 * @param tunnel_id 146 * 147 * @return nss_capwapmgr_status_t 148 */ 149extern nss_capwapmgr_status_t nss_capwapmgr_enable_tunnel(struct net_device *dev, uint8_t tunnel_id); 150 151/** 152 * @brief Enable a CAPWAP tunnel 153 * 154 * @param netdevice 155 * @param tunnel_id 156 * 157 * @return nss_capwapmgr_status_t 158 */ 159extern nss_capwapmgr_status_t nss_capwapmgr_disable_tunnel(struct net_device *dev, uint8_t tunnel_id); 160 161/** 162 * @brief Updates Path MTU of a CAPWAP tunnel 163 * 164 * @param netdevice 165 * @param tunnel_id 166 * @param New Path MTU 167 * 168 * @return nss_capwapmgr_status_t 169 */ 170extern nss_capwapmgr_status_t nss_capwapmgr_update_path_mtu(struct net_device *dev, uint8_t tunnel_id, uint32_t mtu); 171 172/** 173 * @brief Changes version of a CAPWAP tunnel 174 * 175 * @param netdevice 176 * @param tunnel_id 177 * @param New version 178 * 179 * @return nss_capwapmgr_status_t 180 */ 181extern nss_capwapmgr_status_t nss_capwapmgr_change_version(struct net_device *dev, uint8_t tunnel_id, uint8_t ver); 182 183/** 184 * @brief Destroy a CAPWAP tunnel 185 * 186 * @param netdevice 187 * @param tunnel_id 188 * 189 * @return nss_capwapmgr_status_t 190 * 191 * @note CAPWAP tunnel must be disabled before destroy operation. 192 */ 193extern nss_capwapmgr_status_t nss_capwapmgr_tunnel_destroy(struct net_device *dev, uint8_t tunnel_id); 194 195/** 196 * @brief Destroy a netdevice 197 * 198 * @param netdevice 199 * 200 * @return nss_capwapmgr_status_t 201 * 202 * @note CAPWAP tunnel must be destroyed first. 203 */ 204extern nss_capwapmgr_status_t nss_capwapmgr_netdev_destroy(struct net_device *netdev); 205 206/** 207 * @brief Gets CAPWAP tunnel stats 208 * 209 * @param netdevice 210 * @param tunnel_id 211 * @param pointer to struct nss_capwap_tunnel_stats 212 * 213 * @return nss_capwapmgr_status_t 214 */ 215extern nss_capwapmgr_status_t nss_capwapmgr_tunnel_stats(struct net_device *dev, 216 uint8_t tunnel_id, struct nss_capwap_tunnel_stats *stats); 217 218#if defined(NSS_CAPWAPMGR_ONE_NETDEV) 219/** 220 * @brief Returns netdevice used by NSS CAPWAP manager 221 * 222 * @param void 223 * 224 * @return Pointer to struct net_device 225 */ 226extern struct net_device *nss_capwapmgr_get_netdev(void); 227#endif /* NSS_CAPWAPMGR_ONE_NETDEV */ 228#endif /* __NSS_CAPWAPMGR_H */ 229