linux/net/mac80211/agg-rx.c
<<
>>
Prefs
   1/*
   2 * HT handling
   3 *
   4 * Copyright 2003, Jouni Malinen <jkmaline@cc.hut.fi>
   5 * Copyright 2002-2005, Instant802 Networks, Inc.
   6 * Copyright 2005-2006, Devicescape Software, Inc.
   7 * Copyright 2006-2007  Jiri Benc <jbenc@suse.cz>
   8 * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
   9 * Copyright 2007-2010, Intel Corporation
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License version 2 as
  13 * published by the Free Software Foundation.
  14 */
  15
  16/**
  17 * DOC: RX A-MPDU aggregation
  18 *
  19 * Aggregation on the RX side requires only implementing the
  20 * @ampdu_action callback that is invoked to start/stop any
  21 * block-ack sessions for RX aggregation.
  22 *
  23 * When RX aggregation is started by the peer, the driver is
  24 * notified via @ampdu_action function, with the
  25 * %IEEE80211_AMPDU_RX_START action, and may reject the request
  26 * in which case a negative response is sent to the peer, if it
  27 * accepts it a positive response is sent.
  28 *
  29 * While the session is active, the device/driver are required
  30 * to de-aggregate frames and pass them up one by one to mac80211,
  31 * which will handle the reorder buffer.
  32 *
  33 * When the aggregation session is stopped again by the peer or
  34 * ourselves, the driver's @ampdu_action function will be called
  35 * with the action %IEEE80211_AMPDU_RX_STOP. In this case, the
  36 * call must not fail.
  37 */
  38
  39#include <linux/ieee80211.h>
  40#include <linux/slab.h>
  41#include <linux/export.h>
  42#include <net/mac80211.h>
  43#include "ieee80211_i.h"
  44#include "driver-ops.h"
  45
  46static void ieee80211_free_tid_rx(struct rcu_head *h)
  47{
  48        struct tid_ampdu_rx *tid_rx =
  49                container_of(h, struct tid_ampdu_rx, rcu_head);
  50        int i;
  51
  52        del_timer_sync(&tid_rx->reorder_timer);
  53
  54        for (i = 0; i < tid_rx->buf_size; i++)
  55                dev_kfree_skb(tid_rx->reorder_buf[i]);
  56        kfree(tid_rx->reorder_buf);
  57        kfree(tid_rx->reorder_time);
  58        kfree(tid_rx);
  59}
  60
  61void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
  62                                     u16 initiator, u16 reason, bool tx)
  63{
  64        struct ieee80211_local *local = sta->local;
  65        struct tid_ampdu_rx *tid_rx;
  66
  67        lockdep_assert_held(&sta->ampdu_mlme.mtx);
  68
  69        tid_rx = rcu_dereference_protected(sta->ampdu_mlme.tid_rx[tid],
  70                                        lockdep_is_held(&sta->ampdu_mlme.mtx));
  71
  72        if (!tid_rx)
  73                return;
  74
  75        RCU_INIT_POINTER(sta->ampdu_mlme.tid_rx[tid], NULL);
  76
  77        ht_dbg(sta->sdata,
  78               "Rx BA session stop requested for %pM tid %u %s reason: %d\n",
  79               sta->sta.addr, tid,
  80               initiator == WLAN_BACK_RECIPIENT ? "recipient" : "inititator",
  81               (int)reason);
  82
  83        if (drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_STOP,
  84                             &sta->sta, tid, NULL, 0))
  85                sdata_info(sta->sdata,
  86                           "HW problem - can not stop rx aggregation for tid %d\n",
  87                           tid);
  88
  89        /* check if this is a self generated aggregation halt */
  90        if (initiator == WLAN_BACK_RECIPIENT && tx)
  91                ieee80211_send_delba(sta->sdata, sta->sta.addr,
  92                                     tid, WLAN_BACK_RECIPIENT, reason);
  93
  94        del_timer_sync(&tid_rx->session_timer);
  95
  96        call_rcu(&tid_rx->rcu_head, ieee80211_free_tid_rx);
  97}
  98
  99void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
 100                                    u16 initiator, u16 reason, bool tx)
 101{
 102        mutex_lock(&sta->ampdu_mlme.mtx);
 103        ___ieee80211_stop_rx_ba_session(sta, tid, initiator, reason, tx);
 104        mutex_unlock(&sta->ampdu_mlme.mtx);
 105}
 106
 107void ieee80211_stop_rx_ba_session(struct ieee80211_vif *vif, u16 ba_rx_bitmap,
 108                                  const u8 *addr)
 109{
 110        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
 111        struct sta_info *sta;
 112        int i;
 113
 114        rcu_read_lock();
 115        sta = sta_info_get_bss(sdata, addr);
 116        if (!sta) {
 117                rcu_read_unlock();
 118                return;
 119        }
 120
 121        for (i = 0; i < STA_TID_NUM; i++)
 122                if (ba_rx_bitmap & BIT(i))
 123                        set_bit(i, sta->ampdu_mlme.tid_rx_stop_requested);
 124
 125        ieee80211_queue_work(&sta->local->hw, &sta->ampdu_mlme.work);
 126        rcu_read_unlock();
 127}
 128EXPORT_SYMBOL(ieee80211_stop_rx_ba_session);
 129
 130/*
 131 * After accepting the AddBA Request we activated a timer,
 132 * resetting it after each frame that arrives from the originator.
 133 */
 134static void sta_rx_agg_session_timer_expired(unsigned long data)
 135{
 136        /* not an elegant detour, but there is no choice as the timer passes
 137         * only one argument, and various sta_info are needed here, so init
 1egant detour, buef="net/mac80211/agg-rx.c#L23" id="net/mac80211/agg-rx.c#L23" id="net/mac806oweer,ref">sdatc127te g211/ax.c#)
  35, struct <"L134" class="line" name="L134"> 134statde <rcu_read_unlock()="sref">addr)
iniptiatorieee8021="sref">addr)
 129
rcu_read_unlock()="sref">addr)
p" class="sref">iniptiatoriniptiator 129
sta;
="+code=h" class="sref">h, struct , sta;
 108    de "1set_bit(set_bit(initiclasto_" c cla[0ass="line" name="L56">  56      1de "1ieee80211_local *f="+code=tid_rx" class="sref">tid_rx;
  66
ia)
i,   66
 107voidref="net/1mac80211/agg-rx.c#L48" i1d="L414_dbg( 115      struct 1tihref="net/mac80211/agg-rx.c#L66" id="L66" clas"sref">rcu_dereference_protectedtid, .tid_rx[tid], iniptiator  56      1de <c)
 117      int i15code=u16" class="srefad_unlock();
 127}
i19" class="line" name="L119"> 119      del_timass="line" name="L128"> 128  54      1  for (15ref">rcu_read_lock();
i, rcu_dereferrcu_head" class="sref">rcu_head, rcu_dereferTU_TO_JIFFIESad" class="srefTU_TO_JIFFIESa href="+code=tid_am" u_head" class="sref">rcu_head, i,  127}
_bitmap & i,  117        k15">"HW problem - f="+code=tid_ammodet/mac80211/agg-rx.c#modet/mac>session_timer);
i,  127}
k15" class="sref">rcu_read_unlock();
 118      k15agg-rx.c#L119" id="L119" class="line" name="L119"> 119    ref="net/1mac80211/agg-rx.c#L60" i1d="L615 id="L120" class="line" name="L120"> 120
rcu_read_unlock();
 118    a href="+1code=___ieee80211_stop_r1x_ba_16class="line" name="L72">  72      1         1                      mutex_lock(&sta->sdata,
"x;s reasonL137" s="srefn>
ieee8021=p" class="sref">ba_rx_bi)f="net/mac80211/p" class="sref">iniptiator 118    af="net/m1mac80211/agg-rx.c#L64" i1d="L616class="line" name="L54">  54      1  struct 1rcu_read_lock();
i, iniptiatorampdu_mlme.tid_rx_stop_requested(unsigned long uestedtor 118    af="net/m1ieee80211_queue_work(&sta->local->hw, &sta->ampdu_mlme.work);
 126    ef="net/m1ac80211/agg-rx.c#L67" id1="L671 classass="line" name="L120"> 120
 120
sta_rx_agg_sessL53" id="L53"ired(unsigned long ">data)
 135{
160" class="line" name="L110"> 110             1                        1 rcu_read_unlock()="sref">addr)
iniptiatorieee8021="sref">addr)
 129
rcu_read_unlock()="sref">addr)
p" class="sref">iniptiatoriniptiator 129
sta;
="+code=h" class="sref">h, struct , sta;
 108             1 return;
initiclasto_" c cla[0ass="line" name="L56">  56      1ef="net/m1ac80211/agg-rx.c#L75" id1="L751 class="line" name="L75">  75      1  RCU_INIT_POINTER href="net/mac80211/agg-rx.c#L115" id="L115" class="line" name="L115"> 115    ef="net/m1ac80211/agg-rx.c#L77" id1="L7717"sref">rcu_read_unlock()lass="srefreleasecL53" id="L53ou="sref">i, sdata,
,ef="net/mac80211/p" class="sref">iniptiator 115    elass="commment"> * DOC: RX A-MPDU ald" 1t_dbg( 118             1&qu1ot;Rx1BA sesass="line" name="L120"> 120
 130ieee80211_free_tid_rx-addref"esde=BIT" class="stid_rx-addref"esd18" c"sref">ieee80211_sub_if_data *sdata = vif_to"+code=ba_rx_bitma"sref">addr)
tid,
 100             1(int)reason.c#L74" id="L74rcu_read_lock();
addr)
tid,
tid,
inipolicy" class="line" name="L100"> 100      if (!tid, ba_rx_bitmap,
i++)
tid,
i,  100             1href="+code=drv_ampdu_ac1tion"18 class="line" name="L64">  64      1         1              &ieee80211_local *local = sta->vif_to  65      1         1 tid_ampdu_rx *h  65      1 f="net/m1            "HW pr>ieee80211_local *i, i,   65      1 lass="com            tid,
  65      1         1ac80211/agg-rx.c#L89" id1="L891 class="line" name="L89">  89      1  /* check 1if th18d_rx = talL65=tid_rx" class="sref">talL65=tid18" c" hrofdf="net/mac80211/mgm="sref">i, rcu_derefer" class="sref">hw, &sta->ef="net/mac80211extra_txass="roomss="sref">sta 115      if (initiator 100             1 i19" class="line" name="L119"> 119             1                        83      1ef="net/m1ac80211/agg-rx.c#L94" id1="L9419_session" class="sref">___ie/a>f"eservss="sref">i+/a>f"eservsa href="+code=sdata" id_rx" class="sre/a>->"+code=ba_rx_bitm" class="sref">hw, &sta->ef="net/mac80211extra_txass="roomss="sref">sta 115             1="+code=del_timer_sync" 1class1"sref">del_timer_sync(&ammgm="sref">i, ieee80211_local *i, ___ie/a>fpu="sref">i, fpu=a href="+code=sdata" id_rx" class="sre/a>->"+24lass="line" name="L115"> 115             1ac80211/agg-rx.c#L96" id1="L9619="sref">RCU_INIT_POINTERmemse="sref">i, i,  115     f="net/m1="+code=call_rcu" class=1"sref1>call_rcu(&inimemcpya href="+code=sdata"mgm="sref">i,  115     lass="commac80211/agg-rx.c#L98" i1d="L919_dbg(inimemcpya href="+code=sdata"mgm="sref">i, vif_totid,
 115             1ac80211/agg-rx.c#L99" id1="L99198ef">initiatorvif_toi+typs=  115      sta->vif_toi+typs=  115   2         2                      vif_toi+typs= ->rx.c#L135" id="NL="srefIFTYPE_MESHa>->->lss="line" name="L100"> 100   2 href="ne2/mac80211/agg-rx.c#L102"2id="L20delba" class="sref">ieee80211_send_dmemcpylass="sref">inimemcpya href="+code=sdata"mgm="sref">i, vif_totid,
 115   2    mutex_lockvif_toi+typs=  100   2 3  inimemcpya href="+code=sdata"mgm="sref">i, vif_totid,
 115   2 4  mutex_unlelseorvif_toi+typs=  100   2 5  sdata_info(inimemcpya href="+code=sdata"mgm="sref">i, vif_totid,
 115   2 6   107voi2 (i, tx)
, r"s->href="+code=local"cpusto_le"sref">tid,
 107voi2 8a href=2+c80211/agg-rx.c#L99" id2 u8 *( 115   2 9a href=2+ode=__ieee80211_stop_rx2id="L20" class="line" name="L130"> 130rcu_read_unlock()/a>fpu="sref">i, fpu=a href="+code=sdata" id_rx" class="sre/a>->"+1 + " hrofdref="+code=sta"mgm="sref">i, tid,
tid,
  71
rcu_read_unlock()mgm="sref">i, tid,
inicategory->href="+code=local"ss="sCATEGORYsref"lass="sref">iniss="sCATEGORYsref"=   65      2    int <2 href="+code=i" class="s2ef">i21">mutex_lock(&i, tid,
tid,
  65      2 3  ___iefgm="sref">i, tid,
tid,
  65      2 4    75      2    sta2/a> = ieee8021=p" class="sref">ba_rx_bi)="sref">ieee8021policylass="sref">inipolicy" clTID_NID_NU1);href="there is no choice as thbit+1 a-rx.c#L90" policy"L134" class="line" name="L134"> 134sta2    if (!2a href="+code=sta" class2"sref21call_rcu(&ieee8021=p" class="sref">ba_rx_bi)="sref">ieee8021g-rx.c#L100" id="L100" clTID_NID_NU2);href=f="there is no choice as thbit+5:2#)
 134sta2 ieee8021=p" class="sref">ba_rx_bi)="sref">ieee8021fi" class="sref">i++)
 134sta2 8a href=2  return;
  89      2    }
i, tid,
tid,
tid,
  71
rcu_read_unlock()fgm="sref">i, tid,
tid,
i, rcu_derefercpusto_le"sref">tid,
i,  127}
<2    for (2a href="+code=i" class="2ref">221sref">rcu_read_unlock()mgm="sref">i, tid,
tid,
rcu_derefercpusto_le"sref">tid,
 127}
<2    int <2  if (  83      2         2          ___ielass="sreftx=tid_rx" class="srelass="sreftx=tida href="+code=sdata"llass="sref">sta-> 127}
<2 4   120
  96      2    ieee80211_free_tid_rxprocess-addref"e80211_rx" class="srelass="srefprocess-addref"e80211a hre>ieee80211_local *local = sta-> 100   2 href="ne2/mac80211/agg-rx.c#L128"2id="L22 class="sref">tid);
 *sta, u16  100   2 8a href=2=EXPORT_SYMBOL" class="s2ef">E22f="+code=u8" class="sref">u8 *>ieee80211_local *i, i,  100   2    }
sta->i, sta 100   2n class="2omment">/*
  64      2n class="2omment"> * After accepti2g the23"sref">sta_info *tid_rx;
ti"+cLdf_tos="line" name="L65">  65      2n class="2omment"> * resetting it 2fter 23">mutex_lock(&tid,
initiator, i, inisa_policyclasf="+code=tx" classi" class="sref">i++)
u16   65      2n        2omment"> */
___iea"sref">addr)
  65      2n4  mutex_unlnet/mac80211/agg-rxre="sref">i,   65      2n     96      2    /* not a2 eleg2nt detour, but there is no choice as thextraa> s reasonpaef="ter/agg-rxaddre "e80211href="nL134" class="line" name="L134"> 134sta2n class="2omment">         * only 2ne ar23_dbg(i, tid,
tid,
  65      2n8a href=2net/mac80211/agg-rx.c#L22" id=23ass="sref">tihref="net/mac8021clou="sref">i, rcu_dereferle"ssto_cpulocal" class="sle"ssto_cpua href="+code=sdata"mgm="sref">i, tid,
tid,
i,  127}
<2de <u16  127}
<2de <i, tid,
tid,
u16  127}
<2de <  72      2d class="2 href="include/net/mac802211.h24">mutex_lock(&i, tid,
tid,
 127}
<2de "2___iesa_policylass="sref">inisa_policyclashre="sref">ieee8021capad_rx" class="srecapad= iniagg-rx.c#LADDBA_PARAM_POLICY_MAS"ef=")  hre hre 1ass="line" name="L127"> 127}
<2d4  ieee8021g-rx.c#L100" id="L100" clTre="sref">ieee8021capad_rx" class="srecapad= iniagg-rx.c#LADDBA_PARAM_)
 127}
<2d   i++)
ieee8021capad_rx" class="srecapad= iniagg-rx.c#LADDBA_PARAM_BUF_SIZEaMAS"ef=")  hre hre 6ass="line" name="L127"> 127}
<2d    107voi2ref="net/2mac80211/agg-rx.c#L48" i2d="L424_dbg(rcu_dereferss="sSTATUS_REQUEST_DECLINEDsdata" class="sss="sSTATUS_REQUEST_DECLINEDf_tos="line" name="L65">  65      2  struct 2  89      2de <c)
ieee8021g211_/a>,flas="sref">stag211_/a>,flasa href="+code=sdata"lassref">u16 rcu_dereferss="sSTA_BLOCK_BAsdata" class="sss="sSTA_BLOCK_BAef=")slass="line" name="L117"> 117   2  int i25code=u16" class="srefad_unlock() class="sref">sta->sdata,
"Suspendeer,progr re - DenynatoADDBA "e80211" id="L87" claslass="line" name="L127"> 127}
<2ef="net/m2ac80211/agg-rx.c#L52" id2="L5225delba" class="sref">igotofad_unlock()/a>-noet/mac80211/agg-rx.c/a>-noet/maf_tos="line" name="L65">  65      2  del_timass="line" name="L128"> 128  54      2  for (25ref">rcu_read_there is no choice as thsanity checkhref=inchonatopaef="ter/:34" class="line" name="L134"> 134sta2ef="net/m2  134sta2e   k25">&que, the device/driver ar="net/mac8cndeef 57"cer " hr doeshe tiexceeds max valu"nL134" class="line" name="L134"> 134sta2eef="net/2="+code=kfree" class="sr2ef">k25" class="sref_there is no choice as thXXX:8checkhown hs 134sta2e struct 2="+code=kfree" class="sr2ef">k258ef">initiator & inisa_policyclash!= 1)href="ref="ss="line" name="L134"> 134sta2ee <sta->sdata,
sdata,
f="+code=tid" cl-&gcode=BIT" class="s-&gcod18" f="+code=tid" clcap_rx" class="srecap=  115   2ef="net/m2ac80211/agg-rx.c#L61" id2="L6126code=u16" class="="sref">ieee8021fi" class="sref">i++)
 117   2a href="+2code=___ieee80211_stop_r2x_ba_26delba" class="sref">ieee80211_send_dlassu=sdata" class="srefsu=f_to"sref">rcu_dereferss="sSTATUS_INVAL
  65      2         2                      sdata,
  65      2 f="net/m2mac80211/agg-rx.c#L64" i2d="L626" class="sref">set_bit(set_bit< ""net/mac8 with badopaef=/agg-rx.c#L8pMn>
  65      2  for (rcu_read">set_bit(set_bit< ="+code=sdata"mgm="sref">i, initiator, inisa_policyclasf="+code=tx" classi" class="sref">i++)
 127}
<2af="net/m2iiiiiiiiigotofad_unlock()/a>-noet/mac80211/agg-rx.c/a>-noet/maf_tos="line" name="L65">  65      2ef="net/m2ac80211/agg-rx.c#L67" id2="L6726t detour, butass="line" name="L128"> 128 134sta2e  120
i, 2ode=lass="sref">tid_rx;
tid_rx;
"line" name="L13">  65      2n4   127}
<2af="net/m22129
2129
 120
ieee8021fi" class=ata" id_rx" class="sre/a>->"+code=ba_rx_bitm" class="sref">hw, &2108             1 returnsref">tid_rx;
"line" name="L13">  65    ata" id_rx" class="sre/a>->"+code=ba_rx_bitm" class="sref">hw, &  52 2    1ef="net/m1ac80211/agg-rx.c#L75" id2="L751 cl2ss="line" name="L75">  72 2    1  /* not a2 a 26" s="sef="ch26"  no choice as thd"teronar default 57"cer " ioet/maf_tlass="line" name="L115">2115    ef="net/m1ac80211/agg-rxmutexass="sref">iiiiiiiiimutexass="s_r#Lsta->ampdu_mlme.tid_rxi++)niptiator2lass="line" name="L115">21152118tid, .tid_rx[2120tid_rxsdata,
2130set_biunexpec r rt(""net/m2100             1(int)rcu_read">set_bit(set_bit< ="+code=sdata"mgm="sref">i, i++)ipolicy" 2lass="line" name="L100">21002100&qref,traaquot no choice as thd"teronar default 57"cer " ion"18 cl2ss="line" name="L64">  62 28   2  for (,flas="sref">stag211_/a>,flasa href="+code=sdsta" csdata" class="sref;  62 28}
<2af="net/m2rcu_erss="sSTATUUNSPECIFIEL
rcu_dereferss="sSTATUUNSPECIFIEL
  62 2    1 f="net/m2rcu_fals>tid, ref;de=tx" classi" class="sref">i++)iiptiator2as="line" name="L65">  62 2    1 lass="co2ac80211/agg-rx.c#L67" id2="L6726t recapad= 2as="line" name="L65">  62 2    1         1ac80211/agg-rx.c#L89" id2="L891 cl2ss="line" name="L89">  82 2    1  2115tid_rx;
  65    km="+cosref">tid_rx * After accepti2g the23"sref">sta_info *sta_infoi++)"sre/a>-&2tlss="line" name="L100">2100             1href="+code=initiatx" class="sref">tid_rx;
i19" 2lass="line" name="L119">2119iiiiiiiiigot"+co(cne=ba_rx_bitmETH_0s="sre1(cne=ba_ href19cl2ss="line" name="L83">  82 292115             1="+code=del_tispinass="_in802111_loca16ref">pinass="_in80s_r#Ltid_rx;
(i++)""L751 cl2lass="line" name="L115">21152115/* not arx8" clas choice as thbit+15:6 max " hr of a-rx.c#L9=iptiator2lass="line" name="L115">2115     lass="commac80211/agg-rx" class="sref">tid_rx;
session_timer);
tid  65    x_agg_sessLon_timer)red" class="sref">sta_rx_agg_sessLon_timer)red" cla"+co(cne=ba_rx_bitmETH_0s="sre1(cne=ba_ ecapad= 2lass="line" name="L115">2115tid_rx;
session_timer);
addr)
sta->2115)rdeferrabl>tid, )rdeferrabl>s_r#Ltid_rx;
session_timer);
i++3_VLAN= 3115->-&3tlss="line" name="L100">31003115tid_rx;
sessi3" id="L" cla;
tid  65    x_agg_sessL91 class_expired" class="sref">sta_rx_agg_sessL53" id="L53"ired(unsie=tx" classi" class="sref">i++3_3ALENtor3ls="line" name="L83">  83100tid_rx;
sessi3" id="L" cla;
addr)
sta->3115)tid, )s_r#Ltid_rx;
sessi3" id="L" cla;
i++3_5ALENtor3lass="line" name="L115">31003115/* not apreparer3" id="therref_the choice as thbit+15:6 max " hr of a-rx.c#L3H7ALENtor3lass="line" name="L115">3107voi2 tid_rx;
sessi3" id="Lref3107voi2 8a href=2+c802113">  65    kc="+cosref">tid_rxtid_rx;
"line" name=, f="+cod2omment"> * After acce_in1fo" c18ass="sref">tid_ampdu_rx<)sta_infoi++3ACTIONtor3lass="line" name="L115">3115tid_rx;
sessi3" id="L" cl3130tid_rxtid_rx;
"line" name=, f="+codned long sta_infoi++3f"esd18" 3ss="line" name="L71">  73
31             1href="+code=initiatx" class="sref">tid_rx;
sessi3" id="Lreftid_rx;
sessi3" id="L" cl  63 31   2         2                      kfrelss="sref">sessikfrele8021sref">tid_rxtid_rx;
sessi3" id="Lrefi++3f3ALENtor3as="line" name="L65">  63 31             1 returnsref">tid_rxsessikfrele8021sref">tid_rxtid_rx;
sessi3" id="L" cli++3f_ALENtor3os="line" name="L65">  63 31   2  for (sessikfrele8021sref">tid_rxtid_rx;
i++3f5ALENtor3ss="line" name="L75">  73 31}
<2af="net/m2iiiiiiiiigot"+co(cne=ba_rx_bitmETH_0s="sre1(cne=ba3cy"L134" 3lass="line" name="L134">313431343134mutex_unlnef="+code=tid_rerv *tidtid_rxlocal =   65    x_a211/a class_r#Lelimief=a href="+code=sdata" class="sref">sdata,
ieee8021capad_rx" class=ETH_0RX="sSRto_le"sa href="+code=sdata=ETH_0RX="sSRt
  83 31   2    }
sta->stag211_/a>,flasa href="+code=sdsta" csdata" class="sref;i++)
i++3ecapad= <3ss="line" name="L71">  73
3a hr2href="net2mac80211/agg-rsr2ef">i25code=u16" class="srefad_unlock() class="sref">sta->sdata,
""net/d cess="s8pMn>
mutex_uBe=tx" classi" class="sref">i++3e"esd18" 3lass="line" name="L127">3127mutex_uBUFsdata" class="sagg-rx.c#LMAX_AMPD3refsu=f_t3lass="line" name="L127">3127sessikfrele8021sref">tid_rxtid_rx;
sessi3" id="Lrefi++3x_bit22cl3ss="line" name="L83">  83 32             1 returnsref">tid_rxsessikfrele8021sref">tid_rxtid_rx;
sessi3" id="L" cli++3sre/a>-&g3lass="line" name="L127">3127sessikfrele8021sref">tid_rxtid_rx;
i++3="L125" c3aass="line" name="L120">3120iiiiiiiiigot"+co(cne=ba_rx_bitmETH_0s="sre1(cne=ba3work"22cl3ss="line" name="L96">  93 32   2ef="net/m2ac80211/agg-rx.c#L67" id2="L6726t3/a>-><3 ass="line" name="L100">3100 3100   2 8a href=2class="comment">/* not aupd"sef/a>,e choice as thbit+15:6 max " hr of a-rx.c#L3, 3100tid_rx;
3100tid_rx;
  65    x_a="sref">i++)
  63 3    2n class="2mac80211/agg-rx" class="sref">tid_rx;
i++)
i<="ne"L13">  65    x_a="sref">i++)
  63 3    2n class="2omment"> * resx" class="sref">tid_rx;
;
"line" name="L13">  65    >;
"line" name=al"fialogstoke=local" class="srial3s_bit22cl3os="line" name="L65">  63 3    2n        2omment"> */tid_rx;
tihref="net/mac8021clogg-rx.c#L22" id=23ass="sref">tihral"fialogstoke=local" class="srial3sre/a>-&g3os="line" name="L65">  63 33             1="+code=del_tix" class="sref">tid_rx;
i++)
i  63 33}
<2d   ieee80211_send_dlassu=sdata" clSUCCESQsref">rcu_dereferss="sSTATUSUCCESQtihral"fialogstoke=local" class="srial3sork"22cl3ss="line" name="L96">  93 33}
<2d   3134rcu_RXe choice as thbit+15:6 max " hr of a-rx.c#L3gstoke=f_3os="line" name="L65">  63 3    2n8a href=2net/mac80211/arcu_ne"ign_pointlass="sref">sessi3cu_ne"ign_pointlasrefad_unlock() class="sref">sta->tid, .tid_rx[tid_rx;
i++3iclou=cla3lass="line" name="L127">31273127}
<2de <3127sessi2odL" clas_r#Ltid_rx;
session_timer);
sessiTU_TO_EXP_TIMEe8021sref">tid_rxi++3ort.h24cl3ss="line" name="L72">  73 34   2         2                      x" class="sref">tid_rx;
ts="sref">tid_rxts="f">ieee80211_send_dlasjiffiaba_26delba" clasjiffiabtihral"fialogstoke=local" class="srial3ecapad= <3lass="line" name="L127">3127}
<2de "2ac80211/agg-rx.c#L67" id2="L6726t3  hre hre31ass="line" name="L127">31273127}
<2dde=tid_ampdu2_rx" sref">iiiiiiiiigot"+co:f="net/m1ac80211/agg-rx.c#L75" id3 ork"22cl36ass="line" name="L127">3127iiiiiiiiimutexaunss="s_r#Lsta->ampdu_mlme.tid_rxi++3ee_ti24" 3lass="line" name="L107">3107  63 3    2 de=tid_ampdu2_rx" 26lass="sref">iiiiiiiiigotofad_unlock<:f="net/m1ac80211/agg-rx.c#L75" id3 clou=cla3ss="line" name="L89">  83 34}
<2de <tid,
() class="sref">sta->sdata,
sta->stag211_/a>,fla/a>, sessie=ta,flasa href="+code=sdsta" csdata" class="sref;3117   2  int u16 inisa_policyclasf="+code=tx" classi" cleqe=BIT" class="saddref"eq18" f="+code=tid" cl" clou="sref">i, <3"L87" cla3lass="line" name="L127">3127}
<2e2ac80211/agg-rx.c#L67" id2="L6726t3noet/maf_3os="line" name="L65">  63 3    2 
The original LXR softwarerbyr,refc80211/aghttp://sourcercuge.g-rxprojects/lxas>LXR dep_uef">"+codethis experi_assal veretourbyrc80211/agmailto:lxa@ameux.no/afxa@ameux.no,fla/
fxa.ameux.no kindly hos r rbyrc80211/aghttp://www.redpill-amepro.no/aRedpill Lmepro AQ