/* * * Copyright (c) 2004-2010 Atheros Communications Inc. * All rights reserved. * * // // 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_RX_INTERNAL_H__ #define __AGGR_RX_INTERNAL_H__ #include "a_osapi.h" #include "aggr_recv_api.h" #define AGGR_WIN_IDX(x, y) ((x) % (y)) #define AGGR_INCR_IDX(x, y) AGGR_WIN_IDX(((x)+1), (y)) #define AGGR_DCRM_IDX(x, y) AGGR_WIN_IDX(((x)-1), (y)) #define IEEE80211_MAX_SEQ_NO 0xFFF #define IEEE80211_NEXT_SEQ_NO(x) (((x) + 1) & IEEE80211_MAX_SEQ_NO) #define NUM_OF_TIDS 8 #define AGGR_SZ_DEFAULT 8 #define AGGR_WIN_SZ_MIN 2 #define AGGR_WIN_SZ_MAX 8 /* TID Window sz is double of what is negotiated. Derive TID_WINDOW_SZ from win_sz, per tid */ #define TID_WINDOW_SZ(_x) ((_x) << 1) #define AGGR_NUM_OF_FREE_NETBUFS 16 #define AGGR_GET_RXTID_STATS(_p, _x) (&(_p->stat[(_x)])) #define AGGR_GET_RXTID(_p, _x) (&(_p->RxTid[(_x)])) /* Hold q is a function of win_sz, which is negotiated per tid */ #define HOLD_Q_SZ(_x) (TID_WINDOW_SZ((_x))*sizeof(OSBUF_HOLD_Q)) /* AGGR_RX_TIMEOUT value is important as a (too) small value can cause frames to be * delivered out of order and a (too) large value can cause undesirable latency in * certain situations. */ #define AGGR_RX_TIMEOUT 400 /* Timeout(in ms) for delivery of frames, if they are stuck */ typedef enum { ALL_SEQNO = 0, CONTIGUOUS_SEQNO = 1, }DELIVERY_ORDER; typedef struct { void *osbuf; A_BOOL is_amsdu; A_UINT16 seq_no; }OSBUF_HOLD_Q; #if 0 typedef struct { A_UINT16 seqno_st; A_UINT16 seqno_end; }WINDOW_SNAPSHOT; #endif typedef struct { A_BOOL aggr; /* is it ON or OFF */ A_BOOL progress; /* TRUE when frames have arrived after a timer start */ A_BOOL timerMon; /* TRUE if the timer started for the sake of this TID */ A_UINT16 win_sz; /* negotiated window size */ A_UINT16 seq_next; /* Next seq no, in current window */ A_UINT32 hold_q_sz; /* Num of frames that can be held in hold q */ OSBUF_HOLD_Q *hold_q; /* Hold q for re-order */ #if 0 WINDOW_SNAPSHOT old_win; /* Sliding window snapshot - for timeout */ #endif A_NETBUF_QUEUE_T q; /* q head for enqueuing frames for dispatch */ A_MUTEX_T lock; }RXTID; typedef struct { A_UINT32 num_into_aggr; /* hitting at the input of this module */ A_UINT32 num_dups; /* duplicate */ A_UINT32 num_oow; /* out of window */ A_UINT32 num_mpdu; /* single payload 802.3/802.11 frame */ A_UINT32 num_amsdu; /* AMSDU */ A_UINT32 num_delivered; /* frames delivered to IP stack */ A_UINT32 num_timeouts; /* num of timeouts, during which frames delivered */ A_UINT32 num_hole; /* frame not present, when window moved over */ A_UINT32 num_bar; /* num of resets of seq_num, via BAR */ }RXTID_STATS; typedef struct { A_UINT8 aggr_sz; /* config value of aggregation size */ A_UINT8 timerScheduled; A_TIMER timer; /* timer for returning held up pkts in re-order que */ void *dev; /* dev handle */ RX_CALLBACK rx_fn; /* callback function to return frames; to upper layer */ RXTID RxTid[NUM_OF_TIDS]; /* Per tid window */ ALLOC_NETBUFS netbuf_allocator; /* OS netbuf alloc fn */ A_NETBUF_QUEUE_T freeQ; /* pre-allocated buffers - for A_MSDU slicing */ RXTID_STATS stat[NUM_OF_TIDS]; /* Tid based statistics */ PACKET_LOG pkt_log; /* Log info of the packets */ }AGGR_INFO; #endif /* __AGGR_RX_INTERNAL_H__ */