169 lines
4.9 KiB
C
169 lines
4.9 KiB
C
|
/*
|
||
|
*
|
||
|
// ISC License (ISC)
|
||
|
//
|
||
|
// Copyright (c) 2004-2010, The Linux Foundation
|
||
|
// All rights reserved.
|
||
|
// Software was previously licensed under ISC license by Qualcomm Atheros, Inc.
|
||
|
*
|
||
|
*
|
||
|
//
|
||
|
// 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.
|
||
|
//
|
||
|
//
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef __AGGR_RECV_API_H__
|
||
|
#define __AGGR_RECV_API_H__
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
typedef void (* RX_CALLBACK)(void * dev, void *osbuf);
|
||
|
|
||
|
typedef void (* ALLOC_NETBUFS)(A_NETBUF_QUEUE_T *q, A_UINT16 num);
|
||
|
|
||
|
/*
|
||
|
* aggr_init:
|
||
|
* Initialises the data structures, allocates data queues and
|
||
|
* os buffers. Netbuf allocator is the input param, used by the
|
||
|
* aggr module for allocation of NETBUFs from driver context.
|
||
|
* These NETBUFs are used for AMSDU processing.
|
||
|
*
|
||
|
* Also registers OS call back function to deliver the
|
||
|
* frames to OS. This is generally the topmost layer of
|
||
|
* the driver context, after which the frames go to
|
||
|
* IP stack via the call back function.
|
||
|
* This dispatcher is active only when aggregation is ON.
|
||
|
* Returns A_OK if init success, else returns A_ERROR
|
||
|
*/
|
||
|
A_UINT8
|
||
|
aggr_init(ALLOC_NETBUFS netbuf_allocator, RX_CALLBACK fn);
|
||
|
|
||
|
/*
|
||
|
* aggr_init_conn:
|
||
|
* Initialises the data structures, allocates data queues and
|
||
|
* os buffers. Returns the context for a single conn aggr.
|
||
|
* For each supported conn, this API should be called.
|
||
|
*/
|
||
|
void *
|
||
|
aggr_init_conn(void);
|
||
|
|
||
|
/*
|
||
|
* aggr_process_bar:
|
||
|
* When target receives BAR, it communicates to host driver
|
||
|
* for modifying window parameters. Target indicates this via the
|
||
|
* event: WMI_ADDBA_REQ_EVENTID. Host will dequeue all frames
|
||
|
* up to the indicated sequence number.
|
||
|
*/
|
||
|
void
|
||
|
aggr_process_bar(void *cntxt, A_UINT8 tid, A_UINT16 seq_no);
|
||
|
|
||
|
|
||
|
/*
|
||
|
* aggr_recv_addba_req_evt:
|
||
|
* This event is to initiate/modify the receive side window.
|
||
|
* Target will send WMI_ADDBA_REQ_EVENTID event to host - to setup
|
||
|
* recv re-ordering queues. Target will negotiate ADDBA with peer,
|
||
|
* and indicate via this event after succesfully completing the
|
||
|
* negotiation. This happens in two situations:
|
||
|
* 1. Initial setup of aggregation
|
||
|
* 2. Renegotiation of current recv window.
|
||
|
* Window size for re-ordering is limited by target buffer
|
||
|
* space, which is reflected in win_sz.
|
||
|
* (Re)Start the periodic timer to deliver long standing frames,
|
||
|
* in hold_q to OS.
|
||
|
*/
|
||
|
void
|
||
|
aggr_recv_addba_req_evt(void * cntxt, A_UINT8 tid, A_UINT16 seq_no, A_UINT8 win_sz);
|
||
|
|
||
|
|
||
|
/*
|
||
|
* aggr_recv_delba_req_evt:
|
||
|
* Target indicates deletion of a BA window for a tid via the
|
||
|
* WMI_DELBA_EVENTID. Host would deliver all the frames in the
|
||
|
* hold_q, reset tid config and disable the periodic timer, if
|
||
|
* aggr is not enabled on any tid.
|
||
|
*/
|
||
|
void
|
||
|
aggr_recv_delba_req_evt(void * cntxt, A_UINT8 tid);
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* aggr_process_recv_frm:
|
||
|
* Called only for data frames. When aggr is ON for a tid, the buffer
|
||
|
* is always consumed, and osbuf would be NULL. For a non-aggr case,
|
||
|
* osbuf is not modified.
|
||
|
* AMSDU frames are consumed and are later freed. They are sliced and
|
||
|
* diced to individual frames and dispatched to stack.
|
||
|
* After consuming a osbuf(when aggr is ON), a previously registered
|
||
|
* callback may be called to deliver frames in order.
|
||
|
*/
|
||
|
void
|
||
|
aggr_process_recv_frm(void *cntxt, A_UINT8 tid, A_UINT16 seq_no, A_BOOL is_amsdu, void **osbuf);
|
||
|
|
||
|
|
||
|
/*
|
||
|
* aggr_module_destroy:
|
||
|
* Frees up all the queues and frames in them.
|
||
|
*/
|
||
|
void
|
||
|
aggr_module_destroy(void);
|
||
|
|
||
|
/*
|
||
|
* * aggr_module_destroy_timers:
|
||
|
* * Disarm the timers.
|
||
|
* */
|
||
|
void
|
||
|
aggr_module_destroy_timers(void *cntxt);
|
||
|
|
||
|
/*
|
||
|
* aggr_module_destroy_conn:
|
||
|
* Frees up all the queues and frames in them. Releases the cntxt to OS.
|
||
|
*/
|
||
|
void
|
||
|
aggr_module_destroy_conn(void *cntxt);
|
||
|
|
||
|
/*
|
||
|
* Dumps the aggregation stats
|
||
|
*/
|
||
|
void
|
||
|
aggr_dump_stats(void *cntxt, PACKET_LOG **log_buf);
|
||
|
|
||
|
/*
|
||
|
* aggr_reset_state -- Called when it is deemed necessary to clear the aggregate
|
||
|
* hold Q state. Examples include when a Connect event or disconnect event is
|
||
|
* received.
|
||
|
*/
|
||
|
void
|
||
|
aggr_reset_state(void *cntxt, void *dev);
|
||
|
|
||
|
|
||
|
/*
|
||
|
* aggr_reset_state -- Called when it is deemed necessary to clear the aggregate
|
||
|
* hold Q state. Examples include when a Connect event or disconnect event is
|
||
|
* received.
|
||
|
*/
|
||
|
void
|
||
|
aggr_delba_request (void *cntxt, void *wmicntxt, A_UINT16 aid, A_UINT8 reasonCode);
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /*__AGGR_RECV_API_H__ */
|