p2p.c 113 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353
  1. /*
  2. * Wi-Fi Direct - P2P module
  3. * Copyright (c) 2009-2010, Atheros Communications
  4. *
  5. * This software may be distributed under the terms of the BSD license.
  6. * See README for more details.
  7. */
  8. #include "includes.h"
  9. #include "common.h"
  10. #include "eloop.h"
  11. #include "common/ieee802_11_defs.h"
  12. #include "common/ieee802_11_common.h"
  13. #include "wps/wps_i.h"
  14. #include "p2p_i.h"
  15. #include "p2p.h"
  16. static void p2p_state_timeout(void *eloop_ctx, void *timeout_ctx);
  17. static void p2p_device_free(struct p2p_data *p2p, struct p2p_device *dev);
  18. static void p2p_process_presence_req(struct p2p_data *p2p, const u8 *da,
  19. const u8 *sa, const u8 *data, size_t len,
  20. int rx_freq);
  21. static void p2p_process_presence_resp(struct p2p_data *p2p, const u8 *da,
  22. const u8 *sa, const u8 *data,
  23. size_t len);
  24. static void p2p_ext_listen_timeout(void *eloop_ctx, void *timeout_ctx);
  25. static void p2p_scan_timeout(void *eloop_ctx, void *timeout_ctx);
  26. /*
  27. * p2p_scan recovery timeout
  28. *
  29. * Many drivers are using 30 second timeout on scan results. Allow a bit larger
  30. * timeout for this to avoid hitting P2P timeout unnecessarily.
  31. */
  32. #define P2P_SCAN_TIMEOUT 35
  33. /**
  34. * P2P_PEER_EXPIRATION_AGE - Number of seconds after which inactive peer
  35. * entries will be removed
  36. */
  37. #define P2P_PEER_EXPIRATION_AGE 300
  38. #define P2P_PEER_EXPIRATION_INTERVAL (P2P_PEER_EXPIRATION_AGE / 2)
  39. static void p2p_expire_peers(struct p2p_data *p2p)
  40. {
  41. struct p2p_device *dev, *n;
  42. struct os_reltime now;
  43. size_t i;
  44. os_get_reltime(&now);
  45. dl_list_for_each_safe(dev, n, &p2p->devices, struct p2p_device, list) {
  46. if (dev->last_seen.sec + P2P_PEER_EXPIRATION_AGE >= now.sec)
  47. continue;
  48. if (p2p->cfg->go_connected &&
  49. p2p->cfg->go_connected(p2p->cfg->cb_ctx,
  50. dev->info.p2p_device_addr)) {
  51. /*
  52. * We are connected as a client to a group in which the
  53. * peer is the GO, so do not expire the peer entry.
  54. */
  55. os_get_reltime(&dev->last_seen);
  56. continue;
  57. }
  58. for (i = 0; i < p2p->num_groups; i++) {
  59. if (p2p_group_is_client_connected(
  60. p2p->groups[i], dev->info.p2p_device_addr))
  61. break;
  62. }
  63. if (i < p2p->num_groups) {
  64. /*
  65. * The peer is connected as a client in a group where
  66. * we are the GO, so do not expire the peer entry.
  67. */
  68. os_get_reltime(&dev->last_seen);
  69. continue;
  70. }
  71. p2p_dbg(p2p, "Expiring old peer entry " MACSTR,
  72. MAC2STR(dev->info.p2p_device_addr));
  73. dl_list_del(&dev->list);
  74. p2p_device_free(p2p, dev);
  75. }
  76. }
  77. static void p2p_expiration_timeout(void *eloop_ctx, void *timeout_ctx)
  78. {
  79. struct p2p_data *p2p = eloop_ctx;
  80. p2p_expire_peers(p2p);
  81. eloop_register_timeout(P2P_PEER_EXPIRATION_INTERVAL, 0,
  82. p2p_expiration_timeout, p2p, NULL);
  83. }
  84. static const char * p2p_state_txt(int state)
  85. {
  86. switch (state) {
  87. case P2P_IDLE:
  88. return "IDLE";
  89. case P2P_SEARCH:
  90. return "SEARCH";
  91. case P2P_CONNECT:
  92. return "CONNECT";
  93. case P2P_CONNECT_LISTEN:
  94. return "CONNECT_LISTEN";
  95. case P2P_GO_NEG:
  96. return "GO_NEG";
  97. case P2P_LISTEN_ONLY:
  98. return "LISTEN_ONLY";
  99. case P2P_WAIT_PEER_CONNECT:
  100. return "WAIT_PEER_CONNECT";
  101. case P2P_WAIT_PEER_IDLE:
  102. return "WAIT_PEER_IDLE";
  103. case P2P_SD_DURING_FIND:
  104. return "SD_DURING_FIND";
  105. case P2P_PROVISIONING:
  106. return "PROVISIONING";
  107. case P2P_PD_DURING_FIND:
  108. return "PD_DURING_FIND";
  109. case P2P_INVITE:
  110. return "INVITE";
  111. case P2P_INVITE_LISTEN:
  112. return "INVITE_LISTEN";
  113. default:
  114. return "?";
  115. }
  116. }
  117. const char * p2p_get_state_txt(struct p2p_data *p2p)
  118. {
  119. return p2p_state_txt(p2p->state);
  120. }
  121. u16 p2p_get_provisioning_info(struct p2p_data *p2p, const u8 *addr)
  122. {
  123. struct p2p_device *dev = NULL;
  124. if (!addr || !p2p)
  125. return 0;
  126. dev = p2p_get_device(p2p, addr);
  127. if (dev)
  128. return dev->wps_prov_info;
  129. else
  130. return 0;
  131. }
  132. void p2p_clear_provisioning_info(struct p2p_data *p2p, const u8 *addr)
  133. {
  134. struct p2p_device *dev = NULL;
  135. if (!addr || !p2p)
  136. return;
  137. dev = p2p_get_device(p2p, addr);
  138. if (dev)
  139. dev->wps_prov_info = 0;
  140. }
  141. void p2p_set_state(struct p2p_data *p2p, int new_state)
  142. {
  143. p2p_dbg(p2p, "State %s -> %s",
  144. p2p_state_txt(p2p->state), p2p_state_txt(new_state));
  145. p2p->state = new_state;
  146. }
  147. void p2p_set_timeout(struct p2p_data *p2p, unsigned int sec, unsigned int usec)
  148. {
  149. p2p_dbg(p2p, "Set timeout (state=%s): %u.%06u sec",
  150. p2p_state_txt(p2p->state), sec, usec);
  151. eloop_cancel_timeout(p2p_state_timeout, p2p, NULL);
  152. eloop_register_timeout(sec, usec, p2p_state_timeout, p2p, NULL);
  153. }
  154. void p2p_clear_timeout(struct p2p_data *p2p)
  155. {
  156. p2p_dbg(p2p, "Clear timeout (state=%s)", p2p_state_txt(p2p->state));
  157. eloop_cancel_timeout(p2p_state_timeout, p2p, NULL);
  158. }
  159. void p2p_go_neg_failed(struct p2p_data *p2p, struct p2p_device *peer,
  160. int status)
  161. {
  162. struct p2p_go_neg_results res;
  163. p2p_clear_timeout(p2p);
  164. p2p_set_state(p2p, P2P_IDLE);
  165. if (p2p->go_neg_peer) {
  166. p2p->go_neg_peer->flags &= ~P2P_DEV_PEER_WAITING_RESPONSE;
  167. p2p->go_neg_peer->wps_method = WPS_NOT_READY;
  168. }
  169. p2p->go_neg_peer = NULL;
  170. os_memset(&res, 0, sizeof(res));
  171. res.status = status;
  172. if (peer) {
  173. os_memcpy(res.peer_device_addr, peer->info.p2p_device_addr,
  174. ETH_ALEN);
  175. os_memcpy(res.peer_interface_addr, peer->intended_addr,
  176. ETH_ALEN);
  177. }
  178. p2p->cfg->go_neg_completed(p2p->cfg->cb_ctx, &res);
  179. }
  180. static void p2p_listen_in_find(struct p2p_data *p2p, int dev_disc)
  181. {
  182. unsigned int r, tu;
  183. int freq;
  184. struct wpabuf *ies;
  185. p2p_dbg(p2p, "Starting short listen state (state=%s)",
  186. p2p_state_txt(p2p->state));
  187. freq = p2p_channel_to_freq(p2p->cfg->reg_class, p2p->cfg->channel);
  188. if (freq < 0) {
  189. p2p_dbg(p2p, "Unknown regulatory class/channel");
  190. return;
  191. }
  192. os_get_random((u8 *) &r, sizeof(r));
  193. tu = (r % ((p2p->max_disc_int - p2p->min_disc_int) + 1) +
  194. p2p->min_disc_int) * 100;
  195. if (p2p->max_disc_tu >= 0 && tu > (unsigned int) p2p->max_disc_tu)
  196. tu = p2p->max_disc_tu;
  197. if (!dev_disc && tu < 100)
  198. tu = 100; /* Need to wait in non-device discovery use cases */
  199. if (p2p->cfg->max_listen && 1024 * tu / 1000 > p2p->cfg->max_listen)
  200. tu = p2p->cfg->max_listen * 1000 / 1024;
  201. if (tu == 0) {
  202. p2p_dbg(p2p, "Skip listen state since duration was 0 TU");
  203. p2p_set_timeout(p2p, 0, 0);
  204. return;
  205. }
  206. p2p->pending_listen_freq = freq;
  207. p2p->pending_listen_sec = 0;
  208. p2p->pending_listen_usec = 1024 * tu;
  209. ies = p2p_build_probe_resp_ies(p2p);
  210. if (ies == NULL)
  211. return;
  212. if (p2p->cfg->start_listen(p2p->cfg->cb_ctx, freq, 1024 * tu / 1000,
  213. ies) < 0) {
  214. p2p_dbg(p2p, "Failed to start listen mode");
  215. p2p->pending_listen_freq = 0;
  216. }
  217. wpabuf_free(ies);
  218. }
  219. int p2p_listen(struct p2p_data *p2p, unsigned int timeout)
  220. {
  221. int freq;
  222. struct wpabuf *ies;
  223. p2p_dbg(p2p, "Going to listen(only) state");
  224. freq = p2p_channel_to_freq(p2p->cfg->reg_class, p2p->cfg->channel);
  225. if (freq < 0) {
  226. p2p_dbg(p2p, "Unknown regulatory class/channel");
  227. return -1;
  228. }
  229. p2p->pending_listen_freq = freq;
  230. p2p->pending_listen_sec = timeout / 1000;
  231. p2p->pending_listen_usec = (timeout % 1000) * 1000;
  232. if (p2p->p2p_scan_running) {
  233. if (p2p->start_after_scan == P2P_AFTER_SCAN_CONNECT) {
  234. p2p_dbg(p2p, "p2p_scan running - connect is already pending - skip listen");
  235. return 0;
  236. }
  237. p2p_dbg(p2p, "p2p_scan running - delay start of listen state");
  238. p2p->start_after_scan = P2P_AFTER_SCAN_LISTEN;
  239. return 0;
  240. }
  241. ies = p2p_build_probe_resp_ies(p2p);
  242. if (ies == NULL)
  243. return -1;
  244. if (p2p->cfg->start_listen(p2p->cfg->cb_ctx, freq, timeout, ies) < 0) {
  245. p2p_dbg(p2p, "Failed to start listen mode");
  246. p2p->pending_listen_freq = 0;
  247. wpabuf_free(ies);
  248. return -1;
  249. }
  250. wpabuf_free(ies);
  251. p2p_set_state(p2p, P2P_LISTEN_ONLY);
  252. return 0;
  253. }
  254. static void p2p_device_clear_reported(struct p2p_data *p2p)
  255. {
  256. struct p2p_device *dev;
  257. dl_list_for_each(dev, &p2p->devices, struct p2p_device, list)
  258. dev->flags &= ~P2P_DEV_REPORTED;
  259. }
  260. /**
  261. * p2p_get_device - Fetch a peer entry
  262. * @p2p: P2P module context from p2p_init()
  263. * @addr: P2P Device Address of the peer
  264. * Returns: Pointer to the device entry or %NULL if not found
  265. */
  266. struct p2p_device * p2p_get_device(struct p2p_data *p2p, const u8 *addr)
  267. {
  268. struct p2p_device *dev;
  269. dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
  270. if (os_memcmp(dev->info.p2p_device_addr, addr, ETH_ALEN) == 0)
  271. return dev;
  272. }
  273. return NULL;
  274. }
  275. /**
  276. * p2p_get_device_interface - Fetch a peer entry based on P2P Interface Address
  277. * @p2p: P2P module context from p2p_init()
  278. * @addr: P2P Interface Address of the peer
  279. * Returns: Pointer to the device entry or %NULL if not found
  280. */
  281. struct p2p_device * p2p_get_device_interface(struct p2p_data *p2p,
  282. const u8 *addr)
  283. {
  284. struct p2p_device *dev;
  285. dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
  286. if (os_memcmp(dev->interface_addr, addr, ETH_ALEN) == 0)
  287. return dev;
  288. }
  289. return NULL;
  290. }
  291. /**
  292. * p2p_create_device - Create a peer entry
  293. * @p2p: P2P module context from p2p_init()
  294. * @addr: P2P Device Address of the peer
  295. * Returns: Pointer to the device entry or %NULL on failure
  296. *
  297. * If there is already an entry for the peer, it will be returned instead of
  298. * creating a new one.
  299. */
  300. static struct p2p_device * p2p_create_device(struct p2p_data *p2p,
  301. const u8 *addr)
  302. {
  303. struct p2p_device *dev, *oldest = NULL;
  304. size_t count = 0;
  305. dev = p2p_get_device(p2p, addr);
  306. if (dev)
  307. return dev;
  308. dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
  309. count++;
  310. if (oldest == NULL ||
  311. os_reltime_before(&dev->last_seen, &oldest->last_seen))
  312. oldest = dev;
  313. }
  314. if (count + 1 > p2p->cfg->max_peers && oldest) {
  315. p2p_dbg(p2p, "Remove oldest peer entry to make room for a new peer");
  316. dl_list_del(&oldest->list);
  317. p2p_device_free(p2p, oldest);
  318. }
  319. dev = os_zalloc(sizeof(*dev));
  320. if (dev == NULL)
  321. return NULL;
  322. dl_list_add(&p2p->devices, &dev->list);
  323. os_memcpy(dev->info.p2p_device_addr, addr, ETH_ALEN);
  324. return dev;
  325. }
  326. static void p2p_copy_client_info(struct p2p_device *dev,
  327. struct p2p_client_info *cli)
  328. {
  329. os_memcpy(dev->info.device_name, cli->dev_name, cli->dev_name_len);
  330. dev->info.device_name[cli->dev_name_len] = '\0';
  331. dev->info.dev_capab = cli->dev_capab;
  332. dev->info.config_methods = cli->config_methods;
  333. os_memcpy(dev->info.pri_dev_type, cli->pri_dev_type, 8);
  334. dev->info.wps_sec_dev_type_list_len = 8 * cli->num_sec_dev_types;
  335. os_memcpy(dev->info.wps_sec_dev_type_list, cli->sec_dev_types,
  336. dev->info.wps_sec_dev_type_list_len);
  337. }
  338. static int p2p_add_group_clients(struct p2p_data *p2p, const u8 *go_dev_addr,
  339. const u8 *go_interface_addr, int freq,
  340. const u8 *gi, size_t gi_len)
  341. {
  342. struct p2p_group_info info;
  343. size_t c;
  344. struct p2p_device *dev;
  345. if (gi == NULL)
  346. return 0;
  347. if (p2p_group_info_parse(gi, gi_len, &info) < 0)
  348. return -1;
  349. /*
  350. * Clear old data for this group; if the devices are still in the
  351. * group, the information will be restored in the loop following this.
  352. */
  353. dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
  354. if (os_memcmp(dev->member_in_go_iface, go_interface_addr,
  355. ETH_ALEN) == 0) {
  356. os_memset(dev->member_in_go_iface, 0, ETH_ALEN);
  357. os_memset(dev->member_in_go_dev, 0, ETH_ALEN);
  358. }
  359. }
  360. for (c = 0; c < info.num_clients; c++) {
  361. struct p2p_client_info *cli = &info.client[c];
  362. if (os_memcmp(cli->p2p_device_addr, p2p->cfg->dev_addr,
  363. ETH_ALEN) == 0)
  364. continue; /* ignore our own entry */
  365. dev = p2p_get_device(p2p, cli->p2p_device_addr);
  366. if (dev) {
  367. if (dev->flags & (P2P_DEV_GROUP_CLIENT_ONLY |
  368. P2P_DEV_PROBE_REQ_ONLY)) {
  369. /*
  370. * Update information since we have not
  371. * received this directly from the client.
  372. */
  373. p2p_copy_client_info(dev, cli);
  374. } else {
  375. /*
  376. * Need to update P2P Client Discoverability
  377. * flag since it is valid only in P2P Group
  378. * Info attribute.
  379. */
  380. dev->info.dev_capab &=
  381. ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
  382. dev->info.dev_capab |=
  383. cli->dev_capab &
  384. P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
  385. }
  386. if (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
  387. dev->flags &= ~P2P_DEV_PROBE_REQ_ONLY;
  388. }
  389. } else {
  390. dev = p2p_create_device(p2p, cli->p2p_device_addr);
  391. if (dev == NULL)
  392. continue;
  393. dev->flags |= P2P_DEV_GROUP_CLIENT_ONLY;
  394. p2p_copy_client_info(dev, cli);
  395. dev->oper_freq = freq;
  396. p2p->cfg->dev_found(p2p->cfg->cb_ctx,
  397. dev->info.p2p_device_addr,
  398. &dev->info, 1);
  399. dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
  400. }
  401. os_memcpy(dev->interface_addr, cli->p2p_interface_addr,
  402. ETH_ALEN);
  403. os_get_reltime(&dev->last_seen);
  404. os_memcpy(dev->member_in_go_dev, go_dev_addr, ETH_ALEN);
  405. os_memcpy(dev->member_in_go_iface, go_interface_addr,
  406. ETH_ALEN);
  407. }
  408. return 0;
  409. }
  410. static void p2p_copy_wps_info(struct p2p_data *p2p, struct p2p_device *dev,
  411. int probe_req, const struct p2p_message *msg)
  412. {
  413. os_memcpy(dev->info.device_name, msg->device_name,
  414. sizeof(dev->info.device_name));
  415. if (msg->manufacturer &&
  416. msg->manufacturer_len < sizeof(dev->info.manufacturer)) {
  417. os_memset(dev->info.manufacturer, 0,
  418. sizeof(dev->info.manufacturer));
  419. os_memcpy(dev->info.manufacturer, msg->manufacturer,
  420. msg->manufacturer_len);
  421. }
  422. if (msg->model_name &&
  423. msg->model_name_len < sizeof(dev->info.model_name)) {
  424. os_memset(dev->info.model_name, 0,
  425. sizeof(dev->info.model_name));
  426. os_memcpy(dev->info.model_name, msg->model_name,
  427. msg->model_name_len);
  428. }
  429. if (msg->model_number &&
  430. msg->model_number_len < sizeof(dev->info.model_number)) {
  431. os_memset(dev->info.model_number, 0,
  432. sizeof(dev->info.model_number));
  433. os_memcpy(dev->info.model_number, msg->model_number,
  434. msg->model_number_len);
  435. }
  436. if (msg->serial_number &&
  437. msg->serial_number_len < sizeof(dev->info.serial_number)) {
  438. os_memset(dev->info.serial_number, 0,
  439. sizeof(dev->info.serial_number));
  440. os_memcpy(dev->info.serial_number, msg->serial_number,
  441. msg->serial_number_len);
  442. }
  443. if (msg->pri_dev_type)
  444. os_memcpy(dev->info.pri_dev_type, msg->pri_dev_type,
  445. sizeof(dev->info.pri_dev_type));
  446. else if (msg->wps_pri_dev_type)
  447. os_memcpy(dev->info.pri_dev_type, msg->wps_pri_dev_type,
  448. sizeof(dev->info.pri_dev_type));
  449. if (msg->wps_sec_dev_type_list) {
  450. os_memcpy(dev->info.wps_sec_dev_type_list,
  451. msg->wps_sec_dev_type_list,
  452. msg->wps_sec_dev_type_list_len);
  453. dev->info.wps_sec_dev_type_list_len =
  454. msg->wps_sec_dev_type_list_len;
  455. }
  456. if (msg->capability) {
  457. /*
  458. * P2P Client Discoverability bit is reserved in all frames
  459. * that use this function, so do not change its value here.
  460. */
  461. dev->info.dev_capab &= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
  462. dev->info.dev_capab |= msg->capability[0] &
  463. ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
  464. dev->info.group_capab = msg->capability[1];
  465. }
  466. if (msg->ext_listen_timing) {
  467. dev->ext_listen_period = WPA_GET_LE16(msg->ext_listen_timing);
  468. dev->ext_listen_interval =
  469. WPA_GET_LE16(msg->ext_listen_timing + 2);
  470. }
  471. if (!probe_req) {
  472. u16 new_config_methods;
  473. new_config_methods = msg->config_methods ?
  474. msg->config_methods : msg->wps_config_methods;
  475. if (new_config_methods &&
  476. dev->info.config_methods != new_config_methods) {
  477. p2p_dbg(p2p, "Update peer " MACSTR
  478. " config_methods 0x%x -> 0x%x",
  479. MAC2STR(dev->info.p2p_device_addr),
  480. dev->info.config_methods,
  481. new_config_methods);
  482. dev->info.config_methods = new_config_methods;
  483. }
  484. }
  485. }
  486. /**
  487. * p2p_add_device - Add peer entries based on scan results or P2P frames
  488. * @p2p: P2P module context from p2p_init()
  489. * @addr: Source address of Beacon or Probe Response frame (may be either
  490. * P2P Device Address or P2P Interface Address)
  491. * @level: Signal level (signal strength of the received frame from the peer)
  492. * @freq: Frequency on which the Beacon or Probe Response frame was received
  493. * @rx_time: Time when the result was received
  494. * @ies: IEs from the Beacon or Probe Response frame
  495. * @ies_len: Length of ies buffer in octets
  496. * @scan_res: Whether this was based on scan results
  497. * Returns: 0 on success, -1 on failure
  498. *
  499. * If the scan result is for a GO, the clients in the group will also be added
  500. * to the peer table. This function can also be used with some other frames
  501. * like Provision Discovery Request that contains P2P Capability and P2P Device
  502. * Info attributes.
  503. */
  504. int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq,
  505. struct os_reltime *rx_time, int level, const u8 *ies,
  506. size_t ies_len, int scan_res)
  507. {
  508. struct p2p_device *dev;
  509. struct p2p_message msg;
  510. const u8 *p2p_dev_addr;
  511. int i;
  512. struct os_reltime time_now;
  513. os_memset(&msg, 0, sizeof(msg));
  514. if (p2p_parse_ies(ies, ies_len, &msg)) {
  515. p2p_dbg(p2p, "Failed to parse P2P IE for a device entry");
  516. p2p_parse_free(&msg);
  517. return -1;
  518. }
  519. if (msg.p2p_device_addr)
  520. p2p_dev_addr = msg.p2p_device_addr;
  521. else if (msg.device_id)
  522. p2p_dev_addr = msg.device_id;
  523. else {
  524. p2p_dbg(p2p, "Ignore scan data without P2P Device Info or P2P Device Id");
  525. p2p_parse_free(&msg);
  526. return -1;
  527. }
  528. if (!is_zero_ether_addr(p2p->peer_filter) &&
  529. os_memcmp(p2p_dev_addr, p2p->peer_filter, ETH_ALEN) != 0) {
  530. p2p_dbg(p2p, "Do not add peer filter for " MACSTR
  531. " due to peer filter", MAC2STR(p2p_dev_addr));
  532. p2p_parse_free(&msg);
  533. return 0;
  534. }
  535. dev = p2p_create_device(p2p, p2p_dev_addr);
  536. if (dev == NULL) {
  537. p2p_parse_free(&msg);
  538. return -1;
  539. }
  540. if (rx_time == NULL) {
  541. os_get_reltime(&time_now);
  542. rx_time = &time_now;
  543. }
  544. /*
  545. * Update the device entry only if the new peer
  546. * entry is newer than the one previously stored.
  547. */
  548. if (dev->last_seen.sec > 0 &&
  549. os_reltime_before(rx_time, &dev->last_seen)) {
  550. p2p_dbg(p2p, "Do not update peer entry based on old frame (rx_time=%u.%06u last_seen=%u.%06u)",
  551. (unsigned int) rx_time->sec,
  552. (unsigned int) rx_time->usec,
  553. (unsigned int) dev->last_seen.sec,
  554. (unsigned int) dev->last_seen.usec);
  555. p2p_parse_free(&msg);
  556. return -1;
  557. }
  558. os_memcpy(&dev->last_seen, rx_time, sizeof(struct os_reltime));
  559. dev->flags &= ~(P2P_DEV_PROBE_REQ_ONLY | P2P_DEV_GROUP_CLIENT_ONLY);
  560. if (os_memcmp(addr, p2p_dev_addr, ETH_ALEN) != 0)
  561. os_memcpy(dev->interface_addr, addr, ETH_ALEN);
  562. if (msg.ssid &&
  563. (msg.ssid[1] != P2P_WILDCARD_SSID_LEN ||
  564. os_memcmp(msg.ssid + 2, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN)
  565. != 0)) {
  566. os_memcpy(dev->oper_ssid, msg.ssid + 2, msg.ssid[1]);
  567. dev->oper_ssid_len = msg.ssid[1];
  568. }
  569. if (freq >= 2412 && freq <= 2484 && msg.ds_params &&
  570. *msg.ds_params >= 1 && *msg.ds_params <= 14) {
  571. int ds_freq;
  572. if (*msg.ds_params == 14)
  573. ds_freq = 2484;
  574. else
  575. ds_freq = 2407 + *msg.ds_params * 5;
  576. if (freq != ds_freq) {
  577. p2p_dbg(p2p, "Update Listen frequency based on DS Parameter Set IE: %d -> %d MHz",
  578. freq, ds_freq);
  579. freq = ds_freq;
  580. }
  581. }
  582. if (dev->listen_freq && dev->listen_freq != freq && scan_res) {
  583. p2p_dbg(p2p, "Update Listen frequency based on scan results ("
  584. MACSTR " %d -> %d MHz (DS param %d)",
  585. MAC2STR(dev->info.p2p_device_addr), dev->listen_freq,
  586. freq, msg.ds_params ? *msg.ds_params : -1);
  587. }
  588. if (scan_res) {
  589. dev->listen_freq = freq;
  590. if (msg.group_info)
  591. dev->oper_freq = freq;
  592. }
  593. dev->info.level = level;
  594. p2p_copy_wps_info(p2p, dev, 0, &msg);
  595. for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
  596. wpabuf_free(dev->info.wps_vendor_ext[i]);
  597. dev->info.wps_vendor_ext[i] = NULL;
  598. }
  599. for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
  600. if (msg.wps_vendor_ext[i] == NULL)
  601. break;
  602. dev->info.wps_vendor_ext[i] = wpabuf_alloc_copy(
  603. msg.wps_vendor_ext[i], msg.wps_vendor_ext_len[i]);
  604. if (dev->info.wps_vendor_ext[i] == NULL)
  605. break;
  606. }
  607. if (msg.wfd_subelems) {
  608. wpabuf_free(dev->info.wfd_subelems);
  609. dev->info.wfd_subelems = wpabuf_dup(msg.wfd_subelems);
  610. }
  611. if (scan_res) {
  612. p2p_add_group_clients(p2p, p2p_dev_addr, addr, freq,
  613. msg.group_info, msg.group_info_len);
  614. }
  615. p2p_parse_free(&msg);
  616. if (p2p_pending_sd_req(p2p, dev))
  617. dev->flags |= P2P_DEV_SD_SCHEDULE;
  618. if (dev->flags & P2P_DEV_REPORTED)
  619. return 0;
  620. p2p_dbg(p2p, "Peer found with Listen frequency %d MHz (rx_time=%u.%06u)",
  621. freq, (unsigned int) rx_time->sec,
  622. (unsigned int) rx_time->usec);
  623. if (dev->flags & P2P_DEV_USER_REJECTED) {
  624. p2p_dbg(p2p, "Do not report rejected device");
  625. return 0;
  626. }
  627. if (dev->info.config_methods == 0 &&
  628. (freq == 2412 || freq == 2437 || freq == 2462)) {
  629. /*
  630. * If we have only seen a Beacon frame from a GO, we do not yet
  631. * know what WPS config methods it supports. Since some
  632. * applications use config_methods value from P2P-DEVICE-FOUND
  633. * events, postpone reporting this peer until we've fully
  634. * discovered its capabilities.
  635. *
  636. * At least for now, do this only if the peer was detected on
  637. * one of the social channels since that peer can be easily be
  638. * found again and there are no limitations of having to use
  639. * passive scan on this channels, so this can be done through
  640. * Probe Response frame that includes the config_methods
  641. * information.
  642. */
  643. p2p_dbg(p2p, "Do not report peer " MACSTR
  644. " with unknown config methods", MAC2STR(addr));
  645. return 0;
  646. }
  647. p2p->cfg->dev_found(p2p->cfg->cb_ctx, addr, &dev->info,
  648. !(dev->flags & P2P_DEV_REPORTED_ONCE));
  649. dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
  650. return 0;
  651. }
  652. static void p2p_device_free(struct p2p_data *p2p, struct p2p_device *dev)
  653. {
  654. int i;
  655. if (p2p->go_neg_peer == dev) {
  656. /*
  657. * If GO Negotiation is in progress, report that it has failed.
  658. */
  659. p2p_go_neg_failed(p2p, dev, -1);
  660. p2p->go_neg_peer = NULL;
  661. }
  662. if (p2p->invite_peer == dev)
  663. p2p->invite_peer = NULL;
  664. if (p2p->sd_peer == dev)
  665. p2p->sd_peer = NULL;
  666. if (p2p->pending_client_disc_go == dev)
  667. p2p->pending_client_disc_go = NULL;
  668. /* dev_lost() device, but only if it was previously dev_found() */
  669. if (dev->flags & P2P_DEV_REPORTED_ONCE)
  670. p2p->cfg->dev_lost(p2p->cfg->cb_ctx,
  671. dev->info.p2p_device_addr);
  672. for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
  673. wpabuf_free(dev->info.wps_vendor_ext[i]);
  674. dev->info.wps_vendor_ext[i] = NULL;
  675. }
  676. wpabuf_free(dev->info.wfd_subelems);
  677. os_free(dev);
  678. }
  679. static int p2p_get_next_prog_freq(struct p2p_data *p2p)
  680. {
  681. struct p2p_channels *c;
  682. struct p2p_reg_class *cla;
  683. size_t cl, ch;
  684. int found = 0;
  685. u8 reg_class;
  686. u8 channel;
  687. int freq;
  688. c = &p2p->cfg->channels;
  689. for (cl = 0; cl < c->reg_classes; cl++) {
  690. cla = &c->reg_class[cl];
  691. if (cla->reg_class != p2p->last_prog_scan_class)
  692. continue;
  693. for (ch = 0; ch < cla->channels; ch++) {
  694. if (cla->channel[ch] == p2p->last_prog_scan_chan) {
  695. found = 1;
  696. break;
  697. }
  698. }
  699. if (found)
  700. break;
  701. }
  702. if (!found) {
  703. /* Start from beginning */
  704. reg_class = c->reg_class[0].reg_class;
  705. channel = c->reg_class[0].channel[0];
  706. } else {
  707. /* Pick the next channel */
  708. ch++;
  709. if (ch == cla->channels) {
  710. cl++;
  711. if (cl == c->reg_classes)
  712. cl = 0;
  713. ch = 0;
  714. }
  715. reg_class = c->reg_class[cl].reg_class;
  716. channel = c->reg_class[cl].channel[ch];
  717. }
  718. freq = p2p_channel_to_freq(reg_class, channel);
  719. p2p_dbg(p2p, "Next progressive search channel: reg_class %u channel %u -> %d MHz",
  720. reg_class, channel, freq);
  721. p2p->last_prog_scan_class = reg_class;
  722. p2p->last_prog_scan_chan = channel;
  723. if (freq == 2412 || freq == 2437 || freq == 2462)
  724. return 0; /* No need to add social channels */
  725. return freq;
  726. }
  727. static void p2p_search(struct p2p_data *p2p)
  728. {
  729. int freq = 0;
  730. enum p2p_scan_type type;
  731. u16 pw_id = DEV_PW_DEFAULT;
  732. int res;
  733. if (p2p->drv_in_listen) {
  734. p2p_dbg(p2p, "Driver is still in Listen state - wait for it to end before continuing");
  735. return;
  736. }
  737. p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
  738. if (p2p->find_type == P2P_FIND_PROGRESSIVE &&
  739. (freq = p2p_get_next_prog_freq(p2p)) > 0) {
  740. type = P2P_SCAN_SOCIAL_PLUS_ONE;
  741. p2p_dbg(p2p, "Starting search (+ freq %u)", freq);
  742. } else {
  743. type = P2P_SCAN_SOCIAL;
  744. p2p_dbg(p2p, "Starting search");
  745. }
  746. res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, type, freq,
  747. p2p->num_req_dev_types, p2p->req_dev_types,
  748. p2p->find_dev_id, pw_id);
  749. if (res < 0) {
  750. p2p_dbg(p2p, "Scan request failed");
  751. p2p_continue_find(p2p);
  752. } else {
  753. p2p_dbg(p2p, "Running p2p_scan");
  754. p2p->p2p_scan_running = 1;
  755. eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
  756. eloop_register_timeout(P2P_SCAN_TIMEOUT, 0, p2p_scan_timeout,
  757. p2p, NULL);
  758. }
  759. }
  760. static void p2p_find_timeout(void *eloop_ctx, void *timeout_ctx)
  761. {
  762. struct p2p_data *p2p = eloop_ctx;
  763. p2p_dbg(p2p, "Find timeout -> stop");
  764. p2p_stop_find(p2p);
  765. }
  766. static int p2p_run_after_scan(struct p2p_data *p2p)
  767. {
  768. struct p2p_device *dev;
  769. enum p2p_after_scan op;
  770. if (p2p->after_scan_tx) {
  771. p2p->after_scan_tx_in_progress = 1;
  772. p2p_dbg(p2p, "Send pending Action frame at p2p_scan completion");
  773. p2p->cfg->send_action(p2p->cfg->cb_ctx,
  774. p2p->after_scan_tx->freq,
  775. p2p->after_scan_tx->dst,
  776. p2p->after_scan_tx->src,
  777. p2p->after_scan_tx->bssid,
  778. (u8 *) (p2p->after_scan_tx + 1),
  779. p2p->after_scan_tx->len,
  780. p2p->after_scan_tx->wait_time);
  781. os_free(p2p->after_scan_tx);
  782. p2p->after_scan_tx = NULL;
  783. return 1;
  784. }
  785. op = p2p->start_after_scan;
  786. p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
  787. switch (op) {
  788. case P2P_AFTER_SCAN_NOTHING:
  789. break;
  790. case P2P_AFTER_SCAN_LISTEN:
  791. p2p_dbg(p2p, "Start previously requested Listen state");
  792. p2p_listen(p2p, p2p->pending_listen_sec * 1000 +
  793. p2p->pending_listen_usec / 1000);
  794. return 1;
  795. case P2P_AFTER_SCAN_CONNECT:
  796. p2p_dbg(p2p, "Start previously requested connect with " MACSTR,
  797. MAC2STR(p2p->after_scan_peer));
  798. dev = p2p_get_device(p2p, p2p->after_scan_peer);
  799. if (dev == NULL) {
  800. p2p_dbg(p2p, "Peer not known anymore");
  801. break;
  802. }
  803. p2p_connect_send(p2p, dev);
  804. return 1;
  805. }
  806. return 0;
  807. }
  808. static void p2p_scan_timeout(void *eloop_ctx, void *timeout_ctx)
  809. {
  810. struct p2p_data *p2p = eloop_ctx;
  811. int running;
  812. p2p_dbg(p2p, "p2p_scan timeout (running=%d)", p2p->p2p_scan_running);
  813. running = p2p->p2p_scan_running;
  814. /* Make sure we recover from missed scan results callback */
  815. p2p->p2p_scan_running = 0;
  816. if (running)
  817. p2p_run_after_scan(p2p);
  818. }
  819. static void p2p_free_req_dev_types(struct p2p_data *p2p)
  820. {
  821. p2p->num_req_dev_types = 0;
  822. os_free(p2p->req_dev_types);
  823. p2p->req_dev_types = NULL;
  824. }
  825. int p2p_find(struct p2p_data *p2p, unsigned int timeout,
  826. enum p2p_discovery_type type,
  827. unsigned int num_req_dev_types, const u8 *req_dev_types,
  828. const u8 *dev_id, unsigned int search_delay)
  829. {
  830. int res;
  831. p2p_dbg(p2p, "Starting find (type=%d)", type);
  832. os_get_reltime(&p2p->find_start);
  833. if (p2p->p2p_scan_running) {
  834. p2p_dbg(p2p, "p2p_scan is already running");
  835. }
  836. p2p_free_req_dev_types(p2p);
  837. if (req_dev_types && num_req_dev_types) {
  838. p2p->req_dev_types = os_malloc(num_req_dev_types *
  839. WPS_DEV_TYPE_LEN);
  840. if (p2p->req_dev_types == NULL)
  841. return -1;
  842. os_memcpy(p2p->req_dev_types, req_dev_types,
  843. num_req_dev_types * WPS_DEV_TYPE_LEN);
  844. p2p->num_req_dev_types = num_req_dev_types;
  845. }
  846. if (dev_id) {
  847. os_memcpy(p2p->find_dev_id_buf, dev_id, ETH_ALEN);
  848. p2p->find_dev_id = p2p->find_dev_id_buf;
  849. } else
  850. p2p->find_dev_id = NULL;
  851. p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
  852. p2p_clear_timeout(p2p);
  853. p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
  854. p2p->find_type = type;
  855. p2p_device_clear_reported(p2p);
  856. p2p_set_state(p2p, P2P_SEARCH);
  857. p2p->search_delay = search_delay;
  858. p2p->in_search_delay = 0;
  859. eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);
  860. p2p->last_p2p_find_timeout = timeout;
  861. if (timeout)
  862. eloop_register_timeout(timeout, 0, p2p_find_timeout,
  863. p2p, NULL);
  864. switch (type) {
  865. case P2P_FIND_START_WITH_FULL:
  866. case P2P_FIND_PROGRESSIVE:
  867. res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, P2P_SCAN_FULL, 0,
  868. p2p->num_req_dev_types,
  869. p2p->req_dev_types, dev_id,
  870. DEV_PW_DEFAULT);
  871. break;
  872. case P2P_FIND_ONLY_SOCIAL:
  873. res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, P2P_SCAN_SOCIAL, 0,
  874. p2p->num_req_dev_types,
  875. p2p->req_dev_types, dev_id,
  876. DEV_PW_DEFAULT);
  877. break;
  878. default:
  879. return -1;
  880. }
  881. if (res == 0) {
  882. p2p_dbg(p2p, "Running p2p_scan");
  883. p2p->p2p_scan_running = 1;
  884. eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
  885. eloop_register_timeout(P2P_SCAN_TIMEOUT, 0, p2p_scan_timeout,
  886. p2p, NULL);
  887. } else if (p2p->p2p_scan_running) {
  888. p2p_dbg(p2p, "Failed to start p2p_scan - another p2p_scan was already running");
  889. /* wait for the previous p2p_scan to complete */
  890. } else {
  891. p2p_dbg(p2p, "Failed to start p2p_scan");
  892. p2p_set_state(p2p, P2P_IDLE);
  893. eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);
  894. }
  895. return res;
  896. }
  897. void p2p_stop_find_for_freq(struct p2p_data *p2p, int freq)
  898. {
  899. p2p_dbg(p2p, "Stopping find");
  900. eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);
  901. p2p_clear_timeout(p2p);
  902. if (p2p->state == P2P_SEARCH)
  903. p2p->cfg->find_stopped(p2p->cfg->cb_ctx);
  904. p2p_set_state(p2p, P2P_IDLE);
  905. p2p_free_req_dev_types(p2p);
  906. p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
  907. if (p2p->go_neg_peer)
  908. p2p->go_neg_peer->flags &= ~P2P_DEV_PEER_WAITING_RESPONSE;
  909. p2p->go_neg_peer = NULL;
  910. p2p->sd_peer = NULL;
  911. p2p->invite_peer = NULL;
  912. p2p_stop_listen_for_freq(p2p, freq);
  913. }
  914. void p2p_stop_listen_for_freq(struct p2p_data *p2p, int freq)
  915. {
  916. if (freq > 0 && p2p->drv_in_listen == freq && p2p->in_listen) {
  917. p2p_dbg(p2p, "Skip stop_listen since we are on correct channel for response");
  918. return;
  919. }
  920. if (p2p->in_listen) {
  921. p2p->in_listen = 0;
  922. p2p_clear_timeout(p2p);
  923. }
  924. if (p2p->drv_in_listen) {
  925. /*
  926. * The driver may not deliver callback to p2p_listen_end()
  927. * when the operation gets canceled, so clear the internal
  928. * variable that is tracking driver state.
  929. */
  930. p2p_dbg(p2p, "Clear drv_in_listen (%d)", p2p->drv_in_listen);
  931. p2p->drv_in_listen = 0;
  932. }
  933. p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
  934. }
  935. void p2p_stop_listen(struct p2p_data *p2p)
  936. {
  937. if (p2p->state != P2P_LISTEN_ONLY) {
  938. p2p_dbg(p2p, "Skip stop_listen since not in listen_only state.");
  939. return;
  940. }
  941. p2p_stop_listen_for_freq(p2p, 0);
  942. p2p_set_state(p2p, P2P_IDLE);
  943. }
  944. void p2p_stop_find(struct p2p_data *p2p)
  945. {
  946. p2p_stop_find_for_freq(p2p, 0);
  947. }
  948. static int p2p_prepare_channel_pref(struct p2p_data *p2p,
  949. unsigned int force_freq,
  950. unsigned int pref_freq, int go)
  951. {
  952. u8 op_class, op_channel;
  953. unsigned int freq = force_freq ? force_freq : pref_freq;
  954. p2p_dbg(p2p, "Prepare channel pref - force_freq=%u pref_freq=%u go=%d",
  955. force_freq, pref_freq, go);
  956. if (p2p_freq_to_channel(freq, &op_class, &op_channel) < 0) {
  957. p2p_dbg(p2p, "Unsupported frequency %u MHz", freq);
  958. return -1;
  959. }
  960. if (!p2p_channels_includes(&p2p->cfg->channels, op_class, op_channel) &&
  961. (go || !p2p_channels_includes(&p2p->cfg->cli_channels, op_class,
  962. op_channel))) {
  963. p2p_dbg(p2p, "Frequency %u MHz (oper_class %u channel %u) not allowed for P2P",
  964. freq, op_class, op_channel);
  965. return -1;
  966. }
  967. p2p->op_reg_class = op_class;
  968. p2p->op_channel = op_channel;
  969. if (force_freq) {
  970. p2p->channels.reg_classes = 1;
  971. p2p->channels.reg_class[0].channels = 1;
  972. p2p->channels.reg_class[0].reg_class = p2p->op_reg_class;
  973. p2p->channels.reg_class[0].channel[0] = p2p->op_channel;
  974. } else {
  975. os_memcpy(&p2p->channels, &p2p->cfg->channels,
  976. sizeof(struct p2p_channels));
  977. }
  978. return 0;
  979. }
  980. static void p2p_prepare_channel_best(struct p2p_data *p2p)
  981. {
  982. u8 op_class, op_channel;
  983. const int op_classes_5ghz[] = { 124, 115, 0 };
  984. const int op_classes_ht40[] = { 126, 127, 116, 117, 0 };
  985. const int op_classes_vht[] = { 128, 0 };
  986. p2p_dbg(p2p, "Prepare channel best");
  987. if (!p2p->cfg->cfg_op_channel && p2p->best_freq_overall > 0 &&
  988. p2p_supported_freq(p2p, p2p->best_freq_overall) &&
  989. p2p_freq_to_channel(p2p->best_freq_overall, &op_class, &op_channel)
  990. == 0) {
  991. p2p_dbg(p2p, "Select best overall channel as operating channel preference");
  992. p2p->op_reg_class = op_class;
  993. p2p->op_channel = op_channel;
  994. } else if (!p2p->cfg->cfg_op_channel && p2p->best_freq_5 > 0 &&
  995. p2p_supported_freq(p2p, p2p->best_freq_5) &&
  996. p2p_freq_to_channel(p2p->best_freq_5, &op_class, &op_channel)
  997. == 0) {
  998. p2p_dbg(p2p, "Select best 5 GHz channel as operating channel preference");
  999. p2p->op_reg_class = op_class;
  1000. p2p->op_channel = op_channel;
  1001. } else if (!p2p->cfg->cfg_op_channel && p2p->best_freq_24 > 0 &&
  1002. p2p_supported_freq(p2p, p2p->best_freq_24) &&
  1003. p2p_freq_to_channel(p2p->best_freq_24, &op_class,
  1004. &op_channel) == 0) {
  1005. p2p_dbg(p2p, "Select best 2.4 GHz channel as operating channel preference");
  1006. p2p->op_reg_class = op_class;
  1007. p2p->op_channel = op_channel;
  1008. } else if (p2p->cfg->num_pref_chan > 0 &&
  1009. p2p_channels_includes(&p2p->cfg->channels,
  1010. p2p->cfg->pref_chan[0].op_class,
  1011. p2p->cfg->pref_chan[0].chan)) {
  1012. p2p_dbg(p2p, "Select first pref_chan entry as operating channel preference");
  1013. p2p->op_reg_class = p2p->cfg->pref_chan[0].op_class;
  1014. p2p->op_channel = p2p->cfg->pref_chan[0].chan;
  1015. } else if (p2p_channel_select(&p2p->cfg->channels, op_classes_vht,
  1016. &p2p->op_reg_class, &p2p->op_channel) ==
  1017. 0) {
  1018. p2p_dbg(p2p, "Select possible VHT channel (op_class %u channel %u) as operating channel preference",
  1019. p2p->op_reg_class, p2p->op_channel);
  1020. } else if (p2p_channel_select(&p2p->cfg->channels, op_classes_ht40,
  1021. &p2p->op_reg_class, &p2p->op_channel) ==
  1022. 0) {
  1023. p2p_dbg(p2p, "Select possible HT40 channel (op_class %u channel %u) as operating channel preference",
  1024. p2p->op_reg_class, p2p->op_channel);
  1025. } else if (p2p_channel_select(&p2p->cfg->channels, op_classes_5ghz,
  1026. &p2p->op_reg_class, &p2p->op_channel) ==
  1027. 0) {
  1028. p2p_dbg(p2p, "Select possible 5 GHz channel (op_class %u channel %u) as operating channel preference",
  1029. p2p->op_reg_class, p2p->op_channel);
  1030. } else {
  1031. p2p_dbg(p2p, "Select pre-configured channel as operating channel preference");
  1032. p2p->op_reg_class = p2p->cfg->op_reg_class;
  1033. p2p->op_channel = p2p->cfg->op_channel;
  1034. }
  1035. os_memcpy(&p2p->channels, &p2p->cfg->channels,
  1036. sizeof(struct p2p_channels));
  1037. }
  1038. /**
  1039. * p2p_prepare_channel - Select operating channel for GO Negotiation
  1040. * @p2p: P2P module context from p2p_init()
  1041. * @dev: Selected peer device
  1042. * @force_freq: Forced frequency in MHz or 0 if not forced
  1043. * @pref_freq: Preferred frequency in MHz or 0 if no preference
  1044. * @go: Whether the local end will be forced to be GO
  1045. * Returns: 0 on success, -1 on failure (channel not supported for P2P)
  1046. *
  1047. * This function is used to do initial operating channel selection for GO
  1048. * Negotiation prior to having received peer information. The selected channel
  1049. * may be further optimized in p2p_reselect_channel() once the peer information
  1050. * is available.
  1051. */
  1052. int p2p_prepare_channel(struct p2p_data *p2p, struct p2p_device *dev,
  1053. unsigned int force_freq, unsigned int pref_freq, int go)
  1054. {
  1055. p2p_dbg(p2p, "Prepare channel - force_freq=%u pref_freq=%u go=%d",
  1056. force_freq, pref_freq, go);
  1057. if (force_freq || pref_freq) {
  1058. if (p2p_prepare_channel_pref(p2p, force_freq, pref_freq, go) <
  1059. 0)
  1060. return -1;
  1061. } else {
  1062. p2p_prepare_channel_best(p2p);
  1063. }
  1064. p2p_channels_dump(p2p, "prepared channels", &p2p->channels);
  1065. if (go)
  1066. p2p_channels_remove_freqs(&p2p->channels, &p2p->no_go_freq);
  1067. else if (!force_freq)
  1068. p2p_channels_union(&p2p->channels, &p2p->cfg->cli_channels,
  1069. &p2p->channels);
  1070. p2p_channels_dump(p2p, "after go/cli filter/add", &p2p->channels);
  1071. p2p_dbg(p2p, "Own preference for operation channel: Operating Class %u Channel %u%s",
  1072. p2p->op_reg_class, p2p->op_channel,
  1073. force_freq ? " (forced)" : "");
  1074. if (force_freq)
  1075. dev->flags |= P2P_DEV_FORCE_FREQ;
  1076. else
  1077. dev->flags &= ~P2P_DEV_FORCE_FREQ;
  1078. return 0;
  1079. }
  1080. static void p2p_set_dev_persistent(struct p2p_device *dev,
  1081. int persistent_group)
  1082. {
  1083. switch (persistent_group) {
  1084. case 0:
  1085. dev->flags &= ~(P2P_DEV_PREFER_PERSISTENT_GROUP |
  1086. P2P_DEV_PREFER_PERSISTENT_RECONN);
  1087. break;
  1088. case 1:
  1089. dev->flags |= P2P_DEV_PREFER_PERSISTENT_GROUP;
  1090. dev->flags &= ~P2P_DEV_PREFER_PERSISTENT_RECONN;
  1091. break;
  1092. case 2:
  1093. dev->flags |= P2P_DEV_PREFER_PERSISTENT_GROUP |
  1094. P2P_DEV_PREFER_PERSISTENT_RECONN;
  1095. break;
  1096. }
  1097. }
  1098. int p2p_connect(struct p2p_data *p2p, const u8 *peer_addr,
  1099. enum p2p_wps_method wps_method,
  1100. int go_intent, const u8 *own_interface_addr,
  1101. unsigned int force_freq, int persistent_group,
  1102. const u8 *force_ssid, size_t force_ssid_len,
  1103. int pd_before_go_neg, unsigned int pref_freq)
  1104. {
  1105. struct p2p_device *dev;
  1106. p2p_dbg(p2p, "Request to start group negotiation - peer=" MACSTR
  1107. " GO Intent=%d Intended Interface Address=" MACSTR
  1108. " wps_method=%d persistent_group=%d pd_before_go_neg=%d",
  1109. MAC2STR(peer_addr), go_intent, MAC2STR(own_interface_addr),
  1110. wps_method, persistent_group, pd_before_go_neg);
  1111. dev = p2p_get_device(p2p, peer_addr);
  1112. if (dev == NULL || (dev->flags & P2P_DEV_PROBE_REQ_ONLY)) {
  1113. p2p_dbg(p2p, "Cannot connect to unknown P2P Device " MACSTR,
  1114. MAC2STR(peer_addr));
  1115. return -1;
  1116. }
  1117. if (p2p_prepare_channel(p2p, dev, force_freq, pref_freq,
  1118. go_intent == 15) < 0)
  1119. return -1;
  1120. if (dev->flags & P2P_DEV_GROUP_CLIENT_ONLY) {
  1121. if (!(dev->info.dev_capab &
  1122. P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY)) {
  1123. p2p_dbg(p2p, "Cannot connect to P2P Device " MACSTR
  1124. " that is in a group and is not discoverable",
  1125. MAC2STR(peer_addr));
  1126. return -1;
  1127. }
  1128. if (dev->oper_freq <= 0) {
  1129. p2p_dbg(p2p, "Cannot connect to P2P Device " MACSTR
  1130. " with incomplete information",
  1131. MAC2STR(peer_addr));
  1132. return -1;
  1133. }
  1134. /*
  1135. * First, try to connect directly. If the peer does not
  1136. * acknowledge frames, assume it is sleeping and use device
  1137. * discoverability via the GO at that point.
  1138. */
  1139. }
  1140. p2p->ssid_set = 0;
  1141. if (force_ssid) {
  1142. wpa_hexdump_ascii(MSG_DEBUG, "P2P: Forced SSID",
  1143. force_ssid, force_ssid_len);
  1144. os_memcpy(p2p->ssid, force_ssid, force_ssid_len);
  1145. p2p->ssid_len = force_ssid_len;
  1146. p2p->ssid_set = 1;
  1147. }
  1148. dev->flags &= ~P2P_DEV_NOT_YET_READY;
  1149. dev->flags &= ~P2P_DEV_USER_REJECTED;
  1150. dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;
  1151. dev->flags &= ~P2P_DEV_WAIT_GO_NEG_CONFIRM;
  1152. if (pd_before_go_neg)
  1153. dev->flags |= P2P_DEV_PD_BEFORE_GO_NEG;
  1154. else {
  1155. dev->flags &= ~P2P_DEV_PD_BEFORE_GO_NEG;
  1156. /*
  1157. * Assign dialog token and tie breaker here to use the same
  1158. * values in each retry within the same GO Negotiation exchange.
  1159. */
  1160. dev->dialog_token++;
  1161. if (dev->dialog_token == 0)
  1162. dev->dialog_token = 1;
  1163. dev->tie_breaker = p2p->next_tie_breaker;
  1164. p2p->next_tie_breaker = !p2p->next_tie_breaker;
  1165. }
  1166. dev->connect_reqs = 0;
  1167. dev->go_neg_req_sent = 0;
  1168. dev->go_state = UNKNOWN_GO;
  1169. p2p_set_dev_persistent(dev, persistent_group);
  1170. p2p->go_intent = go_intent;
  1171. os_memcpy(p2p->intended_addr, own_interface_addr, ETH_ALEN);
  1172. if (p2p->state != P2P_IDLE)
  1173. p2p_stop_find(p2p);
  1174. if (p2p->after_scan_tx) {
  1175. /*
  1176. * We need to drop the pending frame to avoid issues with the
  1177. * new GO Negotiation, e.g., when the pending frame was from a
  1178. * previous attempt at starting a GO Negotiation.
  1179. */
  1180. p2p_dbg(p2p, "Dropped previous pending Action frame TX that was waiting for p2p_scan completion");
  1181. os_free(p2p->after_scan_tx);
  1182. p2p->after_scan_tx = NULL;
  1183. }
  1184. dev->wps_method = wps_method;
  1185. dev->status = P2P_SC_SUCCESS;
  1186. if (p2p->p2p_scan_running) {
  1187. p2p_dbg(p2p, "p2p_scan running - delay connect send");
  1188. p2p->start_after_scan = P2P_AFTER_SCAN_CONNECT;
  1189. os_memcpy(p2p->after_scan_peer, peer_addr, ETH_ALEN);
  1190. return 0;
  1191. }
  1192. p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
  1193. return p2p_connect_send(p2p, dev);
  1194. }
  1195. int p2p_authorize(struct p2p_data *p2p, const u8 *peer_addr,
  1196. enum p2p_wps_method wps_method,
  1197. int go_intent, const u8 *own_interface_addr,
  1198. unsigned int force_freq, int persistent_group,
  1199. const u8 *force_ssid, size_t force_ssid_len,
  1200. unsigned int pref_freq)
  1201. {
  1202. struct p2p_device *dev;
  1203. p2p_dbg(p2p, "Request to authorize group negotiation - peer=" MACSTR
  1204. " GO Intent=%d Intended Interface Address=" MACSTR
  1205. " wps_method=%d persistent_group=%d",
  1206. MAC2STR(peer_addr), go_intent, MAC2STR(own_interface_addr),
  1207. wps_method, persistent_group);
  1208. dev = p2p_get_device(p2p, peer_addr);
  1209. if (dev == NULL) {
  1210. p2p_dbg(p2p, "Cannot authorize unknown P2P Device " MACSTR,
  1211. MAC2STR(peer_addr));
  1212. return -1;
  1213. }
  1214. if (p2p_prepare_channel(p2p, dev, force_freq, pref_freq, go_intent ==
  1215. 15) < 0)
  1216. return -1;
  1217. p2p->ssid_set = 0;
  1218. if (force_ssid) {
  1219. wpa_hexdump_ascii(MSG_DEBUG, "P2P: Forced SSID",
  1220. force_ssid, force_ssid_len);
  1221. os_memcpy(p2p->ssid, force_ssid, force_ssid_len);
  1222. p2p->ssid_len = force_ssid_len;
  1223. p2p->ssid_set = 1;
  1224. }
  1225. dev->flags &= ~P2P_DEV_NOT_YET_READY;
  1226. dev->flags &= ~P2P_DEV_USER_REJECTED;
  1227. dev->go_neg_req_sent = 0;
  1228. dev->go_state = UNKNOWN_GO;
  1229. p2p_set_dev_persistent(dev, persistent_group);
  1230. p2p->go_intent = go_intent;
  1231. os_memcpy(p2p->intended_addr, own_interface_addr, ETH_ALEN);
  1232. dev->wps_method = wps_method;
  1233. dev->status = P2P_SC_SUCCESS;
  1234. return 0;
  1235. }
  1236. void p2p_add_dev_info(struct p2p_data *p2p, const u8 *addr,
  1237. struct p2p_device *dev, struct p2p_message *msg)
  1238. {
  1239. os_get_reltime(&dev->last_seen);
  1240. p2p_copy_wps_info(p2p, dev, 0, msg);
  1241. if (msg->listen_channel) {
  1242. int freq;
  1243. freq = p2p_channel_to_freq(msg->listen_channel[3],
  1244. msg->listen_channel[4]);
  1245. if (freq < 0) {
  1246. p2p_dbg(p2p, "Unknown peer Listen channel: "
  1247. "country=%c%c(0x%02x) reg_class=%u channel=%u",
  1248. msg->listen_channel[0],
  1249. msg->listen_channel[1],
  1250. msg->listen_channel[2],
  1251. msg->listen_channel[3],
  1252. msg->listen_channel[4]);
  1253. } else {
  1254. p2p_dbg(p2p, "Update peer " MACSTR
  1255. " Listen channel: %u -> %u MHz",
  1256. MAC2STR(dev->info.p2p_device_addr),
  1257. dev->listen_freq, freq);
  1258. dev->listen_freq = freq;
  1259. }
  1260. }
  1261. if (msg->wfd_subelems) {
  1262. wpabuf_free(dev->info.wfd_subelems);
  1263. dev->info.wfd_subelems = wpabuf_dup(msg->wfd_subelems);
  1264. }
  1265. if (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
  1266. dev->flags &= ~P2P_DEV_PROBE_REQ_ONLY;
  1267. p2p_dbg(p2p, "Completed device entry based on data from GO Negotiation Request");
  1268. } else {
  1269. p2p_dbg(p2p, "Created device entry based on GO Neg Req: "
  1270. MACSTR " dev_capab=0x%x group_capab=0x%x name='%s' "
  1271. "listen_freq=%d",
  1272. MAC2STR(dev->info.p2p_device_addr),
  1273. dev->info.dev_capab, dev->info.group_capab,
  1274. dev->info.device_name, dev->listen_freq);
  1275. }
  1276. dev->flags &= ~P2P_DEV_GROUP_CLIENT_ONLY;
  1277. if (dev->flags & P2P_DEV_USER_REJECTED) {
  1278. p2p_dbg(p2p, "Do not report rejected device");
  1279. return;
  1280. }
  1281. p2p->cfg->dev_found(p2p->cfg->cb_ctx, addr, &dev->info,
  1282. !(dev->flags & P2P_DEV_REPORTED_ONCE));
  1283. dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
  1284. }
  1285. void p2p_build_ssid(struct p2p_data *p2p, u8 *ssid, size_t *ssid_len)
  1286. {
  1287. os_memcpy(ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN);
  1288. p2p_random((char *) &ssid[P2P_WILDCARD_SSID_LEN], 2);
  1289. os_memcpy(&ssid[P2P_WILDCARD_SSID_LEN + 2],
  1290. p2p->cfg->ssid_postfix, p2p->cfg->ssid_postfix_len);
  1291. *ssid_len = P2P_WILDCARD_SSID_LEN + 2 + p2p->cfg->ssid_postfix_len;
  1292. }
  1293. int p2p_go_params(struct p2p_data *p2p, struct p2p_go_neg_results *params)
  1294. {
  1295. p2p_build_ssid(p2p, params->ssid, &params->ssid_len);
  1296. p2p_random(params->passphrase, 8);
  1297. return 0;
  1298. }
  1299. void p2p_go_complete(struct p2p_data *p2p, struct p2p_device *peer)
  1300. {
  1301. struct p2p_go_neg_results res;
  1302. int go = peer->go_state == LOCAL_GO;
  1303. struct p2p_channels intersection;
  1304. int freqs;
  1305. size_t i, j;
  1306. p2p_dbg(p2p, "GO Negotiation with " MACSTR " completed (%s will be GO)",
  1307. MAC2STR(peer->info.p2p_device_addr), go ? "local end" : "peer");
  1308. os_memset(&res, 0, sizeof(res));
  1309. res.role_go = go;
  1310. os_memcpy(res.peer_device_addr, peer->info.p2p_device_addr, ETH_ALEN);
  1311. os_memcpy(res.peer_interface_addr, peer->intended_addr, ETH_ALEN);
  1312. res.wps_method = peer->wps_method;
  1313. if (peer->flags & P2P_DEV_PREFER_PERSISTENT_GROUP) {
  1314. if (peer->flags & P2P_DEV_PREFER_PERSISTENT_RECONN)
  1315. res.persistent_group = 2;
  1316. else
  1317. res.persistent_group = 1;
  1318. }
  1319. if (go) {
  1320. /* Setup AP mode for WPS provisioning */
  1321. res.freq = p2p_channel_to_freq(p2p->op_reg_class,
  1322. p2p->op_channel);
  1323. os_memcpy(res.ssid, p2p->ssid, p2p->ssid_len);
  1324. res.ssid_len = p2p->ssid_len;
  1325. p2p_random(res.passphrase, 8);
  1326. } else {
  1327. res.freq = peer->oper_freq;
  1328. if (p2p->ssid_len) {
  1329. os_memcpy(res.ssid, p2p->ssid, p2p->ssid_len);
  1330. res.ssid_len = p2p->ssid_len;
  1331. }
  1332. }
  1333. p2p_channels_dump(p2p, "own channels", &p2p->channels);
  1334. p2p_channels_dump(p2p, "peer channels", &peer->channels);
  1335. p2p_channels_intersect(&p2p->channels, &peer->channels,
  1336. &intersection);
  1337. if (go) {
  1338. p2p_channels_remove_freqs(&intersection, &p2p->no_go_freq);
  1339. p2p_channels_dump(p2p, "intersection after no-GO removal",
  1340. &intersection);
  1341. }
  1342. freqs = 0;
  1343. for (i = 0; i < intersection.reg_classes; i++) {
  1344. struct p2p_reg_class *c = &intersection.reg_class[i];
  1345. if (freqs + 1 == P2P_MAX_CHANNELS)
  1346. break;
  1347. for (j = 0; j < c->channels; j++) {
  1348. int freq;
  1349. if (freqs + 1 == P2P_MAX_CHANNELS)
  1350. break;
  1351. freq = p2p_channel_to_freq(c->reg_class, c->channel[j]);
  1352. if (freq < 0)
  1353. continue;
  1354. res.freq_list[freqs++] = freq;
  1355. }
  1356. }
  1357. res.peer_config_timeout = go ? peer->client_timeout : peer->go_timeout;
  1358. p2p_clear_timeout(p2p);
  1359. p2p->ssid_set = 0;
  1360. peer->go_neg_req_sent = 0;
  1361. peer->wps_method = WPS_NOT_READY;
  1362. p2p_set_state(p2p, P2P_PROVISIONING);
  1363. p2p->cfg->go_neg_completed(p2p->cfg->cb_ctx, &res);
  1364. }
  1365. static void p2p_rx_p2p_action(struct p2p_data *p2p, const u8 *sa,
  1366. const u8 *data, size_t len, int rx_freq)
  1367. {
  1368. p2p_dbg(p2p, "RX P2P Public Action from " MACSTR, MAC2STR(sa));
  1369. wpa_hexdump(MSG_MSGDUMP, "P2P: P2P Public Action contents", data, len);
  1370. if (len < 1)
  1371. return;
  1372. switch (data[0]) {
  1373. case P2P_GO_NEG_REQ:
  1374. p2p_process_go_neg_req(p2p, sa, data + 1, len - 1, rx_freq);
  1375. break;
  1376. case P2P_GO_NEG_RESP:
  1377. p2p_process_go_neg_resp(p2p, sa, data + 1, len - 1, rx_freq);
  1378. break;
  1379. case P2P_GO_NEG_CONF:
  1380. p2p_process_go_neg_conf(p2p, sa, data + 1, len - 1);
  1381. break;
  1382. case P2P_INVITATION_REQ:
  1383. p2p_process_invitation_req(p2p, sa, data + 1, len - 1,
  1384. rx_freq);
  1385. break;
  1386. case P2P_INVITATION_RESP:
  1387. p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
  1388. p2p_process_invitation_resp(p2p, sa, data + 1, len - 1);
  1389. break;
  1390. case P2P_PROV_DISC_REQ:
  1391. p2p_process_prov_disc_req(p2p, sa, data + 1, len - 1, rx_freq);
  1392. break;
  1393. case P2P_PROV_DISC_RESP:
  1394. p2p_process_prov_disc_resp(p2p, sa, data + 1, len - 1);
  1395. break;
  1396. case P2P_DEV_DISC_REQ:
  1397. p2p_process_dev_disc_req(p2p, sa, data + 1, len - 1, rx_freq);
  1398. break;
  1399. case P2P_DEV_DISC_RESP:
  1400. p2p_process_dev_disc_resp(p2p, sa, data + 1, len - 1);
  1401. break;
  1402. default:
  1403. p2p_dbg(p2p, "Unsupported P2P Public Action frame type %d",
  1404. data[0]);
  1405. break;
  1406. }
  1407. }
  1408. static void p2p_rx_action_public(struct p2p_data *p2p, const u8 *da,
  1409. const u8 *sa, const u8 *bssid, const u8 *data,
  1410. size_t len, int freq)
  1411. {
  1412. if (len < 1)
  1413. return;
  1414. switch (data[0]) {
  1415. case WLAN_PA_VENDOR_SPECIFIC:
  1416. data++;
  1417. len--;
  1418. if (len < 3)
  1419. return;
  1420. if (WPA_GET_BE24(data) != OUI_WFA)
  1421. return;
  1422. data += 3;
  1423. len -= 3;
  1424. if (len < 1)
  1425. return;
  1426. if (*data != P2P_OUI_TYPE)
  1427. return;
  1428. p2p_rx_p2p_action(p2p, sa, data + 1, len - 1, freq);
  1429. break;
  1430. case WLAN_PA_GAS_INITIAL_REQ:
  1431. p2p_rx_gas_initial_req(p2p, sa, data + 1, len - 1, freq);
  1432. break;
  1433. case WLAN_PA_GAS_INITIAL_RESP:
  1434. p2p_rx_gas_initial_resp(p2p, sa, data + 1, len - 1, freq);
  1435. break;
  1436. case WLAN_PA_GAS_COMEBACK_REQ:
  1437. p2p_rx_gas_comeback_req(p2p, sa, data + 1, len - 1, freq);
  1438. break;
  1439. case WLAN_PA_GAS_COMEBACK_RESP:
  1440. p2p_rx_gas_comeback_resp(p2p, sa, data + 1, len - 1, freq);
  1441. break;
  1442. }
  1443. }
  1444. void p2p_rx_action(struct p2p_data *p2p, const u8 *da, const u8 *sa,
  1445. const u8 *bssid, u8 category,
  1446. const u8 *data, size_t len, int freq)
  1447. {
  1448. if (category == WLAN_ACTION_PUBLIC) {
  1449. p2p_rx_action_public(p2p, da, sa, bssid, data, len, freq);
  1450. return;
  1451. }
  1452. if (category != WLAN_ACTION_VENDOR_SPECIFIC)
  1453. return;
  1454. if (len < 4)
  1455. return;
  1456. if (WPA_GET_BE24(data) != OUI_WFA)
  1457. return;
  1458. data += 3;
  1459. len -= 3;
  1460. if (*data != P2P_OUI_TYPE)
  1461. return;
  1462. data++;
  1463. len--;
  1464. /* P2P action frame */
  1465. p2p_dbg(p2p, "RX P2P Action from " MACSTR, MAC2STR(sa));
  1466. wpa_hexdump(MSG_MSGDUMP, "P2P: P2P Action contents", data, len);
  1467. if (len < 1)
  1468. return;
  1469. switch (data[0]) {
  1470. case P2P_NOA:
  1471. p2p_dbg(p2p, "Received P2P Action - Notice of Absence");
  1472. /* TODO */
  1473. break;
  1474. case P2P_PRESENCE_REQ:
  1475. p2p_process_presence_req(p2p, da, sa, data + 1, len - 1, freq);
  1476. break;
  1477. case P2P_PRESENCE_RESP:
  1478. p2p_process_presence_resp(p2p, da, sa, data + 1, len - 1);
  1479. break;
  1480. case P2P_GO_DISC_REQ:
  1481. p2p_process_go_disc_req(p2p, da, sa, data + 1, len - 1, freq);
  1482. break;
  1483. default:
  1484. p2p_dbg(p2p, "Received P2P Action - unknown type %u", data[0]);
  1485. break;
  1486. }
  1487. }
  1488. static void p2p_go_neg_start(void *eloop_ctx, void *timeout_ctx)
  1489. {
  1490. struct p2p_data *p2p = eloop_ctx;
  1491. if (p2p->go_neg_peer == NULL)
  1492. return;
  1493. p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
  1494. p2p->go_neg_peer->status = P2P_SC_SUCCESS;
  1495. p2p_connect_send(p2p, p2p->go_neg_peer);
  1496. }
  1497. static void p2p_invite_start(void *eloop_ctx, void *timeout_ctx)
  1498. {
  1499. struct p2p_data *p2p = eloop_ctx;
  1500. if (p2p->invite_peer == NULL)
  1501. return;
  1502. p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
  1503. p2p_invite_send(p2p, p2p->invite_peer, p2p->invite_go_dev_addr);
  1504. }
  1505. static void p2p_add_dev_from_probe_req(struct p2p_data *p2p, const u8 *addr,
  1506. const u8 *ie, size_t ie_len)
  1507. {
  1508. struct p2p_message msg;
  1509. struct p2p_device *dev;
  1510. os_memset(&msg, 0, sizeof(msg));
  1511. if (p2p_parse_ies(ie, ie_len, &msg) < 0 || msg.p2p_attributes == NULL)
  1512. {
  1513. p2p_parse_free(&msg);
  1514. return; /* not a P2P probe */
  1515. }
  1516. if (msg.ssid == NULL || msg.ssid[1] != P2P_WILDCARD_SSID_LEN ||
  1517. os_memcmp(msg.ssid + 2, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN)
  1518. != 0) {
  1519. /* The Probe Request is not part of P2P Device Discovery. It is
  1520. * not known whether the source address of the frame is the P2P
  1521. * Device Address or P2P Interface Address. Do not add a new
  1522. * peer entry based on this frames.
  1523. */
  1524. p2p_parse_free(&msg);
  1525. return;
  1526. }
  1527. dev = p2p_get_device(p2p, addr);
  1528. if (dev) {
  1529. if (dev->country[0] == 0 && msg.listen_channel)
  1530. os_memcpy(dev->country, msg.listen_channel, 3);
  1531. os_get_reltime(&dev->last_seen);
  1532. p2p_parse_free(&msg);
  1533. return; /* already known */
  1534. }
  1535. dev = p2p_create_device(p2p, addr);
  1536. if (dev == NULL) {
  1537. p2p_parse_free(&msg);
  1538. return;
  1539. }
  1540. os_get_reltime(&dev->last_seen);
  1541. dev->flags |= P2P_DEV_PROBE_REQ_ONLY;
  1542. if (msg.listen_channel) {
  1543. os_memcpy(dev->country, msg.listen_channel, 3);
  1544. dev->listen_freq = p2p_channel_to_freq(msg.listen_channel[3],
  1545. msg.listen_channel[4]);
  1546. }
  1547. p2p_copy_wps_info(p2p, dev, 1, &msg);
  1548. if (msg.wfd_subelems) {
  1549. wpabuf_free(dev->info.wfd_subelems);
  1550. dev->info.wfd_subelems = wpabuf_dup(msg.wfd_subelems);
  1551. }
  1552. p2p_parse_free(&msg);
  1553. p2p_dbg(p2p, "Created device entry based on Probe Req: " MACSTR
  1554. " dev_capab=0x%x group_capab=0x%x name='%s' listen_freq=%d",
  1555. MAC2STR(dev->info.p2p_device_addr), dev->info.dev_capab,
  1556. dev->info.group_capab, dev->info.device_name,
  1557. dev->listen_freq);
  1558. }
  1559. struct p2p_device * p2p_add_dev_from_go_neg_req(struct p2p_data *p2p,
  1560. const u8 *addr,
  1561. struct p2p_message *msg)
  1562. {
  1563. struct p2p_device *dev;
  1564. dev = p2p_get_device(p2p, addr);
  1565. if (dev) {
  1566. os_get_reltime(&dev->last_seen);
  1567. return dev; /* already known */
  1568. }
  1569. dev = p2p_create_device(p2p, addr);
  1570. if (dev == NULL)
  1571. return NULL;
  1572. p2p_add_dev_info(p2p, addr, dev, msg);
  1573. return dev;
  1574. }
  1575. static int dev_type_match(const u8 *dev_type, const u8 *req_dev_type)
  1576. {
  1577. if (os_memcmp(dev_type, req_dev_type, WPS_DEV_TYPE_LEN) == 0)
  1578. return 1;
  1579. if (os_memcmp(dev_type, req_dev_type, 2) == 0 &&
  1580. WPA_GET_BE32(&req_dev_type[2]) == 0 &&
  1581. WPA_GET_BE16(&req_dev_type[6]) == 0)
  1582. return 1; /* Category match with wildcard OUI/sub-category */
  1583. return 0;
  1584. }
  1585. int dev_type_list_match(const u8 *dev_type, const u8 *req_dev_type[],
  1586. size_t num_req_dev_type)
  1587. {
  1588. size_t i;
  1589. for (i = 0; i < num_req_dev_type; i++) {
  1590. if (dev_type_match(dev_type, req_dev_type[i]))
  1591. return 1;
  1592. }
  1593. return 0;
  1594. }
  1595. /**
  1596. * p2p_match_dev_type - Match local device type with requested type
  1597. * @p2p: P2P module context from p2p_init()
  1598. * @wps: WPS TLVs from Probe Request frame (concatenated WPS IEs)
  1599. * Returns: 1 on match, 0 on mismatch
  1600. *
  1601. * This function can be used to match the Requested Device Type attribute in
  1602. * WPS IE with the local device types for deciding whether to reply to a Probe
  1603. * Request frame.
  1604. */
  1605. int p2p_match_dev_type(struct p2p_data *p2p, struct wpabuf *wps)
  1606. {
  1607. struct wps_parse_attr attr;
  1608. size_t i;
  1609. if (wps_parse_msg(wps, &attr))
  1610. return 1; /* assume no Requested Device Type attributes */
  1611. if (attr.num_req_dev_type == 0)
  1612. return 1; /* no Requested Device Type attributes -> match */
  1613. if (dev_type_list_match(p2p->cfg->pri_dev_type, attr.req_dev_type,
  1614. attr.num_req_dev_type))
  1615. return 1; /* Own Primary Device Type matches */
  1616. for (i = 0; i < p2p->cfg->num_sec_dev_types; i++)
  1617. if (dev_type_list_match(p2p->cfg->sec_dev_type[i],
  1618. attr.req_dev_type,
  1619. attr.num_req_dev_type))
  1620. return 1; /* Own Secondary Device Type matches */
  1621. /* No matching device type found */
  1622. return 0;
  1623. }
  1624. struct wpabuf * p2p_build_probe_resp_ies(struct p2p_data *p2p)
  1625. {
  1626. struct wpabuf *buf;
  1627. u8 *len;
  1628. int pw_id = -1;
  1629. size_t extra = 0;
  1630. #ifdef CONFIG_WIFI_DISPLAY
  1631. if (p2p->wfd_ie_probe_resp)
  1632. extra = wpabuf_len(p2p->wfd_ie_probe_resp);
  1633. #endif /* CONFIG_WIFI_DISPLAY */
  1634. buf = wpabuf_alloc(1000 + extra);
  1635. if (buf == NULL)
  1636. return NULL;
  1637. if (p2p->go_neg_peer) {
  1638. /* Advertise immediate availability of WPS credential */
  1639. pw_id = p2p_wps_method_pw_id(p2p->go_neg_peer->wps_method);
  1640. }
  1641. if (p2p_build_wps_ie(p2p, buf, pw_id, 1) < 0) {
  1642. p2p_dbg(p2p, "Failed to build WPS IE for Probe Response");
  1643. wpabuf_free(buf);
  1644. return NULL;
  1645. }
  1646. #ifdef CONFIG_WIFI_DISPLAY
  1647. if (p2p->wfd_ie_probe_resp)
  1648. wpabuf_put_buf(buf, p2p->wfd_ie_probe_resp);
  1649. #endif /* CONFIG_WIFI_DISPLAY */
  1650. /* P2P IE */
  1651. len = p2p_buf_add_ie_hdr(buf);
  1652. p2p_buf_add_capability(buf, p2p->dev_capab &
  1653. ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY, 0);
  1654. if (p2p->ext_listen_interval)
  1655. p2p_buf_add_ext_listen_timing(buf, p2p->ext_listen_period,
  1656. p2p->ext_listen_interval);
  1657. p2p_buf_add_device_info(buf, p2p, NULL);
  1658. p2p_buf_update_ie_hdr(buf, len);
  1659. return buf;
  1660. }
  1661. static enum p2p_probe_req_status
  1662. p2p_reply_probe(struct p2p_data *p2p, const u8 *addr, const u8 *dst,
  1663. const u8 *bssid, const u8 *ie, size_t ie_len)
  1664. {
  1665. struct ieee802_11_elems elems;
  1666. struct wpabuf *buf;
  1667. struct ieee80211_mgmt *resp;
  1668. struct p2p_message msg;
  1669. struct wpabuf *ies;
  1670. if (!p2p->in_listen || !p2p->drv_in_listen) {
  1671. /* not in Listen state - ignore Probe Request */
  1672. return P2P_PREQ_NOT_LISTEN;
  1673. }
  1674. if (ieee802_11_parse_elems((u8 *) ie, ie_len, &elems, 0) ==
  1675. ParseFailed) {
  1676. /* Ignore invalid Probe Request frames */
  1677. return P2P_PREQ_MALFORMED;
  1678. }
  1679. if (elems.p2p == NULL) {
  1680. /* not a P2P probe - ignore it */
  1681. return P2P_PREQ_NOT_P2P;
  1682. }
  1683. if (dst && !is_broadcast_ether_addr(dst) &&
  1684. os_memcmp(dst, p2p->cfg->dev_addr, ETH_ALEN) != 0) {
  1685. /* Not sent to the broadcast address or our P2P Device Address
  1686. */
  1687. return P2P_PREQ_NOT_PROCESSED;
  1688. }
  1689. if (bssid && !is_broadcast_ether_addr(bssid)) {
  1690. /* Not sent to the Wildcard BSSID */
  1691. return P2P_PREQ_NOT_PROCESSED;
  1692. }
  1693. if (elems.ssid == NULL || elems.ssid_len != P2P_WILDCARD_SSID_LEN ||
  1694. os_memcmp(elems.ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN) !=
  1695. 0) {
  1696. /* not using P2P Wildcard SSID - ignore */
  1697. return P2P_PREQ_NOT_PROCESSED;
  1698. }
  1699. if (supp_rates_11b_only(&elems)) {
  1700. /* Indicates support for 11b rates only */
  1701. return P2P_PREQ_NOT_P2P;
  1702. }
  1703. os_memset(&msg, 0, sizeof(msg));
  1704. if (p2p_parse_ies(ie, ie_len, &msg) < 0) {
  1705. /* Could not parse P2P attributes */
  1706. return P2P_PREQ_NOT_P2P;
  1707. }
  1708. if (msg.device_id &&
  1709. os_memcmp(msg.device_id, p2p->cfg->dev_addr, ETH_ALEN) != 0) {
  1710. /* Device ID did not match */
  1711. p2p_parse_free(&msg);
  1712. return P2P_PREQ_NOT_PROCESSED;
  1713. }
  1714. /* Check Requested Device Type match */
  1715. if (msg.wps_attributes &&
  1716. !p2p_match_dev_type(p2p, msg.wps_attributes)) {
  1717. /* No match with Requested Device Type */
  1718. p2p_parse_free(&msg);
  1719. return P2P_PREQ_NOT_PROCESSED;
  1720. }
  1721. p2p_parse_free(&msg);
  1722. if (!p2p->cfg->send_probe_resp) {
  1723. /* Response generated elsewhere */
  1724. return P2P_PREQ_NOT_PROCESSED;
  1725. }
  1726. p2p_dbg(p2p, "Reply to P2P Probe Request in Listen state");
  1727. /*
  1728. * We do not really have a specific BSS that this frame is advertising,
  1729. * so build a frame that has some information in valid format. This is
  1730. * really only used for discovery purposes, not to learn exact BSS
  1731. * parameters.
  1732. */
  1733. ies = p2p_build_probe_resp_ies(p2p);
  1734. if (ies == NULL)
  1735. return P2P_PREQ_NOT_PROCESSED;
  1736. buf = wpabuf_alloc(200 + wpabuf_len(ies));
  1737. if (buf == NULL) {
  1738. wpabuf_free(ies);
  1739. return P2P_PREQ_NOT_PROCESSED;
  1740. }
  1741. resp = NULL;
  1742. resp = wpabuf_put(buf, resp->u.probe_resp.variable - (u8 *) resp);
  1743. resp->frame_control = host_to_le16((WLAN_FC_TYPE_MGMT << 2) |
  1744. (WLAN_FC_STYPE_PROBE_RESP << 4));
  1745. os_memcpy(resp->da, addr, ETH_ALEN);
  1746. os_memcpy(resp->sa, p2p->cfg->dev_addr, ETH_ALEN);
  1747. os_memcpy(resp->bssid, p2p->cfg->dev_addr, ETH_ALEN);
  1748. resp->u.probe_resp.beacon_int = host_to_le16(100);
  1749. /* hardware or low-level driver will setup seq_ctrl and timestamp */
  1750. resp->u.probe_resp.capab_info =
  1751. host_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE |
  1752. WLAN_CAPABILITY_PRIVACY |
  1753. WLAN_CAPABILITY_SHORT_SLOT_TIME);
  1754. wpabuf_put_u8(buf, WLAN_EID_SSID);
  1755. wpabuf_put_u8(buf, P2P_WILDCARD_SSID_LEN);
  1756. wpabuf_put_data(buf, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN);
  1757. wpabuf_put_u8(buf, WLAN_EID_SUPP_RATES);
  1758. wpabuf_put_u8(buf, 8);
  1759. wpabuf_put_u8(buf, (60 / 5) | 0x80);
  1760. wpabuf_put_u8(buf, 90 / 5);
  1761. wpabuf_put_u8(buf, (120 / 5) | 0x80);
  1762. wpabuf_put_u8(buf, 180 / 5);
  1763. wpabuf_put_u8(buf, (240 / 5) | 0x80);
  1764. wpabuf_put_u8(buf, 360 / 5);
  1765. wpabuf_put_u8(buf, 480 / 5);
  1766. wpabuf_put_u8(buf, 540 / 5);
  1767. wpabuf_put_u8(buf, WLAN_EID_DS_PARAMS);
  1768. wpabuf_put_u8(buf, 1);
  1769. wpabuf_put_u8(buf, p2p->cfg->channel);
  1770. wpabuf_put_buf(buf, ies);
  1771. wpabuf_free(ies);
  1772. p2p->cfg->send_probe_resp(p2p->cfg->cb_ctx, buf);
  1773. wpabuf_free(buf);
  1774. return P2P_PREQ_NOT_PROCESSED;
  1775. }
  1776. enum p2p_probe_req_status
  1777. p2p_probe_req_rx(struct p2p_data *p2p, const u8 *addr, const u8 *dst,
  1778. const u8 *bssid, const u8 *ie, size_t ie_len)
  1779. {
  1780. enum p2p_probe_req_status res;
  1781. p2p_add_dev_from_probe_req(p2p, addr, ie, ie_len);
  1782. res = p2p_reply_probe(p2p, addr, dst, bssid, ie, ie_len);
  1783. if ((p2p->state == P2P_CONNECT || p2p->state == P2P_CONNECT_LISTEN) &&
  1784. p2p->go_neg_peer &&
  1785. os_memcmp(addr, p2p->go_neg_peer->info.p2p_device_addr, ETH_ALEN)
  1786. == 0 &&
  1787. !(p2p->go_neg_peer->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM)) {
  1788. /* Received a Probe Request from GO Negotiation peer */
  1789. p2p_dbg(p2p, "Found GO Negotiation peer - try to start GO negotiation from timeout");
  1790. eloop_cancel_timeout(p2p_go_neg_start, p2p, NULL);
  1791. eloop_register_timeout(0, 0, p2p_go_neg_start, p2p, NULL);
  1792. return P2P_PREQ_PROCESSED;
  1793. }
  1794. if ((p2p->state == P2P_INVITE || p2p->state == P2P_INVITE_LISTEN) &&
  1795. p2p->invite_peer &&
  1796. os_memcmp(addr, p2p->invite_peer->info.p2p_device_addr, ETH_ALEN)
  1797. == 0) {
  1798. /* Received a Probe Request from Invite peer */
  1799. p2p_dbg(p2p, "Found Invite peer - try to start Invite from timeout");
  1800. eloop_register_timeout(0, 0, p2p_invite_start, p2p, NULL);
  1801. return P2P_PREQ_PROCESSED;
  1802. }
  1803. return res;
  1804. }
  1805. static int p2p_assoc_req_ie_wlan_ap(struct p2p_data *p2p, const u8 *bssid,
  1806. u8 *buf, size_t len, struct wpabuf *p2p_ie)
  1807. {
  1808. struct wpabuf *tmp;
  1809. u8 *lpos;
  1810. size_t tmplen;
  1811. int res;
  1812. u8 group_capab;
  1813. if (p2p_ie == NULL)
  1814. return 0; /* WLAN AP is not a P2P manager */
  1815. /*
  1816. * (Re)Association Request - P2P IE
  1817. * P2P Capability attribute (shall be present)
  1818. * P2P Interface attribute (present if concurrent device and
  1819. * P2P Management is enabled)
  1820. */
  1821. tmp = wpabuf_alloc(200);
  1822. if (tmp == NULL)
  1823. return -1;
  1824. lpos = p2p_buf_add_ie_hdr(tmp);
  1825. group_capab = 0;
  1826. if (p2p->num_groups > 0) {
  1827. group_capab |= P2P_GROUP_CAPAB_GROUP_OWNER;
  1828. if ((p2p->dev_capab & P2P_DEV_CAPAB_CONCURRENT_OPER) &&
  1829. (p2p->dev_capab & P2P_DEV_CAPAB_INFRA_MANAGED) &&
  1830. p2p->cross_connect)
  1831. group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
  1832. }
  1833. p2p_buf_add_capability(tmp, p2p->dev_capab, group_capab);
  1834. if ((p2p->dev_capab & P2P_DEV_CAPAB_CONCURRENT_OPER) &&
  1835. (p2p->dev_capab & P2P_DEV_CAPAB_INFRA_MANAGED))
  1836. p2p_buf_add_p2p_interface(tmp, p2p);
  1837. p2p_buf_update_ie_hdr(tmp, lpos);
  1838. tmplen = wpabuf_len(tmp);
  1839. if (tmplen > len)
  1840. res = -1;
  1841. else {
  1842. os_memcpy(buf, wpabuf_head(tmp), tmplen);
  1843. res = tmplen;
  1844. }
  1845. wpabuf_free(tmp);
  1846. return res;
  1847. }
  1848. int p2p_assoc_req_ie(struct p2p_data *p2p, const u8 *bssid, u8 *buf,
  1849. size_t len, int p2p_group, struct wpabuf *p2p_ie)
  1850. {
  1851. struct wpabuf *tmp;
  1852. u8 *lpos;
  1853. struct p2p_device *peer;
  1854. size_t tmplen;
  1855. int res;
  1856. size_t extra = 0;
  1857. if (!p2p_group)
  1858. return p2p_assoc_req_ie_wlan_ap(p2p, bssid, buf, len, p2p_ie);
  1859. #ifdef CONFIG_WIFI_DISPLAY
  1860. if (p2p->wfd_ie_assoc_req)
  1861. extra = wpabuf_len(p2p->wfd_ie_assoc_req);
  1862. #endif /* CONFIG_WIFI_DISPLAY */
  1863. /*
  1864. * (Re)Association Request - P2P IE
  1865. * P2P Capability attribute (shall be present)
  1866. * Extended Listen Timing (may be present)
  1867. * P2P Device Info attribute (shall be present)
  1868. */
  1869. tmp = wpabuf_alloc(200 + extra);
  1870. if (tmp == NULL)
  1871. return -1;
  1872. #ifdef CONFIG_WIFI_DISPLAY
  1873. if (p2p->wfd_ie_assoc_req)
  1874. wpabuf_put_buf(tmp, p2p->wfd_ie_assoc_req);
  1875. #endif /* CONFIG_WIFI_DISPLAY */
  1876. peer = bssid ? p2p_get_device(p2p, bssid) : NULL;
  1877. lpos = p2p_buf_add_ie_hdr(tmp);
  1878. p2p_buf_add_capability(tmp, p2p->dev_capab, 0);
  1879. if (p2p->ext_listen_interval)
  1880. p2p_buf_add_ext_listen_timing(tmp, p2p->ext_listen_period,
  1881. p2p->ext_listen_interval);
  1882. p2p_buf_add_device_info(tmp, p2p, peer);
  1883. p2p_buf_update_ie_hdr(tmp, lpos);
  1884. tmplen = wpabuf_len(tmp);
  1885. if (tmplen > len)
  1886. res = -1;
  1887. else {
  1888. os_memcpy(buf, wpabuf_head(tmp), tmplen);
  1889. res = tmplen;
  1890. }
  1891. wpabuf_free(tmp);
  1892. return res;
  1893. }
  1894. int p2p_scan_result_text(const u8 *ies, size_t ies_len, char *buf, char *end)
  1895. {
  1896. struct wpabuf *p2p_ie;
  1897. int ret;
  1898. p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len, P2P_IE_VENDOR_TYPE);
  1899. if (p2p_ie == NULL)
  1900. return 0;
  1901. ret = p2p_attr_text(p2p_ie, buf, end);
  1902. wpabuf_free(p2p_ie);
  1903. return ret;
  1904. }
  1905. int p2p_parse_dev_addr_in_p2p_ie(struct wpabuf *p2p_ie, u8 *dev_addr)
  1906. {
  1907. struct p2p_message msg;
  1908. os_memset(&msg, 0, sizeof(msg));
  1909. if (p2p_parse_p2p_ie(p2p_ie, &msg))
  1910. return -1;
  1911. if (msg.p2p_device_addr) {
  1912. os_memcpy(dev_addr, msg.p2p_device_addr, ETH_ALEN);
  1913. return 0;
  1914. } else if (msg.device_id) {
  1915. os_memcpy(dev_addr, msg.device_id, ETH_ALEN);
  1916. return 0;
  1917. }
  1918. return -1;
  1919. }
  1920. int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr)
  1921. {
  1922. struct wpabuf *p2p_ie;
  1923. int ret;
  1924. p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len,
  1925. P2P_IE_VENDOR_TYPE);
  1926. if (p2p_ie == NULL)
  1927. return -1;
  1928. ret = p2p_parse_dev_addr_in_p2p_ie(p2p_ie, dev_addr);
  1929. wpabuf_free(p2p_ie);
  1930. return ret;
  1931. }
  1932. static void p2p_clear_go_neg(struct p2p_data *p2p)
  1933. {
  1934. p2p->go_neg_peer = NULL;
  1935. p2p_clear_timeout(p2p);
  1936. p2p_set_state(p2p, P2P_IDLE);
  1937. }
  1938. void p2p_wps_success_cb(struct p2p_data *p2p, const u8 *mac_addr)
  1939. {
  1940. if (p2p->go_neg_peer == NULL) {
  1941. p2p_dbg(p2p, "No pending Group Formation - ignore WPS registration success notification");
  1942. return; /* No pending Group Formation */
  1943. }
  1944. if (os_memcmp(mac_addr, p2p->go_neg_peer->intended_addr, ETH_ALEN) !=
  1945. 0) {
  1946. p2p_dbg(p2p, "Ignore WPS registration success notification for "
  1947. MACSTR " (GO Negotiation peer " MACSTR ")",
  1948. MAC2STR(mac_addr),
  1949. MAC2STR(p2p->go_neg_peer->intended_addr));
  1950. return; /* Ignore unexpected peer address */
  1951. }
  1952. p2p_dbg(p2p, "Group Formation completed successfully with " MACSTR,
  1953. MAC2STR(mac_addr));
  1954. p2p_clear_go_neg(p2p);
  1955. }
  1956. void p2p_group_formation_failed(struct p2p_data *p2p)
  1957. {
  1958. if (p2p->go_neg_peer == NULL) {
  1959. p2p_dbg(p2p, "No pending Group Formation - ignore group formation failure notification");
  1960. return; /* No pending Group Formation */
  1961. }
  1962. p2p_dbg(p2p, "Group Formation failed with " MACSTR,
  1963. MAC2STR(p2p->go_neg_peer->intended_addr));
  1964. p2p_clear_go_neg(p2p);
  1965. }
  1966. struct p2p_data * p2p_init(const struct p2p_config *cfg)
  1967. {
  1968. struct p2p_data *p2p;
  1969. if (cfg->max_peers < 1)
  1970. return NULL;
  1971. p2p = os_zalloc(sizeof(*p2p) + sizeof(*cfg));
  1972. if (p2p == NULL)
  1973. return NULL;
  1974. p2p->cfg = (struct p2p_config *) (p2p + 1);
  1975. os_memcpy(p2p->cfg, cfg, sizeof(*cfg));
  1976. if (cfg->dev_name)
  1977. p2p->cfg->dev_name = os_strdup(cfg->dev_name);
  1978. if (cfg->manufacturer)
  1979. p2p->cfg->manufacturer = os_strdup(cfg->manufacturer);
  1980. if (cfg->model_name)
  1981. p2p->cfg->model_name = os_strdup(cfg->model_name);
  1982. if (cfg->model_number)
  1983. p2p->cfg->model_number = os_strdup(cfg->model_number);
  1984. if (cfg->serial_number)
  1985. p2p->cfg->serial_number = os_strdup(cfg->serial_number);
  1986. if (cfg->pref_chan) {
  1987. p2p->cfg->pref_chan = os_malloc(cfg->num_pref_chan *
  1988. sizeof(struct p2p_channel));
  1989. if (p2p->cfg->pref_chan) {
  1990. os_memcpy(p2p->cfg->pref_chan, cfg->pref_chan,
  1991. cfg->num_pref_chan *
  1992. sizeof(struct p2p_channel));
  1993. } else
  1994. p2p->cfg->num_pref_chan = 0;
  1995. }
  1996. p2p->min_disc_int = 1;
  1997. p2p->max_disc_int = 3;
  1998. p2p->max_disc_tu = -1;
  1999. os_get_random(&p2p->next_tie_breaker, 1);
  2000. p2p->next_tie_breaker &= 0x01;
  2001. if (cfg->sd_request)
  2002. p2p->dev_capab |= P2P_DEV_CAPAB_SERVICE_DISCOVERY;
  2003. p2p->dev_capab |= P2P_DEV_CAPAB_INVITATION_PROCEDURE;
  2004. if (cfg->concurrent_operations)
  2005. p2p->dev_capab |= P2P_DEV_CAPAB_CONCURRENT_OPER;
  2006. p2p->dev_capab |= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
  2007. dl_list_init(&p2p->devices);
  2008. eloop_register_timeout(P2P_PEER_EXPIRATION_INTERVAL, 0,
  2009. p2p_expiration_timeout, p2p, NULL);
  2010. p2p->go_timeout = 100;
  2011. p2p->client_timeout = 20;
  2012. p2p_dbg(p2p, "initialized");
  2013. p2p_channels_dump(p2p, "channels", &p2p->cfg->channels);
  2014. p2p_channels_dump(p2p, "cli_channels", &p2p->cfg->cli_channels);
  2015. return p2p;
  2016. }
  2017. void p2p_deinit(struct p2p_data *p2p)
  2018. {
  2019. #ifdef CONFIG_WIFI_DISPLAY
  2020. wpabuf_free(p2p->wfd_ie_beacon);
  2021. wpabuf_free(p2p->wfd_ie_probe_req);
  2022. wpabuf_free(p2p->wfd_ie_probe_resp);
  2023. wpabuf_free(p2p->wfd_ie_assoc_req);
  2024. wpabuf_free(p2p->wfd_ie_invitation);
  2025. wpabuf_free(p2p->wfd_ie_prov_disc_req);
  2026. wpabuf_free(p2p->wfd_ie_prov_disc_resp);
  2027. wpabuf_free(p2p->wfd_ie_go_neg);
  2028. wpabuf_free(p2p->wfd_dev_info);
  2029. wpabuf_free(p2p->wfd_assoc_bssid);
  2030. wpabuf_free(p2p->wfd_coupled_sink_info);
  2031. #endif /* CONFIG_WIFI_DISPLAY */
  2032. eloop_cancel_timeout(p2p_expiration_timeout, p2p, NULL);
  2033. eloop_cancel_timeout(p2p_ext_listen_timeout, p2p, NULL);
  2034. eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
  2035. eloop_cancel_timeout(p2p_go_neg_start, p2p, NULL);
  2036. p2p_flush(p2p);
  2037. p2p_free_req_dev_types(p2p);
  2038. os_free(p2p->cfg->dev_name);
  2039. os_free(p2p->cfg->manufacturer);
  2040. os_free(p2p->cfg->model_name);
  2041. os_free(p2p->cfg->model_number);
  2042. os_free(p2p->cfg->serial_number);
  2043. os_free(p2p->cfg->pref_chan);
  2044. os_free(p2p->groups);
  2045. wpabuf_free(p2p->sd_resp);
  2046. os_free(p2p->after_scan_tx);
  2047. p2p_remove_wps_vendor_extensions(p2p);
  2048. os_free(p2p->no_go_freq.range);
  2049. os_free(p2p);
  2050. }
  2051. void p2p_flush(struct p2p_data *p2p)
  2052. {
  2053. struct p2p_device *dev, *prev;
  2054. p2p_stop_find(p2p);
  2055. dl_list_for_each_safe(dev, prev, &p2p->devices, struct p2p_device,
  2056. list) {
  2057. dl_list_del(&dev->list);
  2058. p2p_device_free(p2p, dev);
  2059. }
  2060. p2p_free_sd_queries(p2p);
  2061. os_free(p2p->after_scan_tx);
  2062. p2p->after_scan_tx = NULL;
  2063. }
  2064. int p2p_unauthorize(struct p2p_data *p2p, const u8 *addr)
  2065. {
  2066. struct p2p_device *dev;
  2067. dev = p2p_get_device(p2p, addr);
  2068. if (dev == NULL)
  2069. return -1;
  2070. p2p_dbg(p2p, "Unauthorizing " MACSTR, MAC2STR(addr));
  2071. if (p2p->go_neg_peer == dev)
  2072. p2p->go_neg_peer = NULL;
  2073. dev->wps_method = WPS_NOT_READY;
  2074. dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;
  2075. dev->flags &= ~P2P_DEV_WAIT_GO_NEG_CONFIRM;
  2076. /* Check if after_scan_tx is for this peer. If so free it */
  2077. if (p2p->after_scan_tx &&
  2078. os_memcmp(addr, p2p->after_scan_tx->dst, ETH_ALEN) == 0) {
  2079. os_free(p2p->after_scan_tx);
  2080. p2p->after_scan_tx = NULL;
  2081. }
  2082. return 0;
  2083. }
  2084. int p2p_set_dev_name(struct p2p_data *p2p, const char *dev_name)
  2085. {
  2086. os_free(p2p->cfg->dev_name);
  2087. if (dev_name) {
  2088. p2p->cfg->dev_name = os_strdup(dev_name);
  2089. if (p2p->cfg->dev_name == NULL)
  2090. return -1;
  2091. } else
  2092. p2p->cfg->dev_name = NULL;
  2093. return 0;
  2094. }
  2095. int p2p_set_manufacturer(struct p2p_data *p2p, const char *manufacturer)
  2096. {
  2097. os_free(p2p->cfg->manufacturer);
  2098. p2p->cfg->manufacturer = NULL;
  2099. if (manufacturer) {
  2100. p2p->cfg->manufacturer = os_strdup(manufacturer);
  2101. if (p2p->cfg->manufacturer == NULL)
  2102. return -1;
  2103. }
  2104. return 0;
  2105. }
  2106. int p2p_set_model_name(struct p2p_data *p2p, const char *model_name)
  2107. {
  2108. os_free(p2p->cfg->model_name);
  2109. p2p->cfg->model_name = NULL;
  2110. if (model_name) {
  2111. p2p->cfg->model_name = os_strdup(model_name);
  2112. if (p2p->cfg->model_name == NULL)
  2113. return -1;
  2114. }
  2115. return 0;
  2116. }
  2117. int p2p_set_model_number(struct p2p_data *p2p, const char *model_number)
  2118. {
  2119. os_free(p2p->cfg->model_number);
  2120. p2p->cfg->model_number = NULL;
  2121. if (model_number) {
  2122. p2p->cfg->model_number = os_strdup(model_number);
  2123. if (p2p->cfg->model_number == NULL)
  2124. return -1;
  2125. }
  2126. return 0;
  2127. }
  2128. int p2p_set_serial_number(struct p2p_data *p2p, const char *serial_number)
  2129. {
  2130. os_free(p2p->cfg->serial_number);
  2131. p2p->cfg->serial_number = NULL;
  2132. if (serial_number) {
  2133. p2p->cfg->serial_number = os_strdup(serial_number);
  2134. if (p2p->cfg->serial_number == NULL)
  2135. return -1;
  2136. }
  2137. return 0;
  2138. }
  2139. void p2p_set_config_methods(struct p2p_data *p2p, u16 config_methods)
  2140. {
  2141. p2p->cfg->config_methods = config_methods;
  2142. }
  2143. void p2p_set_uuid(struct p2p_data *p2p, const u8 *uuid)
  2144. {
  2145. os_memcpy(p2p->cfg->uuid, uuid, 16);
  2146. }
  2147. int p2p_set_pri_dev_type(struct p2p_data *p2p, const u8 *pri_dev_type)
  2148. {
  2149. os_memcpy(p2p->cfg->pri_dev_type, pri_dev_type, 8);
  2150. return 0;
  2151. }
  2152. int p2p_set_sec_dev_types(struct p2p_data *p2p, const u8 dev_types[][8],
  2153. size_t num_dev_types)
  2154. {
  2155. if (num_dev_types > P2P_SEC_DEVICE_TYPES)
  2156. num_dev_types = P2P_SEC_DEVICE_TYPES;
  2157. p2p->cfg->num_sec_dev_types = num_dev_types;
  2158. os_memcpy(p2p->cfg->sec_dev_type, dev_types, num_dev_types * 8);
  2159. return 0;
  2160. }
  2161. void p2p_remove_wps_vendor_extensions(struct p2p_data *p2p)
  2162. {
  2163. int i;
  2164. for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
  2165. wpabuf_free(p2p->wps_vendor_ext[i]);
  2166. p2p->wps_vendor_ext[i] = NULL;
  2167. }
  2168. }
  2169. int p2p_add_wps_vendor_extension(struct p2p_data *p2p,
  2170. const struct wpabuf *vendor_ext)
  2171. {
  2172. int i;
  2173. if (vendor_ext == NULL)
  2174. return -1;
  2175. for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
  2176. if (p2p->wps_vendor_ext[i] == NULL)
  2177. break;
  2178. }
  2179. if (i >= P2P_MAX_WPS_VENDOR_EXT)
  2180. return -1;
  2181. p2p->wps_vendor_ext[i] = wpabuf_dup(vendor_ext);
  2182. if (p2p->wps_vendor_ext[i] == NULL)
  2183. return -1;
  2184. return 0;
  2185. }
  2186. int p2p_set_country(struct p2p_data *p2p, const char *country)
  2187. {
  2188. os_memcpy(p2p->cfg->country, country, 3);
  2189. return 0;
  2190. }
  2191. void p2p_continue_find(struct p2p_data *p2p)
  2192. {
  2193. struct p2p_device *dev;
  2194. p2p_set_state(p2p, P2P_SEARCH);
  2195. dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
  2196. if (dev->flags & P2P_DEV_SD_SCHEDULE) {
  2197. if (p2p_start_sd(p2p, dev) == 0)
  2198. return;
  2199. else
  2200. break;
  2201. } else if (dev->req_config_methods &&
  2202. !(dev->flags & P2P_DEV_PD_FOR_JOIN)) {
  2203. p2p_dbg(p2p, "Send pending Provision Discovery Request to "
  2204. MACSTR " (config methods 0x%x)",
  2205. MAC2STR(dev->info.p2p_device_addr),
  2206. dev->req_config_methods);
  2207. if (p2p_send_prov_disc_req(p2p, dev, 0, 0) == 0)
  2208. return;
  2209. }
  2210. }
  2211. p2p_listen_in_find(p2p, 1);
  2212. }
  2213. static void p2p_sd_cb(struct p2p_data *p2p, int success)
  2214. {
  2215. p2p_dbg(p2p, "Service Discovery Query TX callback: success=%d",
  2216. success);
  2217. p2p->pending_action_state = P2P_NO_PENDING_ACTION;
  2218. if (!success) {
  2219. if (p2p->sd_peer) {
  2220. p2p->sd_peer->flags &= ~P2P_DEV_SD_SCHEDULE;
  2221. p2p->sd_peer = NULL;
  2222. }
  2223. p2p_continue_find(p2p);
  2224. return;
  2225. }
  2226. if (p2p->sd_peer == NULL) {
  2227. p2p_dbg(p2p, "No SD peer entry known");
  2228. p2p_continue_find(p2p);
  2229. return;
  2230. }
  2231. /* Wait for response from the peer */
  2232. p2p_set_state(p2p, P2P_SD_DURING_FIND);
  2233. p2p_set_timeout(p2p, 0, 200000);
  2234. }
  2235. /**
  2236. * p2p_retry_pd - Retry any pending provision disc requests in IDLE state
  2237. * @p2p: P2P module context from p2p_init()
  2238. */
  2239. static void p2p_retry_pd(struct p2p_data *p2p)
  2240. {
  2241. struct p2p_device *dev;
  2242. if (p2p->state != P2P_IDLE)
  2243. return;
  2244. /*
  2245. * Retry the prov disc req attempt only for the peer that the user had
  2246. * requested.
  2247. */
  2248. dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
  2249. if (os_memcmp(p2p->pending_pd_devaddr,
  2250. dev->info.p2p_device_addr, ETH_ALEN) != 0)
  2251. continue;
  2252. if (!dev->req_config_methods)
  2253. continue;
  2254. p2p_dbg(p2p, "Send pending Provision Discovery Request to "
  2255. MACSTR " (config methods 0x%x)",
  2256. MAC2STR(dev->info.p2p_device_addr),
  2257. dev->req_config_methods);
  2258. p2p_send_prov_disc_req(p2p, dev,
  2259. dev->flags & P2P_DEV_PD_FOR_JOIN,
  2260. p2p->pd_force_freq);
  2261. return;
  2262. }
  2263. }
  2264. static void p2p_prov_disc_cb(struct p2p_data *p2p, int success)
  2265. {
  2266. p2p_dbg(p2p, "Provision Discovery Request TX callback: success=%d",
  2267. success);
  2268. /*
  2269. * Postpone resetting the pending action state till after we actually
  2270. * time out. This allows us to take some action like notifying any
  2271. * interested parties about no response to the request.
  2272. *
  2273. * When the timer (below) goes off we check in IDLE, SEARCH, or
  2274. * LISTEN_ONLY state, which are the only allowed states to issue a PD
  2275. * requests in, if this was still pending and then raise notification.
  2276. */
  2277. if (!success) {
  2278. p2p->pending_action_state = P2P_NO_PENDING_ACTION;
  2279. if (p2p->user_initiated_pd &&
  2280. (p2p->state == P2P_SEARCH || p2p->state == P2P_LISTEN_ONLY))
  2281. {
  2282. /* Retry request from timeout to avoid busy loops */
  2283. p2p->pending_action_state = P2P_PENDING_PD;
  2284. p2p_set_timeout(p2p, 0, 50000);
  2285. } else if (p2p->state != P2P_IDLE)
  2286. p2p_continue_find(p2p);
  2287. else if (p2p->user_initiated_pd) {
  2288. p2p->pending_action_state = P2P_PENDING_PD;
  2289. p2p_set_timeout(p2p, 0, 300000);
  2290. }
  2291. return;
  2292. }
  2293. /*
  2294. * This postponing, of resetting pending_action_state, needs to be
  2295. * done only for user initiated PD requests and not internal ones.
  2296. */
  2297. if (p2p->user_initiated_pd)
  2298. p2p->pending_action_state = P2P_PENDING_PD;
  2299. else
  2300. p2p->pending_action_state = P2P_NO_PENDING_ACTION;
  2301. /* Wait for response from the peer */
  2302. if (p2p->state == P2P_SEARCH)
  2303. p2p_set_state(p2p, P2P_PD_DURING_FIND);
  2304. p2p_set_timeout(p2p, 0, 200000);
  2305. }
  2306. int p2p_scan_res_handler(struct p2p_data *p2p, const u8 *bssid, int freq,
  2307. struct os_reltime *rx_time, int level, const u8 *ies,
  2308. size_t ies_len)
  2309. {
  2310. if (os_reltime_before(rx_time, &p2p->find_start)) {
  2311. /*
  2312. * The driver may have cached (e.g., in cfg80211 BSS table) the
  2313. * scan results for relatively long time. To avoid reporting
  2314. * stale information, update P2P peers only based on results
  2315. * that have based on frames received after the last p2p_find
  2316. * operation was started.
  2317. */
  2318. p2p_dbg(p2p, "Ignore old scan result for " MACSTR
  2319. " (rx_time=%u.%06u)",
  2320. MAC2STR(bssid), (unsigned int) rx_time->sec,
  2321. (unsigned int) rx_time->usec);
  2322. return 0;
  2323. }
  2324. p2p_add_device(p2p, bssid, freq, rx_time, level, ies, ies_len, 1);
  2325. return 0;
  2326. }
  2327. void p2p_scan_res_handled(struct p2p_data *p2p)
  2328. {
  2329. if (!p2p->p2p_scan_running) {
  2330. p2p_dbg(p2p, "p2p_scan was not running, but scan results received");
  2331. }
  2332. p2p->p2p_scan_running = 0;
  2333. eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
  2334. if (p2p_run_after_scan(p2p))
  2335. return;
  2336. if (p2p->state == P2P_SEARCH)
  2337. p2p_continue_find(p2p);
  2338. }
  2339. void p2p_scan_ie(struct p2p_data *p2p, struct wpabuf *ies, const u8 *dev_id)
  2340. {
  2341. u8 *len;
  2342. #ifdef CONFIG_WIFI_DISPLAY
  2343. if (p2p->wfd_ie_probe_req)
  2344. wpabuf_put_buf(ies, p2p->wfd_ie_probe_req);
  2345. #endif /* CONFIG_WIFI_DISPLAY */
  2346. len = p2p_buf_add_ie_hdr(ies);
  2347. p2p_buf_add_capability(ies, p2p->dev_capab &
  2348. ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY, 0);
  2349. if (dev_id)
  2350. p2p_buf_add_device_id(ies, dev_id);
  2351. if (p2p->cfg->reg_class && p2p->cfg->channel)
  2352. p2p_buf_add_listen_channel(ies, p2p->cfg->country,
  2353. p2p->cfg->reg_class,
  2354. p2p->cfg->channel);
  2355. if (p2p->ext_listen_interval)
  2356. p2p_buf_add_ext_listen_timing(ies, p2p->ext_listen_period,
  2357. p2p->ext_listen_interval);
  2358. /* TODO: p2p_buf_add_operating_channel() if GO */
  2359. p2p_buf_update_ie_hdr(ies, len);
  2360. }
  2361. size_t p2p_scan_ie_buf_len(struct p2p_data *p2p)
  2362. {
  2363. size_t len = 100;
  2364. #ifdef CONFIG_WIFI_DISPLAY
  2365. if (p2p && p2p->wfd_ie_probe_req)
  2366. len += wpabuf_len(p2p->wfd_ie_probe_req);
  2367. #endif /* CONFIG_WIFI_DISPLAY */
  2368. return len;
  2369. }
  2370. int p2p_ie_text(struct wpabuf *p2p_ie, char *buf, char *end)
  2371. {
  2372. return p2p_attr_text(p2p_ie, buf, end);
  2373. }
  2374. static void p2p_go_neg_req_cb(struct p2p_data *p2p, int success)
  2375. {
  2376. struct p2p_device *dev = p2p->go_neg_peer;
  2377. int timeout;
  2378. p2p_dbg(p2p, "GO Negotiation Request TX callback: success=%d", success);
  2379. if (dev == NULL) {
  2380. p2p_dbg(p2p, "No pending GO Negotiation");
  2381. return;
  2382. }
  2383. if (success) {
  2384. if (dev->flags & P2P_DEV_USER_REJECTED) {
  2385. p2p_set_state(p2p, P2P_IDLE);
  2386. return;
  2387. }
  2388. } else if (dev->go_neg_req_sent) {
  2389. /* Cancel the increment from p2p_connect_send() on failure */
  2390. dev->go_neg_req_sent--;
  2391. }
  2392. if (!success &&
  2393. (dev->info.dev_capab & P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY) &&
  2394. !is_zero_ether_addr(dev->member_in_go_dev)) {
  2395. p2p_dbg(p2p, "Peer " MACSTR " did not acknowledge request - try to use device discoverability through its GO",
  2396. MAC2STR(dev->info.p2p_device_addr));
  2397. p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
  2398. p2p_send_dev_disc_req(p2p, dev);
  2399. return;
  2400. }
  2401. /*
  2402. * Use P2P find, if needed, to find the other device from its listen
  2403. * channel.
  2404. */
  2405. p2p_set_state(p2p, P2P_CONNECT);
  2406. timeout = success ? 500000 : 100000;
  2407. if (!success && p2p->go_neg_peer &&
  2408. (p2p->go_neg_peer->flags & P2P_DEV_PEER_WAITING_RESPONSE)) {
  2409. unsigned int r;
  2410. /*
  2411. * Peer is expected to wait our response and we will skip the
  2412. * listen phase. Add some randomness to the wait time here to
  2413. * make it less likely to hit cases where we could end up in
  2414. * sync with peer not listening.
  2415. */
  2416. os_get_random((u8 *) &r, sizeof(r));
  2417. timeout += r % 100000;
  2418. }
  2419. p2p_set_timeout(p2p, 0, timeout);
  2420. }
  2421. static void p2p_go_neg_resp_cb(struct p2p_data *p2p, int success)
  2422. {
  2423. p2p_dbg(p2p, "GO Negotiation Response TX callback: success=%d",
  2424. success);
  2425. if (!p2p->go_neg_peer && p2p->state == P2P_PROVISIONING) {
  2426. p2p_dbg(p2p, "Ignore TX callback event - GO Negotiation is not running anymore");
  2427. return;
  2428. }
  2429. p2p_set_state(p2p, P2P_CONNECT);
  2430. p2p_set_timeout(p2p, 0, 500000);
  2431. }
  2432. static void p2p_go_neg_resp_failure_cb(struct p2p_data *p2p, int success,
  2433. const u8 *addr)
  2434. {
  2435. p2p_dbg(p2p, "GO Negotiation Response (failure) TX callback: success=%d", success);
  2436. if (p2p->go_neg_peer && p2p->go_neg_peer->status != P2P_SC_SUCCESS) {
  2437. p2p_go_neg_failed(p2p, p2p->go_neg_peer,
  2438. p2p->go_neg_peer->status);
  2439. } else if (success) {
  2440. struct p2p_device *dev;
  2441. dev = p2p_get_device(p2p, addr);
  2442. if (dev &&
  2443. dev->status == P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
  2444. dev->flags |= P2P_DEV_PEER_WAITING_RESPONSE;
  2445. }
  2446. }
  2447. static void p2p_go_neg_conf_cb(struct p2p_data *p2p,
  2448. enum p2p_send_action_result result)
  2449. {
  2450. struct p2p_device *dev;
  2451. p2p_dbg(p2p, "GO Negotiation Confirm TX callback: result=%d", result);
  2452. p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
  2453. if (result == P2P_SEND_ACTION_FAILED) {
  2454. p2p_go_neg_failed(p2p, p2p->go_neg_peer, -1);
  2455. return;
  2456. }
  2457. if (result == P2P_SEND_ACTION_NO_ACK) {
  2458. /*
  2459. * It looks like the TX status for GO Negotiation Confirm is
  2460. * often showing failure even when the peer has actually
  2461. * received the frame. Since the peer may change channels
  2462. * immediately after having received the frame, we may not see
  2463. * an Ack for retries, so just dropping a single frame may
  2464. * trigger this. To allow the group formation to succeed if the
  2465. * peer did indeed receive the frame, continue regardless of
  2466. * the TX status.
  2467. */
  2468. p2p_dbg(p2p, "Assume GO Negotiation Confirm TX was actually received by the peer even though Ack was not reported");
  2469. }
  2470. dev = p2p->go_neg_peer;
  2471. if (dev == NULL)
  2472. return;
  2473. p2p_go_complete(p2p, dev);
  2474. }
  2475. void p2p_send_action_cb(struct p2p_data *p2p, unsigned int freq, const u8 *dst,
  2476. const u8 *src, const u8 *bssid,
  2477. enum p2p_send_action_result result)
  2478. {
  2479. enum p2p_pending_action_state state;
  2480. int success;
  2481. p2p_dbg(p2p, "Action frame TX callback (state=%d freq=%u dst=" MACSTR
  2482. " src=" MACSTR " bssid=" MACSTR " result=%d",
  2483. p2p->pending_action_state, freq, MAC2STR(dst), MAC2STR(src),
  2484. MAC2STR(bssid), result);
  2485. success = result == P2P_SEND_ACTION_SUCCESS;
  2486. state = p2p->pending_action_state;
  2487. p2p->pending_action_state = P2P_NO_PENDING_ACTION;
  2488. switch (state) {
  2489. case P2P_NO_PENDING_ACTION:
  2490. if (p2p->after_scan_tx_in_progress) {
  2491. p2p->after_scan_tx_in_progress = 0;
  2492. if (p2p->start_after_scan != P2P_AFTER_SCAN_NOTHING &&
  2493. p2p_run_after_scan(p2p))
  2494. break;
  2495. if (p2p->state == P2P_SEARCH) {
  2496. p2p_dbg(p2p, "Continue find after after_scan_tx completion");
  2497. p2p_continue_find(p2p);
  2498. }
  2499. }
  2500. break;
  2501. case P2P_PENDING_GO_NEG_REQUEST:
  2502. p2p_go_neg_req_cb(p2p, success);
  2503. break;
  2504. case P2P_PENDING_GO_NEG_RESPONSE:
  2505. p2p_go_neg_resp_cb(p2p, success);
  2506. break;
  2507. case P2P_PENDING_GO_NEG_RESPONSE_FAILURE:
  2508. p2p_go_neg_resp_failure_cb(p2p, success, dst);
  2509. break;
  2510. case P2P_PENDING_GO_NEG_CONFIRM:
  2511. p2p_go_neg_conf_cb(p2p, result);
  2512. break;
  2513. case P2P_PENDING_SD:
  2514. p2p_sd_cb(p2p, success);
  2515. break;
  2516. case P2P_PENDING_PD:
  2517. p2p_prov_disc_cb(p2p, success);
  2518. break;
  2519. case P2P_PENDING_INVITATION_REQUEST:
  2520. p2p_invitation_req_cb(p2p, success);
  2521. break;
  2522. case P2P_PENDING_INVITATION_RESPONSE:
  2523. p2p_invitation_resp_cb(p2p, success);
  2524. break;
  2525. case P2P_PENDING_DEV_DISC_REQUEST:
  2526. p2p_dev_disc_req_cb(p2p, success);
  2527. break;
  2528. case P2P_PENDING_DEV_DISC_RESPONSE:
  2529. p2p_dev_disc_resp_cb(p2p, success);
  2530. break;
  2531. case P2P_PENDING_GO_DISC_REQ:
  2532. p2p_go_disc_req_cb(p2p, success);
  2533. break;
  2534. }
  2535. p2p->after_scan_tx_in_progress = 0;
  2536. }
  2537. void p2p_listen_cb(struct p2p_data *p2p, unsigned int freq,
  2538. unsigned int duration)
  2539. {
  2540. if (freq == p2p->pending_client_disc_freq) {
  2541. p2p_dbg(p2p, "Client discoverability remain-awake completed");
  2542. p2p->pending_client_disc_freq = 0;
  2543. return;
  2544. }
  2545. if (freq != p2p->pending_listen_freq) {
  2546. p2p_dbg(p2p, "Unexpected listen callback for freq=%u duration=%u (pending_listen_freq=%u)",
  2547. freq, duration, p2p->pending_listen_freq);
  2548. return;
  2549. }
  2550. p2p_dbg(p2p, "Starting Listen timeout(%u,%u) on freq=%u based on callback",
  2551. p2p->pending_listen_sec, p2p->pending_listen_usec,
  2552. p2p->pending_listen_freq);
  2553. p2p->in_listen = 1;
  2554. p2p->drv_in_listen = freq;
  2555. if (p2p->pending_listen_sec || p2p->pending_listen_usec) {
  2556. /*
  2557. * Add 20 msec extra wait to avoid race condition with driver
  2558. * remain-on-channel end event, i.e., give driver more time to
  2559. * complete the operation before our timeout expires.
  2560. */
  2561. p2p_set_timeout(p2p, p2p->pending_listen_sec,
  2562. p2p->pending_listen_usec + 20000);
  2563. }
  2564. p2p->pending_listen_freq = 0;
  2565. }
  2566. int p2p_listen_end(struct p2p_data *p2p, unsigned int freq)
  2567. {
  2568. p2p_dbg(p2p, "Driver ended Listen state (freq=%u)", freq);
  2569. p2p->drv_in_listen = 0;
  2570. if (p2p->in_listen)
  2571. return 0; /* Internal timeout will trigger the next step */
  2572. if (p2p->state == P2P_CONNECT_LISTEN && p2p->go_neg_peer) {
  2573. if (p2p->go_neg_peer->connect_reqs >= 120) {
  2574. p2p_dbg(p2p, "Timeout on sending GO Negotiation Request without getting response");
  2575. p2p_go_neg_failed(p2p, p2p->go_neg_peer, -1);
  2576. return 0;
  2577. }
  2578. p2p_set_state(p2p, P2P_CONNECT);
  2579. p2p_connect_send(p2p, p2p->go_neg_peer);
  2580. return 1;
  2581. } else if (p2p->state == P2P_SEARCH) {
  2582. if (p2p->p2p_scan_running) {
  2583. /*
  2584. * Search is already in progress. This can happen if
  2585. * an Action frame RX is reported immediately after
  2586. * the end of a remain-on-channel operation and the
  2587. * response frame to that is sent using an offchannel
  2588. * operation while in p2p_find. Avoid an attempt to
  2589. * restart a scan here.
  2590. */
  2591. p2p_dbg(p2p, "p2p_scan already in progress - do not try to start a new one");
  2592. return 1;
  2593. }
  2594. if (p2p->pending_listen_freq) {
  2595. /*
  2596. * Better wait a bit if the driver is unable to start
  2597. * offchannel operation for some reason. p2p_search()
  2598. * will be started from internal timeout.
  2599. */
  2600. p2p_dbg(p2p, "Listen operation did not seem to start - delay search phase to avoid busy loop");
  2601. p2p_set_timeout(p2p, 0, 100000);
  2602. return 1;
  2603. }
  2604. if (p2p->search_delay) {
  2605. p2p_dbg(p2p, "Delay search operation by %u ms",
  2606. p2p->search_delay);
  2607. p2p_set_timeout(p2p, p2p->search_delay / 1000,
  2608. (p2p->search_delay % 1000) * 1000);
  2609. return 1;
  2610. }
  2611. p2p_search(p2p);
  2612. return 1;
  2613. }
  2614. return 0;
  2615. }
  2616. static void p2p_timeout_connect(struct p2p_data *p2p)
  2617. {
  2618. p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
  2619. if (p2p->go_neg_peer &&
  2620. (p2p->go_neg_peer->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM)) {
  2621. p2p_dbg(p2p, "Wait for GO Negotiation Confirm timed out - assume GO Negotiation failed");
  2622. p2p_go_neg_failed(p2p, p2p->go_neg_peer, -1);
  2623. return;
  2624. }
  2625. if (p2p->go_neg_peer &&
  2626. (p2p->go_neg_peer->flags & P2P_DEV_PEER_WAITING_RESPONSE) &&
  2627. p2p->go_neg_peer->connect_reqs < 120) {
  2628. p2p_dbg(p2p, "Peer expected to wait our response - skip listen");
  2629. p2p_connect_send(p2p, p2p->go_neg_peer);
  2630. return;
  2631. }
  2632. p2p_set_state(p2p, P2P_CONNECT_LISTEN);
  2633. p2p_listen_in_find(p2p, 0);
  2634. }
  2635. static void p2p_timeout_connect_listen(struct p2p_data *p2p)
  2636. {
  2637. if (p2p->go_neg_peer) {
  2638. if (p2p->drv_in_listen) {
  2639. p2p_dbg(p2p, "Driver is still in Listen state; wait for it to complete");
  2640. return;
  2641. }
  2642. if (p2p->go_neg_peer->connect_reqs >= 120) {
  2643. p2p_dbg(p2p, "Timeout on sending GO Negotiation Request without getting response");
  2644. p2p_go_neg_failed(p2p, p2p->go_neg_peer, -1);
  2645. return;
  2646. }
  2647. p2p_set_state(p2p, P2P_CONNECT);
  2648. p2p_connect_send(p2p, p2p->go_neg_peer);
  2649. } else
  2650. p2p_set_state(p2p, P2P_IDLE);
  2651. }
  2652. static void p2p_timeout_wait_peer_connect(struct p2p_data *p2p)
  2653. {
  2654. /*
  2655. * TODO: could remain constantly in Listen state for some time if there
  2656. * are no other concurrent uses for the radio. For now, go to listen
  2657. * state once per second to give other uses a chance to use the radio.
  2658. */
  2659. p2p_set_state(p2p, P2P_WAIT_PEER_IDLE);
  2660. p2p_set_timeout(p2p, 0, 500000);
  2661. }
  2662. static void p2p_timeout_wait_peer_idle(struct p2p_data *p2p)
  2663. {
  2664. struct p2p_device *dev = p2p->go_neg_peer;
  2665. if (dev == NULL) {
  2666. p2p_dbg(p2p, "Unknown GO Neg peer - stop GO Neg wait");
  2667. return;
  2668. }
  2669. dev->wait_count++;
  2670. if (dev->wait_count >= 120) {
  2671. p2p_dbg(p2p, "Timeout on waiting peer to become ready for GO Negotiation");
  2672. p2p_go_neg_failed(p2p, dev, -1);
  2673. return;
  2674. }
  2675. p2p_dbg(p2p, "Go to Listen state while waiting for the peer to become ready for GO Negotiation");
  2676. p2p_set_state(p2p, P2P_WAIT_PEER_CONNECT);
  2677. p2p_listen_in_find(p2p, 0);
  2678. }
  2679. static void p2p_timeout_sd_during_find(struct p2p_data *p2p)
  2680. {
  2681. p2p_dbg(p2p, "Service Discovery Query timeout");
  2682. if (p2p->sd_peer) {
  2683. p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
  2684. p2p->sd_peer->flags &= ~P2P_DEV_SD_SCHEDULE;
  2685. p2p->sd_peer = NULL;
  2686. }
  2687. p2p_continue_find(p2p);
  2688. }
  2689. static void p2p_timeout_prov_disc_during_find(struct p2p_data *p2p)
  2690. {
  2691. p2p_dbg(p2p, "Provision Discovery Request timeout");
  2692. p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
  2693. p2p_continue_find(p2p);
  2694. }
  2695. static void p2p_timeout_prov_disc_req(struct p2p_data *p2p)
  2696. {
  2697. p2p->pending_action_state = P2P_NO_PENDING_ACTION;
  2698. /*
  2699. * For user initiated PD requests that we have not gotten any responses
  2700. * for while in IDLE state, we retry them a couple of times before
  2701. * giving up.
  2702. */
  2703. if (!p2p->user_initiated_pd)
  2704. return;
  2705. p2p_dbg(p2p, "User initiated Provision Discovery Request timeout");
  2706. if (p2p->pd_retries) {
  2707. p2p->pd_retries--;
  2708. p2p_retry_pd(p2p);
  2709. } else {
  2710. struct p2p_device *dev;
  2711. int for_join = 0;
  2712. dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
  2713. if (os_memcmp(p2p->pending_pd_devaddr,
  2714. dev->info.p2p_device_addr, ETH_ALEN) != 0)
  2715. continue;
  2716. if (dev->req_config_methods &&
  2717. (dev->flags & P2P_DEV_PD_FOR_JOIN))
  2718. for_join = 1;
  2719. }
  2720. if (p2p->cfg->prov_disc_fail)
  2721. p2p->cfg->prov_disc_fail(p2p->cfg->cb_ctx,
  2722. p2p->pending_pd_devaddr,
  2723. for_join ?
  2724. P2P_PROV_DISC_TIMEOUT_JOIN :
  2725. P2P_PROV_DISC_TIMEOUT);
  2726. p2p_reset_pending_pd(p2p);
  2727. }
  2728. }
  2729. static void p2p_timeout_invite(struct p2p_data *p2p)
  2730. {
  2731. p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
  2732. p2p_set_state(p2p, P2P_INVITE_LISTEN);
  2733. if (p2p->inv_role == P2P_INVITE_ROLE_ACTIVE_GO) {
  2734. /*
  2735. * Better remain on operating channel instead of listen channel
  2736. * when running a group.
  2737. */
  2738. p2p_dbg(p2p, "Inviting in active GO role - wait on operating channel");
  2739. p2p_set_timeout(p2p, 0, 100000);
  2740. return;
  2741. }
  2742. p2p_listen_in_find(p2p, 0);
  2743. }
  2744. static void p2p_timeout_invite_listen(struct p2p_data *p2p)
  2745. {
  2746. if (p2p->invite_peer && p2p->invite_peer->invitation_reqs < 100) {
  2747. p2p_set_state(p2p, P2P_INVITE);
  2748. p2p_invite_send(p2p, p2p->invite_peer,
  2749. p2p->invite_go_dev_addr);
  2750. } else {
  2751. if (p2p->invite_peer) {
  2752. p2p_dbg(p2p, "Invitation Request retry limit reached");
  2753. if (p2p->cfg->invitation_result)
  2754. p2p->cfg->invitation_result(
  2755. p2p->cfg->cb_ctx, -1, NULL, NULL,
  2756. p2p->invite_peer->info.p2p_device_addr,
  2757. 0);
  2758. }
  2759. p2p_set_state(p2p, P2P_IDLE);
  2760. }
  2761. }
  2762. static void p2p_state_timeout(void *eloop_ctx, void *timeout_ctx)
  2763. {
  2764. struct p2p_data *p2p = eloop_ctx;
  2765. p2p_dbg(p2p, "Timeout (state=%s)", p2p_state_txt(p2p->state));
  2766. p2p->in_listen = 0;
  2767. switch (p2p->state) {
  2768. case P2P_IDLE:
  2769. /* Check if we timed out waiting for PD req */
  2770. if (p2p->pending_action_state == P2P_PENDING_PD)
  2771. p2p_timeout_prov_disc_req(p2p);
  2772. break;
  2773. case P2P_SEARCH:
  2774. /* Check if we timed out waiting for PD req */
  2775. if (p2p->pending_action_state == P2P_PENDING_PD)
  2776. p2p_timeout_prov_disc_req(p2p);
  2777. if (p2p->search_delay && !p2p->in_search_delay) {
  2778. p2p_dbg(p2p, "Delay search operation by %u ms",
  2779. p2p->search_delay);
  2780. p2p->in_search_delay = 1;
  2781. p2p_set_timeout(p2p, p2p->search_delay / 1000,
  2782. (p2p->search_delay % 1000) * 1000);
  2783. break;
  2784. }
  2785. p2p->in_search_delay = 0;
  2786. p2p_search(p2p);
  2787. break;
  2788. case P2P_CONNECT:
  2789. p2p_timeout_connect(p2p);
  2790. break;
  2791. case P2P_CONNECT_LISTEN:
  2792. p2p_timeout_connect_listen(p2p);
  2793. break;
  2794. case P2P_GO_NEG:
  2795. break;
  2796. case P2P_LISTEN_ONLY:
  2797. /* Check if we timed out waiting for PD req */
  2798. if (p2p->pending_action_state == P2P_PENDING_PD)
  2799. p2p_timeout_prov_disc_req(p2p);
  2800. if (p2p->ext_listen_only) {
  2801. p2p_dbg(p2p, "Extended Listen Timing - Listen State completed");
  2802. p2p->ext_listen_only = 0;
  2803. p2p_set_state(p2p, P2P_IDLE);
  2804. }
  2805. break;
  2806. case P2P_WAIT_PEER_CONNECT:
  2807. p2p_timeout_wait_peer_connect(p2p);
  2808. break;
  2809. case P2P_WAIT_PEER_IDLE:
  2810. p2p_timeout_wait_peer_idle(p2p);
  2811. break;
  2812. case P2P_SD_DURING_FIND:
  2813. p2p_timeout_sd_during_find(p2p);
  2814. break;
  2815. case P2P_PROVISIONING:
  2816. break;
  2817. case P2P_PD_DURING_FIND:
  2818. p2p_timeout_prov_disc_during_find(p2p);
  2819. break;
  2820. case P2P_INVITE:
  2821. p2p_timeout_invite(p2p);
  2822. break;
  2823. case P2P_INVITE_LISTEN:
  2824. p2p_timeout_invite_listen(p2p);
  2825. break;
  2826. }
  2827. }
  2828. int p2p_reject(struct p2p_data *p2p, const u8 *peer_addr)
  2829. {
  2830. struct p2p_device *dev;
  2831. dev = p2p_get_device(p2p, peer_addr);
  2832. p2p_dbg(p2p, "Local request to reject connection attempts by peer "
  2833. MACSTR, MAC2STR(peer_addr));
  2834. if (dev == NULL) {
  2835. p2p_dbg(p2p, "Peer " MACSTR " unknown", MAC2STR(peer_addr));
  2836. return -1;
  2837. }
  2838. dev->status = P2P_SC_FAIL_REJECTED_BY_USER;
  2839. dev->flags |= P2P_DEV_USER_REJECTED;
  2840. return 0;
  2841. }
  2842. const char * p2p_wps_method_text(enum p2p_wps_method method)
  2843. {
  2844. switch (method) {
  2845. case WPS_NOT_READY:
  2846. return "not-ready";
  2847. case WPS_PIN_DISPLAY:
  2848. return "Display";
  2849. case WPS_PIN_KEYPAD:
  2850. return "Keypad";
  2851. case WPS_PBC:
  2852. return "PBC";
  2853. }
  2854. return "??";
  2855. }
  2856. static const char * p2p_go_state_text(enum p2p_go_state go_state)
  2857. {
  2858. switch (go_state) {
  2859. case UNKNOWN_GO:
  2860. return "unknown";
  2861. case LOCAL_GO:
  2862. return "local";
  2863. case REMOTE_GO:
  2864. return "remote";
  2865. }
  2866. return "??";
  2867. }
  2868. const struct p2p_peer_info * p2p_get_peer_info(struct p2p_data *p2p,
  2869. const u8 *addr, int next)
  2870. {
  2871. struct p2p_device *dev;
  2872. if (addr)
  2873. dev = p2p_get_device(p2p, addr);
  2874. else
  2875. dev = dl_list_first(&p2p->devices, struct p2p_device, list);
  2876. if (dev && next) {
  2877. dev = dl_list_first(&dev->list, struct p2p_device, list);
  2878. if (&dev->list == &p2p->devices)
  2879. dev = NULL;
  2880. }
  2881. if (dev == NULL)
  2882. return NULL;
  2883. return &dev->info;
  2884. }
  2885. int p2p_get_peer_info_txt(const struct p2p_peer_info *info,
  2886. char *buf, size_t buflen)
  2887. {
  2888. struct p2p_device *dev;
  2889. int res;
  2890. char *pos, *end;
  2891. struct os_reltime now;
  2892. if (info == NULL)
  2893. return -1;
  2894. dev = (struct p2p_device *) (((u8 *) info) -
  2895. offsetof(struct p2p_device, info));
  2896. pos = buf;
  2897. end = buf + buflen;
  2898. os_get_reltime(&now);
  2899. res = os_snprintf(pos, end - pos,
  2900. "age=%d\n"
  2901. "listen_freq=%d\n"
  2902. "wps_method=%s\n"
  2903. "interface_addr=" MACSTR "\n"
  2904. "member_in_go_dev=" MACSTR "\n"
  2905. "member_in_go_iface=" MACSTR "\n"
  2906. "go_neg_req_sent=%d\n"
  2907. "go_state=%s\n"
  2908. "dialog_token=%u\n"
  2909. "intended_addr=" MACSTR "\n"
  2910. "country=%c%c\n"
  2911. "oper_freq=%d\n"
  2912. "req_config_methods=0x%x\n"
  2913. "flags=%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n"
  2914. "status=%d\n"
  2915. "wait_count=%u\n"
  2916. "invitation_reqs=%u\n",
  2917. (int) (now.sec - dev->last_seen.sec),
  2918. dev->listen_freq,
  2919. p2p_wps_method_text(dev->wps_method),
  2920. MAC2STR(dev->interface_addr),
  2921. MAC2STR(dev->member_in_go_dev),
  2922. MAC2STR(dev->member_in_go_iface),
  2923. dev->go_neg_req_sent,
  2924. p2p_go_state_text(dev->go_state),
  2925. dev->dialog_token,
  2926. MAC2STR(dev->intended_addr),
  2927. dev->country[0] ? dev->country[0] : '_',
  2928. dev->country[1] ? dev->country[1] : '_',
  2929. dev->oper_freq,
  2930. dev->req_config_methods,
  2931. dev->flags & P2P_DEV_PROBE_REQ_ONLY ?
  2932. "[PROBE_REQ_ONLY]" : "",
  2933. dev->flags & P2P_DEV_REPORTED ? "[REPORTED]" : "",
  2934. dev->flags & P2P_DEV_NOT_YET_READY ?
  2935. "[NOT_YET_READY]" : "",
  2936. dev->flags & P2P_DEV_SD_INFO ? "[SD_INFO]" : "",
  2937. dev->flags & P2P_DEV_SD_SCHEDULE ? "[SD_SCHEDULE]" :
  2938. "",
  2939. dev->flags & P2P_DEV_PD_PEER_DISPLAY ?
  2940. "[PD_PEER_DISPLAY]" : "",
  2941. dev->flags & P2P_DEV_PD_PEER_KEYPAD ?
  2942. "[PD_PEER_KEYPAD]" : "",
  2943. dev->flags & P2P_DEV_USER_REJECTED ?
  2944. "[USER_REJECTED]" : "",
  2945. dev->flags & P2P_DEV_PEER_WAITING_RESPONSE ?
  2946. "[PEER_WAITING_RESPONSE]" : "",
  2947. dev->flags & P2P_DEV_PREFER_PERSISTENT_GROUP ?
  2948. "[PREFER_PERSISTENT_GROUP]" : "",
  2949. dev->flags & P2P_DEV_WAIT_GO_NEG_RESPONSE ?
  2950. "[WAIT_GO_NEG_RESPONSE]" : "",
  2951. dev->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM ?
  2952. "[WAIT_GO_NEG_CONFIRM]" : "",
  2953. dev->flags & P2P_DEV_GROUP_CLIENT_ONLY ?
  2954. "[GROUP_CLIENT_ONLY]" : "",
  2955. dev->flags & P2P_DEV_FORCE_FREQ ?
  2956. "[FORCE_FREQ]" : "",
  2957. dev->flags & P2P_DEV_PD_FOR_JOIN ?
  2958. "[PD_FOR_JOIN]" : "",
  2959. dev->status,
  2960. dev->wait_count,
  2961. dev->invitation_reqs);
  2962. if (res < 0 || res >= end - pos)
  2963. return pos - buf;
  2964. pos += res;
  2965. if (dev->ext_listen_period) {
  2966. res = os_snprintf(pos, end - pos,
  2967. "ext_listen_period=%u\n"
  2968. "ext_listen_interval=%u\n",
  2969. dev->ext_listen_period,
  2970. dev->ext_listen_interval);
  2971. if (res < 0 || res >= end - pos)
  2972. return pos - buf;
  2973. pos += res;
  2974. }
  2975. if (dev->oper_ssid_len) {
  2976. res = os_snprintf(pos, end - pos,
  2977. "oper_ssid=%s\n",
  2978. wpa_ssid_txt(dev->oper_ssid,
  2979. dev->oper_ssid_len));
  2980. if (res < 0 || res >= end - pos)
  2981. return pos - buf;
  2982. pos += res;
  2983. }
  2984. #ifdef CONFIG_WIFI_DISPLAY
  2985. if (dev->info.wfd_subelems) {
  2986. res = os_snprintf(pos, end - pos, "wfd_subelems=");
  2987. if (res < 0 || res >= end - pos)
  2988. return pos - buf;
  2989. pos += res;
  2990. pos += wpa_snprintf_hex(pos, end - pos,
  2991. wpabuf_head(dev->info.wfd_subelems),
  2992. wpabuf_len(dev->info.wfd_subelems));
  2993. res = os_snprintf(pos, end - pos, "\n");
  2994. if (res < 0 || res >= end - pos)
  2995. return pos - buf;
  2996. pos += res;
  2997. }
  2998. #endif /* CONFIG_WIFI_DISPLAY */
  2999. return pos - buf;
  3000. }
  3001. int p2p_peer_known(struct p2p_data *p2p, const u8 *addr)
  3002. {
  3003. return p2p_get_device(p2p, addr) != NULL;
  3004. }
  3005. void p2p_set_client_discoverability(struct p2p_data *p2p, int enabled)
  3006. {
  3007. if (enabled) {
  3008. p2p_dbg(p2p, "Client discoverability enabled");
  3009. p2p->dev_capab |= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
  3010. } else {
  3011. p2p_dbg(p2p, "Client discoverability disabled");
  3012. p2p->dev_capab &= ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
  3013. }
  3014. }
  3015. static struct wpabuf * p2p_build_presence_req(u32 duration1, u32 interval1,
  3016. u32 duration2, u32 interval2)
  3017. {
  3018. struct wpabuf *req;
  3019. struct p2p_noa_desc desc1, desc2, *ptr1 = NULL, *ptr2 = NULL;
  3020. u8 *len;
  3021. req = wpabuf_alloc(100);
  3022. if (req == NULL)
  3023. return NULL;
  3024. if (duration1 || interval1) {
  3025. os_memset(&desc1, 0, sizeof(desc1));
  3026. desc1.count_type = 1;
  3027. desc1.duration = duration1;
  3028. desc1.interval = interval1;
  3029. ptr1 = &desc1;
  3030. if (duration2 || interval2) {
  3031. os_memset(&desc2, 0, sizeof(desc2));
  3032. desc2.count_type = 2;
  3033. desc2.duration = duration2;
  3034. desc2.interval = interval2;
  3035. ptr2 = &desc2;
  3036. }
  3037. }
  3038. p2p_buf_add_action_hdr(req, P2P_PRESENCE_REQ, 1);
  3039. len = p2p_buf_add_ie_hdr(req);
  3040. p2p_buf_add_noa(req, 0, 0, 0, ptr1, ptr2);
  3041. p2p_buf_update_ie_hdr(req, len);
  3042. return req;
  3043. }
  3044. int p2p_presence_req(struct p2p_data *p2p, const u8 *go_interface_addr,
  3045. const u8 *own_interface_addr, unsigned int freq,
  3046. u32 duration1, u32 interval1, u32 duration2,
  3047. u32 interval2)
  3048. {
  3049. struct wpabuf *req;
  3050. p2p_dbg(p2p, "Send Presence Request to GO " MACSTR
  3051. " (own interface " MACSTR ") freq=%u dur1=%u int1=%u "
  3052. "dur2=%u int2=%u",
  3053. MAC2STR(go_interface_addr), MAC2STR(own_interface_addr),
  3054. freq, duration1, interval1, duration2, interval2);
  3055. req = p2p_build_presence_req(duration1, interval1, duration2,
  3056. interval2);
  3057. if (req == NULL)
  3058. return -1;
  3059. p2p->pending_action_state = P2P_NO_PENDING_ACTION;
  3060. if (p2p_send_action(p2p, freq, go_interface_addr, own_interface_addr,
  3061. go_interface_addr,
  3062. wpabuf_head(req), wpabuf_len(req), 200) < 0) {
  3063. p2p_dbg(p2p, "Failed to send Action frame");
  3064. }
  3065. wpabuf_free(req);
  3066. return 0;
  3067. }
  3068. static struct wpabuf * p2p_build_presence_resp(u8 status, const u8 *noa,
  3069. size_t noa_len, u8 dialog_token)
  3070. {
  3071. struct wpabuf *resp;
  3072. u8 *len;
  3073. resp = wpabuf_alloc(100 + noa_len);
  3074. if (resp == NULL)
  3075. return NULL;
  3076. p2p_buf_add_action_hdr(resp, P2P_PRESENCE_RESP, dialog_token);
  3077. len = p2p_buf_add_ie_hdr(resp);
  3078. p2p_buf_add_status(resp, status);
  3079. if (noa) {
  3080. wpabuf_put_u8(resp, P2P_ATTR_NOTICE_OF_ABSENCE);
  3081. wpabuf_put_le16(resp, noa_len);
  3082. wpabuf_put_data(resp, noa, noa_len);
  3083. } else
  3084. p2p_buf_add_noa(resp, 0, 0, 0, NULL, NULL);
  3085. p2p_buf_update_ie_hdr(resp, len);
  3086. return resp;
  3087. }
  3088. static void p2p_process_presence_req(struct p2p_data *p2p, const u8 *da,
  3089. const u8 *sa, const u8 *data, size_t len,
  3090. int rx_freq)
  3091. {
  3092. struct p2p_message msg;
  3093. u8 status;
  3094. struct wpabuf *resp;
  3095. size_t g;
  3096. struct p2p_group *group = NULL;
  3097. int parsed = 0;
  3098. u8 noa[50];
  3099. int noa_len;
  3100. p2p_dbg(p2p, "Received P2P Action - P2P Presence Request");
  3101. for (g = 0; g < p2p->num_groups; g++) {
  3102. if (os_memcmp(da, p2p_group_get_interface_addr(p2p->groups[g]),
  3103. ETH_ALEN) == 0) {
  3104. group = p2p->groups[g];
  3105. break;
  3106. }
  3107. }
  3108. if (group == NULL) {
  3109. p2p_dbg(p2p, "Ignore P2P Presence Request for unknown group "
  3110. MACSTR, MAC2STR(da));
  3111. return;
  3112. }
  3113. if (p2p_parse(data, len, &msg) < 0) {
  3114. p2p_dbg(p2p, "Failed to parse P2P Presence Request");
  3115. status = P2P_SC_FAIL_INVALID_PARAMS;
  3116. goto fail;
  3117. }
  3118. parsed = 1;
  3119. if (msg.noa == NULL) {
  3120. p2p_dbg(p2p, "No NoA attribute in P2P Presence Request");
  3121. status = P2P_SC_FAIL_INVALID_PARAMS;
  3122. goto fail;
  3123. }
  3124. status = p2p_group_presence_req(group, sa, msg.noa, msg.noa_len);
  3125. fail:
  3126. if (p2p->cfg->get_noa)
  3127. noa_len = p2p->cfg->get_noa(p2p->cfg->cb_ctx, da, noa,
  3128. sizeof(noa));
  3129. else
  3130. noa_len = -1;
  3131. resp = p2p_build_presence_resp(status, noa_len > 0 ? noa : NULL,
  3132. noa_len > 0 ? noa_len : 0,
  3133. msg.dialog_token);
  3134. if (parsed)
  3135. p2p_parse_free(&msg);
  3136. if (resp == NULL)
  3137. return;
  3138. p2p->pending_action_state = P2P_NO_PENDING_ACTION;
  3139. if (p2p_send_action(p2p, rx_freq, sa, da, da,
  3140. wpabuf_head(resp), wpabuf_len(resp), 200) < 0) {
  3141. p2p_dbg(p2p, "Failed to send Action frame");
  3142. }
  3143. wpabuf_free(resp);
  3144. }
  3145. static void p2p_process_presence_resp(struct p2p_data *p2p, const u8 *da,
  3146. const u8 *sa, const u8 *data, size_t len)
  3147. {
  3148. struct p2p_message msg;
  3149. p2p_dbg(p2p, "Received P2P Action - P2P Presence Response");
  3150. if (p2p_parse(data, len, &msg) < 0) {
  3151. p2p_dbg(p2p, "Failed to parse P2P Presence Response");
  3152. return;
  3153. }
  3154. if (msg.status == NULL || msg.noa == NULL) {
  3155. p2p_dbg(p2p, "No Status or NoA attribute in P2P Presence Response");
  3156. p2p_parse_free(&msg);
  3157. return;
  3158. }
  3159. if (p2p->cfg->presence_resp) {
  3160. p2p->cfg->presence_resp(p2p->cfg->cb_ctx, sa, *msg.status,
  3161. msg.noa, msg.noa_len);
  3162. }
  3163. if (*msg.status) {
  3164. p2p_dbg(p2p, "P2P Presence Request was rejected: status %u",
  3165. *msg.status);
  3166. p2p_parse_free(&msg);
  3167. return;
  3168. }
  3169. p2p_dbg(p2p, "P2P Presence Request was accepted");
  3170. wpa_hexdump(MSG_DEBUG, "P2P: P2P Presence Response - NoA",
  3171. msg.noa, msg.noa_len);
  3172. /* TODO: process NoA */
  3173. p2p_parse_free(&msg);
  3174. }
  3175. static void p2p_ext_listen_timeout(void *eloop_ctx, void *timeout_ctx)
  3176. {
  3177. struct p2p_data *p2p = eloop_ctx;
  3178. if (p2p->ext_listen_interval) {
  3179. /* Schedule next extended listen timeout */
  3180. eloop_register_timeout(p2p->ext_listen_interval_sec,
  3181. p2p->ext_listen_interval_usec,
  3182. p2p_ext_listen_timeout, p2p, NULL);
  3183. }
  3184. if (p2p->state == P2P_LISTEN_ONLY && p2p->ext_listen_only) {
  3185. /*
  3186. * This should not really happen, but it looks like the Listen
  3187. * command may fail is something else (e.g., a scan) was
  3188. * running at an inconvenient time. As a workaround, allow new
  3189. * Extended Listen operation to be started.
  3190. */
  3191. p2p_dbg(p2p, "Previous Extended Listen operation had not been completed - try again");
  3192. p2p->ext_listen_only = 0;
  3193. p2p_set_state(p2p, P2P_IDLE);
  3194. }
  3195. if (p2p->state != P2P_IDLE) {
  3196. p2p_dbg(p2p, "Skip Extended Listen timeout in active state (%s)", p2p_state_txt(p2p->state));
  3197. return;
  3198. }
  3199. p2p_dbg(p2p, "Extended Listen timeout");
  3200. p2p->ext_listen_only = 1;
  3201. if (p2p_listen(p2p, p2p->ext_listen_period) < 0) {
  3202. p2p_dbg(p2p, "Failed to start Listen state for Extended Listen Timing");
  3203. p2p->ext_listen_only = 0;
  3204. }
  3205. }
  3206. int p2p_ext_listen(struct p2p_data *p2p, unsigned int period,
  3207. unsigned int interval)
  3208. {
  3209. if (period > 65535 || interval > 65535 || period > interval ||
  3210. (period == 0 && interval > 0) || (period > 0 && interval == 0)) {
  3211. p2p_dbg(p2p, "Invalid Extended Listen Timing request: period=%u interval=%u",
  3212. period, interval);
  3213. return -1;
  3214. }
  3215. eloop_cancel_timeout(p2p_ext_listen_timeout, p2p, NULL);
  3216. if (interval == 0) {
  3217. p2p_dbg(p2p, "Disabling Extended Listen Timing");
  3218. p2p->ext_listen_period = 0;
  3219. p2p->ext_listen_interval = 0;
  3220. return 0;
  3221. }
  3222. p2p_dbg(p2p, "Enabling Extended Listen Timing: period %u msec, interval %u msec",
  3223. period, interval);
  3224. p2p->ext_listen_period = period;
  3225. p2p->ext_listen_interval = interval;
  3226. p2p->ext_listen_interval_sec = interval / 1000;
  3227. p2p->ext_listen_interval_usec = (interval % 1000) * 1000;
  3228. eloop_register_timeout(p2p->ext_listen_interval_sec,
  3229. p2p->ext_listen_interval_usec,
  3230. p2p_ext_listen_timeout, p2p, NULL);
  3231. return 0;
  3232. }
  3233. void p2p_deauth_notif(struct p2p_data *p2p, const u8 *bssid, u16 reason_code,
  3234. const u8 *ie, size_t ie_len)
  3235. {
  3236. struct p2p_message msg;
  3237. if (bssid == NULL || ie == NULL)
  3238. return;
  3239. os_memset(&msg, 0, sizeof(msg));
  3240. if (p2p_parse_ies(ie, ie_len, &msg))
  3241. return;
  3242. if (msg.minor_reason_code == NULL)
  3243. return;
  3244. p2p_dbg(p2p, "Deauthentication notification BSSID " MACSTR
  3245. " reason_code=%u minor_reason_code=%u",
  3246. MAC2STR(bssid), reason_code, *msg.minor_reason_code);
  3247. p2p_parse_free(&msg);
  3248. }
  3249. void p2p_disassoc_notif(struct p2p_data *p2p, const u8 *bssid, u16 reason_code,
  3250. const u8 *ie, size_t ie_len)
  3251. {
  3252. struct p2p_message msg;
  3253. if (bssid == NULL || ie == NULL)
  3254. return;
  3255. os_memset(&msg, 0, sizeof(msg));
  3256. if (p2p_parse_ies(ie, ie_len, &msg))
  3257. return;
  3258. if (msg.minor_reason_code == NULL)
  3259. return;
  3260. p2p_dbg(p2p, "Disassociation notification BSSID " MACSTR
  3261. " reason_code=%u minor_reason_code=%u",
  3262. MAC2STR(bssid), reason_code, *msg.minor_reason_code);
  3263. p2p_parse_free(&msg);
  3264. }
  3265. void p2p_set_managed_oper(struct p2p_data *p2p, int enabled)
  3266. {
  3267. if (enabled) {
  3268. p2p_dbg(p2p, "Managed P2P Device operations enabled");
  3269. p2p->dev_capab |= P2P_DEV_CAPAB_INFRA_MANAGED;
  3270. } else {
  3271. p2p_dbg(p2p, "Managed P2P Device operations disabled");
  3272. p2p->dev_capab &= ~P2P_DEV_CAPAB_INFRA_MANAGED;
  3273. }
  3274. }
  3275. int p2p_set_listen_channel(struct p2p_data *p2p, u8 reg_class, u8 channel)
  3276. {
  3277. if (p2p_channel_to_freq(reg_class, channel) < 0)
  3278. return -1;
  3279. p2p_dbg(p2p, "Set Listen channel: reg_class %u channel %u",
  3280. reg_class, channel);
  3281. p2p->cfg->reg_class = reg_class;
  3282. p2p->cfg->channel = channel;
  3283. return 0;
  3284. }
  3285. int p2p_set_ssid_postfix(struct p2p_data *p2p, const u8 *postfix, size_t len)
  3286. {
  3287. p2p_dbg(p2p, "New SSID postfix: %s", wpa_ssid_txt(postfix, len));
  3288. if (postfix == NULL) {
  3289. p2p->cfg->ssid_postfix_len = 0;
  3290. return 0;
  3291. }
  3292. if (len > sizeof(p2p->cfg->ssid_postfix))
  3293. return -1;
  3294. os_memcpy(p2p->cfg->ssid_postfix, postfix, len);
  3295. p2p->cfg->ssid_postfix_len = len;
  3296. return 0;
  3297. }
  3298. int p2p_set_oper_channel(struct p2p_data *p2p, u8 op_reg_class, u8 op_channel,
  3299. int cfg_op_channel)
  3300. {
  3301. if (p2p_channel_to_freq(op_reg_class, op_channel) < 0)
  3302. return -1;
  3303. p2p_dbg(p2p, "Set Operating channel: reg_class %u channel %u",
  3304. op_reg_class, op_channel);
  3305. p2p->cfg->op_reg_class = op_reg_class;
  3306. p2p->cfg->op_channel = op_channel;
  3307. p2p->cfg->cfg_op_channel = cfg_op_channel;
  3308. return 0;
  3309. }
  3310. int p2p_set_pref_chan(struct p2p_data *p2p, unsigned int num_pref_chan,
  3311. const struct p2p_channel *pref_chan)
  3312. {
  3313. struct p2p_channel *n;
  3314. if (pref_chan) {
  3315. n = os_malloc(num_pref_chan * sizeof(struct p2p_channel));
  3316. if (n == NULL)
  3317. return -1;
  3318. os_memcpy(n, pref_chan,
  3319. num_pref_chan * sizeof(struct p2p_channel));
  3320. } else
  3321. n = NULL;
  3322. os_free(p2p->cfg->pref_chan);
  3323. p2p->cfg->pref_chan = n;
  3324. p2p->cfg->num_pref_chan = num_pref_chan;
  3325. return 0;
  3326. }
  3327. int p2p_set_no_go_freq(struct p2p_data *p2p,
  3328. const struct wpa_freq_range_list *list)
  3329. {
  3330. struct wpa_freq_range *tmp;
  3331. if (list == NULL || list->num == 0) {
  3332. os_free(p2p->no_go_freq.range);
  3333. p2p->no_go_freq.range = NULL;
  3334. p2p->no_go_freq.num = 0;
  3335. return 0;
  3336. }
  3337. tmp = os_calloc(list->num, sizeof(struct wpa_freq_range));
  3338. if (tmp == NULL)
  3339. return -1;
  3340. os_memcpy(tmp, list->range, list->num * sizeof(struct wpa_freq_range));
  3341. os_free(p2p->no_go_freq.range);
  3342. p2p->no_go_freq.range = tmp;
  3343. p2p->no_go_freq.num = list->num;
  3344. p2p_dbg(p2p, "Updated no GO chan list");
  3345. return 0;
  3346. }
  3347. int p2p_get_interface_addr(struct p2p_data *p2p, const u8 *dev_addr,
  3348. u8 *iface_addr)
  3349. {
  3350. struct p2p_device *dev = p2p_get_device(p2p, dev_addr);
  3351. if (dev == NULL || is_zero_ether_addr(dev->interface_addr))
  3352. return -1;
  3353. os_memcpy(iface_addr, dev->interface_addr, ETH_ALEN);
  3354. return 0;
  3355. }
  3356. int p2p_get_dev_addr(struct p2p_data *p2p, const u8 *iface_addr,
  3357. u8 *dev_addr)
  3358. {
  3359. struct p2p_device *dev = p2p_get_device_interface(p2p, iface_addr);
  3360. if (dev == NULL)
  3361. return -1;
  3362. os_memcpy(dev_addr, dev->info.p2p_device_addr, ETH_ALEN);
  3363. return 0;
  3364. }
  3365. void p2p_set_peer_filter(struct p2p_data *p2p, const u8 *addr)
  3366. {
  3367. os_memcpy(p2p->peer_filter, addr, ETH_ALEN);
  3368. if (is_zero_ether_addr(p2p->peer_filter))
  3369. p2p_dbg(p2p, "Disable peer filter");
  3370. else
  3371. p2p_dbg(p2p, "Enable peer filter for " MACSTR,
  3372. MAC2STR(p2p->peer_filter));
  3373. }
  3374. void p2p_set_cross_connect(struct p2p_data *p2p, int enabled)
  3375. {
  3376. p2p_dbg(p2p, "Cross connection %s", enabled ? "enabled" : "disabled");
  3377. if (p2p->cross_connect == enabled)
  3378. return;
  3379. p2p->cross_connect = enabled;
  3380. /* TODO: may need to tear down any action group where we are GO(?) */
  3381. }
  3382. int p2p_get_oper_freq(struct p2p_data *p2p, const u8 *iface_addr)
  3383. {
  3384. struct p2p_device *dev = p2p_get_device_interface(p2p, iface_addr);
  3385. if (dev == NULL)
  3386. return -1;
  3387. if (dev->oper_freq <= 0)
  3388. return -1;
  3389. return dev->oper_freq;
  3390. }
  3391. void p2p_set_intra_bss_dist(struct p2p_data *p2p, int enabled)
  3392. {
  3393. p2p_dbg(p2p, "Intra BSS distribution %s",
  3394. enabled ? "enabled" : "disabled");
  3395. p2p->cfg->p2p_intra_bss = enabled;
  3396. }
  3397. void p2p_update_channel_list(struct p2p_data *p2p,
  3398. const struct p2p_channels *chan,
  3399. const struct p2p_channels *cli_chan)
  3400. {
  3401. p2p_dbg(p2p, "Update channel list");
  3402. os_memcpy(&p2p->cfg->channels, chan, sizeof(struct p2p_channels));
  3403. p2p_channels_dump(p2p, "channels", &p2p->cfg->channels);
  3404. os_memcpy(&p2p->cfg->cli_channels, cli_chan,
  3405. sizeof(struct p2p_channels));
  3406. p2p_channels_dump(p2p, "cli_channels", &p2p->cfg->cli_channels);
  3407. }
  3408. int p2p_send_action(struct p2p_data *p2p, unsigned int freq, const u8 *dst,
  3409. const u8 *src, const u8 *bssid, const u8 *buf,
  3410. size_t len, unsigned int wait_time)
  3411. {
  3412. if (p2p->p2p_scan_running) {
  3413. p2p_dbg(p2p, "Delay Action frame TX until p2p_scan completes");
  3414. if (p2p->after_scan_tx) {
  3415. p2p_dbg(p2p, "Dropped previous pending Action frame TX");
  3416. os_free(p2p->after_scan_tx);
  3417. }
  3418. p2p->after_scan_tx = os_malloc(sizeof(*p2p->after_scan_tx) +
  3419. len);
  3420. if (p2p->after_scan_tx == NULL)
  3421. return -1;
  3422. p2p->after_scan_tx->freq = freq;
  3423. os_memcpy(p2p->after_scan_tx->dst, dst, ETH_ALEN);
  3424. os_memcpy(p2p->after_scan_tx->src, src, ETH_ALEN);
  3425. os_memcpy(p2p->after_scan_tx->bssid, bssid, ETH_ALEN);
  3426. p2p->after_scan_tx->len = len;
  3427. p2p->after_scan_tx->wait_time = wait_time;
  3428. os_memcpy(p2p->after_scan_tx + 1, buf, len);
  3429. return 0;
  3430. }
  3431. return p2p->cfg->send_action(p2p->cfg->cb_ctx, freq, dst, src, bssid,
  3432. buf, len, wait_time);
  3433. }
  3434. void p2p_set_best_channels(struct p2p_data *p2p, int freq_24, int freq_5,
  3435. int freq_overall)
  3436. {
  3437. p2p_dbg(p2p, "Best channel: 2.4 GHz: %d, 5 GHz: %d, overall: %d",
  3438. freq_24, freq_5, freq_overall);
  3439. p2p->best_freq_24 = freq_24;
  3440. p2p->best_freq_5 = freq_5;
  3441. p2p->best_freq_overall = freq_overall;
  3442. }
  3443. void p2p_set_own_freq_preference(struct p2p_data *p2p, int freq)
  3444. {
  3445. p2p_dbg(p2p, "Own frequency preference: %d MHz", freq);
  3446. p2p->own_freq_preference = freq;
  3447. }
  3448. const u8 * p2p_get_go_neg_peer(struct p2p_data *p2p)
  3449. {
  3450. if (p2p == NULL || p2p->go_neg_peer == NULL)
  3451. return NULL;
  3452. return p2p->go_neg_peer->info.p2p_device_addr;
  3453. }
  3454. const struct p2p_peer_info *
  3455. p2p_get_peer_found(struct p2p_data *p2p, const u8 *addr, int next)
  3456. {
  3457. struct p2p_device *dev;
  3458. if (addr) {
  3459. dev = p2p_get_device(p2p, addr);
  3460. if (!dev)
  3461. return NULL;
  3462. if (!next) {
  3463. if (dev->flags & P2P_DEV_PROBE_REQ_ONLY)
  3464. return NULL;
  3465. return &dev->info;
  3466. } else {
  3467. do {
  3468. dev = dl_list_first(&dev->list,
  3469. struct p2p_device,
  3470. list);
  3471. if (&dev->list == &p2p->devices)
  3472. return NULL;
  3473. } while (dev->flags & P2P_DEV_PROBE_REQ_ONLY);
  3474. }
  3475. } else {
  3476. dev = dl_list_first(&p2p->devices, struct p2p_device, list);
  3477. if (!dev)
  3478. return NULL;
  3479. while (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
  3480. dev = dl_list_first(&dev->list,
  3481. struct p2p_device,
  3482. list);
  3483. if (&dev->list == &p2p->devices)
  3484. return NULL;
  3485. }
  3486. }
  3487. return &dev->info;
  3488. }
  3489. int p2p_in_progress(struct p2p_data *p2p)
  3490. {
  3491. if (p2p == NULL)
  3492. return 0;
  3493. if (p2p->state == P2P_SEARCH)
  3494. return 2;
  3495. return p2p->state != P2P_IDLE && p2p->state != P2P_PROVISIONING;
  3496. }
  3497. void p2p_set_config_timeout(struct p2p_data *p2p, u8 go_timeout,
  3498. u8 client_timeout)
  3499. {
  3500. if (p2p) {
  3501. p2p->go_timeout = go_timeout;
  3502. p2p->client_timeout = client_timeout;
  3503. }
  3504. }
  3505. #ifdef CONFIG_WIFI_DISPLAY
  3506. static void p2p_update_wfd_ie_groups(struct p2p_data *p2p)
  3507. {
  3508. size_t g;
  3509. struct p2p_group *group;
  3510. for (g = 0; g < p2p->num_groups; g++) {
  3511. group = p2p->groups[g];
  3512. p2p_group_force_beacon_update_ies(group);
  3513. }
  3514. }
  3515. int p2p_set_wfd_ie_beacon(struct p2p_data *p2p, struct wpabuf *ie)
  3516. {
  3517. wpabuf_free(p2p->wfd_ie_beacon);
  3518. p2p->wfd_ie_beacon = ie;
  3519. p2p_update_wfd_ie_groups(p2p);
  3520. return 0;
  3521. }
  3522. int p2p_set_wfd_ie_probe_req(struct p2p_data *p2p, struct wpabuf *ie)
  3523. {
  3524. wpabuf_free(p2p->wfd_ie_probe_req);
  3525. p2p->wfd_ie_probe_req = ie;
  3526. return 0;
  3527. }
  3528. int p2p_set_wfd_ie_probe_resp(struct p2p_data *p2p, struct wpabuf *ie)
  3529. {
  3530. wpabuf_free(p2p->wfd_ie_probe_resp);
  3531. p2p->wfd_ie_probe_resp = ie;
  3532. p2p_update_wfd_ie_groups(p2p);
  3533. return 0;
  3534. }
  3535. int p2p_set_wfd_ie_assoc_req(struct p2p_data *p2p, struct wpabuf *ie)
  3536. {
  3537. wpabuf_free(p2p->wfd_ie_assoc_req);
  3538. p2p->wfd_ie_assoc_req = ie;
  3539. return 0;
  3540. }
  3541. int p2p_set_wfd_ie_invitation(struct p2p_data *p2p, struct wpabuf *ie)
  3542. {
  3543. wpabuf_free(p2p->wfd_ie_invitation);
  3544. p2p->wfd_ie_invitation = ie;
  3545. return 0;
  3546. }
  3547. int p2p_set_wfd_ie_prov_disc_req(struct p2p_data *p2p, struct wpabuf *ie)
  3548. {
  3549. wpabuf_free(p2p->wfd_ie_prov_disc_req);
  3550. p2p->wfd_ie_prov_disc_req = ie;
  3551. return 0;
  3552. }
  3553. int p2p_set_wfd_ie_prov_disc_resp(struct p2p_data *p2p, struct wpabuf *ie)
  3554. {
  3555. wpabuf_free(p2p->wfd_ie_prov_disc_resp);
  3556. p2p->wfd_ie_prov_disc_resp = ie;
  3557. return 0;
  3558. }
  3559. int p2p_set_wfd_ie_go_neg(struct p2p_data *p2p, struct wpabuf *ie)
  3560. {
  3561. wpabuf_free(p2p->wfd_ie_go_neg);
  3562. p2p->wfd_ie_go_neg = ie;
  3563. return 0;
  3564. }
  3565. int p2p_set_wfd_dev_info(struct p2p_data *p2p, const struct wpabuf *elem)
  3566. {
  3567. wpabuf_free(p2p->wfd_dev_info);
  3568. if (elem) {
  3569. p2p->wfd_dev_info = wpabuf_dup(elem);
  3570. if (p2p->wfd_dev_info == NULL)
  3571. return -1;
  3572. } else
  3573. p2p->wfd_dev_info = NULL;
  3574. return 0;
  3575. }
  3576. int p2p_set_wfd_assoc_bssid(struct p2p_data *p2p, const struct wpabuf *elem)
  3577. {
  3578. wpabuf_free(p2p->wfd_assoc_bssid);
  3579. if (elem) {
  3580. p2p->wfd_assoc_bssid = wpabuf_dup(elem);
  3581. if (p2p->wfd_assoc_bssid == NULL)
  3582. return -1;
  3583. } else
  3584. p2p->wfd_assoc_bssid = NULL;
  3585. return 0;
  3586. }
  3587. int p2p_set_wfd_coupled_sink_info(struct p2p_data *p2p,
  3588. const struct wpabuf *elem)
  3589. {
  3590. wpabuf_free(p2p->wfd_coupled_sink_info);
  3591. if (elem) {
  3592. p2p->wfd_coupled_sink_info = wpabuf_dup(elem);
  3593. if (p2p->wfd_coupled_sink_info == NULL)
  3594. return -1;
  3595. } else
  3596. p2p->wfd_coupled_sink_info = NULL;
  3597. return 0;
  3598. }
  3599. #endif /* CONFIG_WIFI_DISPLAY */
  3600. int p2p_set_disc_int(struct p2p_data *p2p, int min_disc_int, int max_disc_int,
  3601. int max_disc_tu)
  3602. {
  3603. if (min_disc_int > max_disc_int || min_disc_int < 0 || max_disc_int < 0)
  3604. return -1;
  3605. p2p->min_disc_int = min_disc_int;
  3606. p2p->max_disc_int = max_disc_int;
  3607. p2p->max_disc_tu = max_disc_tu;
  3608. p2p_dbg(p2p, "Set discoverable interval: min=%d max=%d max_tu=%d",
  3609. min_disc_int, max_disc_int, max_disc_tu);
  3610. return 0;
  3611. }
  3612. void p2p_dbg(struct p2p_data *p2p, const char *fmt, ...)
  3613. {
  3614. va_list ap;
  3615. char buf[500];
  3616. if (!p2p->cfg->debug_print)
  3617. return;
  3618. va_start(ap, fmt);
  3619. vsnprintf(buf, sizeof(buf), fmt, ap);
  3620. buf[sizeof(buf) - 1] = '\0';
  3621. va_end(ap);
  3622. p2p->cfg->debug_print(p2p->cfg->cb_ctx, MSG_DEBUG, buf);
  3623. }
  3624. void p2p_info(struct p2p_data *p2p, const char *fmt, ...)
  3625. {
  3626. va_list ap;
  3627. char buf[500];
  3628. if (!p2p->cfg->debug_print)
  3629. return;
  3630. va_start(ap, fmt);
  3631. vsnprintf(buf, sizeof(buf), fmt, ap);
  3632. buf[sizeof(buf) - 1] = '\0';
  3633. va_end(ap);
  3634. p2p->cfg->debug_print(p2p->cfg->cb_ctx, MSG_INFO, buf);
  3635. }
  3636. void p2p_err(struct p2p_data *p2p, const char *fmt, ...)
  3637. {
  3638. va_list ap;
  3639. char buf[500];
  3640. if (!p2p->cfg->debug_print)
  3641. return;
  3642. va_start(ap, fmt);
  3643. vsnprintf(buf, sizeof(buf), fmt, ap);
  3644. buf[sizeof(buf) - 1] = '\0';
  3645. va_end(ap);
  3646. p2p->cfg->debug_print(p2p->cfg->cb_ctx, MSG_ERROR, buf);
  3647. }