| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089 |
- /*
- ** Id: //Department/DaVinci/TRUNK/WiFi_P2P_Driver/mgmt/p2p_fsm.c#61
- */
- /*! \file "p2p_fsm.c"
- \brief This file defines the FSM for P2P Module.
- This file defines the FSM for P2P Module.
- */
- /*
- ** Log: p2p_fsm.c
- **
- ** 12 20 2012 yuche.tsai
- ** [ALPS00410124] [Rose][Free Test][KE][rlmUpdateParamsForAP]The device reboot automatically
- ** and then "Fatal/Kernel" pops up during use data service.(Once)
- ** Fix possible NULL station record cause KE under AP mode.
- ** May due to variable uninitial.
- ** Review: http://mtksap20:8080/go?page=NewReview&reviewid=49970
- **
- ** 09 12 2012 wcpadmin
- ** [ALPS00276400] Remove MTK copyright and legal header on GPL/LGPL related packages
- ** .
- **
- ** 08 31 2012 yuche.tsai
- ** [ALPS00349585] [6577JB][WiFi direct][KE]Establish p2p connection while both device have connected
- **to AP previously,one device reboots automatically with KE
- ** Fix possible KE when concurrent & disconnect.
- **
- ** 08 21 2012 yuche.tsai
- ** NULL
- ** fix disconnect indication.
- **
- ** 08 16 2012 yuche.tsai
- ** NULL
- ** Fix compile warning.
- **
- ** 08 14 2012 yuche.tsai
- ** NULL
- ** Fix p2p bug find on ALPS.JB trunk.
- **
- ** 07 27 2012 yuche.tsai
- ** [ALPS00324337] [ALPS.JB][Hot-Spot] Driver update for Hot-Spot
- ** Update for driver unload KE issue.
- **
- ** 07 26 2012 yuche.tsai
- ** [ALPS00324337] [ALPS.JB][Hot-Spot] Driver update for Hot-Spot
- ** Update driver code of ALPS.JB for hot-spot.
- **
- ** 07 19 2012 yuche.tsai
- ** NULL
- ** Code update for JB.
- *
- * 07 17 2012 yuche.tsai
- * NULL
- * Compile no error before trial run.
- *
- * 07 05 2011 yuche.tsai
- * [WCXRP00000821] [Volunteer Patch][WiFi Direct][Driver] WiFi Direct Connection Speed Issue
- * Fix the compile flag of enhancement.
- *
- * 07 05 2011 yuche.tsai
- * [WCXRP00000808] [Volunteer Patch][MT6620][Driver/FW] Device discoverability issue fix
- * Change device discoverability methodology. From driver SCAN to FW lock channel.
- *
- * 07 05 2011 yuche.tsai
- * [WCXRP00000821] [Volunteer Patch][WiFi Direct][Driver] WiFi Direct Connection Speed Issue
- * Add wifi direct connection enhancement method I, II & VI.
- *
- * 07 05 2011 yuche.tsai
- * [WCXRP00000833] [Volunteer Patch][WiFi Direct][Driver] Service Discovery Frame RX Indicate Issue
- * Fix Service Discovery Race Condition Issue.
- *
- * 06 23 2011 cp.wu
- * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
- * change parameter name from PeerAddr to BSSID
- *
- * 06 21 2011 yuche.tsai
- * [WCXRP00000799] [Volunteer Patch][MT6620][Driver] Connection Indication Twice Issue.
- * Fix an issue of accepting connection of GO.
- *
- * 06 21 2011 yuche.tsai
- * [WCXRP00000775] [Volunteer Patch][MT6620][Driver] Dynamic enable SD capability
- * Drop GAS frame when SD is not enabled.
- *
- * 06 20 2011 yuche.tsai
- * NULL
- * Fix compile error.
- *
- * 06 20 2011 yuche.tsai
- * [WCXRP00000799] [Volunteer Patch][MT6620][Driver] Connection Indication Twice Issue.
- * Fix connection indication twice issue.
- *
- * 06 20 2011 cp.wu
- * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
- * 1. specify target's BSSID when requesting channel privilege.
- * 2. pass BSSID information to firmware domain
- *
- * 06 20 2011 yuche.tsai
- * [WCXRP00000795] [Volunteer Patch][MT6620][Driver] GO can not connect second device issue
- * Solve P2P GO can not formation with second device issue.
- *
- * 06 14 2011 yuche.tsai
- * NULL
- * Change disconnect feature.
- *
- * 06 10 2011 yuche.tsai
- * [WCXRP00000775] [Volunteer Patch][MT6620][Driver] Dynamic enable SD capability[WCXRP00000776]
- * [Need Patch][MT6620][Driver] MT6620 response probe request of P2P device with P2P IE under Hot Spot mode.
- * 1. Dynamic enable SD capability after P2P supplicant ready.
- * 2. Avoid response probe respone with p2p IE when under hot spot mode.
- *
- * 06 07 2011 yuche.tsai
- * [WCXRP00000763] [Volunteer Patch][MT6620][Driver] RX Service Discovery Frame under AP mode Issue
- * Fix RX SD request under AP mode issue.
- *
- * 06 02 2011 cp.wu
- * [WCXRP00000681] [MT5931][Firmware] HIF code size reduction
- * eliminate unused parameters for SAA-FSM
- *
- * 05 26 2011 yuche.tsai
- * [WCXRP00000745] Support accepting connection after one Group Connection Lost.
- After Group Formation & lost connection, if MT6620 behave as:
- 1. GO: It would keep under GO state until been dissolved by supplicant.
- At this time, other P2P device can use join method to join this group.
- 2. GC: It would keep on searching target GO or target device until been dissolved by supplicant.
- At this time, it would ignore other P2P device formation request.
- --
- Modification: Make driver to accept GO NEGO REQ at this time, to let user decide to accept new connection or not.
- * [Volunteer Patch][MT6620][Driver]
- * Driver would indicate connection request, if password ID is not ready but connection request is issued.
- *
- * 05 18 2011 yuche.tsai
- * [WCXRP00000728] [Volunteer Patch][MT6620][Driver] Service Discovery Request TX issue.
- * A solution for both connection request & IO control.
- *
- * 05 16 2011 yuche.tsai
- * [WCXRP00000728] [Volunteer Patch][MT6620][Driver] Service Discovery Request TX issue.
- * Fix SD request can not send out issue.
- *
- * 05 09 2011 terry.wu
- * [WCXRP00000711] [MT6620 Wi-Fi][Driver] Set Initial value of StaType in StaRec for Hotspot Client
- * Set initial value of StaType in StaRec for hotspot client.
- *
- * 05 04 2011 yuche.tsai
- * [WCXRP00000697] [Volunteer Patch][MT6620][Driver]
- * Bug fix for p2p descriptor is NULL if BSS descriptor is found first.
- *
- * 05 04 2011 yuche.tsai
- * NULL
- * Support partial persistent group function.
- *
- * 05 02 2011 yuche.tsai
- * [WCXRP00000693] [Volunteer Patch][MT6620][Driver] Clear Formation Flag after TX lifetime timeout.
- * Clear formation flag after formation timeout.
- *
- * 04 20 2011 yuche.tsai
- * [WCXRP00000668] [Volunteer Patch][MT6620][Driver] Possible race condition
- * when add scan & query scan result at the same time.
- * Fix side effect while starting ATGO.
- *
- * 04 20 2011 yuche.tsai
- * NULL
- * Fix ASSERT issue in FW, side effect of last change.
- *
- * 04 19 2011 yuche.tsai
- * [WCXRP00000668] [Volunteer Patch][MT6620][Driver] Possible race condition
- * when add scan & query scan result at the same time.
- * Workaround for multiple device connection, before invitation ready.
- *
- * 04 19 2011 yuche.tsai
- * [WCXRP00000665] [Wifi Direct][MT6620 E4] When use Ralink's dongle to establish wifi direct connection with PBC.
- * But 6573 always not pop accept option to establish connection.
- * Support connection indication when GO NEGO REQ doesn't have configure method, instead it has PasswordID.
- *
- * 04 18 2011 yuche.tsai
- * NULL
- * Fix error.
- *
- * 04 14 2011 yuche.tsai
- * [WCXRP00000646] [Volunteer Patch][MT6620][FW/Driver] Sigma Test Modification for some test case.
- * Fix a connection issue.
- *
- * 04 14 2011 yuche.tsai
- * [WCXRP00000646] [Volunteer Patch][MT6620][FW/Driver] Sigma Test Modification for some test case.
- * Fix the channel issue of AP mode.
- *
- * 04 14 2011 yuche.tsai
- * [WCXRP00000646] [Volunteer Patch][MT6620][FW/Driver] Sigma Test Modification for some test case.
- * Connection flow refine for Sigma test.
- *
- * 04 09 2011 yuche.tsai
- * [WCXRP00000624] [Volunteer Patch][MT6620][Driver] Add device discoverability support for GO.
- * Fix Device discoverability related issue.
- *
- * 04 09 2011 yuche.tsai
- * [WCXRP00000624] [Volunteer Patch][MT6620][Driver] Add device discoverability support for GO.
- * Fix bug for Device Discoverability.
- *
- * 04 08 2011 yuche.tsai
- * [WCXRP00000624] [Volunteer Patch][MT6620][Driver] Add device discoverability support for GO.
- * Fix compile error.
- *
- * 04 08 2011 yuche.tsai
- * [WCXRP00000624] [Volunteer Patch][MT6620][Driver] Add device discoverability support for GO.
- * Add device discoverability support.
- *
- * 03 28 2011 yuche.tsai
- * NULL
- * Fix a possible issue for retry join when media status connected.
- *
- * 03 25 2011 yuche.tsai
- * NULL
- * Improve some error handleing.
- *
- * 03 24 2011 yuche.tsai
- * NULL
- * Assign AID before change STA_REC state to state 3.
- *
- * 03 23 2011 yuche.tsai
- * NULL
- * Fix Response Rate Issue when TX Auth Rsp Frame under P2P Mode.
- *
- * 03 23 2011 yuche.tsai
- * NULL
- * Fix issue of connection to one GC.
- *
- * 03 23 2011 yuche.tsai
- * NULL
- * Fix ASSERT issue when starting Hot-spot.
- *
- * 03 22 2011 yuche.tsai
- * NULL
- * When Target Information is not available, change to passive mode.
- *
- * 03 22 2011 yuche.tsai
- * NULL
- * Fix one connection issue while using Keypad to connect a GO.
- *
- * 03 22 2011 yuche.tsai
- * NULL
- * 1. Fix two issues that may cause kernel panic.
- *
- * 03 22 2011 yuche.tsai
- * NULL
- * Fix GC connect to other device issue.
- *
- * 03 22 2011 yuche.tsai
- * NULL
- * 1.Shorten the LISTEN interval.
- * 2. Fix IF address issue when we are GO
- * 3. Fix LISTEN channel issue.
- *
- * 03 22 2011 yuche.tsai
- * NULL
- * Modify formation policy setting.
- *
- * 03 21 2011 yuche.tsai
- * NULL
- * Solve Listen State doesn't response probe response issue.
- *
- * 03 21 2011 yuche.tsai
- * NULL
- * Change P2P Connection Request Flow.
- *
- * 03 19 2011 yuche.tsai
- * [WCXRP00000584] [Volunteer Patch][MT6620][Driver] Add beacon timeout support for WiFi Direct.
- * Add beacon timeout support.
- *
- * 03 19 2011 yuche.tsai
- * [WCXRP00000583] [Volunteer Patch][MT6620][Driver] P2P connection of the third peer issue
- * Indicate the correct Group SSID when join on Group.
- *
- * 03 19 2011 yuche.tsai
- * [WCXRP00000583] [Volunteer Patch][MT6620][Driver] P2P connection of the third peer issue
- * Support the third P2P device to join GO/GC group.
- *
- * 03 19 2011 yuche.tsai
- * [WCXRP00000581] [Volunteer Patch][MT6620][Driver] P2P IE in Assoc Req Issue
- * Append P2P IE in Assoc Req, so that GC can be discovered in probe response of GO.
- *
- * 03 18 2011 yuche.tsai
- * [WCXRP00000578] [Volunteer Patch][MT6620][Driver] Separate Connection Request from general IOCTL
- * Separate connection request from general IOCTL.
- *
- * 03 18 2011 yuche.tsai
- * [WCXRP00000574] [Volunteer Patch][MT6620][Driver] Modify P2P FSM Connection Flow
- * Modify connection flow after Group Formation Complete, or device connect to a GO.
- * Instead of request channel & connect directly, we use scan to allocate channel bandwidth & connect after RX BCN.
- *
- * 03 17 2011 yuche.tsai
- * NULL
- * When AIS is connect to an AP, Hot Spot would be enabled under fixed same channel.
- *
- * 03 17 2011 yuche.tsai
- * NULL
- * Solve the Group Info IE in Probe Response incorrect issue.
- *
- * 03 17 2011 yuche.tsai
- * NULL
- * Release Channel after Join Complete.
- *
- * 03 16 2011 wh.su
- * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
- * enable the protected while at P2P start GO, and skip some security check .
- *
- * 03 15 2011 yuche.tsai
- * [WCXRP00000560] [Volunteer Patch][MT6620][Driver] P2P Connection from UI using KEY/DISPLAY issue
- * Fix local configure method issue.
- *
- * 03 15 2011 yuche.tsai
- * [WCXRP00000560] [Volunteer Patch][MT6620][Driver] P2P Connection from UI using KEY/DISPLAY issue
- * Fix some configure method issue.
- *
- * 03 14 2011 yuche.tsai
- * NULL
- * .
- *
- * 03 14 2011 yuche.tsai
- * NULL
- * Fix password ID issue.
- *
- * 03 10 2011 yuche.tsai
- * NULL
- * Add P2P API.
- *
- * 03 08 2011 yuche.tsai
- * [WCXRP00000480] [Volunteer Patch][MT6620][Driver] WCS IE format issue[WCXRP00000509]
- * [Volunteer Patch][MT6620][Driver] Kernal panic when remove p2p module.
- * .
- *
- * 03 07 2011 yuche.tsai
- * [WCXRP00000502] [Volunteer Patch][MT6620][Driver] Fix group ID issue when doing Group Formation.
- * .
- *
- * 03 07 2011 wh.su
- * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
- * rename the define to anti_pviracy.
- *
- * 03 05 2011 wh.su
- * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
- * add the code to get the check rsponse and indicate to app.
- *
- * 03 04 2011 wh.su
- * [WCXRP00000510] [MT6620 Wi-Fi] [Driver] Fixed the CTIA enter test mode issue
- * fixed the p2p action frame type check for device request indication.
- *
- * 03 02 2011 yuche.tsai
- * [WCXRP00000245] 1. Invitation Request/Response.
- 2. Provision Discovery Request/Response
- * Fix Service Discovery RX packet buffer pointer.
- *
- * 03 01 2011 yuche.tsai
- * [WCXRP00000501] [Volunteer Patch][MT6620][Driver] No common channel issue when doing GO formation
- * Update channel issue when doing GO formation..
- *
- * 03 01 2011 yuche.tsai
- * [WCXRP00000245] 1. Invitation Request/Response.
- 2. Provision Discovery Request/Response
- * Update Service Discovery Related wlanoid function.
- *
- * 02 21 2011 yuche.tsai
- * [WCXRP00000481] [Volunteer Patch][MT6620][FW] Scan hang under concurrent case.
- * Fix all BE issue of WSC or P2P IE.
- *
- * 02 18 2011 wh.su
- * [WCXRP00000471] [MT6620 Wi-Fi][Driver] Add P2P Provison discovery append Config Method attribute at WSC IE
- * fixed the wsc config method mapping to driver used config method issue.
- *
- * 02 18 2011 yuche.tsai
- * [WCXRP00000479] [Volunteer Patch][MT6620][Driver] Probe Response of P2P using 11b rate.
- * Update basic rate to FW, after P2P is initialed.
- *
- * 02 18 2011 yuche.tsai
- * [WCXRP00000478] [Volunteer Patch][MT6620][Driver] Probe request frame during search
- * phase do not contain P2P wildcard SSID.
- * Use P2P Wildcard SSID when scan type of P2P_WILDCARD_SSID is set.
- *
- * 02 18 2011 yuche.tsai
- * [WCXRP00000480] [Volunteer Patch][MT6620][Driver] WCS IE format issue
- * Fix WSC IE BE format issue.
- *
- * 02 17 2011 wh.su
- * [WCXRP00000471] [MT6620 Wi-Fi][Driver] Add P2P Provison discovery append Config Method attribute at WSC IE
- * append the WSC IE config method attribute at provision discovery request.
- *
- * 02 16 2011 wh.su
- * [WCXRP00000448] [MT6620 Wi-Fi][Driver] Fixed WSC IE not send out at probe request
- * fixed the probe request send out without WSC IE issue (at P2P).
- *
- * 02 16 2011 yuche.tsai
- * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
- * If two station connected to the Hot-Spot and one disconnect, FW would get into an infinite loop
- *
- * 02 15 2011 yuche.tsai
- * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
- * Fix re-connection issue after RX deauthentication.
- *
- * 02 15 2011 yuche.tsai
- * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
- * Fix conneciton issue after disconnect with AP.
- *
- * 02 12 2011 yuche.tsai
- * [WCXRP00000441] [Volunteer Patch][MT6620][Driver] BoW can not create desired station type when Hot Spot is enabled.
- * P2P Create Station Type according to Target BSS capability.
- *
- * 02 10 2011 yuche.tsai
- * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
- * Support Disassoc & Deauthentication for Hot-Spot.
- *
- * 02 09 2011 yuche.tsai
- * [WCXRP00000245] 1. Invitation Request/Response.
- 2. Provision Discovery Request/Response
- * Add Service Discovery Indication Related code.
- *
- * 02 09 2011 yuche.tsai
- * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
- * Add Support for MLME deauthentication for Hot-Spot.
- *
- * 02 09 2011 yuche.tsai
- * [WCXRP00000429] [Volunteer Patch][MT6620][Driver] Hot Spot Client Limit Issue
- * Fix Client Limit Issue.
- *
- * 02 08 2011 yuche.tsai
- * [WCXRP00000419] [Volunteer Patch][MT6620/MT5931][Driver] Provide function of disconnect
- * to target station for AAA module.
- * Disconnect every station client when disolve on P2P group.
- *
- * 02 08 2011 yuche.tsai
- * [WCXRP00000245] 1. Invitation Request/Response.
- 2. Provision Discovery Request/Response
- * 1. Fix Service Disocvery Logical issue.
- * 2. Fix a NULL pointer access violation issue when sending deauthentication packet to a class error station.
- *
- * 02 08 2011 yuche.tsai
- * [WCXRP00000419] [Volunteer Patch][MT6620/MT5931][Driver] Provide function of disconnect
- * to target station for AAA module.
- * Workaround of disable P2P network.
- *
- * 02 08 2011 yuche.tsai
- * [WCXRP00000421] [Volunteer Patch][MT6620][Driver] Fix incorrect SSID length Issue
- * 1. Fixed SSID wrong length issue.
- * 2. Under Hot Spot configuration, there won't be any P2P IE.
- * 3. Under Hot Spot configuration, P2P FSM won't get into LISTEN state first.
- *
- * 01 27 2011 yuche.tsai
- * [WCXRP00000399] [Volunteer Patch][MT6620/MT5931][Driver] Fix scan side effect after P2P module separate.
- * Modify Start GO flow.
- *
- * 01 27 2011 yuche.tsai
- * [WCXRP00000399] [Volunteer Patch][MT6620/MT5931][Driver] Fix scan side effect after P2P module separate.
- * Fix desire phy type set issue.
- *
- * 01 27 2011 yuche.tsai
- * [WCXRP00000399] [Volunteer Patch][MT6620/MT5931][Driver] Fix scan side effect after P2P module separate.
- * Add desire phy type set phase I.
- *
- * 01 26 2011 yuche.tsai
- * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
- * Fix P2P Disconnect Issue.
- *
- * 01 26 2011 yuche.tsai
- * [WCXRP00000245] 1. Invitation Request/Response.
- 2. Provision Discovery Request/Response
- * Add Service Discovery Function.
- *
- * 01 26 2011 cm.chang
- * [WCXRP00000395] [MT6620 Wi-Fi][Driver][FW] Search STA_REC with additional net type index argument
- * .
- *
- * 01 25 2011 yuche.tsai
- * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
- * Fix compile error when DBG is disabled.
- *
- * 01 25 2011 yuche.tsai
- * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
- * Change Station Type Definition.
- *
- * 01 19 2011 yuche.tsai
- * [WCXRP00000353] [Volunteer Patch][MT6620][Driver] Desired Non-HT Rate Set update
- * when STA record is created under AP Mode.
- * Add P2P QoS Support.
- *
- * 01 19 2011 george.huang
- * [WCXRP00000355] [MT6620 Wi-Fi] Set WMM-PS related setting with qualifying AP capability
- * Null NOA attribute setting when no related parameters.
- *
- * 01 14 2011 yuche.tsai
- * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
- * Modify AAA flow according to CM's comment.
- *
- * 01 13 2011 yuche.tsai
- * [WCXRP00000353] [Volunteer Patch][MT6620][Driver] Desired Non-HT Rate Set update
- * when STA record is created under AP Mode.
- * Resolve Channel ZERO issue. (Uninitialized default channel)
- *
- * 01 13 2011 yuche.tsai
- * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
- * Update P2P State Debug Message.
- *
- * 01 12 2011 yuche.tsai
- * [WCXRP00000353] [Volunteer Patch][MT6620][Driver] Desired Non-HT Rate Set update
- * when STA record is created under AP Mode.
- * Fix bug when allocating message buffer.
- *
- * 01 12 2011 yuche.tsai
- * [WCXRP00000353] [Volunteer Patch][MT6620][Driver] Desired Non-HT Rate Set update
- * when STA record is created under AP Mode.
- * Update Phy Type Set. When legacy client is connected, it can use 11b rate,
- * but if the P2P device is connected, 11b rate is not allowed.
- *
- * 01 12 2011 yuche.tsai
- * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
- * 1. Modify Channel Acquire Time of AP mode from 5s to 1s.
- * 2. Call cnmP2pIsPermit() before active P2P network.
- * 3. Add channel selection support for AP mode.
- *
- * 01 12 2011 yuche.tsai
- * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
- * Fix Bug of reference to NULL pointer.
- *
- * 01 12 2011 yuche.tsai
- * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
- * Modify some behavior of AP mode.
- *
- * 01 12 2011 yuche.tsai
- * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
- * Fix bug of wrong pointer check.
- *
- * 01 12 2011 yuche.tsai
- * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
- * Fix Compile Error.
- *
- * 01 11 2011 yuche.tsai
- * [WCXRP00000352] [Volunteer Patch][MT6620][Driver] P2P Statsion Record Client List Issue
- * Add station record into client list before change it state from STATE_2 to STATE_3.
- *
- * 01 05 2011 yuche.tsai
- * [WCXRP00000345] [MT6620][Volunteer Patch] P2P may issue a SSID specified scan request,
- * but the SSID length is still invalid.
- * Specify SSID Type when issue a scan request.
- *
- * 01 05 2011 cp.wu
- * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations
- * to ease physically continuous memory demands
- * correct typo
- *
- * 01 05 2011 george.huang
- * [WCXRP00000343] [MT6620 Wi-Fi] Add TSF reset path for concurrent operation
- * modify NOA update path for preventing assertion false alarm.
- *
- * 01 04 2011 cp.wu
- * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations
- * to ease physically continuous memory demands
- * separate kalMemAlloc() into virtually-continuous and physically-continuous type to ease slab system pressure
- *
- * 01 03 2011 wh.su
- * [WCXRP00000326] [MT6620][Wi-Fi][Driver] check in the binary format gl_sec.o.new instead of use change type!!!
- * let the p2p ap mode acept a legacy device join.
- *
- * 12 22 2010 yuche.tsai
- * [WCXRP00000245] 1. Invitation Request/Response.
- 2. Provision Discovery Request/Response
- * Fix Compile Error.
- *
- * 12 15 2010 yuche.tsai
- * [WCXRP00000245] 1. Invitation Request/Response.
- 2. Provision Discovery Request/Response
- * Refine Connection Flow.
- *
- * 12 08 2010 yuche.tsai
- * [WCXRP00000245] [MT6620][Driver] Invitation & Provision Discovery Feature Check-in
- * [WCXRP000000245][MT6620][Driver] Invitation Request Feature Add
- *
- * 12 08 2010 yuche.tsai
- * [WCXRP00000244] [MT6620][Driver] Add station record type for each client when in AP mode.
- * Change STA Type under AP mode. We would tell if client is a P2P device or a legacy client
- * by checking the P2P IE in assoc req frame.
- *
- * 12 07 2010 cm.chang
- * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
- * The order of invoking nicUpdateBss() and rlm functions
- *
- * 12 02 2010 yuche.tsai
- * NULL
- * Update P2P Connection Policy for Invitation.
- *
- * 12 02 2010 yuche.tsai
- * NULL
- * Update P2P Connection Policy for Invitation & Provision Discovery.
- *
- * 11 30 2010 yuche.tsai
- * NULL
- * Invitation & Provision Discovery Indication.
- *
- * 11 30 2010 yuche.tsai
- * NULL
- * Update Configure Method indication & selection for Provision Discovery & GO_NEGO_REQ
- *
- * 11 30 2010 yuche.tsai
- * NULL
- * Update RCIP value when RX assoc request frame.
- *
- * 11 29 2010 yuche.tsai
- * NULL
- * Update P2P related function for INVITATION & PROVISION DISCOVERY.
- *
- * 11 26 2010 george.huang
- * [WCXRP00000152] [MT6620 Wi-Fi] AP mode power saving function
- * Update P2P PS for NOA function.
- *
- * 11 25 2010 yuche.tsai
- * NULL
- * Update Code for Invitation Related Function.
- *
- * 11 17 2010 wh.su
- * [WCXRP00000164] [MT6620 Wi-Fi][Driver] Support the p2p random SSID[WCXRP00000179] [MT6620 Wi-Fi][FW]
- * Set the Tx lowest rate at wlan table for normal operation
- * fixed some ASSERT check.
- *
- * 11 05 2010 wh.su
- * [WCXRP00000164] [MT6620 Wi-Fi][Driver] Support the p2p random SSID
- * fixed the p2p role code error.
- *
- * 11 04 2010 wh.su
- * [WCXRP00000164] [MT6620 Wi-Fi][Driver] Support the p2p random SSID
- * adding the p2p random ssid support.
- *
- * 10 20 2010 wh.su
- * [WCXRP00000124] [MT6620 Wi-Fi] [Driver] Support the dissolve P2P Group
- * fixed the ASSERT check error
- *
- * 10 20 2010 wh.su
- * [WCXRP00000124] [MT6620 Wi-Fi] [Driver] Support the dissolve P2P Group
- * Add the code to support disconnect p2p group
- *
- * 10 19 2010 wh.su
- * [WCXRP00000085] [MT6620 Wif-Fi] [Driver] update the modified p2p state
- * machine[WCXRP00000102] [MT6620 Wi-Fi] [FW] Add a compiling flag and code for support Direct GO at Android
- * fixed the compiling error.
- *
- * 10 14 2010 wh.su
- * [WCXRP00000102] [MT6620 Wi-Fi] [FW] Add a compiling flag and code for support Direct GO at Android
- * adding a code to support Direct GO with a compiling flag .
- *
- * 10 08 2010 cp.wu
- * [WCXRP00000087] [MT6620 Wi-Fi][Driver] Cannot connect to 5GHz AP, driver will cause FW assert.
- * correct erroneous logic: specifying eBand with incompatible eSco
- *
- * 10 08 2010 wh.su
- * [WCXRP00000085] [MT6620 Wif-Fi] [Driver] update the modified p2p state machine
- * fixed the compiling error.
- *
- * 10 08 2010 wh.su
- * [WCXRP00000085] [MT6620 Wif-Fi] [Driver] update the modified p2p state machine
- * update the frog's new p2p state machine.
- *
- * 09 10 2010 wh.su
- * NULL
- * fixed the compiling error at WinXP.
- *
- * 09 07 2010 yuche.tsai
- * NULL
- * Reset Common IE Buffer of P2P INFO when scan request is issued.
- * If an action frame other than public action frame is received, return direcly.
- *
- * 09 07 2010 wh.su
- * NULL
- * adding the code for beacon/probe req/ probe rsp wsc ie at p2p.
- *
- * 09 06 2010 wh.su
- * NULL
- * let the p2p can set the privacy bit at beacon and rsn ie at assoc req at key handshake state.
- *
- * 09 03 2010 kevin.huang
- * NULL
- * Refine #include sequence and solve recursive/nested #include issue
- *
- * 08 26 2010 yuche.tsai
- * NULL
- * Add P2P Connection Abort Event Message handler.
- *
- * 08 24 2010 cm.chang
- * NULL
- * Support RLM initail channel of Ad-hoc, P2P and BOW
- *
- * 08 23 2010 yuche.tsai
- * NULL
- * 1. Fix Interface Address from GO Nego Req/Rsp is not correct.
- * 2. Fix GO mode does not change media state after station connected.
- * 3. Fix STA don't response probe request when there is a connection request.
- *
- * 08 20 2010 cm.chang
- * NULL
- * Migrate RLM code to host from FW
- *
- * 08 20 2010 kevin.huang
- * NULL
- * Modify AAA Module for changing STA STATE 3 at p2p/bowRunEventAAAComplete()
- *
- * 08 20 2010 yuche.tsai
- * NULL
- * Add Glue Layer indication.
- *
- * 08 17 2010 yuche.tsai
- * NULL
- * Fix compile warning under Linux.
- *
- * 08 17 2010 yuche.tsai
- * NULL
- * Fix some P2P FSM bug.
- *
- * 08 16 2010 yuche.tsai
- * NULL
- * Add random Interface Address Generation support.
- *
- * 08 16 2010 yuche.tsai
- * NULL
- * Fix some P2P FSM bug.
- *
- * 08 16 2010 yuche.tsai
- * NULL
- * Update P2P FSM code for GO Nego.
- *
- * 08 16 2010 kevin.huang
- * NULL
- * Refine AAA functions
- *
- * 08 12 2010 kevin.huang
- * NULL
- * Refine bssProcessProbeRequest() and bssSendBeaconProbeResponse()
- *
- * 08 12 2010 yuche.tsai
- * NULL
- * Join complete indication.
- *
- * 08 11 2010 yuche.tsai
- * NULL
- * Add two boolean in connection request.
- * Based on these two boolean value, P2P FSM should
- * decide to do invitation or group formation or start a GO directly.
- *
- * 08 11 2010 yuche.tsai
- * NULL
- * Update P2P FSM, currently P2P Device Discovery is verified.
- *
- * 08 05 2010 yuche.tsai
- * NULL
- * Update P2P FSM for group formation.
- *
- * 08 03 2010 george.huang
- * NULL
- * handle event for updating NOA parameters indicated from FW
- *
- * 08 03 2010 cp.wu
- * NULL
- * limit build always needs spin-lock declaration.
- *
- * 08 02 2010 yuche.tsai
- * NULL
- * P2P Group Negotiation Code Check in.
- *
- * 07 26 2010 yuche.tsai
- *
- * Add P2P FSM code check in.
- *
- * 07 21 2010 yuche.tsai
- *
- * Add P2P Scan & Scan Result Parsing & Saving.
- *
- * 07 19 2010 yuche.tsai
- *
- * Update P2P FSM.
- *
- * 07 09 2010 george.huang
- *
- * [WPD00001556] Migrate PM variables from FW to driver: for composing QoS Info
- *
- * 07 08 2010 cp.wu
- *
- * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
- *
- * 06 21 2010 yuche.tsai
- * [WPD00003839][MT6620 5931][P2P] Feature migration
- * Fix compile error while enable WIFI_DIRECT support.
- *
- * 06 21 2010 yuche.tsai
- * [WPD00003839][MT6620 5931][P2P] Feature migration
- * Update P2P Function call.
- *
- * 06 17 2010 yuche.tsai
- * [WPD00003839][MT6620 5931][P2P] Feature migration
- * First draft for migration P2P FSM from FW to Driver.
- *
- * 04 19 2010 kevin.huang
- * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
- * Add Beacon Timeout Support and will send Null frame to diagnose connection
- *
- * 03 18 2010 kevin.huang
- * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
- * Rename CFG flag for P2P
- *
- * 02 26 2010 kevin.huang
- * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
- * Add code to test P2P GO
- *
- * 02 23 2010 kevin.huang
- * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
- * Add Wi-Fi Direct SSID and P2P GO Test Mode
- *
- * 02 05 2010 kevin.huang
- * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
- * Modify code due to BAND_24G define was changed
- *
- * 02 05 2010 kevin.huang
- * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
- * Revise data structure to share the same BSS_INFO_T for avoiding coding error
- *
- * 02 04 2010 kevin.huang
- * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
- * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
- */
- /*******************************************************************************
- * C O M P I L E R F L A G S
- ********************************************************************************
- */
- /*******************************************************************************
- * E X T E R N A L R E F E R E N C E S
- ********************************************************************************
- */
- #include "precomp.h"
- #if CFG_ENABLE_WIFI_DIRECT
- /*******************************************************************************
- * C O N S T A N T S
- ********************************************************************************
- */
- /*******************************************************************************
- * D A T A T Y P E S
- ********************************************************************************
- */
- /*******************************************************************************
- * P U B L I C D A T A
- ********************************************************************************
- */
- /*******************************************************************************
- * P R I V A T E D A T A
- ********************************************************************************
- */
- #if DBG
- /*lint -save -e64 Type mismatch */
- static PUINT_8 apucDebugP2pState[P2P_STATE_NUM] = {
- (PUINT_8) DISP_STRING("P2P_STATE_IDLE"),
- (PUINT_8) DISP_STRING("P2P_STATE_SCAN"),
- (PUINT_8) DISP_STRING("P2P_STATE_AP_CHANNEL_DETECT"),
- (PUINT_8) DISP_STRING("P2P_STATE_REQING_CHANNEL"),
- (PUINT_8) DISP_STRING("P2P_STATE_CHNL_ON_HAND"),
- (PUINT_8) DISP_STRING("P2P_STATE_GC_JOIN")
- };
- /*lint -restore */
- #else
- static UINT_8 apucDebugP2pState[P2P_STATE_NUM] = {
- P2P_STATE_IDLE,
- P2P_STATE_SCAN,
- P2P_STATE_AP_CHANNEL_DETECT,
- P2P_STATE_REQING_CHANNEL,
- P2P_STATE_CHNL_ON_HAND,
- P2P_STATE_GC_JOIN
- };
- #endif /* DBG */
- /*******************************************************************************
- * M A C R O S
- ********************************************************************************
- */
- /*******************************************************************************
- * F U N C T I O N D E C L A R A T I O N S
- ********************************************************************************
- */
- /*******************************************************************************
- * F U N C T I O N S
- ********************************************************************************
- */
- /* p2pStateXXX : Processing P2P FSM related action.
- * p2pFSMXXX : Control P2P FSM flow.
- * p2pFuncXXX : Function for doing one thing.
- */
- VOID p2pFsmInit(IN P_ADAPTER_T prAdapter)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- do {
- ASSERT_BREAK(prAdapter != NULL);
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- ASSERT_BREAK(prP2pFsmInfo != NULL);
- LINK_INITIALIZE(&(prP2pFsmInfo->rMsgEventQueue));
- LINK_INITIALIZE(&(prP2pBssInfo->rStaRecOfClientList));
- prP2pFsmInfo->eCurrentState = prP2pFsmInfo->ePreviousState = P2P_STATE_IDLE;
- prP2pFsmInfo->prTargetBss = NULL;
- prP2pFsmInfo->fgIsWPSMode = 0;
- cnmTimerInitTimer(prAdapter,
- &(prAdapter->rP2pFsmTimeoutTimer),
- (PFN_MGMT_TIMEOUT_FUNC) p2pFsmRunEventFsmTimeout, (ULONG) prP2pFsmInfo);
- /* 4 <2> Initiate BSS_INFO_T - common part */
- BSS_INFO_INIT(prAdapter, NETWORK_TYPE_P2P_INDEX);
- /* 4 <2.1> Initiate BSS_INFO_T - Setup HW ID */
- prP2pBssInfo->ucConfigAdHocAPMode = AP_MODE_11G_P2P;
- prP2pBssInfo->ucHwDefaultFixedRateCode = RATE_OFDM_6M;
- prP2pBssInfo->ucNonHTBasicPhyType = (UINT_8)
- rNonHTApModeAttributes[prP2pBssInfo->ucConfigAdHocAPMode].ePhyTypeIndex;
- prP2pBssInfo->u2BSSBasicRateSet =
- rNonHTApModeAttributes[prP2pBssInfo->ucConfigAdHocAPMode].u2BSSBasicRateSet;
- prP2pBssInfo->u2OperationalRateSet =
- rNonHTPhyAttributes[prP2pBssInfo->ucNonHTBasicPhyType].u2SupportedRateSet;
- rateGetDataRatesFromRateSet(prP2pBssInfo->u2OperationalRateSet,
- prP2pBssInfo->u2BSSBasicRateSet,
- prP2pBssInfo->aucAllSupportedRates, &prP2pBssInfo->ucAllSupportedRatesLen);
- prP2pBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
- OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
- if (prP2pBssInfo->prBeacon) {
- prP2pBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
- prP2pBssInfo->prBeacon->ucStaRecIndex = 0xFF; /* NULL STA_REC */
- prP2pBssInfo->prBeacon->ucNetworkType = NETWORK_TYPE_P2P_INDEX;
- } else {
- /* Out of memory. */
- ASSERT(FALSE);
- }
- prP2pBssInfo->eCurrentOPMode = OP_MODE_NUM;
- prP2pBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
- prP2pBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
- prP2pBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
- prP2pBssInfo->ucPrimaryChannel = P2P_DEFAULT_LISTEN_CHANNEL;
- prP2pBssInfo->eBand = BAND_2G4;
- prP2pBssInfo->eBssSCO = CHNL_EXT_SCN;
- if (prAdapter->rWifiVar.fgSupportQoS)
- prP2pBssInfo->fgIsQBSS = TRUE;
- else
- prP2pBssInfo->fgIsQBSS = FALSE;
- SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
- } while (FALSE);
- } /* p2pFsmInit */
- /*----------------------------------------------------------------------------*/
- /*!
- * @brief The function is used to uninitialize the value in P2P_FSM_INFO_T for
- * P2P FSM operation
- *
- * @param (none)
- *
- * @return (none)
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pFsmUninit(IN P_ADAPTER_T prAdapter)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- do {
- ASSERT_BREAK(prAdapter != NULL);
- DEBUGFUNC("p2pFsmUninit()");
- DBGLOG(P2P, INFO, "->p2pFsmUninit()\n");
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- p2pFuncSwitchOPMode(prAdapter, prP2pBssInfo, OP_MODE_P2P_DEVICE, TRUE);
- p2pFsmRunEventAbort(prAdapter, prP2pFsmInfo);
- p2pStateAbort_IDLE(prAdapter, prP2pFsmInfo, P2P_STATE_NUM);
- UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- wlanAcquirePowerControl(prAdapter);
- /* Release all pending CMD queue. */
- DBGLOG(P2P, TRACE, "p2pFsmUninit: wlanProcessCommandQueue, num of element:%d\n",
- (UINT_32) prAdapter->prGlueInfo->rCmdQueue.u4NumElem);
- wlanProcessCommandQueue(prAdapter, &prAdapter->prGlueInfo->rCmdQueue);
- wlanReleasePowerControl(prAdapter);
- /* Release pending mgmt frame,
- * mgmt frame may be pending by CMD without resource.
- */
- kalClearMgmtFramesByNetType(prAdapter->prGlueInfo, NETWORK_TYPE_P2P_INDEX);
- /* Clear PendingCmdQue */
- wlanReleasePendingCMDbyNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX);
- if (prP2pBssInfo->prBeacon) {
- cnmMgtPktFree(prAdapter, prP2pBssInfo->prBeacon);
- prP2pBssInfo->prBeacon = NULL;
- }
- } while (FALSE);
- return;
- } /* end of p2pFsmUninit() */
- VOID p2pFsmStateTransition(IN P_ADAPTER_T prAdapter, IN P_P2P_FSM_INFO_T prP2pFsmInfo, IN ENUM_P2P_STATE_T eNextState)
- {
- BOOLEAN fgIsTransOut = (BOOLEAN) FALSE;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prP2pFsmInfo != NULL));
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
- if (!IS_BSS_ACTIVE(prP2pBssInfo)) {
- if (!cnmP2PIsPermitted(prAdapter))
- return;
- SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- nicActivateNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX);
- }
- fgIsTransOut = fgIsTransOut ? FALSE : TRUE;
- if (!fgIsTransOut) {
- #if DBG
- DBGLOG(P2P, STATE, "TRANSITION: [%s] -> [%s]\n",
- apucDebugP2pState[prP2pFsmInfo->eCurrentState],
- apucDebugP2pState[eNextState]);
- #else
- DBGLOG(P2P, STATE, "[%d] TRANSITION: [%d] -> [%d]\n",
- DBG_P2P_IDX, apucDebugP2pState[prP2pFsmInfo->eCurrentState],
- apucDebugP2pState[eNextState]);
- #endif
- /* Transition into current state. */
- prP2pFsmInfo->ePreviousState = prP2pFsmInfo->eCurrentState;
- prP2pFsmInfo->eCurrentState = eNextState;
- }
- switch (prP2pFsmInfo->eCurrentState) {
- case P2P_STATE_IDLE:
- if (fgIsTransOut)
- p2pStateAbort_IDLE(prAdapter, prP2pFsmInfo, eNextState);
- else
- fgIsTransOut = p2pStateInit_IDLE(prAdapter, prP2pFsmInfo, prP2pBssInfo, &eNextState);
- break;
- case P2P_STATE_SCAN:
- if (fgIsTransOut) {
- /* Scan done / scan canceled. */
- p2pStateAbort_SCAN(prAdapter, prP2pFsmInfo, eNextState);
- } else {
- /* Initial scan request. */
- p2pStateInit_SCAN(prAdapter, prP2pFsmInfo);
- }
- break;
- case P2P_STATE_AP_CHANNEL_DETECT:
- if (fgIsTransOut) {
- /* Scan done */
- /* Get sparse channel result. */
- p2pStateAbort_AP_CHANNEL_DETECT(prAdapter,
- prP2pFsmInfo, prP2pSpecificBssInfo, eNextState);
- }
- else {
- /* Initial passive scan request. */
- p2pStateInit_AP_CHANNEL_DETECT(prAdapter, prP2pFsmInfo);
- }
- break;
- case P2P_STATE_REQING_CHANNEL:
- if (fgIsTransOut) {
- /* Channel on hand / Channel canceled. */
- p2pStateAbort_REQING_CHANNEL(prAdapter, prP2pFsmInfo, eNextState);
- } else {
- /* Initial channel request. */
- p2pFuncAcquireCh(prAdapter, &(prP2pFsmInfo->rChnlReqInfo));
- }
- break;
- case P2P_STATE_CHNL_ON_HAND:
- if (fgIsTransOut) {
- p2pStateAbort_CHNL_ON_HAND(prAdapter, prP2pFsmInfo, prP2pBssInfo, eNextState);
- } else {
- /* Initial channel ready. */
- /* Send channel ready event. */
- /* Start a FSM timer. */
- p2pStateInit_CHNL_ON_HAND(prAdapter, prP2pBssInfo, prP2pFsmInfo);
- }
- break;
- case P2P_STATE_GC_JOIN:
- if (fgIsTransOut) {
- /* Join complete / join canceled. */
- p2pStateAbort_GC_JOIN(prAdapter, prP2pFsmInfo, &(prP2pFsmInfo->rJoinInfo), eNextState);
- } else {
- if (prP2pFsmInfo->prTargetBss == NULL) {
- ASSERT(FALSE);
- } else {
- /* Send request to SAA module. */
- p2pStateInit_GC_JOIN(prAdapter,
- prP2pFsmInfo,
- prP2pBssInfo,
- &(prP2pFsmInfo->rJoinInfo), prP2pFsmInfo->prTargetBss);
- }
- }
- break;
- default:
- break;
- }
- } while (fgIsTransOut);
- } /* p2pFsmStateTransition */
- VOID p2pFsmRunEventSwitchOPMode(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- P_MSG_P2P_SWITCH_OP_MODE_T prSwitchOpMode = (P_MSG_P2P_SWITCH_OP_MODE_T) prMsgHdr;
- P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prSwitchOpMode != NULL));
- DBGLOG(P2P, TRACE, "p2pFsmRunEventSwitchOPMode\n");
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
- if (prSwitchOpMode->eOpMode >= OP_MODE_NUM) {
- ASSERT(FALSE);
- break;
- }
- /* P2P Device / GC. */
- p2pFuncSwitchOPMode(prAdapter, prP2pBssInfo, prSwitchOpMode->eOpMode, TRUE);
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventSwitchOPMode */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This function is used to handle scan done event during Device Discovery.
- *
- * \param[in] prAdapter Pointer of ADAPTER_T
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pFsmRunEventScanDone(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_P2P_SCAN_REQ_INFO_T prScanReqInfo = (P_P2P_SCAN_REQ_INFO_T) NULL;
- P_MSG_SCN_SCAN_DONE prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) NULL;
- ENUM_P2P_STATE_T eNextState = P2P_STATE_NUM;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- /* This scan done event is either for "SCAN" phase or "SEARCH" state or "LISTEN" state.
- * The scan done for SCAN phase & SEARCH state doesn't imply Device
- * Discovery over.
- */
- DBGLOG(P2P, TRACE, "P2P Scan Done Event\n");
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prScanReqInfo = &(prP2pFsmInfo->rScanReqInfo);
- prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
- if (prScanDoneMsg->ucSeqNum != prScanReqInfo->ucSeqNumOfScnMsg) {
- /* Scan Done message sequence number mismatch.
- * Ignore this event. (P2P FSM issue two scan events.)
- */
- /* The scan request has been cancelled.
- * Ignore this message. It is possible.
- */
- DBGLOG(P2P, TRACE, "P2P Scan Don SeqNum:%d <-> P2P Fsm SCAN Msg:%d\n",
- prScanDoneMsg->ucSeqNum, prScanReqInfo->ucSeqNumOfScnMsg);
- break;
- }
- switch (prP2pFsmInfo->eCurrentState) {
- case P2P_STATE_SCAN:
- {
- P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo = &(prP2pFsmInfo->rConnReqInfo);
- prScanReqInfo->fgIsAbort = FALSE;
- if (prConnReqInfo->fgIsConnRequest) {
- prP2pFsmInfo->prTargetBss = p2pFuncKeepOnConnection(prAdapter,
- &prP2pFsmInfo->rConnReqInfo,
- &prP2pFsmInfo->rChnlReqInfo,
- &prP2pFsmInfo->rScanReqInfo);
- if (prP2pFsmInfo->prTargetBss == NULL)
- eNextState = P2P_STATE_SCAN;
- else
- eNextState = P2P_STATE_REQING_CHANNEL;
- } else {
- eNextState = P2P_STATE_IDLE;
- }
- }
- break;
- case P2P_STATE_AP_CHANNEL_DETECT:
- eNextState = P2P_STATE_REQING_CHANNEL;
- break;
- default:
- /* Unexpected channel scan done event without being chanceled. */
- ASSERT(FALSE);
- break;
- }
- prScanReqInfo->fgIsScanRequest = FALSE;
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, eNextState);
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventScanDone */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This function is call when channel is granted by CNM module from FW.
- *
- * \param[in] prAdapter Pointer of ADAPTER_T
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pFsmRunEventChGrant(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
- P_MSG_CH_GRANT_T prMsgChGrant = (P_MSG_CH_GRANT_T) NULL;
- UINT_8 ucTokenID = 0;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- DBGLOG(P2P, TRACE, "P2P Run Event Channel Grant\n");
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prMsgChGrant = (P_MSG_CH_GRANT_T) prMsgHdr;
- ucTokenID = prMsgChGrant->ucTokenID;
- prP2pFsmInfo->u4GrantInterval = prMsgChGrant->u4GrantInterval;
- prChnlReqInfo = &(prP2pFsmInfo->rChnlReqInfo);
- if (ucTokenID == prChnlReqInfo->ucSeqNumOfChReq) {
- ENUM_P2P_STATE_T eNextState = P2P_STATE_NUM;
- switch (prP2pFsmInfo->eCurrentState) {
- case P2P_STATE_REQING_CHANNEL:
- switch (prChnlReqInfo->eChannelReqType) {
- case CHANNEL_REQ_TYPE_REMAIN_ON_CHANNEL:
- eNextState = P2P_STATE_CHNL_ON_HAND;
- break;
- case CHANNEL_REQ_TYPE_GC_JOIN_REQ:
- eNextState = P2P_STATE_GC_JOIN;
- break;
- case CHANNEL_REQ_TYPE_GO_START_BSS:
- eNextState = P2P_STATE_IDLE;
- break;
- default:
- break;
- }
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, eNextState);
- break;
- default:
- /* Channel is granted under unexpected state.
- * Driver should cancel channel privileagea before leaving the states.
- */
- ASSERT(FALSE);
- break;
- }
- } else {
- /* Channel requsted, but released. */
- /* ASSERT(!prChnlReqInfo->fgIsChannelRequested); */
- DBGLOG(P2P, TRACE, "Channel requsted, but released\n");
- }
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- return;
- } /* p2pFsmRunEventChGrant */
- VOID p2pFsmRunEventChannelRequest(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
- P_MSG_P2P_CHNL_REQUEST_T prP2pChnlReqMsg = (P_MSG_P2P_CHNL_REQUEST_T) NULL;
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- ENUM_P2P_STATE_T eNextState = P2P_STATE_NUM;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- prP2pChnlReqMsg = (P_MSG_P2P_CHNL_REQUEST_T) prMsgHdr;
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prChnlReqInfo = &(prP2pFsmInfo->rChnlReqInfo);
- DBGLOG(P2P, TRACE, "p2pFsmRunEventChannelRequest\n");
- /* Special case of time renewing for same frequency. */
- if ((prP2pFsmInfo->eCurrentState == P2P_STATE_CHNL_ON_HAND) &&
- (prChnlReqInfo->ucReqChnlNum == prP2pChnlReqMsg->rChannelInfo.ucChannelNum) &&
- (prChnlReqInfo->eBand == prP2pChnlReqMsg->rChannelInfo.eBand) &&
- (prChnlReqInfo->eChnlSco == prP2pChnlReqMsg->eChnlSco)) {
- ASSERT(prChnlReqInfo->fgIsChannelRequested == TRUE);
- ASSERT(prChnlReqInfo->eChannelReqType == CHANNEL_REQ_TYPE_REMAIN_ON_CHANNEL);
- prChnlReqInfo->u8Cookie = prP2pChnlReqMsg->u8Cookie;
- prChnlReqInfo->u4MaxInterval = prP2pChnlReqMsg->u4Duration;
- /* Re-enter the state. */
- eNextState = P2P_STATE_CHNL_ON_HAND;
- } else {
- /* Make sure the state is in IDLE state. */
- p2pFsmRunEventAbort(prAdapter, prP2pFsmInfo);
- /* Cookie can only be assign after abort.(for indication) */
- prChnlReqInfo->u8Cookie = prP2pChnlReqMsg->u8Cookie;
- prChnlReqInfo->ucReqChnlNum = prP2pChnlReqMsg->rChannelInfo.ucChannelNum;
- prChnlReqInfo->eBand = prP2pChnlReqMsg->rChannelInfo.eBand;
- prChnlReqInfo->eChnlSco = prP2pChnlReqMsg->eChnlSco;
- prChnlReqInfo->u4MaxInterval = prP2pChnlReqMsg->u4Duration;
- prChnlReqInfo->eChannelReqType = CHANNEL_REQ_TYPE_REMAIN_ON_CHANNEL;
- eNextState = P2P_STATE_REQING_CHANNEL;
- }
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, eNextState);
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventChannelRequest */
- VOID p2pFsmRunEventChannelAbort(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_MSG_P2P_CHNL_ABORT_T prChnlAbortMsg = (P_MSG_P2P_CHNL_ABORT_T) NULL;
- P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- prChnlAbortMsg = (P_MSG_P2P_CHNL_ABORT_T) prMsgHdr;
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prChnlReqInfo = &prP2pFsmInfo->rChnlReqInfo;
- DBGLOG(P2P, TRACE, "p2pFsmRunEventChannelAbort\n");
- if ((prChnlAbortMsg->u8Cookie == prChnlReqInfo->u8Cookie) && (prChnlReqInfo->fgIsChannelRequested)) {
- ASSERT((prP2pFsmInfo->eCurrentState == P2P_STATE_REQING_CHANNEL ||
- (prP2pFsmInfo->eCurrentState == P2P_STATE_CHNL_ON_HAND)));
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
- }
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventChannelAbort */
- VOID p2pFsmRunEventScanRequest(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_MSG_P2P_SCAN_REQUEST_T prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) NULL;
- P_P2P_SCAN_REQ_INFO_T prScanReqInfo = (P_P2P_SCAN_REQ_INFO_T) NULL;
- UINT_32 u4ChnlListSize = 0;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) prMsgHdr;
- prScanReqInfo = &(prP2pFsmInfo->rScanReqInfo);
- DBGLOG(P2P, TRACE, "p2pFsmRunEventScanRequest\n");
- /* Make sure the state is in IDLE state. */
- p2pFsmRunEventAbort(prAdapter, prP2pFsmInfo);
- ASSERT(prScanReqInfo->fgIsScanRequest == FALSE);
- prScanReqInfo->fgIsAbort = TRUE;
- prScanReqInfo->eScanType = SCAN_TYPE_ACTIVE_SCAN;
- prScanReqInfo->eChannelSet = SCAN_CHANNEL_SPECIFIED;
- /* Channel List */
- prScanReqInfo->ucNumChannelList = prP2pScanReqMsg->u4NumChannel;
- DBGLOG(P2P, TRACE, "Scan Request Channel List Number: %d\n", prScanReqInfo->ucNumChannelList);
- if (prScanReqInfo->ucNumChannelList > MAXIMUM_OPERATION_CHANNEL_LIST) {
- DBGLOG(P2P, TRACE, "Channel List Number Overloaded: %d, change to: %d\n",
- prScanReqInfo->ucNumChannelList, MAXIMUM_OPERATION_CHANNEL_LIST);
- prScanReqInfo->ucNumChannelList = MAXIMUM_OPERATION_CHANNEL_LIST;
- }
- u4ChnlListSize = sizeof(RF_CHANNEL_INFO_T) * prScanReqInfo->ucNumChannelList;
- kalMemCopy(prScanReqInfo->arScanChannelList, prP2pScanReqMsg->arChannelListInfo, u4ChnlListSize);
- /* TODO: I only take the first SSID. Multiple SSID may be needed in the future. */
- /* SSID */
- if (prP2pScanReqMsg->i4SsidNum >= 1)
- kalMemCopy(&(prScanReqInfo->rSsidStruct), prP2pScanReqMsg->prSSID, sizeof(P2P_SSID_STRUCT_T));
- else
- prScanReqInfo->rSsidStruct.ucSsidLen = 0;
- /* IE Buffer */
- kalMemCopy(prScanReqInfo->aucIEBuf, prP2pScanReqMsg->pucIEBuf, prP2pScanReqMsg->u4IELen);
- prScanReqInfo->u4BufLength = prP2pScanReqMsg->u4IELen;
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_SCAN);
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventScanRequest */
- VOID p2pFsmRunEventScanAbort(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- do {
- ASSERT_BREAK(prAdapter != NULL);
- DBGLOG(P2P, TRACE, "p2pFsmRunEventScanAbort\n");
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo->eCurrentState == P2P_STATE_SCAN) {
- P_P2P_SCAN_REQ_INFO_T prScanReqInfo = &(prP2pFsmInfo->rScanReqInfo);
- prScanReqInfo->fgIsAbort = TRUE;
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
- }
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventScanAbort */
- VOID p2pFsmRunEventAbort(IN P_ADAPTER_T prAdapter, IN P_P2P_FSM_INFO_T prP2pFsmInfo)
- {
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prP2pFsmInfo != NULL));
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- DBGLOG(P2P, TRACE, "p2pFsmRunEventAbort\n");
- if (prP2pFsmInfo->eCurrentState != P2P_STATE_IDLE) {
- if (prP2pFsmInfo->eCurrentState == P2P_STATE_SCAN) {
- P_P2P_SCAN_REQ_INFO_T prScanReqInfo = &(prP2pFsmInfo->rScanReqInfo);
- prScanReqInfo->fgIsAbort = TRUE;
- } else if (prP2pFsmInfo->eCurrentState == P2P_STATE_REQING_CHANNEL) {
- /* 2012/08/06: frog
- * Prevent Start GO.
- */
- prP2pBssInfo->eIntendOPMode = OP_MODE_NUM;
- }
- /* For other state, is there any special action that should be take before leaving? */
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
- } else {
- /* P2P State IDLE. */
- P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = &(prP2pFsmInfo->rChnlReqInfo);
- if (prChnlReqInfo->fgIsChannelRequested)
- p2pFuncReleaseCh(prAdapter, prChnlReqInfo);
- cnmTimerStopTimer(prAdapter, &(prAdapter->rP2pFsmTimeoutTimer));
- }
- } while (FALSE);
- } /* p2pFsmRunEventAbort */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This function is used to handle FSM Timeout.
- *
- * \param[in] prAdapter Pointer of ADAPTER_T
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pFsmRunEventFsmTimeout(IN P_ADAPTER_T prAdapter, IN ULONG ulParam)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) ulParam;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prP2pFsmInfo != NULL));
- DBGLOG(P2P, TRACE, "P2P FSM Timeout Event\n");
- switch (prP2pFsmInfo->eCurrentState) {
- case P2P_STATE_IDLE:
- {
- P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = &prP2pFsmInfo->rChnlReqInfo;
- if (prChnlReqInfo->fgIsChannelRequested) {
- p2pFuncReleaseCh(prAdapter, prChnlReqInfo);
- } else if (IS_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_P2P_INDEX)) {
- UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- nicDeactivateNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX);
- }
- }
- break;
- /* case P2P_STATE_SCAN: */
- /* break; */
- /* case P2P_STATE_AP_CHANNEL_DETECT: */
- /* break; */
- /* case P2P_STATE_REQING_CHANNEL: */
- /* break; */
- case P2P_STATE_CHNL_ON_HAND:
- {
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
- }
- break;
- /* case P2P_STATE_GC_JOIN: */
- /* break; */
- default:
- break;
- }
- } while (FALSE);
- } /* p2pFsmRunEventFsmTimeout */
- VOID p2pFsmRunEventMgmtFrameTx(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_MSG_P2P_MGMT_TX_REQUEST_T prMgmtTxMsg = (P_MSG_P2P_MGMT_TX_REQUEST_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- DBGLOG(P2P, TRACE, "p2pFsmRunEventMgmtFrameTx\n");
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prMgmtTxMsg = (P_MSG_P2P_MGMT_TX_REQUEST_T) prMsgHdr;
- p2pFuncTxMgmtFrame(prAdapter,
- &prP2pFsmInfo->rMgmtTxInfo, prMgmtTxMsg->prMgmtMsduInfo, prMgmtTxMsg->u8Cookie);
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- return;
- } /* p2pFsmRunEventMgmtTx */
- VOID p2pFsmRunEventStartAP(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- P_MSG_P2P_START_AP_T prP2pStartAPMsg = (P_MSG_P2P_START_AP_T) NULL;
- P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- DBGLOG(P2P, TRACE, "p2pFsmRunEventStartAP\n");
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- prP2pStartAPMsg = (P_MSG_P2P_START_AP_T) prMsgHdr;
- prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
- if (prP2pStartAPMsg->u4BcnInterval) {
- DBGLOG(P2P, TRACE, "Beacon interval updated to :%u\n", prP2pStartAPMsg->u4BcnInterval);
- prP2pBssInfo->u2BeaconInterval = (UINT_16) prP2pStartAPMsg->u4BcnInterval;
- } else if (prP2pBssInfo->u2BeaconInterval == 0) {
- prP2pBssInfo->u2BeaconInterval = DOT11_BEACON_PERIOD_DEFAULT;
- }
- if (prP2pStartAPMsg->u4DtimPeriod) {
- DBGLOG(P2P, TRACE, "DTIM interval updated to :%u\n", prP2pStartAPMsg->u4DtimPeriod);
- prP2pBssInfo->ucDTIMPeriod = (UINT_8) prP2pStartAPMsg->u4DtimPeriod;
- } else if (prP2pBssInfo->ucDTIMPeriod == 0) {
- prP2pBssInfo->ucDTIMPeriod = DOT11_DTIM_PERIOD_DEFAULT;
- }
- if (prP2pStartAPMsg->u2SsidLen != 0) {
- kalMemCopy(prP2pBssInfo->aucSSID, prP2pStartAPMsg->aucSsid, prP2pStartAPMsg->u2SsidLen);
- kalMemCopy(prP2pSpecificBssInfo->aucGroupSsid, prP2pStartAPMsg->aucSsid,
- prP2pStartAPMsg->u2SsidLen);
- prP2pBssInfo->ucSSIDLen = prP2pSpecificBssInfo->u2GroupSsidLen = prP2pStartAPMsg->u2SsidLen;
- }
- prP2pBssInfo->eHiddenSsidType = prP2pStartAPMsg->ucHiddenSsidType;
- /* TODO: JB */
- /* Privacy & inactive timeout. */
- if ((prP2pBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT) ||
- (prP2pBssInfo->eIntendOPMode != OP_MODE_NUM)) {
- UINT_8 ucPreferedChnl = 0;
- ENUM_BAND_T eBand = BAND_NULL;
- ENUM_CHNL_EXT_T eSco = CHNL_EXT_SCN;
- ENUM_P2P_STATE_T eNextState = P2P_STATE_SCAN;
- P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
- if (prP2pFsmInfo->eCurrentState != P2P_STATE_SCAN &&
- prP2pFsmInfo->eCurrentState != P2P_STATE_IDLE) {
- /* Make sure the state is in IDLE state. */
- p2pFsmRunEventAbort(prAdapter, prP2pFsmInfo);
- }
- prAdapter->rWifiVar.prP2pFsmInfo->rScanReqInfo.fgIsGOInitialDone = 0;
- DBGLOG(P2P, INFO,
- "NFC:p2pFsmRunEventStartAP,fgIsGOInitialDone[%d]\n",
- prAdapter->rWifiVar.prP2pFsmInfo->rScanReqInfo.fgIsGOInitialDone);
- /* 20120118: Moved to p2pFuncSwitchOPMode(). */
- /* SET_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX); */
- /* Leave IDLE state. */
- SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- /* sync with firmware */
- /* DBGLOG(P2P, INFO, ("Activate P2P Network.\n")); */
- /* nicActivateNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX); */
- /* Key to trigger P2P FSM to allocate channel for AP mode. */
- prP2pBssInfo->eIntendOPMode = OP_MODE_ACCESS_POINT;
- /* Sparse Channel to decide which channel to use. */
- if ((cnmPreferredChannel(prAdapter,
- &eBand,
- &ucPreferedChnl,
- &eSco) == FALSE) && (prP2pConnSettings->ucOperatingChnl == 0)) {
- /* Sparse Channel Detection using passive mode. */
- eNextState = P2P_STATE_AP_CHANNEL_DETECT;
- } else {
- P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo =
- prAdapter->rWifiVar.prP2pSpecificBssInfo;
- P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = &prP2pFsmInfo->rChnlReqInfo;
- #if 1
- /* 2012-01-27: frog - Channel set from upper layer is the first priority. */
- /* Because the channel & beacon is decided by p2p_supplicant. */
- if (prP2pConnSettings->ucOperatingChnl != 0) {
- prP2pSpecificBssInfo->ucPreferredChannel = prP2pConnSettings->ucOperatingChnl;
- prP2pSpecificBssInfo->eRfBand = prP2pConnSettings->eBand;
- }
- else {
- ASSERT(ucPreferedChnl != 0);
- prP2pSpecificBssInfo->ucPreferredChannel = ucPreferedChnl;
- prP2pSpecificBssInfo->eRfBand = eBand;
- }
- #else
- if (ucPreferedChnl) {
- prP2pSpecificBssInfo->ucPreferredChannel = ucPreferedChnl;
- prP2pSpecificBssInfo->eRfBand = eBand;
- } else {
- ASSERT(prP2pConnSettings->ucOperatingChnl != 0);
- prP2pSpecificBssInfo->ucPreferredChannel = prP2pConnSettings->ucOperatingChnl;
- prP2pSpecificBssInfo->eRfBand = prP2pConnSettings->eBand;
- }
- #endif
- prChnlReqInfo->ucReqChnlNum = prP2pSpecificBssInfo->ucPreferredChannel;
- prChnlReqInfo->eBand = prP2pSpecificBssInfo->eRfBand;
- prChnlReqInfo->eChannelReqType = CHANNEL_REQ_TYPE_GO_START_BSS;
- DBGLOG(P2P, INFO, "p2pFsmRunEventStartAP GO Scan\n");
- }
- /* If channel is specified, use active scan to shorten the scan time. */
- p2pFsmStateTransition(prAdapter, prAdapter->rWifiVar.prP2pFsmInfo, eNextState);
- }
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventStartAP */
- VOID p2pFsmRunEventNetDeviceRegister(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_MSG_P2P_NETDEV_REGISTER_T prNetDevRegisterMsg = (P_MSG_P2P_NETDEV_REGISTER_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- DBGLOG(P2P, TRACE, "p2pFsmRunEventNetDeviceRegister\n");
- prNetDevRegisterMsg = (P_MSG_P2P_NETDEV_REGISTER_T) prMsgHdr;
- if (prNetDevRegisterMsg->fgIsEnable) {
- p2pSetMode((prNetDevRegisterMsg->ucMode == 1) ? TRUE : FALSE);
- if (p2pLaunch(prAdapter->prGlueInfo))
- ASSERT(prAdapter->fgIsP2PRegistered);
- } else {
- if (prAdapter->fgIsP2PRegistered)
- p2pRemove(prAdapter->prGlueInfo);
- }
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventNetDeviceRegister */
- VOID p2pFsmRunEventUpdateMgmtFrame(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_MSG_P2P_MGMT_FRAME_UPDATE_T prP2pMgmtFrameUpdateMsg = (P_MSG_P2P_MGMT_FRAME_UPDATE_T) NULL;
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- DBGLOG(P2P, TRACE, "p2pFsmRunEventUpdateMgmtFrame\n");
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prP2pMgmtFrameUpdateMsg = (P_MSG_P2P_MGMT_FRAME_UPDATE_T) prMsgHdr;
- switch (prP2pMgmtFrameUpdateMsg->eBufferType) {
- case ENUM_FRAME_TYPE_EXTRA_IE_BEACON:
- break;
- case ENUM_FRAME_TYPE_EXTRA_IE_ASSOC_RSP:
- break;
- case ENUM_FRAME_TYPE_EXTRA_IE_PROBE_RSP:
- break;
- case ENUM_FRAME_TYPE_PROBE_RSP_TEMPLATE:
- break;
- case ENUM_FRAME_TYPE_BEACON_TEMPLATE:
- break;
- default:
- break;
- }
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventUpdateMgmtFrame */
- VOID p2pFsmRunEventBeaconUpdate(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- P_MSG_P2P_BEACON_UPDATE_T prBcnUpdateMsg = (P_MSG_P2P_BEACON_UPDATE_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- DBGLOG(P2P, TRACE, "p2pFsmRunEventBeaconUpdate\n");
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- prBcnUpdateMsg = (P_MSG_P2P_BEACON_UPDATE_T) prMsgHdr;
- p2pFuncBeaconUpdate(prAdapter,
- prP2pBssInfo,
- &prP2pFsmInfo->rBcnContentInfo,
- prBcnUpdateMsg->pucBcnHdr,
- prBcnUpdateMsg->u4BcnHdrLen,
- prBcnUpdateMsg->pucBcnBody, prBcnUpdateMsg->u4BcnBodyLen);
- if ((prP2pBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT) &&
- (prP2pBssInfo->eIntendOPMode == OP_MODE_NUM)) {
- /* AP is created, Beacon Update. */
- /* nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_P2P_INDEX); */
- bssUpdateBeaconContent(prAdapter, NETWORK_TYPE_P2P_INDEX);
- /* nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_P2P_INDEX); */
- }
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventBeaconUpdate */
- VOID p2pFsmRunEventStopAP(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL));
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- DBGLOG(P2P, TRACE, "p2pFsmRunEventStopAP\n");
- if ((prP2pBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT)
- && (prP2pBssInfo->eIntendOPMode == OP_MODE_NUM)) {
- /* AP is created, Beacon Update. */
- p2pFuncDissolve(prAdapter, prP2pBssInfo, TRUE, REASON_CODE_DEAUTH_LEAVING_BSS);
- DBGLOG(P2P, TRACE, "Stop Beaconing\n");
- nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_P2P_INDEX);
- /* Reset RLM related field of BSSINFO. */
- rlmBssAborted(prAdapter, prP2pBssInfo);
- }
- /* 20120118: Moved to p2pFuncSwitchOPMode(). */
- /* UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX); */
- /* Enter IDLE state. */
- SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- DBGLOG(P2P, INFO, "Re activate P2P Network.\n");
- nicDeactivateNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX);
- nicActivateNetwork(prAdapter, NETWORK_TYPE_P2P_INDEX);
- #if CFG_SUPPORT_WFD
- p2pFsmRunEventWfdSettingUpdate(prAdapter, NULL);
- #endif
- /* p2pFsmRunEventAbort(prAdapter, prAdapter->rWifiVar.prP2pFsmInfo); */
- p2pFsmStateTransition(prAdapter, prAdapter->rWifiVar.prP2pFsmInfo, P2P_STATE_IDLE);
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventStopAP */
- VOID p2pFsmRunEventConnectionRequest(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
- P_MSG_P2P_CONNECTION_REQUEST_T prConnReqMsg = (P_MSG_P2P_CONNECTION_REQUEST_T) NULL;
- P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo = (P_P2P_CONNECTION_REQ_INFO_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prConnReqMsg = (P_MSG_P2P_CONNECTION_REQUEST_T) prMsgHdr;
- prConnReqInfo = &(prP2pFsmInfo->rConnReqInfo);
- prChnlReqInfo = &(prP2pFsmInfo->rChnlReqInfo);
- DBGLOG(P2P, TRACE, "p2pFsmRunEventConnectionRequest\n");
- if (prP2pBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE)
- break;
- SET_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- /* Make sure the state is in IDLE state. */
- p2pFsmRunEventAbort(prAdapter, prP2pFsmInfo);
- /* Update connection request information. */
- prConnReqInfo->fgIsConnRequest = TRUE;
- COPY_MAC_ADDR(prConnReqInfo->aucBssid, prConnReqMsg->aucBssid);
- kalMemCopy(&(prConnReqInfo->rSsidStruct), &(prConnReqMsg->rSsid), sizeof(P2P_SSID_STRUCT_T));
- kalMemCopy(prConnReqInfo->aucIEBuf, prConnReqMsg->aucIEBuf, prConnReqMsg->u4IELen);
- prConnReqInfo->u4BufLength = prConnReqMsg->u4IELen;
- /* Find BSS Descriptor first. */
- prP2pFsmInfo->prTargetBss = scanP2pSearchDesc(prAdapter, prP2pBssInfo, prConnReqInfo);
- if (prP2pFsmInfo->prTargetBss == NULL) {
- /* Update scan parameter... to scan target device. */
- P_P2P_SCAN_REQ_INFO_T prScanReqInfo = &(prP2pFsmInfo->rScanReqInfo);
- DBGLOG(P2P, INFO, "p2pFsmRunEventConnectionRequest,Trigger New Scan\n");
- prScanReqInfo->ucNumChannelList = 1;
- prScanReqInfo->eScanType = SCAN_TYPE_ACTIVE_SCAN;
- prScanReqInfo->eChannelSet = SCAN_CHANNEL_SPECIFIED;
- prScanReqInfo->arScanChannelList[0].ucChannelNum = prConnReqMsg->rChannelInfo.ucChannelNum;
- kalMemCopy(&(prScanReqInfo->rSsidStruct), &(prConnReqMsg->rSsid), sizeof(P2P_SSID_STRUCT_T));
- prScanReqInfo->u4BufLength = 0; /* Prevent other P2P ID in IE. */
- prScanReqInfo->fgIsAbort = TRUE;
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_SCAN);
- } else {
- prChnlReqInfo->u8Cookie = 0;
- prChnlReqInfo->ucReqChnlNum = prConnReqMsg->rChannelInfo.ucChannelNum;
- prChnlReqInfo->eBand = prConnReqMsg->rChannelInfo.eBand;
- prChnlReqInfo->eChnlSco = prConnReqMsg->eChnlSco;
- prChnlReqInfo->u4MaxInterval = AIS_JOIN_CH_REQUEST_INTERVAL;
- prChnlReqInfo->eChannelReqType = CHANNEL_REQ_TYPE_GC_JOIN_REQ;
- DBGLOG(P2P, INFO, "p2pFsmRunEventConnectionRequest, Report the Connecting BSS Again.\n");
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_REQING_CHANNEL);
- }
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- return;
- } /* p2pFsmRunEventConnectionRequest */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This function is used to handle Connection Request from Supplicant.
- *
- * \param[in] prAdapter Pointer of ADAPTER_T
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pFsmRunEventConnectionAbort(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- P_MSG_P2P_CONNECTION_ABORT_T prDisconnMsg = (P_MSG_P2P_CONNECTION_ABORT_T) NULL;
- /* P_STA_RECORD_T prTargetStaRec = (P_STA_RECORD_T)NULL; */
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- DBGLOG(P2P, TRACE, "p2pFsmRunEventConnectionAbort: Connection Abort.\n");
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- prDisconnMsg = (P_MSG_P2P_CONNECTION_ABORT_T) prMsgHdr;
- switch (prP2pBssInfo->eCurrentOPMode) {
- case OP_MODE_INFRASTRUCTURE:
- {
- UINT_8 aucBCBSSID[] = BC_BSSID;
- if (!prP2pBssInfo->prStaRecOfAP) {
- DBGLOG(P2P, TRACE, "GO's StaRec is NULL\n");
- break;
- }
- if (UNEQUAL_MAC_ADDR(prP2pBssInfo->prStaRecOfAP->aucMacAddr, prDisconnMsg->aucTargetID)
- && UNEQUAL_MAC_ADDR(prDisconnMsg->aucTargetID, aucBCBSSID)) {
- DBGLOG(P2P, TRACE,
- "Unequal MAC ADDR [ %pM : %pM ]\n",
- prP2pBssInfo->prStaRecOfAP->aucMacAddr,
- prDisconnMsg->aucTargetID);
- break;
- }
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo, NULL, NULL, 0, 0,
- WLAN_STATUS_MEDIA_DISCONNECT_LOCALLY);
- /* Stop rejoin timer if it is started. */
- /* TODO: If it has. */
- p2pFuncDisconnect(prAdapter, prP2pBssInfo->prStaRecOfAP, prDisconnMsg->fgSendDeauth,
- prDisconnMsg->u2ReasonCode);
- /* prTargetStaRec = prP2pBssInfo->prStaRecOfAP; */
- /* Fix possible KE when RX Beacon & call nicPmIndicateBssConnected(). */
- /* hit prStaRecOfAP == NULL. */
- p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
- prP2pBssInfo->prStaRecOfAP = NULL;
- SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
- }
- break;
- case OP_MODE_ACCESS_POINT:
- {
- P_LINK_T prStaRecOfClientList = &prP2pBssInfo->rStaRecOfClientList;
- /* Search specific client device, and disconnect. */
- /* 1. Send deauthentication frame. */
- /* 2. Indication: Device disconnect. */
- P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
- P_STA_RECORD_T prCurrStaRec = (P_STA_RECORD_T) NULL;
- DBGLOG(P2P, TRACE,
- "Disconnecting with Target ID: %pM\n",
- prDisconnMsg->aucTargetID);
- LINK_FOR_EACH(prLinkEntry, prStaRecOfClientList) {
- prCurrStaRec = LINK_ENTRY(prLinkEntry, STA_RECORD_T, rLinkEntry);
- ASSERT(prCurrStaRec);
- if (EQUAL_MAC_ADDR(prCurrStaRec->aucMacAddr, prDisconnMsg->aucTargetID)) {
- DBGLOG(P2P, TRACE,
- "Disconnecting: %pM\n",
- prCurrStaRec->aucMacAddr);
- /* Remove STA from client list. */
- LINK_REMOVE_KNOWN_ENTRY(prStaRecOfClientList,
- &prCurrStaRec->rLinkEntry);
- /* Glue layer indication. */
- /* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prCurrStaRec, FALSE); */
- /* Send deauth & do indication. */
- p2pFuncDisconnect(prAdapter, prCurrStaRec, prDisconnMsg->fgSendDeauth,
- prDisconnMsg->u2ReasonCode);
- /* prTargetStaRec = prCurrStaRec; */
- break;
- }
- }
- }
- break;
- case OP_MODE_P2P_DEVICE:
- default:
- ASSERT(FALSE);
- break;
- }
- } while (FALSE);
- /* 20120830 moved into p2pFuncDisconnect() */
- /* if ((!prDisconnMsg->fgSendDeauth) && (prTargetStaRec)) { */
- /* cnmStaRecFree(prAdapter, prTargetStaRec, TRUE); */
- /* } */
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventConnectionAbort */
- VOID p2pFsmRunEventDissolve(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- /* TODO: */
- DBGLOG(P2P, TRACE, "p2pFsmRunEventDissolve\n");
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- }
- WLAN_STATUS
- p2pFsmRunEventDeauthTxDone(IN P_ADAPTER_T prAdapter,
- IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
- {
- P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- ENUM_PARAM_MEDIA_STATE_T eOriMediaStatus;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
- DBGLOG(P2P, INFO, "Deauth TX Done Status: %d, seqNo %d\n",
- rTxDoneStatus, prMsduInfo->ucTxSeqNum);
- prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
- if (prStaRec == NULL) {
- DBGLOG(P2P, TRACE, "Station Record NULL, Index:%d\n", prMsduInfo->ucStaRecIndex);
- break;
- }
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- eOriMediaStatus = prP2pBssInfo->eConnectionState;
- /* Change station state. */
- cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
- /* Reset Station Record Status. */
- p2pFuncResetStaRecStatus(prAdapter, prStaRec);
- bssRemoveStaRecFromClientList(prAdapter, prP2pBssInfo, prStaRec);
- /**/ cnmStaRecFree(prAdapter, prStaRec, TRUE);
- if ((prP2pBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT) ||
- (prP2pBssInfo->rStaRecOfClientList.u4NumElem == 0)) {
- DBGLOG(P2P, TRACE, "No More Client, Media Status DISCONNECTED\n");
- p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
- }
- /* Because the eConnectionState is changed before Deauth TxDone. Dont Check eConnectionState */
- /* if (eOriMediaStatus != prP2pBssInfo->eConnectionState) { */
- /* Update Disconnected state to FW. */
- nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX);
- /* } */
- } while (FALSE);
- return WLAN_STATUS_SUCCESS;
- } /* p2pFsmRunEventDeauthTxDone */
- WLAN_STATUS
- p2pFsmRunEventMgmtFrameTxDone(IN P_ADAPTER_T prAdapter,
- IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_P2P_MGMT_TX_REQ_INFO_T prMgmtTxReqInfo = (P_P2P_MGMT_TX_REQ_INFO_T) NULL;
- BOOLEAN fgIsSuccess = FALSE;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- prMgmtTxReqInfo = &(prP2pFsmInfo->rMgmtTxInfo);
- if (rTxDoneStatus != TX_RESULT_SUCCESS) {
- DBGLOG(P2P, INFO, "Mgmt Frame TX Fail, Status: %d, seq NO. %d, Cookie: 0x%llx\n",
- rTxDoneStatus, prMsduInfo->ucTxSeqNum, prMgmtTxReqInfo->u8Cookie);
- } else {
- fgIsSuccess = TRUE;
- DBGLOG(P2P, TRACE, "Mgmt Frame TX Done.\n");
- }
- if (prMgmtTxReqInfo->prMgmtTxMsdu == prMsduInfo) {
- kalP2PIndicateMgmtTxStatus(prAdapter->prGlueInfo,
- prMgmtTxReqInfo->u8Cookie,
- fgIsSuccess,
- prMsduInfo->prPacket, (UINT_32) prMsduInfo->u2FrameLength);
- prMgmtTxReqInfo->prMgmtTxMsdu = NULL;
- }
- } while (FALSE);
- return WLAN_STATUS_SUCCESS;
- } /* p2pFsmRunEventMgmtFrameTxDone */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This function is called when JOIN complete message event is received from SAA.
- *
- * \param[in] prAdapter Pointer of ADAPTER_T
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pFsmRunEventJoinComplete(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_P2P_JOIN_INFO_T prJoinInfo = (P_P2P_JOIN_INFO_T) NULL;
- P_MSG_JOIN_COMP_T prJoinCompMsg = (P_MSG_JOIN_COMP_T) NULL;
- P_SW_RFB_T prAssocRspSwRfb = (P_SW_RFB_T) NULL;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- DBGLOG(P2P, TRACE, "P2P Join Complete\n");
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL) {
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- return;
- }
- prJoinInfo = &(prP2pFsmInfo->rJoinInfo);
- if (prMsgHdr == NULL)
- return;
- prJoinCompMsg = (P_MSG_JOIN_COMP_T) prMsgHdr;
- prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- if (prP2pBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
- P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
- prStaRec = prJoinCompMsg->prStaRec;
- /* Check SEQ NUM */
- if (prJoinCompMsg->ucSeqNum == prJoinInfo->ucSeqNumOfReqMsg) {
- ASSERT(prStaRec == prJoinInfo->prTargetStaRec);
- prJoinInfo->fgIsJoinComplete = TRUE;
- if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
- /* 4 <1.1> Change FW's Media State immediately. */
- p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
- /* 4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have. */
- if ((prP2pBssInfo->prStaRecOfAP) && (prP2pBssInfo->prStaRecOfAP != prStaRec)) {
- cnmStaRecChangeState(prAdapter, prP2pBssInfo->prStaRecOfAP,
- STA_STATE_1);
- cnmStaRecFree(prAdapter, prP2pBssInfo->prStaRecOfAP, TRUE);
- prP2pBssInfo->prStaRecOfAP = NULL;
- }
- /* 4 <1.3> Update BSS_INFO_T */
- p2pFuncUpdateBssInfoForJOIN(prAdapter, prP2pFsmInfo->prTargetBss, prStaRec,
- prAssocRspSwRfb);
- /* 4 <1.4> Activate current AP's STA_RECORD_T in Driver. */
- cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
- DBGLOG(P2P, INFO, "P2P GC Join Success\n");
- #if CFG_SUPPORT_P2P_RSSI_QUERY
- /* <1.5> Update RSSI if necessary */
- nicUpdateRSSI(prAdapter, NETWORK_TYPE_P2P_INDEX,
- (INT_8) (RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
- #endif
- /* 4 <1.6> Indicate Connected Event to Host immediately. */
- /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
- /* p2pIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED, */
- /* prStaRec->aucMacAddr); */
- if (prP2pFsmInfo->prTargetBss)
- scanReportBss2Cfg80211(prAdapter, OP_MODE_P2P_DEVICE,
- prP2pFsmInfo->prTargetBss);
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- &prP2pFsmInfo->rConnReqInfo,
- prJoinInfo->aucIEBuf, prJoinInfo->u4BufLength,
- prStaRec->u2StatusCode, WLAN_STATUS_MEDIA_CONNECT);
- } else {
- /* Join Fail */
- /* 4 <2.1> Redo JOIN process with other Auth Type if possible */
- if (p2pFuncRetryJOIN(prAdapter, prStaRec, prJoinInfo) == FALSE) {
- P_BSS_DESC_T prBssDesc;
- /* Increase Failure Count */
- prStaRec->ucJoinFailureCount++;
- prBssDesc = prP2pFsmInfo->prTargetBss;
- ASSERT(prBssDesc);
- ASSERT(prBssDesc->fgIsConnecting);
- prBssDesc->fgIsConnecting = FALSE;
- if (prStaRec->ucJoinFailureCount >= 3) {
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- &prP2pFsmInfo->rConnReqInfo,
- prJoinInfo->aucIEBuf,
- prJoinInfo->u4BufLength,
- prStaRec->u2StatusCode,
- WLAN_STATUS_MEDIA_DISCONNECT_LOCALLY);
- } else {
- /* Sometime the GO is not ready to response auth. */
- /* Connect it again */
- prP2pFsmInfo->prTargetBss = NULL;
- }
- DBGLOG(P2P, INFO, "P2P GC Join Failed\n");
- }
- }
- }
- }
- if (prAssocRspSwRfb)
- nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
- if (prP2pFsmInfo->eCurrentState == P2P_STATE_GC_JOIN) {
- if (prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX].eConnectionState ==
- PARAM_MEDIA_STATE_CONNECTED) {
- /* Return to IDLE state. */
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
- } else {
- /* p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE); */
- /* one more scan */
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_SCAN);
- }
- }
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- } /* p2pFsmRunEventJoinComplete */
- VOID p2pFsmRunEventMgmtFrameRegister(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_MSG_P2P_MGMT_FRAME_REGISTER_T prMgmtFrameRegister = (P_MSG_P2P_MGMT_FRAME_REGISTER_T) NULL;
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- prMgmtFrameRegister = (P_MSG_P2P_MGMT_FRAME_REGISTER_T) prMsgHdr;
- p2pFuncMgmtFrameRegister(prAdapter,
- prMgmtFrameRegister->u2FrameType,
- prMgmtFrameRegister->fgIsRegister, &prP2pFsmInfo->u4P2pPacketFilter);
- } while (FALSE);
- if (prMsgHdr)
- cnmMemFree(prAdapter, prMsgHdr);
- return;
- } /* p2pFsmRunEventMgmtFrameRegister */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This function is call when RX deauthentication frame from the AIR.
- * If we are under STA mode, we would go back to P2P Device.
- * If we are under AP mode, we would stay in AP mode until disconnect event from HOST.
- *
- * \param[in] prAdapter Pointer of ADAPTER_T
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pFsmRunEventRxDeauthentication(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_SW_RFB_T prSwRfb)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- UINT_16 u2ReasonCode = 0;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prSwRfb != NULL));
- if (prStaRec == NULL)
- prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- if (!prStaRec)
- break;
- prP2pBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX];
- if (prStaRec->ucStaState == STA_STATE_1)
- break;
- DBGLOG(P2P, TRACE, "RX Deauth\n");
- switch (prP2pBssInfo->eCurrentOPMode) {
- case OP_MODE_INFRASTRUCTURE:
- if (authProcessRxDeauthFrame(prSwRfb,
- prStaRec->aucMacAddr, &u2ReasonCode) == WLAN_STATUS_SUCCESS) {
- P_WLAN_DEAUTH_FRAME_T prDeauthFrame = (P_WLAN_DEAUTH_FRAME_T) prSwRfb->pvHeader;
- UINT_16 u2IELength = 0;
- if (prP2pBssInfo->prStaRecOfAP != prStaRec)
- break;
- prStaRec->u2ReasonCode = u2ReasonCode;
- u2IELength = prSwRfb->u2PacketLen - (WLAN_MAC_HEADER_LEN + REASON_CODE_FIELD_LEN);
- ASSERT(prP2pBssInfo->prStaRecOfAP == prStaRec);
- /* Indicate disconnect to Host. */
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- NULL,
- prDeauthFrame->aucInfoElem, u2IELength, u2ReasonCode,
- WLAN_STATUS_MEDIA_DISCONNECT);
- prP2pBssInfo->prStaRecOfAP = NULL;
- DBGLOG(P2P, INFO, "GC RX Deauth Reason: %d\n", u2ReasonCode);
- p2pFuncDisconnect(prAdapter, prStaRec, FALSE, u2ReasonCode);
- p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
- SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
- }
- break;
- case OP_MODE_ACCESS_POINT:
- /* Delete client from client list. */
- if (authProcessRxDeauthFrame(prSwRfb,
- prP2pBssInfo->aucBSSID, &u2ReasonCode) == WLAN_STATUS_SUCCESS) {
- P_LINK_T prStaRecOfClientList = (P_LINK_T) NULL;
- P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
- P_STA_RECORD_T prCurrStaRec = (P_STA_RECORD_T) NULL;
- prStaRecOfClientList = &prP2pBssInfo->rStaRecOfClientList;
- LINK_FOR_EACH(prLinkEntry, prStaRecOfClientList) {
- prCurrStaRec = LINK_ENTRY(prLinkEntry, STA_RECORD_T, rLinkEntry);
- ASSERT(prCurrStaRec);
- if (EQUAL_MAC_ADDR(prCurrStaRec->aucMacAddr, prStaRec->aucMacAddr)) {
- /* Remove STA from client list. */
- LINK_REMOVE_KNOWN_ENTRY(prStaRecOfClientList,
- &prCurrStaRec->rLinkEntry);
- /* Indicate to Host. */
- /* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prStaRec, FALSE); */
- /* Indicate disconnect to Host. */
- DBGLOG(P2P, INFO, "GO RX Deauth Reason: %d\n", u2ReasonCode);
- p2pFuncDisconnect(prAdapter, prStaRec, FALSE, u2ReasonCode);
- break;
- }
- }
- }
- break;
- case OP_MODE_P2P_DEVICE:
- default:
- /* Findout why someone sent deauthentication frame to us. */
- ASSERT(FALSE);
- break;
- }
- DBGLOG(P2P, TRACE, "Deauth Reason:%d\n", u2ReasonCode);
- } while (FALSE);
- } /* p2pFsmRunEventRxDeauthentication */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This function is call when RX deauthentication frame from the AIR.
- * If we are under STA mode, we would go back to P2P Device.
- * If we are under AP mode, we would stay in AP mode until disconnect event from HOST.
- *
- * \param[in] prAdapter Pointer of ADAPTER_T
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pFsmRunEventRxDisassociation(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_SW_RFB_T prSwRfb)
- {
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- UINT_16 u2ReasonCode = 0;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prSwRfb != NULL));
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- if (prP2pFsmInfo == NULL)
- break;
- if (prStaRec == NULL) {
- prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
- if (prStaRec == NULL)
- break;
- }
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- if (prStaRec->ucStaState == STA_STATE_1)
- break;
- DBGLOG(P2P, TRACE, "RX Disassoc\n");
- switch (prP2pBssInfo->eCurrentOPMode) {
- case OP_MODE_INFRASTRUCTURE:
- if (assocProcessRxDisassocFrame(prAdapter,
- prSwRfb,
- prStaRec->aucMacAddr,
- &prStaRec->u2ReasonCode) == WLAN_STATUS_SUCCESS) {
- P_WLAN_DISASSOC_FRAME_T prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
- UINT_16 u2IELength = 0;
- ASSERT(prP2pBssInfo->prStaRecOfAP == prStaRec);
- if (prP2pBssInfo->prStaRecOfAP != prStaRec)
- break;
- u2IELength = prSwRfb->u2PacketLen - (WLAN_MAC_HEADER_LEN + REASON_CODE_FIELD_LEN);
- /* Indicate disconnect to Host. */
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- NULL,
- prDisassocFrame->aucInfoElem,
- u2IELength, prStaRec->u2ReasonCode,
- WLAN_STATUS_MEDIA_DISCONNECT);
- prP2pBssInfo->prStaRecOfAP = NULL;
- DBGLOG(P2P, INFO, "GC RX Disassoc Reason %d\n", prStaRec->u2ReasonCode);
- p2pFuncDisconnect(prAdapter, prStaRec, FALSE, prStaRec->u2ReasonCode);
- p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
- SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
- }
- break;
- case OP_MODE_ACCESS_POINT:
- /* Delete client from client list. */
- if (assocProcessRxDisassocFrame(prAdapter,
- prSwRfb,
- prP2pBssInfo->aucBSSID, &u2ReasonCode) == WLAN_STATUS_SUCCESS) {
- P_LINK_T prStaRecOfClientList = (P_LINK_T) NULL;
- P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
- P_STA_RECORD_T prCurrStaRec = (P_STA_RECORD_T) NULL;
- prStaRecOfClientList = &prP2pBssInfo->rStaRecOfClientList;
- LINK_FOR_EACH(prLinkEntry, prStaRecOfClientList) {
- prCurrStaRec = LINK_ENTRY(prLinkEntry, STA_RECORD_T, rLinkEntry);
- ASSERT(prCurrStaRec);
- if (EQUAL_MAC_ADDR(prCurrStaRec->aucMacAddr, prStaRec->aucMacAddr)) {
- /* Remove STA from client list. */
- LINK_REMOVE_KNOWN_ENTRY(prStaRecOfClientList,
- &prCurrStaRec->rLinkEntry);
- /* Indicate to Host. */
- /* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prStaRec, FALSE); */
- /* Indicate disconnect to Host. */
- DBGLOG(P2P, INFO, "GO RX Disassoc Reason %d\n", u2ReasonCode);
- p2pFuncDisconnect(prAdapter, prStaRec, FALSE, u2ReasonCode);
- break;
- }
- }
- }
- break;
- case OP_MODE_P2P_DEVICE:
- default:
- ASSERT(FALSE);
- break;
- }
- } while (FALSE);
- } /* p2pFsmRunEventRxDisassociation */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief This function is called when a probe request frame is received.
- *
- * \param[in] prAdapter Pointer of ADAPTER_T
- *
- * \return boolean value if probe response frame is accepted & need cancel scan request.
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pFsmRunEventRxProbeResponseFrame(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb, IN P_BSS_DESC_T prBssDesc)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL;
- P_WLAN_MAC_MGMT_HEADER_T prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T) NULL;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prSwRfb != NULL) && (prBssDesc != NULL));
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
- prP2pBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX];
- /* There is a connection request. */
- prMgtHdr = (P_WLAN_MAC_MGMT_HEADER_T) prSwRfb->pvHeader;
- } while (FALSE);
- } /* p2pFsmRunEventRxProbeResponseFrame */
- VOID p2pFsmRunEventBeaconTimeout(IN P_ADAPTER_T prAdapter)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- do {
- ASSERT_BREAK(prAdapter != NULL);
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- DBGLOG(P2P, TRACE, "p2pFsmRunEventBeaconTimeout: Beacon Timeout\n");
- /* Only client mode would have beacon lost event. */
- ASSERT(prP2pBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE);
- if (prP2pBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
- /* Indicate disconnect to Host. */
- kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
- NULL, NULL, 0, REASON_CODE_DISASSOC_INACTIVITY,
- WLAN_STATUS_MEDIA_DISCONNECT_LOCALLY);
- if (prP2pBssInfo->prStaRecOfAP != NULL) {
- P_STA_RECORD_T prStaRec = prP2pBssInfo->prStaRecOfAP;
- prP2pBssInfo->prStaRecOfAP = NULL;
- p2pFuncDisconnect(prAdapter, prStaRec, FALSE, REASON_CODE_DISASSOC_LEAVING_BSS);
- /* 20120830 moved into p2pFuncDisconnect() */
- /* cnmStaRecFree(prAdapter, prP2pBssInfo->prStaRecOfAP, TRUE); */
- p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_DISCONNECTED);
- SET_NET_PWR_STATE_IDLE(prAdapter, NETWORK_TYPE_P2P_INDEX);
- p2pFsmStateTransition(prAdapter, prP2pFsmInfo, P2P_STATE_IDLE);
- }
- }
- } while (FALSE);
- } /* p2pFsmRunEventBeaconTimeout */
- #if CFG_SUPPORT_WFD
- VOID p2pFsmRunEventWfdSettingUpdate(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
- {
- P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
- P_MSG_WFD_CONFIG_SETTINGS_CHANGED_T prMsgWfdCfgSettings = (P_MSG_WFD_CONFIG_SETTINGS_CHANGED_T) NULL;
- WLAN_STATUS rStatus;
- DBGLOG(P2P, INFO, "p2pFsmRunEventWfdSettingUpdate\n");
- do {
- ASSERT_BREAK((prAdapter != NULL));
- if (prMsgHdr != NULL) {
- prMsgWfdCfgSettings = (P_MSG_WFD_CONFIG_SETTINGS_CHANGED_T) prMsgHdr;
- prWfdCfgSettings = prMsgWfdCfgSettings->prWfdCfgSettings;
- } else {
- prWfdCfgSettings = &prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings;
- }
- DBGLOG(P2P, INFO, "WFD Enalbe %x info %x state %x flag %x adv %x\n",
- prWfdCfgSettings->ucWfdEnable,
- prWfdCfgSettings->u2WfdDevInfo,
- (UINT_32) prWfdCfgSettings->u4WfdState,
- (UINT_32) prWfdCfgSettings->u4WfdFlag,
- (UINT_32) prWfdCfgSettings->u4WfdAdvancedFlag);
- rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
- CMD_ID_SET_WFD_CTRL, /* ucCID */
- TRUE, /* fgSetQuery */
- FALSE, /* fgNeedResp */
- FALSE, /* fgIsOid */
- NULL, NULL, /* pfCmdTimeoutHandler */
- sizeof(WFD_CFG_SETTINGS_T), /* u4SetQueryInfoLen */
- (PUINT_8) prWfdCfgSettings, /* pucInfoBuffer */
- NULL, /* pvSetQueryBuffer */
- 0 /* u4SetQueryBufferLen */
- );
- } while (FALSE);
- return;
- }
- /* p2pFsmRunEventWfdSettingUpdate */
- #endif
- /*----------------------------------------------------------------------------*/
- /*!
- * @brief This function is used to generate P2P IE for Beacon frame.
- *
- * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
- *
- * @return none
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pGenerateP2P_IEForAssocReq(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
- {
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
- if (prStaRec != NULL) {
- if (IS_STA_P2P_TYPE(prStaRec)) {
- /* Do nothing */
- /* TODO: */
- }
- }
- } while (FALSE);
- return;
- } /* end of p2pGenerateP2P_IEForAssocReq() */
- /*----------------------------------------------------------------------------*/
- /*!
- * @brief This function is used to generate P2P IE for Probe Request frame.
- *
- * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
- *
- * @return none
- */
- /*----------------------------------------------------------------------------*/
- VOID
- p2pGenerateP2P_IEForProbeReq(IN P_ADAPTER_T prAdapter, IN PUINT_16 pu2Offset, IN PUINT_8 pucBuf, IN UINT_16 u2BufSize)
- {
- ASSERT(prAdapter);
- ASSERT(pucBuf);
- /* TODO: */
- return;
- } /* end of p2pGenerateP2P_IEForProbReq() */
- /*----------------------------------------------------------------------------*/
- /*!
- * @brief This function is used to calculate P2P IE length for Beacon frame.
- *
- * @param[in] eNetTypeIndex Specify which network
- * @param[in] prStaRec Pointer to the STA_RECORD_T
- *
- * @return The length of P2P IE added
- */
- /*----------------------------------------------------------------------------*/
- UINT_32
- p2pCalculateP2P_IELenForProbeReq(IN P_ADAPTER_T prAdapter,
- IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex, IN P_STA_RECORD_T prStaRec)
- {
- if (eNetTypeIndex != NETWORK_TYPE_P2P_INDEX)
- return 0;
- /* TODO: */
- return 0;
- } /* end of p2pCalculateP2P_IELenForProbeReq() */
- /*----------------------------------------------------------------------------*/
- /*!
- * @brief This function will indicate the Event of Tx Fail of AAA Module.
- *
- * @param[in] prAdapter Pointer to the Adapter structure.
- * @param[in] prStaRec Pointer to the STA_RECORD_T
- *
- * @return (none)
- */
- /*----------------------------------------------------------------------------*/
- VOID p2pRunEventAAATxFail(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
- {
- P_BSS_INFO_T prBssInfo;
- ASSERT(prAdapter);
- ASSERT(prStaRec);
- prBssInfo = &(prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]);
- bssRemoveStaRecFromClientList(prAdapter, prBssInfo, prStaRec);
- p2pFuncDisconnect(prAdapter, prStaRec, FALSE, REASON_CODE_UNSPECIFIED);
- /* 20120830 moved into p2puUncDisconnect. */
- /* cnmStaRecFree(prAdapter, prStaRec, TRUE); */
- } /* p2pRunEventAAATxFail */
- /*----------------------------------------------------------------------------*/
- /*!
- * @brief This function will indicate the Event of Successful Completion of AAA Module.
- *
- * @param[in] prAdapter Pointer to the Adapter structure.
- * @param[in] prStaRec Pointer to the STA_RECORD_T
- *
- * @return (none)
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS p2pRunEventAAAComplete(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
- {
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
- ENUM_PARAM_MEDIA_STATE_T eOriMediaState;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prStaRec != NULL));
- prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
- eOriMediaState = prP2pBssInfo->eConnectionState;
- if (prStaRec != NULL)
- bssRemoveStaRecFromClientList(prAdapter, prP2pBssInfo, prStaRec);
- else
- break;
- if (prP2pBssInfo->rStaRecOfClientList.u4NumElem > P2P_MAXIMUM_CLIENT_COUNT ||
- kalP2PMaxClients(prAdapter->prGlueInfo, prP2pBssInfo->rStaRecOfClientList.u4NumElem)) {
- rStatus = WLAN_STATUS_RESOURCES;
- break;
- }
- bssAddStaRecToClientList(prAdapter, prP2pBssInfo, prStaRec);
- prStaRec->u2AssocId = bssAssignAssocID(prStaRec);
- if (prP2pBssInfo->rStaRecOfClientList.u4NumElem > P2P_MAXIMUM_CLIENT_COUNT ||
- kalP2PMaxClients(prAdapter->prGlueInfo, prP2pBssInfo->rStaRecOfClientList.u4NumElem)) {
- rStatus = WLAN_STATUS_RESOURCES;
- break;
- }
- DBGLOG(P2P, INFO, "P2P GO Join Complete\n");
- cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
- p2pChangeMediaState(prAdapter, PARAM_MEDIA_STATE_CONNECTED);
- /* Update Connected state to FW. */
- if (eOriMediaState != prP2pBssInfo->eConnectionState)
- nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX);
- } while (FALSE);
- return rStatus;
- } /* p2pRunEventAAAComplete */
- /*----------------------------------------------------------------------------*/
- /*!
- * @brief This function will indicate the Event of Successful Completion of AAA Module.
- *
- * @param[in] prAdapter Pointer to the Adapter structure.
- * @param[in] prStaRec Pointer to the STA_RECORD_T
- *
- * @return (none)
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS p2pRunEventAAASuccess(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
- {
- WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prStaRec != NULL));
- /* Glue layer indication. */
- kalP2PGOStationUpdate(prAdapter->prGlueInfo, prStaRec, TRUE);
- } while (FALSE);
- return rStatus;
- } /* p2pRunEventAAASuccess */
- /*----------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * \param[in]
- *
- * \return none
- */
- /*----------------------------------------------------------------------------*/
- WLAN_STATUS p2pRxPublicActionFrame(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
- {
- WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
- P_P2P_PUBLIC_ACTION_FRAME_T prPublicActionFrame = (P_P2P_PUBLIC_ACTION_FRAME_T) NULL;
- P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
- ASSERT(prSwRfb);
- ASSERT(prAdapter);
- prPublicActionFrame = (P_P2P_PUBLIC_ACTION_FRAME_T) prSwRfb->pvHeader;
- prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
- DBGLOG(P2P, TRACE, "RX Public Action Frame Token:%d.\n", prPublicActionFrame->ucDialogToken);
- if (prPublicActionFrame->ucCategory != CATEGORY_PUBLIC_ACTION)
- return rWlanStatus;
- switch (prPublicActionFrame->ucAction) {
- case ACTION_PUBLIC_WIFI_DIRECT:
- break;
- case ACTION_GAS_INITIAL_REQUEST:
- case ACTION_GAS_INITIAL_RESPONSE:
- case ACTION_GAS_COMEBACK_REQUEST:
- case ACTION_GAS_COMEBACK_RESPONSE:
- break;
- default:
- break;
- }
- return rWlanStatus;
- } /* p2pRxPublicActionFrame */
- WLAN_STATUS p2pRxActionFrame(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
- {
- WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
- P_P2P_ACTION_FRAME_T prP2pActionFrame = (P_P2P_ACTION_FRAME_T) NULL;
- UINT_8 aucOui[3] = VENDOR_OUI_WFA_SPECIFIC;
- do {
- ASSERT_BREAK((prAdapter != NULL) && (prSwRfb != NULL));
- prP2pActionFrame = (P_P2P_ACTION_FRAME_T) prSwRfb->pvHeader;
- if (prP2pActionFrame->ucCategory != CATEGORY_VENDOR_SPECIFIC_ACTION) {
- DBGLOG(P2P, TRACE, "RX Action Frame but not vendor specific.\n");
- break;
- }
- if ((prP2pActionFrame->ucOuiType != VENDOR_OUI_TYPE_P2P) ||
- (prP2pActionFrame->aucOui[0] != aucOui[0]) ||
- (prP2pActionFrame->aucOui[1] != aucOui[1]) || (prP2pActionFrame->aucOui[2] != aucOui[2])) {
- DBGLOG(P2P, TRACE, "RX Vendor Specific Action Frame but not P2P Type or not WFA OUI.\n");
- break;
- }
- } while (FALSE);
- return rWlanStatus;
- } /* p2pRxActionFrame */
- VOID
- p2pProcessEvent_UpdateNOAParam(IN P_ADAPTER_T prAdapter,
- UINT_8 ucNetTypeIndex, P_EVENT_UPDATE_NOA_PARAMS_T prEventUpdateNoaParam)
- {
- P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T) NULL;
- P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo;
- UINT_32 i;
- BOOLEAN fgNoaAttrExisted = FALSE;
- prBssInfo = &(prAdapter->rWifiVar.arBssInfo[ucNetTypeIndex]);
- prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
- prP2pSpecificBssInfo->fgEnableOppPS = prEventUpdateNoaParam->fgEnableOppPS;
- prP2pSpecificBssInfo->u2CTWindow = prEventUpdateNoaParam->u2CTWindow;
- prP2pSpecificBssInfo->ucNoAIndex = prEventUpdateNoaParam->ucNoAIndex;
- prP2pSpecificBssInfo->ucNoATimingCount = prEventUpdateNoaParam->ucNoATimingCount;
- fgNoaAttrExisted |= prP2pSpecificBssInfo->fgEnableOppPS;
- DBGLOG(P2P, INFO, "Update NoA Count=%d.\n", prEventUpdateNoaParam->ucNoATimingCount);
- ASSERT(prP2pSpecificBssInfo->ucNoATimingCount <= P2P_MAXIMUM_NOA_COUNT);
- for (i = 0; i < prP2pSpecificBssInfo->ucNoATimingCount; i++) {
- /* in used */
- prP2pSpecificBssInfo->arNoATiming[i].fgIsInUse = prEventUpdateNoaParam->arEventNoaTiming[i].fgIsInUse;
- /* count */
- prP2pSpecificBssInfo->arNoATiming[i].ucCount = prEventUpdateNoaParam->arEventNoaTiming[i].ucCount;
- /* duration */
- prP2pSpecificBssInfo->arNoATiming[i].u4Duration = prEventUpdateNoaParam->arEventNoaTiming[i].u4Duration;
- /* interval */
- prP2pSpecificBssInfo->arNoATiming[i].u4Interval = prEventUpdateNoaParam->arEventNoaTiming[i].u4Interval;
- /* start time */
- prP2pSpecificBssInfo->arNoATiming[i].u4StartTime =
- prEventUpdateNoaParam->arEventNoaTiming[i].u4StartTime;
- fgNoaAttrExisted |= prP2pSpecificBssInfo->arNoATiming[i].fgIsInUse;
- }
- prP2pSpecificBssInfo->fgIsNoaAttrExisted = fgNoaAttrExisted;
- /* update beacon content by the change */
- bssUpdateBeaconContent(prAdapter, ucNetTypeIndex);
- }
- #endif /* CFG_ENABLE_WIFI_DIRECT */
|