rtw_recv.c 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. ******************************************************************************/
  15. #define _RTW_RECV_C_
  16. #include <osdep_service.h>
  17. #include <drv_types.h>
  18. #include <recv_osdep.h>
  19. #include <mlme_osdep.h>
  20. #include <linux/ip.h>
  21. #include <linux/if_ether.h>
  22. #include <usb_ops.h>
  23. #include <linux/ieee80211.h>
  24. #include <wifi.h>
  25. #include <rtl8723a_recv.h>
  26. #include <rtl8723a_xmit.h>
  27. void rtw_signal_stat_timer_hdl23a(unsigned long data);
  28. void _rtw_init_sta_recv_priv23a(struct sta_recv_priv *psta_recvpriv)
  29. {
  30. spin_lock_init(&psta_recvpriv->lock);
  31. /* for (i = 0; i<MAX_RX_NUMBLKS; i++) */
  32. /* _rtw_init_queue23a(&psta_recvpriv->blk_strms[i]); */
  33. _rtw_init_queue23a(&psta_recvpriv->defrag_q);
  34. }
  35. int _rtw_init_recv_priv23a(struct recv_priv *precvpriv,
  36. struct rtw_adapter *padapter)
  37. {
  38. struct recv_frame *precvframe;
  39. int i;
  40. int res = _SUCCESS;
  41. spin_lock_init(&precvpriv->lock);
  42. _rtw_init_queue23a(&precvpriv->free_recv_queue);
  43. _rtw_init_queue23a(&precvpriv->recv_pending_queue);
  44. _rtw_init_queue23a(&precvpriv->uc_swdec_pending_queue);
  45. precvpriv->adapter = padapter;
  46. for (i = 0; i < NR_RECVFRAME ; i++) {
  47. precvframe = kzalloc(sizeof(struct recv_frame), GFP_KERNEL);
  48. if (!precvframe)
  49. break;
  50. INIT_LIST_HEAD(&precvframe->list);
  51. list_add_tail(&precvframe->list,
  52. &precvpriv->free_recv_queue.queue);
  53. precvframe->adapter = padapter;
  54. precvframe++;
  55. }
  56. precvpriv->free_recvframe_cnt = i;
  57. precvpriv->rx_pending_cnt = 1;
  58. res = rtl8723au_init_recv_priv(padapter);
  59. setup_timer(&precvpriv->signal_stat_timer, rtw_signal_stat_timer_hdl23a,
  60. (unsigned long)padapter);
  61. precvpriv->signal_stat_sampling_interval = 1000; /* ms */
  62. rtw_set_signal_stat_timer(precvpriv);
  63. return res;
  64. }
  65. void _rtw_free_recv_priv23a (struct recv_priv *precvpriv)
  66. {
  67. struct rtw_adapter *padapter = precvpriv->adapter;
  68. struct recv_frame *precvframe;
  69. struct list_head *plist, *ptmp;
  70. rtw_free_uc_swdec_pending_queue23a(padapter);
  71. list_for_each_safe(plist, ptmp, &precvpriv->free_recv_queue.queue) {
  72. precvframe = container_of(plist, struct recv_frame, list);
  73. list_del_init(&precvframe->list);
  74. kfree(precvframe);
  75. }
  76. rtl8723au_free_recv_priv(padapter);
  77. }
  78. struct recv_frame *rtw_alloc_recvframe23a(struct rtw_queue *pfree_recv_queue)
  79. {
  80. struct recv_frame *pframe;
  81. struct list_head *plist, *phead;
  82. struct rtw_adapter *padapter;
  83. struct recv_priv *precvpriv;
  84. spin_lock_bh(&pfree_recv_queue->lock);
  85. if (list_empty(&pfree_recv_queue->queue))
  86. pframe = NULL;
  87. else {
  88. phead = get_list_head(pfree_recv_queue);
  89. plist = phead->next;
  90. pframe = container_of(plist, struct recv_frame, list);
  91. list_del_init(&pframe->list);
  92. padapter = pframe->adapter;
  93. if (padapter) {
  94. precvpriv = &padapter->recvpriv;
  95. if (pfree_recv_queue == &precvpriv->free_recv_queue)
  96. precvpriv->free_recvframe_cnt--;
  97. }
  98. }
  99. spin_unlock_bh(&pfree_recv_queue->lock);
  100. return pframe;
  101. }
  102. int rtw_free_recvframe23a(struct recv_frame *precvframe)
  103. {
  104. struct rtw_adapter *padapter = precvframe->adapter;
  105. struct recv_priv *precvpriv = &padapter->recvpriv;
  106. struct rtw_queue *pfree_recv_queue;
  107. if (precvframe->pkt) {
  108. dev_kfree_skb_any(precvframe->pkt);/* free skb by driver */
  109. precvframe->pkt = NULL;
  110. }
  111. pfree_recv_queue = &precvpriv->free_recv_queue;
  112. spin_lock_bh(&pfree_recv_queue->lock);
  113. list_del_init(&precvframe->list);
  114. list_add_tail(&precvframe->list, get_list_head(pfree_recv_queue));
  115. if (padapter) {
  116. if (pfree_recv_queue == &precvpriv->free_recv_queue)
  117. precvpriv->free_recvframe_cnt++;
  118. }
  119. spin_unlock_bh(&pfree_recv_queue->lock);
  120. return _SUCCESS;
  121. }
  122. int rtw_enqueue_recvframe23a(struct recv_frame *precvframe, struct rtw_queue *queue)
  123. {
  124. struct rtw_adapter *padapter = precvframe->adapter;
  125. struct recv_priv *precvpriv = &padapter->recvpriv;
  126. spin_lock_bh(&queue->lock);
  127. list_del_init(&precvframe->list);
  128. list_add_tail(&precvframe->list, get_list_head(queue));
  129. if (padapter) {
  130. if (queue == &precvpriv->free_recv_queue)
  131. precvpriv->free_recvframe_cnt++;
  132. }
  133. spin_unlock_bh(&queue->lock);
  134. return _SUCCESS;
  135. }
  136. /*
  137. caller : defrag ; recvframe_chk_defrag23a in recv_thread (passive)
  138. pframequeue: defrag_queue : will be accessed in recv_thread (passive)
  139. using spinlock to protect
  140. */
  141. static void rtw_free_recvframe23a_queue(struct rtw_queue *pframequeue)
  142. {
  143. struct recv_frame *hdr;
  144. struct list_head *plist, *phead, *ptmp;
  145. spin_lock(&pframequeue->lock);
  146. phead = get_list_head(pframequeue);
  147. plist = phead->next;
  148. list_for_each_safe(plist, ptmp, phead) {
  149. hdr = container_of(plist, struct recv_frame, list);
  150. rtw_free_recvframe23a(hdr);
  151. }
  152. spin_unlock(&pframequeue->lock);
  153. }
  154. u32 rtw_free_uc_swdec_pending_queue23a(struct rtw_adapter *adapter)
  155. {
  156. u32 cnt = 0;
  157. struct recv_frame *pending_frame;
  158. while ((pending_frame = rtw_alloc_recvframe23a(&adapter->recvpriv.uc_swdec_pending_queue))) {
  159. rtw_free_recvframe23a(pending_frame);
  160. DBG_8723A("%s: dequeue uc_swdec_pending_queue\n", __func__);
  161. cnt++;
  162. }
  163. return cnt;
  164. }
  165. int rtw_enqueue_recvbuf23a_to_head(struct recv_buf *precvbuf, struct rtw_queue *queue)
  166. {
  167. spin_lock_bh(&queue->lock);
  168. list_del_init(&precvbuf->list);
  169. list_add(&precvbuf->list, get_list_head(queue));
  170. spin_unlock_bh(&queue->lock);
  171. return _SUCCESS;
  172. }
  173. int rtw_enqueue_recvbuf23a(struct recv_buf *precvbuf, struct rtw_queue *queue)
  174. {
  175. unsigned long irqL;
  176. spin_lock_irqsave(&queue->lock, irqL);
  177. list_del_init(&precvbuf->list);
  178. list_add_tail(&precvbuf->list, get_list_head(queue));
  179. spin_unlock_irqrestore(&queue->lock, irqL);
  180. return _SUCCESS;
  181. }
  182. struct recv_buf *rtw_dequeue_recvbuf23a (struct rtw_queue *queue)
  183. {
  184. unsigned long irqL;
  185. struct recv_buf *precvbuf;
  186. struct list_head *plist, *phead;
  187. spin_lock_irqsave(&queue->lock, irqL);
  188. if (list_empty(&queue->queue)) {
  189. precvbuf = NULL;
  190. } else {
  191. phead = get_list_head(queue);
  192. plist = phead->next;
  193. precvbuf = container_of(plist, struct recv_buf, list);
  194. list_del_init(&precvbuf->list);
  195. }
  196. spin_unlock_irqrestore(&queue->lock, irqL);
  197. return precvbuf;
  198. }
  199. int recvframe_chkmic(struct rtw_adapter *adapter,
  200. struct recv_frame *precvframe);
  201. int recvframe_chkmic(struct rtw_adapter *adapter,
  202. struct recv_frame *precvframe) {
  203. int i, res = _SUCCESS;
  204. u32 datalen;
  205. u8 miccode[8];
  206. u8 bmic_err = false, brpt_micerror = true;
  207. u8 *pframe, *payload, *pframemic;
  208. u8 *mickey;
  209. /* u8 *iv, rxdata_key_idx = 0; */
  210. struct sta_info *stainfo;
  211. struct rx_pkt_attrib *prxattrib = &precvframe->attrib;
  212. struct security_priv *psecuritypriv = &adapter->securitypriv;
  213. struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  214. struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
  215. stainfo = rtw_get_stainfo23a(&adapter->stapriv, &prxattrib->ta[0]);
  216. if (prxattrib->encrypt == WLAN_CIPHER_SUITE_TKIP) {
  217. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  218. "recvframe_chkmic:prxattrib->encrypt == WLAN_CIPHER_SUITE_TKIP\n");
  219. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  220. "recvframe_chkmic:da = %pM\n", prxattrib->ra);
  221. /* calculate mic code */
  222. if (stainfo != NULL) {
  223. if (is_multicast_ether_addr(prxattrib->ra)) {
  224. mickey = &psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0];
  225. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  226. "recvframe_chkmic: bcmc key\n");
  227. if (!psecuritypriv->binstallGrpkey) {
  228. res = _FAIL;
  229. RT_TRACE(_module_rtl871x_recv_c_,
  230. _drv_err_,
  231. "recvframe_chkmic:didn't install group key!\n");
  232. DBG_8723A("\n recvframe_chkmic:didn't "
  233. "install group key!!!!!!\n");
  234. goto exit;
  235. }
  236. } else {
  237. mickey = &stainfo->dot11tkiprxmickey.skey[0];
  238. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  239. "recvframe_chkmic: unicast key\n");
  240. }
  241. /* icv_len included the mic code */
  242. datalen = precvframe->pkt->len-prxattrib->
  243. hdrlen-prxattrib->iv_len-prxattrib->icv_len - 8;
  244. pframe = precvframe->pkt->data;
  245. payload = pframe + prxattrib->hdrlen +
  246. prxattrib->iv_len;
  247. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  248. "prxattrib->iv_len =%d prxattrib->icv_len =%d\n",
  249. prxattrib->iv_len, prxattrib->icv_len);
  250. /* care the length of the data */
  251. rtw_seccalctkipmic23a(mickey, pframe, payload,
  252. datalen, &miccode[0],
  253. (unsigned char)prxattrib->priority);
  254. pframemic = payload + datalen;
  255. bmic_err = false;
  256. for (i = 0; i < 8; i++) {
  257. if (miccode[i] != *(pframemic + i)) {
  258. RT_TRACE(_module_rtl871x_recv_c_,
  259. _drv_err_,
  260. "recvframe_chkmic:miccode[%d](%02x) != *(pframemic+%d)(%02x)\n",
  261. i, miccode[i],
  262. i, *(pframemic + i));
  263. bmic_err = true;
  264. }
  265. }
  266. if (bmic_err == true) {
  267. int i;
  268. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  269. "*(pframemic-8)-*(pframemic-1) =0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
  270. *(pframemic - 8), *(pframemic - 7),
  271. *(pframemic - 6), *(pframemic - 5),
  272. *(pframemic - 4), *(pframemic - 3),
  273. *(pframemic - 2), *(pframemic - 1));
  274. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  275. "*(pframemic-16)-*(pframemic-9) =0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
  276. *(pframemic - 16), *(pframemic - 15),
  277. *(pframemic - 14), *(pframemic - 13),
  278. *(pframemic - 12), *(pframemic - 11),
  279. *(pframemic - 10), *(pframemic - 9));
  280. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  281. "====== demp packet (len =%d) ======\n",
  282. precvframe->pkt->len);
  283. for (i = 0; i < precvframe->pkt->len; i = i + 8) {
  284. RT_TRACE(_module_rtl871x_recv_c_,
  285. _drv_err_,
  286. "0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
  287. *(precvframe->pkt->data+i),
  288. *(precvframe->pkt->data+i+1),
  289. *(precvframe->pkt->data+i+2),
  290. *(precvframe->pkt->data+i+3),
  291. *(precvframe->pkt->data+i+4),
  292. *(precvframe->pkt->data+i+5),
  293. *(precvframe->pkt->data+i+6),
  294. *(precvframe->pkt->data+i+7));
  295. }
  296. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  297. "====== demp packet end [len =%d]======\n",
  298. precvframe->pkt->len);
  299. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  300. "hrdlen =%d\n", prxattrib->hdrlen);
  301. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  302. "ra = %pM psecuritypriv->binstallGrpkey =%d\n",
  303. prxattrib->ra,
  304. psecuritypriv->binstallGrpkey);
  305. /* double check key_index for some timing
  306. issue, cannot compare with
  307. psecuritypriv->dot118021XGrpKeyid also
  308. cause timing issue */
  309. if ((is_multicast_ether_addr(prxattrib->ra)) &&
  310. (prxattrib->key_index !=
  311. pmlmeinfo->key_index))
  312. brpt_micerror = false;
  313. if ((prxattrib->bdecrypted == true) &&
  314. (brpt_micerror == true)) {
  315. rtw_handle_tkip_mic_err23a(adapter, (u8)is_multicast_ether_addr(prxattrib->ra));
  316. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  317. "mic error :prxattrib->bdecrypted =%d\n",
  318. prxattrib->bdecrypted);
  319. DBG_8723A(" mic error :prxattrib->"
  320. "bdecrypted =%d\n",
  321. prxattrib->bdecrypted);
  322. } else {
  323. RT_TRACE(_module_rtl871x_recv_c_,
  324. _drv_err_,
  325. "mic error :prxattrib->bdecrypted =%d\n",
  326. prxattrib->bdecrypted);
  327. DBG_8723A(" mic error :prxattrib->"
  328. "bdecrypted =%d\n",
  329. prxattrib->bdecrypted);
  330. }
  331. res = _FAIL;
  332. } else {
  333. /* mic checked ok */
  334. if (!psecuritypriv->bcheck_grpkey &&
  335. is_multicast_ether_addr(prxattrib->ra)) {
  336. psecuritypriv->bcheck_grpkey = 1;
  337. RT_TRACE(_module_rtl871x_recv_c_,
  338. _drv_err_,
  339. "psecuritypriv->bcheck_grpkey = true\n");
  340. }
  341. }
  342. } else {
  343. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  344. "recvframe_chkmic: rtw_get_stainfo23a ==NULL!!!\n");
  345. }
  346. skb_trim(precvframe->pkt, precvframe->pkt->len - 8);
  347. }
  348. exit:
  349. return res;
  350. }
  351. /* decrypt and set the ivlen, icvlen of the recv_frame */
  352. struct recv_frame *decryptor(struct rtw_adapter *padapter,
  353. struct recv_frame *precv_frame);
  354. struct recv_frame *decryptor(struct rtw_adapter *padapter,
  355. struct recv_frame *precv_frame)
  356. {
  357. struct rx_pkt_attrib *prxattrib = &precv_frame->attrib;
  358. struct security_priv *psecuritypriv = &padapter->securitypriv;
  359. struct recv_frame *return_packet = precv_frame;
  360. int res = _SUCCESS;
  361. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  362. "prxstat->decrypted =%x prxattrib->encrypt = 0x%03x\n",
  363. prxattrib->bdecrypted, prxattrib->encrypt);
  364. if (prxattrib->encrypt > 0) {
  365. u8 *iv = precv_frame->pkt->data + prxattrib->hdrlen;
  366. prxattrib->key_index = (((iv[3]) >> 6) & 0x3);
  367. if (prxattrib->key_index > WEP_KEYS) {
  368. DBG_8723A("prxattrib->key_index(%d) > WEP_KEYS\n",
  369. prxattrib->key_index);
  370. switch (prxattrib->encrypt) {
  371. case WLAN_CIPHER_SUITE_WEP40:
  372. case WLAN_CIPHER_SUITE_WEP104:
  373. prxattrib->key_index =
  374. psecuritypriv->dot11PrivacyKeyIndex;
  375. break;
  376. case WLAN_CIPHER_SUITE_TKIP:
  377. case WLAN_CIPHER_SUITE_CCMP:
  378. default:
  379. prxattrib->key_index =
  380. psecuritypriv->dot118021XGrpKeyid;
  381. break;
  382. }
  383. }
  384. }
  385. if ((prxattrib->encrypt > 0) && ((prxattrib->bdecrypted == 0))) {
  386. psecuritypriv->hw_decrypted = 0;
  387. switch (prxattrib->encrypt) {
  388. case WLAN_CIPHER_SUITE_WEP40:
  389. case WLAN_CIPHER_SUITE_WEP104:
  390. rtw_wep_decrypt23a(padapter, precv_frame);
  391. break;
  392. case WLAN_CIPHER_SUITE_TKIP:
  393. res = rtw_tkip_decrypt23a(padapter, precv_frame);
  394. break;
  395. case WLAN_CIPHER_SUITE_CCMP:
  396. res = rtw_aes_decrypt23a(padapter, precv_frame);
  397. break;
  398. default:
  399. break;
  400. }
  401. } else if (prxattrib->bdecrypted == 1 && prxattrib->encrypt > 0 &&
  402. (psecuritypriv->busetkipkey == 1 ||
  403. prxattrib->encrypt != WLAN_CIPHER_SUITE_TKIP)) {
  404. psecuritypriv->hw_decrypted = 1;
  405. }
  406. if (res == _FAIL) {
  407. rtw_free_recvframe23a(return_packet);
  408. return_packet = NULL;
  409. }
  410. return return_packet;
  411. }
  412. /* set the security information in the recv_frame */
  413. static struct recv_frame *portctrl(struct rtw_adapter *adapter,
  414. struct recv_frame *precv_frame)
  415. {
  416. u8 *psta_addr, *ptr;
  417. uint auth_alg;
  418. struct recv_frame *pfhdr;
  419. struct sta_info *psta;
  420. struct sta_priv *pstapriv ;
  421. struct recv_frame *prtnframe;
  422. u16 ether_type;
  423. u16 eapol_type = ETH_P_PAE;/* for Funia BD's WPA issue */
  424. struct rx_pkt_attrib *pattrib;
  425. pstapriv = &adapter->stapriv;
  426. auth_alg = adapter->securitypriv.dot11AuthAlgrthm;
  427. pfhdr = precv_frame;
  428. pattrib = &pfhdr->attrib;
  429. psta_addr = pattrib->ta;
  430. psta = rtw_get_stainfo23a(pstapriv, psta_addr);
  431. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  432. "########portctrl:adapter->securitypriv.dot11AuthAlgrthm =%d\n",
  433. adapter->securitypriv.dot11AuthAlgrthm);
  434. prtnframe = precv_frame;
  435. if (auth_alg == dot11AuthAlgrthm_8021X) {
  436. /* get ether_type */
  437. ptr = pfhdr->pkt->data + pfhdr->attrib.hdrlen;
  438. ether_type = (ptr[6] << 8) | ptr[7];
  439. if (psta && psta->ieee8021x_blocked) {
  440. /* blocked */
  441. /* only accept EAPOL frame */
  442. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  443. "########portctrl:psta->ieee8021x_blocked ==1\n");
  444. if (ether_type != eapol_type) {
  445. /* free this frame */
  446. rtw_free_recvframe23a(precv_frame);
  447. prtnframe = NULL;
  448. }
  449. }
  450. }
  451. return prtnframe;
  452. }
  453. int recv_decache(struct recv_frame *precv_frame, u8 bretry,
  454. struct stainfo_rxcache *prxcache);
  455. int recv_decache(struct recv_frame *precv_frame, u8 bretry,
  456. struct stainfo_rxcache *prxcache)
  457. {
  458. int tid = precv_frame->attrib.priority;
  459. u16 seq_ctrl = ((precv_frame->attrib.seq_num & 0xffff) << 4) |
  460. (precv_frame->attrib.frag_num & 0xf);
  461. if (tid > 15) {
  462. RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  463. "recv_decache, (tid>15)! seq_ctrl = 0x%x, tid = 0x%x\n",
  464. seq_ctrl, tid);
  465. return _FAIL;
  466. }
  467. if (1) { /* if (bretry) */
  468. if (seq_ctrl == prxcache->tid_rxseq[tid]) {
  469. RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  470. "recv_decache, seq_ctrl = 0x%x, tid = 0x%x, tid_rxseq = 0x%x\n",
  471. seq_ctrl, tid, prxcache->tid_rxseq[tid]);
  472. return _FAIL;
  473. }
  474. }
  475. prxcache->tid_rxseq[tid] = seq_ctrl;
  476. return _SUCCESS;
  477. }
  478. void process23a_pwrbit_data(struct rtw_adapter *padapter,
  479. struct recv_frame *precv_frame);
  480. void process23a_pwrbit_data(struct rtw_adapter *padapter,
  481. struct recv_frame *precv_frame)
  482. {
  483. #ifdef CONFIG_8723AU_AP_MODE
  484. unsigned char pwrbit;
  485. struct sk_buff *skb = precv_frame->pkt;
  486. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  487. struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
  488. struct sta_priv *pstapriv = &padapter->stapriv;
  489. struct sta_info *psta;
  490. psta = rtw_get_stainfo23a(pstapriv, pattrib->src);
  491. if (psta) {
  492. pwrbit = ieee80211_has_pm(hdr->frame_control);
  493. if (pwrbit) {
  494. if (!(psta->state & WIFI_SLEEP_STATE))
  495. stop_sta_xmit23a(padapter, psta);
  496. } else {
  497. if (psta->state & WIFI_SLEEP_STATE)
  498. wakeup_sta_to_xmit23a(padapter, psta);
  499. }
  500. }
  501. #endif
  502. }
  503. void process_wmmps_data(struct rtw_adapter *padapter,
  504. struct recv_frame *precv_frame);
  505. void process_wmmps_data(struct rtw_adapter *padapter,
  506. struct recv_frame *precv_frame)
  507. {
  508. #ifdef CONFIG_8723AU_AP_MODE
  509. struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
  510. struct sta_priv *pstapriv = &padapter->stapriv;
  511. struct sta_info *psta;
  512. psta = rtw_get_stainfo23a(pstapriv, pattrib->src);
  513. if (!psta)
  514. return;
  515. if (!psta->qos_option)
  516. return;
  517. if (!(psta->qos_info & 0xf))
  518. return;
  519. if (psta->state & WIFI_SLEEP_STATE) {
  520. u8 wmmps_ac = 0;
  521. switch (pattrib->priority) {
  522. case 1:
  523. case 2:
  524. wmmps_ac = psta->uapsd_bk & BIT(1);
  525. break;
  526. case 4:
  527. case 5:
  528. wmmps_ac = psta->uapsd_vi & BIT(1);
  529. break;
  530. case 6:
  531. case 7:
  532. wmmps_ac = psta->uapsd_vo & BIT(1);
  533. break;
  534. case 0:
  535. case 3:
  536. default:
  537. wmmps_ac = psta->uapsd_be & BIT(1);
  538. break;
  539. }
  540. if (wmmps_ac) {
  541. if (psta->sleepq_ac_len > 0) {
  542. /* process received triggered frame */
  543. xmit_delivery_enabled_frames23a(padapter, psta);
  544. } else {
  545. /* issue one qos null frame with More data bit = 0 and the EOSP bit set (= 1) */
  546. issue_qos_nulldata23a(padapter, psta->hwaddr,
  547. (u16)pattrib->priority,
  548. 0, 0);
  549. }
  550. }
  551. }
  552. #endif
  553. }
  554. static void count_rx_stats(struct rtw_adapter *padapter,
  555. struct recv_frame *prframe, struct sta_info *sta)
  556. {
  557. int sz;
  558. struct sta_info *psta = NULL;
  559. struct stainfo_stats *pstats = NULL;
  560. struct rx_pkt_attrib *pattrib = & prframe->attrib;
  561. struct recv_priv *precvpriv = &padapter->recvpriv;
  562. sz = prframe->pkt->len;
  563. precvpriv->rx_bytes += sz;
  564. padapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++;
  565. if ((!is_broadcast_ether_addr(pattrib->dst)) &&
  566. (!is_multicast_ether_addr(pattrib->dst)))
  567. padapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++;
  568. if (sta)
  569. psta = sta;
  570. else
  571. psta = prframe->psta;
  572. if (psta) {
  573. pstats = &psta->sta_stats;
  574. pstats->rx_data_pkts++;
  575. pstats->rx_bytes += sz;
  576. }
  577. }
  578. static int sta2sta_data_frame(struct rtw_adapter *adapter,
  579. struct recv_frame *precv_frame,
  580. struct sta_info**psta)
  581. {
  582. struct sk_buff *skb = precv_frame->pkt;
  583. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  584. int ret = _SUCCESS;
  585. struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
  586. struct sta_priv *pstapriv = &adapter->stapriv;
  587. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  588. u8 *mybssid = get_bssid(pmlmepriv);
  589. u8 *myhwaddr = myid(&adapter->eeprompriv);
  590. u8 *sta_addr = NULL;
  591. int bmcast = is_multicast_ether_addr(pattrib->dst);
  592. if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
  593. check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
  594. /* filter packets that SA is myself or multicast or broadcast */
  595. if (ether_addr_equal(myhwaddr, pattrib->src)) {
  596. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  597. "SA == myself\n");
  598. ret = _FAIL;
  599. goto exit;
  600. }
  601. if (!ether_addr_equal(myhwaddr, pattrib->dst) && !bmcast) {
  602. ret = _FAIL;
  603. goto exit;
  604. }
  605. if (ether_addr_equal(pattrib->bssid, "\x0\x0\x0\x0\x0\x0") ||
  606. ether_addr_equal(mybssid, "\x0\x0\x0\x0\x0\x0") ||
  607. !ether_addr_equal(pattrib->bssid, mybssid)) {
  608. ret = _FAIL;
  609. goto exit;
  610. }
  611. sta_addr = pattrib->src;
  612. } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
  613. /* For Station mode, sa and bssid should always be BSSID,
  614. and DA is my mac-address */
  615. if (!ether_addr_equal(pattrib->bssid, pattrib->src)) {
  616. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  617. "bssid != TA under STATION_MODE; drop pkt\n");
  618. ret = _FAIL;
  619. goto exit;
  620. }
  621. sta_addr = pattrib->bssid;
  622. } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
  623. if (bmcast) {
  624. /* For AP mode, if DA == MCAST, then BSSID should be also MCAST */
  625. if (!is_multicast_ether_addr(pattrib->bssid)) {
  626. ret = _FAIL;
  627. goto exit;
  628. }
  629. } else { /* not mc-frame */
  630. /* For AP mode, if DA is non-MCAST, then it must
  631. be BSSID, and bssid == BSSID */
  632. if (!ether_addr_equal(pattrib->bssid, pattrib->dst)) {
  633. ret = _FAIL;
  634. goto exit;
  635. }
  636. sta_addr = pattrib->src;
  637. }
  638. } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
  639. ether_addr_copy(pattrib->dst, hdr->addr1);
  640. ether_addr_copy(pattrib->src, hdr->addr2);
  641. ether_addr_copy(pattrib->bssid, hdr->addr3);
  642. ether_addr_copy(pattrib->ra, pattrib->dst);
  643. ether_addr_copy(pattrib->ta, pattrib->src);
  644. sta_addr = mybssid;
  645. } else {
  646. ret = _FAIL;
  647. }
  648. if (bmcast)
  649. *psta = rtw_get_bcmc_stainfo23a(adapter);
  650. else
  651. *psta = rtw_get_stainfo23a(pstapriv, sta_addr); /* get ap_info */
  652. if (*psta == NULL) {
  653. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  654. "can't get psta under sta2sta_data_frame ; drop pkt\n");
  655. ret = _FAIL;
  656. goto exit;
  657. }
  658. exit:
  659. return ret;
  660. }
  661. int ap2sta_data_frame(struct rtw_adapter *adapter,
  662. struct recv_frame *precv_frame,
  663. struct sta_info **psta);
  664. int ap2sta_data_frame(struct rtw_adapter *adapter,
  665. struct recv_frame *precv_frame,
  666. struct sta_info **psta)
  667. {
  668. struct sk_buff *skb = precv_frame->pkt;
  669. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  670. struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
  671. int ret = _SUCCESS;
  672. struct sta_priv *pstapriv = &adapter->stapriv;
  673. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  674. u8 *mybssid = get_bssid(pmlmepriv);
  675. u8 *myhwaddr = myid(&adapter->eeprompriv);
  676. int bmcast = is_multicast_ether_addr(pattrib->dst);
  677. if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) &&
  678. (check_fwstate(pmlmepriv, _FW_LINKED) ||
  679. check_fwstate(pmlmepriv, _FW_UNDER_LINKING))) {
  680. /* filter packets that SA is myself or multicast or broadcast */
  681. if (ether_addr_equal(myhwaddr, pattrib->src)) {
  682. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  683. "SA == myself\n");
  684. ret = _FAIL;
  685. goto exit;
  686. }
  687. /* da should be for me */
  688. if (!ether_addr_equal(myhwaddr, pattrib->dst) && !bmcast) {
  689. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  690. "ap2sta_data_frame: compare DA failed; DA=%pM\n",
  691. pattrib->dst);
  692. ret = _FAIL;
  693. goto exit;
  694. }
  695. /* check BSSID */
  696. if (ether_addr_equal(pattrib->bssid, "\x0\x0\x0\x0\x0\x0") ||
  697. ether_addr_equal(mybssid, "\x0\x0\x0\x0\x0\x0") ||
  698. !ether_addr_equal(pattrib->bssid, mybssid)) {
  699. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  700. "ap2sta_data_frame: compare BSSID failed; BSSID=%pM\n",
  701. pattrib->bssid);
  702. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  703. "mybssid=%pM\n", mybssid);
  704. if (!bmcast) {
  705. DBG_8723A("issue_deauth23a to the nonassociated ap=%pM for the reason(7)\n",
  706. pattrib->bssid);
  707. issue_deauth23a(adapter, pattrib->bssid,
  708. WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  709. }
  710. ret = _FAIL;
  711. goto exit;
  712. }
  713. if (bmcast)
  714. *psta = rtw_get_bcmc_stainfo23a(adapter);
  715. else
  716. /* get ap_info */
  717. *psta = rtw_get_stainfo23a(pstapriv, pattrib->bssid);
  718. if (*psta == NULL) {
  719. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  720. "ap2sta: can't get psta under STATION_MODE; drop pkt\n");
  721. ret = _FAIL;
  722. goto exit;
  723. }
  724. if (ieee80211_is_nullfunc(hdr->frame_control)) {
  725. /* No data, will not indicate to upper layer,
  726. temporily count it here */
  727. count_rx_stats(adapter, precv_frame, *psta);
  728. ret = RTW_RX_HANDLED;
  729. goto exit;
  730. }
  731. } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE) &&
  732. check_fwstate(pmlmepriv, _FW_LINKED)) {
  733. ether_addr_copy(pattrib->dst, hdr->addr1);
  734. ether_addr_copy(pattrib->src, hdr->addr2);
  735. ether_addr_copy(pattrib->bssid, hdr->addr3);
  736. ether_addr_copy(pattrib->ra, pattrib->dst);
  737. ether_addr_copy(pattrib->ta, pattrib->src);
  738. /* */
  739. ether_addr_copy(pattrib->bssid, mybssid);
  740. /* get sta_info */
  741. *psta = rtw_get_stainfo23a(pstapriv, pattrib->bssid);
  742. if (*psta == NULL) {
  743. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  744. "can't get psta under MP_MODE ; drop pkt\n");
  745. ret = _FAIL;
  746. goto exit;
  747. }
  748. } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
  749. /* Special case */
  750. ret = RTW_RX_HANDLED;
  751. goto exit;
  752. } else {
  753. if (ether_addr_equal(myhwaddr, pattrib->dst) && !bmcast) {
  754. *psta = rtw_get_stainfo23a(pstapriv, pattrib->bssid);
  755. if (*psta == NULL) {
  756. DBG_8723A("issue_deauth23a to the ap=%pM for the reason(7)\n",
  757. pattrib->bssid);
  758. issue_deauth23a(adapter, pattrib->bssid,
  759. WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  760. }
  761. }
  762. ret = _FAIL;
  763. }
  764. exit:
  765. return ret;
  766. }
  767. int sta2ap_data_frame(struct rtw_adapter *adapter,
  768. struct recv_frame *precv_frame,
  769. struct sta_info **psta);
  770. int sta2ap_data_frame(struct rtw_adapter *adapter,
  771. struct recv_frame *precv_frame,
  772. struct sta_info **psta)
  773. {
  774. struct sk_buff *skb = precv_frame->pkt;
  775. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  776. struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
  777. struct sta_priv *pstapriv = &adapter->stapriv;
  778. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  779. unsigned char *mybssid = get_bssid(pmlmepriv);
  780. int ret = _SUCCESS;
  781. if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
  782. /* For AP mode, RA = BSSID, TX = STA(SRC_ADDR), A3 = DST_ADDR */
  783. if (!ether_addr_equal(pattrib->bssid, mybssid)) {
  784. ret = _FAIL;
  785. goto exit;
  786. }
  787. *psta = rtw_get_stainfo23a(pstapriv, pattrib->src);
  788. if (*psta == NULL) {
  789. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  790. "can't get psta under AP_MODE; drop pkt\n");
  791. DBG_8723A("issue_deauth23a to sta=%pM for the reason(7)\n",
  792. pattrib->src);
  793. issue_deauth23a(adapter, pattrib->src,
  794. WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  795. ret = RTW_RX_HANDLED;
  796. goto exit;
  797. }
  798. process23a_pwrbit_data(adapter, precv_frame);
  799. /* We only get here if it's a data frame, so no need to
  800. * confirm data frame type first */
  801. if (ieee80211_is_data_qos(hdr->frame_control))
  802. process_wmmps_data(adapter, precv_frame);
  803. if (ieee80211_is_nullfunc(hdr->frame_control)) {
  804. /* No data, will not indicate to upper layer,
  805. temporily count it here */
  806. count_rx_stats(adapter, precv_frame, *psta);
  807. ret = RTW_RX_HANDLED;
  808. goto exit;
  809. }
  810. } else {
  811. u8 *myhwaddr = myid(&adapter->eeprompriv);
  812. if (!ether_addr_equal(pattrib->ra, myhwaddr)) {
  813. ret = RTW_RX_HANDLED;
  814. goto exit;
  815. }
  816. DBG_8723A("issue_deauth23a to sta=%pM for the reason(7)\n",
  817. pattrib->src);
  818. issue_deauth23a(adapter, pattrib->src,
  819. WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  820. ret = RTW_RX_HANDLED;
  821. goto exit;
  822. }
  823. exit:
  824. return ret;
  825. }
  826. static int validate_recv_ctrl_frame(struct rtw_adapter *padapter,
  827. struct recv_frame *precv_frame)
  828. {
  829. #ifdef CONFIG_8723AU_AP_MODE
  830. struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
  831. struct sta_priv *pstapriv = &padapter->stapriv;
  832. struct sk_buff *skb = precv_frame->pkt;
  833. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  834. if (!ieee80211_is_ctl(hdr->frame_control))
  835. return _FAIL;
  836. /* receive the frames that ra(a1) is my address */
  837. if (!ether_addr_equal(hdr->addr1, myid(&padapter->eeprompriv)))
  838. return _FAIL;
  839. /* only handle ps-poll */
  840. if (ieee80211_is_pspoll(hdr->frame_control)) {
  841. struct ieee80211_pspoll *psp = (struct ieee80211_pspoll *)hdr;
  842. u16 aid;
  843. u8 wmmps_ac = 0;
  844. struct sta_info *psta = NULL;
  845. aid = le16_to_cpu(psp->aid) & 0x3fff;
  846. psta = rtw_get_stainfo23a(pstapriv, hdr->addr2);
  847. if (!psta || psta->aid != aid)
  848. return _FAIL;
  849. /* for rx pkt statistics */
  850. psta->sta_stats.rx_ctrl_pkts++;
  851. switch (pattrib->priority) {
  852. case 1:
  853. case 2:
  854. wmmps_ac = psta->uapsd_bk & BIT(0);
  855. break;
  856. case 4:
  857. case 5:
  858. wmmps_ac = psta->uapsd_vi & BIT(0);
  859. break;
  860. case 6:
  861. case 7:
  862. wmmps_ac = psta->uapsd_vo & BIT(0);
  863. break;
  864. case 0:
  865. case 3:
  866. default:
  867. wmmps_ac = psta->uapsd_be & BIT(0);
  868. break;
  869. }
  870. if (wmmps_ac)
  871. return _FAIL;
  872. if (psta->state & WIFI_STA_ALIVE_CHK_STATE) {
  873. DBG_8723A("%s alive check-rx ps-poll\n", __func__);
  874. psta->expire_to = pstapriv->expire_to;
  875. psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
  876. }
  877. if ((psta->state & WIFI_SLEEP_STATE) &&
  878. (pstapriv->sta_dz_bitmap & CHKBIT(psta->aid))) {
  879. struct list_head *xmitframe_plist, *xmitframe_phead;
  880. struct xmit_frame *pxmitframe;
  881. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  882. spin_lock_bh(&pxmitpriv->lock);
  883. xmitframe_phead = get_list_head(&psta->sleep_q);
  884. xmitframe_plist = xmitframe_phead->next;
  885. if (!list_empty(xmitframe_phead)) {
  886. pxmitframe = container_of(xmitframe_plist,
  887. struct xmit_frame,
  888. list);
  889. xmitframe_plist = xmitframe_plist->next;
  890. list_del_init(&pxmitframe->list);
  891. psta->sleepq_len--;
  892. if (psta->sleepq_len>0)
  893. pxmitframe->attrib.mdata = 1;
  894. else
  895. pxmitframe->attrib.mdata = 0;
  896. pxmitframe->attrib.triggered = 1;
  897. /* DBG_8723A("handling ps-poll, q_len =%d, tim =%x\n", psta->sleepq_len, pstapriv->tim_bitmap); */
  898. rtl8723au_hal_xmitframe_enqueue(padapter,
  899. pxmitframe);
  900. if (psta->sleepq_len == 0) {
  901. pstapriv->tim_bitmap &= ~CHKBIT(psta->aid);
  902. /* DBG_8723A("after handling ps-poll, tim =%x\n", pstapriv->tim_bitmap); */
  903. /* update BCN for TIM IE */
  904. /* update_BCNTIM(padapter); */
  905. update_beacon23a(padapter, WLAN_EID_TIM,
  906. NULL, false);
  907. }
  908. /* spin_unlock_bh(&psta->sleep_q.lock); */
  909. spin_unlock_bh(&pxmitpriv->lock);
  910. } else {
  911. /* spin_unlock_bh(&psta->sleep_q.lock); */
  912. spin_unlock_bh(&pxmitpriv->lock);
  913. /* DBG_8723A("no buffered packets to xmit\n"); */
  914. if (pstapriv->tim_bitmap & CHKBIT(psta->aid)) {
  915. if (psta->sleepq_len == 0) {
  916. DBG_8723A("no buffered packets "
  917. "to xmit\n");
  918. /* issue nulldata with More data bit = 0 to indicate we have no buffered packets */
  919. issue_nulldata23a(padapter,
  920. psta->hwaddr,
  921. 0, 0, 0);
  922. } else {
  923. DBG_8723A("error!psta->sleepq"
  924. "_len =%d\n",
  925. psta->sleepq_len);
  926. psta->sleepq_len = 0;
  927. }
  928. pstapriv->tim_bitmap &= ~CHKBIT(psta->aid);
  929. /* update BCN for TIM IE */
  930. /* update_BCNTIM(padapter); */
  931. update_beacon23a(padapter, WLAN_EID_TIM,
  932. NULL, false);
  933. }
  934. }
  935. }
  936. }
  937. #endif
  938. return _FAIL;
  939. }
  940. struct recv_frame *recvframe_chk_defrag23a(struct rtw_adapter *padapter,
  941. struct recv_frame *precv_frame);
  942. static int validate_recv_mgnt_frame(struct rtw_adapter *padapter,
  943. struct recv_frame *precv_frame)
  944. {
  945. struct sta_info *psta;
  946. struct sk_buff *skb;
  947. struct ieee80211_hdr *hdr;
  948. /* struct mlme_priv *pmlmepriv = &adapter->mlmepriv; */
  949. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  950. "+validate_recv_mgnt_frame\n");
  951. precv_frame = recvframe_chk_defrag23a(padapter, precv_frame);
  952. if (precv_frame == NULL) {
  953. RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  954. "%s: fragment packet\n", __func__);
  955. return _SUCCESS;
  956. }
  957. skb = precv_frame->pkt;
  958. hdr = (struct ieee80211_hdr *) skb->data;
  959. /* for rx pkt statistics */
  960. psta = rtw_get_stainfo23a(&padapter->stapriv, hdr->addr2);
  961. if (psta) {
  962. psta->sta_stats.rx_mgnt_pkts++;
  963. if (ieee80211_is_beacon(hdr->frame_control))
  964. psta->sta_stats.rx_beacon_pkts++;
  965. else if (ieee80211_is_probe_req(hdr->frame_control))
  966. psta->sta_stats.rx_probereq_pkts++;
  967. else if (ieee80211_is_probe_resp(hdr->frame_control)) {
  968. if (ether_addr_equal(padapter->eeprompriv.mac_addr,
  969. hdr->addr1))
  970. psta->sta_stats.rx_probersp_pkts++;
  971. else if (is_broadcast_ether_addr(hdr->addr1) ||
  972. is_multicast_ether_addr(hdr->addr1))
  973. psta->sta_stats.rx_probersp_bm_pkts++;
  974. else
  975. psta->sta_stats.rx_probersp_uo_pkts++;
  976. }
  977. }
  978. mgt_dispatcher23a(padapter, precv_frame);
  979. return _SUCCESS;
  980. }
  981. static int validate_recv_data_frame(struct rtw_adapter *adapter,
  982. struct recv_frame *precv_frame)
  983. {
  984. u8 bretry;
  985. u8 *psa, *pda;
  986. struct sta_info *psta = NULL;
  987. struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
  988. struct security_priv *psecuritypriv = &adapter->securitypriv;
  989. int ret = _SUCCESS;
  990. struct sk_buff *skb = precv_frame->pkt;
  991. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  992. bretry = ieee80211_has_retry(hdr->frame_control);
  993. pda = ieee80211_get_DA(hdr);
  994. psa = ieee80211_get_SA(hdr);
  995. ether_addr_copy(pattrib->dst, pda);
  996. ether_addr_copy(pattrib->src, psa);
  997. switch (hdr->frame_control &
  998. cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
  999. case cpu_to_le16(0):
  1000. ether_addr_copy(pattrib->bssid, hdr->addr3);
  1001. ether_addr_copy(pattrib->ra, pda);
  1002. ether_addr_copy(pattrib->ta, psa);
  1003. ret = sta2sta_data_frame(adapter, precv_frame, &psta);
  1004. break;
  1005. case cpu_to_le16(IEEE80211_FCTL_FROMDS):
  1006. ether_addr_copy(pattrib->bssid, hdr->addr2);
  1007. ether_addr_copy(pattrib->ra, pda);
  1008. ether_addr_copy(pattrib->ta, hdr->addr2);
  1009. ret = ap2sta_data_frame(adapter, precv_frame, &psta);
  1010. break;
  1011. case cpu_to_le16(IEEE80211_FCTL_TODS):
  1012. ether_addr_copy(pattrib->bssid, hdr->addr1);
  1013. ether_addr_copy(pattrib->ra, hdr->addr1);
  1014. ether_addr_copy(pattrib->ta, psa);
  1015. ret = sta2ap_data_frame(adapter, precv_frame, &psta);
  1016. break;
  1017. case cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS):
  1018. /*
  1019. * There is no BSSID in this case, but the driver has been
  1020. * using addr1 so far, so keep it for now.
  1021. */
  1022. ether_addr_copy(pattrib->bssid, hdr->addr1);
  1023. ether_addr_copy(pattrib->ra, hdr->addr1);
  1024. ether_addr_copy(pattrib->ta, hdr->addr2);
  1025. ret = _FAIL;
  1026. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, "case 3\n");
  1027. break;
  1028. }
  1029. if ((ret == _FAIL) || (ret == RTW_RX_HANDLED))
  1030. goto exit;
  1031. if (!psta) {
  1032. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1033. "after to_fr_ds_chk; psta == NULL\n");
  1034. ret = _FAIL;
  1035. goto exit;
  1036. }
  1037. /* psta->rssi = prxcmd->rssi; */
  1038. /* psta->signal_quality = prxcmd->sq; */
  1039. precv_frame->psta = psta;
  1040. pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr);
  1041. if (ieee80211_has_a4(hdr->frame_control))
  1042. pattrib->hdrlen += ETH_ALEN;
  1043. /* parsing QC field */
  1044. if (pattrib->qos == 1) {
  1045. __le16 *qptr = (__le16 *)ieee80211_get_qos_ctl(hdr);
  1046. u16 qos_ctrl = le16_to_cpu(*qptr);
  1047. pattrib->priority = qos_ctrl & IEEE80211_QOS_CTL_TID_MASK;
  1048. pattrib->ack_policy = (qos_ctrl >> 5) & 3;
  1049. pattrib->amsdu =
  1050. (qos_ctrl & IEEE80211_QOS_CTL_A_MSDU_PRESENT) >> 7;
  1051. pattrib->hdrlen += IEEE80211_QOS_CTL_LEN;
  1052. if (pattrib->priority != 0 && pattrib->priority != 3) {
  1053. adapter->recvpriv.bIsAnyNonBEPkts = true;
  1054. }
  1055. } else {
  1056. pattrib->priority = 0;
  1057. pattrib->ack_policy = 0;
  1058. pattrib->amsdu = 0;
  1059. }
  1060. if (pattrib->order) { /* HT-CTRL 11n */
  1061. pattrib->hdrlen += 4;
  1062. }
  1063. precv_frame->preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority];
  1064. /* decache, drop duplicate recv packets */
  1065. if (recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) ==
  1066. _FAIL) {
  1067. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1068. "decache : drop pkt\n");
  1069. ret = _FAIL;
  1070. goto exit;
  1071. }
  1072. if (pattrib->privacy) {
  1073. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  1074. "validate_recv_data_frame:pattrib->privacy =%x\n",
  1075. pattrib->privacy);
  1076. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  1077. "^^^^^^^^^^^is_multicast_ether_addr(pattrib->ra(0x%02x)) =%d^^^^^^^^^^^^^^^6\n",
  1078. pattrib->ra[0],
  1079. is_multicast_ether_addr(pattrib->ra));
  1080. GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt,
  1081. is_multicast_ether_addr(pattrib->ra));
  1082. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  1083. "pattrib->encrypt =%d\n", pattrib->encrypt);
  1084. switch (pattrib->encrypt) {
  1085. case WLAN_CIPHER_SUITE_WEP40:
  1086. case WLAN_CIPHER_SUITE_WEP104:
  1087. pattrib->iv_len = IEEE80211_WEP_IV_LEN;
  1088. pattrib->icv_len = IEEE80211_WEP_ICV_LEN;
  1089. break;
  1090. case WLAN_CIPHER_SUITE_TKIP:
  1091. pattrib->iv_len = IEEE80211_TKIP_IV_LEN;
  1092. pattrib->icv_len = IEEE80211_TKIP_ICV_LEN;
  1093. break;
  1094. case WLAN_CIPHER_SUITE_CCMP:
  1095. pattrib->iv_len = IEEE80211_CCMP_HDR_LEN;
  1096. pattrib->icv_len = IEEE80211_CCMP_MIC_LEN;
  1097. break;
  1098. default:
  1099. pattrib->iv_len = 0;
  1100. pattrib->icv_len = 0;
  1101. break;
  1102. }
  1103. } else {
  1104. pattrib->encrypt = 0;
  1105. pattrib->iv_len = 0;
  1106. pattrib->icv_len = 0;
  1107. }
  1108. exit:
  1109. return ret;
  1110. }
  1111. static void dump_rx_pkt(struct sk_buff *skb, u16 type, int level)
  1112. {
  1113. int i;
  1114. u8 *ptr;
  1115. if ((level == 1) ||
  1116. ((level == 2) && (type == IEEE80211_FTYPE_MGMT)) ||
  1117. ((level == 3) && (type == IEEE80211_FTYPE_DATA))) {
  1118. ptr = skb->data;
  1119. DBG_8723A("#############################\n");
  1120. for (i = 0; i < 64; i = i + 8)
  1121. DBG_8723A("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n",
  1122. *(ptr + i), *(ptr + i + 1), *(ptr + i + 2),
  1123. *(ptr + i + 3), *(ptr + i + 4),
  1124. *(ptr + i + 5), *(ptr + i + 6),
  1125. *(ptr + i + 7));
  1126. DBG_8723A("#############################\n");
  1127. }
  1128. }
  1129. static int validate_recv_frame(struct rtw_adapter *adapter,
  1130. struct recv_frame *precv_frame)
  1131. {
  1132. /* shall check frame subtype, to / from ds, da, bssid */
  1133. /* then call check if rx seq/frag. duplicated. */
  1134. u8 type;
  1135. u8 subtype;
  1136. int retval = _SUCCESS;
  1137. struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
  1138. struct sk_buff *skb = precv_frame->pkt;
  1139. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  1140. u8 ver;
  1141. u8 bDumpRxPkt;
  1142. u16 seq_ctrl, fctl;
  1143. fctl = le16_to_cpu(hdr->frame_control);
  1144. ver = fctl & IEEE80211_FCTL_VERS;
  1145. type = fctl & IEEE80211_FCTL_FTYPE;
  1146. subtype = fctl & IEEE80211_FCTL_STYPE;
  1147. /* add version chk */
  1148. if (ver != 0) {
  1149. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1150. "validate_recv_data_frame fail! (ver!= 0)\n");
  1151. retval = _FAIL;
  1152. goto exit;
  1153. }
  1154. seq_ctrl = le16_to_cpu(hdr->seq_ctrl);
  1155. pattrib->frag_num = seq_ctrl & IEEE80211_SCTL_FRAG;
  1156. pattrib->seq_num = seq_ctrl >> 4;
  1157. pattrib->pw_save = ieee80211_has_pm(hdr->frame_control);
  1158. pattrib->mfrag = ieee80211_has_morefrags(hdr->frame_control);
  1159. pattrib->mdata = ieee80211_has_moredata(hdr->frame_control);
  1160. pattrib->privacy = ieee80211_has_protected(hdr->frame_control);
  1161. pattrib->order = ieee80211_has_order(hdr->frame_control);
  1162. GetHalDefVar8192CUsb(adapter, HAL_DEF_DBG_DUMP_RXPKT, &bDumpRxPkt);
  1163. if (unlikely(bDumpRxPkt == 1))
  1164. dump_rx_pkt(skb, type, bDumpRxPkt);
  1165. switch (type) {
  1166. case IEEE80211_FTYPE_MGMT:
  1167. retval = validate_recv_mgnt_frame(adapter, precv_frame);
  1168. if (retval == _FAIL) {
  1169. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1170. "validate_recv_mgnt_frame fail\n");
  1171. }
  1172. retval = _FAIL; /* only data frame return _SUCCESS */
  1173. break;
  1174. case IEEE80211_FTYPE_CTL:
  1175. retval = validate_recv_ctrl_frame(adapter, precv_frame);
  1176. if (retval == _FAIL) {
  1177. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1178. "validate_recv_ctrl_frame fail\n");
  1179. }
  1180. retval = _FAIL; /* only data frame return _SUCCESS */
  1181. break;
  1182. case IEEE80211_FTYPE_DATA:
  1183. pattrib->qos = (subtype & IEEE80211_STYPE_QOS_DATA) ? 1 : 0;
  1184. retval = validate_recv_data_frame(adapter, precv_frame);
  1185. if (retval == _FAIL) {
  1186. struct recv_priv *precvpriv = &adapter->recvpriv;
  1187. precvpriv->rx_drop++;
  1188. }
  1189. break;
  1190. default:
  1191. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1192. "validate_recv_data_frame fail! type = 0x%x\n", type);
  1193. retval = _FAIL;
  1194. break;
  1195. }
  1196. exit:
  1197. return retval;
  1198. }
  1199. /* remove the wlanhdr and add the eth_hdr */
  1200. static int wlanhdr_to_ethhdr (struct recv_frame *precvframe)
  1201. {
  1202. u16 eth_type, len, hdrlen;
  1203. u8 bsnaphdr;
  1204. u8 *psnap;
  1205. struct rtw_adapter *adapter = precvframe->adapter;
  1206. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  1207. struct sk_buff *skb = precvframe->pkt;
  1208. u8 *ptr;
  1209. struct rx_pkt_attrib *pattrib = &precvframe->attrib;
  1210. ptr = skb->data;
  1211. hdrlen = pattrib->hdrlen;
  1212. psnap = ptr + hdrlen;
  1213. eth_type = (psnap[6] << 8) | psnap[7];
  1214. /* convert hdr + possible LLC headers into Ethernet header */
  1215. /* eth_type = (psnap_type[0] << 8) | psnap_type[1]; */
  1216. if ((ether_addr_equal(psnap, rfc1042_header) &&
  1217. eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||
  1218. ether_addr_equal(psnap, bridge_tunnel_header)) {
  1219. /* remove RFC1042 or Bridge-Tunnel encapsulation
  1220. and replace EtherType */
  1221. bsnaphdr = true;
  1222. hdrlen += SNAP_SIZE;
  1223. } else {
  1224. /* Leave Ethernet header part of hdr and full payload */
  1225. bsnaphdr = false;
  1226. eth_type = (psnap[0] << 8) | psnap[1];
  1227. }
  1228. len = skb->len - hdrlen;
  1229. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  1230. "=== pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n",
  1231. pattrib->hdrlen, pattrib->iv_len);
  1232. pattrib->eth_type = eth_type;
  1233. if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
  1234. ptr += hdrlen;
  1235. *ptr = 0x87;
  1236. *(ptr + 1) = 0x12;
  1237. eth_type = 0x8712;
  1238. /* append rx status for mp test packets */
  1239. ptr = skb_pull(skb, (hdrlen - sizeof(struct ethhdr) + 2) - 24);
  1240. memcpy(ptr, skb->head, 24);
  1241. ptr += 24;
  1242. } else {
  1243. ptr = skb_pull(skb, (hdrlen - sizeof(struct ethhdr) +
  1244. (bsnaphdr ? 2:0)));
  1245. }
  1246. ether_addr_copy(ptr, pattrib->dst);
  1247. ether_addr_copy(ptr + ETH_ALEN, pattrib->src);
  1248. if (!bsnaphdr) {
  1249. put_unaligned_be16(len, ptr + 12);
  1250. }
  1251. return _SUCCESS;
  1252. }
  1253. /* perform defrag */
  1254. struct recv_frame *recvframe_defrag(struct rtw_adapter *adapter,
  1255. struct rtw_queue *defrag_q);
  1256. struct recv_frame *recvframe_defrag(struct rtw_adapter *adapter,
  1257. struct rtw_queue *defrag_q)
  1258. {
  1259. struct list_head *plist, *phead, *ptmp;
  1260. u8 *data, wlanhdr_offset;
  1261. u8 curfragnum;
  1262. struct recv_frame *pnfhdr;
  1263. struct recv_frame *prframe, *pnextrframe;
  1264. struct rtw_queue *pfree_recv_queue;
  1265. struct sk_buff *skb;
  1266. curfragnum = 0;
  1267. pfree_recv_queue = &adapter->recvpriv.free_recv_queue;
  1268. phead = get_list_head(defrag_q);
  1269. plist = phead->next;
  1270. prframe = container_of(plist, struct recv_frame, list);
  1271. list_del_init(&prframe->list);
  1272. skb = prframe->pkt;
  1273. if (curfragnum != prframe->attrib.frag_num) {
  1274. /* the first fragment number must be 0 */
  1275. /* free the whole queue */
  1276. rtw_free_recvframe23a(prframe);
  1277. rtw_free_recvframe23a_queue(defrag_q);
  1278. return NULL;
  1279. }
  1280. curfragnum++;
  1281. phead = get_list_head(defrag_q);
  1282. data = prframe->pkt->data;
  1283. list_for_each_safe(plist, ptmp, phead) {
  1284. pnfhdr = container_of(plist, struct recv_frame, list);
  1285. pnextrframe = (struct recv_frame *)pnfhdr;
  1286. /* check the fragment sequence (2nd ~n fragment frame) */
  1287. if (curfragnum != pnfhdr->attrib.frag_num) {
  1288. /* the fragment number must be increasing
  1289. (after decache) */
  1290. /* release the defrag_q & prframe */
  1291. rtw_free_recvframe23a(prframe);
  1292. rtw_free_recvframe23a_queue(defrag_q);
  1293. return NULL;
  1294. }
  1295. curfragnum++;
  1296. /* copy the 2nd~n fragment frame's payload to the
  1297. first fragment */
  1298. /* get the 2nd~last fragment frame's payload */
  1299. wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len;
  1300. skb_pull(pnfhdr->pkt, wlanhdr_offset);
  1301. /* append to first fragment frame's tail
  1302. (if privacy frame, pull the ICV) */
  1303. skb_trim(skb, skb->len - prframe->attrib.icv_len);
  1304. memcpy(skb_tail_pointer(skb), pnfhdr->pkt->data,
  1305. pnfhdr->pkt->len);
  1306. skb_put(skb, pnfhdr->pkt->len);
  1307. prframe->attrib.icv_len = pnfhdr->attrib.icv_len;
  1308. }
  1309. /* free the defrag_q queue and return the prframe */
  1310. rtw_free_recvframe23a_queue(defrag_q);
  1311. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  1312. "Performance defrag!!!!!\n");
  1313. return prframe;
  1314. }
  1315. /* check if need to defrag, if needed queue the frame to defrag_q */
  1316. struct recv_frame *recvframe_chk_defrag23a(struct rtw_adapter *padapter,
  1317. struct recv_frame *precv_frame)
  1318. {
  1319. u8 ismfrag;
  1320. u8 fragnum;
  1321. u8 *psta_addr;
  1322. struct recv_frame *pfhdr;
  1323. struct sta_info *psta;
  1324. struct sta_priv *pstapriv;
  1325. struct list_head *phead;
  1326. struct recv_frame *prtnframe = NULL;
  1327. struct rtw_queue *pfree_recv_queue, *pdefrag_q;
  1328. pstapriv = &padapter->stapriv;
  1329. pfhdr = precv_frame;
  1330. pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
  1331. /* need to define struct of wlan header frame ctrl */
  1332. ismfrag = pfhdr->attrib.mfrag;
  1333. fragnum = pfhdr->attrib.frag_num;
  1334. psta_addr = pfhdr->attrib.ta;
  1335. psta = rtw_get_stainfo23a(pstapriv, psta_addr);
  1336. if (!psta) {
  1337. struct ieee80211_hdr *hdr =
  1338. (struct ieee80211_hdr *) pfhdr->pkt->data;
  1339. if (!ieee80211_is_data(hdr->frame_control)) {
  1340. psta = rtw_get_bcmc_stainfo23a(padapter);
  1341. pdefrag_q = &psta->sta_recvpriv.defrag_q;
  1342. } else
  1343. pdefrag_q = NULL;
  1344. } else
  1345. pdefrag_q = &psta->sta_recvpriv.defrag_q;
  1346. if ((ismfrag == 0) && (fragnum == 0)) {
  1347. prtnframe = precv_frame;/* isn't a fragment frame */
  1348. }
  1349. if (ismfrag == 1) {
  1350. /* 0~(n-1) fragment frame */
  1351. /* enqueue to defraf_g */
  1352. if (pdefrag_q != NULL) {
  1353. if (fragnum == 0) {
  1354. /* the first fragment */
  1355. if (!list_empty(&pdefrag_q->queue)) {
  1356. /* free current defrag_q */
  1357. rtw_free_recvframe23a_queue(pdefrag_q);
  1358. }
  1359. }
  1360. /* Then enqueue the 0~(n-1) fragment into the
  1361. defrag_q */
  1362. /* spin_lock(&pdefrag_q->lock); */
  1363. phead = get_list_head(pdefrag_q);
  1364. list_add_tail(&pfhdr->list, phead);
  1365. /* spin_unlock(&pdefrag_q->lock); */
  1366. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  1367. "Enqueuq: ismfrag = %d, fragnum = %d\n",
  1368. ismfrag, fragnum);
  1369. prtnframe = NULL;
  1370. } else {
  1371. /* can't find this ta's defrag_queue,
  1372. so free this recv_frame */
  1373. rtw_free_recvframe23a(precv_frame);
  1374. prtnframe = NULL;
  1375. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1376. "Free because pdefrag_q == NULL: ismfrag = %d, fragnum = %d\n",
  1377. ismfrag, fragnum);
  1378. }
  1379. }
  1380. if ((ismfrag == 0) && (fragnum != 0)) {
  1381. /* the last fragment frame */
  1382. /* enqueue the last fragment */
  1383. if (pdefrag_q != NULL) {
  1384. /* spin_lock(&pdefrag_q->lock); */
  1385. phead = get_list_head(pdefrag_q);
  1386. list_add_tail(&pfhdr->list, phead);
  1387. /* spin_unlock(&pdefrag_q->lock); */
  1388. /* call recvframe_defrag to defrag */
  1389. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  1390. "defrag: ismfrag = %d, fragnum = %d\n",
  1391. ismfrag, fragnum);
  1392. precv_frame = recvframe_defrag(padapter, pdefrag_q);
  1393. prtnframe = precv_frame;
  1394. } else {
  1395. /* can't find this ta's defrag_queue,
  1396. so free this recv_frame */
  1397. rtw_free_recvframe23a(precv_frame);
  1398. prtnframe = NULL;
  1399. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1400. "Free because pdefrag_q == NULL: ismfrag = %d, fragnum = %d\n",
  1401. ismfrag, fragnum);
  1402. }
  1403. }
  1404. if ((prtnframe != NULL) && (prtnframe->attrib.privacy)) {
  1405. /* after defrag we must check tkip mic code */
  1406. if (recvframe_chkmic(padapter, prtnframe) == _FAIL) {
  1407. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1408. "recvframe_chkmic(padapter, prtnframe) ==_FAIL\n");
  1409. rtw_free_recvframe23a(prtnframe);
  1410. prtnframe = NULL;
  1411. }
  1412. }
  1413. return prtnframe;
  1414. }
  1415. int amsdu_to_msdu(struct rtw_adapter *padapter, struct recv_frame *prframe);
  1416. int amsdu_to_msdu(struct rtw_adapter *padapter, struct recv_frame *prframe)
  1417. {
  1418. struct rx_pkt_attrib *pattrib;
  1419. struct sk_buff *skb, *sub_skb;
  1420. struct sk_buff_head skb_list;
  1421. pattrib = &prframe->attrib;
  1422. skb = prframe->pkt;
  1423. skb_pull(skb, prframe->attrib.hdrlen);
  1424. __skb_queue_head_init(&skb_list);
  1425. ieee80211_amsdu_to_8023s(skb, &skb_list, NULL, 0, 0, false);
  1426. while (!skb_queue_empty(&skb_list)) {
  1427. sub_skb = __skb_dequeue(&skb_list);
  1428. sub_skb->protocol = eth_type_trans(sub_skb, padapter->pnetdev);
  1429. sub_skb->dev = padapter->pnetdev;
  1430. sub_skb->ip_summed = CHECKSUM_NONE;
  1431. netif_rx(sub_skb);
  1432. }
  1433. prframe->pkt = NULL;
  1434. rtw_free_recvframe23a(prframe);
  1435. return _SUCCESS;
  1436. }
  1437. int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num);
  1438. int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num)
  1439. {
  1440. u8 wsize = preorder_ctrl->wsize_b;
  1441. u16 wend = (preorder_ctrl->indicate_seq + wsize -1) & 0xFFF;
  1442. /* Rx Reorder initialize condition. */
  1443. if (preorder_ctrl->indicate_seq == 0xFFFF)
  1444. preorder_ctrl->indicate_seq = seq_num;
  1445. /* Drop out the packet which SeqNum is smaller than WinStart */
  1446. if (SN_LESS(seq_num, preorder_ctrl->indicate_seq))
  1447. return false;
  1448. /* */
  1449. /* Sliding window manipulation. Conditions includes: */
  1450. /* 1. Incoming SeqNum is equal to WinStart =>Window shift 1 */
  1451. /* 2. Incoming SeqNum is larger than the WinEnd => Window shift N */
  1452. /* */
  1453. if (SN_EQUAL(seq_num, preorder_ctrl->indicate_seq)) {
  1454. preorder_ctrl->indicate_seq =
  1455. (preorder_ctrl->indicate_seq + 1) & 0xFFF;
  1456. } else if (SN_LESS(wend, seq_num)) {
  1457. /* boundary situation, when seq_num cross 0xFFF */
  1458. if (seq_num >= (wsize - 1))
  1459. preorder_ctrl->indicate_seq = seq_num + 1 -wsize;
  1460. else
  1461. preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1;
  1462. }
  1463. return true;
  1464. }
  1465. static int enqueue_reorder_recvframe23a(struct recv_reorder_ctrl *preorder_ctrl,
  1466. struct recv_frame *prframe)
  1467. {
  1468. struct rx_pkt_attrib *pattrib = &prframe->attrib;
  1469. struct rtw_queue *ppending_recvframe_queue;
  1470. struct list_head *phead, *plist, *ptmp;
  1471. struct recv_frame *hdr;
  1472. struct rx_pkt_attrib *pnextattrib;
  1473. ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  1474. /* DbgPrint("+enqueue_reorder_recvframe23a()\n"); */
  1475. /* spin_lock_irqsave(&ppending_recvframe_queue->lock); */
  1476. /* spin_lock_ex(&ppending_recvframe_queue->lock); */
  1477. phead = get_list_head(ppending_recvframe_queue);
  1478. list_for_each_safe(plist, ptmp, phead) {
  1479. hdr = container_of(plist, struct recv_frame, list);
  1480. pnextattrib = &hdr->attrib;
  1481. if (SN_LESS(pnextattrib->seq_num, pattrib->seq_num)) {
  1482. continue;
  1483. } else if (SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num)) {
  1484. /* Duplicate entry is found!! Do not insert current entry. */
  1485. /* spin_unlock_irqrestore(&ppending_recvframe_queue->lock); */
  1486. return false;
  1487. } else {
  1488. break;
  1489. }
  1490. /* DbgPrint("enqueue_reorder_recvframe23a():while\n"); */
  1491. }
  1492. /* spin_lock_irqsave(&ppending_recvframe_queue->lock); */
  1493. /* spin_lock_ex(&ppending_recvframe_queue->lock); */
  1494. list_del_init(&prframe->list);
  1495. list_add_tail(&prframe->list, plist);
  1496. /* spin_unlock_ex(&ppending_recvframe_queue->lock); */
  1497. /* spin_unlock_irqrestore(&ppending_recvframe_queue->lock); */
  1498. return true;
  1499. }
  1500. int recv_indicatepkts_in_order(struct rtw_adapter *padapter,
  1501. struct recv_reorder_ctrl *preorder_ctrl,
  1502. int bforced);
  1503. int recv_indicatepkts_in_order(struct rtw_adapter *padapter,
  1504. struct recv_reorder_ctrl *preorder_ctrl,
  1505. int bforced)
  1506. {
  1507. /* u8 bcancelled; */
  1508. struct list_head *phead, *plist;
  1509. struct recv_frame *prframe;
  1510. struct rx_pkt_attrib *pattrib;
  1511. /* u8 index = 0; */
  1512. int bPktInBuf = false;
  1513. struct recv_priv *precvpriv;
  1514. struct rtw_queue *ppending_recvframe_queue;
  1515. precvpriv = &padapter->recvpriv;
  1516. ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  1517. /* DbgPrint("+recv_indicatepkts_in_order\n"); */
  1518. /* spin_lock_irqsave(&ppending_recvframe_queue->lock); */
  1519. /* spin_lock_ex(&ppending_recvframe_queue->lock); */
  1520. phead = get_list_head(ppending_recvframe_queue);
  1521. plist = phead->next;
  1522. /* Handling some condition for forced indicate case. */
  1523. if (bforced) {
  1524. if (list_empty(phead)) {
  1525. /* spin_unlock_irqrestore(&ppending_recvframe_queue->lock); */
  1526. /* spin_unlock_ex(&ppending_recvframe_queue->lock); */
  1527. return true;
  1528. }
  1529. prframe = container_of(plist, struct recv_frame, list);
  1530. pattrib = &prframe->attrib;
  1531. preorder_ctrl->indicate_seq = pattrib->seq_num;
  1532. }
  1533. /* Prepare indication list and indication. */
  1534. /* Check if there is any packet need indicate. */
  1535. while (!list_empty(phead)) {
  1536. prframe = container_of(plist, struct recv_frame, list);
  1537. pattrib = &prframe->attrib;
  1538. if (!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) {
  1539. RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  1540. "recv_indicatepkts_in_order: indicate =%d seq =%d amsdu =%d\n",
  1541. preorder_ctrl->indicate_seq,
  1542. pattrib->seq_num, pattrib->amsdu);
  1543. plist = plist->next;
  1544. list_del_init(&prframe->list);
  1545. if (SN_EQUAL(preorder_ctrl->indicate_seq,
  1546. pattrib->seq_num)) {
  1547. preorder_ctrl->indicate_seq =
  1548. (preorder_ctrl->indicate_seq + 1)&0xFFF;
  1549. }
  1550. if (!pattrib->amsdu) {
  1551. if ((padapter->bDriverStopped == false) &&
  1552. (padapter->bSurpriseRemoved == false)) {
  1553. rtw_recv_indicatepkt23a(padapter, prframe);
  1554. }
  1555. } else {
  1556. if (amsdu_to_msdu(padapter, prframe) !=
  1557. _SUCCESS)
  1558. rtw_free_recvframe23a(prframe);
  1559. }
  1560. /* Update local variables. */
  1561. bPktInBuf = false;
  1562. } else {
  1563. bPktInBuf = true;
  1564. break;
  1565. }
  1566. /* DbgPrint("recv_indicatepkts_in_order():while\n"); */
  1567. }
  1568. /* spin_unlock_ex(&ppending_recvframe_queue->lock); */
  1569. /* spin_unlock_irqrestore(&ppending_recvframe_queue->lock); */
  1570. return bPktInBuf;
  1571. }
  1572. int recv_indicatepkt_reorder(struct rtw_adapter *padapter,
  1573. struct recv_frame *prframe);
  1574. int recv_indicatepkt_reorder(struct rtw_adapter *padapter,
  1575. struct recv_frame *prframe)
  1576. {
  1577. int retval = _SUCCESS;
  1578. struct rx_pkt_attrib *pattrib;
  1579. struct recv_reorder_ctrl *preorder_ctrl;
  1580. struct rtw_queue *ppending_recvframe_queue;
  1581. pattrib = &prframe->attrib;
  1582. preorder_ctrl = prframe->preorder_ctrl;
  1583. ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  1584. if (!pattrib->amsdu) {
  1585. /* s1. */
  1586. wlanhdr_to_ethhdr(prframe);
  1587. if ((pattrib->qos!= 1) || (pattrib->eth_type == ETH_P_ARP) ||
  1588. (pattrib->ack_policy != 0)) {
  1589. if ((padapter->bDriverStopped == false) &&
  1590. (padapter->bSurpriseRemoved == false)) {
  1591. RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  1592. "@@@@ recv_indicatepkt_reorder -recv_func recv_indicatepkt\n");
  1593. rtw_recv_indicatepkt23a(padapter, prframe);
  1594. return _SUCCESS;
  1595. }
  1596. return _FAIL;
  1597. }
  1598. if (preorder_ctrl->enable == false) {
  1599. /* indicate this recv_frame */
  1600. preorder_ctrl->indicate_seq = pattrib->seq_num;
  1601. rtw_recv_indicatepkt23a(padapter, prframe);
  1602. preorder_ctrl->indicate_seq =
  1603. (preorder_ctrl->indicate_seq + 1) % 4096;
  1604. return _SUCCESS;
  1605. }
  1606. } else {
  1607. /* temp filter -> means didn't support A-MSDUs in a A-MPDU */
  1608. if (preorder_ctrl->enable == false) {
  1609. preorder_ctrl->indicate_seq = pattrib->seq_num;
  1610. retval = amsdu_to_msdu(padapter, prframe);
  1611. preorder_ctrl->indicate_seq =
  1612. (preorder_ctrl->indicate_seq + 1) % 4096;
  1613. return retval;
  1614. }
  1615. }
  1616. spin_lock_bh(&ppending_recvframe_queue->lock);
  1617. RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  1618. "recv_indicatepkt_reorder: indicate =%d seq =%d\n",
  1619. preorder_ctrl->indicate_seq, pattrib->seq_num);
  1620. /* s2. check if winstart_b(indicate_seq) needs to been updated */
  1621. if (!check_indicate_seq(preorder_ctrl, pattrib->seq_num)) {
  1622. goto _err_exit;
  1623. }
  1624. /* s3. Insert all packet into Reorder Queue to maintain its ordering. */
  1625. if (!enqueue_reorder_recvframe23a(preorder_ctrl, prframe)) {
  1626. goto _err_exit;
  1627. }
  1628. /* s4. */
  1629. /* Indication process. */
  1630. /* After Packet dropping and Sliding Window shifting as above,
  1631. we can now just indicate the packets */
  1632. /* with the SeqNum smaller than latest WinStart and buffer
  1633. other packets. */
  1634. /* */
  1635. /* For Rx Reorder condition: */
  1636. /* 1. All packets with SeqNum smaller than WinStart => Indicate */
  1637. /* 2. All packets with SeqNum larger than or equal to WinStart =>
  1638. Buffer it. */
  1639. /* */
  1640. if (recv_indicatepkts_in_order(padapter, preorder_ctrl, false) == true) {
  1641. mod_timer(&preorder_ctrl->reordering_ctrl_timer,
  1642. jiffies + msecs_to_jiffies(REORDER_WAIT_TIME));
  1643. spin_unlock_bh(&ppending_recvframe_queue->lock);
  1644. } else {
  1645. spin_unlock_bh(&ppending_recvframe_queue->lock);
  1646. del_timer_sync(&preorder_ctrl->reordering_ctrl_timer);
  1647. }
  1648. return _SUCCESS;
  1649. _err_exit:
  1650. spin_unlock_bh(&ppending_recvframe_queue->lock);
  1651. return _FAIL;
  1652. }
  1653. void rtw_reordering_ctrl_timeout_handler23a(unsigned long pcontext)
  1654. {
  1655. struct recv_reorder_ctrl *preorder_ctrl;
  1656. struct rtw_adapter *padapter;
  1657. struct rtw_queue *ppending_recvframe_queue;
  1658. preorder_ctrl = (struct recv_reorder_ctrl *)pcontext;
  1659. padapter = preorder_ctrl->padapter;
  1660. ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  1661. if (padapter->bDriverStopped || padapter->bSurpriseRemoved) {
  1662. return;
  1663. }
  1664. /* DBG_8723A("+rtw_reordering_ctrl_timeout_handler23a() =>\n"); */
  1665. spin_lock_bh(&ppending_recvframe_queue->lock);
  1666. if (recv_indicatepkts_in_order(padapter, preorder_ctrl, true) == true) {
  1667. mod_timer(&preorder_ctrl->reordering_ctrl_timer,
  1668. jiffies + msecs_to_jiffies(REORDER_WAIT_TIME));
  1669. }
  1670. spin_unlock_bh(&ppending_recvframe_queue->lock);
  1671. }
  1672. int process_recv_indicatepkts(struct rtw_adapter *padapter,
  1673. struct recv_frame *prframe);
  1674. int process_recv_indicatepkts(struct rtw_adapter *padapter,
  1675. struct recv_frame *prframe)
  1676. {
  1677. int retval = _SUCCESS;
  1678. /* struct recv_priv *precvpriv = &padapter->recvpriv; */
  1679. /* struct rx_pkt_attrib *pattrib = &prframe->attrib; */
  1680. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1681. struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  1682. if (phtpriv->ht_option == true) { /* B/G/N Mode */
  1683. /* prframe->preorder_ctrl = &precvpriv->recvreorder_ctrl[pattrib->priority]; */
  1684. /* including perform A-MPDU Rx Ordering Buffer Control */
  1685. if (recv_indicatepkt_reorder(padapter, prframe) != _SUCCESS) {
  1686. if ((padapter->bDriverStopped == false) &&
  1687. (padapter->bSurpriseRemoved == false)) {
  1688. retval = _FAIL;
  1689. return retval;
  1690. }
  1691. }
  1692. } else { /* B/G mode */
  1693. retval = wlanhdr_to_ethhdr(prframe);
  1694. if (retval != _SUCCESS) {
  1695. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1696. "wlanhdr_to_ethhdr: drop pkt\n");
  1697. return retval;
  1698. }
  1699. if ((padapter->bDriverStopped == false) &&
  1700. (padapter->bSurpriseRemoved == false)) {
  1701. /* indicate this recv_frame */
  1702. RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  1703. "@@@@ process_recv_indicatepkts- recv_func recv_indicatepkt\n");
  1704. rtw_recv_indicatepkt23a(padapter, prframe);
  1705. } else {
  1706. RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  1707. "@@@@ process_recv_indicatepkts- recv_func free_indicatepkt\n");
  1708. RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
  1709. "recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n",
  1710. padapter->bDriverStopped,
  1711. padapter->bSurpriseRemoved);
  1712. retval = _FAIL;
  1713. return retval;
  1714. }
  1715. }
  1716. return retval;
  1717. }
  1718. static int recv_func_prehandle(struct rtw_adapter *padapter,
  1719. struct recv_frame *rframe)
  1720. {
  1721. int ret;
  1722. /* check the frame crtl field and decache */
  1723. ret = validate_recv_frame(padapter, rframe);
  1724. if (ret != _SUCCESS) {
  1725. RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
  1726. "recv_func: validate_recv_frame fail! drop pkt\n");
  1727. rtw_free_recvframe23a(rframe);
  1728. goto exit;
  1729. }
  1730. exit:
  1731. return ret;
  1732. }
  1733. static int recv_func_posthandle(struct rtw_adapter *padapter,
  1734. struct recv_frame *prframe)
  1735. {
  1736. int ret = _SUCCESS;
  1737. struct recv_frame *orig_prframe = prframe;
  1738. struct recv_priv *precvpriv = &padapter->recvpriv;
  1739. /* DATA FRAME */
  1740. prframe = decryptor(padapter, prframe);
  1741. if (prframe == NULL) {
  1742. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1743. "decryptor: drop pkt\n");
  1744. ret = _FAIL;
  1745. goto _recv_data_drop;
  1746. }
  1747. prframe = recvframe_chk_defrag23a(padapter, prframe);
  1748. if (!prframe) {
  1749. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1750. "recvframe_chk_defrag23a: drop pkt\n");
  1751. goto _recv_data_drop;
  1752. }
  1753. /*
  1754. * Pull off crypto headers
  1755. */
  1756. if (prframe->attrib.iv_len > 0) {
  1757. skb_pull(prframe->pkt, prframe->attrib.iv_len);
  1758. }
  1759. if (prframe->attrib.icv_len > 0) {
  1760. skb_trim(prframe->pkt,
  1761. prframe->pkt->len - prframe->attrib.icv_len);
  1762. }
  1763. prframe = portctrl(padapter, prframe);
  1764. if (!prframe) {
  1765. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1766. "portctrl: drop pkt\n");
  1767. ret = _FAIL;
  1768. goto _recv_data_drop;
  1769. }
  1770. count_rx_stats(padapter, prframe, NULL);
  1771. ret = process_recv_indicatepkts(padapter, prframe);
  1772. if (ret != _SUCCESS) {
  1773. RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  1774. "recv_func: process_recv_indicatepkts fail!\n");
  1775. rtw_free_recvframe23a(orig_prframe);/* free this recv_frame */
  1776. goto _recv_data_drop;
  1777. }
  1778. return ret;
  1779. _recv_data_drop:
  1780. precvpriv->rx_drop++;
  1781. return ret;
  1782. }
  1783. int rtw_recv_entry23a(struct recv_frame *rframe)
  1784. {
  1785. int ret, r;
  1786. struct rtw_adapter *padapter = rframe->adapter;
  1787. struct rx_pkt_attrib *prxattrib = &rframe->attrib;
  1788. struct recv_priv *recvpriv = &padapter->recvpriv;
  1789. struct security_priv *psecuritypriv = &padapter->securitypriv;
  1790. struct mlme_priv *mlmepriv = &padapter->mlmepriv;
  1791. /* check if need to handle uc_swdec_pending_queue*/
  1792. if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
  1793. psecuritypriv->busetkipkey) {
  1794. struct recv_frame *pending_frame;
  1795. while ((pending_frame = rtw_alloc_recvframe23a(&padapter->recvpriv.uc_swdec_pending_queue))) {
  1796. r = recv_func_posthandle(padapter, pending_frame);
  1797. if (r == _SUCCESS)
  1798. DBG_8723A("%s: dequeue uc_swdec_pending_queue\n", __func__);
  1799. }
  1800. }
  1801. ret = recv_func_prehandle(padapter, rframe);
  1802. if (ret == _SUCCESS) {
  1803. /* check if need to enqueue into uc_swdec_pending_queue*/
  1804. if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
  1805. !is_multicast_ether_addr(prxattrib->ra) &&
  1806. prxattrib->encrypt > 0 &&
  1807. (prxattrib->bdecrypted == 0) &&
  1808. !is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm) &&
  1809. !psecuritypriv->busetkipkey) {
  1810. rtw_enqueue_recvframe23a(rframe, &padapter->recvpriv.uc_swdec_pending_queue);
  1811. DBG_8723A("%s: no key, enqueue uc_swdec_pending_queue\n", __func__);
  1812. goto exit;
  1813. }
  1814. ret = recv_func_posthandle(padapter, rframe);
  1815. recvpriv->rx_pkts++;
  1816. }
  1817. exit:
  1818. return ret;
  1819. }
  1820. void rtw_signal_stat_timer_hdl23a(unsigned long data)
  1821. {
  1822. struct rtw_adapter *adapter = (struct rtw_adapter *)data;
  1823. struct recv_priv *recvpriv = &adapter->recvpriv;
  1824. u32 tmp_s, tmp_q;
  1825. u8 avg_signal_strength = 0;
  1826. u8 avg_signal_qual = 0;
  1827. u32 num_signal_strength = 0;
  1828. u32 num_signal_qual = 0;
  1829. u8 _alpha = 3; /* this value is based on converging_constant = 5000 */
  1830. /* and sampling_interval = 1000 */
  1831. if (recvpriv->signal_strength_data.update_req == 0) {
  1832. /* update_req is clear, means we got rx */
  1833. avg_signal_strength = recvpriv->signal_strength_data.avg_val;
  1834. num_signal_strength = recvpriv->signal_strength_data.total_num;
  1835. /* after avg_vals are acquired, we can re-stat */
  1836. /* the signal values */
  1837. recvpriv->signal_strength_data.update_req = 1;
  1838. }
  1839. if (recvpriv->signal_qual_data.update_req == 0) {
  1840. /* update_req is clear, means we got rx */
  1841. avg_signal_qual = recvpriv->signal_qual_data.avg_val;
  1842. num_signal_qual = recvpriv->signal_qual_data.total_num;
  1843. /* after avg_vals are acquired, we can re-stat */
  1844. /*the signal values */
  1845. recvpriv->signal_qual_data.update_req = 1;
  1846. }
  1847. /* update value of signal_strength, rssi, signal_qual */
  1848. if (!check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY)) {
  1849. tmp_s = avg_signal_strength + (_alpha - 1) *
  1850. recvpriv->signal_strength;
  1851. if (tmp_s %_alpha)
  1852. tmp_s = tmp_s / _alpha + 1;
  1853. else
  1854. tmp_s = tmp_s / _alpha;
  1855. if (tmp_s > 100)
  1856. tmp_s = 100;
  1857. tmp_q = avg_signal_qual + (_alpha - 1) * recvpriv->signal_qual;
  1858. if (tmp_q %_alpha)
  1859. tmp_q = tmp_q / _alpha + 1;
  1860. else
  1861. tmp_q = tmp_q / _alpha;
  1862. if (tmp_q > 100)
  1863. tmp_q = 100;
  1864. recvpriv->signal_strength = tmp_s;
  1865. recvpriv->signal_qual = tmp_q;
  1866. DBG_8723A("%s signal_strength:%3u, signal_qual:%3u, "
  1867. "num_signal_strength:%u, num_signal_qual:%u\n",
  1868. __func__, recvpriv->signal_strength,
  1869. recvpriv->signal_qual, num_signal_strength,
  1870. num_signal_qual);
  1871. }
  1872. rtw_set_signal_stat_timer(recvpriv);
  1873. }