rtw_recv.c 129 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640
  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. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. *
  19. ******************************************************************************/
  20. #define _RTW_RECV_C_
  21. #include <drv_types.h>
  22. #include <hal_data.h>
  23. #if defined(PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  24. #error "Shall be Linux or Windows, but not both!\n"
  25. #endif
  26. #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  27. static void rtw_signal_stat_timer_hdl(struct timer_list *t);
  28. enum {
  29. SIGNAL_STAT_CALC_PROFILE_0 = 0,
  30. SIGNAL_STAT_CALC_PROFILE_1,
  31. SIGNAL_STAT_CALC_PROFILE_MAX
  32. };
  33. u8 signal_stat_calc_profile[SIGNAL_STAT_CALC_PROFILE_MAX][2] = {
  34. {4, 1}, /* Profile 0 => pre_stat : curr_stat = 4 : 1 */
  35. {3, 7} /* Profile 1 => pre_stat : curr_stat = 3 : 7 */
  36. };
  37. #ifndef RTW_SIGNAL_STATE_CALC_PROFILE
  38. #define RTW_SIGNAL_STATE_CALC_PROFILE SIGNAL_STAT_CALC_PROFILE_1
  39. #endif
  40. #endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */
  41. void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv)
  42. {
  43. _rtw_memset((u8 *)psta_recvpriv, 0, sizeof(struct sta_recv_priv));
  44. _rtw_spinlock_init(&psta_recvpriv->lock);
  45. /* for(i=0; i<MAX_RX_NUMBLKS; i++) */
  46. /* _rtw_init_queue(&psta_recvpriv->blk_strms[i]); */
  47. _rtw_init_queue(&psta_recvpriv->defrag_q);
  48. }
  49. sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter)
  50. {
  51. sint i;
  52. union recv_frame *precvframe;
  53. sint res = _SUCCESS;
  54. /* We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). */
  55. /* _rtw_memset((unsigned char *)precvpriv, 0, sizeof (struct recv_priv)); */
  56. _rtw_spinlock_init(&precvpriv->lock);
  57. #ifdef CONFIG_RECV_THREAD_MODE
  58. _rtw_init_sema(&precvpriv->recv_sema, 0);
  59. /*_rtw_init_sema(&precvpriv->terminate_recvthread_sema, 0);*/
  60. _rtw_init_completion(&precvpriv->recvthread_comp);
  61. #endif
  62. _rtw_init_queue(&precvpriv->free_recv_queue);
  63. _rtw_init_queue(&precvpriv->recv_pending_queue);
  64. _rtw_init_queue(&precvpriv->uc_swdec_pending_queue);
  65. precvpriv->adapter = padapter;
  66. precvpriv->free_recvframe_cnt = NR_RECVFRAME;
  67. precvpriv->sink_udpport = 0;
  68. precvpriv->pre_rtp_rxseq = 0;
  69. precvpriv->cur_rtp_rxseq = 0;
  70. #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
  71. precvpriv->store_law_data_flag = 1;
  72. #else
  73. precvpriv->store_law_data_flag = 0;
  74. #endif
  75. rtw_os_recv_resource_init(precvpriv, padapter);
  76. precvpriv->pallocated_frame_buf = rtw_zvmalloc(NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ);
  77. if (precvpriv->pallocated_frame_buf == NULL) {
  78. res = _FAIL;
  79. goto exit;
  80. }
  81. /* _rtw_memset(precvpriv->pallocated_frame_buf, 0, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ); */
  82. precvpriv->precv_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_frame_buf), RXFRAME_ALIGN_SZ);
  83. /* precvpriv->precv_frame_buf = precvpriv->pallocated_frame_buf + RXFRAME_ALIGN_SZ - */
  84. /* ((SIZE_PTR) (precvpriv->pallocated_frame_buf) &(RXFRAME_ALIGN_SZ-1)); */
  85. precvframe = (union recv_frame *) precvpriv->precv_frame_buf;
  86. for (i = 0; i < NR_RECVFRAME ; i++) {
  87. _rtw_init_listhead(&(precvframe->u.list));
  88. rtw_list_insert_tail(&(precvframe->u.list), &(precvpriv->free_recv_queue.queue));
  89. res = rtw_os_recv_resource_alloc(padapter, precvframe);
  90. precvframe->u.hdr.len = 0;
  91. precvframe->u.hdr.adapter = padapter;
  92. precvframe++;
  93. }
  94. #ifdef CONFIG_USB_HCI
  95. ATOMIC_SET(&(precvpriv->rx_pending_cnt), 1);
  96. _rtw_init_sema(&precvpriv->allrxreturnevt, 0);
  97. #endif
  98. res = rtw_hal_init_recv_priv(padapter);
  99. #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  100. rtw_init_timer(&precvpriv->signal_stat_timer, padapter, rtw_signal_stat_timer_hdl);
  101. precvpriv->signal_stat_sampling_interval = 2000; /* ms */
  102. /* precvpriv->signal_stat_converging_constant = 5000; */ /* ms */
  103. rtw_set_signal_stat_timer(precvpriv);
  104. #endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */
  105. exit:
  106. return res;
  107. }
  108. void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv);
  109. void rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv)
  110. {
  111. _rtw_spinlock_free(&precvpriv->lock);
  112. #ifdef CONFIG_RECV_THREAD_MODE
  113. _rtw_free_sema(&precvpriv->recv_sema);
  114. /*_rtw_free_sema(&precvpriv->terminate_recvthread_sema);*/
  115. #endif
  116. _rtw_spinlock_free(&precvpriv->free_recv_queue.lock);
  117. _rtw_spinlock_free(&precvpriv->recv_pending_queue.lock);
  118. _rtw_spinlock_free(&precvpriv->free_recv_buf_queue.lock);
  119. #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
  120. _rtw_spinlock_free(&precvpriv->recv_buf_pending_queue.lock);
  121. #endif /* CONFIG_USE_USB_BUFFER_ALLOC_RX */
  122. }
  123. void _rtw_free_recv_priv(struct recv_priv *precvpriv)
  124. {
  125. _adapter *padapter = precvpriv->adapter;
  126. rtw_free_uc_swdec_pending_queue(padapter);
  127. rtw_mfree_recv_priv_lock(precvpriv);
  128. rtw_os_recv_resource_free(precvpriv);
  129. if (precvpriv->pallocated_frame_buf)
  130. rtw_vmfree(precvpriv->pallocated_frame_buf, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ);
  131. rtw_hal_free_recv_priv(padapter);
  132. }
  133. bool rtw_rframe_del_wfd_ie(union recv_frame *rframe, u8 ies_offset)
  134. {
  135. #define DBG_RFRAME_DEL_WFD_IE 0
  136. u8 *ies = rframe->u.hdr.rx_data + sizeof(struct rtw_ieee80211_hdr_3addr) + ies_offset;
  137. uint ies_len_ori = rframe->u.hdr.len - (ies - rframe->u.hdr.rx_data);
  138. uint ies_len;
  139. ies_len = rtw_del_wfd_ie(ies, ies_len_ori, DBG_RFRAME_DEL_WFD_IE ? __func__ : NULL);
  140. rframe->u.hdr.len -= ies_len_ori - ies_len;
  141. return ies_len_ori != ies_len;
  142. }
  143. union recv_frame *_rtw_alloc_recvframe(_queue *pfree_recv_queue)
  144. {
  145. union recv_frame *precvframe;
  146. _list *plist, *phead;
  147. _adapter *padapter;
  148. struct recv_priv *precvpriv;
  149. if (_rtw_queue_empty(pfree_recv_queue) == _TRUE)
  150. precvframe = NULL;
  151. else {
  152. phead = get_list_head(pfree_recv_queue);
  153. plist = get_next(phead);
  154. precvframe = LIST_CONTAINOR(plist, union recv_frame, u);
  155. rtw_list_delete(&precvframe->u.hdr.list);
  156. padapter = precvframe->u.hdr.adapter;
  157. if (padapter != NULL) {
  158. precvpriv = &padapter->recvpriv;
  159. if (pfree_recv_queue == &precvpriv->free_recv_queue)
  160. precvpriv->free_recvframe_cnt--;
  161. }
  162. }
  163. return precvframe;
  164. }
  165. union recv_frame *rtw_alloc_recvframe(_queue *pfree_recv_queue)
  166. {
  167. _irqL irqL;
  168. union recv_frame *precvframe;
  169. _enter_critical_bh(&pfree_recv_queue->lock, &irqL);
  170. precvframe = _rtw_alloc_recvframe(pfree_recv_queue);
  171. _exit_critical_bh(&pfree_recv_queue->lock, &irqL);
  172. return precvframe;
  173. }
  174. void rtw_init_recvframe(union recv_frame *precvframe, struct recv_priv *precvpriv)
  175. {
  176. /* Perry: This can be removed */
  177. _rtw_init_listhead(&precvframe->u.hdr.list);
  178. precvframe->u.hdr.len = 0;
  179. }
  180. int rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue)
  181. {
  182. _irqL irqL;
  183. _adapter *padapter = precvframe->u.hdr.adapter;
  184. struct recv_priv *precvpriv = &padapter->recvpriv;
  185. #ifdef CONFIG_CONCURRENT_MODE
  186. padapter = GET_PRIMARY_ADAPTER(padapter);
  187. precvpriv = &padapter->recvpriv;
  188. pfree_recv_queue = &precvpriv->free_recv_queue;
  189. precvframe->u.hdr.adapter = padapter;
  190. #endif
  191. rtw_os_free_recvframe(precvframe);
  192. _enter_critical_bh(&pfree_recv_queue->lock, &irqL);
  193. rtw_list_delete(&(precvframe->u.hdr.list));
  194. precvframe->u.hdr.len = 0;
  195. rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(pfree_recv_queue));
  196. if (padapter != NULL) {
  197. if (pfree_recv_queue == &precvpriv->free_recv_queue)
  198. precvpriv->free_recvframe_cnt++;
  199. }
  200. _exit_critical_bh(&pfree_recv_queue->lock, &irqL);
  201. return _SUCCESS;
  202. }
  203. sint _rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue)
  204. {
  205. _adapter *padapter = precvframe->u.hdr.adapter;
  206. struct recv_priv *precvpriv = &padapter->recvpriv;
  207. /* _rtw_init_listhead(&(precvframe->u.hdr.list)); */
  208. rtw_list_delete(&(precvframe->u.hdr.list));
  209. rtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(queue));
  210. if (padapter != NULL) {
  211. if (queue == &precvpriv->free_recv_queue)
  212. precvpriv->free_recvframe_cnt++;
  213. }
  214. return _SUCCESS;
  215. }
  216. sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue)
  217. {
  218. sint ret;
  219. _irqL irqL;
  220. /* _spinlock(&pfree_recv_queue->lock); */
  221. _enter_critical_bh(&queue->lock, &irqL);
  222. ret = _rtw_enqueue_recvframe(precvframe, queue);
  223. /* _rtw_spinunlock(&pfree_recv_queue->lock); */
  224. _exit_critical_bh(&queue->lock, &irqL);
  225. return ret;
  226. }
  227. /*
  228. sint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue)
  229. {
  230. return rtw_free_recvframe(precvframe, queue);
  231. }
  232. */
  233. /*
  234. caller : defrag ; recvframe_chk_defrag in recv_thread (passive)
  235. pframequeue: defrag_queue : will be accessed in recv_thread (passive)
  236. using spinlock to protect
  237. */
  238. void rtw_free_recvframe_queue(_queue *pframequeue, _queue *pfree_recv_queue)
  239. {
  240. union recv_frame *precvframe;
  241. _list *plist, *phead;
  242. _rtw_spinlock(&pframequeue->lock);
  243. phead = get_list_head(pframequeue);
  244. plist = get_next(phead);
  245. while (rtw_end_of_queue_search(phead, plist) == _FALSE) {
  246. precvframe = LIST_CONTAINOR(plist, union recv_frame, u);
  247. plist = get_next(plist);
  248. /* rtw_list_delete(&precvframe->u.hdr.list); */ /* will do this in rtw_free_recvframe() */
  249. rtw_free_recvframe(precvframe, pfree_recv_queue);
  250. }
  251. _rtw_spinunlock(&pframequeue->lock);
  252. }
  253. u32 rtw_free_uc_swdec_pending_queue(_adapter *adapter)
  254. {
  255. u32 cnt = 0;
  256. union recv_frame *pending_frame;
  257. while ((pending_frame = rtw_alloc_recvframe(&adapter->recvpriv.uc_swdec_pending_queue))) {
  258. rtw_free_recvframe(pending_frame, &adapter->recvpriv.free_recv_queue);
  259. cnt++;
  260. }
  261. if (cnt)
  262. RTW_INFO(FUNC_ADPT_FMT" dequeue %d\n", FUNC_ADPT_ARG(adapter), cnt);
  263. return cnt;
  264. }
  265. sint rtw_enqueue_recvbuf_to_head(struct recv_buf *precvbuf, _queue *queue)
  266. {
  267. _irqL irqL;
  268. _enter_critical_bh(&queue->lock, &irqL);
  269. rtw_list_delete(&precvbuf->list);
  270. rtw_list_insert_head(&precvbuf->list, get_list_head(queue));
  271. _exit_critical_bh(&queue->lock, &irqL);
  272. return _SUCCESS;
  273. }
  274. sint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue)
  275. {
  276. _irqL irqL;
  277. #ifdef CONFIG_SDIO_HCI
  278. _enter_critical_bh(&queue->lock, &irqL);
  279. #else
  280. _enter_critical_ex(&queue->lock, &irqL);
  281. #endif/*#ifdef CONFIG_SDIO_HCI*/
  282. rtw_list_delete(&precvbuf->list);
  283. rtw_list_insert_tail(&precvbuf->list, get_list_head(queue));
  284. #ifdef CONFIG_SDIO_HCI
  285. _exit_critical_bh(&queue->lock, &irqL);
  286. #else
  287. _exit_critical_ex(&queue->lock, &irqL);
  288. #endif/*#ifdef CONFIG_SDIO_HCI*/
  289. return _SUCCESS;
  290. }
  291. struct recv_buf *rtw_dequeue_recvbuf(_queue *queue)
  292. {
  293. _irqL irqL;
  294. struct recv_buf *precvbuf;
  295. _list *plist, *phead;
  296. #ifdef CONFIG_SDIO_HCI
  297. _enter_critical_bh(&queue->lock, &irqL);
  298. #else
  299. _enter_critical_ex(&queue->lock, &irqL);
  300. #endif/*#ifdef CONFIG_SDIO_HCI*/
  301. if (_rtw_queue_empty(queue) == _TRUE)
  302. precvbuf = NULL;
  303. else {
  304. phead = get_list_head(queue);
  305. plist = get_next(phead);
  306. precvbuf = LIST_CONTAINOR(plist, struct recv_buf, list);
  307. rtw_list_delete(&precvbuf->list);
  308. }
  309. #ifdef CONFIG_SDIO_HCI
  310. _exit_critical_bh(&queue->lock, &irqL);
  311. #else
  312. _exit_critical_ex(&queue->lock, &irqL);
  313. #endif/*#ifdef CONFIG_SDIO_HCI*/
  314. return precvbuf;
  315. }
  316. sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe);
  317. sint recvframe_chkmic(_adapter *adapter, union recv_frame *precvframe)
  318. {
  319. sint i, res = _SUCCESS;
  320. u32 datalen;
  321. u8 miccode[8];
  322. u8 bmic_err = _FALSE, brpt_micerror = _TRUE;
  323. u8 *pframe, *payload, *pframemic;
  324. u8 *mickey;
  325. /* u8 *iv,rxdata_key_idx=0; */
  326. struct sta_info *stainfo;
  327. struct rx_pkt_attrib *prxattrib = &precvframe->u.hdr.attrib;
  328. struct security_priv *psecuritypriv = &adapter->securitypriv;
  329. struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  330. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  331. stainfo = rtw_get_stainfo(&adapter->stapriv , &prxattrib->ta[0]);
  332. if (prxattrib->encrypt == _TKIP_) {
  333. /* calculate mic code */
  334. if (stainfo != NULL) {
  335. if (IS_MCAST(prxattrib->ra)) {
  336. /* mickey=&psecuritypriv->dot118021XGrprxmickey.skey[0]; */
  337. /* iv = precvframe->u.hdr.rx_data+prxattrib->hdrlen; */
  338. /* rxdata_key_idx =( ((iv[3])>>6)&0x3) ; */
  339. mickey = &psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0];
  340. /* RTW_INFO("\n recvframe_chkmic: bcmc key psecuritypriv->dot118021XGrpKeyid(%d),pmlmeinfo->key_index(%d) ,recv key_id(%d)\n", */
  341. /* psecuritypriv->dot118021XGrpKeyid,pmlmeinfo->key_index,rxdata_key_idx); */
  342. if (psecuritypriv->binstallGrpkey == _FALSE) {
  343. res = _FAIL;
  344. RTW_INFO("\n recvframe_chkmic:didn't install group key!!!!!!!!!!\n");
  345. goto exit;
  346. }
  347. } else {
  348. mickey = &stainfo->dot11tkiprxmickey.skey[0];
  349. }
  350. datalen = precvframe->u.hdr.len - prxattrib->hdrlen - prxattrib->iv_len - prxattrib->icv_len - 8; /* icv_len included the mic code */
  351. pframe = precvframe->u.hdr.rx_data;
  352. payload = pframe + prxattrib->hdrlen + prxattrib->iv_len;
  353. /* rtw_seccalctkipmic(&stainfo->dot11tkiprxmickey.skey[0],pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); */ /* care the length of the data */
  354. rtw_seccalctkipmic(mickey, pframe, payload, datalen , &miccode[0], (unsigned char)prxattrib->priority); /* care the length of the data */
  355. pframemic = payload + datalen;
  356. bmic_err = _FALSE;
  357. for (i = 0; i < 8; i++) {
  358. if (miccode[i] != *(pframemic + i)) {
  359. bmic_err = _TRUE;
  360. }
  361. }
  362. if (bmic_err == _TRUE) {
  363. /* double check key_index for some timing issue , */
  364. /* cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue */
  365. if ((IS_MCAST(prxattrib->ra) == _TRUE) && (prxattrib->key_index != pmlmeinfo->key_index))
  366. brpt_micerror = _FALSE;
  367. if ((prxattrib->bdecrypted == _TRUE) && (brpt_micerror == _TRUE)) {
  368. rtw_handle_tkip_mic_err(adapter, stainfo, (u8)IS_MCAST(prxattrib->ra));
  369. RTW_INFO(" mic error :prxattrib->bdecrypted=%d\n", prxattrib->bdecrypted);
  370. } else {
  371. RTW_INFO(" mic error :prxattrib->bdecrypted=%d\n", prxattrib->bdecrypted);
  372. }
  373. res = _FAIL;
  374. } else {
  375. /* mic checked ok */
  376. if ((psecuritypriv->bcheck_grpkey == _FALSE) && (IS_MCAST(prxattrib->ra) == _TRUE)) {
  377. psecuritypriv->bcheck_grpkey = _TRUE;
  378. }
  379. }
  380. }
  381. recvframe_pull_tail(precvframe, 8);
  382. }
  383. exit:
  384. return res;
  385. }
  386. /*#define DBG_RX_SW_DECRYPTOR*/
  387. /* decrypt and set the ivlen,icvlen of the recv_frame */
  388. union recv_frame *decryptor(_adapter *padapter, union recv_frame *precv_frame);
  389. union recv_frame *decryptor(_adapter *padapter, union recv_frame *precv_frame)
  390. {
  391. struct rx_pkt_attrib *prxattrib = &precv_frame->u.hdr.attrib;
  392. struct security_priv *psecuritypriv = &padapter->securitypriv;
  393. union recv_frame *return_packet = precv_frame;
  394. u32 res = _SUCCESS;
  395. DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt);
  396. if (prxattrib->encrypt > 0) {
  397. u8 *iv = precv_frame->u.hdr.rx_data + prxattrib->hdrlen;
  398. prxattrib->key_index = (((iv[3]) >> 6) & 0x3) ;
  399. if (prxattrib->key_index > WEP_KEYS) {
  400. RTW_INFO("prxattrib->key_index(%d) > WEP_KEYS\n", prxattrib->key_index);
  401. switch (prxattrib->encrypt) {
  402. case _WEP40_:
  403. case _WEP104_:
  404. prxattrib->key_index = psecuritypriv->dot11PrivacyKeyIndex;
  405. break;
  406. case _TKIP_:
  407. case _AES_:
  408. default:
  409. prxattrib->key_index = psecuritypriv->dot118021XGrpKeyid;
  410. break;
  411. }
  412. }
  413. }
  414. if ((prxattrib->encrypt > 0) && ((prxattrib->bdecrypted == 0) || (psecuritypriv->sw_decrypt == _TRUE))) {
  415. #ifdef CONFIG_CONCURRENT_MODE
  416. if (!IS_MCAST(prxattrib->ra)) /* bc/mc packets use sw decryption for concurrent mode */
  417. #endif
  418. psecuritypriv->hw_decrypted = _FALSE;
  419. #ifdef DBG_RX_SW_DECRYPTOR
  420. RTW_INFO(ADPT_FMT" - sec_type:%s DO SW decryption\n",
  421. ADPT_ARG(padapter), security_type_str(prxattrib->encrypt));
  422. #endif
  423. #ifdef DBG_RX_DECRYPTOR
  424. RTW_INFO("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n",
  425. __FUNCTION__,
  426. __LINE__,
  427. prxattrib->bdecrypted,
  428. prxattrib->encrypt,
  429. psecuritypriv->hw_decrypted);
  430. #endif
  431. switch (prxattrib->encrypt) {
  432. case _WEP40_:
  433. case _WEP104_:
  434. DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wep);
  435. rtw_wep_decrypt(padapter, (u8 *)precv_frame);
  436. break;
  437. case _TKIP_:
  438. DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_tkip);
  439. res = rtw_tkip_decrypt(padapter, (u8 *)precv_frame);
  440. break;
  441. case _AES_:
  442. DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_aes);
  443. res = rtw_aes_decrypt(padapter, (u8 *)precv_frame);
  444. break;
  445. #ifdef CONFIG_WAPI_SUPPORT
  446. case _SMS4_:
  447. DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wapi);
  448. rtw_sms4_decrypt(padapter, (u8 *)precv_frame);
  449. break;
  450. #endif
  451. default:
  452. break;
  453. }
  454. } else if (prxattrib->bdecrypted == 1
  455. && prxattrib->encrypt > 0
  456. && (psecuritypriv->busetkipkey == 1 || prxattrib->encrypt != _TKIP_)
  457. ) {
  458. #if 0
  459. if ((prxstat->icv == 1) && (prxattrib->encrypt != _AES_)) {
  460. psecuritypriv->hw_decrypted = _FALSE;
  461. rtw_free_recvframe(precv_frame, &padapter->recvpriv.free_recv_queue);
  462. return_packet = NULL;
  463. } else
  464. #endif
  465. {
  466. DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_hw);
  467. psecuritypriv->hw_decrypted = _TRUE;
  468. #ifdef DBG_RX_DECRYPTOR
  469. RTW_INFO("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n",
  470. __FUNCTION__,
  471. __LINE__,
  472. prxattrib->bdecrypted,
  473. prxattrib->encrypt,
  474. psecuritypriv->hw_decrypted);
  475. #endif
  476. }
  477. } else {
  478. DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_unknown);
  479. #ifdef DBG_RX_DECRYPTOR
  480. RTW_INFO("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n",
  481. __FUNCTION__,
  482. __LINE__,
  483. prxattrib->bdecrypted,
  484. prxattrib->encrypt,
  485. psecuritypriv->hw_decrypted);
  486. #endif
  487. }
  488. if (res == _FAIL) {
  489. rtw_free_recvframe(return_packet, &padapter->recvpriv.free_recv_queue);
  490. return_packet = NULL;
  491. } else
  492. prxattrib->bdecrypted = _TRUE;
  493. /* recvframe_chkmic(adapter, precv_frame); */ /* move to recvframme_defrag function */
  494. return return_packet;
  495. }
  496. /* ###set the security information in the recv_frame */
  497. union recv_frame *portctrl(_adapter *adapter, union recv_frame *precv_frame);
  498. union recv_frame *portctrl(_adapter *adapter, union recv_frame *precv_frame)
  499. {
  500. u8 *psta_addr = NULL;
  501. u8 *ptr;
  502. uint auth_alg;
  503. struct recv_frame_hdr *pfhdr;
  504. struct sta_info *psta;
  505. struct sta_priv *pstapriv ;
  506. union recv_frame *prtnframe;
  507. u16 ether_type = 0;
  508. u16 eapol_type = 0x888e;/* for Funia BD's WPA issue */
  509. struct rx_pkt_attrib *pattrib;
  510. pstapriv = &adapter->stapriv;
  511. auth_alg = adapter->securitypriv.dot11AuthAlgrthm;
  512. ptr = get_recvframe_data(precv_frame);
  513. pfhdr = &precv_frame->u.hdr;
  514. pattrib = &pfhdr->attrib;
  515. psta_addr = pattrib->ta;
  516. prtnframe = NULL;
  517. psta = rtw_get_stainfo(pstapriv, psta_addr);
  518. if (auth_alg == dot11AuthAlgrthm_8021X) {
  519. if ((psta != NULL) && (psta->ieee8021x_blocked)) {
  520. /* blocked */
  521. /* only accept EAPOL frame */
  522. prtnframe = precv_frame;
  523. /* get ether_type */
  524. ptr = ptr + pfhdr->attrib.hdrlen + pfhdr->attrib.iv_len + LLC_HEADER_SIZE;
  525. _rtw_memcpy(&ether_type, ptr, 2);
  526. ether_type = ntohs((unsigned short)ether_type);
  527. if (ether_type == eapol_type)
  528. prtnframe = precv_frame;
  529. else {
  530. /* free this frame */
  531. rtw_free_recvframe(precv_frame, &adapter->recvpriv.free_recv_queue);
  532. prtnframe = NULL;
  533. }
  534. } else {
  535. /* allowed */
  536. /* check decryption status, and decrypt the frame if needed */
  537. prtnframe = precv_frame;
  538. /* check is the EAPOL frame or not (Rekey) */
  539. /* if(ether_type == eapol_type){ */
  540. /* check Rekey */
  541. /* prtnframe=precv_frame; */
  542. /* } */
  543. }
  544. } else
  545. prtnframe = precv_frame;
  546. return prtnframe;
  547. }
  548. sint recv_decache(union recv_frame *precv_frame, u8 bretry, struct stainfo_rxcache *prxcache);
  549. sint recv_decache(union recv_frame *precv_frame, u8 bretry, struct stainfo_rxcache *prxcache)
  550. {
  551. sint tid = precv_frame->u.hdr.attrib.priority;
  552. u16 seq_ctrl = ((precv_frame->u.hdr.attrib.seq_num & 0xffff) << 4) |
  553. (precv_frame->u.hdr.attrib.frag_num & 0xf);
  554. if (tid > 15) {
  555. return _FAIL;
  556. }
  557. if (1) { /* if(bretry) */
  558. if (seq_ctrl == prxcache->tid_rxseq[tid]) {
  559. /* for non-AMPDU case */
  560. precv_frame->u.hdr.psta->sta_stats.duplicate_cnt++;
  561. if (precv_frame->u.hdr.psta->sta_stats.duplicate_cnt % 100 == 0)
  562. RTW_INFO("%s: seq=%d\n", __func__, precv_frame->u.hdr.attrib.seq_num);
  563. return _FAIL;
  564. }
  565. }
  566. prxcache->tid_rxseq[tid] = seq_ctrl;
  567. return _SUCCESS;
  568. }
  569. void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame);
  570. void process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame)
  571. {
  572. #ifdef CONFIG_AP_MODE
  573. unsigned char pwrbit;
  574. u8 *ptr = precv_frame->u.hdr.rx_data;
  575. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  576. struct sta_priv *pstapriv = &padapter->stapriv;
  577. struct sta_info *psta = NULL;
  578. psta = rtw_get_stainfo(pstapriv, pattrib->src);
  579. pwrbit = GetPwrMgt(ptr);
  580. if (psta) {
  581. if (pwrbit) {
  582. if (!(psta->state & WIFI_SLEEP_STATE)) {
  583. /* psta->state |= WIFI_SLEEP_STATE; */
  584. /* pstapriv->sta_dz_bitmap |= BIT(psta->aid); */
  585. stop_sta_xmit(padapter, psta);
  586. /* RTW_INFO("to sleep, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); */
  587. }
  588. } else {
  589. if (psta->state & WIFI_SLEEP_STATE) {
  590. /* psta->state ^= WIFI_SLEEP_STATE; */
  591. /* pstapriv->sta_dz_bitmap &= ~BIT(psta->aid); */
  592. wakeup_sta_to_xmit(padapter, psta);
  593. /* RTW_INFO("to wakeup, sta_dz_bitmap=%x\n", pstapriv->sta_dz_bitmap); */
  594. }
  595. }
  596. }
  597. #endif
  598. }
  599. void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame);
  600. void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame)
  601. {
  602. #ifdef CONFIG_AP_MODE
  603. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  604. struct sta_priv *pstapriv = &padapter->stapriv;
  605. struct sta_info *psta = NULL;
  606. psta = rtw_get_stainfo(pstapriv, pattrib->src);
  607. if (!psta)
  608. return;
  609. #ifdef CONFIG_TDLS
  610. if (!(psta->tdls_sta_state & TDLS_LINKED_STATE)) {
  611. #endif /* CONFIG_TDLS */
  612. if (!psta->qos_option)
  613. return;
  614. if (!(psta->qos_info & 0xf))
  615. return;
  616. #ifdef CONFIG_TDLS
  617. }
  618. #endif /* CONFIG_TDLS */
  619. if (psta->state & WIFI_SLEEP_STATE) {
  620. u8 wmmps_ac = 0;
  621. switch (pattrib->priority) {
  622. case 1:
  623. case 2:
  624. wmmps_ac = psta->uapsd_bk & BIT(1);
  625. break;
  626. case 4:
  627. case 5:
  628. wmmps_ac = psta->uapsd_vi & BIT(1);
  629. break;
  630. case 6:
  631. case 7:
  632. wmmps_ac = psta->uapsd_vo & BIT(1);
  633. break;
  634. case 0:
  635. case 3:
  636. default:
  637. wmmps_ac = psta->uapsd_be & BIT(1);
  638. break;
  639. }
  640. if (wmmps_ac) {
  641. if (psta->sleepq_ac_len > 0) {
  642. /* process received triggered frame */
  643. xmit_delivery_enabled_frames(padapter, psta);
  644. } else {
  645. /* issue one qos null frame with More data bit = 0 and the EOSP bit set (=1) */
  646. issue_qos_nulldata(padapter, psta->hwaddr, (u16)pattrib->priority, 0, 0);
  647. }
  648. }
  649. }
  650. #endif
  651. }
  652. #ifdef CONFIG_TDLS
  653. sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame)
  654. {
  655. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  656. sint ret = _SUCCESS;
  657. u8 *paction = get_recvframe_data(precv_frame);
  658. u8 category_field = 1;
  659. #ifdef CONFIG_WFD
  660. u8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a };
  661. #endif /* CONFIG_WFD */
  662. struct tdls_info *ptdlsinfo = &(adapter->tdlsinfo);
  663. /* point to action field */
  664. paction += pattrib->hdrlen
  665. + pattrib->iv_len
  666. + SNAP_SIZE
  667. + ETH_TYPE_LEN
  668. + PAYLOAD_TYPE_LEN
  669. + category_field;
  670. RTW_INFO("[TDLS] Recv %s from "MAC_FMT" with SeqNum = %d\n", rtw_tdls_action_txt(*paction), MAC_ARG(pattrib->src), GetSequence(get_recvframe_data(precv_frame)));
  671. if (hal_chk_wl_func(adapter, WL_FUNC_TDLS) == _FALSE) {
  672. RTW_INFO("Ignore tdls frame since hal doesn't support tdls\n");
  673. ret = _FAIL;
  674. return ret;
  675. }
  676. if (ptdlsinfo->tdls_enable == _FALSE) {
  677. RTW_INFO("recv tdls frame, "
  678. "but tdls haven't enabled\n");
  679. ret = _FAIL;
  680. return ret;
  681. }
  682. switch (*paction) {
  683. case TDLS_SETUP_REQUEST:
  684. ret = On_TDLS_Setup_Req(adapter, precv_frame);
  685. break;
  686. case TDLS_SETUP_RESPONSE:
  687. ret = On_TDLS_Setup_Rsp(adapter, precv_frame);
  688. break;
  689. case TDLS_SETUP_CONFIRM:
  690. ret = On_TDLS_Setup_Cfm(adapter, precv_frame);
  691. break;
  692. case TDLS_TEARDOWN:
  693. ret = On_TDLS_Teardown(adapter, precv_frame);
  694. break;
  695. case TDLS_DISCOVERY_REQUEST:
  696. ret = On_TDLS_Dis_Req(adapter, precv_frame);
  697. break;
  698. case TDLS_PEER_TRAFFIC_INDICATION:
  699. ret = On_TDLS_Peer_Traffic_Indication(adapter, precv_frame);
  700. break;
  701. case TDLS_PEER_TRAFFIC_RESPONSE:
  702. ret = On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame);
  703. break;
  704. #ifdef CONFIG_TDLS_CH_SW
  705. case TDLS_CHANNEL_SWITCH_REQUEST:
  706. ret = On_TDLS_Ch_Switch_Req(adapter, precv_frame);
  707. break;
  708. case TDLS_CHANNEL_SWITCH_RESPONSE:
  709. ret = On_TDLS_Ch_Switch_Rsp(adapter, precv_frame);
  710. break;
  711. #endif
  712. #ifdef CONFIG_WFD
  713. /* First byte of WFA OUI */
  714. case 0x50:
  715. if (_rtw_memcmp(WFA_OUI, paction, 3)) {
  716. /* Probe request frame */
  717. if (*(paction + 3) == 0x04) {
  718. /* WFDTDLS: for sigma test, do not setup direct link automatically */
  719. ptdlsinfo->dev_discovered = _TRUE;
  720. RTW_INFO("recv tunneled probe request frame\n");
  721. issue_tunneled_probe_rsp(adapter, precv_frame);
  722. }
  723. /* Probe response frame */
  724. if (*(paction + 3) == 0x05) {
  725. /* WFDTDLS: for sigma test, do not setup direct link automatically */
  726. ptdlsinfo->dev_discovered = _TRUE;
  727. RTW_INFO("recv tunneled probe response frame\n");
  728. }
  729. }
  730. break;
  731. #endif /* CONFIG_WFD */
  732. default:
  733. RTW_INFO("receive TDLS frame %d but not support\n", *paction);
  734. ret = _FAIL;
  735. break;
  736. }
  737. exit:
  738. return ret;
  739. }
  740. #endif /* CONFIG_TDLS */
  741. void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_info *sta);
  742. void count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_info *sta)
  743. {
  744. int sz;
  745. struct sta_info *psta = NULL;
  746. struct stainfo_stats *pstats = NULL;
  747. struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  748. struct recv_priv *precvpriv = &padapter->recvpriv;
  749. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  750. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  751. sz = get_recvframe_len(prframe);
  752. precvpriv->rx_bytes += sz;
  753. padapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++;
  754. if ((!MacAddr_isBcst(pattrib->dst)) && (!IS_MCAST(pattrib->dst)))
  755. padapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++;
  756. if (sta)
  757. psta = sta;
  758. else
  759. psta = prframe->u.hdr.psta;
  760. if (psta) {
  761. pstats = &psta->sta_stats;
  762. pstats->rx_data_pkts++;
  763. pstats->rx_bytes += sz;
  764. pstats->rxratecnt[pattrib->data_rate]++;
  765. /*record rx packets for every tid*/
  766. pstats->rx_data_qos_pkts[pattrib->priority]++;
  767. #ifdef CONFIG_TDLS
  768. if (psta->tdls_sta_state & TDLS_LINKED_STATE) {
  769. struct sta_info *pap_sta = NULL;
  770. pap_sta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
  771. if (pap_sta) {
  772. pstats = &pap_sta->sta_stats;
  773. pstats->rx_data_pkts++;
  774. pstats->rx_bytes += sz;
  775. }
  776. }
  777. #endif /* CONFIG_TDLS */
  778. }
  779. #ifdef CONFIG_CHECK_LEAVE_LPS
  780. traffic_check_for_leave_lps(padapter, _FALSE, 0);
  781. #endif /* CONFIG_LPS */
  782. }
  783. sint sta2sta_data_frame(
  784. _adapter *adapter,
  785. union recv_frame *precv_frame,
  786. struct sta_info **psta
  787. );
  788. sint sta2sta_data_frame(
  789. _adapter *adapter,
  790. union recv_frame *precv_frame,
  791. struct sta_info **psta
  792. )
  793. {
  794. u8 *ptr = precv_frame->u.hdr.rx_data;
  795. sint ret = _SUCCESS;
  796. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  797. struct sta_priv *pstapriv = &adapter->stapriv;
  798. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  799. u8 *mybssid = get_bssid(pmlmepriv);
  800. u8 *myhwaddr = adapter_mac_addr(adapter);
  801. u8 *sta_addr = NULL;
  802. sint bmcast = IS_MCAST(pattrib->dst);
  803. #ifdef CONFIG_TDLS
  804. struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
  805. #ifdef CONFIG_TDLS_CH_SW
  806. struct tdls_ch_switch *pchsw_info = &ptdlsinfo->chsw_info;
  807. #endif
  808. struct sta_info *ptdls_sta = NULL;
  809. u8 *psnap_type = ptr + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE;
  810. /* frame body located after [+2]: ether-type, [+1]: payload type */
  811. u8 *pframe_body = psnap_type + 2 + 1;
  812. #endif
  813. /* RTW_INFO("[%s] %d, seqnum:%d\n", __FUNCTION__, __LINE__, pattrib->seq_num); */
  814. if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
  815. (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
  816. /* filter packets that SA is myself or multicast or broadcast */
  817. if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)) {
  818. ret = _FAIL;
  819. goto exit;
  820. }
  821. if ((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) {
  822. ret = _FAIL;
  823. goto exit;
  824. }
  825. if (_rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  826. _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  827. (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN))) {
  828. ret = _FAIL;
  829. goto exit;
  830. }
  831. sta_addr = pattrib->src;
  832. } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) {
  833. #ifdef CONFIG_TDLS
  834. /* direct link data transfer */
  835. if (ptdlsinfo->link_established == _TRUE) {
  836. ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src);
  837. if (ptdls_sta == NULL) {
  838. ret = _FAIL;
  839. goto exit;
  840. } else if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {
  841. /* filter packets that SA is myself or multicast or broadcast */
  842. if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)) {
  843. ret = _FAIL;
  844. goto exit;
  845. }
  846. /* da should be for me */
  847. if ((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) {
  848. ret = _FAIL;
  849. goto exit;
  850. }
  851. /* check BSSID */
  852. if (_rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  853. _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  854. (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN))) {
  855. ret = _FAIL;
  856. goto exit;
  857. }
  858. #ifdef CONFIG_TDLS_CH_SW
  859. if (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) {
  860. if (adapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(adapter)) {
  861. pchsw_info->ch_sw_state |= TDLS_PEER_AT_OFF_STATE;
  862. if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE))
  863. _cancel_timer_ex(&ptdls_sta->ch_sw_timer);
  864. /* On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); */
  865. }
  866. }
  867. #endif
  868. /* process UAPSD tdls sta */
  869. process_pwrbit_data(adapter, precv_frame);
  870. /* if NULL-frame, check pwrbit */
  871. if ((get_frame_sub_type(ptr) & WIFI_DATA_NULL) == WIFI_DATA_NULL) {
  872. /* NULL-frame with pwrbit=1, buffer_STA should buffer frames for sleep_STA */
  873. if (GetPwrMgt(ptr)) {
  874. /* it would be triggered when we are off channel and receiving NULL DATA */
  875. /* we can confirm that peer STA is at off channel */
  876. RTW_INFO("TDLS: recv peer null frame with pwr bit 1\n");
  877. /* ptdls_sta->tdls_sta_state|=TDLS_PEER_SLEEP_STATE; */
  878. }
  879. /* TODO: Updated BSSID's seq. */
  880. /* RTW_INFO("drop Null Data\n"); */
  881. ptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE);
  882. ret = _FAIL;
  883. goto exit;
  884. }
  885. /* receive some of all TDLS management frames, process it at ON_TDLS */
  886. if (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2)) {
  887. ret = OnTDLS(adapter, precv_frame);
  888. goto exit;
  889. }
  890. if ((get_frame_sub_type(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE)
  891. process_wmmps_data(adapter, precv_frame);
  892. ptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE);
  893. }
  894. sta_addr = pattrib->src;
  895. } else
  896. #endif /* CONFIG_TDLS */
  897. {
  898. /* For Station mode, sa and bssid should always be BSSID, and DA is my mac-address */
  899. if (!_rtw_memcmp(pattrib->bssid, pattrib->src, ETH_ALEN)) {
  900. ret = _FAIL;
  901. goto exit;
  902. }
  903. sta_addr = pattrib->bssid;
  904. }
  905. } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) {
  906. if (bmcast) {
  907. /* For AP mode, if DA == MCAST, then BSSID should be also MCAST */
  908. if (!IS_MCAST(pattrib->bssid)) {
  909. ret = _FAIL;
  910. goto exit;
  911. }
  912. } else { /* not mc-frame */
  913. /* For AP mode, if DA is non-MCAST, then it must be BSSID, and bssid == BSSID */
  914. if (!_rtw_memcmp(pattrib->bssid, pattrib->dst, ETH_ALEN)) {
  915. ret = _FAIL;
  916. goto exit;
  917. }
  918. sta_addr = pattrib->src;
  919. }
  920. } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) {
  921. _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);
  922. _rtw_memcpy(pattrib->src, get_addr2_ptr(ptr), ETH_ALEN);
  923. _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);
  924. _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  925. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  926. sta_addr = mybssid;
  927. } else
  928. ret = _FAIL;
  929. if (bmcast)
  930. *psta = rtw_get_bcmc_stainfo(adapter);
  931. else
  932. *psta = rtw_get_stainfo(pstapriv, sta_addr); /* get ap_info */
  933. #ifdef CONFIG_TDLS
  934. if (ptdls_sta != NULL)
  935. *psta = ptdls_sta;
  936. #endif /* CONFIG_TDLS */
  937. if (*psta == NULL) {
  938. #ifdef CONFIG_MP_INCLUDED
  939. if (adapter->registrypriv.mp_mode == 1) {
  940. if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
  941. adapter->mppriv.rx_pktloss++;
  942. }
  943. #endif
  944. ret = _FAIL;
  945. goto exit;
  946. }
  947. exit:
  948. return ret;
  949. }
  950. sint ap2sta_data_frame(
  951. _adapter *adapter,
  952. union recv_frame *precv_frame,
  953. struct sta_info **psta);
  954. sint ap2sta_data_frame(
  955. _adapter *adapter,
  956. union recv_frame *precv_frame,
  957. struct sta_info **psta)
  958. {
  959. u8 *ptr = precv_frame->u.hdr.rx_data;
  960. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  961. sint ret = _SUCCESS;
  962. struct sta_priv *pstapriv = &adapter->stapriv;
  963. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  964. u8 *mybssid = get_bssid(pmlmepriv);
  965. u8 *myhwaddr = adapter_mac_addr(adapter);
  966. sint bmcast = IS_MCAST(pattrib->dst);
  967. if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  968. && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE
  969. || check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)
  970. ) {
  971. /* filter packets that SA is myself or multicast or broadcast */
  972. if (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)) {
  973. #ifdef DBG_RX_DROP_FRAME
  974. RTW_INFO("DBG_RX_DROP_FRAME %s SA="MAC_FMT", myhwaddr="MAC_FMT"\n",
  975. __FUNCTION__, MAC_ARG(pattrib->src), MAC_ARG(myhwaddr));
  976. #endif
  977. ret = _FAIL;
  978. goto exit;
  979. }
  980. /* da should be for me */
  981. if ((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) {
  982. #ifdef DBG_RX_DROP_FRAME
  983. RTW_INFO("DBG_RX_DROP_FRAME %s DA="MAC_FMT"\n", __func__, MAC_ARG(pattrib->dst));
  984. #endif
  985. ret = _FAIL;
  986. goto exit;
  987. }
  988. /* check BSSID */
  989. if (_rtw_memcmp(pattrib->bssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  990. _rtw_memcmp(mybssid, "\x0\x0\x0\x0\x0\x0", ETH_ALEN) ||
  991. (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN))) {
  992. #ifdef DBG_RX_DROP_FRAME
  993. RTW_INFO("DBG_RX_DROP_FRAME %s BSSID="MAC_FMT", mybssid="MAC_FMT"\n",
  994. __func__, MAC_ARG(pattrib->bssid), MAC_ARG(mybssid));
  995. #endif
  996. if (!bmcast) {
  997. RTW_INFO(ADPT_FMT" -issue_deauth to the nonassociated ap=" MAC_FMT " for the reason(7)\n", ADPT_ARG(adapter), MAC_ARG(pattrib->bssid));
  998. issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  999. }
  1000. ret = _FAIL;
  1001. goto exit;
  1002. }
  1003. if (bmcast)
  1004. *psta = rtw_get_bcmc_stainfo(adapter);
  1005. else
  1006. *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get ap_info */
  1007. if (*psta == NULL) {
  1008. #ifdef DBG_RX_DROP_FRAME
  1009. RTW_INFO("DBG_RX_DROP_FRAME %s can't get psta under STATION_MODE ; drop pkt\n", __FUNCTION__);
  1010. #endif
  1011. ret = _FAIL;
  1012. goto exit;
  1013. }
  1014. /*if ((get_frame_sub_type(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) {
  1015. }
  1016. */
  1017. if (get_frame_sub_type(ptr) & BIT(6)) {
  1018. /* No data, will not indicate to upper layer, temporily count it here */
  1019. count_rx_stats(adapter, precv_frame, *psta);
  1020. ret = RTW_RX_HANDLED;
  1021. goto exit;
  1022. }
  1023. } else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) &&
  1024. (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) {
  1025. _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);
  1026. _rtw_memcpy(pattrib->src, get_addr2_ptr(ptr), ETH_ALEN);
  1027. _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);
  1028. _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  1029. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1030. *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get sta_info */
  1031. if (*psta == NULL) {
  1032. #ifdef DBG_RX_DROP_FRAME
  1033. RTW_INFO("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__);
  1034. #endif
  1035. ret = _FAIL;
  1036. goto exit;
  1037. }
  1038. } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) {
  1039. /* Special case */
  1040. ret = RTW_RX_HANDLED;
  1041. goto exit;
  1042. } else {
  1043. if (_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN) && (!bmcast)) {
  1044. *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get sta_info */
  1045. if (*psta == NULL) {
  1046. /* for AP multicast issue , modify by yiwei */
  1047. static u32 send_issue_deauth_time = 0;
  1048. /* RTW_INFO("After send deauth , %u ms has elapsed.\n", rtw_get_passing_time_ms(send_issue_deauth_time)); */
  1049. if (rtw_get_passing_time_ms(send_issue_deauth_time) > 10000 || send_issue_deauth_time == 0) {
  1050. send_issue_deauth_time = rtw_get_current_time();
  1051. RTW_INFO("issue_deauth to the ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid));
  1052. issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  1053. }
  1054. }
  1055. }
  1056. ret = _FAIL;
  1057. #ifdef DBG_RX_DROP_FRAME
  1058. RTW_INFO("DBG_RX_DROP_FRAME %s fw_state:0x%x\n", __FUNCTION__, get_fwstate(pmlmepriv));
  1059. #endif
  1060. }
  1061. exit:
  1062. return ret;
  1063. }
  1064. sint sta2ap_data_frame(
  1065. _adapter *adapter,
  1066. union recv_frame *precv_frame,
  1067. struct sta_info **psta);
  1068. sint sta2ap_data_frame(
  1069. _adapter *adapter,
  1070. union recv_frame *precv_frame,
  1071. struct sta_info **psta)
  1072. {
  1073. u8 *ptr = precv_frame->u.hdr.rx_data;
  1074. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  1075. struct sta_priv *pstapriv = &adapter->stapriv;
  1076. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  1077. unsigned char *mybssid = get_bssid(pmlmepriv);
  1078. sint ret = _SUCCESS;
  1079. if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) {
  1080. /* For AP mode, RA=BSSID, TX=STA(SRC_ADDR), A3=DST_ADDR */
  1081. if (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) {
  1082. ret = _FAIL;
  1083. goto exit;
  1084. }
  1085. *psta = rtw_get_stainfo(pstapriv, pattrib->src);
  1086. if (*psta == NULL) {
  1087. #ifdef CONFIG_DFS_MASTER
  1088. struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
  1089. /* prevent RX tasklet blocks cmd_thread */
  1090. if (rfctl->radar_detected == 1)
  1091. goto bypass_deauth7;
  1092. #endif
  1093. RTW_INFO("issue_deauth to sta=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->src));
  1094. issue_deauth(adapter, pattrib->src, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  1095. #ifdef CONFIG_DFS_MASTER
  1096. bypass_deauth7:
  1097. #endif
  1098. ret = RTW_RX_HANDLED;
  1099. goto exit;
  1100. }
  1101. process_pwrbit_data(adapter, precv_frame);
  1102. if ((get_frame_sub_type(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE)
  1103. process_wmmps_data(adapter, precv_frame);
  1104. if (get_frame_sub_type(ptr) & BIT(6)) {
  1105. /* No data, will not indicate to upper layer, temporily count it here */
  1106. count_rx_stats(adapter, precv_frame, *psta);
  1107. ret = RTW_RX_HANDLED;
  1108. goto exit;
  1109. }
  1110. } else if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) &&
  1111. (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) {
  1112. /* RTW_INFO("%s ,in WIFI_MP_STATE\n",__func__); */
  1113. _rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);
  1114. _rtw_memcpy(pattrib->src, get_addr2_ptr(ptr), ETH_ALEN);
  1115. _rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);
  1116. _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  1117. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1118. *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get sta_info */
  1119. if (*psta == NULL) {
  1120. #ifdef DBG_RX_DROP_FRAME
  1121. RTW_INFO("DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\n", __FUNCTION__);
  1122. #endif
  1123. ret = _FAIL;
  1124. goto exit;
  1125. }
  1126. } else {
  1127. u8 *myhwaddr = adapter_mac_addr(adapter);
  1128. if (!_rtw_memcmp(pattrib->ra, myhwaddr, ETH_ALEN)) {
  1129. ret = RTW_RX_HANDLED;
  1130. goto exit;
  1131. }
  1132. RTW_INFO("issue_deauth to sta=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->src));
  1133. issue_deauth(adapter, pattrib->src, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
  1134. ret = RTW_RX_HANDLED;
  1135. goto exit;
  1136. }
  1137. exit:
  1138. return ret;
  1139. }
  1140. sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame);
  1141. sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
  1142. {
  1143. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  1144. struct sta_priv *pstapriv = &padapter->stapriv;
  1145. u8 *pframe = precv_frame->u.hdr.rx_data;
  1146. struct sta_info *psta = NULL;
  1147. /* uint len = precv_frame->u.hdr.len; */
  1148. /* RTW_INFO("+validate_recv_ctrl_frame\n"); */
  1149. if (GetFrameType(pframe) != WIFI_CTRL_TYPE)
  1150. return _FAIL;
  1151. /* receive the frames that ra(a1) is my address */
  1152. if (!_rtw_memcmp(GetAddr1Ptr(pframe), adapter_mac_addr(padapter), ETH_ALEN))
  1153. return _FAIL;
  1154. psta = rtw_get_stainfo(pstapriv, get_addr2_ptr(pframe));
  1155. if (psta == NULL)
  1156. return _FAIL;
  1157. /* for rx pkt statistics */
  1158. psta->sta_stats.rx_ctrl_pkts++;
  1159. /* only handle ps-poll */
  1160. if (get_frame_sub_type(pframe) == WIFI_PSPOLL) {
  1161. #ifdef CONFIG_AP_MODE
  1162. u16 aid;
  1163. u8 wmmps_ac = 0;
  1164. aid = GetAid(pframe);
  1165. if (psta->aid != aid)
  1166. return _FAIL;
  1167. switch (pattrib->priority) {
  1168. case 1:
  1169. case 2:
  1170. wmmps_ac = psta->uapsd_bk & BIT(0);
  1171. break;
  1172. case 4:
  1173. case 5:
  1174. wmmps_ac = psta->uapsd_vi & BIT(0);
  1175. break;
  1176. case 6:
  1177. case 7:
  1178. wmmps_ac = psta->uapsd_vo & BIT(0);
  1179. break;
  1180. case 0:
  1181. case 3:
  1182. default:
  1183. wmmps_ac = psta->uapsd_be & BIT(0);
  1184. break;
  1185. }
  1186. if (wmmps_ac)
  1187. return _FAIL;
  1188. if (psta->state & WIFI_STA_ALIVE_CHK_STATE) {
  1189. RTW_INFO("%s alive check-rx ps-poll\n", __func__);
  1190. psta->expire_to = pstapriv->expire_to;
  1191. psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
  1192. }
  1193. if ((psta->state & WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap & BIT(psta->aid))) {
  1194. _irqL irqL;
  1195. _list *xmitframe_plist, *xmitframe_phead;
  1196. struct xmit_frame *pxmitframe = NULL;
  1197. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  1198. /* _enter_critical_bh(&psta->sleep_q.lock, &irqL); */
  1199. _enter_critical_bh(&pxmitpriv->lock, &irqL);
  1200. xmitframe_phead = get_list_head(&psta->sleep_q);
  1201. xmitframe_plist = get_next(xmitframe_phead);
  1202. if ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) {
  1203. pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  1204. xmitframe_plist = get_next(xmitframe_plist);
  1205. rtw_list_delete(&pxmitframe->list);
  1206. psta->sleepq_len--;
  1207. if (psta->sleepq_len > 0)
  1208. pxmitframe->attrib.mdata = 1;
  1209. else
  1210. pxmitframe->attrib.mdata = 0;
  1211. pxmitframe->attrib.triggered = 1;
  1212. /* RTW_INFO("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); */
  1213. #if 0
  1214. _exit_critical_bh(&psta->sleep_q.lock, &irqL);
  1215. if (rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
  1216. rtw_os_xmit_complete(padapter, pxmitframe);
  1217. _enter_critical_bh(&psta->sleep_q.lock, &irqL);
  1218. #endif
  1219. rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
  1220. if (psta->sleepq_len == 0) {
  1221. pstapriv->tim_bitmap &= ~BIT(psta->aid);
  1222. /* RTW_INFO("after handling ps-poll, tim=%x\n", pstapriv->tim_bitmap); */
  1223. /* upate BCN for TIM IE */
  1224. /* update_BCNTIM(padapter); */
  1225. update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
  1226. }
  1227. /* _exit_critical_bh(&psta->sleep_q.lock, &irqL); */
  1228. _exit_critical_bh(&pxmitpriv->lock, &irqL);
  1229. } else {
  1230. /* _exit_critical_bh(&psta->sleep_q.lock, &irqL); */
  1231. _exit_critical_bh(&pxmitpriv->lock, &irqL);
  1232. /* RTW_INFO("no buffered packets to xmit\n"); */
  1233. if (pstapriv->tim_bitmap & BIT(psta->aid)) {
  1234. if (psta->sleepq_len == 0) {
  1235. RTW_INFO("no buffered packets to xmit\n");
  1236. /* issue nulldata with More data bit = 0 to indicate we have no buffered packets */
  1237. issue_nulldata_in_interrupt(padapter, psta->hwaddr, 0);
  1238. } else {
  1239. RTW_INFO("error!psta->sleepq_len=%d\n", psta->sleepq_len);
  1240. psta->sleepq_len = 0;
  1241. }
  1242. pstapriv->tim_bitmap &= ~BIT(psta->aid);
  1243. /* upate BCN for TIM IE */
  1244. /* update_BCNTIM(padapter); */
  1245. update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
  1246. }
  1247. }
  1248. }
  1249. #endif /* CONFIG_AP_MODE */
  1250. } else if (get_frame_sub_type(pframe) == WIFI_NDPA) {
  1251. #ifdef CONFIG_BEAMFORMING
  1252. beamforming_get_ndpa_frame(padapter, precv_frame);
  1253. #endif/*CONFIG_BEAMFORMING*/
  1254. }
  1255. return _FAIL;
  1256. }
  1257. union recv_frame *recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame);
  1258. sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame);
  1259. sint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame)
  1260. {
  1261. /* struct mlme_priv *pmlmepriv = &adapter->mlmepriv; */
  1262. #if 0
  1263. if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) {
  1264. #ifdef CONFIG_NATIVEAP_MLME
  1265. mgt_dispatcher(padapter, precv_frame);
  1266. #else
  1267. rtw_hostapd_mlme_rx(padapter, precv_frame);
  1268. #endif
  1269. } else
  1270. mgt_dispatcher(padapter, precv_frame);
  1271. #endif
  1272. precv_frame = recvframe_chk_defrag(padapter, precv_frame);
  1273. if (precv_frame == NULL) {
  1274. return _SUCCESS;
  1275. }
  1276. {
  1277. /* for rx pkt statistics */
  1278. struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, get_addr2_ptr(precv_frame->u.hdr.rx_data));
  1279. if (psta) {
  1280. psta->sta_stats.rx_mgnt_pkts++;
  1281. if (get_frame_sub_type(precv_frame->u.hdr.rx_data) == WIFI_BEACON)
  1282. psta->sta_stats.rx_beacon_pkts++;
  1283. else if (get_frame_sub_type(precv_frame->u.hdr.rx_data) == WIFI_PROBEREQ)
  1284. psta->sta_stats.rx_probereq_pkts++;
  1285. else if (get_frame_sub_type(precv_frame->u.hdr.rx_data) == WIFI_PROBERSP) {
  1286. if (_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(precv_frame->u.hdr.rx_data), ETH_ALEN) == _TRUE)
  1287. psta->sta_stats.rx_probersp_pkts++;
  1288. else if (is_broadcast_mac_addr(GetAddr1Ptr(precv_frame->u.hdr.rx_data))
  1289. || is_multicast_mac_addr(GetAddr1Ptr(precv_frame->u.hdr.rx_data)))
  1290. psta->sta_stats.rx_probersp_bm_pkts++;
  1291. else
  1292. psta->sta_stats.rx_probersp_uo_pkts++;
  1293. }
  1294. }
  1295. }
  1296. #ifdef CONFIG_INTEL_PROXIM
  1297. if (padapter->proximity.proxim_on == _TRUE) {
  1298. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  1299. struct recv_stat *prxstat = (struct recv_stat *) precv_frame->u.hdr.rx_head ;
  1300. u8 *pda, *psa, *pbssid, *ptr;
  1301. ptr = precv_frame->u.hdr.rx_data;
  1302. pda = get_da(ptr);
  1303. psa = get_sa(ptr);
  1304. pbssid = get_hdr_bssid(ptr);
  1305. _rtw_memcpy(pattrib->dst, pda, ETH_ALEN);
  1306. _rtw_memcpy(pattrib->src, psa, ETH_ALEN);
  1307. _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN);
  1308. switch (pattrib->to_fr_ds) {
  1309. case 0:
  1310. _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
  1311. _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
  1312. break;
  1313. case 1:
  1314. _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
  1315. _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN);
  1316. break;
  1317. case 2:
  1318. _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN);
  1319. _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
  1320. break;
  1321. case 3:
  1322. _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);
  1323. _rtw_memcpy(pattrib->ta, get_addr2_ptr(ptr), ETH_ALEN);
  1324. break;
  1325. default:
  1326. break;
  1327. }
  1328. pattrib->priority = 0;
  1329. pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 30 : 24;
  1330. padapter->proximity.proxim_rx(padapter, precv_frame);
  1331. }
  1332. #endif
  1333. mgt_dispatcher(padapter, precv_frame);
  1334. return _SUCCESS;
  1335. }
  1336. sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame);
  1337. sint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame)
  1338. {
  1339. u8 bretry;
  1340. u8 *psa, *pda, *pbssid;
  1341. struct sta_info *psta = NULL;
  1342. u8 *ptr = precv_frame->u.hdr.rx_data;
  1343. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  1344. struct sta_priv *pstapriv = &adapter->stapriv;
  1345. struct security_priv *psecuritypriv = &adapter->securitypriv;
  1346. sint ret = _SUCCESS;
  1347. bretry = GetRetry(ptr);
  1348. pda = get_da(ptr);
  1349. psa = get_sa(ptr);
  1350. pbssid = get_hdr_bssid(ptr);
  1351. if (pbssid == NULL) {
  1352. #ifdef DBG_RX_DROP_FRAME
  1353. RTW_INFO("DBG_RX_DROP_FRAME %s pbssid == NULL\n", __func__);
  1354. #endif
  1355. ret = _FAIL;
  1356. goto exit;
  1357. }
  1358. _rtw_memcpy(pattrib->dst, pda, ETH_ALEN);
  1359. _rtw_memcpy(pattrib->src, psa, ETH_ALEN);
  1360. _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN);
  1361. switch (pattrib->to_fr_ds) {
  1362. case 0:
  1363. _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
  1364. _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
  1365. ret = sta2sta_data_frame(adapter, precv_frame, &psta);
  1366. break;
  1367. case 1:
  1368. _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
  1369. _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN);
  1370. ret = ap2sta_data_frame(adapter, precv_frame, &psta);
  1371. break;
  1372. case 2:
  1373. _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN);
  1374. _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
  1375. ret = sta2ap_data_frame(adapter, precv_frame, &psta);
  1376. break;
  1377. case 3:
  1378. _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);
  1379. _rtw_memcpy(pattrib->ta, get_addr2_ptr(ptr), ETH_ALEN);
  1380. ret = _FAIL;
  1381. break;
  1382. default:
  1383. ret = _FAIL;
  1384. break;
  1385. }
  1386. if (ret == _FAIL) {
  1387. #ifdef DBG_RX_DROP_FRAME
  1388. RTW_INFO("DBG_RX_DROP_FRAME %s case:%d, res:%d\n", __FUNCTION__, pattrib->to_fr_ds, ret);
  1389. #endif
  1390. goto exit;
  1391. } else if (ret == RTW_RX_HANDLED)
  1392. goto exit;
  1393. if (psta == NULL) {
  1394. #ifdef DBG_RX_DROP_FRAME
  1395. RTW_INFO("DBG_RX_DROP_FRAME %s psta == NULL\n", __func__);
  1396. #endif
  1397. ret = _FAIL;
  1398. goto exit;
  1399. }
  1400. /* psta->rssi = prxcmd->rssi; */
  1401. /* psta->signal_quality= prxcmd->sq; */
  1402. precv_frame->u.hdr.psta = psta;
  1403. pattrib->amsdu = 0;
  1404. pattrib->ack_policy = 0;
  1405. /* parsing QC field */
  1406. if (pattrib->qos == 1) {
  1407. pattrib->priority = GetPriority((ptr + 24));
  1408. pattrib->ack_policy = GetAckpolicy((ptr + 24));
  1409. pattrib->amsdu = GetAMsdu((ptr + 24));
  1410. pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 32 : 26;
  1411. if (pattrib->priority != 0 && pattrib->priority != 3)
  1412. adapter->recvpriv.is_any_non_be_pkts = _TRUE;
  1413. else
  1414. adapter->recvpriv.is_any_non_be_pkts = _FALSE;
  1415. } else {
  1416. pattrib->priority = 0;
  1417. pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 30 : 24;
  1418. }
  1419. if (pattrib->order) /* HT-CTRL 11n */
  1420. pattrib->hdrlen += 4;
  1421. precv_frame->u.hdr.preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority];
  1422. /* decache, drop duplicate recv packets */
  1423. if (recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL) {
  1424. #ifdef DBG_RX_DROP_FRAME
  1425. RTW_INFO("DBG_RX_DROP_FRAME %s recv_decache return _FAIL\n", __func__);
  1426. #endif
  1427. ret = _FAIL;
  1428. goto exit;
  1429. }
  1430. if (pattrib->privacy) {
  1431. #ifdef CONFIG_TDLS
  1432. if ((psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta->dot118021XPrivacy == _AES_))
  1433. pattrib->encrypt = psta->dot118021XPrivacy;
  1434. else
  1435. #endif /* CONFIG_TDLS */
  1436. GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, IS_MCAST(pattrib->ra));
  1437. SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt);
  1438. } else {
  1439. pattrib->encrypt = 0;
  1440. pattrib->iv_len = pattrib->icv_len = 0;
  1441. }
  1442. exit:
  1443. return ret;
  1444. }
  1445. #ifdef CONFIG_IEEE80211W
  1446. static sint validate_80211w_mgmt(_adapter *adapter, union recv_frame *precv_frame)
  1447. {
  1448. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  1449. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  1450. u8 *ptr = precv_frame->u.hdr.rx_data;
  1451. struct sta_info *psta;
  1452. struct sta_priv *pstapriv = &adapter->stapriv;
  1453. u8 type;
  1454. u8 subtype;
  1455. type = GetFrameType(ptr);
  1456. subtype = get_frame_sub_type(ptr); /* bit(7)~bit(2) */
  1457. if (adapter->securitypriv.binstallBIPkey == _TRUE) {
  1458. /* unicast management frame decrypt */
  1459. if (pattrib->privacy && !(IS_MCAST(GetAddr1Ptr(ptr))) &&
  1460. (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC || subtype == WIFI_ACTION)) {
  1461. u8 *ppp, *mgmt_DATA;
  1462. u32 data_len = 0;
  1463. ppp = get_addr2_ptr(ptr);
  1464. pattrib->bdecrypted = 0;
  1465. pattrib->encrypt = _AES_;
  1466. pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);
  1467. /* set iv and icv length */
  1468. SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt);
  1469. _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);
  1470. _rtw_memcpy(pattrib->ta, get_addr2_ptr(ptr), ETH_ALEN);
  1471. /* actual management data frame body */
  1472. data_len = pattrib->pkt_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len;
  1473. mgmt_DATA = rtw_zmalloc(data_len);
  1474. if (mgmt_DATA == NULL) {
  1475. RTW_INFO("%s mgmt allocate fail !!!!!!!!!\n", __FUNCTION__);
  1476. goto validate_80211w_fail;
  1477. }
  1478. #if 0
  1479. /* dump the packet content before decrypt */
  1480. {
  1481. int pp;
  1482. printk("pattrib->pktlen = %d =>", pattrib->pkt_len);
  1483. for (pp = 0; pp < pattrib->pkt_len; pp++)
  1484. printk(" %02x ", ptr[pp]);
  1485. printk("\n");
  1486. }
  1487. #endif
  1488. precv_frame = decryptor(adapter, precv_frame);
  1489. /* save actual management data frame body */
  1490. _rtw_memcpy(mgmt_DATA, ptr + pattrib->hdrlen + pattrib->iv_len, data_len);
  1491. /* overwrite the iv field */
  1492. _rtw_memcpy(ptr + pattrib->hdrlen, mgmt_DATA, data_len);
  1493. /* remove the iv and icv length */
  1494. pattrib->pkt_len = pattrib->pkt_len - pattrib->iv_len - pattrib->icv_len;
  1495. rtw_mfree(mgmt_DATA, data_len);
  1496. #if 0
  1497. /* print packet content after decryption */
  1498. {
  1499. int pp;
  1500. printk("after decryption pattrib->pktlen = %d @@=>", pattrib->pkt_len);
  1501. for (pp = 0; pp < pattrib->pkt_len; pp++)
  1502. printk(" %02x ", ptr[pp]);
  1503. printk("\n");
  1504. }
  1505. #endif
  1506. if (!precv_frame) {
  1507. RTW_INFO("%s mgmt descrypt fail !!!!!!!!!\n", __FUNCTION__);
  1508. goto validate_80211w_fail;
  1509. }
  1510. } else if (IS_MCAST(GetAddr1Ptr(ptr)) &&
  1511. (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC)) {
  1512. sint BIP_ret = _SUCCESS;
  1513. /* verify BIP MME IE of broadcast/multicast de-auth/disassoc packet */
  1514. BIP_ret = rtw_BIP_verify(adapter, (u8 *)precv_frame);
  1515. if (BIP_ret == _FAIL) {
  1516. /* RTW_INFO("802.11w BIP verify fail\n"); */
  1517. goto validate_80211w_fail;
  1518. } else if (BIP_ret == RTW_RX_HANDLED) {
  1519. RTW_INFO("802.11w recv none protected packet\n");
  1520. /* drop pkt, don't issue sa query request */
  1521. /* issue_action_SA_Query(adapter, NULL, 0, 0, 0); */
  1522. goto validate_80211w_fail;
  1523. }
  1524. } /* 802.11w protect */
  1525. else {
  1526. psta = rtw_get_stainfo(pstapriv, get_addr2_ptr(ptr));
  1527. if (subtype == WIFI_ACTION && psta && psta->bpairwise_key_installed == _TRUE) {
  1528. /* according 802.11-2012 standard, these five types are not robust types */
  1529. if (ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_PUBLIC &&
  1530. ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_HT &&
  1531. ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_UNPROTECTED_WNM &&
  1532. ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_SELF_PROTECTED &&
  1533. ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_P2P) {
  1534. RTW_INFO("action frame category=%d should robust\n", ptr[WLAN_HDR_A3_LEN]);
  1535. goto validate_80211w_fail;
  1536. }
  1537. } else if (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC) {
  1538. unsigned short reason;
  1539. reason = le16_to_cpu(*(unsigned short *)(ptr + WLAN_HDR_A3_LEN));
  1540. RTW_INFO("802.11w recv none protected packet, reason=%d\n", reason);
  1541. if (reason == 6 || reason == 7) {
  1542. /* issue sa query request */
  1543. issue_action_SA_Query(adapter, NULL, 0, 0, IEEE80211W_RIGHT_KEY);
  1544. }
  1545. goto validate_80211w_fail;
  1546. }
  1547. }
  1548. }
  1549. return _SUCCESS;
  1550. validate_80211w_fail:
  1551. return _FAIL;
  1552. }
  1553. #endif /* CONFIG_IEEE80211W */
  1554. static inline void dump_rx_packet(u8 *ptr)
  1555. {
  1556. int i;
  1557. RTW_INFO("#############################\n");
  1558. for (i = 0; i < 64; i = i + 8)
  1559. RTW_INFO("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr + i),
  1560. *(ptr + i + 1), *(ptr + i + 2) , *(ptr + i + 3) , *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7));
  1561. RTW_INFO("#############################\n");
  1562. }
  1563. sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame);
  1564. sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame)
  1565. {
  1566. /* shall check frame subtype, to / from ds, da, bssid */
  1567. /* then call check if rx seq/frag. duplicated. */
  1568. u8 type;
  1569. u8 subtype;
  1570. sint retval = _SUCCESS;
  1571. struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
  1572. u8 *ptr = precv_frame->u.hdr.rx_data;
  1573. u8 ver = (unsigned char)(*ptr) & 0x3 ;
  1574. #ifdef CONFIG_FIND_BEST_CHANNEL
  1575. struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  1576. #endif
  1577. #ifdef CONFIG_TDLS
  1578. struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
  1579. #endif /* CONFIG_TDLS */
  1580. #ifdef CONFIG_WAPI_SUPPORT
  1581. PRT_WAPI_T pWapiInfo = &adapter->wapiInfo;
  1582. struct recv_frame_hdr *phdr = &precv_frame->u.hdr;
  1583. u8 wai_pkt = 0;
  1584. u16 sc;
  1585. u8 external_len = 0;
  1586. #endif
  1587. #ifdef CONFIG_FIND_BEST_CHANNEL
  1588. if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {
  1589. int ch_set_idx = rtw_chset_search_ch(pmlmeext->channel_set, rtw_get_oper_ch(adapter));
  1590. if (ch_set_idx >= 0)
  1591. pmlmeext->channel_set[ch_set_idx].rx_count++;
  1592. }
  1593. #endif
  1594. #ifdef CONFIG_TDLS
  1595. if (ptdlsinfo->ch_sensing == 1 && ptdlsinfo->cur_channel != 0)
  1596. ptdlsinfo->collect_pkt_num[ptdlsinfo->cur_channel - 1]++;
  1597. #endif /* CONFIG_TDLS */
  1598. #ifdef RTK_DMP_PLATFORM
  1599. if (0) {
  1600. RTW_INFO("++\n");
  1601. {
  1602. int i;
  1603. for (i = 0; i < 64; i = i + 8)
  1604. RTW_INFO("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr + i),
  1605. *(ptr + i + 1), *(ptr + i + 2) , *(ptr + i + 3) , *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7));
  1606. }
  1607. RTW_INFO("--\n");
  1608. }
  1609. #endif /* RTK_DMP_PLATFORM */
  1610. /* add version chk */
  1611. if (ver != 0) {
  1612. retval = _FAIL;
  1613. DBG_COUNTER(adapter->rx_logs.core_rx_pre_ver_err);
  1614. goto exit;
  1615. }
  1616. type = GetFrameType(ptr);
  1617. subtype = get_frame_sub_type(ptr); /* bit(7)~bit(2) */
  1618. pattrib->to_fr_ds = get_tofr_ds(ptr);
  1619. pattrib->frag_num = GetFragNum(ptr);
  1620. pattrib->seq_num = GetSequence(ptr);
  1621. pattrib->pw_save = GetPwrMgt(ptr);
  1622. pattrib->mfrag = GetMFrag(ptr);
  1623. pattrib->mdata = GetMData(ptr);
  1624. pattrib->privacy = GetPrivacy(ptr);
  1625. pattrib->order = GetOrder(ptr);
  1626. #ifdef CONFIG_WAPI_SUPPORT
  1627. sc = (pattrib->seq_num << 4) | pattrib->frag_num;
  1628. #endif
  1629. #if 1 /* Dump rx packets */
  1630. {
  1631. u8 bDumpRxPkt = 0;
  1632. rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));
  1633. if (bDumpRxPkt == 1) /* dump all rx packets */
  1634. dump_rx_packet(ptr);
  1635. else if ((bDumpRxPkt == 2) && (type == WIFI_MGT_TYPE))
  1636. dump_rx_packet(ptr);
  1637. else if ((bDumpRxPkt == 3) && (type == WIFI_DATA_TYPE))
  1638. dump_rx_packet(ptr);
  1639. }
  1640. #endif
  1641. switch (type) {
  1642. case WIFI_MGT_TYPE: /* mgnt */
  1643. DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt);
  1644. #ifdef CONFIG_IEEE80211W
  1645. if (validate_80211w_mgmt(adapter, precv_frame) == _FAIL) {
  1646. retval = _FAIL;
  1647. DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err_80211w);
  1648. break;
  1649. }
  1650. #endif /* CONFIG_IEEE80211W */
  1651. retval = validate_recv_mgnt_frame(adapter, precv_frame);
  1652. if (retval == _FAIL) {
  1653. DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err);
  1654. }
  1655. retval = _FAIL; /* only data frame return _SUCCESS */
  1656. break;
  1657. case WIFI_CTRL_TYPE: /* ctrl */
  1658. DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl);
  1659. retval = validate_recv_ctrl_frame(adapter, precv_frame);
  1660. if (retval == _FAIL) {
  1661. DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl_err);
  1662. }
  1663. retval = _FAIL; /* only data frame return _SUCCESS */
  1664. break;
  1665. case WIFI_DATA_TYPE: /* data */
  1666. DBG_COUNTER(adapter->rx_logs.core_rx_pre_data);
  1667. #ifdef CONFIG_WAPI_SUPPORT
  1668. if (pattrib->qos)
  1669. external_len = 2;
  1670. else
  1671. external_len = 0;
  1672. wai_pkt = rtw_wapi_is_wai_packet(adapter, ptr);
  1673. phdr->bIsWaiPacket = wai_pkt;
  1674. if (wai_pkt != 0) {
  1675. if (sc != adapter->wapiInfo.wapiSeqnumAndFragNum)
  1676. adapter->wapiInfo.wapiSeqnumAndFragNum = sc;
  1677. else {
  1678. retval = _FAIL;
  1679. DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_seq_err);
  1680. break;
  1681. }
  1682. } else {
  1683. if (rtw_wapi_drop_for_key_absent(adapter, get_addr2_ptr(ptr))) {
  1684. retval = _FAIL;
  1685. WAPI_TRACE(WAPI_RX, "drop for key absent for rx\n");
  1686. DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_key_err);
  1687. break;
  1688. }
  1689. }
  1690. #endif
  1691. pattrib->qos = (subtype & BIT(7)) ? 1 : 0;
  1692. retval = validate_recv_data_frame(adapter, precv_frame);
  1693. if (retval == _FAIL) {
  1694. struct recv_priv *precvpriv = &adapter->recvpriv;
  1695. precvpriv->rx_drop++;
  1696. DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_err);
  1697. } else if (retval == _SUCCESS) {
  1698. #ifdef DBG_RX_DUMP_EAP
  1699. u8 bDumpRxPkt;
  1700. u16 eth_type;
  1701. /* dump eapol */
  1702. rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));
  1703. /* get ether_type */
  1704. _rtw_memcpy(&eth_type, ptr + pattrib->hdrlen + pattrib->iv_len + LLC_HEADER_SIZE, 2);
  1705. eth_type = ntohs((unsigned short) eth_type);
  1706. if ((bDumpRxPkt == 4) && (eth_type == 0x888e))
  1707. dump_rx_packet(ptr);
  1708. #endif
  1709. } else
  1710. DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_handled);
  1711. break;
  1712. default:
  1713. DBG_COUNTER(adapter->rx_logs.core_rx_pre_unknown);
  1714. #ifdef DBG_RX_DROP_FRAME
  1715. RTW_INFO("DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\n", type);
  1716. #endif
  1717. retval = _FAIL;
  1718. break;
  1719. }
  1720. exit:
  1721. return retval;
  1722. }
  1723. /* remove the wlanhdr and add the eth_hdr */
  1724. #if 1
  1725. sint wlanhdr_to_ethhdr(union recv_frame *precvframe);
  1726. sint wlanhdr_to_ethhdr(union recv_frame *precvframe)
  1727. {
  1728. sint rmv_len;
  1729. u16 eth_type, len;
  1730. u8 bsnaphdr;
  1731. u8 *psnap_type;
  1732. struct ieee80211_snap_hdr *psnap;
  1733. sint ret = _SUCCESS;
  1734. _adapter *adapter = precvframe->u.hdr.adapter;
  1735. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  1736. u8 *ptr = get_recvframe_data(precvframe) ; /* point to frame_ctrl field */
  1737. struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
  1738. if (pattrib->encrypt)
  1739. recvframe_pull_tail(precvframe, pattrib->icv_len);
  1740. psnap = (struct ieee80211_snap_hdr *)(ptr + pattrib->hdrlen + pattrib->iv_len);
  1741. psnap_type = ptr + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE;
  1742. /* convert hdr + possible LLC headers into Ethernet header */
  1743. /* eth_type = (psnap_type[0] << 8) | psnap_type[1]; */
  1744. if ((_rtw_memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) &&
  1745. (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) &&
  1746. (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2) == _FALSE)) ||
  1747. /* eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || */
  1748. _rtw_memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)) {
  1749. /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */
  1750. bsnaphdr = _TRUE;
  1751. } else {
  1752. /* Leave Ethernet header part of hdr and full payload */
  1753. bsnaphdr = _FALSE;
  1754. }
  1755. rmv_len = pattrib->hdrlen + pattrib->iv_len + (bsnaphdr ? SNAP_SIZE : 0);
  1756. len = precvframe->u.hdr.len - rmv_len;
  1757. _rtw_memcpy(&eth_type, ptr + rmv_len, 2);
  1758. eth_type = ntohs((unsigned short)eth_type); /* pattrib->ether_type */
  1759. pattrib->eth_type = eth_type;
  1760. #ifdef CONFIG_AUTO_AP_MODE
  1761. if (0x8899 == pattrib->eth_type) {
  1762. struct sta_info *psta = precvframe->u.hdr.psta;
  1763. RTW_INFO("wlan rx: got eth_type=0x%x\n", pattrib->eth_type);
  1764. if (psta && psta->isrc && psta->pid > 0) {
  1765. u16 rx_pid;
  1766. rx_pid = *(u16 *)(ptr + rmv_len + 2);
  1767. RTW_INFO("wlan rx(pid=0x%x): sta("MAC_FMT") pid=0x%x\n",
  1768. rx_pid, MAC_ARG(psta->hwaddr), psta->pid);
  1769. if (rx_pid == psta->pid) {
  1770. int i;
  1771. u16 len = *(u16 *)(ptr + rmv_len + 4);
  1772. /* u16 ctrl_type = *(u16*)(ptr+rmv_len+6); */
  1773. /* RTW_INFO("RC: len=0x%x, ctrl_type=0x%x\n", len, ctrl_type); */
  1774. RTW_INFO("RC: len=0x%x\n", len);
  1775. for (i = 0; i < len; i++)
  1776. RTW_INFO("0x%x\n", *(ptr + rmv_len + 6 + i));
  1777. /* RTW_INFO("0x%x\n", *(ptr+rmv_len+8+i)); */
  1778. RTW_INFO("RC-end\n");
  1779. }
  1780. }
  1781. }
  1782. #endif /* CONFIG_AUTO_AP_MODE */
  1783. if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)) {
  1784. ptr += rmv_len ;
  1785. *ptr = 0x87;
  1786. *(ptr + 1) = 0x12;
  1787. eth_type = 0x8712;
  1788. /* append rx status for mp test packets */
  1789. ptr = recvframe_pull(precvframe, (rmv_len - sizeof(struct ethhdr) + 2) - 24);
  1790. if (!ptr) {
  1791. ret = _FAIL;
  1792. goto exiting;
  1793. }
  1794. _rtw_memcpy(ptr, get_rxmem(precvframe), 24);
  1795. ptr += 24;
  1796. } else {
  1797. ptr = recvframe_pull(precvframe, (rmv_len - sizeof(struct ethhdr) + (bsnaphdr ? 2 : 0)));
  1798. if (!ptr) {
  1799. ret = _FAIL;
  1800. goto exiting;
  1801. }
  1802. }
  1803. if (ptr) {
  1804. _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);
  1805. _rtw_memcpy(ptr + ETH_ALEN, pattrib->src, ETH_ALEN);
  1806. if (!bsnaphdr) {
  1807. len = htons(len);
  1808. _rtw_memcpy(ptr + 12, &len, 2);
  1809. }
  1810. }
  1811. exiting:
  1812. return ret;
  1813. }
  1814. #else
  1815. sint wlanhdr_to_ethhdr(union recv_frame *precvframe)
  1816. {
  1817. sint rmv_len;
  1818. u16 eth_type;
  1819. u8 bsnaphdr;
  1820. u8 *psnap_type;
  1821. struct ieee80211_snap_hdr *psnap;
  1822. sint ret = _SUCCESS;
  1823. _adapter *adapter = precvframe->u.hdr.adapter;
  1824. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  1825. u8 *ptr = get_recvframe_data(precvframe) ; /* point to frame_ctrl field */
  1826. struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
  1827. struct _vlan *pvlan = NULL;
  1828. psnap = (struct ieee80211_snap_hdr *)(ptr + pattrib->hdrlen + pattrib->iv_len);
  1829. psnap_type = ptr + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE;
  1830. if (psnap->dsap == 0xaa && psnap->ssap == 0xaa && psnap->ctrl == 0x03) {
  1831. if (_rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN))
  1832. bsnaphdr = _TRUE; /* wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042; */
  1833. else if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) &&
  1834. _rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2))
  1835. bsnaphdr = _TRUE; /* wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK; */
  1836. else if (_rtw_memcmp(psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN))
  1837. bsnaphdr = _TRUE; /* wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL; */
  1838. else {
  1839. ret = _FAIL;
  1840. goto exit;
  1841. }
  1842. } else
  1843. bsnaphdr = _FALSE; /* wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS; */
  1844. rmv_len = pattrib->hdrlen + pattrib->iv_len + (bsnaphdr ? SNAP_SIZE : 0);
  1845. if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) {
  1846. ptr += rmv_len ;
  1847. *ptr = 0x87;
  1848. *(ptr + 1) = 0x12;
  1849. /* back to original pointer */
  1850. ptr -= rmv_len;
  1851. }
  1852. ptr += rmv_len ;
  1853. _rtw_memcpy(&eth_type, ptr, 2);
  1854. eth_type = ntohs((unsigned short)eth_type); /* pattrib->ether_type */
  1855. ptr += 2;
  1856. if (pattrib->encrypt)
  1857. recvframe_pull_tail(precvframe, pattrib->icv_len);
  1858. if (eth_type == 0x8100) { /* vlan */
  1859. pvlan = (struct _vlan *) ptr;
  1860. /* eth_type = get_vlan_encap_proto(pvlan); */
  1861. /* eth_type = pvlan->h_vlan_encapsulated_proto; */ /* ? */
  1862. rmv_len += 4;
  1863. ptr += 4;
  1864. }
  1865. if (eth_type == 0x0800) { /* ip */
  1866. /* struct iphdr* piphdr = (struct iphdr*) ptr; */
  1867. /* __u8 tos = (unsigned char)(pattrib->priority & 0xff); */
  1868. /* piphdr->tos = tos; */
  1869. } else if (eth_type == 0x8712) { /* append rx status for mp test packets */
  1870. /* ptr -= 16; */
  1871. /* _rtw_memcpy(ptr, get_rxmem(precvframe), 16); */
  1872. } else {
  1873. #ifdef PLATFORM_OS_XP
  1874. NDIS_PACKET_8021Q_INFO VlanPriInfo;
  1875. UINT32 UserPriority = precvframe->u.hdr.attrib.priority;
  1876. UINT32 VlanID = (pvlan != NULL ? get_vlan_id(pvlan) : 0);
  1877. VlanPriInfo.Value = /* Get current value. */
  1878. NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo);
  1879. VlanPriInfo.TagHeader.UserPriority = UserPriority;
  1880. VlanPriInfo.TagHeader.VlanId = VlanID ;
  1881. VlanPriInfo.TagHeader.CanonicalFormatId = 0; /* Should be zero. */
  1882. VlanPriInfo.TagHeader.Reserved = 0; /* Should be zero. */
  1883. NDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value;
  1884. #endif
  1885. }
  1886. if (eth_type == 0x8712) { /* append rx status for mp test packets */
  1887. ptr = recvframe_pull(precvframe, (rmv_len - sizeof(struct ethhdr) + 2) - 24);
  1888. _rtw_memcpy(ptr, get_rxmem(precvframe), 24);
  1889. ptr += 24;
  1890. } else
  1891. ptr = recvframe_pull(precvframe, (rmv_len - sizeof(struct ethhdr) + 2));
  1892. _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);
  1893. _rtw_memcpy(ptr + ETH_ALEN, pattrib->src, ETH_ALEN);
  1894. eth_type = htons((unsigned short)eth_type) ;
  1895. _rtw_memcpy(ptr + 12, &eth_type, 2);
  1896. exit:
  1897. return ret;
  1898. }
  1899. #endif
  1900. #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  1901. #ifdef PLATFORM_LINUX
  1902. static void recvframe_expand_pkt(
  1903. PADAPTER padapter,
  1904. union recv_frame *prframe)
  1905. {
  1906. struct recv_frame_hdr *pfhdr;
  1907. _pkt *ppkt;
  1908. u8 shift_sz;
  1909. u32 alloc_sz;
  1910. u8 *ptr;
  1911. pfhdr = &prframe->u.hdr;
  1912. /* 6 is for IP header 8 bytes alignment in QoS packet case. */
  1913. if (pfhdr->attrib.qos)
  1914. shift_sz = 6;
  1915. else
  1916. shift_sz = 0;
  1917. /* for first fragment packet, need to allocate */
  1918. /* (1536 + RXDESC_SIZE + drvinfo_sz) to reassemble packet */
  1919. /* 8 is for skb->data 8 bytes alignment.
  1920. * alloc_sz = _RND(1536 + RXDESC_SIZE + pfhdr->attrib.drvinfosize + shift_sz + 8, 128); */
  1921. alloc_sz = 1664; /* round (1536 + 24 + 32 + shift_sz + 8) to 128 bytes alignment */
  1922. /* 3 1. alloc new skb */
  1923. /* prepare extra space for 4 bytes alignment */
  1924. ppkt = rtw_skb_alloc(alloc_sz);
  1925. if (!ppkt)
  1926. return; /* no way to expand */
  1927. /* 3 2. Prepare new skb to replace & release old skb */
  1928. /* force ppkt->data at 8-byte alignment address */
  1929. skb_reserve(ppkt, 8 - ((SIZE_PTR)ppkt->data & 7));
  1930. /* force ip_hdr at 8-byte alignment address according to shift_sz */
  1931. skb_reserve(ppkt, shift_sz);
  1932. /* copy data to new pkt */
  1933. ptr = skb_put(ppkt, pfhdr->len);
  1934. if (ptr)
  1935. _rtw_memcpy(ptr, pfhdr->rx_data, pfhdr->len);
  1936. rtw_skb_free(pfhdr->pkt);
  1937. /* attach new pkt to recvframe */
  1938. pfhdr->pkt = ppkt;
  1939. pfhdr->rx_head = ppkt->head;
  1940. pfhdr->rx_data = ppkt->data;
  1941. pfhdr->rx_tail = skb_tail_pointer(ppkt);
  1942. pfhdr->rx_end = skb_end_pointer(ppkt);
  1943. }
  1944. #else
  1945. #warning "recvframe_expand_pkt not implement, defrag may crash system"
  1946. #endif
  1947. #endif
  1948. /* perform defrag */
  1949. union recv_frame *recvframe_defrag(_adapter *adapter, _queue *defrag_q);
  1950. union recv_frame *recvframe_defrag(_adapter *adapter, _queue *defrag_q)
  1951. {
  1952. _list *plist, *phead;
  1953. u8 *data, wlanhdr_offset;
  1954. u8 curfragnum;
  1955. struct recv_frame_hdr *pfhdr, *pnfhdr;
  1956. union recv_frame *prframe, *pnextrframe;
  1957. _queue *pfree_recv_queue;
  1958. curfragnum = 0;
  1959. pfree_recv_queue = &adapter->recvpriv.free_recv_queue;
  1960. phead = get_list_head(defrag_q);
  1961. plist = get_next(phead);
  1962. prframe = LIST_CONTAINOR(plist, union recv_frame, u);
  1963. pfhdr = &prframe->u.hdr;
  1964. rtw_list_delete(&(prframe->u.list));
  1965. if (curfragnum != pfhdr->attrib.frag_num) {
  1966. /* the first fragment number must be 0 */
  1967. /* free the whole queue */
  1968. rtw_free_recvframe(prframe, pfree_recv_queue);
  1969. rtw_free_recvframe_queue(defrag_q, pfree_recv_queue);
  1970. return NULL;
  1971. }
  1972. #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  1973. #ifndef CONFIG_SDIO_RX_COPY
  1974. recvframe_expand_pkt(adapter, prframe);
  1975. #endif
  1976. #endif
  1977. curfragnum++;
  1978. plist = get_list_head(defrag_q);
  1979. plist = get_next(plist);
  1980. data = get_recvframe_data(prframe);
  1981. while (rtw_end_of_queue_search(phead, plist) == _FALSE) {
  1982. pnextrframe = LIST_CONTAINOR(plist, union recv_frame , u);
  1983. pnfhdr = &pnextrframe->u.hdr;
  1984. /* check the fragment sequence (2nd ~n fragment frame) */
  1985. if (curfragnum != pnfhdr->attrib.frag_num) {
  1986. /* the fragment number must be increasing (after decache) */
  1987. /* release the defrag_q & prframe */
  1988. rtw_free_recvframe(prframe, pfree_recv_queue);
  1989. rtw_free_recvframe_queue(defrag_q, pfree_recv_queue);
  1990. return NULL;
  1991. }
  1992. curfragnum++;
  1993. /* copy the 2nd~n fragment frame's payload to the first fragment */
  1994. /* get the 2nd~last fragment frame's payload */
  1995. wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len;
  1996. recvframe_pull(pnextrframe, wlanhdr_offset);
  1997. /* append to first fragment frame's tail (if privacy frame, pull the ICV) */
  1998. recvframe_pull_tail(prframe, pfhdr->attrib.icv_len);
  1999. /* memcpy */
  2000. _rtw_memcpy(pfhdr->rx_tail, pnfhdr->rx_data, pnfhdr->len);
  2001. recvframe_put(prframe, pnfhdr->len);
  2002. pfhdr->attrib.icv_len = pnfhdr->attrib.icv_len;
  2003. plist = get_next(plist);
  2004. };
  2005. /* free the defrag_q queue and return the prframe */
  2006. rtw_free_recvframe_queue(defrag_q, pfree_recv_queue);
  2007. return prframe;
  2008. }
  2009. /* check if need to defrag, if needed queue the frame to defrag_q */
  2010. union recv_frame *recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame)
  2011. {
  2012. u8 ismfrag;
  2013. u8 fragnum;
  2014. u8 *psta_addr;
  2015. struct recv_frame_hdr *pfhdr;
  2016. struct sta_info *psta;
  2017. struct sta_priv *pstapriv;
  2018. _list *phead;
  2019. union recv_frame *prtnframe = NULL;
  2020. _queue *pfree_recv_queue, *pdefrag_q;
  2021. pstapriv = &padapter->stapriv;
  2022. pfhdr = &precv_frame->u.hdr;
  2023. pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
  2024. /* need to define struct of wlan header frame ctrl */
  2025. ismfrag = pfhdr->attrib.mfrag;
  2026. fragnum = pfhdr->attrib.frag_num;
  2027. psta_addr = pfhdr->attrib.ta;
  2028. psta = rtw_get_stainfo(pstapriv, psta_addr);
  2029. if (psta == NULL) {
  2030. u8 type = GetFrameType(pfhdr->rx_data);
  2031. if (type != WIFI_DATA_TYPE) {
  2032. psta = rtw_get_bcmc_stainfo(padapter);
  2033. pdefrag_q = &psta->sta_recvpriv.defrag_q;
  2034. } else
  2035. pdefrag_q = NULL;
  2036. } else
  2037. pdefrag_q = &psta->sta_recvpriv.defrag_q;
  2038. if ((ismfrag == 0) && (fragnum == 0)) {
  2039. prtnframe = precv_frame;/* isn't a fragment frame */
  2040. }
  2041. if (ismfrag == 1) {
  2042. /* 0~(n-1) fragment frame */
  2043. /* enqueue to defraf_g */
  2044. if (pdefrag_q != NULL) {
  2045. if (fragnum == 0) {
  2046. /* the first fragment */
  2047. if (_rtw_queue_empty(pdefrag_q) == _FALSE) {
  2048. /* free current defrag_q */
  2049. rtw_free_recvframe_queue(pdefrag_q, pfree_recv_queue);
  2050. }
  2051. }
  2052. /* Then enqueue the 0~(n-1) fragment into the defrag_q */
  2053. /* _rtw_spinlock(&pdefrag_q->lock); */
  2054. phead = get_list_head(pdefrag_q);
  2055. rtw_list_insert_tail(&pfhdr->list, phead);
  2056. /* _rtw_spinunlock(&pdefrag_q->lock); */
  2057. prtnframe = NULL;
  2058. } else {
  2059. /* can't find this ta's defrag_queue, so free this recv_frame */
  2060. rtw_free_recvframe(precv_frame, pfree_recv_queue);
  2061. prtnframe = NULL;
  2062. }
  2063. }
  2064. if ((ismfrag == 0) && (fragnum != 0)) {
  2065. /* the last fragment frame */
  2066. /* enqueue the last fragment */
  2067. if (pdefrag_q != NULL) {
  2068. /* _rtw_spinlock(&pdefrag_q->lock); */
  2069. phead = get_list_head(pdefrag_q);
  2070. rtw_list_insert_tail(&pfhdr->list, phead);
  2071. /* _rtw_spinunlock(&pdefrag_q->lock); */
  2072. /* call recvframe_defrag to defrag */
  2073. precv_frame = recvframe_defrag(padapter, pdefrag_q);
  2074. prtnframe = precv_frame;
  2075. } else {
  2076. /* can't find this ta's defrag_queue, so free this recv_frame */
  2077. rtw_free_recvframe(precv_frame, pfree_recv_queue);
  2078. prtnframe = NULL;
  2079. }
  2080. }
  2081. if ((prtnframe != NULL) && (prtnframe->u.hdr.attrib.privacy)) {
  2082. /* after defrag we must check tkip mic code */
  2083. if (recvframe_chkmic(padapter, prtnframe) == _FAIL) {
  2084. rtw_free_recvframe(prtnframe, pfree_recv_queue);
  2085. prtnframe = NULL;
  2086. }
  2087. }
  2088. return prtnframe;
  2089. }
  2090. int amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe)
  2091. {
  2092. int a_len, padding_len;
  2093. u16 nSubframe_Length;
  2094. u8 nr_subframes, i;
  2095. u8 *pdata;
  2096. _pkt *sub_pkt, *subframes[MAX_SUBFRAME_COUNT];
  2097. struct recv_priv *precvpriv = &padapter->recvpriv;
  2098. _queue *pfree_recv_queue = &(precvpriv->free_recv_queue);
  2099. int ret = _SUCCESS;
  2100. nr_subframes = 0;
  2101. recvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen);
  2102. if (prframe->u.hdr.attrib.iv_len > 0)
  2103. recvframe_pull(prframe, prframe->u.hdr.attrib.iv_len);
  2104. a_len = prframe->u.hdr.len;
  2105. pdata = prframe->u.hdr.rx_data;
  2106. while (a_len > ETH_HLEN) {
  2107. /* Offset 12 denote 2 mac address */
  2108. nSubframe_Length = RTW_GET_BE16(pdata + 12);
  2109. if (a_len < (ETHERNET_HEADER_SIZE + nSubframe_Length)) {
  2110. RTW_INFO("nRemain_Length is %d and nSubframe_Length is : %d\n", a_len, nSubframe_Length);
  2111. break;
  2112. }
  2113. sub_pkt = rtw_os_alloc_msdu_pkt(prframe, nSubframe_Length, pdata);
  2114. if (sub_pkt == NULL) {
  2115. RTW_INFO("%s(): allocate sub packet fail !!!\n", __FUNCTION__);
  2116. break;
  2117. }
  2118. /* move the data point to data content */
  2119. pdata += ETH_HLEN;
  2120. a_len -= ETH_HLEN;
  2121. subframes[nr_subframes++] = sub_pkt;
  2122. if (nr_subframes >= MAX_SUBFRAME_COUNT) {
  2123. RTW_INFO("ParseSubframe(): Too many Subframes! Packets dropped!\n");
  2124. break;
  2125. }
  2126. pdata += nSubframe_Length;
  2127. a_len -= nSubframe_Length;
  2128. if (a_len != 0) {
  2129. padding_len = 4 - ((nSubframe_Length + ETH_HLEN) & (4 - 1));
  2130. if (padding_len == 4)
  2131. padding_len = 0;
  2132. if (a_len < padding_len) {
  2133. RTW_INFO("ParseSubframe(): a_len < padding_len !\n");
  2134. break;
  2135. }
  2136. pdata += padding_len;
  2137. a_len -= padding_len;
  2138. }
  2139. }
  2140. for (i = 0; i < nr_subframes; i++) {
  2141. sub_pkt = subframes[i];
  2142. /* Indicat the packets to upper layer */
  2143. if (sub_pkt)
  2144. rtw_os_recv_indicate_pkt(padapter, sub_pkt, &prframe->u.hdr.attrib);
  2145. }
  2146. prframe->u.hdr.len = 0;
  2147. rtw_free_recvframe(prframe, pfree_recv_queue);/* free this recv_frame */
  2148. return ret;
  2149. }
  2150. int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num);
  2151. int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num)
  2152. {
  2153. PADAPTER padapter = preorder_ctrl->padapter;
  2154. struct dvobj_priv *psdpriv = padapter->dvobj;
  2155. struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
  2156. u8 wsize = preorder_ctrl->wsize_b;
  2157. u16 wend = (preorder_ctrl->indicate_seq + wsize - 1) & 0xFFF; /* % 4096; */
  2158. /* Rx Reorder initialize condition. */
  2159. if (preorder_ctrl->indicate_seq == 0xFFFF) {
  2160. preorder_ctrl->indicate_seq = seq_num;
  2161. #ifdef DBG_RX_SEQ
  2162. RTW_INFO("DBG_RX_SEQ %s:%d init IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  2163. preorder_ctrl->indicate_seq, seq_num);
  2164. #endif
  2165. /* DbgPrint("check_indicate_seq, 1st->indicate_seq=%d\n", precvpriv->indicate_seq); */
  2166. }
  2167. /* DbgPrint("enter->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); */
  2168. /* Drop out the packet which SeqNum is smaller than WinStart */
  2169. if (SN_LESS(seq_num, preorder_ctrl->indicate_seq)) {
  2170. /* DbgPrint("CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); */
  2171. #ifdef DBG_RX_DROP_FRAME
  2172. RTW_INFO("%s IndicateSeq: %d > NewSeq: %d\n", __FUNCTION__,
  2173. preorder_ctrl->indicate_seq, seq_num);
  2174. #endif
  2175. return _FALSE;
  2176. }
  2177. /* */
  2178. /* Sliding window manipulation. Conditions includes: */
  2179. /* 1. Incoming SeqNum is equal to WinStart =>Window shift 1 */
  2180. /* 2. Incoming SeqNum is larger than the WinEnd => Window shift N */
  2181. /* */
  2182. if (SN_EQUAL(seq_num, preorder_ctrl->indicate_seq)) {
  2183. preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF;
  2184. #ifdef DBG_RX_SEQ
  2185. RTW_INFO("DBG_RX_SEQ %s:%d SN_EQUAL IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  2186. preorder_ctrl->indicate_seq, seq_num);
  2187. #endif
  2188. } else if (SN_LESS(wend, seq_num)) {
  2189. /* DbgPrint("CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); */
  2190. /* boundary situation, when seq_num cross 0xFFF */
  2191. if (seq_num >= (wsize - 1))
  2192. preorder_ctrl->indicate_seq = seq_num + 1 - wsize;
  2193. else
  2194. preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1;
  2195. pdbgpriv->dbg_rx_ampdu_window_shift_cnt++;
  2196. #ifdef DBG_RX_SEQ
  2197. RTW_INFO("DBG_RX_SEQ %s:%d SN_LESS(wend, seq_num) IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  2198. preorder_ctrl->indicate_seq, seq_num);
  2199. #endif
  2200. }
  2201. /* DbgPrint("exit->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\n", precvpriv->indicate_seq, seq_num); */
  2202. return _TRUE;
  2203. }
  2204. int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union recv_frame *prframe);
  2205. int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union recv_frame *prframe)
  2206. {
  2207. struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  2208. _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  2209. _list *phead, *plist;
  2210. union recv_frame *pnextrframe;
  2211. struct rx_pkt_attrib *pnextattrib;
  2212. /* DbgPrint("+enqueue_reorder_recvframe()\n"); */
  2213. /* _enter_critical_ex(&ppending_recvframe_queue->lock, &irql); */
  2214. /* _rtw_spinlock_ex(&ppending_recvframe_queue->lock); */
  2215. phead = get_list_head(ppending_recvframe_queue);
  2216. plist = get_next(phead);
  2217. while (rtw_end_of_queue_search(phead, plist) == _FALSE) {
  2218. pnextrframe = LIST_CONTAINOR(plist, union recv_frame, u);
  2219. pnextattrib = &pnextrframe->u.hdr.attrib;
  2220. if (SN_LESS(pnextattrib->seq_num, pattrib->seq_num))
  2221. plist = get_next(plist);
  2222. else if (SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num)) {
  2223. /* Duplicate entry is found!! Do not insert current entry. */
  2224. /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */
  2225. return _FALSE;
  2226. } else
  2227. break;
  2228. /* DbgPrint("enqueue_reorder_recvframe():while\n"); */
  2229. }
  2230. /* _enter_critical_ex(&ppending_recvframe_queue->lock, &irql); */
  2231. /* _rtw_spinlock_ex(&ppending_recvframe_queue->lock); */
  2232. rtw_list_delete(&(prframe->u.hdr.list));
  2233. rtw_list_insert_tail(&(prframe->u.hdr.list), plist);
  2234. /* _rtw_spinunlock_ex(&ppending_recvframe_queue->lock); */
  2235. /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */
  2236. return _TRUE;
  2237. }
  2238. void recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq);
  2239. void recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq)
  2240. {
  2241. if (current_seq < prev_seq)
  2242. pdbgpriv->dbg_rx_ampdu_loss_count += (4096 + current_seq - prev_seq);
  2243. else
  2244. pdbgpriv->dbg_rx_ampdu_loss_count += (current_seq - prev_seq);
  2245. }
  2246. int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced);
  2247. int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced)
  2248. {
  2249. /* _irqL irql; */
  2250. _list *phead, *plist;
  2251. union recv_frame *prframe;
  2252. struct rx_pkt_attrib *pattrib;
  2253. /* u8 index = 0; */
  2254. int bPktInBuf = _FALSE;
  2255. struct recv_priv *precvpriv = &padapter->recvpriv;
  2256. _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  2257. struct dvobj_priv *psdpriv = padapter->dvobj;
  2258. struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
  2259. DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_in_oder);
  2260. /* DbgPrint("+recv_indicatepkts_in_order\n"); */
  2261. /* _enter_critical_ex(&ppending_recvframe_queue->lock, &irql); */
  2262. /* _rtw_spinlock_ex(&ppending_recvframe_queue->lock); */
  2263. phead = get_list_head(ppending_recvframe_queue);
  2264. plist = get_next(phead);
  2265. #if 0
  2266. /* Check if there is any other indication thread running. */
  2267. if (pTS->RxIndicateState == RXTS_INDICATE_PROCESSING)
  2268. return;
  2269. #endif
  2270. /* Handling some condition for forced indicate case. */
  2271. if (bforced == _TRUE) {
  2272. pdbgpriv->dbg_rx_ampdu_forced_indicate_count++;
  2273. if (rtw_is_list_empty(phead)) {
  2274. /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */
  2275. /* _rtw_spinunlock_ex(&ppending_recvframe_queue->lock); */
  2276. return _TRUE;
  2277. }
  2278. prframe = LIST_CONTAINOR(plist, union recv_frame, u);
  2279. pattrib = &prframe->u.hdr.attrib;
  2280. #ifdef DBG_RX_SEQ
  2281. RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  2282. preorder_ctrl->indicate_seq, pattrib->seq_num);
  2283. #endif
  2284. recv_indicatepkts_pkt_loss_cnt(pdbgpriv, preorder_ctrl->indicate_seq, pattrib->seq_num);
  2285. preorder_ctrl->indicate_seq = pattrib->seq_num;
  2286. }
  2287. /* Prepare indication list and indication. */
  2288. /* Check if there is any packet need indicate. */
  2289. while (!rtw_is_list_empty(phead)) {
  2290. prframe = LIST_CONTAINOR(plist, union recv_frame, u);
  2291. pattrib = &prframe->u.hdr.attrib;
  2292. if (!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) {
  2293. #if 0
  2294. /* This protect buffer from overflow. */
  2295. if (index >= REORDER_WIN_SIZE) {
  2296. RT_ASSERT(FALSE, ("IndicateRxReorderList(): Buffer overflow!!\n"));
  2297. bPktInBuf = TRUE;
  2298. break;
  2299. }
  2300. #endif
  2301. plist = get_next(plist);
  2302. rtw_list_delete(&(prframe->u.hdr.list));
  2303. if (SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num)) {
  2304. preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF;
  2305. #ifdef DBG_RX_SEQ
  2306. RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  2307. preorder_ctrl->indicate_seq, pattrib->seq_num);
  2308. #endif
  2309. }
  2310. #if 0
  2311. index++;
  2312. if (index == 1) {
  2313. /* Cancel previous pending timer. */
  2314. /* PlatformCancelTimer(Adapter, &pTS->RxPktPendingTimer); */
  2315. if (bforced != _TRUE) {
  2316. /* RTW_INFO("_cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);\n"); */
  2317. _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);
  2318. }
  2319. }
  2320. #endif
  2321. /* Set this as a lock to make sure that only one thread is indicating packet. */
  2322. /* pTS->RxIndicateState = RXTS_INDICATE_PROCESSING; */
  2323. /* Indicate packets */
  2324. /* RT_ASSERT((index<=REORDER_WIN_SIZE), ("RxReorderIndicatePacket(): Rx Reorder buffer full!!\n")); */
  2325. /* indicate this recv_frame */
  2326. /* DbgPrint("recv_indicatepkts_in_order, indicate_seq=%d, seq_num=%d\n", precvpriv->indicate_seq, pattrib->seq_num); */
  2327. if (!pattrib->amsdu) {
  2328. /* RTW_INFO("recv_indicatepkts_in_order, amsdu!=1, indicate_seq=%d, seq_num=%d\n", preorder_ctrl->indicate_seq, pattrib->seq_num); */
  2329. if (!RTW_CANNOT_RUN(padapter))
  2330. rtw_recv_indicatepkt(padapter, prframe);/*indicate this recv_frame*/
  2331. } else if (pattrib->amsdu == 1) {
  2332. if (amsdu_to_msdu(padapter, prframe) != _SUCCESS)
  2333. rtw_free_recvframe(prframe, &precvpriv->free_recv_queue);
  2334. } else {
  2335. /* error condition; */
  2336. }
  2337. /* Update local variables. */
  2338. bPktInBuf = _FALSE;
  2339. } else {
  2340. bPktInBuf = _TRUE;
  2341. break;
  2342. }
  2343. /* DbgPrint("recv_indicatepkts_in_order():while\n"); */
  2344. }
  2345. /* _rtw_spinunlock_ex(&ppending_recvframe_queue->lock); */
  2346. /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */
  2347. #if 0
  2348. /* Release the indication lock and set to new indication step. */
  2349. if (bPktInBuf) {
  2350. /* Set new pending timer. */
  2351. /* pTS->RxIndicateState = RXTS_INDICATE_REORDER; */
  2352. /* PlatformSetTimer(Adapter, &pTS->RxPktPendingTimer, pHTInfo->RxReorderPendingTime); */
  2353. _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME);
  2354. } else {
  2355. /* pTS->RxIndicateState = RXTS_INDICATE_IDLE; */
  2356. }
  2357. #endif
  2358. /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */
  2359. /* return _TRUE; */
  2360. return bPktInBuf;
  2361. }
  2362. int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe);
  2363. int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe)
  2364. {
  2365. _irqL irql;
  2366. int retval = _SUCCESS;
  2367. struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  2368. struct recv_reorder_ctrl *preorder_ctrl = prframe->u.hdr.preorder_ctrl;
  2369. _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  2370. struct dvobj_priv *psdpriv = padapter->dvobj;
  2371. struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
  2372. DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_reoder);
  2373. if (!pattrib->amsdu) {
  2374. /* s1. */
  2375. retval = wlanhdr_to_ethhdr(prframe);
  2376. if (retval != _SUCCESS) {
  2377. #ifdef DBG_RX_DROP_FRAME
  2378. RTW_INFO("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__);
  2379. #endif
  2380. return retval;
  2381. }
  2382. /* if ((pattrib->qos!=1) || pattrib->priority!=0 || IS_MCAST(pattrib->ra) */
  2383. /* || (pattrib->eth_type==0x0806) || (pattrib->ack_policy!=0)) */
  2384. if (pattrib->qos != 1) {
  2385. if (!RTW_CANNOT_RUN(padapter)) {
  2386. rtw_recv_indicatepkt(padapter, prframe);
  2387. return _SUCCESS;
  2388. }
  2389. #ifdef DBG_RX_DROP_FRAME
  2390. RTW_INFO("DBG_RX_DROP_FRAME %s pattrib->qos !=1\n", __FUNCTION__);
  2391. #endif
  2392. return _FAIL;
  2393. }
  2394. if (preorder_ctrl->enable == _FALSE) {
  2395. /* indicate this recv_frame */
  2396. preorder_ctrl->indicate_seq = pattrib->seq_num;
  2397. #ifdef DBG_RX_SEQ
  2398. RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  2399. preorder_ctrl->indicate_seq, pattrib->seq_num);
  2400. #endif
  2401. rtw_recv_indicatepkt(padapter, prframe);
  2402. preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) % 4096;
  2403. #ifdef DBG_RX_SEQ
  2404. RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  2405. preorder_ctrl->indicate_seq, pattrib->seq_num);
  2406. #endif
  2407. return _SUCCESS;
  2408. }
  2409. #ifndef CONFIG_RECV_REORDERING_CTRL
  2410. /* indicate this recv_frame */
  2411. rtw_recv_indicatepkt(padapter, prframe);
  2412. return _SUCCESS;
  2413. #endif
  2414. } else if (pattrib->amsdu == 1) { /* temp filter->means didn't support A-MSDUs in a A-MPDU */
  2415. if (preorder_ctrl->enable == _FALSE) {
  2416. preorder_ctrl->indicate_seq = pattrib->seq_num;
  2417. #ifdef DBG_RX_SEQ
  2418. RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  2419. preorder_ctrl->indicate_seq, pattrib->seq_num);
  2420. #endif
  2421. retval = amsdu_to_msdu(padapter, prframe);
  2422. preorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) % 4096;
  2423. #ifdef DBG_RX_SEQ
  2424. RTW_INFO("DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\n", __FUNCTION__, __LINE__,
  2425. preorder_ctrl->indicate_seq, pattrib->seq_num);
  2426. #endif
  2427. if (retval != _SUCCESS) {
  2428. #ifdef DBG_RX_DROP_FRAME
  2429. RTW_INFO("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__);
  2430. #endif
  2431. }
  2432. return retval;
  2433. }
  2434. } else {
  2435. }
  2436. _enter_critical_bh(&ppending_recvframe_queue->lock, &irql);
  2437. /* s2. check if winstart_b(indicate_seq) needs to been updated */
  2438. if (!check_indicate_seq(preorder_ctrl, pattrib->seq_num)) {
  2439. pdbgpriv->dbg_rx_ampdu_drop_count++;
  2440. /* pHTInfo->RxReorderDropCounter++; */
  2441. /* ReturnRFDList(Adapter, pRfd); */
  2442. /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */
  2443. /* return _FAIL; */
  2444. #ifdef DBG_RX_DROP_FRAME
  2445. RTW_INFO("DBG_RX_DROP_FRAME %s check_indicate_seq fail\n", __FUNCTION__);
  2446. #endif
  2447. #if 0
  2448. rtw_recv_indicatepkt(padapter, prframe);
  2449. _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);
  2450. goto _success_exit;
  2451. #else
  2452. goto _err_exit;
  2453. #endif
  2454. }
  2455. /* s3. Insert all packet into Reorder Queue to maintain its ordering. */
  2456. if (!enqueue_reorder_recvframe(preorder_ctrl, prframe)) {
  2457. /* DbgPrint("recv_indicatepkt_reorder, enqueue_reorder_recvframe fail!\n"); */
  2458. /* _exit_critical_ex(&ppending_recvframe_queue->lock, &irql); */
  2459. /* return _FAIL; */
  2460. #ifdef DBG_RX_DROP_FRAME
  2461. RTW_INFO("DBG_RX_DROP_FRAME %s enqueue_reorder_recvframe fail\n", __FUNCTION__);
  2462. #endif
  2463. goto _err_exit;
  2464. }
  2465. /* s4. */
  2466. /* Indication process. */
  2467. /* After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets */
  2468. /* with the SeqNum smaller than latest WinStart and buffer other packets. */
  2469. /* */
  2470. /* For Rx Reorder condition: */
  2471. /* 1. All packets with SeqNum smaller than WinStart => Indicate */
  2472. /* 2. All packets with SeqNum larger than or equal to WinStart => Buffer it. */
  2473. /* */
  2474. /* recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE); */
  2475. if (recv_indicatepkts_in_order(padapter, preorder_ctrl, _FALSE) == _TRUE) {
  2476. if (!preorder_ctrl->bReorderWaiting) {
  2477. preorder_ctrl->bReorderWaiting = _TRUE;
  2478. _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME);
  2479. }
  2480. _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);
  2481. } else {
  2482. preorder_ctrl->bReorderWaiting = _FALSE;
  2483. _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);
  2484. _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);
  2485. }
  2486. _success_exit:
  2487. return _SUCCESS;
  2488. _err_exit:
  2489. _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);
  2490. return _FAIL;
  2491. }
  2492. void rtw_reordering_ctrl_timeout_handler(struct timer_list *t)
  2493. {
  2494. _irqL irql;
  2495. struct recv_reorder_ctrl *preorder_ctrl = from_timer(preorder_ctrl, t, reordering_ctrl_timer);
  2496. _adapter *padapter = preorder_ctrl->padapter;
  2497. _queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
  2498. if (RTW_CANNOT_RUN(padapter))
  2499. return;
  2500. /* RTW_INFO("+rtw_reordering_ctrl_timeout_handler()=>\n"); */
  2501. _enter_critical_bh(&ppending_recvframe_queue->lock, &irql);
  2502. if (preorder_ctrl)
  2503. preorder_ctrl->bReorderWaiting = _FALSE;
  2504. if (recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE) == _TRUE)
  2505. _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME);
  2506. _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);
  2507. }
  2508. int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe);
  2509. int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe)
  2510. {
  2511. int retval = _SUCCESS;
  2512. /* struct recv_priv *precvpriv = &padapter->recvpriv; */
  2513. /* struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib; */
  2514. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  2515. #ifdef CONFIG_TDLS
  2516. struct sta_info *psta = prframe->u.hdr.psta;
  2517. #endif /* CONFIG_TDLS */
  2518. #ifdef CONFIG_80211N_HT
  2519. struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  2520. DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate);
  2521. #ifdef CONFIG_TDLS
  2522. if ((phtpriv->ht_option == _TRUE) ||
  2523. ((psta->tdls_sta_state & TDLS_LINKED_STATE) &&
  2524. (psta->htpriv.ht_option == _TRUE) &&
  2525. (psta->htpriv.ampdu_enable == _TRUE))) /* B/G/N Mode */
  2526. #else
  2527. if (phtpriv->ht_option == _TRUE) /* B/G/N Mode */
  2528. #endif /* CONFIG_TDLS */
  2529. {
  2530. /* prframe->u.hdr.preorder_ctrl = &precvpriv->recvreorder_ctrl[pattrib->priority]; */
  2531. if (recv_indicatepkt_reorder(padapter, prframe) != _SUCCESS) { /* including perform A-MPDU Rx Ordering Buffer Control */
  2532. #ifdef DBG_RX_DROP_FRAME
  2533. RTW_INFO("DBG_RX_DROP_FRAME %s recv_indicatepkt_reorder error!\n", __FUNCTION__);
  2534. #endif
  2535. if (!RTW_CANNOT_RUN(padapter)) {
  2536. retval = _FAIL;
  2537. return retval;
  2538. }
  2539. }
  2540. } else /* B/G mode */
  2541. #endif
  2542. {
  2543. retval = wlanhdr_to_ethhdr(prframe);
  2544. if (retval != _SUCCESS) {
  2545. #ifdef DBG_RX_DROP_FRAME
  2546. RTW_INFO("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\n", __FUNCTION__);
  2547. #endif
  2548. return retval;
  2549. }
  2550. if (!RTW_CANNOT_RUN(padapter)) {
  2551. /* indicate this recv_frame */
  2552. rtw_recv_indicatepkt(padapter, prframe);
  2553. } else {
  2554. retval = _FAIL;
  2555. return retval;
  2556. }
  2557. }
  2558. return retval;
  2559. }
  2560. #ifdef CONFIG_MP_INCLUDED
  2561. int validate_mp_recv_frame(_adapter *adapter, union recv_frame *precv_frame)
  2562. {
  2563. int ret = _SUCCESS;
  2564. u8 *ptr = precv_frame->u.hdr.rx_data;
  2565. u8 type, subtype;
  2566. struct mp_priv *pmppriv = &adapter->mppriv;
  2567. struct mp_tx *pmptx;
  2568. unsigned char *sa , *da, *bs;
  2569. pmptx = &pmppriv->tx;
  2570. #if 0
  2571. if (1) {
  2572. u8 bDumpRxPkt;
  2573. type = GetFrameType(ptr);
  2574. subtype = get_frame_sub_type(ptr); /* bit(7)~bit(2) */
  2575. rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));
  2576. if (bDumpRxPkt == 1) { /* dump all rx packets */
  2577. int i;
  2578. RTW_INFO("############ type:0x%02x subtype:0x%02x #################\n", type, subtype);
  2579. for (i = 0; i < 64; i = i + 8)
  2580. RTW_INFO("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr + i),
  2581. *(ptr + i + 1), *(ptr + i + 2) , *(ptr + i + 3) , *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7));
  2582. RTW_INFO("#############################\n");
  2583. }
  2584. }
  2585. #endif
  2586. if (pmppriv->bloopback) {
  2587. if (_rtw_memcmp(ptr + 24, pmptx->buf + 24, precv_frame->u.hdr.len - 24) == _FALSE) {
  2588. RTW_INFO("Compare payload content Fail !!!\n");
  2589. ret = _FAIL;
  2590. }
  2591. }
  2592. if (pmppriv->bSetRxBssid == _TRUE) {
  2593. sa = get_addr2_ptr(ptr);
  2594. da = GetAddr1Ptr(ptr);
  2595. bs = GetAddr3Ptr(ptr);
  2596. type = GetFrameType(ptr);
  2597. subtype = get_frame_sub_type(ptr); /* bit(7)~bit(2) */
  2598. if (_rtw_memcmp(bs, adapter->mppriv.network_macaddr, ETH_ALEN) == _FALSE)
  2599. ret = _FAIL;
  2600. RTW_DBG("############ type:0x%02x subtype:0x%02x #################\n", type, subtype);
  2601. RTW_DBG("A2 sa %02X:%02X:%02X:%02X:%02X:%02X \n", *(sa) , *(sa + 1), *(sa+ 2), *(sa + 3), *(sa + 4), *(sa + 5));
  2602. RTW_DBG("A1 da %02X:%02X:%02X:%02X:%02X:%02X \n", *(da) , *(da + 1), *(da+ 2), *(da + 3), *(da + 4), *(da + 5));
  2603. RTW_DBG("A3 bs %02X:%02X:%02X:%02X:%02X:%02X \n --------------------------\n", *(bs) , *(bs + 1), *(bs+ 2), *(bs + 3), *(bs + 4), *(bs + 5));
  2604. }
  2605. if (!adapter->mppriv.bmac_filter)
  2606. return ret;
  2607. if (_rtw_memcmp(get_addr2_ptr(ptr), adapter->mppriv.mac_filter, ETH_ALEN) == _FALSE)
  2608. ret = _FAIL;
  2609. return ret;
  2610. }
  2611. static sint MPwlanhdr_to_ethhdr(union recv_frame *precvframe)
  2612. {
  2613. sint rmv_len;
  2614. u16 eth_type, len;
  2615. u8 bsnaphdr;
  2616. u8 *psnap_type;
  2617. u8 mcastheadermac[] = {0x01, 0x00, 0x5e};
  2618. struct ieee80211_snap_hdr *psnap;
  2619. sint ret = _SUCCESS;
  2620. _adapter *adapter = precvframe->u.hdr.adapter;
  2621. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  2622. u8 *ptr = get_recvframe_data(precvframe) ; /* point to frame_ctrl field */
  2623. struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
  2624. if (pattrib->encrypt)
  2625. recvframe_pull_tail(precvframe, pattrib->icv_len);
  2626. psnap = (struct ieee80211_snap_hdr *)(ptr + pattrib->hdrlen + pattrib->iv_len);
  2627. psnap_type = ptr + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE;
  2628. /* convert hdr + possible LLC headers into Ethernet header */
  2629. /* eth_type = (psnap_type[0] << 8) | psnap_type[1]; */
  2630. if ((_rtw_memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) &&
  2631. (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) &&
  2632. (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2) == _FALSE)) ||
  2633. /* eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) || */
  2634. _rtw_memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)) {
  2635. /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */
  2636. bsnaphdr = _TRUE;
  2637. } else {
  2638. /* Leave Ethernet header part of hdr and full payload */
  2639. bsnaphdr = _FALSE;
  2640. }
  2641. rmv_len = pattrib->hdrlen + pattrib->iv_len + (bsnaphdr ? SNAP_SIZE : 0);
  2642. len = precvframe->u.hdr.len - rmv_len;
  2643. _rtw_memcpy(&eth_type, ptr + rmv_len, 2);
  2644. eth_type = ntohs((unsigned short)eth_type); /* pattrib->ether_type */
  2645. pattrib->eth_type = eth_type;
  2646. {
  2647. ptr = recvframe_pull(precvframe, (rmv_len - sizeof(struct ethhdr) + (bsnaphdr ? 2 : 0)));
  2648. }
  2649. _rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);
  2650. _rtw_memcpy(ptr + ETH_ALEN, pattrib->src, ETH_ALEN);
  2651. if (!bsnaphdr) {
  2652. len = htons(len);
  2653. _rtw_memcpy(ptr + 12, &len, 2);
  2654. }
  2655. len = htons(pattrib->seq_num);
  2656. /* RTW_INFO("wlan seq = %d ,seq_num =%x\n",len,pattrib->seq_num); */
  2657. _rtw_memcpy(ptr + 12, &len, 2);
  2658. if (adapter->mppriv.bRTWSmbCfg == _TRUE) {
  2659. /* if(_rtw_memcmp(mcastheadermac, pattrib->dst, 3) == _TRUE) */ /* SimpleConfig Dest. */
  2660. /* _rtw_memcpy(ptr+ETH_ALEN, pattrib->bssid, ETH_ALEN); */
  2661. if (_rtw_memcmp(mcastheadermac, pattrib->bssid, 3) == _TRUE) /* SimpleConfig Dest. */
  2662. _rtw_memcpy(ptr, pattrib->bssid, ETH_ALEN);
  2663. }
  2664. return ret;
  2665. }
  2666. int mp_recv_frame(_adapter *padapter, union recv_frame *rframe)
  2667. {
  2668. int ret = _SUCCESS;
  2669. struct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib;
  2670. struct recv_priv *precvpriv = &padapter->recvpriv;
  2671. _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
  2672. #ifdef CONFIG_MP_INCLUDED
  2673. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  2674. struct mp_priv *pmppriv = &padapter->mppriv;
  2675. #endif /* CONFIG_MP_INCLUDED */
  2676. u8 type;
  2677. u8 *ptr = rframe->u.hdr.rx_data;
  2678. u8 *psa, *pda, *pbssid;
  2679. struct sta_info *psta = NULL;
  2680. DBG_COUNTER(padapter->rx_logs.core_rx_pre);
  2681. if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) { /* &&(padapter->mppriv.check_mp_pkt == 0)) */
  2682. if (pattrib->crc_err == 1)
  2683. padapter->mppriv.rx_crcerrpktcount++;
  2684. else {
  2685. if (_SUCCESS == validate_mp_recv_frame(padapter, rframe))
  2686. padapter->mppriv.rx_pktcount++;
  2687. else
  2688. padapter->mppriv.rx_pktcount_filter_out++;
  2689. }
  2690. if (pmppriv->rx_bindicatePkt == _FALSE) {
  2691. ret = _FAIL;
  2692. rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */
  2693. goto exit;
  2694. } else {
  2695. type = GetFrameType(ptr);
  2696. pattrib->to_fr_ds = get_tofr_ds(ptr);
  2697. pattrib->frag_num = GetFragNum(ptr);
  2698. pattrib->seq_num = GetSequence(ptr);
  2699. pattrib->pw_save = GetPwrMgt(ptr);
  2700. pattrib->mfrag = GetMFrag(ptr);
  2701. pattrib->mdata = GetMData(ptr);
  2702. pattrib->privacy = GetPrivacy(ptr);
  2703. pattrib->order = GetOrder(ptr);
  2704. if (type == WIFI_DATA_TYPE) {
  2705. pda = get_da(ptr);
  2706. psa = get_sa(ptr);
  2707. pbssid = get_hdr_bssid(ptr);
  2708. _rtw_memcpy(pattrib->dst, pda, ETH_ALEN);
  2709. _rtw_memcpy(pattrib->src, psa, ETH_ALEN);
  2710. _rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN);
  2711. switch (pattrib->to_fr_ds) {
  2712. case 0:
  2713. _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
  2714. _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
  2715. ret = sta2sta_data_frame(padapter, rframe, &psta);
  2716. break;
  2717. case 1:
  2718. _rtw_memcpy(pattrib->ra, pda, ETH_ALEN);
  2719. _rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN);
  2720. ret = ap2sta_data_frame(padapter, rframe, &psta);
  2721. break;
  2722. case 2:
  2723. _rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN);
  2724. _rtw_memcpy(pattrib->ta, psa, ETH_ALEN);
  2725. ret = sta2ap_data_frame(padapter, rframe, &psta);
  2726. break;
  2727. case 3:
  2728. _rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);
  2729. _rtw_memcpy(pattrib->ta, get_addr2_ptr(ptr), ETH_ALEN);
  2730. ret = _FAIL;
  2731. break;
  2732. default:
  2733. ret = _FAIL;
  2734. break;
  2735. }
  2736. ret = MPwlanhdr_to_ethhdr(rframe);
  2737. if (ret != _SUCCESS) {
  2738. #ifdef DBG_RX_DROP_FRAME
  2739. RTW_INFO("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\n", __FUNCTION__);
  2740. #endif
  2741. rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */
  2742. ret = _FAIL;
  2743. goto exit;
  2744. }
  2745. if (!RTW_CANNOT_RUN(padapter)) {
  2746. /* indicate this recv_frame */
  2747. ret = rtw_recv_indicatepkt(padapter, rframe);
  2748. if (ret != _SUCCESS) {
  2749. #ifdef DBG_RX_DROP_FRAME
  2750. RTW_INFO("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__);
  2751. #endif
  2752. rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */
  2753. ret = _FAIL;
  2754. goto exit;
  2755. }
  2756. } else {
  2757. #ifdef DBG_RX_DROP_FRAME
  2758. RTW_INFO("DBG_RX_DROP_FRAME %s ecv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)\n", __func__,
  2759. rtw_is_drv_stopped(padapter) ? "True" : "False",
  2760. rtw_is_surprise_removed(padapter) ? "True" : "False");
  2761. #endif
  2762. ret = _FAIL;
  2763. rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */
  2764. goto exit;
  2765. }
  2766. }
  2767. }
  2768. }
  2769. rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */
  2770. ret = _FAIL;
  2771. exit:
  2772. return ret;
  2773. }
  2774. #endif
  2775. static sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, u8 *buf)
  2776. {
  2777. #define CHAN2FREQ(a) ((a < 14) ? (2407+5*a) : (5000+5*a))
  2778. #if 0
  2779. #define RTW_RX_RADIOTAP_PRESENT (\
  2780. (1 << IEEE80211_RADIOTAP_TSFT) | \
  2781. (1 << IEEE80211_RADIOTAP_FLAGS) | \
  2782. (1 << IEEE80211_RADIOTAP_RATE) | \
  2783. (1 << IEEE80211_RADIOTAP_CHANNEL) | \
  2784. (0 << IEEE80211_RADIOTAP_FHSS) | \
  2785. (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \
  2786. (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \
  2787. (0 << IEEE80211_RADIOTAP_LOCK_QUALITY) | \
  2788. (0 << IEEE80211_RADIOTAP_TX_ATTENUATION) | \
  2789. (0 << IEEE80211_RADIOTAP_DB_TX_ATTENUATION) | \
  2790. (0 << IEEE80211_RADIOTAP_DBM_TX_POWER) | \
  2791. (1 << IEEE80211_RADIOTAP_ANTENNA) | \
  2792. (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \
  2793. (0 << IEEE80211_RADIOTAP_DB_ANTNOISE) | \
  2794. (0 << IEEE80211_RADIOTAP_RX_FLAGS) | \
  2795. (0 << IEEE80211_RADIOTAP_TX_FLAGS) | \
  2796. (0 << IEEE80211_RADIOTAP_RTS_RETRIES) | \
  2797. (0 << IEEE80211_RADIOTAP_DATA_RETRIES) | \
  2798. (0 << IEEE80211_RADIOTAP_MCS) | \
  2799. (0 << IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE)| \
  2800. (0 << IEEE80211_RADIOTAP_VENDOR_NAMESPACE) | \
  2801. (0 << IEEE80211_RADIOTAP_EXT) | \
  2802. 0)
  2803. /* (0 << IEEE80211_RADIOTAP_AMPDU_STATUS) | \ */
  2804. /* (0 << IEEE80211_RADIOTAP_VHT) | \ */
  2805. #endif
  2806. #ifndef IEEE80211_RADIOTAP_RX_FLAGS
  2807. #define IEEE80211_RADIOTAP_RX_FLAGS 14
  2808. #endif
  2809. #ifndef IEEE80211_RADIOTAP_MCS
  2810. #define IEEE80211_RADIOTAP_MCS 19
  2811. #endif
  2812. #ifndef IEEE80211_RADIOTAP_VHT
  2813. #define IEEE80211_RADIOTAP_VHT 21
  2814. #endif
  2815. #ifndef IEEE80211_RADIOTAP_F_BADFCS
  2816. #define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* bad FCS */
  2817. #endif
  2818. sint ret = _SUCCESS;
  2819. _adapter *adapter = precvframe->u.hdr.adapter;
  2820. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  2821. struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
  2822. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  2823. u16 tmp_16bit = 0;
  2824. u8 data_rate[] = {
  2825. 2, 4, 11, 22, /* CCK */
  2826. 12, 18, 24, 36, 48, 72, 93, 108, /* OFDM */
  2827. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* HT MCS index */
  2828. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  2829. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 1 */
  2830. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 2 */
  2831. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 3 */
  2832. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 4 */
  2833. };
  2834. _pkt *pskb = NULL;
  2835. struct ieee80211_radiotap_header *rtap_hdr = NULL;
  2836. u8 *ptr = NULL;
  2837. u8 hdr_buf[64] = {0};
  2838. u16 rt_len = 8;
  2839. /* create header */
  2840. rtap_hdr = (struct ieee80211_radiotap_header *)&hdr_buf[0];
  2841. rtap_hdr->it_version = PKTHDR_RADIOTAP_VERSION;
  2842. /* tsft */
  2843. if (pattrib->tsfl) {
  2844. u64 tmp_64bit;
  2845. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_TSFT);
  2846. tmp_64bit = cpu_to_le64(pattrib->tsfl);
  2847. memcpy(&hdr_buf[rt_len], &tmp_64bit, 8);
  2848. rt_len += 8;
  2849. }
  2850. /* flags */
  2851. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_FLAGS);
  2852. if (0)
  2853. hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_CFP;
  2854. if (0)
  2855. hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_SHORTPRE;
  2856. if ((pattrib->encrypt == 1) || (pattrib->encrypt == 5))
  2857. hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_WEP;
  2858. if (pattrib->mfrag)
  2859. hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_FRAG;
  2860. /* always append FCS */
  2861. hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_FCS;
  2862. if (0)
  2863. hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_DATAPAD;
  2864. if (pattrib->crc_err)
  2865. hdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_BADFCS;
  2866. if (pattrib->sgi) {
  2867. /* Currently unspecified but used */
  2868. hdr_buf[rt_len] |= 0x80;
  2869. }
  2870. rt_len += 1;
  2871. /* rate */
  2872. if (pattrib->data_rate < 12) {
  2873. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_RATE);
  2874. if (pattrib->data_rate < 4) {
  2875. /* CCK */
  2876. hdr_buf[rt_len] = data_rate[pattrib->data_rate];
  2877. } else {
  2878. /* OFDM */
  2879. hdr_buf[rt_len] = data_rate[pattrib->data_rate];
  2880. }
  2881. }
  2882. rt_len += 1; /* force padding 1 byte for aligned */
  2883. /* channel */
  2884. tmp_16bit = 0;
  2885. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_CHANNEL);
  2886. tmp_16bit = CHAN2FREQ(rtw_get_oper_ch(padapter));
  2887. /*tmp_16bit = CHAN2FREQ(pHalData->current_channel);*/
  2888. memcpy(&hdr_buf[rt_len], &tmp_16bit, 2);
  2889. rt_len += 2;
  2890. /* channel flags */
  2891. tmp_16bit = 0;
  2892. if (pHalData->current_band_type == 0)
  2893. tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_2GHZ);
  2894. else
  2895. tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_5GHZ);
  2896. if (pattrib->data_rate < 12) {
  2897. if (pattrib->data_rate < 4) {
  2898. /* CCK */
  2899. tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_CCK);
  2900. } else {
  2901. /* OFDM */
  2902. tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_OFDM);
  2903. }
  2904. } else
  2905. tmp_16bit |= cpu_to_le16(IEEE80211_CHAN_DYN);
  2906. memcpy(&hdr_buf[rt_len], &tmp_16bit, 2);
  2907. rt_len += 2;
  2908. /* dBm Antenna Signal */
  2909. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);
  2910. hdr_buf[rt_len] = pattrib->phy_info.RecvSignalPower;
  2911. rt_len += 1;
  2912. #if 0
  2913. /* dBm Antenna Noise */
  2914. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE);
  2915. hdr_buf[rt_len] = 0;
  2916. rt_len += 1;
  2917. /* Signal Quality */
  2918. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_LOCK_QUALITY);
  2919. hdr_buf[rt_len] = pattrib->phy_info.SignalQuality;
  2920. rt_len += 1;
  2921. #endif
  2922. /* Antenna */
  2923. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_ANTENNA);
  2924. hdr_buf[rt_len] = 0; /* pHalData->rf_type; */
  2925. rt_len += 1;
  2926. /* RX flags */
  2927. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_RX_FLAGS);
  2928. #if 0
  2929. tmp_16bit = cpu_to_le16(0);
  2930. memcpy(ptr, &tmp_16bit, 1);
  2931. #endif
  2932. rt_len += 2;
  2933. /* MCS information */
  2934. if (pattrib->data_rate >= 12 && pattrib->data_rate < 44) {
  2935. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_MCS);
  2936. /* known, flag */
  2937. hdr_buf[rt_len] |= BIT1; /* MCS index known */
  2938. /* bandwidth */
  2939. hdr_buf[rt_len] |= BIT0;
  2940. hdr_buf[rt_len + 1] |= (pattrib->bw & 0x03);
  2941. /* guard interval */
  2942. hdr_buf[rt_len] |= BIT2;
  2943. hdr_buf[rt_len + 1] |= (pattrib->sgi & 0x01) << 2;
  2944. /* STBC */
  2945. hdr_buf[rt_len] |= BIT5;
  2946. hdr_buf[rt_len + 1] |= (pattrib->stbc & 0x03) << 5;
  2947. rt_len += 2;
  2948. /* MCS rate index */
  2949. hdr_buf[rt_len] = data_rate[pattrib->data_rate];
  2950. rt_len += 1;
  2951. }
  2952. /* VHT */
  2953. if (pattrib->data_rate >= 44 && pattrib->data_rate < 84) {
  2954. rtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_VHT);
  2955. /* known 16 bit, flag 8 bit */
  2956. tmp_16bit = 0;
  2957. /* Bandwidth */
  2958. tmp_16bit |= BIT6;
  2959. /* Group ID */
  2960. tmp_16bit |= BIT7;
  2961. /* Partial AID */
  2962. tmp_16bit |= BIT8;
  2963. /* STBC */
  2964. tmp_16bit |= BIT0;
  2965. hdr_buf[rt_len + 2] |= (pattrib->stbc & 0x01);
  2966. /* Guard interval */
  2967. tmp_16bit |= BIT2;
  2968. hdr_buf[rt_len + 2] |= (pattrib->sgi & 0x01) << 2;
  2969. /* LDPC extra OFDM symbol */
  2970. tmp_16bit |= BIT4;
  2971. hdr_buf[rt_len + 2] |= (pattrib->ldpc & 0x01) << 4;
  2972. memcpy(&hdr_buf[rt_len], &tmp_16bit, 2);
  2973. rt_len += 3;
  2974. /* bandwidth */
  2975. if (pattrib->bw == 0)
  2976. hdr_buf[rt_len] |= 0;
  2977. else if (pattrib->bw == 1)
  2978. hdr_buf[rt_len] |= 1;
  2979. else if (pattrib->bw == 2)
  2980. hdr_buf[rt_len] |= 4;
  2981. else if (pattrib->bw == 3)
  2982. hdr_buf[rt_len] |= 11;
  2983. rt_len += 1;
  2984. /* mcs_nss */
  2985. if (pattrib->data_rate >= 44 && pattrib->data_rate < 54) {
  2986. hdr_buf[rt_len] |= 1;
  2987. hdr_buf[rt_len] |= data_rate[pattrib->data_rate] << 4;
  2988. } else if (pattrib->data_rate >= 54 && pattrib->data_rate < 64) {
  2989. hdr_buf[rt_len + 1] |= 2;
  2990. hdr_buf[rt_len + 1] |= data_rate[pattrib->data_rate] << 4;
  2991. } else if (pattrib->data_rate >= 64 && pattrib->data_rate < 74) {
  2992. hdr_buf[rt_len + 2] |= 3;
  2993. hdr_buf[rt_len + 2] |= data_rate[pattrib->data_rate] << 4;
  2994. } else if (pattrib->data_rate >= 74 && pattrib->data_rate < 84) {
  2995. hdr_buf[rt_len + 3] |= 4;
  2996. hdr_buf[rt_len + 3] |= data_rate[pattrib->data_rate] << 4;
  2997. }
  2998. rt_len += 4;
  2999. /* coding */
  3000. hdr_buf[rt_len] = 0;
  3001. rt_len += 1;
  3002. /* group_id */
  3003. hdr_buf[rt_len] = 0;
  3004. rt_len += 1;
  3005. /* partial_aid */
  3006. tmp_16bit = 0;
  3007. memcpy(&hdr_buf[rt_len], &tmp_16bit, 2);
  3008. rt_len += 2;
  3009. }
  3010. /* push to skb */
  3011. pskb = (_pkt *)buf;
  3012. if (skb_headroom(pskb) < rt_len) {
  3013. RTW_INFO("%s:%d %s headroom is too small.\n", __FILE__, __LINE__, __func__);
  3014. ret = _FAIL;
  3015. return ret;
  3016. }
  3017. ptr = skb_push(pskb, rt_len);
  3018. if (ptr) {
  3019. rtap_hdr->it_len = cpu_to_le16(rt_len);
  3020. memcpy(ptr, rtap_hdr, rt_len);
  3021. } else
  3022. ret = _FAIL;
  3023. return ret;
  3024. }
  3025. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24))
  3026. int recv_frame_monitor(_adapter *padapter, union recv_frame *rframe)
  3027. {
  3028. int ret = _SUCCESS;
  3029. struct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib;
  3030. struct recv_priv *precvpriv = &padapter->recvpriv;
  3031. _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
  3032. _pkt *pskb = NULL;
  3033. /* read skb information from recv frame */
  3034. pskb = rframe->u.hdr.pkt;
  3035. pskb->len = rframe->u.hdr.len;
  3036. pskb->data = rframe->u.hdr.rx_data;
  3037. skb_set_tail_pointer(pskb, rframe->u.hdr.len);
  3038. /* fill radiotap header */
  3039. if (fill_radiotap_hdr(padapter, rframe, (u8 *)pskb) == _FAIL) {
  3040. ret = _FAIL;
  3041. rtw_free_recvframe(rframe, pfree_recv_queue); /* free this recv_frame */
  3042. goto exit;
  3043. }
  3044. /* write skb information to recv frame */
  3045. skb_reset_mac_header(pskb);
  3046. rframe->u.hdr.len = pskb->len;
  3047. rframe->u.hdr.rx_data = pskb->data;
  3048. rframe->u.hdr.rx_head = pskb->head;
  3049. rframe->u.hdr.rx_tail = skb_tail_pointer(pskb);
  3050. rframe->u.hdr.rx_end = skb_end_pointer(pskb);
  3051. if (!RTW_CANNOT_RUN(padapter)) {
  3052. /* indicate this recv_frame */
  3053. ret = rtw_recv_monitor(padapter, rframe);
  3054. if (ret != _SUCCESS) {
  3055. ret = _FAIL;
  3056. rtw_free_recvframe(rframe, pfree_recv_queue); /* free this recv_frame */
  3057. goto exit;
  3058. }
  3059. } else {
  3060. ret = _FAIL;
  3061. rtw_free_recvframe(rframe, pfree_recv_queue); /* free this recv_frame */
  3062. goto exit;
  3063. }
  3064. exit:
  3065. return ret;
  3066. }
  3067. #endif
  3068. int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe)
  3069. {
  3070. int ret = _SUCCESS;
  3071. struct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib;
  3072. struct recv_priv *precvpriv = &padapter->recvpriv;
  3073. _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
  3074. #ifdef DBG_RX_COUNTER_DUMP
  3075. if (padapter->dump_rx_cnt_mode & DUMP_DRV_RX_COUNTER) {
  3076. if (pattrib->crc_err == 1)
  3077. padapter->drv_rx_cnt_crcerror++;
  3078. else
  3079. padapter->drv_rx_cnt_ok++;
  3080. }
  3081. #endif
  3082. #ifdef CONFIG_MP_INCLUDED
  3083. if (padapter->registrypriv.mp_mode == 1 || padapter->mppriv.bRTWSmbCfg == _TRUE) {
  3084. mp_recv_frame(padapter, rframe);
  3085. ret = _FAIL;
  3086. goto exit;
  3087. } else
  3088. #endif
  3089. {
  3090. /* check the frame crtl field and decache */
  3091. ret = validate_recv_frame(padapter, rframe);
  3092. if (ret != _SUCCESS) {
  3093. rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */
  3094. goto exit;
  3095. }
  3096. }
  3097. exit:
  3098. return ret;
  3099. }
  3100. /*#define DBG_RX_BMC_FRAME*/
  3101. int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
  3102. {
  3103. int ret = _SUCCESS;
  3104. union recv_frame *orig_prframe = prframe;
  3105. struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  3106. struct recv_priv *precvpriv = &padapter->recvpriv;
  3107. _queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
  3108. #ifdef CONFIG_TDLS
  3109. u8 *psnap_type, *pcategory;
  3110. #endif /* CONFIG_TDLS */
  3111. DBG_COUNTER(padapter->rx_logs.core_rx_post);
  3112. /* DATA FRAME */
  3113. rtw_led_control(padapter, LED_CTL_RX);
  3114. prframe = decryptor(padapter, prframe);
  3115. if (prframe == NULL) {
  3116. #ifdef DBG_RX_DROP_FRAME
  3117. RTW_INFO("DBG_RX_DROP_FRAME %s decryptor: drop pkt\n", __FUNCTION__);
  3118. #endif
  3119. ret = _FAIL;
  3120. DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_err);
  3121. goto _recv_data_drop;
  3122. }
  3123. #ifdef DBG_RX_BMC_FRAME
  3124. if (IS_MCAST(pattrib->ra)) {
  3125. u8 *pbuf = prframe->u.hdr.rx_data;
  3126. u8 *sa_addr = get_sa(pbuf);
  3127. RTW_INFO("%s =>"ADPT_FMT" Rx BC/MC from MAC: "MAC_FMT"\n", __func__, ADPT_ARG(padapter), MAC_ARG(sa_addr));
  3128. }
  3129. #endif
  3130. #if 0
  3131. if (padapter->adapter_type == PRIMARY_ADAPTER) {
  3132. RTW_INFO("+++\n");
  3133. {
  3134. int i;
  3135. u8 *ptr = get_recvframe_data(prframe);
  3136. for (i = 0; i < 140; i = i + 8)
  3137. RTW_INFO("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:", *(ptr + i),
  3138. *(ptr + i + 1), *(ptr + i + 2) , *(ptr + i + 3) , *(ptr + i + 4), *(ptr + i + 5), *(ptr + i + 6), *(ptr + i + 7));
  3139. }
  3140. RTW_INFO("---\n");
  3141. }
  3142. #endif
  3143. #ifdef CONFIG_TDLS
  3144. /* check TDLS frame */
  3145. psnap_type = get_recvframe_data(orig_prframe) + pattrib->hdrlen + pattrib->iv_len + SNAP_SIZE;
  3146. pcategory = psnap_type + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;
  3147. if ((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, ETH_TYPE_LEN)) &&
  3148. ((*pcategory == RTW_WLAN_CATEGORY_TDLS) || (*pcategory == RTW_WLAN_CATEGORY_P2P))) {
  3149. ret = OnTDLS(padapter, prframe);
  3150. if (ret == _FAIL)
  3151. goto _exit_recv_func;
  3152. }
  3153. #endif /* CONFIG_TDLS */
  3154. prframe = recvframe_chk_defrag(padapter, prframe);
  3155. if (prframe == NULL) {
  3156. #ifdef DBG_RX_DROP_FRAME
  3157. RTW_INFO("DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\n", __FUNCTION__);
  3158. #endif
  3159. DBG_COUNTER(padapter->rx_logs.core_rx_post_defrag_err);
  3160. goto _recv_data_drop;
  3161. }
  3162. prframe = portctrl(padapter, prframe);
  3163. if (prframe == NULL) {
  3164. #ifdef DBG_RX_DROP_FRAME
  3165. RTW_INFO("DBG_RX_DROP_FRAME %s portctrl: drop pkt\n", __FUNCTION__);
  3166. #endif
  3167. ret = _FAIL;
  3168. DBG_COUNTER(padapter->rx_logs.core_rx_post_portctrl_err);
  3169. goto _recv_data_drop;
  3170. }
  3171. count_rx_stats(padapter, prframe, NULL);
  3172. #ifdef CONFIG_WAPI_SUPPORT
  3173. rtw_wapi_update_info(padapter, prframe);
  3174. #endif
  3175. #ifdef CONFIG_80211N_HT
  3176. ret = process_recv_indicatepkts(padapter, prframe);
  3177. if (ret != _SUCCESS) {
  3178. #ifdef DBG_RX_DROP_FRAME
  3179. RTW_INFO("DBG_RX_DROP_FRAME %s process_recv_indicatepkts fail!\n", __FUNCTION__);
  3180. #endif
  3181. rtw_free_recvframe(orig_prframe, pfree_recv_queue);/* free this recv_frame */
  3182. DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_err);
  3183. goto _recv_data_drop;
  3184. }
  3185. #else /* CONFIG_80211N_HT */
  3186. if (!pattrib->amsdu) {
  3187. ret = wlanhdr_to_ethhdr(prframe);
  3188. if (ret != _SUCCESS) {
  3189. #ifdef DBG_RX_DROP_FRAME
  3190. RTW_INFO("DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\n", __FUNCTION__);
  3191. #endif
  3192. rtw_free_recvframe(orig_prframe, pfree_recv_queue);/* free this recv_frame */
  3193. goto _recv_data_drop;
  3194. }
  3195. if (!RTW_CANNOT_RUN(padapter)) {
  3196. /* indicate this recv_frame */
  3197. ret = rtw_recv_indicatepkt(padapter, prframe);
  3198. if (ret != _SUCCESS) {
  3199. #ifdef DBG_RX_DROP_FRAME
  3200. RTW_INFO("DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\n", __FUNCTION__);
  3201. #endif
  3202. goto _recv_data_drop;
  3203. }
  3204. } else {
  3205. #ifdef DBG_RX_DROP_FRAME
  3206. RTW_INFO("DBG_RX_DROP_FRAME %s recv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)\n", __func__
  3207. , rtw_is_drv_stopped(padapter) ? "True" : "False"
  3208. , rtw_is_surprise_removed(padapter) ? "True" : "False");
  3209. #endif
  3210. ret = _FAIL;
  3211. rtw_free_recvframe(orig_prframe, pfree_recv_queue); /* free this recv_frame */
  3212. }
  3213. } else if (pattrib->amsdu == 1) {
  3214. ret = amsdu_to_msdu(padapter, prframe);
  3215. if (ret != _SUCCESS) {
  3216. #ifdef DBG_RX_DROP_FRAME
  3217. RTW_INFO("DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\n", __FUNCTION__);
  3218. #endif
  3219. rtw_free_recvframe(orig_prframe, pfree_recv_queue);
  3220. goto _recv_data_drop;
  3221. }
  3222. } else {
  3223. #ifdef DBG_RX_DROP_FRAME
  3224. RTW_INFO("DBG_RX_DROP_FRAME %s what is this condition??\n", __FUNCTION__);
  3225. #endif
  3226. goto _recv_data_drop;
  3227. }
  3228. #endif /* CONFIG_80211N_HT */
  3229. _exit_recv_func:
  3230. return ret;
  3231. _recv_data_drop:
  3232. precvpriv->rx_drop++;
  3233. return ret;
  3234. }
  3235. int recv_func(_adapter *padapter, union recv_frame *rframe);
  3236. int recv_func(_adapter *padapter, union recv_frame *rframe)
  3237. {
  3238. int ret;
  3239. struct rx_pkt_attrib *prxattrib = &rframe->u.hdr.attrib;
  3240. struct recv_priv *recvpriv = &padapter->recvpriv;
  3241. struct security_priv *psecuritypriv = &padapter->securitypriv;
  3242. struct mlme_priv *mlmepriv = &padapter->mlmepriv;
  3243. if (check_fwstate(mlmepriv, WIFI_MONITOR_STATE)) {
  3244. /* monitor mode */
  3245. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24))
  3246. recv_frame_monitor(padapter, rframe);
  3247. #endif
  3248. ret = _SUCCESS;
  3249. goto exit;
  3250. } else
  3251. /* check if need to handle uc_swdec_pending_queue*/
  3252. if (check_fwstate(mlmepriv, WIFI_STATION_STATE) && psecuritypriv->busetkipkey) {
  3253. union recv_frame *pending_frame;
  3254. int cnt = 0;
  3255. while ((pending_frame = rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue))) {
  3256. cnt++;
  3257. DBG_COUNTER(padapter->rx_logs.core_rx_dequeue);
  3258. recv_func_posthandle(padapter, pending_frame);
  3259. }
  3260. if (cnt)
  3261. RTW_INFO(FUNC_ADPT_FMT" dequeue %d from uc_swdec_pending_queue\n",
  3262. FUNC_ADPT_ARG(padapter), cnt);
  3263. }
  3264. DBG_COUNTER(padapter->rx_logs.core_rx);
  3265. ret = recv_func_prehandle(padapter, rframe);
  3266. if (ret == _SUCCESS) {
  3267. /* check if need to enqueue into uc_swdec_pending_queue*/
  3268. if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
  3269. !IS_MCAST(prxattrib->ra) && prxattrib->encrypt > 0 &&
  3270. (prxattrib->bdecrypted == 0 || psecuritypriv->sw_decrypt == _TRUE) &&
  3271. psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPAPSK &&
  3272. !psecuritypriv->busetkipkey) {
  3273. DBG_COUNTER(padapter->rx_logs.core_rx_enqueue);
  3274. rtw_enqueue_recvframe(rframe, &padapter->recvpriv.uc_swdec_pending_queue);
  3275. /* RTW_INFO("%s: no key, enqueue uc_swdec_pending_queue\n", __func__); */
  3276. if (recvpriv->free_recvframe_cnt < NR_RECVFRAME / 4) {
  3277. /* to prevent from recvframe starvation, get recvframe from uc_swdec_pending_queue to free_recvframe_cnt */
  3278. rframe = rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue);
  3279. if (rframe)
  3280. goto do_posthandle;
  3281. }
  3282. goto exit;
  3283. }
  3284. do_posthandle:
  3285. ret = recv_func_posthandle(padapter, rframe);
  3286. }
  3287. exit:
  3288. return ret;
  3289. }
  3290. s32 rtw_recv_entry(union recv_frame *precvframe)
  3291. {
  3292. _adapter *padapter;
  3293. struct recv_priv *precvpriv;
  3294. s32 ret = _SUCCESS;
  3295. padapter = precvframe->u.hdr.adapter;
  3296. precvpriv = &padapter->recvpriv;
  3297. ret = recv_func(padapter, precvframe);
  3298. if (ret == _FAIL) {
  3299. goto _recv_entry_drop;
  3300. }
  3301. precvpriv->rx_pkts++;
  3302. return ret;
  3303. _recv_entry_drop:
  3304. #ifdef CONFIG_MP_INCLUDED
  3305. if (padapter->registrypriv.mp_mode == 1)
  3306. padapter->mppriv.rx_pktloss = precvpriv->rx_drop;
  3307. #endif
  3308. return ret;
  3309. }
  3310. #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  3311. static void rtw_signal_stat_timer_hdl(struct timer_list *t)
  3312. {
  3313. struct recv_priv *recvpriv = from_timer(recvpriv, t, signal_stat_timer);
  3314. _adapter *adapter = container_of(recvpriv, _adapter, recvpriv);
  3315. u32 tmp_s, tmp_q;
  3316. u8 avg_signal_strength = 0;
  3317. u8 avg_signal_qual = 0;
  3318. u32 num_signal_strength = 0;
  3319. u32 num_signal_qual = 0;
  3320. u8 ratio_pre_stat = 0, ratio_curr_stat = 0, ratio_total = 0, ratio_profile = SIGNAL_STAT_CALC_PROFILE_0;
  3321. if (adapter->recvpriv.is_signal_dbg) {
  3322. /* update the user specific value, signal_strength_dbg, to signal_strength, rssi */
  3323. adapter->recvpriv.signal_strength = adapter->recvpriv.signal_strength_dbg;
  3324. adapter->recvpriv.rssi = (s8)translate_percentage_to_dbm((u8)adapter->recvpriv.signal_strength_dbg);
  3325. } else {
  3326. if (recvpriv->signal_strength_data.update_req == 0) { /* update_req is clear, means we got rx */
  3327. avg_signal_strength = recvpriv->signal_strength_data.avg_val;
  3328. num_signal_strength = recvpriv->signal_strength_data.total_num;
  3329. /* after avg_vals are accquired, we can re-stat the signal values */
  3330. recvpriv->signal_strength_data.update_req = 1;
  3331. }
  3332. if (recvpriv->signal_qual_data.update_req == 0) { /* update_req is clear, means we got rx */
  3333. avg_signal_qual = recvpriv->signal_qual_data.avg_val;
  3334. num_signal_qual = recvpriv->signal_qual_data.total_num;
  3335. /* after avg_vals are accquired, we can re-stat the signal values */
  3336. recvpriv->signal_qual_data.update_req = 1;
  3337. }
  3338. if (num_signal_strength == 0) {
  3339. if (rtw_get_on_cur_ch_time(adapter) == 0
  3340. || rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) < 2 * adapter->mlmeextpriv.mlmext_info.bcn_interval
  3341. )
  3342. goto set_timer;
  3343. }
  3344. if (check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE
  3345. || check_fwstate(&adapter->mlmepriv, _FW_LINKED) == _FALSE
  3346. )
  3347. goto set_timer;
  3348. #ifdef CONFIG_CONCURRENT_MODE
  3349. if (rtw_mi_buddy_check_fwstate(adapter, _FW_UNDER_SURVEY) == _TRUE)
  3350. goto set_timer;
  3351. #endif
  3352. if (RTW_SIGNAL_STATE_CALC_PROFILE < SIGNAL_STAT_CALC_PROFILE_MAX)
  3353. ratio_profile = RTW_SIGNAL_STATE_CALC_PROFILE;
  3354. ratio_pre_stat = signal_stat_calc_profile[ratio_profile][0];
  3355. ratio_curr_stat = signal_stat_calc_profile[ratio_profile][1];
  3356. ratio_total = ratio_pre_stat + ratio_curr_stat;
  3357. /* update value of signal_strength, rssi, signal_qual */
  3358. tmp_s = (ratio_curr_stat * avg_signal_strength + ratio_pre_stat * recvpriv->signal_strength);
  3359. if (tmp_s % ratio_total)
  3360. tmp_s = tmp_s / ratio_total + 1;
  3361. else
  3362. tmp_s = tmp_s / ratio_total;
  3363. if (tmp_s > 100)
  3364. tmp_s = 100;
  3365. tmp_q = (ratio_curr_stat * avg_signal_qual + ratio_pre_stat * recvpriv->signal_qual);
  3366. if (tmp_q % ratio_total)
  3367. tmp_q = tmp_q / ratio_total + 1;
  3368. else
  3369. tmp_q = tmp_q / ratio_total;
  3370. if (tmp_q > 100)
  3371. tmp_q = 100;
  3372. recvpriv->signal_strength = tmp_s;
  3373. recvpriv->rssi = (s8)translate_percentage_to_dbm(tmp_s);
  3374. recvpriv->signal_qual = tmp_q;
  3375. #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1
  3376. RTW_INFO(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u"
  3377. ", num_signal_strength:%u, num_signal_qual:%u"
  3378. ", on_cur_ch_ms:%d"
  3379. "\n"
  3380. , FUNC_ADPT_ARG(adapter)
  3381. , recvpriv->signal_strength
  3382. , recvpriv->rssi
  3383. , recvpriv->signal_qual
  3384. , num_signal_strength, num_signal_qual
  3385. , rtw_get_on_cur_ch_time(adapter) ? rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) : 0
  3386. );
  3387. #endif
  3388. }
  3389. set_timer:
  3390. rtw_set_signal_stat_timer(recvpriv);
  3391. }
  3392. #endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */
  3393. static void rx_process_rssi(_adapter *padapter, union recv_frame *prframe)
  3394. {
  3395. u32 last_rssi, tmp_val;
  3396. struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
  3397. #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  3398. struct signal_stat *signal_stat = &padapter->recvpriv.signal_strength_data;
  3399. #endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */
  3400. /* RTW_INFO("process_rssi=> pattrib->rssil(%d) signal_strength(%d)\n ",pattrib->RecvSignalPower,pattrib->signal_strength); */
  3401. /* if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon) */
  3402. {
  3403. #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  3404. if (signal_stat->update_req) {
  3405. signal_stat->total_num = 0;
  3406. signal_stat->total_val = 0;
  3407. signal_stat->update_req = 0;
  3408. }
  3409. signal_stat->total_num++;
  3410. signal_stat->total_val += pattrib->phy_info.SignalStrength;
  3411. signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num;
  3412. #else /* CONFIG_NEW_SIGNAL_STAT_PROCESS */
  3413. /* Adapter->RxStats.RssiCalculateCnt++; */ /* For antenna Test */
  3414. if (padapter->recvpriv.signal_strength_data.total_num++ >= PHY_RSSI_SLID_WIN_MAX) {
  3415. padapter->recvpriv.signal_strength_data.total_num = PHY_RSSI_SLID_WIN_MAX;
  3416. last_rssi = padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index];
  3417. padapter->recvpriv.signal_strength_data.total_val -= last_rssi;
  3418. }
  3419. padapter->recvpriv.signal_strength_data.total_val += pattrib->phy_info.SignalStrength;
  3420. padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index++] = pattrib->phy_info.SignalStrength;
  3421. if (padapter->recvpriv.signal_strength_data.index >= PHY_RSSI_SLID_WIN_MAX)
  3422. padapter->recvpriv.signal_strength_data.index = 0;
  3423. tmp_val = padapter->recvpriv.signal_strength_data.total_val / padapter->recvpriv.signal_strength_data.total_num;
  3424. if (padapter->recvpriv.is_signal_dbg) {
  3425. padapter->recvpriv.signal_strength = padapter->recvpriv.signal_strength_dbg;
  3426. padapter->recvpriv.rssi = (s8)translate_percentage_to_dbm(padapter->recvpriv.signal_strength_dbg);
  3427. } else {
  3428. padapter->recvpriv.signal_strength = tmp_val;
  3429. padapter->recvpriv.rssi = (s8)translate_percentage_to_dbm(tmp_val);
  3430. }
  3431. #endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */
  3432. }
  3433. }
  3434. static void rx_process_link_qual(_adapter *padapter, union recv_frame *prframe)
  3435. {
  3436. u32 last_evm = 0, tmpVal;
  3437. struct rx_pkt_attrib *pattrib;
  3438. #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  3439. struct signal_stat *signal_stat;
  3440. #endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */
  3441. if (prframe == NULL || padapter == NULL)
  3442. return;
  3443. pattrib = &prframe->u.hdr.attrib;
  3444. #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  3445. signal_stat = &padapter->recvpriv.signal_qual_data;
  3446. #endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */
  3447. /* RTW_INFO("process_link_qual=> pattrib->signal_qual(%d)\n ",pattrib->signal_qual); */
  3448. #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
  3449. if (signal_stat->update_req) {
  3450. signal_stat->total_num = 0;
  3451. signal_stat->total_val = 0;
  3452. signal_stat->update_req = 0;
  3453. }
  3454. signal_stat->total_num++;
  3455. signal_stat->total_val += pattrib->phy_info.SignalQuality;
  3456. signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num;
  3457. #else /* CONFIG_NEW_SIGNAL_STAT_PROCESS */
  3458. if (pattrib->phy_info.SignalQuality != 0) {
  3459. /* */
  3460. /* 1. Record the general EVM to the sliding window. */
  3461. /* */
  3462. if (padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX) {
  3463. padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX;
  3464. last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index];
  3465. padapter->recvpriv.signal_qual_data.total_val -= last_evm;
  3466. }
  3467. padapter->recvpriv.signal_qual_data.total_val += pattrib->phy_info.SignalQuality;
  3468. padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = pattrib->phy_info.SignalQuality;
  3469. if (padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX)
  3470. padapter->recvpriv.signal_qual_data.index = 0;
  3471. /* <1> Showed on UI for user, in percentage. */
  3472. tmpVal = padapter->recvpriv.signal_qual_data.total_val / padapter->recvpriv.signal_qual_data.total_num;
  3473. padapter->recvpriv.signal_qual = (u8)tmpVal;
  3474. }
  3475. #endif /* CONFIG_NEW_SIGNAL_STAT_PROCESS */
  3476. }
  3477. void rx_process_phy_info(_adapter *padapter, union recv_frame *rframe)
  3478. {
  3479. /* Check RSSI */
  3480. rx_process_rssi(padapter, rframe);
  3481. /* Check PWDB */
  3482. /* process_PWDB(padapter, rframe); */
  3483. /* UpdateRxSignalStatistics8192C(Adapter, pRfd); */
  3484. /* Check EVM */
  3485. rx_process_link_qual(padapter, rframe);
  3486. rtw_store_phy_info(padapter, rframe);
  3487. }
  3488. void rx_query_phy_status(
  3489. union recv_frame *precvframe,
  3490. u8 *pphy_status)
  3491. {
  3492. PADAPTER padapter = precvframe->u.hdr.adapter;
  3493. struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
  3494. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  3495. struct _odm_phy_status_info_ *pPHYInfo = (struct _odm_phy_status_info_ *)(&pattrib->phy_info);
  3496. u8 *wlanhdr;
  3497. struct _odm_per_pkt_info_ pkt_info;
  3498. u8 *sa;
  3499. struct sta_priv *pstapriv;
  3500. struct sta_info *psta = NULL;
  3501. struct dvobj_priv *psdpriv = padapter->dvobj;
  3502. struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
  3503. /* _irqL irqL; */
  3504. pkt_info.is_packet_match_bssid = _FALSE;
  3505. pkt_info.is_packet_to_self = _FALSE;
  3506. pkt_info.is_packet_beacon = _FALSE;
  3507. pkt_info.ppdu_cnt = pattrib->ppdu_cnt;
  3508. wlanhdr = get_recvframe_data(precvframe);
  3509. pkt_info.is_packet_match_bssid = (!IsFrameTypeCtrl(wlanhdr))
  3510. && (!pattrib->icv_err) && (!pattrib->crc_err)
  3511. && _rtw_memcmp(get_hdr_bssid(wlanhdr), get_bssid(&padapter->mlmepriv), ETH_ALEN);
  3512. pkt_info.is_to_self = (!pattrib->icv_err) && (!pattrib->crc_err)
  3513. && _rtw_memcmp(get_ra(wlanhdr), adapter_mac_addr(padapter), ETH_ALEN);
  3514. pkt_info.is_packet_to_self = pkt_info.is_packet_match_bssid
  3515. && _rtw_memcmp(get_ra(wlanhdr), adapter_mac_addr(padapter), ETH_ALEN);
  3516. pkt_info.is_packet_beacon = pkt_info.is_packet_match_bssid
  3517. && (get_frame_sub_type(wlanhdr) == WIFI_BEACON);
  3518. sa = get_ta(wlanhdr);
  3519. pkt_info.station_id = 0xFF;
  3520. if (_rtw_memcmp(adapter_mac_addr(padapter), sa, ETH_ALEN) == _TRUE) {
  3521. static u32 start_time = 0;
  3522. #if 0 /*For debug */
  3523. if (IsFrameTypeCtrl(wlanhdr)) {
  3524. RTW_INFO("-->Control frame: Y\n");
  3525. RTW_INFO("-->pkt_len: %d\n", pattrib->pkt_len);
  3526. RTW_INFO("-->Sub Type = 0x%X\n", get_frame_sub_type(wlanhdr));
  3527. }
  3528. /* Dump first 40 bytes of header */
  3529. int i = 0;
  3530. for (i = 0; i < 40; i++)
  3531. RTW_INFO("%d: %X\n", i, *((u8 *)wlanhdr + i));
  3532. RTW_INFO("\n");
  3533. #endif
  3534. if ((start_time == 0) || (rtw_get_passing_time_ms(start_time) > 5000)) {
  3535. RTW_PRINT("Warning!!! %s: Confilc mac addr!!\n", __func__);
  3536. start_time = rtw_get_current_time();
  3537. }
  3538. pdbgpriv->dbg_rx_conflic_mac_addr_cnt++;
  3539. } else {
  3540. pstapriv = &padapter->stapriv;
  3541. psta = rtw_get_stainfo(pstapriv, sa);
  3542. if (psta)
  3543. pkt_info.station_id = psta->mac_id;
  3544. }
  3545. pkt_info.data_rate = pattrib->data_rate;
  3546. /* _enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL); */
  3547. odm_phy_status_query(&pHalData->odmpriv, pPHYInfo, pphy_status, &pkt_info);
  3548. if (psta)
  3549. psta->rssi = pattrib->phy_info.RecvSignalPower;
  3550. /* _exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL); */
  3551. {
  3552. precvframe->u.hdr.psta = NULL;
  3553. if (pkt_info.is_packet_match_bssid
  3554. && (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)
  3555. ) {
  3556. if (psta) {
  3557. precvframe->u.hdr.psta = psta;
  3558. rx_process_phy_info(padapter, precvframe);
  3559. }
  3560. } else if (pkt_info.is_packet_to_self || pkt_info.is_packet_beacon) {
  3561. if (psta)
  3562. precvframe->u.hdr.psta = psta;
  3563. rx_process_phy_info(padapter, precvframe);
  3564. }
  3565. }
  3566. rtw_odm_parse_rx_phy_status_chinfo(precvframe, pphy_status);
  3567. }
  3568. /*
  3569. * Increase and check if the continual_no_rx_packet of this @param pmlmepriv is larger than MAX_CONTINUAL_NORXPACKET_COUNT
  3570. * @return _TRUE:
  3571. * @return _FALSE:
  3572. */
  3573. int rtw_inc_and_chk_continual_no_rx_packet(struct sta_info *sta, int tid_index)
  3574. {
  3575. int ret = _FALSE;
  3576. int value = ATOMIC_INC_RETURN(&sta->continual_no_rx_packet[tid_index]);
  3577. if (value >= MAX_CONTINUAL_NORXPACKET_COUNT)
  3578. ret = _TRUE;
  3579. return ret;
  3580. }
  3581. /*
  3582. * Set the continual_no_rx_packet of this @param pmlmepriv to 0
  3583. */
  3584. void rtw_reset_continual_no_rx_packet(struct sta_info *sta, int tid_index)
  3585. {
  3586. ATOMIC_SET(&sta->continual_no_rx_packet[tid_index], 0);
  3587. }
  3588. s32 pre_recv_entry(union recv_frame *precvframe, u8 *pphy_status)
  3589. {
  3590. s32 ret = _SUCCESS;
  3591. #ifdef CONFIG_CONCURRENT_MODE
  3592. u8 *pda;
  3593. u8 *pbuf = precvframe->u.hdr.rx_data;
  3594. _adapter *iface = NULL;
  3595. _adapter *primary_padapter = precvframe->u.hdr.adapter;
  3596. pda = get_ra(pbuf);
  3597. if (IS_MCAST(pda) == _FALSE) { /*unicast packets*/
  3598. iface = rtw_get_iface_by_macddr(primary_padapter , pda);
  3599. if (NULL == iface) {
  3600. RTW_INFO("%s [WARN] Cannot find appropriate adapter - mac_addr : "MAC_FMT"\n", __func__, MAC_ARG(pda));
  3601. /*rtw_warn_on(1);*/
  3602. } else
  3603. precvframe->u.hdr.adapter = iface;
  3604. } else /* Handle BC/MC Packets */
  3605. rtw_mi_buddy_clone_bcmc_packet(primary_padapter, precvframe, pphy_status);
  3606. #endif
  3607. return ret;
  3608. }
  3609. #ifdef CONFIG_RECV_THREAD_MODE
  3610. thread_return rtw_recv_thread(thread_context context)
  3611. {
  3612. _adapter *adapter = (_adapter *)context;
  3613. struct recv_priv *recvpriv = &adapter->recvpriv;
  3614. s32 err = _SUCCESS;
  3615. #ifdef PLATFORM_LINUX
  3616. struct sched_param param = { .sched_priority = 1 };
  3617. sched_setscheduler(current, SCHED_FIFO, &param);
  3618. #endif /* PLATFORM_LINUX */
  3619. thread_enter("RTW_RECV_THREAD");
  3620. RTW_INFO(FUNC_ADPT_FMT" enter\n", FUNC_ADPT_ARG(adapter));
  3621. do {
  3622. err = _rtw_down_sema(&recvpriv->recv_sema);
  3623. if (_FAIL == err) {
  3624. RTW_ERR(FUNC_ADPT_FMT" down recv_sema fail!\n", FUNC_ADPT_ARG(adapter));
  3625. goto exit;
  3626. }
  3627. if (RTW_CANNOT_RUN(adapter)) {
  3628. RTW_INFO(FUNC_ADPT_FMT" DS:%d, SR:%d\n", FUNC_ADPT_ARG(adapter)
  3629. , rtw_is_drv_stopped(adapter), rtw_is_surprise_removed(adapter));
  3630. goto exit;
  3631. }
  3632. err = rtw_hal_recv_hdl(adapter);
  3633. if (err == RTW_RFRAME_UNAVAIL
  3634. || err == RTW_RFRAME_PKT_UNAVAIL
  3635. ) {
  3636. rtw_msleep_os(1);
  3637. _rtw_up_sema(&recvpriv->recv_sema);
  3638. }
  3639. flush_signals_thread();
  3640. } while (err != _FAIL);
  3641. exit:
  3642. RTW_INFO(FUNC_ADPT_FMT" exit\n", FUNC_ADPT_ARG(adapter));
  3643. /*_rtw_up_sema(&adapter->recvpriv.terminate_recvthread_sema);*/
  3644. thread_exit(&adapter->recvpriv.recvthread_comp);
  3645. return 0;
  3646. }
  3647. #endif /* CONFIG_RECV_THREAD_MODE */