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