1/*
2 **************************************************************************
3 * Copyright (c) 2013-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_tx_rx_common.h
19 *	NSS APIs common header file
20 */
21
22#ifndef __NSS_TX_RX_COMMON_H
23#define __NSS_TX_RX_COMMON_H
24
25#include "nss_core.h"
26#include <nss_hal.h>
27#include <linux/module.h>
28#include <linux/vmalloc.h>
29
30/*
31 * Global definitions
32 */
33#define NSS_HLOS_MESSAGE_VERSION 0
34
35/*
36 * Global variables/extern declarations
37 */
38extern struct nss_top_instance nss_top_main;
39
40#if (NSS_DEBUG_LEVEL > 0)
41#define NSS_VERIFY_CTX_MAGIC(x) nss_verify_ctx_magic(x)
42#define NSS_VERIFY_INIT_DONE(x) nss_verify_init_done(x)
43
44/*
45 * nss_verify_ctx_magic()
46 */
47static inline void nss_verify_ctx_magic(struct nss_ctx_instance *nss_ctx)
48{
49	nss_assert(nss_ctx->magic == NSS_CTX_MAGIC);
50}
51
52static inline void nss_verify_init_done(struct nss_ctx_instance *nss_ctx)
53{
54	nss_assert(nss_ctx->state == NSS_CORE_STATE_INITIALIZED);
55}
56
57#else
58#define NSS_VERIFY_CTX_MAGIC(x)
59#define NSS_VERIFY_INIT_DONE(x)
60#endif
61
62/*
63 * Deprecated Redirect
64 */
65
66/**
67 * @brief Request/Response types
68 */
69enum nss_tx_rx_virt_if_msg_types {
70	NSS_TX_RX_VIRT_IF_OPEN = NSS_IF_OPEN,
71	NSS_TX_RX_VIRT_IF_CLOSE = NSS_IF_CLOSE,
72	NSS_TX_RX_VIRT_IF_LINK_STATE_NOTIFY = NSS_IF_LINK_STATE_NOTIFY,
73	NSS_TX_RX_VIRT_IF_MTU_CHANGE = NSS_IF_MTU_CHANGE,
74	NSS_TX_RX_VIRT_IF_MAC_ADDR_SET = NSS_IF_MAC_ADDR_SET,
75	NSS_TX_RX_VIRT_IF_STATS_SYNC = NSS_IF_STATS,
76	NSS_TX_RX_VIRT_IF_ISHAPER_ASSIGN = NSS_IF_ISHAPER_ASSIGN,
77	NSS_TX_RX_VIRT_IF_BSHAPER_ASSIGN = NSS_IF_BSHAPER_ASSIGN,
78	NSS_TX_RX_VIRT_IF_ISHAPER_UNASSIGN = NSS_IF_ISHAPER_UNASSIGN,
79	NSS_TX_RX_VIRT_IF_BSHAPER_UNASSIGN = NSS_IF_BSHAPER_UNASSIGN,
80	NSS_TX_RX_VIRT_IF_ISHAPER_CONFIG = NSS_IF_ISHAPER_CONFIG,
81	NSS_TX_RX_VIRT_IF_BSHAPER_CONFIG = NSS_IF_BSHAPER_CONFIG,
82	NSS_TX_RX_VIRT_IF_TX_CREATE_MSG = NSS_IF_MAX_MSG_TYPES + 1,
83	NSS_TX_RX_VIRT_IF_TX_DESTROY_MSG,
84	NSS_TX_RX_VIRT_IF_STATS_SYNC_MSG,
85	NSS_TX_RX_VIRT_IF_MAX_MSG_TYPES,
86};
87
88/**
89 * virt_if error types
90 */
91enum nss_tx_rx_virt_if_error_types {
92	NSS_TX_RX_VIRT_IF_SUCCESS,			/*< Success */
93	NSS_TX_RX_VIRT_IF_CORE_FAILURE,		/*< nss core failure */
94	NSS_TX_RX_VIRT_IF_ALLOC_FAILURE,		/*< Memory allocation failure */
95	NSS_TX_RX_VIRT_IF_DYNAMIC_IF_FAILURE,	/*< Dynamic interface failure */
96	NSS_TX_RX_VIRT_IF_MSG_TX_FAILURE,		/*< Message transmission failure */
97	NSS_TX_RX_VIRT_IF_REG_FAILURE,		/*< Registration failure */
98	NSS_TX_RX_VIRT_IF_CORE_NOT_INITIALIZED,	/*< NSS core not intialized */
99};
100
101/**
102 * Structure which contains stats received from NSS.
103 */
104struct nss_tx_rx_virt_if_stats {
105	struct nss_if_stats node_stats;	/**< common stats */
106	uint32_t tx_enqueue_failed;	/**< tx enqueue failures in the FW */
107	uint32_t shaper_enqueue_failed;	/**< shaper enqueue failures in the FW */
108};
109
110/**
111 * The NSS virtual interface creation structure.
112 */
113struct nss_tx_rx_virt_if_create_msg {
114	uint32_t flags;			/**< Interface flags */
115	uint8_t mac_addr[ETH_ALEN];	/**< MAC address */
116};
117
118/**
119 * The NSS virtual interface destruction structure.
120 */
121struct nss_tx_rx_virt_if_destroy_msg {
122	int32_t reserved;		/**< place holder */
123};
124
125/**
126 * Message structure to send/receive virtual interface commands
127 */
128struct nss_tx_rx_virt_if_msg {
129	struct nss_cmn_msg cm;
130				/**< Message Header */
131	union {
132		union nss_if_msgs if_msgs;
133		struct nss_tx_rx_virt_if_create_msg if_create;
134				/**< Message: create virt if rule */
135		struct nss_tx_rx_virt_if_destroy_msg if_destroy;
136				/**< Message: destroy virt if rule */
137		struct nss_tx_rx_virt_if_stats stats;
138				/**< Message: stats */
139	} msg;
140};
141
142/*
143 * Private data structure for virt_if interface
144 */
145struct nss_tx_rx_virt_if_pvt {
146	struct semaphore sem;
147	struct completion complete;
148	int response;
149	int sem_init_done;
150};
151
152typedef void (*nss_tx_rx_virt_if_data_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi);
153typedef void (*nss_tx_rx_virt_if_msg_callback_t)(void *app_data, struct nss_cmn_msg *msg);
154
155/*
156 * Handles associated with redir interfaces(virt_if & wifi_i).
157 * TODO: Once wifi moves to using the new interfaces, this will be deprecated.
158 */
159
160struct nss_tx_rx_virt_if_handle {
161	struct nss_ctx_instance *nss_ctx;
162	int32_t if_num;
163	struct nss_tx_rx_virt_if_pvt *pvt;
164	struct nss_tx_rx_virt_if_stats stats;
165	nss_tx_rx_virt_if_msg_callback_t cb;
166	void *app_data;
167};
168
169/**
170 * @brief Get stats for redir interface from NSS driver
171 *
172 * @param if_num Interface number (provided during dynamic_interface allocation)
173 * @param i index of stats
174 * @param line buffer into which the stats will be copied.
175 *
176 * @return int32_t Returns 0 if if_num is not in range or the number of bytes copied.
177 */
178extern int32_t nss_tx_rx_virt_if_copy_stats(int32_t if_num, int i, char *line);
179
180/*
181 * CB handlers for variour interfaces
182 */
183void nss_phys_if_register_handler(uint32_t if_num);
184extern void nss_crypto_register_handler(void);
185extern void nss_ipsec_register_handler(void);
186extern void nss_ipv4_register_handler(void);
187extern void nss_ipv4_reasm_register_handler(void);
188extern void nss_ipv6_register_handler(void);
189extern void nss_ipv6_reasm_register_handler(void);
190extern void nss_n2h_register_handler(void);
191extern void nss_tunipip6_register_handler(void);
192extern void nss_pppoe_register_handler(void);
193extern void nss_freq_register_handler(void);
194extern void nss_eth_rx_register_handler(void);
195extern void nss_lag_register_handler(void);
196extern void nss_dynamic_interface_register_handler(void);
197extern void nss_gre_redir_register_handler(void);
198extern void nss_lso_rx_register_handler(void);
199extern void nss_sjack_register_handler(void);
200extern void nss_wifi_register_handler(void);
201
202/*
203 * nss_if_msg_handler()
204 *	External reference for internal base class handler for interface messages.
205 *
206 * This is not registered with nss_core.c as it is really a base class feature
207 * of the phys_if and virt_if handlers.
208 */
209extern void nss_if_msg_handler(struct nss_ctx_instance *nss_ctx, struct nss_cmn_msg *ncm,
210		__attribute__((unused))void *app_data);
211
212#endif /* __NSS_TX_RX_COMMON_H */
213