p2p_func.c 110 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518
  1. #include "precomp.h"
  2. #ifdef __GNUC__
  3. #pragma GCC diagnostic ignored "-Wformat"
  4. #endif
  5. APPEND_VAR_ATTRI_ENTRY_T txAssocRspAttributesTable[] = {
  6. {(P2P_ATTRI_HDR_LEN + P2P_ATTRI_MAX_LEN_STATUS), NULL, p2pFuncAppendAttriStatusForAssocRsp} /* 0 */
  7. , {(P2P_ATTRI_HDR_LEN + P2P_ATTRI_MAX_LEN_EXT_LISTEN_TIMING), NULL, p2pFuncAppendAttriExtListenTiming} /* 8 */
  8. };
  9. APPEND_VAR_IE_ENTRY_T txProbeRspIETable[] = {
  10. {(ELEM_HDR_LEN + (RATE_NUM - ELEM_MAX_LEN_SUP_RATES)), NULL, bssGenerateExtSuppRate_IE} /* 50 */
  11. , {(ELEM_HDR_LEN + ELEM_MAX_LEN_ERP), NULL, rlmRspGenerateErpIE} /* 42 */
  12. , {(ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP), NULL, rlmRspGenerateHtCapIE} /* 45 */
  13. , {(ELEM_HDR_LEN + ELEM_MAX_LEN_HT_OP), NULL, rlmRspGenerateHtOpIE} /* 61 */
  14. , {(ELEM_HDR_LEN + ELEM_MAX_LEN_RSN), NULL, rsnGenerateRSNIE} /* 48 */
  15. , {(ELEM_HDR_LEN + ELEM_MAX_LEN_OBSS_SCAN), NULL, rlmRspGenerateObssScanIE} /* 74 */
  16. , {(ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP), NULL, rlmRspGenerateExtCapIE} /* 127 */
  17. , {(ELEM_HDR_LEN + ELEM_MAX_LEN_WPA), NULL, rsnGenerateWpaNoneIE} /* 221 */
  18. , {(ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_PARAM), NULL, mqmGenerateWmmParamIE} /* 221 */
  19. };
  20. /*----------------------------------------------------------------------------*/
  21. /*!
  22. * @brief Function for requesting scan. There is an option to do ACTIVE or PASSIVE scan.
  23. *
  24. * @param eScanType - Specify the scan type of the scan request. It can be an ACTIVE/PASSIVE
  25. * Scan.
  26. * eChannelSet - Specify the preferred channel set.
  27. * A FULL scan would request a legacy full channel normal scan.(usually ACTIVE).
  28. * A P2P_SOCIAL scan would scan 1+6+11 channels.(usually ACTIVE)
  29. * A SPECIFIC scan would only 1/6/11 channels scan. (Passive Listen/Specific Search)
  30. * ucChannelNum - A specific channel number. (Only when channel is specified)
  31. * eBand - A specific band. (Only when channel is specified)
  32. *
  33. *
  34. * @return (none)
  35. */
  36. /*----------------------------------------------------------------------------*/
  37. VOID p2pFuncRequestScan(IN P_ADAPTER_T prAdapter, IN P_P2P_SCAN_REQ_INFO_T prScanReqInfo)
  38. {
  39. P_MSG_SCN_SCAN_REQ prScanReq = (P_MSG_SCN_SCAN_REQ) NULL;
  40. /*NFC Beam + Indication */
  41. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  42. BOOLEAN fgIsPureAP = FALSE;
  43. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  44. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  45. fgIsPureAP = prAdapter->rWifiVar.prP2pFsmInfo->fgIsApMode;
  46. DEBUGFUNC("p2pFuncRequestScan()");
  47. do {
  48. ASSERT_BREAK((prAdapter != NULL) && (prScanReqInfo != NULL));
  49. if (prScanReqInfo->eChannelSet == SCAN_CHANNEL_SPECIFIED) {
  50. ASSERT_BREAK(prScanReqInfo->ucNumChannelList > 0);
  51. DBGLOG(P2P, LOUD,
  52. "P2P Scan Request Channel:%d\n", prScanReqInfo->arScanChannelList[0].ucChannelNum);
  53. }
  54. prScanReq = (P_MSG_SCN_SCAN_REQ) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_REQ));
  55. if (!prScanReq) {
  56. ASSERT(0); /* Can't trigger SCAN FSM */
  57. break;
  58. }
  59. prScanReq->rMsgHdr.eMsgId = MID_P2P_SCN_SCAN_REQ;
  60. prScanReq->ucSeqNum = ++prScanReqInfo->ucSeqNumOfScnMsg;
  61. prScanReq->ucNetTypeIndex = (UINT_8) NETWORK_TYPE_P2P_INDEX;
  62. prScanReq->eScanType = prScanReqInfo->eScanType;
  63. prScanReq->eScanChannel = prScanReqInfo->eChannelSet;
  64. prScanReq->u2IELen = 0;
  65. /* Copy IE for Probe Request. */
  66. if (prScanReqInfo->u4BufLength > MAX_IE_LENGTH)
  67. prScanReqInfo->u4BufLength = MAX_IE_LENGTH;
  68. kalMemCopy(prScanReq->aucIE, prScanReqInfo->aucIEBuf, prScanReqInfo->u4BufLength);
  69. prScanReq->u2IELen = (UINT_16) prScanReqInfo->u4BufLength;
  70. prScanReq->u2ChannelDwellTime = prScanReqInfo->u2PassiveDewellTime;
  71. switch (prScanReqInfo->eChannelSet) {
  72. case SCAN_CHANNEL_SPECIFIED:
  73. {
  74. UINT_32 u4Idx = 0;
  75. P_RF_CHANNEL_INFO_T prDomainInfo =
  76. (P_RF_CHANNEL_INFO_T) prScanReqInfo->arScanChannelList;
  77. UINT_8 aucP2pSsid[] = P2P_WILDCARD_SSID;
  78. if (prScanReqInfo->ucNumChannelList > MAXIMUM_OPERATION_CHANNEL_LIST)
  79. prScanReqInfo->ucNumChannelList = MAXIMUM_OPERATION_CHANNEL_LIST;
  80. for (u4Idx = 0; u4Idx < prScanReqInfo->ucNumChannelList; u4Idx++) {
  81. prScanReq->arChnlInfoList[u4Idx].ucChannelNum = prDomainInfo->ucChannelNum;
  82. prScanReq->arChnlInfoList[u4Idx].eBand = prDomainInfo->eBand;
  83. prDomainInfo++;
  84. }
  85. prScanReq->ucChannelListNum = prScanReqInfo->ucNumChannelList;
  86. /*NFC Beam + Indication */
  87. prChnlReqInfo = &prAdapter->rWifiVar.prP2pFsmInfo->rChnlReqInfo;
  88. if (prChnlReqInfo->eChannelReqType == CHANNEL_REQ_TYPE_GO_START_BSS &&
  89. prP2pBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT &&
  90. !fgIsPureAP) {
  91. prScanReq->ucChannelListNum = 1;
  92. prScanReq->arChnlInfoList[0].ucChannelNum = prChnlReqInfo->ucReqChnlNum;
  93. prScanReq->arChnlInfoList[0].eBand = prChnlReqInfo->eBand;
  94. DBGLOG(P2P, INFO,
  95. "NFC:GO Skip Scan and Only Froce on %s[%d]\n",
  96. prChnlReqInfo->eBand == 1 ? "2.4G" : "5G",
  97. prChnlReqInfo->ucReqChnlNum);
  98. }
  99. COPY_SSID(prScanReq->aucSSID,
  100. prScanReq->ucSSIDLength,
  101. prScanReqInfo->rSsidStruct.aucSsid, prScanReqInfo->rSsidStruct.ucSsidLen);
  102. /* For compatible. */
  103. if (EQUAL_SSID(aucP2pSsid, P2P_WILDCARD_SSID_LEN,
  104. prScanReq->aucSSID, prScanReq->ucSSIDLength)) {
  105. prScanReq->ucSSIDType = SCAN_REQ_SSID_P2P_WILDCARD;
  106. } else if (prScanReq->ucSSIDLength != 0) {
  107. prScanReq->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
  108. }
  109. }
  110. break;
  111. case SCAN_CHANNEL_FULL:
  112. {
  113. UINT_8 aucP2pSsid[] = P2P_WILDCARD_SSID;
  114. COPY_SSID(prScanReq->aucSSID,
  115. prScanReq->ucSSIDLength,
  116. prScanReqInfo->rSsidStruct.aucSsid, prScanReqInfo->rSsidStruct.ucSsidLen);
  117. /* For compatible. */
  118. if (EQUAL_SSID(aucP2pSsid, P2P_WILDCARD_SSID_LEN,
  119. prScanReq->aucSSID, prScanReq->ucSSIDLength)) {
  120. prScanReq->ucSSIDType = SCAN_REQ_SSID_P2P_WILDCARD;
  121. } else if (prScanReq->ucSSIDLength != 0) {
  122. prScanReq->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
  123. }
  124. }
  125. break;
  126. case SCAN_CHANNEL_2G4:
  127. {
  128. UINT_8 aucP2pSsid[] = P2P_WILDCARD_SSID;
  129. COPY_SSID(prScanReq->aucSSID,
  130. prScanReq->ucSSIDLength,
  131. prScanReqInfo->rSsidStruct.aucSsid, prScanReqInfo->rSsidStruct.ucSsidLen);
  132. /* For compatible. */
  133. if (EQUAL_SSID(aucP2pSsid, P2P_WILDCARD_SSID_LEN,
  134. prScanReq->aucSSID, prScanReq->ucSSIDLength)) {
  135. prScanReq->ucSSIDType = SCAN_REQ_SSID_P2P_WILDCARD;
  136. } else if (prScanReq->ucSSIDLength != 0) {
  137. prScanReq->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
  138. }
  139. }
  140. break;
  141. case SCAN_CHANNEL_P2P_SOCIAL:
  142. {
  143. UINT_8 aucP2pSsid[] = P2P_WILDCARD_SSID;
  144. COPY_SSID(prScanReq->aucSSID,
  145. prScanReq->ucSSIDLength,
  146. prScanReqInfo->rSsidStruct.aucSsid, prScanReqInfo->rSsidStruct.ucSsidLen);
  147. /* For compatible. */
  148. if (EQUAL_SSID(aucP2pSsid, P2P_WILDCARD_SSID_LEN,
  149. prScanReq->aucSSID, prScanReq->ucSSIDLength)) {
  150. prScanReq->ucSSIDType = SCAN_REQ_SSID_P2P_WILDCARD;
  151. } else if (prScanReq->ucSSIDLength != 0) {
  152. prScanReq->ucSSIDType = SCAN_REQ_SSID_SPECIFIED;
  153. }
  154. }
  155. break;
  156. default:
  157. /* Currently there is no other scan channel set. */
  158. ASSERT(FALSE);
  159. break;
  160. }
  161. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prScanReq, MSG_SEND_METHOD_BUF);
  162. } while (FALSE);
  163. } /* p2pFuncRequestScan */
  164. VOID p2pFuncCancelScan(IN P_ADAPTER_T prAdapter, IN P_P2P_SCAN_REQ_INFO_T prScanInfo)
  165. {
  166. P_MSG_SCN_SCAN_CANCEL prScanCancelMsg = (P_MSG_SCN_SCAN_CANCEL) NULL;
  167. do {
  168. ASSERT_BREAK((prAdapter != NULL) && (prScanInfo != NULL));
  169. if (!prScanInfo->fgIsScanRequest)
  170. break;
  171. if (prScanInfo->ucSeqNumOfScnMsg) {
  172. /* There is a channel privilege on hand. */
  173. DBGLOG(P2P, TRACE, "P2P Cancel Scan\n");
  174. prScanCancelMsg =
  175. (P_MSG_SCN_SCAN_CANCEL) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_CANCEL));
  176. if (!prScanCancelMsg) {
  177. /* Buffer not enough, can not cancel scan request. */
  178. DBGLOG(P2P, TRACE, "Buffer not enough, can not cancel scan.\n");
  179. ASSERT(FALSE);
  180. break;
  181. }
  182. prScanCancelMsg->rMsgHdr.eMsgId = MID_P2P_SCN_SCAN_CANCEL;
  183. prScanCancelMsg->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
  184. prScanCancelMsg->ucSeqNum = prScanInfo->ucSeqNumOfScnMsg++;
  185. prScanCancelMsg->fgIsChannelExt = FALSE;
  186. prScanInfo->fgIsScanRequest = FALSE;
  187. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prScanCancelMsg, MSG_SEND_METHOD_BUF);
  188. }
  189. } while (FALSE);
  190. } /* p2pFuncCancelScan */
  191. VOID
  192. p2pFuncSwitchOPMode(IN P_ADAPTER_T prAdapter,
  193. IN P_BSS_INFO_T prP2pBssInfo, IN ENUM_OP_MODE_T eOpMode, IN BOOLEAN fgSyncToFW)
  194. {
  195. if (!prAdapter)
  196. return;
  197. if (!prAdapter->prGlueInfo)
  198. return;
  199. if (prAdapter->prGlueInfo->ulFlag & GLUE_FLAG_HALT)
  200. return;
  201. do {
  202. ASSERT_BREAK((prAdapter != NULL) && (prP2pBssInfo != NULL) && (eOpMode < OP_MODE_NUM));
  203. if (prP2pBssInfo->eCurrentOPMode != eOpMode) {
  204. DBGLOG(P2P, TRACE,
  205. "p2pFuncSwitchOPMode: Switch to from %d, to %d.\n", prP2pBssInfo->eCurrentOPMode,
  206. eOpMode);
  207. switch (prP2pBssInfo->eCurrentOPMode) {
  208. case OP_MODE_ACCESS_POINT:
  209. p2pFuncDissolve(prAdapter, prP2pBssInfo, TRUE, REASON_CODE_DEAUTH_LEAVING_BSS);
  210. p2pFsmRunEventStopAP(prAdapter, NULL);
  211. break;
  212. default:
  213. break;
  214. }
  215. prP2pBssInfo->eIntendOPMode = eOpMode;
  216. prP2pBssInfo->eCurrentOPMode = eOpMode;
  217. switch (eOpMode) {
  218. case OP_MODE_INFRASTRUCTURE:
  219. DBGLOG(P2P, TRACE, "p2pFuncSwitchOPMode: Switch to Client.\n");
  220. case OP_MODE_ACCESS_POINT:
  221. /* if (!IS_BSS_ACTIVE(prP2pBssInfo)) { */
  222. /* SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX); */
  223. /* nicActivateNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX); */
  224. /* } */
  225. /* Change interface address. */
  226. if (eOpMode == OP_MODE_ACCESS_POINT) {
  227. DBGLOG(P2P, TRACE, "p2pFuncSwitchOPMode: Switch to AP.\n");
  228. prP2pBssInfo->ucSSIDLen = 0;
  229. }
  230. COPY_MAC_ADDR(prP2pBssInfo->aucOwnMacAddr, prAdapter->rWifiVar.aucInterfaceAddress);
  231. COPY_MAC_ADDR(prP2pBssInfo->aucBSSID, prAdapter->rWifiVar.aucInterfaceAddress);
  232. break;
  233. case OP_MODE_P2P_DEVICE:
  234. {
  235. /* Change device address. */
  236. DBGLOG(P2P, TRACE, "p2pFuncSwitchOPMode: Switch back to P2P Device.\n");
  237. /* if (!IS_BSS_ACTIVE(prP2pBssInfo)) { */
  238. /* SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX); */
  239. /* nicActivateNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX); */
  240. /* } */
  241. p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
  242. COPY_MAC_ADDR(prP2pBssInfo->aucOwnMacAddr,
  243. prAdapter->rWifiVar.aucDeviceAddress);
  244. COPY_MAC_ADDR(prP2pBssInfo->aucBSSID, prAdapter->rWifiVar.aucDeviceAddress);
  245. }
  246. break;
  247. default:
  248. /* if (IS_BSS_ACTIVE(prP2pBssInfo)) { */
  249. /* UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX); */
  250. /* nicDeactivateNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX); */
  251. /* } */
  252. ASSERT(FALSE);
  253. break;
  254. }
  255. if (1) {
  256. P2P_DISCONNECT_INFO rP2PDisInfo;
  257. rP2PDisInfo.ucRole = 2;
  258. wlanSendSetQueryCmd(prAdapter,
  259. CMD_ID_P2P_ABORT,
  260. TRUE,
  261. FALSE,
  262. FALSE,
  263. NULL,
  264. NULL,
  265. sizeof(P2P_DISCONNECT_INFO), (PUINT_8)&rP2PDisInfo, NULL, 0);
  266. }
  267. DBGLOG(P2P, TRACE,
  268. "The device address is changed to %pM\n",
  269. prP2pBssInfo->aucOwnMacAddr);
  270. DBGLOG(P2P, TRACE, "The BSSID is changed to %pM\n", prP2pBssInfo->aucBSSID);
  271. /* Update BSS INFO to FW. */
  272. if ((fgSyncToFW) && (eOpMode != OP_MODE_ACCESS_POINT))
  273. nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX);
  274. }
  275. } while (FALSE);
  276. } /* p2pFuncSwitchOPMode */
  277. /*----------------------------------------------------------------------------*/
  278. /*!
  279. * @brief This function will start a P2P Group Owner and send Beacon Frames.
  280. *
  281. * @param (none)
  282. *
  283. * @return (none)
  284. */
  285. /*----------------------------------------------------------------------------*/
  286. VOID
  287. p2pFuncStartGO(IN P_ADAPTER_T prAdapter,
  288. IN P_BSS_INFO_T prBssInfo,
  289. IN PUINT_8 pucSsidBuf,
  290. IN UINT_8 ucSsidLen,
  291. IN UINT_8 ucChannelNum, IN ENUM_BAND_T eBand, IN ENUM_CHNL_EXT_T eSco, IN BOOLEAN fgIsPureAP)
  292. {
  293. do {
  294. ASSERT_BREAK((prAdapter != NULL) && (prBssInfo != NULL));
  295. ASSERT(prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT);
  296. prAdapter->rWifiVar.prP2pFsmInfo->rScanReqInfo.fgIsGOInitialDone = 1;
  297. DBGLOG(P2P, INFO,
  298. "p2pFuncStartGO:NFC Done[%d]\n",
  299. prAdapter->rWifiVar.prP2pFsmInfo->rScanReqInfo.fgIsGOInitialDone);
  300. /* AP mode started. */
  301. p2pFuncSwitchOPMode(prAdapter, prBssInfo, prBssInfo->eIntendOPMode, FALSE);
  302. prBssInfo->eIntendOPMode = OP_MODE_NUM;
  303. /* 4 <1.1> Assign SSID */
  304. COPY_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, pucSsidBuf, ucSsidLen);
  305. DBGLOG(P2P, TRACE, "GO SSID:%s\n", prBssInfo->aucSSID);
  306. /* 4 <1.2> Clear current AP's STA_RECORD_T and current AID */
  307. prBssInfo->prStaRecOfAP = (P_STA_RECORD_T) NULL;
  308. prBssInfo->u2AssocId = 0;
  309. /* 4 <1.3> Setup Channel, Band and Phy Attributes */
  310. prBssInfo->ucPrimaryChannel = ucChannelNum;
  311. prBssInfo->eBand = eBand;
  312. prBssInfo->eBssSCO = eSco;
  313. DBGLOG(P2P, TRACE, "GO Channel:%d\n", ucChannelNum);
  314. if (prBssInfo->eBand == BAND_5G) {
  315. /* Depend on eBand */
  316. prBssInfo->ucPhyTypeSet = (prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11AN);
  317. /* Depend on eCurrentOPMode and ucPhyTypeSet */
  318. prBssInfo->ucConfigAdHocAPMode = AP_MODE_11A;
  319. } else if (fgIsPureAP) {
  320. /* Depend on eBand */
  321. prBssInfo->ucPhyTypeSet = (prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11BGN);
  322. /* Depend on eCurrentOPMode and ucPhyTypeSet */
  323. prBssInfo->ucConfigAdHocAPMode = AP_MODE_MIXED_11BG;
  324. } else {
  325. /* Depend on eBand */
  326. prBssInfo->ucPhyTypeSet = (prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11GN);
  327. /* Depend on eCurrentOPMode and ucPhyTypeSet */
  328. prBssInfo->ucConfigAdHocAPMode = AP_MODE_11G_P2P;
  329. }
  330. prBssInfo->ucNonHTBasicPhyType = (UINT_8)
  331. rNonHTApModeAttributes[prBssInfo->ucConfigAdHocAPMode].ePhyTypeIndex;
  332. prBssInfo->u2BSSBasicRateSet = rNonHTApModeAttributes[prBssInfo->ucConfigAdHocAPMode].u2BSSBasicRateSet;
  333. prBssInfo->u2OperationalRateSet =
  334. rNonHTPhyAttributes[prBssInfo->ucNonHTBasicPhyType].u2SupportedRateSet;
  335. if (prBssInfo->ucAllSupportedRatesLen == 0) {
  336. rateGetDataRatesFromRateSet(prBssInfo->u2OperationalRateSet,
  337. prBssInfo->u2BSSBasicRateSet,
  338. prBssInfo->aucAllSupportedRates,
  339. &prBssInfo->ucAllSupportedRatesLen);
  340. }
  341. /* 4 <1.5> Setup MIB for current BSS */
  342. prBssInfo->u2ATIMWindow = 0;
  343. prBssInfo->ucBeaconTimeoutCount = 0;
  344. /* 3 <2> Update BSS_INFO_T common part */
  345. #if CFG_SUPPORT_AAA
  346. if (!fgIsPureAP) {
  347. prBssInfo->fgIsProtection = TRUE; /* Always enable protection at P2P GO */
  348. kalP2PSetCipher(prAdapter->prGlueInfo, IW_AUTH_CIPHER_CCMP);
  349. } else {
  350. if (kalP2PGetCipher(prAdapter->prGlueInfo))
  351. prBssInfo->fgIsProtection = TRUE;
  352. }
  353. /* 20120106 frog: I want separate OP_Mode & Beacon TX Function. */
  354. /* p2pFuncSwitchOPMode(prAdapter, prBssInfo, OP_MODE_ACCESS_POINT, FALSE); */
  355. bssInitForAP(prAdapter, prBssInfo, FALSE);
  356. nicQmUpdateWmmParms(prAdapter, NETWORK_TYPE_P2P_INDEX);
  357. #endif /* CFG_SUPPORT_AAA */
  358. /* 3 <3> Set MAC HW */
  359. /* 4 <3.1> Setup channel and bandwidth */
  360. rlmBssInitForAPandIbss(prAdapter, prBssInfo);
  361. /* 4 <3.2> Reset HW TSF Update Mode and Beacon Mode */
  362. nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX);
  363. /* 4 <3.3> Update Beacon again for network phy type confirmed. */
  364. bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_P2P_INDEX);
  365. #if 0 /* CFG_SUPPORT_HOTSPOT_OPTIMIZATION */
  366. {
  367. CMD_HOTSPOT_OPTIMIZATION_CONFIG arHotspotOptimizationCfg;
  368. arHotspotOptimizationCfg.fgHotspotOptimizationEn = TRUE;
  369. arHotspotOptimizationCfg.u4Level = (0x3) << 8 | 0x5;
  370. wlanoidSendSetQueryP2PCmd(prAdapter,
  371. CMD_ID_SET_HOTSPOT_OPTIMIZATION,
  372. TRUE,
  373. FALSE,
  374. TRUE,
  375. NULL,
  376. NULL,
  377. sizeof(CMD_HOTSPOT_OPTIMIZATION_CONFIG),
  378. (PUINT_8)&arHotspotOptimizationCfg, NULL, 0);
  379. }
  380. #endif
  381. /* 4 <3.4> Setup BSSID */
  382. nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_P2P_INDEX);
  383. } while (FALSE);
  384. } /* p2pFuncStartGO() */
  385. /*----------------------------------------------------------------------------*/
  386. /*!
  387. * \brief This function is to inform CNM that channel privilege
  388. * has been released
  389. *
  390. * \param[in] prAdapter Pointer of ADAPTER_T
  391. *
  392. * \return none
  393. */
  394. /*----------------------------------------------------------------------------*/
  395. VOID p2pFuncReleaseCh(IN P_ADAPTER_T prAdapter, IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo)
  396. {
  397. P_MSG_CH_ABORT_T prMsgChRelease = (P_MSG_CH_ABORT_T) NULL;
  398. DEBUGFUNC("p2pFuncReleaseCh()");
  399. do {
  400. ASSERT_BREAK((prAdapter != NULL) && (prChnlReqInfo != NULL));
  401. if (!prChnlReqInfo->fgIsChannelRequested)
  402. break;
  403. DBGLOG(P2P, TRACE, "P2P Release Channel\n");
  404. prChnlReqInfo->fgIsChannelRequested = FALSE;
  405. /* 1. return channel privilege to CNM immediately */
  406. prMsgChRelease = (P_MSG_CH_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_ABORT_T));
  407. if (!prMsgChRelease) {
  408. ASSERT(0); /* Can't release Channel to CNM */
  409. break;
  410. }
  411. prMsgChRelease->rMsgHdr.eMsgId = MID_MNY_CNM_CH_ABORT;
  412. prMsgChRelease->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
  413. prMsgChRelease->ucTokenID = prChnlReqInfo->ucSeqNumOfChReq++;
  414. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prMsgChRelease, MSG_SEND_METHOD_BUF);
  415. } while (FALSE);
  416. } /* p2pFuncReleaseCh */
  417. /*----------------------------------------------------------------------------*/
  418. /*!
  419. * @brief Process of CHANNEL_REQ_JOIN Initial. Enter CHANNEL_REQ_JOIN State.
  420. *
  421. * @param (none)
  422. *
  423. * @return (none)
  424. */
  425. /*----------------------------------------------------------------------------*/
  426. VOID p2pFuncAcquireCh(IN P_ADAPTER_T prAdapter, IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo)
  427. {
  428. P_MSG_CH_REQ_T prMsgChReq = (P_MSG_CH_REQ_T) NULL;
  429. do {
  430. ASSERT_BREAK((prAdapter != NULL) && (prChnlReqInfo != NULL));
  431. p2pFuncReleaseCh(prAdapter, prChnlReqInfo);
  432. /* send message to CNM for acquiring channel */
  433. prMsgChReq = (P_MSG_CH_REQ_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_REQ_T));
  434. if (!prMsgChReq) {
  435. ASSERT(0); /* Can't indicate CNM for channel acquiring */
  436. break;
  437. }
  438. prMsgChReq->rMsgHdr.eMsgId = MID_MNY_CNM_CH_REQ;
  439. prMsgChReq->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
  440. prMsgChReq->ucTokenID = ++prChnlReqInfo->ucSeqNumOfChReq;
  441. prMsgChReq->eReqType = CH_REQ_TYPE_JOIN;
  442. prMsgChReq->u4MaxInterval = prChnlReqInfo->u4MaxInterval;
  443. prMsgChReq->ucPrimaryChannel = prChnlReqInfo->ucReqChnlNum;
  444. prMsgChReq->eRfSco = prChnlReqInfo->eChnlSco;
  445. prMsgChReq->eRfBand = prChnlReqInfo->eBand;
  446. kalMemZero(prMsgChReq->aucBSSID, MAC_ADDR_LEN);
  447. /* Channel request join BSSID. */
  448. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prMsgChReq, MSG_SEND_METHOD_BUF);
  449. prChnlReqInfo->fgIsChannelRequested = TRUE;
  450. } while (FALSE);
  451. } /* p2pFuncAcquireCh */
  452. #if 0
  453. WLAN_STATUS
  454. p2pFuncBeaconUpdate(IN P_ADAPTER_T prAdapter,
  455. IN PUINT_8 pucBcnHdr,
  456. IN UINT_32 u4HdrLen,
  457. IN PUINT_8 pucBcnBody, IN UINT_32 u4BodyLen, IN UINT_32 u4DtimPeriod, IN UINT_32 u4BcnInterval)
  458. {
  459. WLAN_STATUS rResultStatus = WLAN_STATUS_INVALID_DATA;
  460. P_WLAN_BEACON_FRAME_T prBcnFrame = (P_WLAN_BEACON_FRAME_T) NULL;
  461. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  462. P_MSDU_INFO_T prBcnMsduInfo = (P_MSDU_INFO_T) NULL;
  463. PUINT_8 pucTIMBody = (PUINT_8) NULL;
  464. UINT_16 u2FrameLength = 0, UINT_16 u2OldBodyLen = 0;
  465. UINT_8 aucIEBuf[MAX_IE_LENGTH];
  466. do {
  467. ASSERT_BREAK(prAdapter != NULL);
  468. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  469. prBcnMsduInfo = prP2pBssInfo->prBeacon ASSERT_BREAK(prBcnMsduInfo != NULL);
  470. /* TODO: Find TIM IE pointer. */
  471. prBcnFrame = prBcnMsduInfo->prPacket;
  472. ASSERT_BREAK(prBcnFrame != NULL);
  473. do {
  474. /* Ori header. */
  475. UINT_16 u2IELength = 0, u2Offset = 0;
  476. PUINT_8 pucIEBuf = prBcnFrame->aucInfoElem;
  477. u2IELength = prBcnMsduInfo->u2FrameLength - prBcnMsduInfo->ucMacHeaderLength;
  478. IE_FOR_EACH(pucIEBuf, u2IELength, u2Offset) {
  479. if ((IE_ID(pucIEBuf) == ELEM_ID_TIM) || ((IE_ID(pucIEBuf) > ELEM_ID_IBSS_PARAM_SET))) {
  480. pucTIMBody = pucIEBuf;
  481. break;
  482. }
  483. u2FrameLength += IE_SIZE(pucIEBuf);
  484. }
  485. if (pucTIMBody == NULL)
  486. pucTIMBody = pucIEBuf;
  487. /* Body not change. */
  488. u2OldBodyLen = (UINT_16) ((UINT_32) pucTIMBody - (UINT_32) prBcnFrame->aucInfoElem);
  489. /* Move body. */
  490. kalMemCmp(aucIEBuf, pucTIMBody, u2OldBodyLen);
  491. } while (FALSE);
  492. if (pucBcnHdr) {
  493. kalMemCopy(prBcnMsduInfo->prPacket, pucBcnHdr, u4HdrLen);
  494. pucTIMBody = (PUINT_8) ((UINT_32) prBcnMsduInfo->prPacket + u4HdrLen);
  495. prBcnMsduInfo->ucMacHeaderLength = (WLAN_MAC_MGMT_HEADER_LEN +
  496. (TIMESTAMP_FIELD_LEN + BEACON_INTERVAL_FIELD_LEN + CAP_INFO_FIELD_LEN));
  497. u2FrameLength = u4HdrLen; /* Header + Partial Body. */
  498. } else {
  499. /* Header not change. */
  500. u2FrameLength += prBcnMsduInfo->ucMacHeaderLength;
  501. }
  502. if (pucBcnBody) {
  503. kalMemCopy(pucTIMBody, pucBcnBody, u4BodyLen);
  504. u2FrameLength += (UINT_16) u4BodyLen;
  505. } else {
  506. kalMemCopy(pucTIMBody, aucIEBuf, u2OldBodyLen);
  507. u2FrameLength += u2OldBodyLen;
  508. }
  509. /* Frame Length */
  510. prBcnMsduInfo->u2FrameLength = u2FrameLength;
  511. prBcnMsduInfo->fgIs802_11 = TRUE;
  512. prBcnMsduInfo->ucNetworkType = NETWORK_TYPE_P2P_INDEX;
  513. prP2pBssInfo->u2BeaconInterval = (UINT_16) u4BcnInterval;
  514. prP2pBssInfo->ucDTIMPeriod = (UINT_8) u4DtimPeriod;
  515. prP2pBssInfo->u2CapInfo = prBcnFrame->u2CapInfo;
  516. prBcnMsduInfo->ucPacketType = 3;
  517. rResultStatus = nicUpdateBeaconIETemplate(prAdapter,
  518. IE_UPD_METHOD_UPDATE_ALL,
  519. NETWORK_TYPE_P2P_INDEX,
  520. prP2pBssInfo->u2CapInfo,
  521. (PUINT_8) prBcnFrame->aucInfoElem,
  522. prBcnMsduInfo->u2FrameLength -
  523. OFFSET_OF(WLAN_BEACON_FRAME_T,
  524. aucInfoElem));
  525. if (prP2pBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT) {
  526. /* AP is created, Beacon Update. */
  527. nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_P2P_INDEX);
  528. nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_P2P_INDEX);
  529. }
  530. } while (FALSE);
  531. return rResultStatus;
  532. } /* p2pFuncBeaconUpdate */
  533. #else
  534. WLAN_STATUS
  535. p2pFuncBeaconUpdate(IN P_ADAPTER_T prAdapter,
  536. IN P_BSS_INFO_T prP2pBssInfo,
  537. IN P_P2P_BEACON_UPDATE_INFO_T prBcnUpdateInfo,
  538. IN PUINT_8 pucNewBcnHdr, IN UINT_32 u4NewHdrLen, IN PUINT_8 pucNewBcnBody, IN UINT_32 u4NewBodyLen)
  539. {
  540. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  541. P_WLAN_BEACON_FRAME_T prBcnFrame = (P_WLAN_BEACON_FRAME_T) NULL;
  542. P_MSDU_INFO_T prBcnMsduInfo = (P_MSDU_INFO_T) NULL;
  543. PUINT_8 pucIEBuf = (PUINT_8) NULL;
  544. PUINT_8 paucIEBuf = (PUINT_8) NULL;/*[MAX_IE_LENGTH]; aucIEBuf*/
  545. do {
  546. ASSERT_BREAK((prAdapter != NULL) && (prP2pBssInfo != NULL) && (prBcnUpdateInfo != NULL));
  547. prBcnMsduInfo = prP2pBssInfo->prBeacon;
  548. #if DBG
  549. if (prBcnUpdateInfo->pucBcnHdr != NULL) {
  550. ASSERT((UINT_32) prBcnUpdateInfo->pucBcnHdr ==
  551. ((UINT_32) prBcnMsduInfo->prPacket + MAC_TX_RESERVED_FIELD));
  552. }
  553. if (prBcnUpdateInfo->pucBcnBody != NULL) {
  554. ASSERT((UINT_32) prBcnUpdateInfo->pucBcnBody ==
  555. ((UINT_32) prBcnUpdateInfo->pucBcnHdr + (UINT_32) prBcnUpdateInfo->u4BcnHdrLen));
  556. }
  557. #endif
  558. prBcnFrame = (P_WLAN_BEACON_FRAME_T) ((ULONG) prBcnMsduInfo->prPacket + MAC_TX_RESERVED_FIELD);
  559. if (!pucNewBcnBody) {
  560. /* Old body. */
  561. pucNewBcnBody = prBcnUpdateInfo->pucBcnBody;
  562. ASSERT(u4NewBodyLen == 0);
  563. u4NewBodyLen = prBcnUpdateInfo->u4BcnBodyLen;
  564. } else {
  565. prBcnUpdateInfo->u4BcnBodyLen = u4NewBodyLen;
  566. }
  567. paucIEBuf = kalMemAlloc(MAX_IE_LENGTH, VIR_MEM_TYPE);
  568. if (paucIEBuf == NULL) {
  569. DBGLOG(P2P, TRACE, "p2p alloc paucIEBuf fail\n");
  570. return WLAN_STATUS_FAILURE;
  571. }
  572. /* Temp buffer body part. */
  573. kalMemCopy(paucIEBuf, pucNewBcnBody, u4NewBodyLen);
  574. if (pucNewBcnHdr) {
  575. kalMemCopy(prBcnFrame, pucNewBcnHdr, u4NewHdrLen);
  576. prBcnUpdateInfo->pucBcnHdr = (PUINT_8) prBcnFrame;
  577. prBcnUpdateInfo->u4BcnHdrLen = u4NewHdrLen;
  578. }
  579. pucIEBuf = (PUINT_8) ((ULONG) prBcnUpdateInfo->pucBcnHdr + (UINT_32) prBcnUpdateInfo->u4BcnHdrLen);
  580. kalMemCopy(pucIEBuf, paucIEBuf, u4NewBodyLen);
  581. kalMemFree(paucIEBuf, VIR_MEM_TYPE, MAX_IE_LENGTH);
  582. prBcnUpdateInfo->pucBcnBody = pucIEBuf;
  583. /* Frame Length */
  584. prBcnMsduInfo->u2FrameLength = (UINT_16) (prBcnUpdateInfo->u4BcnHdrLen + prBcnUpdateInfo->u4BcnBodyLen);
  585. prBcnMsduInfo->ucPacketType = 3;
  586. prBcnMsduInfo->fgIs802_11 = TRUE;
  587. prBcnMsduInfo->ucNetworkType = NETWORK_TYPE_P2P_INDEX;
  588. /* Update BSS INFO related information. */
  589. COPY_MAC_ADDR(prP2pBssInfo->aucOwnMacAddr, prBcnFrame->aucSrcAddr);
  590. COPY_MAC_ADDR(prP2pBssInfo->aucBSSID, prBcnFrame->aucBSSID);
  591. prP2pBssInfo->u2CapInfo = prBcnFrame->u2CapInfo;
  592. p2pFuncParseBeaconContent(prAdapter,
  593. prP2pBssInfo,
  594. (PUINT_8) prBcnFrame->aucInfoElem,
  595. (prBcnMsduInfo->u2FrameLength - OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem)));
  596. #if 1
  597. /* bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_P2P_INDEX); */
  598. #else
  599. nicUpdateBeaconIETemplate(prAdapter,
  600. IE_UPD_METHOD_UPDATE_ALL,
  601. NETWORK_TYPE_P2P_INDEX,
  602. prBcnFrame->u2CapInfo,
  603. (PUINT_8) prBcnFrame->aucInfoElem,
  604. (prBcnMsduInfo->u2FrameLength - OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem)));
  605. #endif
  606. } while (FALSE);
  607. return rWlanStatus;
  608. } /* p2pFuncBeaconUpdate */
  609. #endif
  610. /* TODO: We do not apply IE in deauth frame set from upper layer now. */
  611. WLAN_STATUS
  612. p2pFuncDeauth(IN P_ADAPTER_T prAdapter,
  613. IN PUINT_8 pucPeerMacAddr,
  614. IN UINT_16 u2ReasonCode, IN PUINT_8 pucIEBuf, IN UINT_16 u2IELen, IN BOOLEAN fgSendDeauth)
  615. {
  616. WLAN_STATUS rWlanStatus = WLAN_STATUS_FAILURE;
  617. P_STA_RECORD_T prCliStaRec = (P_STA_RECORD_T) NULL;
  618. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  619. BOOLEAN fgIsStaFound = FALSE;
  620. do {
  621. ASSERT_BREAK((prAdapter != NULL) && (pucPeerMacAddr != NULL));
  622. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  623. prCliStaRec = cnmGetStaRecByAddress(prAdapter, NETWORK_TYPE_P2P_INDEX, pucPeerMacAddr);
  624. switch (prP2pBssInfo->eCurrentOPMode) {
  625. case OP_MODE_ACCESS_POINT:
  626. {
  627. P_LINK_T prStaRecOfClientList = (P_LINK_T) NULL;
  628. P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
  629. prStaRecOfClientList = &(prP2pBssInfo->rStaRecOfClientList);
  630. LINK_FOR_EACH(prLinkEntry, prStaRecOfClientList) {
  631. if ((ULONG) prCliStaRec == (ULONG) prLinkEntry) {
  632. LINK_REMOVE_KNOWN_ENTRY(prStaRecOfClientList, &prCliStaRec->rLinkEntry);
  633. fgIsStaFound = TRUE;
  634. break;
  635. }
  636. }
  637. }
  638. break;
  639. case OP_MODE_INFRASTRUCTURE:
  640. ASSERT(prCliStaRec == prP2pBssInfo->prStaRecOfAP);
  641. if (prCliStaRec != prP2pBssInfo->prStaRecOfAP)
  642. break;
  643. prP2pBssInfo->prStaRecOfAP = NULL;
  644. fgIsStaFound = TRUE;
  645. break;
  646. default:
  647. break;
  648. }
  649. if (fgIsStaFound)
  650. p2pFuncDisconnect(prAdapter, prCliStaRec, fgSendDeauth, u2ReasonCode);
  651. rWlanStatus = WLAN_STATUS_SUCCESS;
  652. } while (FALSE);
  653. return rWlanStatus;
  654. } /* p2pFuncDeauth */
  655. /* TODO: We do not apply IE in disassoc frame set from upper layer now. */
  656. WLAN_STATUS
  657. p2pFuncDisassoc(IN P_ADAPTER_T prAdapter,
  658. IN PUINT_8 pucPeerMacAddr,
  659. IN UINT_16 u2ReasonCode, IN PUINT_8 pucIEBuf, IN UINT_16 u2IELen, IN BOOLEAN fgSendDisassoc)
  660. {
  661. WLAN_STATUS rWlanStatus = WLAN_STATUS_FAILURE;
  662. P_STA_RECORD_T prCliStaRec = (P_STA_RECORD_T) NULL;
  663. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  664. BOOLEAN fgIsStaFound = FALSE;
  665. do {
  666. ASSERT_BREAK((prAdapter != NULL) && (pucPeerMacAddr != NULL));
  667. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  668. prCliStaRec = cnmGetStaRecByAddress(prAdapter, NETWORK_TYPE_P2P_INDEX, pucPeerMacAddr);
  669. switch (prP2pBssInfo->eCurrentOPMode) {
  670. case OP_MODE_ACCESS_POINT:
  671. {
  672. P_LINK_T prStaRecOfClientList = (P_LINK_T) NULL;
  673. P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
  674. prStaRecOfClientList = &(prP2pBssInfo->rStaRecOfClientList);
  675. LINK_FOR_EACH(prLinkEntry, prStaRecOfClientList) {
  676. if ((ULONG) prCliStaRec == (ULONG) prLinkEntry) {
  677. LINK_REMOVE_KNOWN_ENTRY(prStaRecOfClientList, &prCliStaRec->rLinkEntry);
  678. fgIsStaFound = TRUE;
  679. /* p2pFuncDisconnect(prAdapter, prCliStaRec,
  680. * fgSendDisassoc, u2ReasonCode); */
  681. break;
  682. }
  683. }
  684. }
  685. break;
  686. case OP_MODE_INFRASTRUCTURE:
  687. ASSERT(prCliStaRec == prP2pBssInfo->prStaRecOfAP);
  688. if (prCliStaRec != prP2pBssInfo->prStaRecOfAP)
  689. break;
  690. /* p2pFuncDisconnect(prAdapter, prCliStaRec, fgSendDisassoc, u2ReasonCode); */
  691. prP2pBssInfo->prStaRecOfAP = NULL;
  692. fgIsStaFound = TRUE;
  693. break;
  694. default:
  695. break;
  696. }
  697. if (fgIsStaFound) {
  698. p2pFuncDisconnect(prAdapter, prCliStaRec, fgSendDisassoc, u2ReasonCode);
  699. /* 20120830 moved into p2pFuncDisconnect(). */
  700. /* cnmStaRecFree(prAdapter, prCliStaRec, TRUE); */
  701. }
  702. rWlanStatus = WLAN_STATUS_SUCCESS;
  703. } while (FALSE);
  704. return rWlanStatus;
  705. } /* p2pFuncDisassoc */
  706. /*----------------------------------------------------------------------------*/
  707. /*!
  708. * @brief This function is called to dissolve from group or one group. (Would not change P2P FSM.)
  709. * 1. GC: Disconnect from AP. (Send Deauth)
  710. * 2. GO: Disconnect all STA
  711. *
  712. * @param[in] prAdapter Pointer to the adapter structure.
  713. *
  714. * @return (none)
  715. */
  716. /*----------------------------------------------------------------------------*/
  717. VOID
  718. p2pFuncDissolve(IN P_ADAPTER_T prAdapter,
  719. IN P_BSS_INFO_T prP2pBssInfo, IN BOOLEAN fgSendDeauth, IN UINT_16 u2ReasonCode)
  720. {
  721. DEBUGFUNC("p2pFuncDissolve()");
  722. do {
  723. ASSERT_BREAK((prAdapter != NULL) && (prP2pBssInfo != NULL));
  724. switch (prP2pBssInfo->eCurrentOPMode) {
  725. case OP_MODE_INFRASTRUCTURE:
  726. /* Reset station record status. */
  727. if (prP2pBssInfo->prStaRecOfAP) {
  728. kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
  729. NULL, NULL, 0, REASON_CODE_DEAUTH_LEAVING_BSS,
  730. WLAN_STATUS_MEDIA_DISCONNECT_LOCALLY);
  731. /* 2012/02/14 frog: After formation before join group, prStaRecOfAP is NULL. */
  732. p2pFuncDisconnect(prAdapter, prP2pBssInfo->prStaRecOfAP, fgSendDeauth, u2ReasonCode);
  733. }
  734. /* Fix possible KE when RX Beacon & call nicPmIndicateBssConnected().
  735. * hit prStaRecOfAP == NULL. */
  736. p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
  737. prP2pBssInfo->prStaRecOfAP = NULL;
  738. break;
  739. case OP_MODE_ACCESS_POINT:
  740. /* Under AP mode, we would net send deauthentication frame to each STA.
  741. * We only stop the Beacon & let all stations timeout.
  742. */
  743. {
  744. P_LINK_T prStaRecOfClientList = (P_LINK_T) NULL;
  745. /* Send deauth. */
  746. authSendDeauthFrame(prAdapter,
  747. NULL, (P_SW_RFB_T) NULL, u2ReasonCode, (PFN_TX_DONE_HANDLER) NULL);
  748. prStaRecOfClientList = &prP2pBssInfo->rStaRecOfClientList;
  749. while (!LINK_IS_EMPTY(prStaRecOfClientList)) {
  750. P_STA_RECORD_T prCurrStaRec;
  751. LINK_REMOVE_HEAD(prStaRecOfClientList, prCurrStaRec, P_STA_RECORD_T);
  752. /* Indicate to Host. */
  753. /* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prCurrStaRec, FALSE); */
  754. p2pFuncDisconnect(prAdapter, prCurrStaRec, TRUE, u2ReasonCode);
  755. }
  756. prAdapter->rWifiVar.prP2pFsmInfo->rScanReqInfo.fgIsGOInitialDone = 0;
  757. }
  758. break;
  759. default:
  760. return; /* 20110420 -- alreay in Device Mode. */
  761. }
  762. /* Make the deauth frame send to FW ASAP. */
  763. wlanAcquirePowerControl(prAdapter);
  764. wlanProcessCommandQueue(prAdapter, &prAdapter->prGlueInfo->rCmdQueue);
  765. wlanReleasePowerControl(prAdapter);
  766. kalMdelay(100);
  767. /* Change Connection Status. */
  768. p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
  769. } while (FALSE);
  770. } /* p2pFuncDissolve */
  771. /*----------------------------------------------------------------------------*/
  772. /*!
  773. * @brief This function is called to dissolve from group or one group. (Would not change P2P FSM.)
  774. * 1. GC: Disconnect from AP. (Send Deauth)
  775. * 2. GO: Disconnect all STA
  776. *
  777. * @param[in] prAdapter Pointer to the adapter structure.
  778. *
  779. * @return (none)
  780. */
  781. /*----------------------------------------------------------------------------*/
  782. VOID
  783. p2pFuncDisconnect(IN P_ADAPTER_T prAdapter,
  784. IN P_STA_RECORD_T prStaRec, IN BOOLEAN fgSendDeauth, IN UINT_16 u2ReasonCode)
  785. {
  786. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  787. ENUM_PARAM_MEDIA_STATE_T eOriMediaStatus;
  788. do {
  789. ASSERT_BREAK((prAdapter != NULL) && (prStaRec != NULL));
  790. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  791. eOriMediaStatus = prP2pBssInfo->eConnectionState;
  792. /* Indicate disconnect. */
  793. /* TODO: */
  794. /* kalP2PGOStationUpdate */
  795. /* kalP2PGCIndicateConnectionStatus */
  796. /* p2pIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED, prStaRec->aucMacAddr); */
  797. DBGLOG(P2P, INFO, "p2pFuncDisconnect, eCurrentOPMode: %d, sendDeauth: %s\n",
  798. prP2pBssInfo->eCurrentOPMode, fgSendDeauth ? "True" : "False");
  799. if (prP2pBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT)
  800. kalP2PGOStationUpdate(prAdapter->prGlueInfo, prStaRec, FALSE);
  801. if (fgSendDeauth) {
  802. /* Send deauth. */
  803. authSendDeauthFrame(prAdapter,
  804. prStaRec,
  805. (P_SW_RFB_T) NULL,
  806. u2ReasonCode, (PFN_TX_DONE_HANDLER) p2pFsmRunEventDeauthTxDone);
  807. } else {
  808. /* Change station state. */
  809. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  810. /* Reset Station Record Status. */
  811. p2pFuncResetStaRecStatus(prAdapter, prStaRec);
  812. cnmStaRecFree(prAdapter, prStaRec, TRUE);
  813. if ((prP2pBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT) ||
  814. (prP2pBssInfo->rStaRecOfClientList.u4NumElem == 0)) {
  815. DBGLOG(P2P, TRACE, "No More Client, Media Status DISCONNECTED\n");
  816. p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
  817. }
  818. if (eOriMediaStatus != prP2pBssInfo->eConnectionState) {
  819. /* Update Disconnected state to FW. */
  820. nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX);
  821. }
  822. }
  823. if (prP2pBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT) {
  824. /* GO: It would stop Beacon TX. GC: Stop all BSS related PS function. */
  825. nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_P2P_INDEX);
  826. /* Reset RLM related field of BSSINFO. */
  827. rlmBssAborted(prAdapter, prP2pBssInfo);
  828. }
  829. } while (FALSE);
  830. return;
  831. } /* p2pFuncDisconnect */
  832. WLAN_STATUS
  833. p2pFuncTxMgmtFrame(IN P_ADAPTER_T prAdapter,
  834. IN P_P2P_MGMT_TX_REQ_INFO_T prMgmtTxReqInfo, IN P_MSDU_INFO_T prMgmtTxMsdu, IN UINT_64 u8Cookie)
  835. {
  836. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  837. P_MSDU_INFO_T prTxMsduInfo = (P_MSDU_INFO_T) NULL;
  838. P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T) NULL;
  839. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  840. BOOLEAN fgIsProbrsp = FALSE;
  841. do {
  842. ASSERT_BREAK((prAdapter != NULL) && (prMgmtTxReqInfo != NULL));
  843. if (prMgmtTxReqInfo->fgIsMgmtTxRequested) {
  844. /* 1. prMgmtTxReqInfo->prMgmtTxMsdu != NULL */
  845. /* Packet on driver, not done yet, drop it. */
  846. prTxMsduInfo = prMgmtTxReqInfo->prMgmtTxMsdu;
  847. if (prTxMsduInfo != NULL) {
  848. kalP2PIndicateMgmtTxStatus(prAdapter->prGlueInfo,
  849. prMgmtTxReqInfo->u8Cookie,
  850. FALSE,
  851. prTxMsduInfo->prPacket,
  852. (UINT_32) prTxMsduInfo->u2FrameLength);
  853. /* Leave it to TX Done handler. */
  854. /* cnmMgtPktFree(prAdapter, prTxMsduInfo); */
  855. prMgmtTxReqInfo->prMgmtTxMsdu = NULL;
  856. DBGLOG(P2P, INFO, "p2pFuncTxMgmtFrame: Drop MGMT cookie: 0x%llx\n",
  857. prMgmtTxReqInfo->u8Cookie);
  858. }
  859. /* 2. prMgmtTxReqInfo->prMgmtTxMsdu == NULL */
  860. /* Packet transmitted, wait tx done. (cookie issue) */
  861. /* 20120105 frog - use another u8cookie to store this value. */
  862. }
  863. ASSERT(prMgmtTxReqInfo->prMgmtTxMsdu == NULL);
  864. prWlanHdr = (P_WLAN_MAC_HEADER_T) ((ULONG) prMgmtTxMsdu->prPacket + MAC_TX_RESERVED_FIELD);
  865. prStaRec = cnmGetStaRecByAddress(prAdapter, NETWORK_TYPE_P2P_INDEX, prWlanHdr->aucAddr1);
  866. prMgmtTxMsdu->ucNetworkType = (UINT_8) NETWORK_TYPE_P2P_INDEX;
  867. switch (prWlanHdr->u2FrameCtrl & MASK_FRAME_TYPE) {
  868. case MAC_FRAME_PROBE_RSP:
  869. DBGLOG(P2P, TRACE, "p2pFuncTxMgmtFrame: TX MAC_FRAME_PROBE_RSP\n");
  870. fgIsProbrsp = TRUE;
  871. prMgmtTxMsdu = p2pFuncProcessP2pProbeRsp(prAdapter, prMgmtTxMsdu);
  872. break;
  873. default:
  874. break;
  875. }
  876. prMgmtTxReqInfo->u8Cookie = u8Cookie;
  877. prMgmtTxReqInfo->prMgmtTxMsdu = prMgmtTxMsdu;
  878. prMgmtTxReqInfo->fgIsMgmtTxRequested = TRUE;
  879. prMgmtTxMsdu->eSrc = TX_PACKET_MGMT;
  880. prMgmtTxMsdu->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
  881. prMgmtTxMsdu->ucStaRecIndex = (prStaRec != NULL) ? (prStaRec->ucIndex) : (0xFF);
  882. if (prStaRec != NULL)
  883. DBGLOG(P2P, TRACE, "Mgmt with station record: %pM.\n", prStaRec->aucMacAddr);
  884. prMgmtTxMsdu->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN; /* TODO: undcertain. */
  885. prMgmtTxMsdu->fgIs802_1x = FALSE;
  886. prMgmtTxMsdu->fgIs802_11 = TRUE;
  887. prMgmtTxMsdu->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
  888. prMgmtTxMsdu->pfTxDoneHandler = p2pFsmRunEventMgmtFrameTxDone;
  889. prMgmtTxMsdu->fgIsBasicRate = TRUE;
  890. DBGLOG(P2P, INFO, "%sMgmt seq NO. %d cookie: 0x%llx.\n", fgIsProbrsp ? "ProbeResp: " : "",
  891. prMgmtTxMsdu->ucTxSeqNum, prMgmtTxReqInfo->u8Cookie);
  892. nicTxEnqueueMsdu(prAdapter, prMgmtTxMsdu);
  893. } while (FALSE);
  894. return rWlanStatus;
  895. } /* p2pFuncTxMgmtFrame */
  896. VOID p2pFuncSetChannel(IN P_ADAPTER_T prAdapter, IN P_RF_CHANNEL_INFO_T prRfChannelInfo)
  897. {
  898. P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL;
  899. do {
  900. ASSERT_BREAK((prAdapter != NULL) && (prRfChannelInfo != NULL));
  901. prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
  902. prP2pConnSettings->ucOperatingChnl = prRfChannelInfo->ucChannelNum;
  903. prP2pConnSettings->eBand = prRfChannelInfo->eBand;
  904. } while (FALSE);
  905. }
  906. /* p2pFuncSetChannel */
  907. /*----------------------------------------------------------------------------*/
  908. /*!
  909. * @brief Retry JOIN for AUTH_MODE_AUTO_SWITCH
  910. *
  911. * @param[in] prStaRec Pointer to the STA_RECORD_T
  912. *
  913. * @retval TRUE We will retry JOIN
  914. * @retval FALSE We will not retry JOIN
  915. */
  916. /*----------------------------------------------------------------------------*/
  917. BOOLEAN p2pFuncRetryJOIN(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_P2P_JOIN_INFO_T prJoinInfo)
  918. {
  919. P_MSG_JOIN_REQ_T prJoinReqMsg = (P_MSG_JOIN_REQ_T) NULL;
  920. BOOLEAN fgRetValue = FALSE;
  921. do {
  922. ASSERT_BREAK((prAdapter != NULL) && (prStaRec != NULL) && (prJoinInfo != NULL));
  923. /* Retry other AuthType if possible */
  924. if (!prJoinInfo->ucAvailableAuthTypes)
  925. break;
  926. if (prJoinInfo->ucAvailableAuthTypes & (UINT_8) AUTH_TYPE_SHARED_KEY) {
  927. DBGLOG(P2P, INFO, "RETRY JOIN INIT: Retry Authentication with AuthType == SHARED_KEY.\n");
  928. prJoinInfo->ucAvailableAuthTypes &= ~(UINT_8) AUTH_TYPE_SHARED_KEY;
  929. prStaRec->ucAuthAlgNum = (UINT_8) AUTH_ALGORITHM_NUM_SHARED_KEY;
  930. } else {
  931. DBGLOG(P2P, ERROR, "RETRY JOIN INIT: Retry Authentication with Unexpected AuthType.\n");
  932. ASSERT(0);
  933. break;
  934. }
  935. prJoinInfo->ucAvailableAuthTypes = 0; /* No more available Auth Types */
  936. /* Trigger SAA to start JOIN process. */
  937. prJoinReqMsg = (P_MSG_JOIN_REQ_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
  938. if (!prJoinReqMsg) {
  939. ASSERT(0); /* Can't trigger SAA FSM */
  940. break;
  941. }
  942. prJoinReqMsg->rMsgHdr.eMsgId = MID_P2P_SAA_FSM_START;
  943. prJoinReqMsg->ucSeqNum = ++prJoinInfo->ucSeqNumOfReqMsg;
  944. prJoinReqMsg->prStaRec = prStaRec;
  945. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prJoinReqMsg, MSG_SEND_METHOD_BUF);
  946. fgRetValue = TRUE;
  947. } while (FALSE);
  948. return fgRetValue;
  949. } /* end of p2pFuncRetryJOIN() */
  950. /*----------------------------------------------------------------------------*/
  951. /*!
  952. * @brief This function will update the contain of BSS_INFO_T for AIS network once
  953. * the association was completed.
  954. *
  955. * @param[in] prStaRec Pointer to the STA_RECORD_T
  956. * @param[in] prAssocRspSwRfb Pointer to SW RFB of ASSOC RESP FRAME.
  957. *
  958. * @return (none)
  959. */
  960. /*----------------------------------------------------------------------------*/
  961. VOID
  962. p2pFuncUpdateBssInfoForJOIN(IN P_ADAPTER_T prAdapter,
  963. IN P_BSS_DESC_T prBssDesc, IN P_STA_RECORD_T prStaRec, IN P_SW_RFB_T prAssocRspSwRfb)
  964. {
  965. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  966. P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL;
  967. P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) NULL;
  968. UINT_16 u2IELength;
  969. PUINT_8 pucIE;
  970. DEBUGFUNC("p2pUpdateBssInfoForJOIN()");
  971. ASSERT(prAdapter);
  972. ASSERT(prStaRec);
  973. ASSERT(prAssocRspSwRfb);
  974. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  975. prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
  976. prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prAssocRspSwRfb->pvHeader;
  977. DBGLOG(P2P, INFO, "Update P2P_BSS_INFO_T and apply settings to MAC\n");
  978. /* 3 <1> Update BSS_INFO_T from AIS_FSM_INFO_T or User Settings */
  979. /* 4 <1.1> Setup Operation Mode */
  980. prP2pBssInfo->eCurrentOPMode = OP_MODE_INFRASTRUCTURE;
  981. /* 4 <1.2> Setup SSID */
  982. COPY_SSID(prP2pBssInfo->aucSSID,
  983. prP2pBssInfo->ucSSIDLen, prP2pConnSettings->aucSSID, prP2pConnSettings->ucSSIDLen);
  984. if (prBssDesc == NULL) {
  985. /* Target BSS NULL. */
  986. DBGLOG(P2P, TRACE, "Target BSS NULL\n");
  987. return;
  988. }
  989. if (UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prAssocRspFrame->aucBSSID))
  990. ASSERT(FALSE);
  991. /* 4 <1.3> Setup Channel, Band */
  992. prP2pBssInfo->ucPrimaryChannel = prBssDesc->ucChannelNum;
  993. prP2pBssInfo->eBand = prBssDesc->eBand;
  994. /* 3 <2> Update BSS_INFO_T from STA_RECORD_T */
  995. /* 4 <2.1> Save current AP's STA_RECORD_T and current AID */
  996. prP2pBssInfo->prStaRecOfAP = prStaRec;
  997. prP2pBssInfo->u2AssocId = prStaRec->u2AssocId;
  998. /* 4 <2.2> Setup Capability */
  999. prP2pBssInfo->u2CapInfo = prStaRec->u2CapInfo; /* Use AP's Cap Info as BSS Cap Info */
  1000. if (prP2pBssInfo->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)
  1001. prP2pBssInfo->fgIsShortPreambleAllowed = TRUE;
  1002. else
  1003. prP2pBssInfo->fgIsShortPreambleAllowed = FALSE;
  1004. /* 4 <2.3> Setup PHY Attributes and Basic Rate Set/Operational Rate Set */
  1005. prP2pBssInfo->ucPhyTypeSet = prStaRec->ucDesiredPhyTypeSet;
  1006. prP2pBssInfo->ucNonHTBasicPhyType = prStaRec->ucNonHTBasicPhyType;
  1007. prP2pBssInfo->u2OperationalRateSet = prStaRec->u2OperationalRateSet;
  1008. prP2pBssInfo->u2BSSBasicRateSet = prStaRec->u2BSSBasicRateSet;
  1009. /* 3 <3> Update BSS_INFO_T from SW_RFB_T (Association Resp Frame) */
  1010. /* 4 <3.1> Setup BSSID */
  1011. COPY_MAC_ADDR(prP2pBssInfo->aucBSSID, prAssocRspFrame->aucBSSID);
  1012. u2IELength = (UINT_16) ((prAssocRspSwRfb->u2PacketLen - prAssocRspSwRfb->u2HeaderLen) -
  1013. (OFFSET_OF(WLAN_ASSOC_RSP_FRAME_T, aucInfoElem[0]) - WLAN_MAC_MGMT_HEADER_LEN));
  1014. pucIE = prAssocRspFrame->aucInfoElem;
  1015. /* 4 <3.2> Parse WMM and setup QBSS flag */
  1016. /* Parse WMM related IEs and configure HW CRs accordingly */
  1017. mqmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
  1018. prP2pBssInfo->fgIsQBSS = prStaRec->fgIsQoS;
  1019. /* 3 <4> Update BSS_INFO_T from BSS_DESC_T */
  1020. ASSERT(prBssDesc);
  1021. prBssDesc->fgIsConnecting = FALSE;
  1022. prBssDesc->fgIsConnected = TRUE;
  1023. /* 4 <4.1> Setup MIB for current BSS */
  1024. prP2pBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
  1025. /* NOTE: Defer ucDTIMPeriod updating to when beacon is received after connection */
  1026. prP2pBssInfo->ucDTIMPeriod = 0;
  1027. prP2pBssInfo->u2ATIMWindow = 0;
  1028. prP2pBssInfo->ucBeaconTimeoutCount = AIS_BEACON_TIMEOUT_COUNT_INFRA;
  1029. /* 4 <4.2> Update HT information and set channel */
  1030. /* Record HT related parameters in rStaRec and rBssInfo
  1031. * Note: it shall be called before nicUpdateBss()
  1032. */
  1033. rlmProcessAssocRsp(prAdapter, prAssocRspSwRfb, pucIE, u2IELength);
  1034. /* 4 <4.3> Sync with firmware for BSS-INFO */
  1035. nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX);
  1036. /* 4 <4.4> *DEFER OPERATION* nicPmIndicateBssConnected() will be invoked */
  1037. /* inside scanProcessBeaconAndProbeResp() after 1st beacon is received */
  1038. } /* end of p2pUpdateBssInfoForJOIN() */
  1039. /*----------------------------------------------------------------------------*/
  1040. /*!
  1041. * @brief This function will validate the Rx Auth Frame and then return
  1042. * the status code to AAA to indicate if need to perform following actions
  1043. * when the specified conditions were matched.
  1044. *
  1045. * @param[in] prAdapter Pointer to the Adapter structure.
  1046. * @param[in] prSwRfb Pointer to SW RFB data structure.
  1047. * @param[in] pprStaRec Pointer to pointer of STA_RECORD_T structure.
  1048. * @param[out] pu2StatusCode The Status Code of Validation Result
  1049. *
  1050. * @retval TRUE Reply the Auth
  1051. * @retval FALSE Don't reply the Auth
  1052. */
  1053. /*----------------------------------------------------------------------------*/
  1054. BOOLEAN
  1055. p2pFuncValidateAuth(IN P_ADAPTER_T prAdapter,
  1056. IN P_SW_RFB_T prSwRfb, IN PP_STA_RECORD_T pprStaRec, OUT PUINT_16 pu2StatusCode)
  1057. {
  1058. BOOLEAN fgReplyAuth = TRUE;
  1059. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  1060. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  1061. P_WLAN_AUTH_FRAME_T prAuthFrame = (P_WLAN_AUTH_FRAME_T) NULL;
  1062. DBGLOG(P2P, INFO, "p2pValidate Authentication Frame\n");
  1063. do {
  1064. ASSERT_BREAK((prAdapter != NULL) &&
  1065. (prSwRfb != NULL) && (pprStaRec != NULL) && (pu2StatusCode != NULL));
  1066. /* P2P 3.2.8 */
  1067. *pu2StatusCode = STATUS_CODE_REQ_DECLINED;
  1068. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  1069. prAuthFrame = (P_WLAN_AUTH_FRAME_T) prSwRfb->pvHeader;
  1070. if ((prP2pBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT)
  1071. || (prP2pBssInfo->eIntendOPMode != OP_MODE_NUM)) {
  1072. /* We are not under AP Mode yet. */
  1073. fgReplyAuth = FALSE;
  1074. DBGLOG(P2P, WARN,
  1075. "Current OP mode is not under AP mode. (%d)\n", prP2pBssInfo->eCurrentOPMode);
  1076. break;
  1077. }
  1078. prStaRec = cnmGetStaRecByAddress(prAdapter, (UINT_8) NETWORK_TYPE_P2P_INDEX, prAuthFrame->aucSrcAddr);
  1079. if (!prStaRec) {
  1080. prStaRec = cnmStaRecAlloc(prAdapter, (UINT_8) NETWORK_TYPE_P2P_INDEX);
  1081. /* TODO(Kevin): Error handling of allocation of STA_RECORD_T for
  1082. * exhausted case and do removal of unused STA_RECORD_T.
  1083. */
  1084. /* Sent a message event to clean un-used STA_RECORD_T. */
  1085. ASSERT(prStaRec);
  1086. if (!prStaRec) {
  1087. DBGLOG(AAA, INFO, "Station Limit Full. Decline a new Authentication.\n");
  1088. break;
  1089. }
  1090. COPY_MAC_ADDR(prStaRec->aucMacAddr, prAuthFrame->aucSrcAddr);
  1091. prSwRfb->ucStaRecIdx = prStaRec->ucIndex;
  1092. prStaRec->u2BSSBasicRateSet = prP2pBssInfo->u2BSSBasicRateSet;
  1093. prStaRec->u2DesiredNonHTRateSet = RATE_SET_ERP_P2P;
  1094. prStaRec->u2OperationalRateSet = RATE_SET_ERP_P2P;
  1095. prStaRec->ucPhyTypeSet = PHY_TYPE_SET_802_11GN;
  1096. prStaRec->eStaType = STA_TYPE_P2P_GC;
  1097. /* NOTE(Kevin): Better to change state here, not at TX Done */
  1098. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  1099. } else {
  1100. prSwRfb->ucStaRecIdx = prStaRec->ucIndex;
  1101. if ((prStaRec->ucStaState > STA_STATE_1) && (IS_STA_IN_P2P(prStaRec))) {
  1102. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  1103. p2pFuncResetStaRecStatus(prAdapter, prStaRec);
  1104. bssRemoveStaRecFromClientList(prAdapter, prP2pBssInfo, prStaRec);
  1105. }
  1106. }
  1107. if (prP2pBssInfo->rStaRecOfClientList.u4NumElem >= P2P_MAXIMUM_CLIENT_COUNT ||
  1108. kalP2PMaxClients(prAdapter->prGlueInfo, prP2pBssInfo->rStaRecOfClientList.u4NumElem)) {
  1109. /* GROUP limit full. */
  1110. /* P2P 3.2.8 */
  1111. DBGLOG(P2P, WARN,
  1112. "Group Limit Full. (%d)\n", (INT_16) prP2pBssInfo->rStaRecOfClientList.u4NumElem);
  1113. bssRemoveStaRecFromClientList(prAdapter, prP2pBssInfo, prStaRec);
  1114. cnmStaRecFree(prAdapter, prStaRec, FALSE);
  1115. fgReplyAuth = TRUE;
  1116. *pu2StatusCode = STATUS_CODE_ASSOC_DENIED_AP_OVERLOAD;
  1117. break;
  1118. }
  1119. /* Hotspot Blacklist */
  1120. if (prAuthFrame->aucSrcAddr) {
  1121. if (kalP2PCmpBlackList(prAdapter->prGlueInfo, prAuthFrame->aucSrcAddr)) {
  1122. fgReplyAuth = TRUE;
  1123. *pu2StatusCode = STATUS_CODE_ASSOC_DENIED_OUTSIDE_STANDARD;
  1124. return fgReplyAuth;
  1125. }
  1126. }
  1127. /* prStaRec->eStaType = STA_TYPE_INFRA_CLIENT; */
  1128. prStaRec->eStaType = STA_TYPE_P2P_GC;
  1129. prStaRec->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
  1130. /* Update Station Record - Status/Reason Code */
  1131. prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
  1132. prStaRec->ucJoinFailureCount = 0;
  1133. *pprStaRec = prStaRec;
  1134. *pu2StatusCode = STATUS_CODE_SUCCESSFUL;
  1135. } while (FALSE);
  1136. return fgReplyAuth;
  1137. } /* p2pFuncValidateAuth */
  1138. VOID p2pFuncResetStaRecStatus(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
  1139. {
  1140. do {
  1141. if ((prAdapter == NULL) || (prStaRec == NULL)) {
  1142. ASSERT(FALSE);
  1143. break;
  1144. }
  1145. prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
  1146. prStaRec->u2ReasonCode = REASON_CODE_RESERVED;
  1147. prStaRec->ucJoinFailureCount = 0;
  1148. prStaRec->fgTransmitKeyExist = FALSE;
  1149. prStaRec->fgSetPwrMgtBit = FALSE;
  1150. } while (FALSE);
  1151. } /* p2pFuncResetStaRecStatus */
  1152. /*----------------------------------------------------------------------------*/
  1153. /*!
  1154. * @brief The function is used to initialize the value of the connection settings for
  1155. * P2P network
  1156. *
  1157. * @param (none)
  1158. *
  1159. * @return (none)
  1160. */
  1161. /*----------------------------------------------------------------------------*/
  1162. VOID p2pFuncInitConnectionSettings(IN P_ADAPTER_T prAdapter, IN P_P2P_CONNECTION_SETTINGS_T prP2PConnSettings)
  1163. {
  1164. P_DEVICE_TYPE_T prDevType;
  1165. UINT_8 aucDefaultDevName[] = P2P_DEFAULT_DEV_NAME;
  1166. UINT_8 aucWfaOui[] = VENDOR_OUI_WFA;
  1167. #if CFG_SUPPORT_CFG_FILE
  1168. P_WIFI_VAR_T prWifiVar = NULL;
  1169. #endif
  1170. ASSERT(prP2PConnSettings);
  1171. #if CFG_SUPPORT_CFG_FILE
  1172. prWifiVar = &(prAdapter->rWifiVar);
  1173. ASSERT(prWifiVar);
  1174. #endif
  1175. /* Setup Default Device Name */
  1176. prP2PConnSettings->ucDevNameLen = P2P_DEFAULT_DEV_NAME_LEN;
  1177. kalMemCopy(prP2PConnSettings->aucDevName, aucDefaultDevName, sizeof(aucDefaultDevName));
  1178. /* Setup Primary Device Type (Big-Endian) */
  1179. prDevType = &prP2PConnSettings->rPrimaryDevTypeBE;
  1180. prDevType->u2CategoryId = HTONS(P2P_DEFAULT_PRIMARY_CATEGORY_ID);
  1181. prDevType->u2SubCategoryId = HTONS(P2P_DEFAULT_PRIMARY_SUB_CATEGORY_ID);
  1182. prDevType->aucOui[0] = aucWfaOui[0];
  1183. prDevType->aucOui[1] = aucWfaOui[1];
  1184. prDevType->aucOui[2] = aucWfaOui[2];
  1185. prDevType->aucOui[3] = VENDOR_OUI_TYPE_WPS;
  1186. /* Setup Secondary Device Type */
  1187. prP2PConnSettings->ucSecondaryDevTypeCount = 0;
  1188. /* Setup Default Config Method */
  1189. prP2PConnSettings->eConfigMethodSelType = ENUM_CONFIG_METHOD_SEL_AUTO;
  1190. prP2PConnSettings->u2ConfigMethodsSupport = P2P_DEFAULT_CONFIG_METHOD;
  1191. prP2PConnSettings->u2TargetConfigMethod = 0;
  1192. prP2PConnSettings->u2LocalConfigMethod = 0;
  1193. prP2PConnSettings->fgIsPasswordIDRdy = FALSE;
  1194. /* For Device Capability */
  1195. prP2PConnSettings->fgSupportServiceDiscovery = FALSE;
  1196. prP2PConnSettings->fgSupportClientDiscoverability = TRUE;
  1197. prP2PConnSettings->fgSupportConcurrentOperation = TRUE;
  1198. prP2PConnSettings->fgSupportInfraManaged = FALSE;
  1199. prP2PConnSettings->fgSupportInvitationProcedure = FALSE;
  1200. /* For Group Capability */
  1201. #if CFG_SUPPORT_PERSISTENT_GROUP
  1202. prP2PConnSettings->fgSupportPersistentP2PGroup = TRUE;
  1203. #else
  1204. prP2PConnSettings->fgSupportPersistentP2PGroup = FALSE;
  1205. #endif
  1206. prP2PConnSettings->fgSupportIntraBSSDistribution = TRUE;
  1207. prP2PConnSettings->fgSupportCrossConnection = TRUE;
  1208. prP2PConnSettings->fgSupportPersistentReconnect = FALSE;
  1209. prP2PConnSettings->fgSupportOppPS = FALSE;
  1210. prP2PConnSettings->u2CTWindow = P2P_CTWINDOW_DEFAULT;
  1211. /* For Connection Settings. */
  1212. prP2PConnSettings->eAuthMode = AUTH_MODE_OPEN;
  1213. prP2PConnSettings->prTargetP2pDesc = NULL;
  1214. prP2PConnSettings->ucSSIDLen = 0;
  1215. /* Misc */
  1216. prP2PConnSettings->fgIsScanReqIssued = FALSE;
  1217. prP2PConnSettings->fgIsServiceDiscoverIssued = FALSE;
  1218. prP2PConnSettings->fgP2pGroupLimit = FALSE;
  1219. prP2PConnSettings->ucOperatingChnl = 0;
  1220. prP2PConnSettings->ucListenChnl = 0;
  1221. prP2PConnSettings->ucTieBreaker = (UINT_8) (kalRandomNumber() & 0x1);
  1222. prP2PConnSettings->eFormationPolicy = ENUM_P2P_FORMATION_POLICY_AUTO;
  1223. #if CFG_SUPPORT_CFG_FILE
  1224. /* prP2PConnSettings->fgIsWPSMode = prWifiVar->ucApWpsMode; */
  1225. prAdapter->rWifiVar.prP2pFsmInfo->fgIsWPSMode = prWifiVar->ucApWpsMode;
  1226. #endif
  1227. } /* p2pFuncInitConnectionSettings */
  1228. /*----------------------------------------------------------------------------*/
  1229. /*!
  1230. * @brief This function will validate the Rx Assoc Req Frame and then return
  1231. * the status code to AAA to indicate if need to perform following actions
  1232. * when the specified conditions were matched.
  1233. *
  1234. * @param[in] prAdapter Pointer to the Adapter structure.
  1235. * @param[in] prSwRfb Pointer to SW RFB data structure.
  1236. * @param[out] pu2StatusCode The Status Code of Validation Result
  1237. *
  1238. * @retval TRUE Reply the Assoc Resp
  1239. * @retval FALSE Don't reply the Assoc Resp
  1240. */
  1241. /*----------------------------------------------------------------------------*/
  1242. BOOLEAN p2pFuncValidateAssocReq(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb, OUT PUINT_16 pu2StatusCode)
  1243. {
  1244. BOOLEAN fgReplyAssocResp = TRUE;
  1245. P_WLAN_ASSOC_REQ_FRAME_T prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) NULL;
  1246. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  1247. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  1248. #if CFG_SUPPORT_WFD
  1249. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  1250. P_WFD_ATTRIBUTE_T prWfdAttribute = (P_WFD_ATTRIBUTE_T) NULL;
  1251. BOOLEAN fgNeedFree = FALSE;
  1252. #endif
  1253. /* UINT_16 u2AttriListLen = 0; */
  1254. UINT_16 u2WfdDevInfo = 0;
  1255. P_WFD_DEVICE_INFORMATION_IE_T prAttriWfdDevInfo;
  1256. /* TODO(Kevin): Call P2P functions to check ..
  1257. 2. Check we can accept connection from thsi peer
  1258. a. If we are in PROVISION state, only accept the peer we do the GO formation previously.
  1259. b. If we are in OPERATION state, only accept the other peer when P2P_GROUP_LIMIT is 0.
  1260. 3. Check Black List here.
  1261. */
  1262. do {
  1263. ASSERT_BREAK((prAdapter != NULL) && (prSwRfb != NULL) && (pu2StatusCode != NULL));
  1264. *pu2StatusCode = STATUS_CODE_REQ_DECLINED;
  1265. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  1266. prAssocReqFrame = (P_WLAN_ASSOC_REQ_FRAME_T) prSwRfb->pvHeader;
  1267. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  1268. if (prStaRec == NULL) {
  1269. /* Station record should be ready while RX AUTH frame. */
  1270. fgReplyAssocResp = FALSE;
  1271. ASSERT(FALSE);
  1272. break;
  1273. }
  1274. prStaRec->ucRCPI = prSwRfb->prHifRxHdr->ucRcpi;
  1275. prStaRec->u2DesiredNonHTRateSet &= prP2pBssInfo->u2OperationalRateSet;
  1276. prStaRec->ucDesiredPhyTypeSet = prStaRec->ucPhyTypeSet & prP2pBssInfo->ucPhyTypeSet;
  1277. if (prStaRec->ucDesiredPhyTypeSet == 0) {
  1278. /* The station only support 11B rate. */
  1279. *pu2StatusCode = STATUS_CODE_ASSOC_DENIED_RATE_NOT_SUPPORTED;
  1280. break;
  1281. }
  1282. #if CFG_SUPPORT_WFD && 1
  1283. /* LOG_FUNC("Skip check WFD IE because some API is not ready\n"); */
  1284. if (!prAdapter->rWifiVar.prP2pFsmInfo) {
  1285. fgReplyAssocResp = FALSE;
  1286. ASSERT(FALSE);
  1287. break;
  1288. }
  1289. prWfdCfgSettings = &prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings;
  1290. DBGLOG(P2P, INFO, "AssocReq, wfd_en %u wfd_info 0x%x wfd_policy 0x%x wfd_flag 0x%x\n",
  1291. prWfdCfgSettings->ucWfdEnable, prWfdCfgSettings->u2WfdDevInfo,
  1292. prWfdCfgSettings->u4WfdPolicy, prWfdCfgSettings->u4WfdFlag); /* Eddie */
  1293. if (prWfdCfgSettings->ucWfdEnable) {
  1294. if (prWfdCfgSettings->u4WfdPolicy & BIT(6)) {
  1295. /* Rejected all. */
  1296. break;
  1297. }
  1298. /* fgNeedFree = p2pFuncGetAttriList(prAdapter, */
  1299. /* VENDOR_OUI_TYPE_WFD, */
  1300. /* (PUINT_8)prAssocReqFrame->aucInfoElem, */
  1301. /* (prSwRfb->u2PacketLen - OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem)), */
  1302. /* (PPUINT_8)&prWfdAttribute, */
  1303. /* &u2AttriListLen); */
  1304. prAttriWfdDevInfo = (P_WFD_DEVICE_INFORMATION_IE_T)
  1305. p2pFuncGetSpecAttri(prAdapter,
  1306. VENDOR_OUI_TYPE_WFD,
  1307. (PUINT_8) prAssocReqFrame->aucInfoElem,
  1308. (prSwRfb->u2PacketLen -
  1309. OFFSET_OF(WLAN_ASSOC_REQ_FRAME_T, aucInfoElem)),
  1310. WFD_ATTRI_ID_DEV_INFO);
  1311. if ((prWfdCfgSettings->u4WfdPolicy & BIT(5)) && (prAttriWfdDevInfo != NULL)) {
  1312. /* Rejected with WFD IE. */
  1313. break;
  1314. }
  1315. if ((prWfdCfgSettings->u4WfdPolicy & BIT(0)) && (prAttriWfdDevInfo == NULL)) {
  1316. /* Rejected without WFD IE. */
  1317. break;
  1318. }
  1319. if (prAttriWfdDevInfo == NULL) {
  1320. /*
  1321. * Without WFD IE.
  1322. * Do nothing. Accept the connection request.
  1323. */
  1324. *pu2StatusCode = STATUS_CODE_SUCCESSFUL;
  1325. break;
  1326. }
  1327. /* prAttriWfdDevInfo = */
  1328. /* (P_WFD_DEVICE_INFORMATION_IE_T)p2pFuncGetSpecAttri(prAdapter, */
  1329. /* VENDOR_OUI_TYPE_WFD, */
  1330. /* (PUINT_8)prWfdAttribute, */
  1331. /* u2AttriListLen, */
  1332. /* WFD_ATTRI_ID_DEV_INFO); */
  1333. /* if (prAttriWfdDevInfo == NULL) { */
  1334. /* No such attribute. */
  1335. /* break; */
  1336. /* } */
  1337. WLAN_GET_FIELD_BE16(&prAttriWfdDevInfo->u2WfdDevInfo, &u2WfdDevInfo);
  1338. DBGLOG(P2P, INFO, "RX Assoc Req WFD Info:0x%x.\n", u2WfdDevInfo);
  1339. if ((prWfdCfgSettings->u4WfdPolicy & BIT(1)) && ((u2WfdDevInfo & 0x3) == 0x0)) {
  1340. /* Rejected because of SOURCE. */
  1341. break;
  1342. }
  1343. if ((prWfdCfgSettings->u4WfdPolicy & BIT(2)) && ((u2WfdDevInfo & 0x3) == 0x1)) {
  1344. /* Rejected because of Primary Sink. */
  1345. break;
  1346. }
  1347. if ((prWfdCfgSettings->u4WfdPolicy & BIT(3)) && ((u2WfdDevInfo & 0x3) == 0x2)) {
  1348. /* Rejected because of Secondary Sink. */
  1349. break;
  1350. }
  1351. if ((prWfdCfgSettings->u4WfdPolicy & BIT(4)) && ((u2WfdDevInfo & 0x3) == 0x3)) {
  1352. /* Rejected because of Source & Primary Sink. */
  1353. break;
  1354. }
  1355. /* Check role */
  1356. if ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID) &&
  1357. ((prWfdCfgSettings->u2WfdDevInfo & BITS(0, 1)) == 0x3)) {
  1358. /* P_MSG_WFD_CONFIG_SETTINGS_CHANGED_T prMsgWfdCfgUpdate =
  1359. * (P_MSG_WFD_CONFIG_SETTINGS_CHANGED_T)NULL; */
  1360. UINT_16 u2DevInfo = prWfdCfgSettings->u2WfdDevInfo;
  1361. /* We may change role here if we are dual role */
  1362. if ((u2WfdDevInfo & BITS(0, 1)) == 0x00 /* Peer is Source */) {
  1363. DBGLOG(P2P, INFO, "WFD: Switch role to primary sink\n");
  1364. prWfdCfgSettings->u2WfdDevInfo &= ~BITS(0, 1);
  1365. prWfdCfgSettings->u2WfdDevInfo |= 0x1;
  1366. /* event to annonce the role is chanaged to P-Sink */
  1367. } else if ((u2WfdDevInfo & BITS(0, 1)) == 0x01 /* Peer is P-Sink */) {
  1368. DBGLOG(P2P, INFO, "WFD: Switch role to source\n");
  1369. prWfdCfgSettings->u2WfdDevInfo &= ~BITS(0, 1);
  1370. /* event to annonce the role is chanaged to Source */
  1371. } else {
  1372. DBGLOG(P2P, INFO, "WFD: Peer role is wrong type(dev 0x%x)\n",
  1373. (u2DevInfo));
  1374. DBGLOG(P2P, INFO, "WFD: Switch role to source\n");
  1375. prWfdCfgSettings->u2WfdDevInfo &= ~BITS(0, 1);
  1376. /* event to annonce the role is chanaged to Source */
  1377. }
  1378. p2pFsmRunEventWfdSettingUpdate(prAdapter, NULL);
  1379. } /* Dual role p2p->wfd_params->WfdDevInfo */
  1380. /* WFD_FLAG_DEV_INFO_VALID */
  1381. }
  1382. /* ucWfdEnable */
  1383. #endif
  1384. *pu2StatusCode = STATUS_CODE_SUCCESSFUL;
  1385. } while (FALSE);
  1386. #if CFG_SUPPORT_WFD
  1387. if ((prWfdAttribute) && (fgNeedFree))
  1388. kalMemFree(prWfdAttribute, VIR_MEM_TYPE, WPS_MAXIMUM_ATTRIBUTES_CACHE_SIZE);
  1389. #endif
  1390. return fgReplyAssocResp;
  1391. } /* p2pFuncValidateAssocReq */
  1392. /*----------------------------------------------------------------------------*/
  1393. /*!
  1394. * @brief This function is used to check the P2P IE
  1395. *
  1396. *
  1397. * @return none
  1398. */
  1399. /*----------------------------------------------------------------------------*/
  1400. BOOLEAN p2pFuncParseCheckForP2PInfoElem(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucBuf, OUT PUINT_8 pucOuiType)
  1401. {
  1402. UINT_8 aucWfaOui[] = VENDOR_OUI_WFA_SPECIFIC;
  1403. P_IE_WFA_T prWfaIE = (P_IE_WFA_T) NULL;
  1404. do {
  1405. ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pucOuiType != NULL));
  1406. prWfaIE = (P_IE_WFA_T) pucBuf;
  1407. if (IE_LEN(pucBuf) <= ELEM_MIN_LEN_WFA_OUI_TYPE_SUBTYPE) {
  1408. break;
  1409. } else if (prWfaIE->aucOui[0] != aucWfaOui[0] ||
  1410. prWfaIE->aucOui[1] != aucWfaOui[1] || prWfaIE->aucOui[2] != aucWfaOui[2]) {
  1411. break;
  1412. }
  1413. *pucOuiType = prWfaIE->ucOuiType;
  1414. return TRUE;
  1415. } while (FALSE);
  1416. return FALSE;
  1417. } /* p2pFuncParseCheckForP2PInfoElem */
  1418. /*----------------------------------------------------------------------------*/
  1419. /*!
  1420. * @brief This function will validate the Rx Probe Request Frame and then return
  1421. * result to BSS to indicate if need to send the corresponding Probe Response
  1422. * Frame if the specified conditions were matched.
  1423. *
  1424. * @param[in] prAdapter Pointer to the Adapter structure.
  1425. * @param[in] prSwRfb Pointer to SW RFB data structure.
  1426. * @param[out] pu4ControlFlags Control flags for replying the Probe Response
  1427. *
  1428. * @retval TRUE Reply the Probe Response
  1429. * @retval FALSE Don't reply the Probe Response
  1430. */
  1431. /*----------------------------------------------------------------------------*/
  1432. BOOLEAN p2pFuncValidateProbeReq(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb, OUT PUINT_32 pu4ControlFlags)
  1433. {
  1434. BOOLEAN fgIsReplyProbeRsp = FALSE;
  1435. P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
  1436. DEBUGFUNC("p2pFuncValidateProbeReq");
  1437. DBGLOG(P2P, TRACE, "p2pFuncValidateProbeReq\n");
  1438. do {
  1439. ASSERT_BREAK((prAdapter != NULL) && (prSwRfb != NULL));
  1440. prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
  1441. if (prP2pFsmInfo->u4P2pPacketFilter & PARAM_PACKET_FILTER_PROBE_REQ) {
  1442. DBGLOG(P2P, TRACE, "report probe req to OS\n");
  1443. /* Leave the probe response to p2p_supplicant. */
  1444. kalP2PIndicateRxMgmtFrame(prAdapter->prGlueInfo, prSwRfb);
  1445. }
  1446. } while (FALSE);
  1447. return fgIsReplyProbeRsp;
  1448. } /* end of p2pFuncValidateProbeReq() */
  1449. /*----------------------------------------------------------------------------*/
  1450. /*!
  1451. * @brief This function will validate the Rx Probe Request Frame and then return
  1452. * result to BSS to indicate if need to send the corresponding Probe Response
  1453. * Frame if the specified conditions were matched.
  1454. *
  1455. * @param[in] prAdapter Pointer to the Adapter structure.
  1456. * @param[in] prSwRfb Pointer to SW RFB data structure.
  1457. * @param[out] pu4ControlFlags Control flags for replying the Probe Response
  1458. *
  1459. * @retval TRUE Reply the Probe Response
  1460. * @retval FALSE Don't reply the Probe Response
  1461. */
  1462. /*----------------------------------------------------------------------------*/
  1463. VOID p2pFuncValidateRxActionFrame(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  1464. {
  1465. P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
  1466. DEBUGFUNC("p2pFuncValidateProbeReq");
  1467. do {
  1468. ASSERT_BREAK((prAdapter != NULL) && (prSwRfb != NULL));
  1469. prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
  1470. if (prP2pFsmInfo->u4P2pPacketFilter & PARAM_PACKET_FILTER_ACTION_FRAME) {
  1471. /* Leave the probe response to p2p_supplicant. */
  1472. kalP2PIndicateRxMgmtFrame(prAdapter->prGlueInfo, prSwRfb);
  1473. }
  1474. } while (FALSE);
  1475. return;
  1476. } /* p2pFuncValidateRxMgmtFrame */
  1477. BOOLEAN p2pFuncIsAPMode(IN P_P2P_FSM_INFO_T prP2pFsmInfo)
  1478. {
  1479. if (prP2pFsmInfo) {
  1480. if (prP2pFsmInfo->fgIsWPSMode == 1)
  1481. return FALSE;
  1482. return prP2pFsmInfo->fgIsApMode;
  1483. } else {
  1484. return FALSE;
  1485. }
  1486. }
  1487. /* p2pFuncIsAPMode */
  1488. VOID
  1489. p2pFuncParseBeaconContent(IN P_ADAPTER_T prAdapter,
  1490. IN P_BSS_INFO_T prP2pBssInfo, IN PUINT_8 pucIEInfo, IN UINT_32 u4IELen)
  1491. {
  1492. PUINT_8 pucIE = (PUINT_8) NULL;
  1493. UINT_16 u2Offset = 0;
  1494. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  1495. BOOLEAN ucNewSecMode = FALSE;
  1496. BOOLEAN ucOldSecMode = FALSE;
  1497. UINT_8 ucOuiType;
  1498. UINT_16 u2SubTypeVersion;
  1499. do {
  1500. ASSERT_BREAK((prAdapter != NULL) && (prP2pBssInfo != NULL));
  1501. if (u4IELen == 0)
  1502. break;
  1503. prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  1504. prP2pSpecificBssInfo->u2AttributeLen = 0;
  1505. ASSERT_BREAK(pucIEInfo != NULL);
  1506. pucIE = pucIEInfo;
  1507. ucOldSecMode = kalP2PGetCipher(prAdapter->prGlueInfo);
  1508. IE_FOR_EACH(pucIE, u4IELen, u2Offset) {
  1509. switch (IE_ID(pucIE)) {
  1510. case ELEM_ID_SSID:
  1511. {
  1512. /* 0 */ /* V */ /* Done */
  1513. /* DBGLOG(P2P, TRACE, ("SSID update\n")); */
  1514. /* SSID is saved when start AP/GO */
  1515. /* SSID IE set in beacon from supplicant will not always be */
  1516. /* the true since hidden SSID case */
  1517. /*
  1518. COPY_SSID(prP2pBssInfo->aucSSID,
  1519. prP2pBssInfo->ucSSIDLen,
  1520. SSID_IE(pucIE)->aucSSID,
  1521. SSID_IE(pucIE)->ucLength);
  1522. COPY_SSID(prP2pSpecificBssInfo->aucGroupSsid,
  1523. prP2pSpecificBssInfo->u2GroupSsidLen,
  1524. SSID_IE(pucIE)->aucSSID,
  1525. SSID_IE(pucIE)->ucLength);
  1526. */
  1527. }
  1528. break;
  1529. case ELEM_ID_SUP_RATES:
  1530. {
  1531. /* 1 */ /* V */ /* Done */
  1532. DBGLOG(P2P, TRACE, "Support Rate IE\n");
  1533. kalMemCopy(prP2pBssInfo->aucAllSupportedRates,
  1534. SUP_RATES_IE(pucIE)->aucSupportedRates,
  1535. SUP_RATES_IE(pucIE)->ucLength);
  1536. prP2pBssInfo->ucAllSupportedRatesLen = SUP_RATES_IE(pucIE)->ucLength;
  1537. DBGLOG_MEM8(P2P, TRACE, SUP_RATES_IE(pucIE)->aucSupportedRates,
  1538. SUP_RATES_IE(pucIE)->ucLength);
  1539. }
  1540. break;
  1541. case ELEM_ID_DS_PARAM_SET:
  1542. {
  1543. /* 3 */ /* V */ /* Done */
  1544. P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings =
  1545. prAdapter->rWifiVar.prP2PConnSettings;
  1546. DBGLOG(P2P, TRACE, "DS PARAM IE\n");
  1547. ASSERT(prP2pConnSettings->ucOperatingChnl == DS_PARAM_IE(pucIE)->ucCurrChnl);
  1548. if (prP2pConnSettings->eBand != BAND_2G4) {
  1549. ASSERT(FALSE);
  1550. break;
  1551. }
  1552. /* prP2pBssInfo->ucPrimaryChannel = DS_PARAM_IE(pucIE)->ucCurrChnl; */
  1553. /* prP2pBssInfo->eBand = BAND_2G4; */
  1554. }
  1555. break;
  1556. case ELEM_ID_TIM: /* 5 */ /* V */
  1557. DBGLOG(P2P, TRACE, "TIM IE\n");
  1558. TIM_IE(pucIE)->ucDTIMPeriod = prP2pBssInfo->ucDTIMPeriod;
  1559. break;
  1560. case ELEM_ID_ERP_INFO: /* 42 */ /* V */
  1561. {
  1562. #if 1
  1563. /* This IE would dynamic change due to FW detection change is required. */
  1564. DBGLOG(P2P, TRACE, "ERP IE will be over write by driver\n");
  1565. DBGLOG(P2P, TRACE, " ucERP: %x.\n", ERP_INFO_IE(pucIE)->ucERP);
  1566. #else
  1567. /* This IE would dynamic change due to FW detection change is required. */
  1568. DBGLOG(P2P, TRACE, "ERP IE.\n");
  1569. prP2pBssInfo->ucPhyTypeSet |= PHY_TYPE_SET_802_11GN;
  1570. ASSERT(prP2pBssInfo->eBand == BAND_2G4);
  1571. prP2pBssInfo->fgObssErpProtectMode =
  1572. ((ERP_INFO_IE(pucIE)->ucERP & ERP_INFO_USE_PROTECTION) ? TRUE : FALSE);
  1573. prP2pBssInfo->fgErpProtectMode =
  1574. ((ERP_INFO_IE(pucIE)->ucERP &
  1575. (ERP_INFO_USE_PROTECTION | ERP_INFO_NON_ERP_PRESENT)) ? TRUE : FALSE);
  1576. #endif
  1577. }
  1578. break;
  1579. case ELEM_ID_HT_CAP: /* 45 */ /* V */
  1580. {
  1581. #if 1
  1582. DBGLOG(P2P, TRACE, "HT CAP IE would be overwritten by driver\n");
  1583. DBGLOG(P2P, TRACE,
  1584. "HT Cap Info:%x, AMPDU Param:%x\n", HT_CAP_IE(pucIE)->u2HtCapInfo,
  1585. HT_CAP_IE(pucIE)->ucAmpduParam);
  1586. DBGLOG(P2P, TRACE,
  1587. "HT Extended Cap Info%x,TX Beamforming Cap Info%x,Ant Selection Cap Info%x\n",
  1588. HT_CAP_IE(pucIE)->u2HtExtendedCap, HT_CAP_IE(pucIE)->u4TxBeamformingCap,
  1589. HT_CAP_IE(pucIE)->ucAselCap);
  1590. #else
  1591. prP2pBssInfo->ucPhyTypeSet |= PHY_TYPE_SET_802_11N;
  1592. /* u2HtCapInfo */
  1593. if ((HT_CAP_IE(pucIE)->u2HtCapInfo &
  1594. (HT_CAP_INFO_SUP_CHNL_WIDTH | HT_CAP_INFO_SHORT_GI_40M |
  1595. HT_CAP_INFO_DSSS_CCK_IN_40M)) == 0) {
  1596. prP2pBssInfo->fgAssoc40mBwAllowed = FALSE;
  1597. } else {
  1598. prP2pBssInfo->fgAssoc40mBwAllowed = TRUE;
  1599. }
  1600. if ((HT_CAP_IE(pucIE)->u2HtCapInfo &
  1601. (HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M)) == 0) {
  1602. prAdapter->rWifiVar.rConnSettings.fgRxShortGIDisabled = TRUE;
  1603. } else {
  1604. prAdapter->rWifiVar.rConnSettings.fgRxShortGIDisabled = FALSE;
  1605. }
  1606. /* ucAmpduParam */
  1607. DBGLOG(P2P, TRACE,
  1608. "AMPDU setting from supplicant:0x%x, & default value:0x%x\n",
  1609. (UINT_8) HT_CAP_IE(pucIE)->ucAmpduParam,
  1610. (UINT_8) AMPDU_PARAM_DEFAULT_VAL);
  1611. /* rSupMcsSet */
  1612. /* Can do nothing. the field is default value from other configuration. */
  1613. /* HT_CAP_IE(pucIE)->rSupMcsSet; */
  1614. /* u2HtExtendedCap */
  1615. ASSERT(HT_CAP_IE(pucIE)->u2HtExtendedCap ==
  1616. (HT_EXT_CAP_DEFAULT_VAL &
  1617. ~(HT_EXT_CAP_PCO | HT_EXT_CAP_PCO_TRANS_TIME_NONE)));
  1618. /* u4TxBeamformingCap */
  1619. ASSERT(HT_CAP_IE(pucIE)->u4TxBeamformingCap == TX_BEAMFORMING_CAP_DEFAULT_VAL);
  1620. /* ucAselCap */
  1621. ASSERT(HT_CAP_IE(pucIE)->ucAselCap == ASEL_CAP_DEFAULT_VAL);
  1622. #endif
  1623. }
  1624. break;
  1625. case ELEM_ID_RSN: /* 48 */ /* V */
  1626. {
  1627. RSN_INFO_T rRsnIe;
  1628. DBGLOG(P2P, TRACE, "RSN IE\n");
  1629. kalP2PSetCipher(prAdapter->prGlueInfo, IW_AUTH_CIPHER_CCMP);
  1630. ucNewSecMode = TRUE;
  1631. if (rsnParseRsnIE(prAdapter, RSN_IE(pucIE), &rRsnIe)) {
  1632. prP2pBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX];
  1633. prP2pBssInfo->u4RsnSelectedGroupCipher = RSN_CIPHER_SUITE_CCMP;
  1634. prP2pBssInfo->u4RsnSelectedPairwiseCipher = RSN_CIPHER_SUITE_CCMP;
  1635. prP2pBssInfo->u4RsnSelectedAKMSuite = RSN_AKM_SUITE_PSK;
  1636. prP2pBssInfo->u2RsnSelectedCapInfo = rRsnIe.u2RsnCap;
  1637. }
  1638. }
  1639. break;
  1640. case ELEM_ID_EXTENDED_SUP_RATES: /* 50 */ /* V */
  1641. /* Be attention,
  1642. * ELEM_ID_SUP_RATES should be placed before ELEM_ID_EXTENDED_SUP_RATES. */
  1643. DBGLOG(P2P, TRACE, "Ex Support Rate IE\n");
  1644. kalMemCopy(&(prP2pBssInfo->aucAllSupportedRates[prP2pBssInfo->ucAllSupportedRatesLen]),
  1645. EXT_SUP_RATES_IE(pucIE)->aucExtSupportedRates,
  1646. EXT_SUP_RATES_IE(pucIE)->ucLength);
  1647. DBGLOG_MEM8(P2P, TRACE, EXT_SUP_RATES_IE(pucIE)->aucExtSupportedRates,
  1648. EXT_SUP_RATES_IE(pucIE)->ucLength);
  1649. prP2pBssInfo->ucAllSupportedRatesLen += EXT_SUP_RATES_IE(pucIE)->ucLength;
  1650. break;
  1651. case ELEM_ID_HT_OP:
  1652. {
  1653. /* 61 */ /* V */ /* TODO: */
  1654. #if 1
  1655. DBGLOG(P2P, TRACE, "HT OP IE would be overwritten by driver\n");
  1656. DBGLOG(P2P, TRACE,
  1657. " Primary Channel: %x, Info1: %x, Info2: %x, Info3: %x\n",
  1658. HT_OP_IE(pucIE)->ucPrimaryChannel, HT_OP_IE(pucIE)->ucInfo1,
  1659. HT_OP_IE(pucIE)->u2Info2, HT_OP_IE(pucIE)->u2Info3);
  1660. #else
  1661. UINT_16 u2Info2 = 0;
  1662. prP2pBssInfo->ucPhyTypeSet |= PHY_TYPE_SET_802_11N;
  1663. DBGLOG(P2P, TRACE, "HT OP IE\n");
  1664. /* ucPrimaryChannel. */
  1665. ASSERT(HT_OP_IE(pucIE)->ucPrimaryChannel == prP2pBssInfo->ucPrimaryChannel);
  1666. /* ucInfo1 */
  1667. prP2pBssInfo->ucHtOpInfo1 = HT_OP_IE(pucIE)->ucInfo1;
  1668. /* u2Info2 */
  1669. u2Info2 = HT_OP_IE(pucIE)->u2Info2;
  1670. if (u2Info2 & HT_OP_INFO2_NON_GF_HT_STA_PRESENT) {
  1671. ASSERT(prP2pBssInfo->eGfOperationMode != GF_MODE_NORMAL);
  1672. u2Info2 &= ~HT_OP_INFO2_NON_GF_HT_STA_PRESENT;
  1673. }
  1674. if (u2Info2 & HT_OP_INFO2_OBSS_NON_HT_STA_PRESENT) {
  1675. prP2pBssInfo->eObssHtProtectMode = HT_PROTECT_MODE_NON_MEMBER;
  1676. u2Info2 &= ~HT_OP_INFO2_OBSS_NON_HT_STA_PRESENT;
  1677. }
  1678. switch (u2Info2 & HT_OP_INFO2_HT_PROTECTION) {
  1679. case HT_PROTECT_MODE_NON_HT:
  1680. prP2pBssInfo->eHtProtectMode = HT_PROTECT_MODE_NON_HT;
  1681. break;
  1682. case HT_PROTECT_MODE_NON_MEMBER:
  1683. prP2pBssInfo->eHtProtectMode = HT_PROTECT_MODE_NONE;
  1684. prP2pBssInfo->eObssHtProtectMode = HT_PROTECT_MODE_NON_MEMBER;
  1685. break;
  1686. default:
  1687. prP2pBssInfo->eHtProtectMode = HT_OP_IE(pucIE)->u2Info2;
  1688. break;
  1689. }
  1690. /* u2Info3 */
  1691. prP2pBssInfo->u2HtOpInfo3 = HT_OP_IE(pucIE)->u2Info3;
  1692. /* aucBasicMcsSet */
  1693. DBGLOG_MEM8(P2P, TRACE, HT_OP_IE(pucIE)->aucBasicMcsSet, 16);
  1694. #endif
  1695. }
  1696. break;
  1697. case ELEM_ID_OBSS_SCAN_PARAMS: /* 74 */ /* V */
  1698. {
  1699. DBGLOG(P2P, TRACE,
  1700. "ELEM_ID_OBSS_SCAN_PARAMS IE would be replaced by driver\n");
  1701. }
  1702. break;
  1703. case ELEM_ID_EXTENDED_CAP: /* 127 */ /* V */
  1704. {
  1705. DBGLOG(P2P, TRACE, "ELEM_ID_EXTENDED_CAP IE would be replaced by driver\n");
  1706. }
  1707. break;
  1708. case ELEM_ID_VENDOR: /* 221 */ /* V */
  1709. DBGLOG(P2P, TRACE, "Vender Specific IE\n");
  1710. if (rsnParseCheckForWFAInfoElem
  1711. (prAdapter, pucIE, &ucOuiType, &u2SubTypeVersion)) {
  1712. if ((ucOuiType == VENDOR_OUI_TYPE_WPA)
  1713. && (u2SubTypeVersion == VERSION_WPA)) {
  1714. kalP2PSetCipher(prAdapter->prGlueInfo, IW_AUTH_CIPHER_TKIP);
  1715. ucNewSecMode = TRUE;
  1716. kalMemCopy(prP2pSpecificBssInfo->aucWpaIeBuffer, pucIE,
  1717. IE_SIZE(pucIE));
  1718. prP2pSpecificBssInfo->u2WpaIeLen = IE_SIZE(pucIE);
  1719. } else if (ucOuiType == VENDOR_OUI_TYPE_WPS) {
  1720. kalP2PUpdateWSC_IE(prAdapter->prGlueInfo, 0, pucIE,
  1721. IE_SIZE(pucIE));
  1722. }
  1723. /* WMM here. */
  1724. } else if (p2pFuncParseCheckForP2PInfoElem(prAdapter, pucIE, &ucOuiType)) {
  1725. /* TODO Store the whole P2P IE & generate later. */
  1726. /* Be aware that there may be one or more P2P IE. */
  1727. if (ucOuiType == VENDOR_OUI_TYPE_P2P) {
  1728. kalMemCopy(&prP2pSpecificBssInfo->aucAttributesCache
  1729. [prP2pSpecificBssInfo->u2AttributeLen], pucIE,
  1730. IE_SIZE(pucIE));
  1731. prP2pSpecificBssInfo->u2AttributeLen += IE_SIZE(pucIE);
  1732. } else if (ucOuiType == VENDOR_OUI_TYPE_WFD) {
  1733. kalMemCopy(&prP2pSpecificBssInfo->aucAttributesCache
  1734. [prP2pSpecificBssInfo->u2AttributeLen], pucIE,
  1735. IE_SIZE(pucIE));
  1736. prP2pSpecificBssInfo->u2AttributeLen += IE_SIZE(pucIE);
  1737. }
  1738. } else {
  1739. kalMemCopy(&prP2pSpecificBssInfo->aucAttributesCache
  1740. [prP2pSpecificBssInfo->u2AttributeLen], pucIE,
  1741. IE_SIZE(pucIE));
  1742. prP2pSpecificBssInfo->u2AttributeLen += IE_SIZE(pucIE);
  1743. DBGLOG(P2P, TRACE, "Driver unprocessed Vender Specific IE\n");
  1744. ASSERT(FALSE);
  1745. }
  1746. /* TODO: Store other Vender IE except for WMM Param. */
  1747. break;
  1748. default:
  1749. DBGLOG(P2P, TRACE, "Unprocessed element ID:%d\n", IE_ID(pucIE));
  1750. break;
  1751. }
  1752. }
  1753. if (!ucNewSecMode && ucOldSecMode)
  1754. kalP2PSetCipher(prAdapter->prGlueInfo, IW_AUTH_CIPHER_NONE);
  1755. } while (FALSE);
  1756. } /* p2pFuncParseBeaconContent */
  1757. P_BSS_DESC_T
  1758. p2pFuncKeepOnConnection(IN P_ADAPTER_T prAdapter,
  1759. IN P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo,
  1760. IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo, IN P_P2P_SCAN_REQ_INFO_T prScanReqInfo)
  1761. {
  1762. P_BSS_DESC_T prTargetBss = (P_BSS_DESC_T) NULL;
  1763. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  1764. do {
  1765. ASSERT_BREAK((prAdapter != NULL) &&
  1766. (prConnReqInfo != NULL) && (prChnlReqInfo != NULL) && (prScanReqInfo != NULL));
  1767. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  1768. if (prP2pBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE)
  1769. break;
  1770. /* Update connection request information. */
  1771. ASSERT(prConnReqInfo->fgIsConnRequest == TRUE);
  1772. /* Find BSS Descriptor first. */
  1773. prTargetBss = scanP2pSearchDesc(prAdapter, prP2pBssInfo, prConnReqInfo);
  1774. if (prTargetBss == NULL) {
  1775. /* Update scan parameter... to scan target device. */
  1776. prScanReqInfo->ucNumChannelList = 1;
  1777. prScanReqInfo->eScanType = SCAN_TYPE_ACTIVE_SCAN;
  1778. prScanReqInfo->eChannelSet = SCAN_CHANNEL_FULL;
  1779. prScanReqInfo->u4BufLength = 0; /* Prevent other P2P ID in IE. */
  1780. prScanReqInfo->fgIsAbort = TRUE;
  1781. } else {
  1782. prChnlReqInfo->u8Cookie = 0;
  1783. prChnlReqInfo->ucReqChnlNum = prTargetBss->ucChannelNum;
  1784. prChnlReqInfo->eBand = prTargetBss->eBand;
  1785. prChnlReqInfo->eChnlSco = prTargetBss->eSco;
  1786. prChnlReqInfo->u4MaxInterval = AIS_JOIN_CH_REQUEST_INTERVAL;
  1787. prChnlReqInfo->eChannelReqType = CHANNEL_REQ_TYPE_GC_JOIN_REQ;
  1788. }
  1789. } while (FALSE);
  1790. return prTargetBss;
  1791. } /* p2pFuncKeepOnConnection */
  1792. /* Currently Only for ASSOC Response Frame. */
  1793. VOID p2pFuncStoreAssocRspIEBuffer(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  1794. {
  1795. P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
  1796. P_P2P_JOIN_INFO_T prJoinInfo = (P_P2P_JOIN_INFO_T) NULL;
  1797. P_WLAN_ASSOC_RSP_FRAME_T prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) NULL;
  1798. INT_16 i2IELen = 0;
  1799. do {
  1800. ASSERT_BREAK((prAdapter != NULL) && (prSwRfb != NULL));
  1801. prAssocRspFrame = (P_WLAN_ASSOC_RSP_FRAME_T) prSwRfb->pvHeader;
  1802. if (prAssocRspFrame->u2FrameCtrl != MAC_FRAME_ASSOC_RSP)
  1803. break;
  1804. i2IELen = prSwRfb->u2PacketLen - (WLAN_MAC_HEADER_LEN +
  1805. CAP_INFO_FIELD_LEN + STATUS_CODE_FIELD_LEN + AID_FIELD_LEN);
  1806. if (i2IELen <= 0)
  1807. break;
  1808. prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
  1809. prJoinInfo = &(prP2pFsmInfo->rJoinInfo);
  1810. prJoinInfo->u4BufLength = (UINT_32) i2IELen;
  1811. kalMemCopy(prJoinInfo->aucIEBuf, prAssocRspFrame->aucInfoElem, prJoinInfo->u4BufLength);
  1812. } while (FALSE);
  1813. } /* p2pFuncStoreAssocRspIEBuffer */
  1814. /*----------------------------------------------------------------------------*/
  1815. /*!
  1816. * \brief This routine is called to set Packet Filter.
  1817. *
  1818. * \param[in] prAdapter Pointer to the Adapter structure.
  1819. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  1820. * \param[in] u4SetBufferLen The length of the set buffer.
  1821. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  1822. * bytes read from the set buffer. If the call failed
  1823. * due to invalid length of the set buffer, returns
  1824. * the amount of storage needed.
  1825. *
  1826. * \retval WLAN_STATUS_SUCCESS
  1827. * \retval WLAN_STATUS_INVALID_LENGTH
  1828. * \retval WLAN_STATUS_NOT_SUPPORTED
  1829. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1830. */
  1831. /*----------------------------------------------------------------------------*/
  1832. VOID
  1833. p2pFuncMgmtFrameRegister(IN P_ADAPTER_T prAdapter,
  1834. IN UINT_16 u2FrameType, IN BOOLEAN fgIsRegistered, OUT PUINT_32 pu4P2pPacketFilter)
  1835. {
  1836. UINT_32 u4NewPacketFilter = 0;
  1837. DEBUGFUNC("p2pFuncMgmtFrameRegister");
  1838. do {
  1839. ASSERT_BREAK(prAdapter != NULL);
  1840. if (pu4P2pPacketFilter)
  1841. u4NewPacketFilter = *pu4P2pPacketFilter;
  1842. switch (u2FrameType) {
  1843. case MAC_FRAME_PROBE_REQ:
  1844. if (fgIsRegistered) {
  1845. u4NewPacketFilter |= PARAM_PACKET_FILTER_PROBE_REQ;
  1846. DBGLOG(P2P, TRACE, "Open packet filer probe request\n");
  1847. } else {
  1848. u4NewPacketFilter &= ~PARAM_PACKET_FILTER_PROBE_REQ;
  1849. DBGLOG(P2P, TRACE, "Close packet filer probe request\n");
  1850. }
  1851. break;
  1852. case MAC_FRAME_ACTION:
  1853. if (fgIsRegistered) {
  1854. u4NewPacketFilter |= PARAM_PACKET_FILTER_ACTION_FRAME;
  1855. DBGLOG(P2P, TRACE, "Open packet filer action frame.\n");
  1856. } else {
  1857. u4NewPacketFilter &= ~PARAM_PACKET_FILTER_ACTION_FRAME;
  1858. DBGLOG(P2P, TRACE, "Close packet filer action frame.\n");
  1859. }
  1860. break;
  1861. default:
  1862. DBGLOG(P2P, TRACE, "Ask frog to add code for mgmt:%x\n", u2FrameType);
  1863. break;
  1864. }
  1865. if (pu4P2pPacketFilter)
  1866. *pu4P2pPacketFilter = u4NewPacketFilter;
  1867. /* u4NewPacketFilter |= prAdapter->u4OsPacketFilter; */
  1868. prAdapter->u4OsPacketFilter &= ~PARAM_PACKET_FILTER_P2P_MASK;
  1869. prAdapter->u4OsPacketFilter |= u4NewPacketFilter;
  1870. DBGLOG(P2P, TRACE, "P2P Set PACKET filter:0x%x\n", prAdapter->u4OsPacketFilter);
  1871. wlanoidSetPacketFilter(prAdapter, prAdapter->u4OsPacketFilter,
  1872. FALSE, &u4NewPacketFilter, sizeof(u4NewPacketFilter));
  1873. } while (FALSE);
  1874. } /* p2pFuncMgmtFrameRegister */
  1875. VOID p2pFuncUpdateMgmtFrameRegister(IN P_ADAPTER_T prAdapter, IN UINT_32 u4OsFilter)
  1876. {
  1877. do {
  1878. prAdapter->rWifiVar.prP2pFsmInfo->u4P2pPacketFilter = u4OsFilter;
  1879. if ((prAdapter->u4OsPacketFilter & PARAM_PACKET_FILTER_P2P_MASK) ^ u4OsFilter) {
  1880. prAdapter->u4OsPacketFilter &= ~PARAM_PACKET_FILTER_P2P_MASK;
  1881. prAdapter->u4OsPacketFilter |= (u4OsFilter & PARAM_PACKET_FILTER_P2P_MASK);
  1882. wlanoidSetPacketFilter(prAdapter, prAdapter->u4OsPacketFilter,
  1883. FALSE, &u4OsFilter, sizeof(u4OsFilter));
  1884. DBGLOG(P2P, TRACE, "P2P Set PACKET filter:0x%x\n", prAdapter->u4OsPacketFilter);
  1885. }
  1886. } while (FALSE);
  1887. } /* p2pFuncUpdateMgmtFrameRegister */
  1888. VOID p2pFuncGetStationInfo(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucMacAddr, OUT P_P2P_STATION_INFO_T prStaInfo)
  1889. {
  1890. do {
  1891. ASSERT_BREAK((prAdapter != NULL) && (pucMacAddr != NULL) && (prStaInfo != NULL));
  1892. prStaInfo->u4InactiveTime = 0;
  1893. prStaInfo->u4RxBytes = 0;
  1894. prStaInfo->u4TxBytes = 0;
  1895. prStaInfo->u4RxPackets = 0;
  1896. prStaInfo->u4TxPackets = 0;
  1897. /* TODO: */
  1898. } while (FALSE);
  1899. } /* p2pFuncGetStationInfo */
  1900. BOOLEAN
  1901. p2pFuncGetAttriList(IN P_ADAPTER_T prAdapter,
  1902. IN UINT_8 ucOuiType,
  1903. IN PUINT_8 pucIE, IN UINT_16 u2IELength, OUT PPUINT_8 ppucAttriList, OUT PUINT_16 pu2AttriListLen)
  1904. {
  1905. BOOLEAN fgIsAllocMem = FALSE;
  1906. UINT_8 aucWfaOui[] = VENDOR_OUI_WFA_SPECIFIC;
  1907. UINT_16 u2Offset = 0;
  1908. P_IE_P2P_T prIe = (P_IE_P2P_T) NULL;
  1909. PUINT_8 pucAttriListStart = (PUINT_8) NULL;
  1910. UINT_16 u2AttriListLen = 0, u2BufferSize = 0;
  1911. BOOLEAN fgBackupAttributes = FALSE;
  1912. UINT_16 u2CopyLen;
  1913. ASSERT(prAdapter);
  1914. ASSERT(pucIE);
  1915. ASSERT(ppucAttriList);
  1916. ASSERT(pu2AttriListLen);
  1917. if (ppucAttriList)
  1918. *ppucAttriList = NULL;
  1919. if (pu2AttriListLen)
  1920. *pu2AttriListLen = 0;
  1921. if (ucOuiType == VENDOR_OUI_TYPE_WPS) {
  1922. aucWfaOui[0] = 0x00;
  1923. aucWfaOui[1] = 0x50;
  1924. aucWfaOui[2] = 0xF2;
  1925. } else if ((ucOuiType != VENDOR_OUI_TYPE_P2P)
  1926. #if CFG_SUPPORT_WFD
  1927. && (ucOuiType != VENDOR_OUI_TYPE_WFD)
  1928. #endif
  1929. ) {
  1930. DBGLOG(P2P, INFO, "Not supported OUI Type to parsing 0x%x\n", ucOuiType);
  1931. return fgIsAllocMem;
  1932. }
  1933. IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
  1934. if (ELEM_ID_VENDOR != IE_ID(pucIE))
  1935. continue;
  1936. prIe = (P_IE_P2P_T) pucIE;
  1937. if (prIe->ucLength <= P2P_OUI_TYPE_LEN)
  1938. continue;
  1939. if ((prIe->aucOui[0] == aucWfaOui[0]) &&
  1940. (prIe->aucOui[1] == aucWfaOui[1]) &&
  1941. (prIe->aucOui[2] == aucWfaOui[2]) && (ucOuiType == prIe->ucOuiType)) {
  1942. if (!pucAttriListStart) {
  1943. pucAttriListStart = &prIe->aucP2PAttributes[0];
  1944. if (prIe->ucLength > P2P_OUI_TYPE_LEN)
  1945. u2AttriListLen = (UINT_16) (prIe->ucLength - P2P_OUI_TYPE_LEN);
  1946. else
  1947. ASSERT(FALSE);
  1948. continue;
  1949. }
  1950. /* More than 2 attributes. */
  1951. if (FALSE == fgBackupAttributes) {
  1952. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo =
  1953. prAdapter->rWifiVar.prP2pSpecificBssInfo;
  1954. fgBackupAttributes = TRUE;
  1955. if (ucOuiType == VENDOR_OUI_TYPE_P2P) {
  1956. kalMemCopy(&prP2pSpecificBssInfo->aucAttributesCache[0],
  1957. pucAttriListStart, u2AttriListLen);
  1958. pucAttriListStart =
  1959. &prP2pSpecificBssInfo->aucAttributesCache[0];
  1960. u2BufferSize = P2P_MAXIMUM_ATTRIBUTE_LEN;
  1961. } else if (ucOuiType == VENDOR_OUI_TYPE_WPS) {
  1962. kalMemCopy(&prP2pSpecificBssInfo->aucWscAttributesCache
  1963. [0], pucAttriListStart, u2AttriListLen);
  1964. pucAttriListStart =
  1965. &prP2pSpecificBssInfo->aucWscAttributesCache[0];
  1966. u2BufferSize = WPS_MAXIMUM_ATTRIBUTES_CACHE_SIZE;
  1967. }
  1968. #if CFG_SUPPORT_WFD
  1969. else if (ucOuiType == VENDOR_OUI_TYPE_WFD) {
  1970. PUINT_8 pucTmpBuf = (PUINT_8) NULL;
  1971. pucTmpBuf = (PUINT_8)
  1972. kalMemAlloc(WPS_MAXIMUM_ATTRIBUTES_CACHE_SIZE,
  1973. VIR_MEM_TYPE);
  1974. if (pucTmpBuf != NULL) {
  1975. fgIsAllocMem = TRUE;
  1976. } else {
  1977. /* Can't alloca memory for WFD IE relocate. */
  1978. ASSERT(FALSE);
  1979. break;
  1980. }
  1981. kalMemCopy(pucTmpBuf,
  1982. pucAttriListStart, u2AttriListLen);
  1983. pucAttriListStart = pucTmpBuf;
  1984. u2BufferSize = WPS_MAXIMUM_ATTRIBUTES_CACHE_SIZE;
  1985. }
  1986. #endif
  1987. else
  1988. fgBackupAttributes = FALSE;
  1989. }
  1990. u2CopyLen = (UINT_16) (prIe->ucLength - P2P_OUI_TYPE_LEN);
  1991. if ((u2AttriListLen + u2CopyLen) > u2BufferSize) {
  1992. u2CopyLen = u2BufferSize - u2AttriListLen;
  1993. DBGLOG(P2P, WARN,
  1994. "Length of received P2P attributes > maximum cache size.\n");
  1995. }
  1996. if (u2CopyLen) {
  1997. kalMemCopy((PUINT_8)
  1998. ((ULONG) pucAttriListStart +
  1999. (UINT_32) u2AttriListLen),
  2000. &prIe->aucP2PAttributes[0], u2CopyLen);
  2001. u2AttriListLen += u2CopyLen;
  2002. }
  2003. } /* prIe->aucOui */
  2004. } /* IE_FOR_EACH */
  2005. if (pucAttriListStart) {
  2006. PUINT_8 pucAttribute = pucAttriListStart;
  2007. DBGLOG(P2P, LOUD, "Checking Attribute Length.\n");
  2008. if (ucOuiType == VENDOR_OUI_TYPE_P2P) {
  2009. P2P_ATTRI_FOR_EACH(pucAttribute, u2AttriListLen, u2Offset);
  2010. } else if (ucOuiType == VENDOR_OUI_TYPE_WFD) {
  2011. /* Do nothing */
  2012. } else if (ucOuiType == VENDOR_OUI_TYPE_WPS) {
  2013. /* Big Endian: WSC, WFD. */
  2014. WSC_ATTRI_FOR_EACH(pucAttribute, u2AttriListLen, u2Offset) {
  2015. DBGLOG(P2P, LOUD, "Attribute ID:%d, Length:%d.\n",
  2016. WSC_ATTRI_ID(pucAttribute), WSC_ATTRI_LEN(pucAttribute));
  2017. }
  2018. } else {
  2019. }
  2020. ASSERT(u2Offset == u2AttriListLen);
  2021. if (ppucAttriList)
  2022. *ppucAttriList = pucAttriListStart;
  2023. if (pu2AttriListLen)
  2024. *pu2AttriListLen = u2AttriListLen;
  2025. } else {
  2026. if (ppucAttriList)
  2027. *ppucAttriList = (PUINT_8) NULL;
  2028. if (pu2AttriListLen)
  2029. *pu2AttriListLen = 0;
  2030. }
  2031. return fgIsAllocMem;
  2032. } /* p2pFuncGetAttriList */
  2033. P_MSDU_INFO_T p2pFuncProcessP2pProbeRsp(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMgmtTxMsdu)
  2034. {
  2035. P_MSDU_INFO_T prRetMsduInfo = prMgmtTxMsdu;
  2036. P_WLAN_PROBE_RSP_FRAME_T prProbeRspFrame = (P_WLAN_PROBE_RSP_FRAME_T) NULL;
  2037. PUINT_8 pucIEBuf = (PUINT_8) NULL;
  2038. UINT_16 u2Offset = 0, u2IELength = 0, u2ProbeRspHdrLen = 0;
  2039. BOOLEAN fgIsP2PIE = FALSE, fgIsWSCIE = FALSE;
  2040. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  2041. UINT_16 u2EstimateSize = 0, u2EstimatedExtraIELen = 0;
  2042. UINT_32 u4IeArraySize = 0, u4Idx = 0;
  2043. UINT_8 ucOuiType = 0;
  2044. UINT_16 u2SubTypeVersion = 0;
  2045. BOOLEAN fgIsPureAP = prAdapter->rWifiVar.prP2pFsmInfo->fgIsApMode;
  2046. do {
  2047. ASSERT_BREAK((prAdapter != NULL) && (prMgmtTxMsdu != NULL));
  2048. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  2049. /* 3 Make sure this is probe response frame. */
  2050. prProbeRspFrame = (P_WLAN_PROBE_RSP_FRAME_T) ((ULONG) prMgmtTxMsdu->prPacket + MAC_TX_RESERVED_FIELD);
  2051. ASSERT_BREAK((prProbeRspFrame->u2FrameCtrl & MASK_FRAME_TYPE) == MAC_FRAME_PROBE_RSP);
  2052. if (prP2pBssInfo->u2BeaconInterval)
  2053. prProbeRspFrame->u2BeaconInterval = prP2pBssInfo->u2BeaconInterval;
  2054. /* 3 Get the importent P2P IE. */
  2055. u2ProbeRspHdrLen =
  2056. (WLAN_MAC_MGMT_HEADER_LEN + TIMESTAMP_FIELD_LEN + BEACON_INTERVAL_FIELD_LEN + CAP_INFO_FIELD_LEN);
  2057. pucIEBuf = prProbeRspFrame->aucInfoElem;
  2058. u2IELength = prMgmtTxMsdu->u2FrameLength - u2ProbeRspHdrLen;
  2059. #if CFG_SUPPORT_WFD
  2060. prAdapter->prGlueInfo->prP2PInfo->u2VenderIELen = 0;
  2061. #endif
  2062. IE_FOR_EACH(pucIEBuf, u2IELength, u2Offset) {
  2063. switch (IE_ID(pucIEBuf)) {
  2064. case ELEM_ID_SSID:
  2065. {
  2066. COPY_SSID(prP2pBssInfo->aucSSID,
  2067. prP2pBssInfo->ucSSIDLen,
  2068. SSID_IE(pucIEBuf)->aucSSID, SSID_IE(pucIEBuf)->ucLength);
  2069. }
  2070. break;
  2071. case ELEM_ID_VENDOR:
  2072. #if !CFG_SUPPORT_WFD
  2073. if (rsnParseCheckForWFAInfoElem(prAdapter, pucIEBuf, &ucOuiType, &u2SubTypeVersion)) {
  2074. if (ucOuiType == VENDOR_OUI_TYPE_WPS) {
  2075. kalP2PUpdateWSC_IE(prAdapter->prGlueInfo, 2, pucIEBuf,
  2076. IE_SIZE(pucIEBuf));
  2077. fgIsWSCIE = TRUE;
  2078. }
  2079. } else if (p2pFuncParseCheckForP2PInfoElem(prAdapter, pucIEBuf, &ucOuiType)) {
  2080. if (ucOuiType == VENDOR_OUI_TYPE_P2P) {
  2081. /* 2 Note(frog): I use WSC IE buffer for Probe Request to
  2082. * store the P2P IE for Probe Response. */
  2083. kalP2PUpdateWSC_IE(prAdapter->prGlueInfo, 1, pucIEBuf,
  2084. IE_SIZE(pucIEBuf));
  2085. fgIsP2PIE = TRUE;
  2086. }
  2087. } else {
  2088. if ((prAdapter->prGlueInfo->prP2PInfo->u2VenderIELen +
  2089. IE_SIZE(pucIEBuf)) < 512) {
  2090. kalMemCopy(prAdapter->prGlueInfo->prP2PInfo->aucVenderIE,
  2091. pucIEBuf, IE_SIZE(pucIEBuf));
  2092. prAdapter->prGlueInfo->prP2PInfo->u2VenderIELen +=
  2093. IE_SIZE(pucIEBuf);
  2094. }
  2095. }
  2096. #else
  2097. /* Eddie May be WFD */
  2098. if (rsnParseCheckForWFAInfoElem
  2099. (prAdapter, pucIEBuf, &ucOuiType, &u2SubTypeVersion)) {
  2100. if (ucOuiType == VENDOR_OUI_TYPE_WMM)
  2101. break;
  2102. }
  2103. if ((prAdapter->prGlueInfo->prP2PInfo->u2VenderIELen + IE_SIZE(pucIEBuf)) <
  2104. 1024) {
  2105. kalMemCopy(prAdapter->prGlueInfo->prP2PInfo->aucVenderIE +
  2106. prAdapter->prGlueInfo->prP2PInfo->u2VenderIELen, pucIEBuf,
  2107. IE_SIZE(pucIEBuf));
  2108. prAdapter->prGlueInfo->prP2PInfo->u2VenderIELen += IE_SIZE(pucIEBuf);
  2109. }
  2110. #endif
  2111. break;
  2112. default:
  2113. break;
  2114. }
  2115. }
  2116. /* 3 Check the total size & current frame. */
  2117. u2EstimateSize = WLAN_MAC_MGMT_HEADER_LEN +
  2118. TIMESTAMP_FIELD_LEN +
  2119. BEACON_INTERVAL_FIELD_LEN +
  2120. CAP_INFO_FIELD_LEN +
  2121. (ELEM_HDR_LEN + ELEM_MAX_LEN_SSID) +
  2122. (ELEM_HDR_LEN + ELEM_MAX_LEN_SUP_RATES) + (ELEM_HDR_LEN + ELEM_MAX_LEN_DS_PARAMETER_SET);
  2123. u2EstimatedExtraIELen = 0;
  2124. u4IeArraySize = sizeof(txProbeRspIETable) / sizeof(APPEND_VAR_IE_ENTRY_T);
  2125. for (u4Idx = 0; u4Idx < u4IeArraySize; u4Idx++) {
  2126. if (txProbeRspIETable[u4Idx].u2EstimatedFixedIELen) {
  2127. u2EstimatedExtraIELen += txProbeRspIETable[u4Idx].u2EstimatedFixedIELen;
  2128. }
  2129. else {
  2130. ASSERT(txProbeRspIETable[u4Idx].pfnCalculateVariableIELen);
  2131. u2EstimatedExtraIELen +=
  2132. (UINT_16) (txProbeRspIETable[u4Idx].pfnCalculateVariableIELen
  2133. (prAdapter, NETWORK_TYPE_P2P_INDEX, NULL));
  2134. }
  2135. }
  2136. if (fgIsWSCIE)
  2137. u2EstimatedExtraIELen += kalP2PCalWSC_IELen(prAdapter->prGlueInfo, 2);
  2138. if (fgIsP2PIE) {
  2139. u2EstimatedExtraIELen += kalP2PCalWSC_IELen(prAdapter->prGlueInfo, 1);
  2140. u2EstimatedExtraIELen += p2pFuncCalculateP2P_IE_NoA(prAdapter, 0, NULL);
  2141. }
  2142. #if CFG_SUPPORT_WFD
  2143. u2EstimatedExtraIELen += prAdapter->prGlueInfo->prP2PInfo->u2VenderIELen;
  2144. #endif
  2145. u2EstimateSize += u2EstimatedExtraIELen;
  2146. if (u2EstimateSize > (prRetMsduInfo->u2FrameLength)) {
  2147. prRetMsduInfo = cnmMgtPktAlloc(prAdapter, u2EstimateSize);
  2148. if (prRetMsduInfo == NULL) {
  2149. DBGLOG(P2P, WARN, "No packet for sending new probe response, use original one\n");
  2150. prRetMsduInfo = prMgmtTxMsdu;
  2151. break;
  2152. }
  2153. prRetMsduInfo->ucNetworkType = NETWORK_TYPE_P2P_INDEX;
  2154. }
  2155. /* 3 Compose / Re-compose probe response frame. */
  2156. bssComposeBeaconProbeRespFrameHeaderAndFF((PUINT_8)
  2157. ((ULONG) (prRetMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD),
  2158. prProbeRspFrame->aucDestAddr, prProbeRspFrame->aucSrcAddr,
  2159. prProbeRspFrame->aucBSSID, prProbeRspFrame->u2BeaconInterval,
  2160. fgIsPureAP ? prP2pBssInfo->
  2161. u2CapInfo : prProbeRspFrame->u2CapInfo);
  2162. prRetMsduInfo->u2FrameLength =
  2163. (WLAN_MAC_MGMT_HEADER_LEN + TIMESTAMP_FIELD_LEN + BEACON_INTERVAL_FIELD_LEN + CAP_INFO_FIELD_LEN);
  2164. bssBuildBeaconProbeRespFrameCommonIEs(prRetMsduInfo, prP2pBssInfo, prProbeRspFrame->aucDestAddr);
  2165. for (u4Idx = 0; u4Idx < u4IeArraySize; u4Idx++) {
  2166. if (txProbeRspIETable[u4Idx].pfnAppendIE)
  2167. txProbeRspIETable[u4Idx].pfnAppendIE(prAdapter, prRetMsduInfo);
  2168. }
  2169. if (fgIsWSCIE) {
  2170. kalP2PGenWSC_IE(prAdapter->prGlueInfo,
  2171. 2,
  2172. (PUINT_8) ((ULONG) prRetMsduInfo->prPacket +
  2173. (UINT_32) prRetMsduInfo->u2FrameLength));
  2174. prRetMsduInfo->u2FrameLength += (UINT_16) kalP2PCalWSC_IELen(prAdapter->prGlueInfo, 2);
  2175. }
  2176. if (fgIsP2PIE) {
  2177. kalP2PGenWSC_IE(prAdapter->prGlueInfo,
  2178. 1,
  2179. (PUINT_8) ((ULONG) prRetMsduInfo->prPacket +
  2180. (UINT_32) prRetMsduInfo->u2FrameLength));
  2181. prRetMsduInfo->u2FrameLength += (UINT_16) kalP2PCalWSC_IELen(prAdapter->prGlueInfo, 1);
  2182. p2pFuncGenerateP2P_IE_NoA(prAdapter, prRetMsduInfo);
  2183. }
  2184. #if CFG_SUPPORT_WFD
  2185. if (prAdapter->prGlueInfo->prP2PInfo->u2VenderIELen > 0) {
  2186. kalMemCopy((PUINT_8) ((ULONG) prRetMsduInfo->prPacket + (UINT_32) prRetMsduInfo->u2FrameLength),
  2187. prAdapter->prGlueInfo->prP2PInfo->aucVenderIE,
  2188. prAdapter->prGlueInfo->prP2PInfo->u2VenderIELen);
  2189. prRetMsduInfo->u2FrameLength += (UINT_16) prAdapter->prGlueInfo->prP2PInfo->u2VenderIELen;
  2190. }
  2191. #endif
  2192. } while (FALSE);
  2193. if (prRetMsduInfo != prMgmtTxMsdu)
  2194. cnmMgtPktFree(prAdapter, prMgmtTxMsdu);
  2195. return prRetMsduInfo;
  2196. } /* p2pFuncProcessP2pProbeRsp */
  2197. #if 0 /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) */
  2198. UINT_32
  2199. p2pFuncCalculateExtra_IELenForBeacon(IN P_ADAPTER_T prAdapter,
  2200. IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex, IN P_STA_RECORD_T prStaRec)
  2201. {
  2202. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpeBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  2203. UINT_32 u4IELen = 0;
  2204. do {
  2205. ASSERT_BREAK((prAdapter != NULL) && (eNetTypeIndex == NETWORK_TYPE_P2P_INDEX));
  2206. if (p2pFuncIsAPMode(prAdapter->rWifiVar.prP2pFsmInfo))
  2207. break;
  2208. prP2pSpeBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  2209. u4IELen = prP2pSpeBssInfo->u2IELenForBCN;
  2210. } while (FALSE);
  2211. return u4IELen;
  2212. } /* p2pFuncCalculateP2p_IELenForBeacon */
  2213. VOID p2pFuncGenerateExtra_IEForBeacon(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
  2214. {
  2215. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpeBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  2216. PUINT_8 pucIEBuf = (PUINT_8) NULL;
  2217. do {
  2218. ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
  2219. prP2pSpeBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  2220. if (p2pFuncIsAPMode(prAdapter->rWifiVar.prP2pFsmInfo))
  2221. break;
  2222. pucIEBuf = (PUINT_8) ((UINT_32) prMsduInfo->prPacket + (UINT_32) prMsduInfo->u2FrameLength);
  2223. kalMemCopy(pucIEBuf, prP2pSpeBssInfo->aucBeaconIECache, prP2pSpeBssInfo->u2IELenForBCN);
  2224. prMsduInfo->u2FrameLength += prP2pSpeBssInfo->u2IELenForBCN;
  2225. } while (FALSE);
  2226. } /* p2pFuncGenerateExtra_IEForBeacon */
  2227. #else
  2228. UINT_32
  2229. p2pFuncCalculateP2p_IELenForBeacon(IN P_ADAPTER_T prAdapter,
  2230. IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex, IN P_STA_RECORD_T prStaRec)
  2231. {
  2232. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpeBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  2233. UINT_32 u4IELen = 0;
  2234. do {
  2235. ASSERT_BREAK((prAdapter != NULL) && (eNetTypeIndex == NETWORK_TYPE_P2P_INDEX));
  2236. if (!prAdapter->fgIsP2PRegistered)
  2237. break;
  2238. if (p2pFuncIsAPMode(prAdapter->rWifiVar.prP2pFsmInfo))
  2239. break;
  2240. prP2pSpeBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  2241. u4IELen = prP2pSpeBssInfo->u2AttributeLen;
  2242. } while (FALSE);
  2243. return u4IELen;
  2244. } /* p2pFuncCalculateP2p_IELenForBeacon */
  2245. VOID p2pFuncGenerateP2p_IEForBeacon(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
  2246. {
  2247. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpeBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  2248. PUINT_8 pucIEBuf = (PUINT_8) NULL;
  2249. do {
  2250. ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
  2251. if (!prAdapter->fgIsP2PRegistered)
  2252. break;
  2253. prP2pSpeBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  2254. if (p2pFuncIsAPMode(prAdapter->rWifiVar.prP2pFsmInfo))
  2255. break;
  2256. pucIEBuf = (PUINT_8) ((ULONG) prMsduInfo->prPacket + (UINT_32) prMsduInfo->u2FrameLength);
  2257. kalMemCopy(pucIEBuf, prP2pSpeBssInfo->aucAttributesCache, prP2pSpeBssInfo->u2AttributeLen);
  2258. prMsduInfo->u2FrameLength += prP2pSpeBssInfo->u2AttributeLen;
  2259. } while (FALSE);
  2260. } /* p2pFuncGenerateP2p_IEForBeacon */
  2261. UINT_32
  2262. p2pFuncCalculateWSC_IELenForBeacon(IN P_ADAPTER_T prAdapter,
  2263. IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex, IN P_STA_RECORD_T prStaRec)
  2264. {
  2265. if (eNetTypeIndex != NETWORK_TYPE_P2P_INDEX)
  2266. return 0;
  2267. return kalP2PCalWSC_IELen(prAdapter->prGlueInfo, 0);
  2268. } /* p2pFuncCalculateP2p_IELenForBeacon */
  2269. VOID p2pFuncGenerateWSC_IEForBeacon(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
  2270. {
  2271. PUINT_8 pucBuffer;
  2272. UINT_16 u2IELen = 0;
  2273. ASSERT(prAdapter);
  2274. ASSERT(prMsduInfo);
  2275. if (prMsduInfo->ucNetworkType != NETWORK_TYPE_P2P_INDEX)
  2276. return;
  2277. u2IELen = (UINT_16) kalP2PCalWSC_IELen(prAdapter->prGlueInfo, 0);
  2278. pucBuffer = (PUINT_8) ((ULONG) prMsduInfo->prPacket + (UINT_32) prMsduInfo->u2FrameLength);
  2279. ASSERT(pucBuffer);
  2280. /* TODO: Check P2P FSM State. */
  2281. kalP2PGenWSC_IE(prAdapter->prGlueInfo, 0, pucBuffer);
  2282. prMsduInfo->u2FrameLength += u2IELen;
  2283. } /* p2pFuncGenerateP2p_IEForBeacon */
  2284. #endif
  2285. /*----------------------------------------------------------------------------*/
  2286. /*!
  2287. * @brief This function is used to calculate P2P IE length for Beacon frame.
  2288. *
  2289. * @param[in] eNetTypeIndex Specify which network
  2290. * @param[in] prStaRec Pointer to the STA_RECORD_T
  2291. *
  2292. * @return The length of P2P IE added
  2293. */
  2294. /*----------------------------------------------------------------------------*/
  2295. UINT_32
  2296. p2pFuncCalculateP2p_IELenForAssocRsp(IN P_ADAPTER_T prAdapter,
  2297. IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex, IN P_STA_RECORD_T prStaRec)
  2298. {
  2299. if (eNetTypeIndex != NETWORK_TYPE_P2P_INDEX)
  2300. return 0;
  2301. return p2pFuncCalculateP2P_IELen(prAdapter,
  2302. eNetTypeIndex,
  2303. prStaRec,
  2304. txAssocRspAttributesTable,
  2305. sizeof(txAssocRspAttributesTable) / sizeof(APPEND_VAR_ATTRI_ENTRY_T));
  2306. } /* p2pFuncCalculateP2p_IELenForAssocRsp */
  2307. /*----------------------------------------------------------------------------*/
  2308. /*!
  2309. * @brief This function is used to generate P2P IE for Beacon frame.
  2310. *
  2311. * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
  2312. *
  2313. * @return none
  2314. */
  2315. /*----------------------------------------------------------------------------*/
  2316. VOID p2pFuncGenerateP2p_IEForAssocRsp(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
  2317. {
  2318. P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
  2319. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  2320. do {
  2321. ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
  2322. prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
  2323. prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
  2324. if (!prStaRec)
  2325. break;
  2326. if (IS_STA_P2P_TYPE(prStaRec)) {
  2327. DBGLOG(P2P, TRACE, "Generate NULL P2P IE for Assoc Rsp.\n");
  2328. p2pFuncGenerateP2P_IE(prAdapter,
  2329. TRUE,
  2330. &prMsduInfo->u2FrameLength,
  2331. prMsduInfo->prPacket,
  2332. 1500,
  2333. txAssocRspAttributesTable,
  2334. sizeof(txAssocRspAttributesTable) / sizeof(APPEND_VAR_ATTRI_ENTRY_T));
  2335. } else {
  2336. DBGLOG(P2P, TRACE, "Legacy device, no P2P IE.\n");
  2337. }
  2338. } while (FALSE);
  2339. return;
  2340. } /* p2pFuncGenerateP2p_IEForAssocRsp */
  2341. UINT_32
  2342. p2pFuncCalculateWSC_IELenForAssocRsp(IN P_ADAPTER_T prAdapter,
  2343. IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex, IN P_STA_RECORD_T prStaRec)
  2344. {
  2345. DBGLOG(P2P, TRACE, "p2pFuncCalculateWSC_IELenForAssocRsp\n");
  2346. if (eNetTypeIndex != NETWORK_TYPE_P2P_INDEX)
  2347. return 0;
  2348. return kalP2PCalWSC_IELen(prAdapter->prGlueInfo, 0);
  2349. } /* p2pFuncCalculateP2p_IELenForAssocRsp */
  2350. VOID p2pFuncGenerateWSC_IEForAssocRsp(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
  2351. {
  2352. PUINT_8 pucBuffer;
  2353. UINT_16 u2IELen = 0;
  2354. ASSERT(prAdapter);
  2355. ASSERT(prMsduInfo);
  2356. if (prMsduInfo->ucNetworkType != NETWORK_TYPE_P2P_INDEX)
  2357. return;
  2358. DBGLOG(P2P, TRACE, "p2pFuncGenerateWSC_IEForAssocRsp\n");
  2359. u2IELen = (UINT_16) kalP2PCalWSC_IELen(prAdapter->prGlueInfo, 0);
  2360. pucBuffer = (PUINT_8) ((ULONG) prMsduInfo->prPacket + (UINT_32) prMsduInfo->u2FrameLength);
  2361. ASSERT(pucBuffer);
  2362. /* TODO: Check P2P FSM State. */
  2363. kalP2PGenWSC_IE(prAdapter->prGlueInfo, 0, pucBuffer);
  2364. prMsduInfo->u2FrameLength += u2IELen;
  2365. }
  2366. /* p2pFuncGenerateP2p_IEForAssocRsp */
  2367. UINT_32
  2368. p2pFuncCalculateP2P_IELen(IN P_ADAPTER_T prAdapter,
  2369. IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex,
  2370. IN P_STA_RECORD_T prStaRec,
  2371. IN APPEND_VAR_ATTRI_ENTRY_T arAppendAttriTable[], IN UINT_32 u4AttriTableSize)
  2372. {
  2373. UINT_32 u4OverallAttriLen, u4Dummy;
  2374. UINT_16 u2EstimatedFixedAttriLen;
  2375. UINT_32 i;
  2376. /* Overall length of all Attributes */
  2377. u4OverallAttriLen = 0;
  2378. for (i = 0; i < u4AttriTableSize; i++) {
  2379. u2EstimatedFixedAttriLen = arAppendAttriTable[i].u2EstimatedFixedAttriLen;
  2380. if (u2EstimatedFixedAttriLen) {
  2381. u4OverallAttriLen += u2EstimatedFixedAttriLen;
  2382. } else {
  2383. ASSERT(arAppendAttriTable[i].pfnCalculateVariableAttriLen);
  2384. u4OverallAttriLen += arAppendAttriTable[i].pfnCalculateVariableAttriLen(prAdapter, prStaRec);
  2385. }
  2386. }
  2387. u4Dummy = u4OverallAttriLen;
  2388. u4OverallAttriLen += P2P_IE_OUI_HDR;
  2389. for (; (u4Dummy > P2P_MAXIMUM_ATTRIBUTE_LEN);) {
  2390. u4OverallAttriLen += P2P_IE_OUI_HDR;
  2391. u4Dummy -= P2P_MAXIMUM_ATTRIBUTE_LEN;
  2392. }
  2393. return u4OverallAttriLen;
  2394. } /* p2pFuncCalculateP2P_IELen */
  2395. VOID
  2396. p2pFuncGenerateP2P_IE(IN P_ADAPTER_T prAdapter,
  2397. IN BOOLEAN fgIsAssocFrame,
  2398. IN PUINT_16 pu2Offset,
  2399. IN PUINT_8 pucBuf,
  2400. IN UINT_16 u2BufSize,
  2401. IN APPEND_VAR_ATTRI_ENTRY_T arAppendAttriTable[], IN UINT_32 u4AttriTableSize)
  2402. {
  2403. PUINT_8 pucBuffer = (PUINT_8) NULL;
  2404. P_IE_P2P_T prIeP2P = (P_IE_P2P_T) NULL;
  2405. UINT_32 u4OverallAttriLen;
  2406. UINT_32 u4AttriLen;
  2407. UINT_8 aucWfaOui[] = VENDOR_OUI_WFA_SPECIFIC;
  2408. UINT_8 aucTempBuffer[P2P_MAXIMUM_ATTRIBUTE_LEN];
  2409. UINT_32 i;
  2410. do {
  2411. ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL));
  2412. pucBuffer = (PUINT_8) ((ULONG) pucBuf + (*pu2Offset));
  2413. ASSERT_BREAK(pucBuffer != NULL);
  2414. /* Check buffer length is still enough. */
  2415. ASSERT_BREAK((u2BufSize - (*pu2Offset)) >= P2P_IE_OUI_HDR);
  2416. prIeP2P = (P_IE_P2P_T) pucBuffer;
  2417. prIeP2P->ucId = ELEM_ID_P2P;
  2418. prIeP2P->aucOui[0] = aucWfaOui[0];
  2419. prIeP2P->aucOui[1] = aucWfaOui[1];
  2420. prIeP2P->aucOui[2] = aucWfaOui[2];
  2421. prIeP2P->ucOuiType = VENDOR_OUI_TYPE_P2P;
  2422. (*pu2Offset) += P2P_IE_OUI_HDR;
  2423. /* Overall length of all Attributes */
  2424. u4OverallAttriLen = 0;
  2425. for (i = 0; i < u4AttriTableSize; i++) {
  2426. if (arAppendAttriTable[i].pfnAppendAttri) {
  2427. u4AttriLen =
  2428. arAppendAttriTable[i].pfnAppendAttri(prAdapter, fgIsAssocFrame, pu2Offset, pucBuf,
  2429. u2BufSize);
  2430. u4OverallAttriLen += u4AttriLen;
  2431. if (u4OverallAttriLen > P2P_MAXIMUM_ATTRIBUTE_LEN) {
  2432. u4OverallAttriLen -= P2P_MAXIMUM_ATTRIBUTE_LEN;
  2433. prIeP2P->ucLength = (VENDOR_OUI_TYPE_LEN + P2P_MAXIMUM_ATTRIBUTE_LEN);
  2434. pucBuffer =
  2435. (PUINT_8) ((ULONG) prIeP2P +
  2436. (VENDOR_OUI_TYPE_LEN + P2P_MAXIMUM_ATTRIBUTE_LEN));
  2437. prIeP2P = (P_IE_P2P_T) ((ULONG) prIeP2P +
  2438. (ELEM_HDR_LEN +
  2439. (VENDOR_OUI_TYPE_LEN + P2P_MAXIMUM_ATTRIBUTE_LEN)));
  2440. kalMemCopy(aucTempBuffer, pucBuffer, u4OverallAttriLen);
  2441. prIeP2P->ucId = ELEM_ID_P2P;
  2442. prIeP2P->aucOui[0] = aucWfaOui[0];
  2443. prIeP2P->aucOui[1] = aucWfaOui[1];
  2444. prIeP2P->aucOui[2] = aucWfaOui[2];
  2445. prIeP2P->ucOuiType = VENDOR_OUI_TYPE_P2P;
  2446. kalMemCopy(prIeP2P->aucP2PAttributes, aucTempBuffer, u4OverallAttriLen);
  2447. (*pu2Offset) += P2P_IE_OUI_HDR;
  2448. }
  2449. }
  2450. }
  2451. prIeP2P->ucLength = (UINT_8) (VENDOR_OUI_TYPE_LEN + u4OverallAttriLen);
  2452. } while (FALSE);
  2453. } /* p2pFuncGenerateP2P_IE */
  2454. UINT_32
  2455. p2pFuncAppendAttriStatusForAssocRsp(IN P_ADAPTER_T prAdapter,
  2456. IN BOOLEAN fgIsAssocFrame,
  2457. IN PUINT_16 pu2Offset, IN PUINT_8 pucBuf, IN UINT_16 u2BufSize)
  2458. {
  2459. PUINT_8 pucBuffer;
  2460. P_P2P_ATTRI_STATUS_T prAttriStatus;
  2461. P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL;
  2462. UINT_32 u4AttriLen = 0;
  2463. ASSERT(prAdapter);
  2464. ASSERT(pucBuf);
  2465. prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
  2466. if (fgIsAssocFrame)
  2467. return u4AttriLen;
  2468. /* TODO: For assoc request P2P IE check in driver & return status in P2P IE. */
  2469. pucBuffer = (PUINT_8) ((ULONG) pucBuf + (UINT_32) (*pu2Offset));
  2470. ASSERT(pucBuffer);
  2471. prAttriStatus = (P_P2P_ATTRI_STATUS_T) pucBuffer;
  2472. ASSERT(u2BufSize >= ((*pu2Offset) + (UINT_16) u4AttriLen));
  2473. prAttriStatus->ucId = P2P_ATTRI_ID_STATUS;
  2474. WLAN_SET_FIELD_16(&prAttriStatus->u2Length, P2P_ATTRI_MAX_LEN_STATUS);
  2475. prAttriStatus->ucStatusCode = P2P_STATUS_FAIL_PREVIOUS_PROTOCOL_ERR;
  2476. u4AttriLen = (P2P_ATTRI_HDR_LEN + P2P_ATTRI_MAX_LEN_STATUS);
  2477. (*pu2Offset) += (UINT_16) u4AttriLen;
  2478. return u4AttriLen;
  2479. } /* p2pFuncAppendAttriStatusForAssocRsp */
  2480. UINT_32
  2481. p2pFuncAppendAttriExtListenTiming(IN P_ADAPTER_T prAdapter,
  2482. IN BOOLEAN fgIsAssocFrame,
  2483. IN PUINT_16 pu2Offset, IN PUINT_8 pucBuf, IN UINT_16 u2BufSize)
  2484. {
  2485. UINT_32 u4AttriLen = 0;
  2486. P_P2P_ATTRI_EXT_LISTEN_TIMING_T prP2pExtListenTiming = (P_P2P_ATTRI_EXT_LISTEN_TIMING_T) NULL;
  2487. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  2488. PUINT_8 pucBuffer = NULL;
  2489. ASSERT(prAdapter);
  2490. ASSERT(pucBuf);
  2491. if (fgIsAssocFrame)
  2492. return u4AttriLen;
  2493. /* TODO: For extend listen timing. */
  2494. prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  2495. u4AttriLen = (P2P_ATTRI_HDR_LEN + P2P_ATTRI_MAX_LEN_EXT_LISTEN_TIMING);
  2496. ASSERT(u2BufSize >= ((*pu2Offset) + (UINT_16) u4AttriLen));
  2497. pucBuffer = (PUINT_8) ((ULONG) pucBuf + (UINT_32) (*pu2Offset));
  2498. ASSERT(pucBuffer);
  2499. prP2pExtListenTiming = (P_P2P_ATTRI_EXT_LISTEN_TIMING_T) pucBuffer;
  2500. prP2pExtListenTiming->ucId = P2P_ATTRI_ID_EXT_LISTEN_TIMING;
  2501. WLAN_SET_FIELD_16(&prP2pExtListenTiming->u2Length, P2P_ATTRI_MAX_LEN_EXT_LISTEN_TIMING);
  2502. WLAN_SET_FIELD_16(&prP2pExtListenTiming->u2AvailInterval, prP2pSpecificBssInfo->u2AvailabilityInterval);
  2503. WLAN_SET_FIELD_16(&prP2pExtListenTiming->u2AvailPeriod, prP2pSpecificBssInfo->u2AvailabilityPeriod);
  2504. (*pu2Offset) += (UINT_16) u4AttriLen;
  2505. return u4AttriLen;
  2506. } /* p2pFuncAppendAttriExtListenTiming */
  2507. P_IE_HDR_T
  2508. p2pFuncGetSpecIE(IN P_ADAPTER_T prAdapter,
  2509. IN PUINT_8 pucIEBuf, IN UINT_16 u2BufferLen, IN UINT_8 ucElemID, IN PBOOLEAN pfgIsMore)
  2510. {
  2511. P_IE_HDR_T prTargetIE = (P_IE_HDR_T) NULL;
  2512. PUINT_8 pucIE = (PUINT_8) NULL;
  2513. UINT_16 u2Offset = 0;
  2514. if (pfgIsMore)
  2515. *pfgIsMore = FALSE;
  2516. do {
  2517. ASSERT_BREAK((prAdapter != NULL)
  2518. && (pucIEBuf != NULL));
  2519. pucIE = pucIEBuf;
  2520. IE_FOR_EACH(pucIE, u2BufferLen, u2Offset) {
  2521. if (IE_ID(pucIE) == ucElemID) {
  2522. if ((prTargetIE) && (pfgIsMore)) {
  2523. *pfgIsMore = TRUE;
  2524. break;
  2525. }
  2526. prTargetIE = (P_IE_HDR_T) pucIE;
  2527. if (pfgIsMore == NULL)
  2528. break;
  2529. }
  2530. }
  2531. } while (FALSE);
  2532. return prTargetIE;
  2533. } /* p2pFuncGetSpecIE */
  2534. P_ATTRIBUTE_HDR_T
  2535. p2pFuncGetSpecAttri(IN P_ADAPTER_T prAdapter,
  2536. IN UINT_8 ucOuiType, IN PUINT_8 pucIEBuf, IN UINT_16 u2BufferLen, IN UINT_16 u2AttriID)
  2537. {
  2538. P_IE_P2P_T prP2pIE = (P_IE_P2P_T) NULL;
  2539. P_ATTRIBUTE_HDR_T prTargetAttri = (P_ATTRIBUTE_HDR_T) NULL;
  2540. BOOLEAN fgIsMore = FALSE;
  2541. PUINT_8 pucIE = (PUINT_8) NULL, pucAttri = (PUINT_8) NULL;
  2542. UINT_16 u2OffsetAttri = 0;
  2543. UINT_16 u2BufferLenLeft = 0;
  2544. UINT_8 aucWfaOui[] = VENDOR_OUI_WFA_SPECIFIC;
  2545. DBGLOG(P2P, INFO, "Check AssocReq Oui type %u attri %u for len %u\n", ucOuiType, u2AttriID, u2BufferLen);
  2546. ASSERT(prAdapter);
  2547. ASSERT(pucIEBuf);
  2548. u2BufferLenLeft = u2BufferLen;
  2549. pucIE = pucIEBuf;
  2550. do {
  2551. fgIsMore = FALSE;
  2552. prP2pIE = (P_IE_P2P_T) p2pFuncGetSpecIE(prAdapter,
  2553. pucIE, u2BufferLenLeft, ELEM_ID_VENDOR, &fgIsMore);
  2554. if (prP2pIE == NULL)
  2555. continue;
  2556. ASSERT((ULONG) prP2pIE >= (ULONG) pucIE);
  2557. u2BufferLenLeft = u2BufferLen - (UINT_16) (((ULONG) prP2pIE) - ((ULONG) pucIEBuf));
  2558. DBGLOG(P2P, INFO, "Find vendor id %u len %u oui %u more %u LeftLen %u\n",
  2559. IE_ID(prP2pIE), IE_LEN(prP2pIE), prP2pIE->ucOuiType, fgIsMore,
  2560. u2BufferLenLeft);
  2561. if ((IE_LEN(prP2pIE) > P2P_OUI_TYPE_LEN) && (prP2pIE->ucOuiType == ucOuiType)) {
  2562. switch (ucOuiType) {
  2563. case VENDOR_OUI_TYPE_WPS:
  2564. aucWfaOui[0] = 0x00;
  2565. aucWfaOui[1] = 0x50;
  2566. aucWfaOui[2] = 0xF2;
  2567. break;
  2568. case VENDOR_OUI_TYPE_P2P:
  2569. break;
  2570. case VENDOR_OUI_TYPE_WPA:
  2571. case VENDOR_OUI_TYPE_WMM:
  2572. case VENDOR_OUI_TYPE_WFD:
  2573. default:
  2574. break;
  2575. }
  2576. if ((prP2pIE->aucOui[0] != aucWfaOui[0])
  2577. || (prP2pIE->aucOui[1] != aucWfaOui[1])
  2578. || (prP2pIE->aucOui[2] != aucWfaOui[2]))
  2579. continue;
  2580. u2OffsetAttri = 0;
  2581. pucAttri = prP2pIE->aucP2PAttributes;
  2582. if (ucOuiType == VENDOR_OUI_TYPE_WPS) {
  2583. WSC_ATTRI_FOR_EACH(pucAttri,
  2584. (IE_LEN(prP2pIE) - P2P_OUI_TYPE_LEN), u2OffsetAttri) {
  2585. /* LOG_FUNC("WSC: attri id=%u len=%u\n",
  2586. * WSC_ATTRI_ID(pucAttri),
  2587. * WSC_ATTRI_LEN(pucAttri)); */
  2588. if (WSC_ATTRI_ID(pucAttri) == u2AttriID) {
  2589. prTargetAttri =
  2590. (P_ATTRIBUTE_HDR_T) pucAttri;
  2591. break;
  2592. }
  2593. }
  2594. } else if (ucOuiType == VENDOR_OUI_TYPE_P2P) {
  2595. P2P_ATTRI_FOR_EACH(pucAttri,
  2596. (IE_LEN(prP2pIE) - P2P_OUI_TYPE_LEN), u2OffsetAttri) {
  2597. /* LOG_FUNC("P2P: attri id=%u len=%u\n",
  2598. * ATTRI_ID(pucAttri), ATTRI_LEN(pucAttri)); */
  2599. if (ATTRI_ID(pucAttri) == (UINT_8) u2AttriID) {
  2600. prTargetAttri = (P_ATTRIBUTE_HDR_T) pucAttri;
  2601. break;
  2602. }
  2603. }
  2604. }
  2605. #if CFG_SUPPORT_WFD
  2606. else if (ucOuiType == VENDOR_OUI_TYPE_WFD) {
  2607. WFD_ATTRI_FOR_EACH(pucAttri,
  2608. (IE_LEN(prP2pIE) - P2P_OUI_TYPE_LEN), u2OffsetAttri) {
  2609. /* DBGLOG(P2P, INFO, ("WFD: attri id=%u
  2610. * len=%u\n",WFD_ATTRI_ID(pucAttri),
  2611. * WFD_ATTRI_LEN(pucAttri))); */
  2612. if (ATTRI_ID(pucAttri) == (UINT_8) u2AttriID) {
  2613. prTargetAttri =
  2614. (P_ATTRIBUTE_HDR_T) pucAttri;
  2615. break;
  2616. }
  2617. }
  2618. }
  2619. #endif
  2620. /* Do nothing */
  2621. /* Possible or else. */
  2622. } /* ucOuiType */
  2623. /* P2P_OUI_TYPE_LEN */
  2624. pucIE = (PUINT_8) (((ULONG) prP2pIE) + IE_SIZE(prP2pIE));
  2625. /* prP2pIE */
  2626. } while (prP2pIE && fgIsMore && u2BufferLenLeft);
  2627. return prTargetAttri;
  2628. }
  2629. /* p2pFuncGetSpecAttri */
  2630. WLAN_STATUS
  2631. p2pFuncGenerateBeaconProbeRsp(IN P_ADAPTER_T prAdapter,
  2632. IN P_BSS_INFO_T prBssInfo, IN P_MSDU_INFO_T prMsduInfo, IN BOOLEAN fgIsProbeRsp)
  2633. {
  2634. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  2635. P_WLAN_BEACON_FRAME_T prBcnFrame = (P_WLAN_BEACON_FRAME_T) NULL;
  2636. /* P_APPEND_VAR_IE_ENTRY_T prAppendIeTable = (P_APPEND_VAR_IE_ENTRY_T)NULL; */
  2637. do {
  2638. ASSERT_BREAK((prAdapter != NULL) && (prBssInfo != NULL) && (prMsduInfo != NULL));
  2639. /* txBcnIETable */
  2640. /* txProbeRspIETable */
  2641. prBcnFrame = (P_WLAN_BEACON_FRAME_T) prMsduInfo->prPacket;
  2642. return nicUpdateBeaconIETemplate(prAdapter,
  2643. IE_UPD_METHOD_UPDATE_ALL,
  2644. NETWORK_TYPE_P2P_INDEX,
  2645. prBssInfo->u2CapInfo,
  2646. (PUINT_8) prBcnFrame->aucInfoElem,
  2647. prMsduInfo->u2FrameLength - OFFSET_OF(WLAN_BEACON_FRAME_T,
  2648. aucInfoElem));
  2649. } while (FALSE);
  2650. return rWlanStatus;
  2651. } /* p2pFuncGenerateBeaconProbeRsp */
  2652. WLAN_STATUS
  2653. p2pFuncComposeBeaconProbeRspTemplate(IN P_ADAPTER_T prAdapter,
  2654. IN PUINT_8 pucBcnBuffer,
  2655. IN UINT_32 u4BcnBufLen,
  2656. IN BOOLEAN fgIsProbeRsp,
  2657. IN P_P2P_PROBE_RSP_UPDATE_INFO_T prP2pProbeRspInfo, IN BOOLEAN fgSynToFW)
  2658. {
  2659. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  2660. P_MSDU_INFO_T prMsduInfo = (P_MSDU_INFO_T) NULL;
  2661. P_WLAN_MAC_HEADER_T prWlanBcnFrame = (P_WLAN_MAC_HEADER_T) NULL;
  2662. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  2663. PUINT_8 pucBuffer = (PUINT_8) NULL;
  2664. do {
  2665. ASSERT_BREAK((prAdapter != NULL) && (pucBcnBuffer != NULL));
  2666. prWlanBcnFrame = (P_WLAN_MAC_HEADER_T) pucBcnBuffer;
  2667. if ((prWlanBcnFrame->u2FrameCtrl != MAC_FRAME_BEACON) && (!fgIsProbeRsp)) {
  2668. rWlanStatus = WLAN_STATUS_INVALID_DATA;
  2669. break;
  2670. }
  2671. else if (prWlanBcnFrame->u2FrameCtrl != MAC_FRAME_PROBE_RSP) {
  2672. rWlanStatus = WLAN_STATUS_INVALID_DATA;
  2673. break;
  2674. }
  2675. if (fgIsProbeRsp) {
  2676. ASSERT_BREAK(prP2pProbeRspInfo != NULL);
  2677. if (prP2pProbeRspInfo->prProbeRspMsduTemplate)
  2678. cnmMgtPktFree(prAdapter, prP2pProbeRspInfo->prProbeRspMsduTemplate);
  2679. prP2pProbeRspInfo->prProbeRspMsduTemplate = cnmMgtPktAlloc(prAdapter, u4BcnBufLen);
  2680. prMsduInfo = prP2pProbeRspInfo->prProbeRspMsduTemplate;
  2681. prMsduInfo->eSrc = TX_PACKET_MGMT;
  2682. prMsduInfo->ucStaRecIndex = 0xFF;
  2683. prMsduInfo->ucNetworkType = NETWORK_TYPE_P2P_INDEX;
  2684. } else {
  2685. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  2686. prMsduInfo = prP2pBssInfo->prBeacon;
  2687. if (prMsduInfo == NULL) {
  2688. rWlanStatus = WLAN_STATUS_FAILURE;
  2689. break;
  2690. }
  2691. if (u4BcnBufLen > (OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH)) {
  2692. /* Unexpected error, buffer overflow. */
  2693. ASSERT(FALSE);
  2694. break;
  2695. }
  2696. }
  2697. pucBuffer = (PUINT_8) ((ULONG) (prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
  2698. kalMemCopy(pucBuffer, pucBcnBuffer, u4BcnBufLen);
  2699. prMsduInfo->fgIs802_11 = TRUE;
  2700. prMsduInfo->u2FrameLength = (UINT_16) u4BcnBufLen;
  2701. if (fgSynToFW && prP2pBssInfo)
  2702. rWlanStatus = p2pFuncGenerateBeaconProbeRsp(prAdapter, prP2pBssInfo, prMsduInfo, fgIsProbeRsp);
  2703. } while (FALSE);
  2704. return rWlanStatus;
  2705. } /* p2pFuncComposeBeaconTemplate */
  2706. #if CFG_SUPPORT_WFD
  2707. WLAN_STATUS wfdAdjustResource(IN P_ADAPTER_T prAdapter, IN BOOLEAN fgEnable)
  2708. {
  2709. #if 1
  2710. /* The API shall be called in tx_thread */
  2711. P_QUE_MGT_T prQM = &prAdapter->rQM;
  2712. DBGLOG(P2P, INFO, "wfdAdjustResource %d\n", fgEnable);
  2713. if (fgEnable) {
  2714. prQM->au4MinReservedTcResource[TC2_INDEX] = QM_GUARANTEED_TC2_RESOURCE;
  2715. if (QM_GUARANTEED_TC0_RESOURCE > 2) {
  2716. prQM->au4GuaranteedTcResource[TC0_INDEX] = QM_GUARANTEED_TC0_RESOURCE - 2;
  2717. prQM->au4GuaranteedTcResource[TC2_INDEX] += 2;
  2718. }
  2719. if (QM_GUARANTEED_TC1_RESOURCE > 2) {
  2720. prQM->au4GuaranteedTcResource[TC1_INDEX] = QM_GUARANTEED_TC1_RESOURCE - 2;
  2721. prQM->au4GuaranteedTcResource[TC2_INDEX] += 2;
  2722. }
  2723. } else {
  2724. prQM->au4MinReservedTcResource[TC2_INDEX] = QM_MIN_RESERVED_TC2_RESOURCE;
  2725. prQM->au4GuaranteedTcResource[TC0_INDEX] = QM_GUARANTEED_TC0_RESOURCE;
  2726. prQM->au4GuaranteedTcResource[TC1_INDEX] = QM_GUARANTEED_TC1_RESOURCE;
  2727. prQM->au4GuaranteedTcResource[TC2_INDEX] = QM_GUARANTEED_TC2_RESOURCE;
  2728. }
  2729. #endif
  2730. return WLAN_STATUS_SUCCESS;
  2731. }
  2732. WLAN_STATUS wfdAdjustThread(IN P_ADAPTER_T prAdapter, IN BOOLEAN fgEnable)
  2733. {
  2734. #define WFD_TX_THREAD_PRIORITY 70
  2735. DBGLOG(P2P, INFO, "wfdAdjustResource %d\n", fgEnable);
  2736. if (prAdapter->prGlueInfo->main_thread != NULL) {
  2737. if (fgEnable) {
  2738. #ifdef LINUX
  2739. /* TODO the change schedule API shall be provided by OS glue layer */
  2740. /* Or the API shall be put in os glue layer */
  2741. struct sched_param param = {.sched_priority = WFD_TX_THREAD_PRIORITY };
  2742. sched_setscheduler(prAdapter->prGlueInfo->main_thread, SCHED_RR, &param);
  2743. #endif
  2744. } else {
  2745. #ifdef LINUX
  2746. /* TODO the change schedule API shall be provided by OS glue layer */
  2747. struct sched_param param = {.sched_priority = 0 };
  2748. sched_setscheduler(prAdapter->prGlueInfo->main_thread, SCHED_NORMAL, &param);
  2749. #endif
  2750. }
  2751. } else {
  2752. DBGLOG(P2P, WARN, "main_thread is null, please check if the wlanRemove is called in advance\n");
  2753. }
  2754. return WLAN_STATUS_SUCCESS;
  2755. }
  2756. #endif /* CFG_SUPPORT_WFD */
  2757. WLAN_STATUS wfdChangeMediaState(IN P_ADAPTER_T prAdapter,
  2758. IN ENUM_NETWORK_TYPE_INDEX_T eNetworkTypeIdx, ENUM_PARAM_MEDIA_STATE_T eConnectionState)
  2759. {
  2760. #if CFG_SUPPORT_WFD
  2761. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  2762. if (prAdapter->fgIsP2PRegistered == FALSE)
  2763. return WLAN_STATUS_SUCCESS;
  2764. prWfdCfgSettings = &prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings;
  2765. if ((prWfdCfgSettings->ucWfdEnable) && ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID))) {
  2766. if (prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX].eConnectionState ==
  2767. PARAM_MEDIA_STATE_CONNECTED) {
  2768. wfdAdjustResource(prAdapter, TRUE);
  2769. wfdAdjustThread(prAdapter, TRUE);
  2770. } else {
  2771. wfdAdjustResource(prAdapter, FALSE);
  2772. wfdAdjustThread(prAdapter, FALSE);
  2773. }
  2774. }
  2775. #endif
  2776. return WLAN_STATUS_SUCCESS;
  2777. }