blob: 052149b0c16191135f112c34da80e379e18da98d [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Rajeev Kumar Sirasanagandla5b21a9c2018-01-08 17:05:11 +05302 * Copyright (c) 2013-2015, 2017-2018 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028#if !defined( WLAN_HDD_TX_RX_H )
29#define WLAN_HDD_TX_RX_H
30
31/**===========================================================================
Jeff Johnson7dda7772013-02-27 08:36:13 -080032
Jeff Johnson295189b2012-06-20 16:38:30 -070033 \file wlan_hdd_tx_rx.h
Jeff Johnson7dda7772013-02-27 08:36:13 -080034
Jeff Johnson295189b2012-06-20 16:38:30 -070035 \brief Linux HDD Tx/RX APIs
Jeff Johnson295189b2012-06-20 16:38:30 -070036 ==========================================================================*/
Jeff Johnson7dda7772013-02-27 08:36:13 -080037
38/*---------------------------------------------------------------------------
Jeff Johnson295189b2012-06-20 16:38:30 -070039 Include files
Jeff Johnson7dda7772013-02-27 08:36:13 -080040 -------------------------------------------------------------------------*/
Jeff Johnson295189b2012-06-20 16:38:30 -070041#include <wlan_hdd_includes.h>
42#include <vos_api.h>
43#include <linux/skbuff.h>
44#include <wlan_qct_tl.h>
45
Jeff Johnson7dda7772013-02-27 08:36:13 -080046/*---------------------------------------------------------------------------
Jeff Johnson295189b2012-06-20 16:38:30 -070047 Preprocessor definitions and constants
Jeff Johnson7dda7772013-02-27 08:36:13 -080048 -------------------------------------------------------------------------*/
Jeff Johnson295189b2012-06-20 16:38:30 -070049#define HDD_ETHERTYPE_802_1_X ( 0x888E )
50#define HDD_ETHERTYPE_802_1_X_FRAME_OFFSET ( 12 )
51#define HDD_ETHERTYPE_802_1_X_SIZE ( 2 )
52#ifdef FEATURE_WLAN_WAPI
53#define HDD_ETHERTYPE_WAI ( 0x88b4 )
54#endif
Abhishek Singhfa011222014-04-14 10:57:08 +053055#define HDD_ETHERTYPE_ARP ( 0x0806 )
56#define HDD_ETHERTYPE_ARP_SIZE 42
Jeff Johnson295189b2012-06-20 16:38:30 -070057
58#define HDD_80211_HEADER_LEN 24
59#define HDD_80211_HEADER_QOS_CTL 2
60#define HDD_LLC_HDR_LEN 6
61#define HDD_FRAME_TYPE_MASK 0x0c
62#define HDD_FRAME_SUBTYPE_MASK 0xf0
63#define HDD_FRAME_TYPE_DATA 0x08
64#define HDD_FRAME_TYPE_MGMT 0x00
65#define HDD_FRAME_SUBTYPE_QOSDATA 0x80
66#define HDD_FRAME_SUBTYPE_DEAUTH 0xC0
67#define HDD_FRAME_SUBTYPE_DISASSOC 0xA0
68#define HDD_DEST_ADDR_OFFSET 6
69
70#define HDD_MAC_HDR_SIZE 6
Kiet Lamf040f472013-11-20 21:15:23 +053071
72#define HDD_PSB_CFG_INVALID 0xFF
73#define HDD_PSB_CHANGED 0xFF
74#define SME_QOS_UAPSD_CFG_BK_CHANGED_MASK 0xF1
75#define SME_QOS_UAPSD_CFG_BE_CHANGED_MASK 0xF2
76#define SME_QOS_UAPSD_CFG_VI_CHANGED_MASK 0xF4
77#define SME_QOS_UAPSD_CFG_VO_CHANGED_MASK 0xF8
78
Srinivas Girigowda8bf64cb2015-09-30 19:50:09 +053079#define HDD_ETH_HEADER_LEN 14
80
Dino Mycled9b7cc12014-09-04 18:43:07 +053081/* WLAN_DHCP_DEBUG */
82#define RX_PATH ( 0 )
83#define TX_PATH ( 1 )
84
85#define BOOTP_SERVER_PORT ( 67 )
86#define BOOTP_CLIENT_PORT ( 68 )
87
88#define ETH_TYPE_OFFSET ( 12 )
89#define ETH_TYPE_IP_PKT ( 0x0800 )
90#define BOOTP_MSG_OFFSET ( 42 )
91#define BOOTP_REQUEST_MSG ( 1 )
92#define BOOTP_RESPONSE_MSG ( 2 )
93
94#define DHCPDISCOVER ( 1 )
95#define DHCPOFFER ( 2 )
96#define DHCPREQUEST ( 3 )
97#define DHCPACK ( 5 )
98#define DHCPNAK ( 6 )
99#define DHCPRELEASE ( 7 )
100#define DHCPINFORM ( 8 )
101
102#define SKB_MIN_LENGTH ( 35 )
103#define PROTOCOL_OFFSET ( 9 )
104#define UDP_PROTOCOL ( 17 )
105
106#define UDP_SRC_PORT_OFFSET ( 34 )
107#define UDP_DEST_PORT_OFFSET ( 36 )
108
109#define DHCP_OPTION53 ( 0x35 )
110#define DHCP_OPTION53_LENGTH ( 1 )
111#define DHCP_OPTION53_OFFSET ( 0x11A )
112#define DHCP_OPTION53_LENGTH_OFFSET ( 0x11B )
113#define DHCP_OPTION53_STATUS_OFFSET ( 0x11C )
114/* WLAN_DHCP_DEBUG */
115
Hanumantha Reddy Pothulaee001fc2015-05-26 15:21:53 +0530116#define TID3 0x60
Dino Mycled9b7cc12014-09-04 18:43:07 +0530117
118
Jeff Johnson295189b2012-06-20 16:38:30 -0700119/*---------------------------------------------------------------------------
120 Type declarations
121 -------------------------------------------------------------------------*/
122
Katya Nigam77fcf582015-02-09 16:48:24 +0530123/*---------------------------------------------------------------------------
Jeff Johnson295189b2012-06-20 16:38:30 -0700124 Function declarations and documenation
Katya Nigam77fcf582015-02-09 16:48:24 +0530125 -------------------------------------------------------------------------*/
126/**============================================================================
127 @brief hdd_ibss_hard_start_xmit() - Function registered with the Linux OS for
128 transmitting packets in IBSS mode.
129
130 @param skb : [in] pointer to OS packet (sk_buff)
131 @param dev : [in] pointer to network device
132
133 @return : NET_XMIT_DROP if packets are dropped
134 : NET_XMIT_SUCCESS if packet is enqueued succesfully
135 ===========================================================================*/
136extern int hdd_ibss_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
Jeff Johnson295189b2012-06-20 16:38:30 -0700137
138/**============================================================================
Katya Nigam77fcf582015-02-09 16:48:24 +0530139 @brief hdd_hard_start_xmit() - Function registered with the Linux OS for
Jeff Johnson295189b2012-06-20 16:38:30 -0700140 transmitting packets
141
142 @param skb : [in] pointer to OS packet (sk_buff)
143 @param dev : [in] pointer to Libra network device
144
145 @return : NET_XMIT_DROP if packets are dropped
146 : NET_XMIT_SUCCESS if packet is enqueued succesfully
147 ===========================================================================*/
148extern int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
149
Jeff Johnson295189b2012-06-20 16:38:30 -0700150extern int hdd_mon_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
Jeff Johnson295189b2012-06-20 16:38:30 -0700151/**============================================================================
152 @brief hdd_tx_timeout() - Function called by OS if there is any
153 timeout during transmission. Since HDD simply enqueues packet
154 and returns control to OS right away, this would never be invoked
155
156 @param dev : [in] pointer to Libra network device
157 @return : None
158 ===========================================================================*/
159extern void hdd_tx_timeout(struct net_device *dev);
160
161/**============================================================================
162 @brief hdd_stats() - Function registered with the Linux OS for
163 device TX/RX statistics
164
165 @param dev : [in] pointer to Libra network device
166
167 @return : pointer to net_device_stats structure
168 ===========================================================================*/
169extern struct net_device_stats* hdd_stats(struct net_device *dev);
170
171/**============================================================================
Katya Nigam1fd24402015-02-16 14:52:19 +0530172 @brief hdd_ibss_init_tx_rx() - Init function to initialize Tx/RX
173 modules in HDD
174
175 @param pAdapter : [in] pointer to adapter context
176 @return : VOS_STATUS_E_FAILURE if any errors encountered
177 : VOS_STATUS_SUCCESS otherwise
178 ===========================================================================*/
179extern void hdd_ibss_init_tx_rx( hdd_adapter_t *pAdapter );
180
181/**============================================================================
182 @brief hdd_ibss_deinit_tx_rx() - Deinit function to clean up Tx/RX
183 modules in HDD
184
185 @param pAdapter : [in] pointer to adapter context..
186 @return : VOS_STATUS_E_FAILURE if any errors encountered.
187 : VOS_STATUS_SUCCESS otherwise
188 ===========================================================================*/
189extern VOS_STATUS hdd_ibss_deinit_tx_rx( hdd_adapter_t *pAdapter );
190
191/**============================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -0700192 @brief hdd_init_tx_rx() - Init function to initialize Tx/RX
193 modules in HDD
194
195 @param pAdapter : [in] pointer to adapter context
196 @return : VOS_STATUS_E_FAILURE if any errors encountered
197 : VOS_STATUS_SUCCESS otherwise
198 ===========================================================================*/
199extern VOS_STATUS hdd_init_tx_rx( hdd_adapter_t *pAdapter );
200
201/**============================================================================
202 @brief hdd_deinit_tx_rx() - Deinit function to clean up Tx/RX
203 modules in HDD
204
205 @param pAdapter : [in] pointer to adapter context
206 @return : VOS_STATUS_E_FAILURE if any errors encountered
207 : VOS_STATUS_SUCCESS otherwise
208 ===========================================================================*/
209extern VOS_STATUS hdd_deinit_tx_rx( hdd_adapter_t *pAdapter );
210
211/**============================================================================
212 @brief hdd_disconnect_tx_rx() - Disconnect function to clean up Tx/RX
213 modules in HDD
214
215 @param pAdapter : [in] pointer to adapter context
216 @return : VOS_STATUS_E_FAILURE if any errors encountered
217 : VOS_STATUS_SUCCESS otherwise
218 ===========================================================================*/
219extern VOS_STATUS hdd_disconnect_tx_rx( hdd_adapter_t *pAdapter );
220
221/**============================================================================
222 @brief hdd_tx_complete_cbk() - Callback function invoked by TL
223 to indicate that a packet has been transmitted across the SDIO bus
224 succesfully. OS packet resources can be released after this cbk.
225
226 @param vosContext : [in] pointer to VOS context
227 @param pVosPacket : [in] pointer to VOS packet (containing skb)
228 @param vosStatusIn : [in] status of the transmission
229
230 @return : VOS_STATUS_E_FAILURE if any errors encountered
231 : VOS_STATUS_SUCCESS otherwise
232 ===========================================================================*/
233extern VOS_STATUS hdd_tx_complete_cbk( v_VOID_t *vosContext,
234 vos_pkt_t *pVosPacket,
235 VOS_STATUS vosStatusIn );
236
237/**============================================================================
Katya Nigamf944e5e2015-02-10 15:05:43 +0530238 @brief hdd_ibss_tx_fetch_packet_cbk() - Callback function invoked by TL to
239 fetch a packet for transmission.
240
241 @param vosContext : [in] pointer to VOS context
242 @param staId : [in] Station for which TL is requesting a pkt
243 @param ucAC : [in] pointer to access category requested by TL
244 @param pVosPacket : [out] pointer to VOS packet packet pointer
245 @param pPktMetaInfo : [out] pointer to meta info for the pkt
246
247 @return : VOS_STATUS_E_EMPTY if no packets to transmit
248 : VOS_STATUS_E_FAILURE if any errors encountered
249 : VOS_STATUS_SUCCESS otherwise
250 ===========================================================================*/
251extern VOS_STATUS hdd_ibss_tx_fetch_packet_cbk( v_VOID_t *vosContext,
252 v_U8_t *pStaId,
253 WLANTL_ACEnumType ucAC,
254 vos_pkt_t **ppVosPacket,
255 WLANTL_MetaInfoType *pPktMetaInfo );
256
257/**============================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -0700258 @brief hdd_tx_fetch_packet_cbk() - Callback function invoked by TL to
259 fetch a packet for transmission.
260
261 @param vosContext : [in] pointer to VOS context
262 @param staId : [in] Station for which TL is requesting a pkt
263 @param ucAC : [in] pointer to access category requested by TL
264 @param pVosPacket : [out] pointer to VOS packet packet pointer
265 @param pPktMetaInfo : [out] pointer to meta info for the pkt
266
267 @return : VOS_STATUS_E_EMPTY if no packets to transmit
268 : VOS_STATUS_E_FAILURE if any errors encountered
269 : VOS_STATUS_SUCCESS otherwise
270 ===========================================================================*/
271extern VOS_STATUS hdd_tx_fetch_packet_cbk( v_VOID_t *vosContext,
272 v_U8_t *pStaId,
273 WLANTL_ACEnumType ucAC,
274 vos_pkt_t **ppVosPacket,
275 WLANTL_MetaInfoType *pPktMetaInfo );
276
277/**============================================================================
278 @brief hdd_tx_low_resource_cbk() - Callback function invoked in the
279 case where VOS packets are not available at the time of the call to get
280 packets. This callback function is invoked by VOS when packets are
281 available.
282
283 @param pVosPacket : [in] pointer to VOS packet
284 @param userData : [in] opaque user data that was passed initially
285
286 @return : VOS_STATUS_E_FAILURE if any errors encountered,
287 : VOS_STATUS_SUCCESS otherwise
288 =============================================================================*/
289extern VOS_STATUS hdd_tx_low_resource_cbk( vos_pkt_t *pVosPacket,
290 v_VOID_t *userData );
291
Katya Nigame7b69a82015-04-28 15:24:06 +0530292extern VOS_STATUS hdd_rx_packet_monitor_cbk(v_VOID_t *vosContext,vos_pkt_t *pVosPacket, int conversion);
293
Jeff Johnson295189b2012-06-20 16:38:30 -0700294/**============================================================================
295 @brief hdd_rx_packet_cbk() - Receive callback registered with TL.
296 TL will call this to notify the HDD when a packet was received
297 for a registered STA.
298
299 @param vosContext : [in] pointer to VOS context
300 @param pVosPacket : [in] pointer to VOS packet (conatining sk_buff)
301 @param staId : [in] Station Id
302 @param pRxMetaInfo : [in] pointer to meta info for the received pkt(s)
303
304 @return : VOS_STATUS_E_FAILURE if any errors encountered,
305 : VOS_STATUS_SUCCESS otherwise
306 ===========================================================================*/
307extern VOS_STATUS hdd_rx_packet_cbk( v_VOID_t *vosContext,
308 vos_pkt_t *pVosPacket,
309 v_U8_t staId,
310 WLANTL_RxMetaInfoType* pRxMetaInfo );
311
Jeff Johnson295189b2012-06-20 16:38:30 -0700312
313/**============================================================================
314 @brief hdd_IsEAPOLPacket() - Checks the packet is EAPOL or not.
315
316 @param pVosPacket : [in] pointer to vos packet
317 @return : VOS_TRUE if the packet is EAPOL
318 : VOS_FALSE otherwise
319 ===========================================================================*/
320extern v_BOOL_t hdd_IsEAPOLPacket( vos_pkt_t *pVosPacket );
Jeff Johnson295189b2012-06-20 16:38:30 -0700321
Jeff Johnson295189b2012-06-20 16:38:30 -0700322/**============================================================================
323 @brief hdd_mon_tx_mgmt_pkt() - Transmit MGMT packet received on monitor
324 interface.
325
Jeff Johnsona8a1a482012-12-12 16:49:33 -0800326 @param pAdapter: [in] SAP/P2P GO adapter.
Jeff Johnson295189b2012-06-20 16:38:30 -0700327 ===========================================================================*/
328void hdd_mon_tx_mgmt_pkt(hdd_adapter_t* pAdapter);
329
330/**============================================================================
331 @brief hdd_mon_tx_work_queue() - workqueue handler for transmitting mgmt packets..
332
333 @param work: [in] workqueue structure.
334 ===========================================================================*/
335void hdd_mon_tx_work_queue(struct work_struct *work);
Jeff Johnson295189b2012-06-20 16:38:30 -0700336
Shailender Karmuchia734f332013-04-19 14:02:48 -0700337/**============================================================================
338 @brief hdd_Ibss_GetStaId() - Get the StationID using the Peer Mac address
339 @param pHddStaCtx : [in] pointer to HDD Station Context
340 pMacAddress [in] pointer to Peer Mac address
341 staID [out] pointer to Station Index
342 @return : VOS_STATUS_SUCCESS/VOS_STATUS_E_FAILURE
343 ===========================================================================*/
344VOS_STATUS hdd_Ibss_GetStaId(hdd_station_ctx_t *pHddStaCtx,
345 v_MACADDR_t *pMacAddress, v_U8_t *staId);
346
Sudhir Sattayappa Kohalli37620692013-08-05 14:02:26 -0700347/**============================================================================
348 @brief hdd_tx_rx_pkt_cnt_stat_timer_handler() -
349 Timer handler to check enable/disable split scan
350 @param pHddStaCtx : Hdd adapter
351 @return : VOS_STATUS_SUCCESS/VOS_STATUS_E_FAILURE
352 ===========================================================================*/
353void hdd_tx_rx_pkt_cnt_stat_timer_handler( void *pAdapter);
354
Ravi Joshif9520d62013-10-18 04:11:46 -0700355/**============================================================================
356 @brief hdd_flush_ibss_tx_queues() -
357 Flush tx queues in IBSS mode
Ravi Joshi41914632013-10-21 23:02:21 -0700358 @param pAdapter: Hdd adapter
359 @param STAId: Sta index
Ravi Joshif9520d62013-10-18 04:11:46 -0700360 @return : VOS_STATUS_SUCCESS/VOS_STATUS_E_FAILURE
361 ===========================================================================*/
362void hdd_flush_ibss_tx_queues( hdd_adapter_t *pAdapter, v_U8_t STAId);
363
Kiet Lamf040f472013-11-20 21:15:23 +0530364/**=========================================================================
365 @brief hdd_wmm_acquire_access_required()-
366 Determine whether wmm ac acquire access is required
367 @param pAdapter : pointer to Adapter context
368 @param acType : AC
369 @return : void
370 ========================================================================*/
371void hdd_wmm_acquire_access_required(hdd_adapter_t *pAdapter,
372 WLANTL_ACEnumType acType);
Dino Mycled9b7cc12014-09-04 18:43:07 +0530373
374/**=========================================================================
375 @brief hdd_dump_dhcp_pkt()- For printing DHCP logs
376 @param skb : pointer to skb
377 @param path : path direction
378 @return : void
379 ========================================================================*/
380void hdd_dump_dhcp_pkt(struct sk_buff *skb, int path);
381
Sushant Kaushika8073312015-05-04 17:33:52 +0530382#ifdef FEATURE_WLAN_DIAG_SUPPORT
383/**
384 * wlan_hdd_log_eapol() - Function to check and extract EAPOL params
385 * @skb: skb data
386 * @event_type: One of enum wifi_connectivity_events to indicate Tx/Rx
387 *
388 * This function parses the input skb data to get the EAPOL params,if the
389 * packet is EAPOL and store it in the pointer passed as input
390 *
391 * Return: None
392 *
393 */
394void wlan_hdd_log_eapol(struct sk_buff *skb,
395 uint8_t event_type);
396#else
397static inline void wlan_hdd_log_eapol(struct sk_buff *skb,
398 uint8_t event_type)
399{
400}
401#endif /* FEATURE_WLAN_DIAG_SUPPORT */
402
Sravan Kumar Kairam091e5b62017-01-23 14:14:20 +0530403/**
404 * hdd_rx_fwd_eapol() - forward cached eapol frames
405 * @vosContext : pointer to vos global context
406 * @pVosPacket: pointer to vos packet
407 *
408 * Return: None
409 *
410 */
411void hdd_rx_fwd_eapol(v_VOID_t *vosContext, vos_pkt_t *pVosPacket);
412
Rajeev Kumar Sirasanagandla5b21a9c2018-01-08 17:05:11 +0530413/*
414 * As of the 4.7 kernel, net_device->trans_start is removed. Create shims to
415 * support compiling against older versions of the kernel.
416 */
417#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0))
418static inline void netif_trans_update(struct net_device *dev)
419{
420 dev->trans_start = jiffies;
421}
422
423#define TX_TIMEOUT_TRACE(dev, module_id) VOS_TRACE( \
424 module_id, VOS_TRACE_LEVEL_ERROR, \
425 "%s: Transmission timeout occurred jiffies %lu trans_start %lu", \
426 __func__, jiffies, dev->trans_start)
427#else
428#define TX_TIMEOUT_TRACE(dev, module_id) VOS_TRACE( \
429 module_id, VOS_TRACE_LEVEL_ERROR, \
430 "%s: Transmission timeout occurred jiffies %lu", \
431 __func__, jiffies)
432#endif
433
Jeff Johnson295189b2012-06-20 16:38:30 -0700434#endif // end #if !defined( WLAN_HDD_TX_RX_H )