driver_test.c 87 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397
  1. /*
  2. * Testing driver interface for a simulated network driver
  3. * Copyright (c) 2004-2010, Jouni Malinen <j@w1.fi>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * Alternatively, this software may be distributed under the terms of BSD
  10. * license.
  11. *
  12. * See README and COPYING for more details.
  13. */
  14. /* Make sure we get winsock2.h for Windows build to get sockaddr_storage */
  15. #include "build_config.h"
  16. #ifdef CONFIG_NATIVE_WINDOWS
  17. #include <winsock2.h>
  18. #endif /* CONFIG_NATIVE_WINDOWS */
  19. #include "utils/includes.h"
  20. #ifndef CONFIG_NATIVE_WINDOWS
  21. #include <sys/un.h>
  22. #include <dirent.h>
  23. #include <sys/stat.h>
  24. #define DRIVER_TEST_UNIX
  25. #endif /* CONFIG_NATIVE_WINDOWS */
  26. #include "utils/common.h"
  27. #include "utils/eloop.h"
  28. #include "utils/list.h"
  29. #include "utils/trace.h"
  30. #include "common/ieee802_11_defs.h"
  31. #include "crypto/sha1.h"
  32. #include "l2_packet/l2_packet.h"
  33. #include "p2p/p2p.h"
  34. #include "wps/wps.h"
  35. #include "driver.h"
  36. struct test_client_socket {
  37. struct test_client_socket *next;
  38. u8 addr[ETH_ALEN];
  39. struct sockaddr_un un;
  40. socklen_t unlen;
  41. struct test_driver_bss *bss;
  42. };
  43. struct test_driver_bss {
  44. struct wpa_driver_test_data *drv;
  45. struct dl_list list;
  46. void *bss_ctx;
  47. char ifname[IFNAMSIZ];
  48. u8 bssid[ETH_ALEN];
  49. u8 *ie;
  50. size_t ielen;
  51. u8 *wps_beacon_ie;
  52. size_t wps_beacon_ie_len;
  53. u8 *wps_probe_resp_ie;
  54. size_t wps_probe_resp_ie_len;
  55. u8 ssid[32];
  56. size_t ssid_len;
  57. int privacy;
  58. };
  59. struct wpa_driver_test_global {
  60. int bss_add_used;
  61. u8 req_addr[ETH_ALEN];
  62. };
  63. struct wpa_driver_test_data {
  64. struct wpa_driver_test_global *global;
  65. void *ctx;
  66. WPA_TRACE_REF(ctx);
  67. u8 own_addr[ETH_ALEN];
  68. int test_socket;
  69. #ifdef DRIVER_TEST_UNIX
  70. struct sockaddr_un hostapd_addr;
  71. #endif /* DRIVER_TEST_UNIX */
  72. int hostapd_addr_set;
  73. struct sockaddr_in hostapd_addr_udp;
  74. int hostapd_addr_udp_set;
  75. char *own_socket_path;
  76. char *test_dir;
  77. #define MAX_SCAN_RESULTS 30
  78. struct wpa_scan_res *scanres[MAX_SCAN_RESULTS];
  79. size_t num_scanres;
  80. int use_associnfo;
  81. u8 assoc_wpa_ie[80];
  82. size_t assoc_wpa_ie_len;
  83. int use_mlme;
  84. int associated;
  85. u8 *probe_req_ie;
  86. size_t probe_req_ie_len;
  87. u8 probe_req_ssid[32];
  88. size_t probe_req_ssid_len;
  89. int ibss;
  90. int ap;
  91. struct test_client_socket *cli;
  92. struct dl_list bss;
  93. int udp_port;
  94. int alloc_iface_idx;
  95. int probe_req_report;
  96. unsigned int remain_on_channel_freq;
  97. unsigned int remain_on_channel_duration;
  98. int current_freq;
  99. struct p2p_data *p2p;
  100. unsigned int off_channel_freq;
  101. struct wpabuf *pending_action_tx;
  102. u8 pending_action_src[ETH_ALEN];
  103. u8 pending_action_dst[ETH_ALEN];
  104. u8 pending_action_bssid[ETH_ALEN];
  105. unsigned int pending_action_freq;
  106. unsigned int pending_listen_freq;
  107. unsigned int pending_listen_duration;
  108. int pending_p2p_scan;
  109. struct sockaddr *probe_from;
  110. socklen_t probe_from_len;
  111. };
  112. static void wpa_driver_test_deinit(void *priv);
  113. static int wpa_driver_test_attach(struct wpa_driver_test_data *drv,
  114. const char *dir, int ap);
  115. static void wpa_driver_test_close_test_socket(
  116. struct wpa_driver_test_data *drv);
  117. static void test_remain_on_channel_timeout(void *eloop_ctx, void *timeout_ctx);
  118. static int wpa_driver_test_init_p2p(struct wpa_driver_test_data *drv);
  119. static void test_driver_free_bss(struct test_driver_bss *bss)
  120. {
  121. os_free(bss->ie);
  122. os_free(bss->wps_beacon_ie);
  123. os_free(bss->wps_probe_resp_ie);
  124. os_free(bss);
  125. }
  126. static void test_driver_free_bsses(struct wpa_driver_test_data *drv)
  127. {
  128. struct test_driver_bss *bss, *tmp;
  129. dl_list_for_each_safe(bss, tmp, &drv->bss, struct test_driver_bss,
  130. list) {
  131. dl_list_del(&bss->list);
  132. test_driver_free_bss(bss);
  133. }
  134. }
  135. static struct test_client_socket *
  136. test_driver_get_cli(struct wpa_driver_test_data *drv, struct sockaddr_un *from,
  137. socklen_t fromlen)
  138. {
  139. struct test_client_socket *cli = drv->cli;
  140. while (cli) {
  141. if (cli->unlen == fromlen &&
  142. strncmp(cli->un.sun_path, from->sun_path,
  143. fromlen - sizeof(cli->un.sun_family)) == 0)
  144. return cli;
  145. cli = cli->next;
  146. }
  147. return NULL;
  148. }
  149. static int test_driver_send_eapol(void *priv, const u8 *addr, const u8 *data,
  150. size_t data_len, int encrypt,
  151. const u8 *own_addr, u32 flags)
  152. {
  153. struct test_driver_bss *dbss = priv;
  154. struct wpa_driver_test_data *drv = dbss->drv;
  155. struct test_client_socket *cli;
  156. struct msghdr msg;
  157. struct iovec io[3];
  158. struct l2_ethhdr eth;
  159. if (drv->test_socket < 0)
  160. return -1;
  161. cli = drv->cli;
  162. while (cli) {
  163. if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
  164. break;
  165. cli = cli->next;
  166. }
  167. if (!cli) {
  168. wpa_printf(MSG_DEBUG, "%s: no destination client entry",
  169. __func__);
  170. return -1;
  171. }
  172. memcpy(eth.h_dest, addr, ETH_ALEN);
  173. memcpy(eth.h_source, own_addr, ETH_ALEN);
  174. eth.h_proto = host_to_be16(ETH_P_EAPOL);
  175. io[0].iov_base = "EAPOL ";
  176. io[0].iov_len = 6;
  177. io[1].iov_base = &eth;
  178. io[1].iov_len = sizeof(eth);
  179. io[2].iov_base = (u8 *) data;
  180. io[2].iov_len = data_len;
  181. memset(&msg, 0, sizeof(msg));
  182. msg.msg_iov = io;
  183. msg.msg_iovlen = 3;
  184. msg.msg_name = &cli->un;
  185. msg.msg_namelen = cli->unlen;
  186. return sendmsg(drv->test_socket, &msg, 0);
  187. }
  188. static int test_driver_send_ether(void *priv, const u8 *dst, const u8 *src,
  189. u16 proto, const u8 *data, size_t data_len)
  190. {
  191. struct test_driver_bss *dbss = priv;
  192. struct wpa_driver_test_data *drv = dbss->drv;
  193. struct msghdr msg;
  194. struct iovec io[3];
  195. struct l2_ethhdr eth;
  196. char desttxt[30];
  197. struct sockaddr_un addr;
  198. struct dirent *dent;
  199. DIR *dir;
  200. int ret = 0, broadcast = 0, count = 0;
  201. if (drv->test_socket < 0 || drv->test_dir == NULL) {
  202. wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d "
  203. "test_dir=%p)",
  204. __func__, drv->test_socket, drv->test_dir);
  205. return -1;
  206. }
  207. broadcast = memcmp(dst, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0;
  208. snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dst));
  209. memcpy(eth.h_dest, dst, ETH_ALEN);
  210. memcpy(eth.h_source, src, ETH_ALEN);
  211. eth.h_proto = host_to_be16(proto);
  212. io[0].iov_base = "ETHER ";
  213. io[0].iov_len = 6;
  214. io[1].iov_base = &eth;
  215. io[1].iov_len = sizeof(eth);
  216. io[2].iov_base = (u8 *) data;
  217. io[2].iov_len = data_len;
  218. memset(&msg, 0, sizeof(msg));
  219. msg.msg_iov = io;
  220. msg.msg_iovlen = 3;
  221. dir = opendir(drv->test_dir);
  222. if (dir == NULL) {
  223. perror("test_driver: opendir");
  224. return -1;
  225. }
  226. while ((dent = readdir(dir))) {
  227. #ifdef _DIRENT_HAVE_D_TYPE
  228. /* Skip the file if it is not a socket. Also accept
  229. * DT_UNKNOWN (0) in case the C library or underlying file
  230. * system does not support d_type. */
  231. if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
  232. continue;
  233. #endif /* _DIRENT_HAVE_D_TYPE */
  234. if (strcmp(dent->d_name, ".") == 0 ||
  235. strcmp(dent->d_name, "..") == 0)
  236. continue;
  237. memset(&addr, 0, sizeof(addr));
  238. addr.sun_family = AF_UNIX;
  239. snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
  240. drv->test_dir, dent->d_name);
  241. if (strcmp(addr.sun_path, drv->own_socket_path) == 0)
  242. continue;
  243. if (!broadcast && strstr(dent->d_name, desttxt) == NULL)
  244. continue;
  245. wpa_printf(MSG_DEBUG, "%s: Send ether frame to %s",
  246. __func__, dent->d_name);
  247. msg.msg_name = &addr;
  248. msg.msg_namelen = sizeof(addr);
  249. ret = sendmsg(drv->test_socket, &msg, 0);
  250. if (ret < 0)
  251. perror("driver_test: sendmsg");
  252. count++;
  253. }
  254. closedir(dir);
  255. if (!broadcast && count == 0) {
  256. wpa_printf(MSG_DEBUG, "%s: Destination " MACSTR " not found",
  257. __func__, MAC2STR(dst));
  258. return -1;
  259. }
  260. return ret;
  261. }
  262. static int wpa_driver_test_send_mlme(void *priv, const u8 *data,
  263. size_t data_len)
  264. {
  265. struct test_driver_bss *dbss = priv;
  266. struct wpa_driver_test_data *drv = dbss->drv;
  267. struct msghdr msg;
  268. struct iovec io[2];
  269. const u8 *dest;
  270. struct sockaddr_un addr;
  271. struct dirent *dent;
  272. DIR *dir;
  273. int broadcast;
  274. int ret = 0;
  275. struct ieee80211_hdr *hdr;
  276. u16 fc;
  277. char cmd[50];
  278. int freq;
  279. #ifdef HOSTAPD
  280. char desttxt[30];
  281. #endif /* HOSTAPD */
  282. union wpa_event_data event;
  283. wpa_hexdump(MSG_MSGDUMP, "test_send_mlme", data, data_len);
  284. if (drv->test_socket < 0 || data_len < 10) {
  285. wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d len=%lu"
  286. " test_dir=%p)",
  287. __func__, drv->test_socket,
  288. (unsigned long) data_len,
  289. drv->test_dir);
  290. return -1;
  291. }
  292. dest = data + 4;
  293. broadcast = os_memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0;
  294. #ifdef HOSTAPD
  295. snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dest));
  296. #endif /* HOSTAPD */
  297. if (drv->remain_on_channel_freq)
  298. freq = drv->remain_on_channel_freq;
  299. else
  300. freq = drv->current_freq;
  301. wpa_printf(MSG_DEBUG, "test_driver(%s): MLME TX on freq %d MHz",
  302. dbss->ifname, freq);
  303. os_snprintf(cmd, sizeof(cmd), "MLME freq=%d ", freq);
  304. io[0].iov_base = cmd;
  305. io[0].iov_len = os_strlen(cmd);
  306. io[1].iov_base = (void *) data;
  307. io[1].iov_len = data_len;
  308. os_memset(&msg, 0, sizeof(msg));
  309. msg.msg_iov = io;
  310. msg.msg_iovlen = 2;
  311. #ifdef HOSTAPD
  312. if (drv->test_dir == NULL) {
  313. wpa_printf(MSG_DEBUG, "%s: test_dir == NULL", __func__);
  314. return -1;
  315. }
  316. dir = opendir(drv->test_dir);
  317. if (dir == NULL) {
  318. perror("test_driver: opendir");
  319. return -1;
  320. }
  321. while ((dent = readdir(dir))) {
  322. #ifdef _DIRENT_HAVE_D_TYPE
  323. /* Skip the file if it is not a socket. Also accept
  324. * DT_UNKNOWN (0) in case the C library or underlying file
  325. * system does not support d_type. */
  326. if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
  327. continue;
  328. #endif /* _DIRENT_HAVE_D_TYPE */
  329. if (os_strcmp(dent->d_name, ".") == 0 ||
  330. os_strcmp(dent->d_name, "..") == 0)
  331. continue;
  332. os_memset(&addr, 0, sizeof(addr));
  333. addr.sun_family = AF_UNIX;
  334. os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
  335. drv->test_dir, dent->d_name);
  336. if (os_strcmp(addr.sun_path, drv->own_socket_path) == 0)
  337. continue;
  338. if (!broadcast && os_strstr(dent->d_name, desttxt) == NULL)
  339. continue;
  340. wpa_printf(MSG_DEBUG, "%s: Send management frame to %s",
  341. __func__, dent->d_name);
  342. msg.msg_name = &addr;
  343. msg.msg_namelen = sizeof(addr);
  344. ret = sendmsg(drv->test_socket, &msg, 0);
  345. if (ret < 0)
  346. perror("driver_test: sendmsg(test_socket)");
  347. }
  348. closedir(dir);
  349. #else /* HOSTAPD */
  350. if (os_memcmp(dest, dbss->bssid, ETH_ALEN) == 0 ||
  351. drv->test_dir == NULL) {
  352. if (drv->hostapd_addr_udp_set) {
  353. msg.msg_name = &drv->hostapd_addr_udp;
  354. msg.msg_namelen = sizeof(drv->hostapd_addr_udp);
  355. } else {
  356. #ifdef DRIVER_TEST_UNIX
  357. msg.msg_name = &drv->hostapd_addr;
  358. msg.msg_namelen = sizeof(drv->hostapd_addr);
  359. #endif /* DRIVER_TEST_UNIX */
  360. }
  361. } else if (broadcast) {
  362. dir = opendir(drv->test_dir);
  363. if (dir == NULL)
  364. return -1;
  365. while ((dent = readdir(dir))) {
  366. #ifdef _DIRENT_HAVE_D_TYPE
  367. /* Skip the file if it is not a socket.
  368. * Also accept DT_UNKNOWN (0) in case
  369. * the C library or underlying file
  370. * system does not support d_type. */
  371. if (dent->d_type != DT_SOCK &&
  372. dent->d_type != DT_UNKNOWN)
  373. continue;
  374. #endif /* _DIRENT_HAVE_D_TYPE */
  375. if (os_strcmp(dent->d_name, ".") == 0 ||
  376. os_strcmp(dent->d_name, "..") == 0)
  377. continue;
  378. wpa_printf(MSG_DEBUG, "%s: Send broadcast MLME to %s",
  379. __func__, dent->d_name);
  380. os_memset(&addr, 0, sizeof(addr));
  381. addr.sun_family = AF_UNIX;
  382. os_snprintf(addr.sun_path, sizeof(addr.sun_path),
  383. "%s/%s", drv->test_dir, dent->d_name);
  384. msg.msg_name = &addr;
  385. msg.msg_namelen = sizeof(addr);
  386. ret = sendmsg(drv->test_socket, &msg, 0);
  387. if (ret < 0)
  388. perror("driver_test: sendmsg(test_socket)");
  389. }
  390. closedir(dir);
  391. return ret;
  392. } else {
  393. struct stat st;
  394. os_memset(&addr, 0, sizeof(addr));
  395. addr.sun_family = AF_UNIX;
  396. os_snprintf(addr.sun_path, sizeof(addr.sun_path),
  397. "%s/AP-" MACSTR, drv->test_dir, MAC2STR(dest));
  398. if (stat(addr.sun_path, &st) < 0) {
  399. os_snprintf(addr.sun_path, sizeof(addr.sun_path),
  400. "%s/STA-" MACSTR,
  401. drv->test_dir, MAC2STR(dest));
  402. }
  403. msg.msg_name = &addr;
  404. msg.msg_namelen = sizeof(addr);
  405. }
  406. if (sendmsg(drv->test_socket, &msg, 0) < 0) {
  407. perror("sendmsg(test_socket)");
  408. return -1;
  409. }
  410. #endif /* HOSTAPD */
  411. hdr = (struct ieee80211_hdr *) data;
  412. fc = le_to_host16(hdr->frame_control);
  413. os_memset(&event, 0, sizeof(event));
  414. event.tx_status.type = WLAN_FC_GET_TYPE(fc);
  415. event.tx_status.stype = WLAN_FC_GET_STYPE(fc);
  416. event.tx_status.dst = hdr->addr1;
  417. event.tx_status.data = data;
  418. event.tx_status.data_len = data_len;
  419. event.tx_status.ack = ret >= 0;
  420. wpa_supplicant_event(drv->ctx, EVENT_TX_STATUS, &event);
  421. #ifdef CONFIG_P2P
  422. if (drv->p2p &&
  423. WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
  424. WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION) {
  425. if (drv->pending_action_tx == NULL) {
  426. wpa_printf(MSG_DEBUG, "P2P: Ignore Action TX status - "
  427. "no pending operation");
  428. return ret;
  429. }
  430. if (os_memcmp(hdr->addr1, drv->pending_action_dst, ETH_ALEN) !=
  431. 0) {
  432. wpa_printf(MSG_DEBUG, "P2P: Ignore Action TX status - "
  433. "unknown destination address");
  434. return ret;
  435. }
  436. wpabuf_free(drv->pending_action_tx);
  437. drv->pending_action_tx = NULL;
  438. p2p_send_action_cb(drv->p2p, drv->pending_action_freq,
  439. drv->pending_action_dst,
  440. drv->pending_action_src,
  441. drv->pending_action_bssid,
  442. ret >= 0);
  443. }
  444. #endif /* CONFIG_P2P */
  445. return ret;
  446. }
  447. static void test_driver_scan(struct wpa_driver_test_data *drv,
  448. struct sockaddr_un *from, socklen_t fromlen,
  449. char *data)
  450. {
  451. char buf[512], *pos, *end;
  452. int ret;
  453. struct test_driver_bss *bss;
  454. u8 sa[ETH_ALEN];
  455. u8 ie[512];
  456. size_t ielen;
  457. union wpa_event_data event;
  458. /* data: optional [ ' ' | STA-addr | ' ' | IEs(hex) ] */
  459. wpa_printf(MSG_DEBUG, "test_driver: SCAN");
  460. if (*data) {
  461. if (*data != ' ' ||
  462. hwaddr_aton(data + 1, sa)) {
  463. wpa_printf(MSG_DEBUG, "test_driver: Unexpected SCAN "
  464. "command format");
  465. return;
  466. }
  467. data += 18;
  468. while (*data == ' ')
  469. data++;
  470. ielen = os_strlen(data) / 2;
  471. if (ielen > sizeof(ie))
  472. ielen = sizeof(ie);
  473. if (hexstr2bin(data, ie, ielen) < 0)
  474. ielen = 0;
  475. wpa_printf(MSG_DEBUG, "test_driver: Scan from " MACSTR,
  476. MAC2STR(sa));
  477. wpa_hexdump(MSG_MSGDUMP, "test_driver: scan IEs", ie, ielen);
  478. os_memset(&event, 0, sizeof(event));
  479. event.rx_probe_req.sa = sa;
  480. event.rx_probe_req.ie = ie;
  481. event.rx_probe_req.ie_len = ielen;
  482. wpa_supplicant_event(drv->ctx, EVENT_RX_PROBE_REQ, &event);
  483. #ifdef CONFIG_P2P
  484. if (drv->p2p)
  485. p2p_probe_req_rx(drv->p2p, sa, NULL, NULL, ie, ielen);
  486. #endif /* CONFIG_P2P */
  487. }
  488. dl_list_for_each(bss, &drv->bss, struct test_driver_bss, list) {
  489. pos = buf;
  490. end = buf + sizeof(buf);
  491. /* reply: SCANRESP BSSID SSID IEs */
  492. ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
  493. MAC2STR(bss->bssid));
  494. if (ret < 0 || ret >= end - pos)
  495. return;
  496. pos += ret;
  497. pos += wpa_snprintf_hex(pos, end - pos,
  498. bss->ssid, bss->ssid_len);
  499. ret = snprintf(pos, end - pos, " ");
  500. if (ret < 0 || ret >= end - pos)
  501. return;
  502. pos += ret;
  503. pos += wpa_snprintf_hex(pos, end - pos, bss->ie, bss->ielen);
  504. pos += wpa_snprintf_hex(pos, end - pos, bss->wps_probe_resp_ie,
  505. bss->wps_probe_resp_ie_len);
  506. if (bss->privacy) {
  507. ret = snprintf(pos, end - pos, " PRIVACY");
  508. if (ret < 0 || ret >= end - pos)
  509. return;
  510. pos += ret;
  511. }
  512. sendto(drv->test_socket, buf, pos - buf, 0,
  513. (struct sockaddr *) from, fromlen);
  514. }
  515. }
  516. static void test_driver_assoc(struct wpa_driver_test_data *drv,
  517. struct sockaddr_un *from, socklen_t fromlen,
  518. char *data)
  519. {
  520. struct test_client_socket *cli;
  521. u8 ie[256], ssid[32];
  522. size_t ielen, ssid_len = 0;
  523. char *pos, *pos2, cmd[50];
  524. struct test_driver_bss *bss, *tmp;
  525. /* data: STA-addr SSID(hex) IEs(hex) */
  526. cli = os_zalloc(sizeof(*cli));
  527. if (cli == NULL)
  528. return;
  529. if (hwaddr_aton(data, cli->addr)) {
  530. printf("test_socket: Invalid MAC address '%s' in ASSOC\n",
  531. data);
  532. os_free(cli);
  533. return;
  534. }
  535. pos = data + 17;
  536. while (*pos == ' ')
  537. pos++;
  538. pos2 = strchr(pos, ' ');
  539. ielen = 0;
  540. if (pos2) {
  541. ssid_len = (pos2 - pos) / 2;
  542. if (hexstr2bin(pos, ssid, ssid_len) < 0) {
  543. wpa_printf(MSG_DEBUG, "%s: Invalid SSID", __func__);
  544. os_free(cli);
  545. return;
  546. }
  547. wpa_hexdump_ascii(MSG_DEBUG, "test_driver_assoc: SSID",
  548. ssid, ssid_len);
  549. pos = pos2 + 1;
  550. ielen = strlen(pos) / 2;
  551. if (ielen > sizeof(ie))
  552. ielen = sizeof(ie);
  553. if (hexstr2bin(pos, ie, ielen) < 0)
  554. ielen = 0;
  555. }
  556. bss = NULL;
  557. dl_list_for_each(tmp, &drv->bss, struct test_driver_bss, list) {
  558. if (tmp->ssid_len == ssid_len &&
  559. os_memcmp(tmp->ssid, ssid, ssid_len) == 0) {
  560. bss = tmp;
  561. break;
  562. }
  563. }
  564. if (bss == NULL) {
  565. wpa_printf(MSG_DEBUG, "%s: No matching SSID found from "
  566. "configured BSSes", __func__);
  567. os_free(cli);
  568. return;
  569. }
  570. cli->bss = bss;
  571. memcpy(&cli->un, from, sizeof(cli->un));
  572. cli->unlen = fromlen;
  573. cli->next = drv->cli;
  574. drv->cli = cli;
  575. wpa_hexdump_ascii(MSG_DEBUG, "test_socket: ASSOC sun_path",
  576. (const u8 *) cli->un.sun_path,
  577. cli->unlen - sizeof(cli->un.sun_family));
  578. snprintf(cmd, sizeof(cmd), "ASSOCRESP " MACSTR " 0",
  579. MAC2STR(bss->bssid));
  580. sendto(drv->test_socket, cmd, strlen(cmd), 0,
  581. (struct sockaddr *) from, fromlen);
  582. drv_event_assoc(bss->bss_ctx, cli->addr, ie, ielen, 0);
  583. }
  584. static void test_driver_disassoc(struct wpa_driver_test_data *drv,
  585. struct sockaddr_un *from, socklen_t fromlen)
  586. {
  587. struct test_client_socket *cli;
  588. cli = test_driver_get_cli(drv, from, fromlen);
  589. if (!cli)
  590. return;
  591. drv_event_disassoc(drv->ctx, cli->addr);
  592. }
  593. static void test_driver_eapol(struct wpa_driver_test_data *drv,
  594. struct sockaddr_un *from, socklen_t fromlen,
  595. u8 *data, size_t datalen)
  596. {
  597. #ifdef HOSTAPD
  598. struct test_client_socket *cli;
  599. #endif /* HOSTAPD */
  600. const u8 *src = NULL;
  601. if (datalen > 14) {
  602. /* Skip Ethernet header */
  603. src = data + ETH_ALEN;
  604. wpa_printf(MSG_DEBUG, "test_driver: dst=" MACSTR " src="
  605. MACSTR " proto=%04x",
  606. MAC2STR(data), MAC2STR(src),
  607. WPA_GET_BE16(data + 2 * ETH_ALEN));
  608. data += 14;
  609. datalen -= 14;
  610. }
  611. #ifdef HOSTAPD
  612. cli = test_driver_get_cli(drv, from, fromlen);
  613. if (cli) {
  614. drv_event_eapol_rx(cli->bss->bss_ctx, cli->addr, data,
  615. datalen);
  616. } else {
  617. wpa_printf(MSG_DEBUG, "test_socket: EAPOL from unknown "
  618. "client");
  619. }
  620. #else /* HOSTAPD */
  621. if (src)
  622. drv_event_eapol_rx(drv->ctx, src, data, datalen);
  623. #endif /* HOSTAPD */
  624. }
  625. static void test_driver_ether(struct wpa_driver_test_data *drv,
  626. struct sockaddr_un *from, socklen_t fromlen,
  627. u8 *data, size_t datalen)
  628. {
  629. struct l2_ethhdr *eth;
  630. if (datalen < sizeof(*eth))
  631. return;
  632. eth = (struct l2_ethhdr *) data;
  633. wpa_printf(MSG_DEBUG, "test_driver: RX ETHER dst=" MACSTR " src="
  634. MACSTR " proto=%04x",
  635. MAC2STR(eth->h_dest), MAC2STR(eth->h_source),
  636. be_to_host16(eth->h_proto));
  637. #ifdef CONFIG_IEEE80211R
  638. if (be_to_host16(eth->h_proto) == ETH_P_RRB) {
  639. union wpa_event_data ev;
  640. os_memset(&ev, 0, sizeof(ev));
  641. ev.ft_rrb_rx.src = eth->h_source;
  642. ev.ft_rrb_rx.data = data + sizeof(*eth);
  643. ev.ft_rrb_rx.data_len = datalen - sizeof(*eth);
  644. }
  645. #endif /* CONFIG_IEEE80211R */
  646. }
  647. static void test_driver_mlme(struct wpa_driver_test_data *drv,
  648. struct sockaddr_un *from, socklen_t fromlen,
  649. u8 *data, size_t datalen)
  650. {
  651. struct ieee80211_hdr *hdr;
  652. u16 fc;
  653. union wpa_event_data event;
  654. int freq = 0, own_freq;
  655. struct test_driver_bss *bss;
  656. bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
  657. if (datalen > 6 && os_memcmp(data, "freq=", 5) == 0) {
  658. size_t pos;
  659. for (pos = 5; pos < datalen; pos++) {
  660. if (data[pos] == ' ')
  661. break;
  662. }
  663. if (pos < datalen) {
  664. freq = atoi((const char *) &data[5]);
  665. wpa_printf(MSG_DEBUG, "test_driver(%s): MLME RX on "
  666. "freq %d MHz", bss->ifname, freq);
  667. pos++;
  668. data += pos;
  669. datalen -= pos;
  670. }
  671. }
  672. if (drv->remain_on_channel_freq)
  673. own_freq = drv->remain_on_channel_freq;
  674. else
  675. own_freq = drv->current_freq;
  676. if (freq && own_freq && freq != own_freq) {
  677. wpa_printf(MSG_DEBUG, "test_driver(%s): Ignore MLME RX on "
  678. "another frequency %d MHz (own %d MHz)",
  679. bss->ifname, freq, own_freq);
  680. return;
  681. }
  682. hdr = (struct ieee80211_hdr *) data;
  683. if (test_driver_get_cli(drv, from, fromlen) == NULL && datalen >= 16) {
  684. struct test_client_socket *cli;
  685. cli = os_zalloc(sizeof(*cli));
  686. if (cli == NULL)
  687. return;
  688. wpa_printf(MSG_DEBUG, "Adding client entry for " MACSTR,
  689. MAC2STR(hdr->addr2));
  690. memcpy(cli->addr, hdr->addr2, ETH_ALEN);
  691. memcpy(&cli->un, from, sizeof(cli->un));
  692. cli->unlen = fromlen;
  693. cli->next = drv->cli;
  694. drv->cli = cli;
  695. }
  696. wpa_hexdump(MSG_MSGDUMP, "test_driver_mlme: received frame",
  697. data, datalen);
  698. fc = le_to_host16(hdr->frame_control);
  699. if (WLAN_FC_GET_TYPE(fc) != WLAN_FC_TYPE_MGMT) {
  700. wpa_printf(MSG_ERROR, "%s: received non-mgmt frame",
  701. __func__);
  702. return;
  703. }
  704. os_memset(&event, 0, sizeof(event));
  705. event.rx_mgmt.frame = data;
  706. event.rx_mgmt.frame_len = datalen;
  707. wpa_supplicant_event(drv->ctx, EVENT_RX_MGMT, &event);
  708. }
  709. static void test_driver_receive_unix(int sock, void *eloop_ctx, void *sock_ctx)
  710. {
  711. struct wpa_driver_test_data *drv = eloop_ctx;
  712. char buf[2000];
  713. int res;
  714. struct sockaddr_un from;
  715. socklen_t fromlen = sizeof(from);
  716. res = recvfrom(sock, buf, sizeof(buf) - 1, 0,
  717. (struct sockaddr *) &from, &fromlen);
  718. if (res < 0) {
  719. perror("recvfrom(test_socket)");
  720. return;
  721. }
  722. buf[res] = '\0';
  723. wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res);
  724. if (strncmp(buf, "SCAN", 4) == 0) {
  725. test_driver_scan(drv, &from, fromlen, buf + 4);
  726. } else if (strncmp(buf, "ASSOC ", 6) == 0) {
  727. test_driver_assoc(drv, &from, fromlen, buf + 6);
  728. } else if (strcmp(buf, "DISASSOC") == 0) {
  729. test_driver_disassoc(drv, &from, fromlen);
  730. } else if (strncmp(buf, "EAPOL ", 6) == 0) {
  731. test_driver_eapol(drv, &from, fromlen, (u8 *) buf + 6,
  732. res - 6);
  733. } else if (strncmp(buf, "ETHER ", 6) == 0) {
  734. test_driver_ether(drv, &from, fromlen, (u8 *) buf + 6,
  735. res - 6);
  736. } else if (strncmp(buf, "MLME ", 5) == 0) {
  737. test_driver_mlme(drv, &from, fromlen, (u8 *) buf + 5, res - 5);
  738. } else {
  739. wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command",
  740. (u8 *) buf, res);
  741. }
  742. }
  743. static int test_driver_set_generic_elem(void *priv,
  744. const u8 *elem, size_t elem_len)
  745. {
  746. struct test_driver_bss *bss = priv;
  747. os_free(bss->ie);
  748. if (elem == NULL) {
  749. bss->ie = NULL;
  750. bss->ielen = 0;
  751. return 0;
  752. }
  753. bss->ie = os_malloc(elem_len);
  754. if (bss->ie == NULL) {
  755. bss->ielen = 0;
  756. return -1;
  757. }
  758. memcpy(bss->ie, elem, elem_len);
  759. bss->ielen = elem_len;
  760. return 0;
  761. }
  762. static int test_driver_set_ap_wps_ie(void *priv, const struct wpabuf *beacon,
  763. const struct wpabuf *proberesp,
  764. const struct wpabuf *assocresp)
  765. {
  766. struct test_driver_bss *bss = priv;
  767. if (beacon == NULL)
  768. wpa_printf(MSG_DEBUG, "test_driver: Clear Beacon WPS IE");
  769. else
  770. wpa_hexdump_buf(MSG_DEBUG, "test_driver: Beacon WPS IE",
  771. beacon);
  772. os_free(bss->wps_beacon_ie);
  773. if (beacon == NULL) {
  774. bss->wps_beacon_ie = NULL;
  775. bss->wps_beacon_ie_len = 0;
  776. } else {
  777. bss->wps_beacon_ie = os_malloc(wpabuf_len(beacon));
  778. if (bss->wps_beacon_ie == NULL) {
  779. bss->wps_beacon_ie_len = 0;
  780. return -1;
  781. }
  782. os_memcpy(bss->wps_beacon_ie, wpabuf_head(beacon),
  783. wpabuf_len(beacon));
  784. bss->wps_beacon_ie_len = wpabuf_len(beacon);
  785. }
  786. if (proberesp == NULL)
  787. wpa_printf(MSG_DEBUG, "test_driver: Clear Probe Response WPS "
  788. "IE");
  789. else
  790. wpa_hexdump_buf(MSG_DEBUG, "test_driver: Probe Response WPS "
  791. "IE", proberesp);
  792. os_free(bss->wps_probe_resp_ie);
  793. if (proberesp == NULL) {
  794. bss->wps_probe_resp_ie = NULL;
  795. bss->wps_probe_resp_ie_len = 0;
  796. } else {
  797. bss->wps_probe_resp_ie = os_malloc(wpabuf_len(proberesp));
  798. if (bss->wps_probe_resp_ie == NULL) {
  799. bss->wps_probe_resp_ie_len = 0;
  800. return -1;
  801. }
  802. os_memcpy(bss->wps_probe_resp_ie, wpabuf_head(proberesp),
  803. wpabuf_len(proberesp));
  804. bss->wps_probe_resp_ie_len = wpabuf_len(proberesp);
  805. }
  806. return 0;
  807. }
  808. static int test_driver_sta_deauth(void *priv, const u8 *own_addr,
  809. const u8 *addr, int reason)
  810. {
  811. struct test_driver_bss *dbss = priv;
  812. struct wpa_driver_test_data *drv = dbss->drv;
  813. struct test_client_socket *cli;
  814. if (drv->test_socket < 0)
  815. return -1;
  816. cli = drv->cli;
  817. while (cli) {
  818. if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
  819. break;
  820. cli = cli->next;
  821. }
  822. if (!cli)
  823. return -1;
  824. return sendto(drv->test_socket, "DEAUTH", 6, 0,
  825. (struct sockaddr *) &cli->un, cli->unlen);
  826. }
  827. static int test_driver_sta_disassoc(void *priv, const u8 *own_addr,
  828. const u8 *addr, int reason)
  829. {
  830. struct test_driver_bss *dbss = priv;
  831. struct wpa_driver_test_data *drv = dbss->drv;
  832. struct test_client_socket *cli;
  833. if (drv->test_socket < 0)
  834. return -1;
  835. cli = drv->cli;
  836. while (cli) {
  837. if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
  838. break;
  839. cli = cli->next;
  840. }
  841. if (!cli)
  842. return -1;
  843. return sendto(drv->test_socket, "DISASSOC", 8, 0,
  844. (struct sockaddr *) &cli->un, cli->unlen);
  845. }
  846. static int test_driver_bss_add(void *priv, const char *ifname, const u8 *bssid,
  847. void *bss_ctx, void **drv_priv)
  848. {
  849. struct test_driver_bss *dbss = priv;
  850. struct wpa_driver_test_data *drv = dbss->drv;
  851. struct test_driver_bss *bss;
  852. wpa_printf(MSG_DEBUG, "%s(ifname=%s bssid=" MACSTR ")",
  853. __func__, ifname, MAC2STR(bssid));
  854. bss = os_zalloc(sizeof(*bss));
  855. if (bss == NULL)
  856. return -1;
  857. bss->bss_ctx = bss_ctx;
  858. bss->drv = drv;
  859. os_strlcpy(bss->ifname, ifname, IFNAMSIZ);
  860. os_memcpy(bss->bssid, bssid, ETH_ALEN);
  861. dl_list_add(&drv->bss, &bss->list);
  862. if (drv->global) {
  863. drv->global->bss_add_used = 1;
  864. os_memcpy(drv->global->req_addr, bssid, ETH_ALEN);
  865. }
  866. if (drv_priv)
  867. *drv_priv = bss;
  868. return 0;
  869. }
  870. static int test_driver_bss_remove(void *priv, const char *ifname)
  871. {
  872. struct test_driver_bss *dbss = priv;
  873. struct wpa_driver_test_data *drv = dbss->drv;
  874. struct test_driver_bss *bss;
  875. struct test_client_socket *cli, *prev_c;
  876. wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, ifname);
  877. dl_list_for_each(bss, &drv->bss, struct test_driver_bss, list) {
  878. if (strcmp(bss->ifname, ifname) != 0)
  879. continue;
  880. for (prev_c = NULL, cli = drv->cli; cli;
  881. prev_c = cli, cli = cli->next) {
  882. if (cli->bss != bss)
  883. continue;
  884. if (prev_c)
  885. prev_c->next = cli->next;
  886. else
  887. drv->cli = cli->next;
  888. os_free(cli);
  889. break;
  890. }
  891. dl_list_del(&bss->list);
  892. test_driver_free_bss(bss);
  893. return 0;
  894. }
  895. return -1;
  896. }
  897. static int test_driver_if_add(void *priv, enum wpa_driver_if_type type,
  898. const char *ifname, const u8 *addr,
  899. void *bss_ctx, void **drv_priv,
  900. char *force_ifname, u8 *if_addr,
  901. const char *bridge)
  902. {
  903. struct test_driver_bss *dbss = priv;
  904. struct wpa_driver_test_data *drv = dbss->drv;
  905. wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s bss_ctx=%p)",
  906. __func__, type, ifname, bss_ctx);
  907. if (addr)
  908. os_memcpy(if_addr, addr, ETH_ALEN);
  909. else {
  910. drv->alloc_iface_idx++;
  911. if_addr[0] = 0x02; /* locally administered */
  912. sha1_prf(drv->own_addr, ETH_ALEN,
  913. "hostapd test addr generation",
  914. (const u8 *) &drv->alloc_iface_idx,
  915. sizeof(drv->alloc_iface_idx),
  916. if_addr + 1, ETH_ALEN - 1);
  917. }
  918. if (type == WPA_IF_AP_BSS || type == WPA_IF_P2P_GO ||
  919. type == WPA_IF_P2P_CLIENT || type == WPA_IF_P2P_GROUP)
  920. return test_driver_bss_add(priv, ifname, if_addr, bss_ctx,
  921. drv_priv);
  922. return 0;
  923. }
  924. static int test_driver_if_remove(void *priv, enum wpa_driver_if_type type,
  925. const char *ifname)
  926. {
  927. wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s)", __func__, type, ifname);
  928. if (type == WPA_IF_AP_BSS || type == WPA_IF_P2P_GO ||
  929. type == WPA_IF_P2P_CLIENT || type == WPA_IF_P2P_GROUP)
  930. return test_driver_bss_remove(priv, ifname);
  931. return 0;
  932. }
  933. static int test_driver_valid_bss_mask(void *priv, const u8 *addr,
  934. const u8 *mask)
  935. {
  936. return 0;
  937. }
  938. static int test_driver_set_ssid(void *priv, const u8 *buf, int len)
  939. {
  940. struct test_driver_bss *bss = priv;
  941. wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, bss->ifname);
  942. if (len < 0)
  943. return -1;
  944. wpa_hexdump_ascii(MSG_DEBUG, "test_driver_set_ssid: SSID", buf, len);
  945. if ((size_t) len > sizeof(bss->ssid))
  946. return -1;
  947. os_memcpy(bss->ssid, buf, len);
  948. bss->ssid_len = len;
  949. return 0;
  950. }
  951. static int test_driver_set_privacy(void *priv, int enabled)
  952. {
  953. struct test_driver_bss *dbss = priv;
  954. wpa_printf(MSG_DEBUG, "%s(enabled=%d)", __func__, enabled);
  955. dbss->privacy = enabled;
  956. return 0;
  957. }
  958. static int test_driver_set_sta_vlan(void *priv, const u8 *addr,
  959. const char *ifname, int vlan_id)
  960. {
  961. wpa_printf(MSG_DEBUG, "%s(addr=" MACSTR " ifname=%s vlan_id=%d)",
  962. __func__, MAC2STR(addr), ifname, vlan_id);
  963. return 0;
  964. }
  965. static int test_driver_sta_add(void *priv,
  966. struct hostapd_sta_add_params *params)
  967. {
  968. struct test_driver_bss *bss = priv;
  969. struct wpa_driver_test_data *drv = bss->drv;
  970. struct test_client_socket *cli;
  971. wpa_printf(MSG_DEBUG, "%s(ifname=%s addr=" MACSTR " aid=%d "
  972. "capability=0x%x listen_interval=%d)",
  973. __func__, bss->ifname, MAC2STR(params->addr), params->aid,
  974. params->capability, params->listen_interval);
  975. wpa_hexdump(MSG_DEBUG, "test_driver_sta_add - supp_rates",
  976. params->supp_rates, params->supp_rates_len);
  977. cli = drv->cli;
  978. while (cli) {
  979. if (os_memcmp(cli->addr, params->addr, ETH_ALEN) == 0)
  980. break;
  981. cli = cli->next;
  982. }
  983. if (!cli) {
  984. wpa_printf(MSG_DEBUG, "%s: no matching client entry",
  985. __func__);
  986. return -1;
  987. }
  988. cli->bss = bss;
  989. return 0;
  990. }
  991. static struct wpa_driver_test_data * test_alloc_data(void *ctx,
  992. const char *ifname)
  993. {
  994. struct wpa_driver_test_data *drv;
  995. struct test_driver_bss *bss;
  996. drv = os_zalloc(sizeof(struct wpa_driver_test_data));
  997. if (drv == NULL) {
  998. wpa_printf(MSG_ERROR, "Could not allocate memory for test "
  999. "driver data");
  1000. return NULL;
  1001. }
  1002. bss = os_zalloc(sizeof(struct test_driver_bss));
  1003. if (bss == NULL) {
  1004. os_free(drv);
  1005. return NULL;
  1006. }
  1007. drv->ctx = ctx;
  1008. wpa_trace_add_ref(drv, ctx, ctx);
  1009. dl_list_init(&drv->bss);
  1010. dl_list_add(&drv->bss, &bss->list);
  1011. os_strlcpy(bss->ifname, ifname, IFNAMSIZ);
  1012. bss->bss_ctx = ctx;
  1013. bss->drv = drv;
  1014. /* Generate a MAC address to help testing with multiple STAs */
  1015. drv->own_addr[0] = 0x02; /* locally administered */
  1016. sha1_prf((const u8 *) ifname, os_strlen(ifname),
  1017. "test mac addr generation",
  1018. NULL, 0, drv->own_addr + 1, ETH_ALEN - 1);
  1019. return drv;
  1020. }
  1021. static void * test_driver_init(struct hostapd_data *hapd,
  1022. struct wpa_init_params *params)
  1023. {
  1024. struct wpa_driver_test_data *drv;
  1025. struct sockaddr_un addr_un;
  1026. struct sockaddr_in addr_in;
  1027. struct sockaddr *addr;
  1028. socklen_t alen;
  1029. struct test_driver_bss *bss;
  1030. drv = test_alloc_data(hapd, params->ifname);
  1031. if (drv == NULL)
  1032. return NULL;
  1033. drv->ap = 1;
  1034. bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
  1035. drv->global = params->global_priv;
  1036. bss->bss_ctx = hapd;
  1037. os_memcpy(bss->bssid, drv->own_addr, ETH_ALEN);
  1038. os_memcpy(params->own_addr, drv->own_addr, ETH_ALEN);
  1039. if (params->test_socket) {
  1040. if (os_strlen(params->test_socket) >=
  1041. sizeof(addr_un.sun_path)) {
  1042. printf("Too long test_socket path\n");
  1043. wpa_driver_test_deinit(bss);
  1044. return NULL;
  1045. }
  1046. if (strncmp(params->test_socket, "DIR:", 4) == 0) {
  1047. size_t len = strlen(params->test_socket) + 30;
  1048. drv->test_dir = os_strdup(params->test_socket + 4);
  1049. drv->own_socket_path = os_malloc(len);
  1050. if (drv->own_socket_path) {
  1051. snprintf(drv->own_socket_path, len,
  1052. "%s/AP-" MACSTR,
  1053. params->test_socket + 4,
  1054. MAC2STR(params->own_addr));
  1055. }
  1056. } else if (strncmp(params->test_socket, "UDP:", 4) == 0) {
  1057. drv->udp_port = atoi(params->test_socket + 4);
  1058. } else {
  1059. drv->own_socket_path = os_strdup(params->test_socket);
  1060. }
  1061. if (drv->own_socket_path == NULL && drv->udp_port == 0) {
  1062. wpa_driver_test_deinit(bss);
  1063. return NULL;
  1064. }
  1065. drv->test_socket = socket(drv->udp_port ? PF_INET : PF_UNIX,
  1066. SOCK_DGRAM, 0);
  1067. if (drv->test_socket < 0) {
  1068. perror("socket");
  1069. wpa_driver_test_deinit(bss);
  1070. return NULL;
  1071. }
  1072. if (drv->udp_port) {
  1073. os_memset(&addr_in, 0, sizeof(addr_in));
  1074. addr_in.sin_family = AF_INET;
  1075. addr_in.sin_port = htons(drv->udp_port);
  1076. addr = (struct sockaddr *) &addr_in;
  1077. alen = sizeof(addr_in);
  1078. } else {
  1079. os_memset(&addr_un, 0, sizeof(addr_un));
  1080. addr_un.sun_family = AF_UNIX;
  1081. os_strlcpy(addr_un.sun_path, drv->own_socket_path,
  1082. sizeof(addr_un.sun_path));
  1083. addr = (struct sockaddr *) &addr_un;
  1084. alen = sizeof(addr_un);
  1085. }
  1086. if (bind(drv->test_socket, addr, alen) < 0) {
  1087. perror("bind(PF_UNIX)");
  1088. close(drv->test_socket);
  1089. if (drv->own_socket_path)
  1090. unlink(drv->own_socket_path);
  1091. wpa_driver_test_deinit(bss);
  1092. return NULL;
  1093. }
  1094. eloop_register_read_sock(drv->test_socket,
  1095. test_driver_receive_unix, drv, NULL);
  1096. } else
  1097. drv->test_socket = -1;
  1098. return bss;
  1099. }
  1100. static void wpa_driver_test_poll(void *eloop_ctx, void *timeout_ctx)
  1101. {
  1102. struct wpa_driver_test_data *drv = eloop_ctx;
  1103. #ifdef DRIVER_TEST_UNIX
  1104. if (drv->associated && drv->hostapd_addr_set) {
  1105. struct stat st;
  1106. if (stat(drv->hostapd_addr.sun_path, &st) < 0) {
  1107. wpa_printf(MSG_DEBUG, "%s: lost connection to AP: %s",
  1108. __func__, strerror(errno));
  1109. drv->associated = 0;
  1110. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  1111. }
  1112. }
  1113. #endif /* DRIVER_TEST_UNIX */
  1114. eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL);
  1115. }
  1116. static void wpa_driver_test_scan_timeout(void *eloop_ctx, void *timeout_ctx)
  1117. {
  1118. struct wpa_driver_test_data *drv = eloop_ctx;
  1119. wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
  1120. if (drv->pending_p2p_scan && drv->p2p) {
  1121. #ifdef CONFIG_P2P
  1122. size_t i;
  1123. for (i = 0; i < drv->num_scanres; i++) {
  1124. struct wpa_scan_res *bss = drv->scanres[i];
  1125. if (p2p_scan_res_handler(drv->p2p, bss->bssid,
  1126. bss->freq, bss->level,
  1127. (const u8 *) (bss + 1),
  1128. bss->ie_len) > 0)
  1129. return;
  1130. }
  1131. p2p_scan_res_handled(drv->p2p);
  1132. #endif /* CONFIG_P2P */
  1133. return;
  1134. }
  1135. wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
  1136. }
  1137. #ifdef DRIVER_TEST_UNIX
  1138. static void wpa_driver_scan_dir(struct wpa_driver_test_data *drv,
  1139. const char *path)
  1140. {
  1141. struct dirent *dent;
  1142. DIR *dir;
  1143. struct sockaddr_un addr;
  1144. char cmd[512], *pos, *end;
  1145. int ret;
  1146. dir = opendir(path);
  1147. if (dir == NULL)
  1148. return;
  1149. end = cmd + sizeof(cmd);
  1150. pos = cmd;
  1151. ret = os_snprintf(pos, end - pos, "SCAN " MACSTR,
  1152. MAC2STR(drv->own_addr));
  1153. if (ret >= 0 && ret < end - pos)
  1154. pos += ret;
  1155. if (drv->probe_req_ie) {
  1156. ret = os_snprintf(pos, end - pos, " ");
  1157. if (ret >= 0 && ret < end - pos)
  1158. pos += ret;
  1159. pos += wpa_snprintf_hex(pos, end - pos, drv->probe_req_ie,
  1160. drv->probe_req_ie_len);
  1161. }
  1162. if (drv->probe_req_ssid_len) {
  1163. /* Add SSID IE */
  1164. ret = os_snprintf(pos, end - pos, "%02x%02x",
  1165. WLAN_EID_SSID,
  1166. (unsigned int) drv->probe_req_ssid_len);
  1167. if (ret >= 0 && ret < end - pos)
  1168. pos += ret;
  1169. pos += wpa_snprintf_hex(pos, end - pos, drv->probe_req_ssid,
  1170. drv->probe_req_ssid_len);
  1171. }
  1172. end[-1] = '\0';
  1173. while ((dent = readdir(dir))) {
  1174. if (os_strncmp(dent->d_name, "AP-", 3) != 0 &&
  1175. os_strncmp(dent->d_name, "STA-", 4) != 0)
  1176. continue;
  1177. if (drv->own_socket_path) {
  1178. size_t olen, dlen;
  1179. olen = os_strlen(drv->own_socket_path);
  1180. dlen = os_strlen(dent->d_name);
  1181. if (olen >= dlen &&
  1182. os_strcmp(dent->d_name,
  1183. drv->own_socket_path + olen - dlen) == 0)
  1184. continue;
  1185. }
  1186. wpa_printf(MSG_DEBUG, "%s: SCAN %s", __func__, dent->d_name);
  1187. os_memset(&addr, 0, sizeof(addr));
  1188. addr.sun_family = AF_UNIX;
  1189. os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
  1190. path, dent->d_name);
  1191. if (sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
  1192. (struct sockaddr *) &addr, sizeof(addr)) < 0) {
  1193. perror("sendto(test_socket)");
  1194. }
  1195. }
  1196. closedir(dir);
  1197. }
  1198. #endif /* DRIVER_TEST_UNIX */
  1199. static int wpa_driver_test_scan(void *priv,
  1200. struct wpa_driver_scan_params *params)
  1201. {
  1202. struct test_driver_bss *dbss = priv;
  1203. struct wpa_driver_test_data *drv = dbss->drv;
  1204. size_t i;
  1205. wpa_printf(MSG_DEBUG, "%s: priv=%p", __func__, priv);
  1206. os_free(drv->probe_req_ie);
  1207. if (params->extra_ies) {
  1208. drv->probe_req_ie = os_malloc(params->extra_ies_len);
  1209. if (drv->probe_req_ie == NULL) {
  1210. drv->probe_req_ie_len = 0;
  1211. return -1;
  1212. }
  1213. os_memcpy(drv->probe_req_ie, params->extra_ies,
  1214. params->extra_ies_len);
  1215. drv->probe_req_ie_len = params->extra_ies_len;
  1216. } else {
  1217. drv->probe_req_ie = NULL;
  1218. drv->probe_req_ie_len = 0;
  1219. }
  1220. for (i = 0; i < params->num_ssids; i++)
  1221. wpa_hexdump(MSG_DEBUG, "Scan SSID",
  1222. params->ssids[i].ssid, params->ssids[i].ssid_len);
  1223. drv->probe_req_ssid_len = 0;
  1224. if (params->num_ssids) {
  1225. os_memcpy(drv->probe_req_ssid, params->ssids[0].ssid,
  1226. params->ssids[0].ssid_len);
  1227. drv->probe_req_ssid_len = params->ssids[0].ssid_len;
  1228. }
  1229. wpa_hexdump(MSG_DEBUG, "Scan extra IE(s)",
  1230. params->extra_ies, params->extra_ies_len);
  1231. drv->num_scanres = 0;
  1232. #ifdef DRIVER_TEST_UNIX
  1233. if (drv->test_socket >= 0 && drv->test_dir)
  1234. wpa_driver_scan_dir(drv, drv->test_dir);
  1235. if (drv->test_socket >= 0 && drv->hostapd_addr_set &&
  1236. sendto(drv->test_socket, "SCAN", 4, 0,
  1237. (struct sockaddr *) &drv->hostapd_addr,
  1238. sizeof(drv->hostapd_addr)) < 0) {
  1239. perror("sendto(test_socket)");
  1240. }
  1241. #endif /* DRIVER_TEST_UNIX */
  1242. if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set &&
  1243. sendto(drv->test_socket, "SCAN", 4, 0,
  1244. (struct sockaddr *) &drv->hostapd_addr_udp,
  1245. sizeof(drv->hostapd_addr_udp)) < 0) {
  1246. perror("sendto(test_socket)");
  1247. }
  1248. eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx);
  1249. eloop_register_timeout(1, 0, wpa_driver_test_scan_timeout, drv,
  1250. drv->ctx);
  1251. return 0;
  1252. }
  1253. static struct wpa_scan_results * wpa_driver_test_get_scan_results2(void *priv)
  1254. {
  1255. struct test_driver_bss *dbss = priv;
  1256. struct wpa_driver_test_data *drv = dbss->drv;
  1257. struct wpa_scan_results *res;
  1258. size_t i;
  1259. res = os_zalloc(sizeof(*res));
  1260. if (res == NULL)
  1261. return NULL;
  1262. res->res = os_zalloc(drv->num_scanres * sizeof(struct wpa_scan_res *));
  1263. if (res->res == NULL) {
  1264. os_free(res);
  1265. return NULL;
  1266. }
  1267. for (i = 0; i < drv->num_scanres; i++) {
  1268. struct wpa_scan_res *r;
  1269. if (drv->scanres[i] == NULL)
  1270. continue;
  1271. r = os_malloc(sizeof(*r) + drv->scanres[i]->ie_len);
  1272. if (r == NULL)
  1273. break;
  1274. os_memcpy(r, drv->scanres[i],
  1275. sizeof(*r) + drv->scanres[i]->ie_len);
  1276. res->res[res->num++] = r;
  1277. }
  1278. return res;
  1279. }
  1280. static int wpa_driver_test_set_key(const char *ifname, void *priv,
  1281. enum wpa_alg alg, const u8 *addr,
  1282. int key_idx, int set_tx,
  1283. const u8 *seq, size_t seq_len,
  1284. const u8 *key, size_t key_len)
  1285. {
  1286. wpa_printf(MSG_DEBUG, "%s: ifname=%s priv=%p alg=%d key_idx=%d "
  1287. "set_tx=%d",
  1288. __func__, ifname, priv, alg, key_idx, set_tx);
  1289. if (addr)
  1290. wpa_printf(MSG_DEBUG, " addr=" MACSTR, MAC2STR(addr));
  1291. if (seq)
  1292. wpa_hexdump(MSG_DEBUG, " seq", seq, seq_len);
  1293. if (key)
  1294. wpa_hexdump_key(MSG_DEBUG, " key", key, key_len);
  1295. return 0;
  1296. }
  1297. static int wpa_driver_update_mode(struct wpa_driver_test_data *drv, int ap)
  1298. {
  1299. if (ap && !drv->ap) {
  1300. wpa_driver_test_close_test_socket(drv);
  1301. wpa_driver_test_attach(drv, drv->test_dir, 1);
  1302. drv->ap = 1;
  1303. } else if (!ap && drv->ap) {
  1304. wpa_driver_test_close_test_socket(drv);
  1305. wpa_driver_test_attach(drv, drv->test_dir, 0);
  1306. drv->ap = 0;
  1307. }
  1308. return 0;
  1309. }
  1310. static int wpa_driver_test_associate(
  1311. void *priv, struct wpa_driver_associate_params *params)
  1312. {
  1313. struct test_driver_bss *dbss = priv;
  1314. struct wpa_driver_test_data *drv = dbss->drv;
  1315. wpa_printf(MSG_DEBUG, "%s: priv=%p freq=%d pairwise_suite=%d "
  1316. "group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",
  1317. __func__, priv, params->freq, params->pairwise_suite,
  1318. params->group_suite, params->key_mgmt_suite,
  1319. params->auth_alg, params->mode);
  1320. wpa_driver_update_mode(drv, params->mode == IEEE80211_MODE_AP);
  1321. if (params->bssid) {
  1322. wpa_printf(MSG_DEBUG, " bssid=" MACSTR,
  1323. MAC2STR(params->bssid));
  1324. }
  1325. if (params->ssid) {
  1326. wpa_hexdump_ascii(MSG_DEBUG, " ssid",
  1327. params->ssid, params->ssid_len);
  1328. }
  1329. if (params->wpa_ie) {
  1330. wpa_hexdump(MSG_DEBUG, " wpa_ie",
  1331. params->wpa_ie, params->wpa_ie_len);
  1332. drv->assoc_wpa_ie_len = params->wpa_ie_len;
  1333. if (drv->assoc_wpa_ie_len > sizeof(drv->assoc_wpa_ie))
  1334. drv->assoc_wpa_ie_len = sizeof(drv->assoc_wpa_ie);
  1335. os_memcpy(drv->assoc_wpa_ie, params->wpa_ie,
  1336. drv->assoc_wpa_ie_len);
  1337. } else
  1338. drv->assoc_wpa_ie_len = 0;
  1339. wpa_driver_update_mode(drv, params->mode == IEEE80211_MODE_AP);
  1340. drv->ibss = params->mode == IEEE80211_MODE_IBSS;
  1341. dbss->privacy = params->key_mgmt_suite &
  1342. (WPA_KEY_MGMT_IEEE8021X |
  1343. WPA_KEY_MGMT_PSK |
  1344. WPA_KEY_MGMT_WPA_NONE |
  1345. WPA_KEY_MGMT_FT_IEEE8021X |
  1346. WPA_KEY_MGMT_FT_PSK |
  1347. WPA_KEY_MGMT_IEEE8021X_SHA256 |
  1348. WPA_KEY_MGMT_PSK_SHA256);
  1349. if (params->wep_key_len[params->wep_tx_keyidx])
  1350. dbss->privacy = 1;
  1351. #ifdef DRIVER_TEST_UNIX
  1352. if (drv->test_dir && params->bssid &&
  1353. params->mode != IEEE80211_MODE_IBSS) {
  1354. os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr));
  1355. drv->hostapd_addr.sun_family = AF_UNIX;
  1356. os_snprintf(drv->hostapd_addr.sun_path,
  1357. sizeof(drv->hostapd_addr.sun_path),
  1358. "%s/AP-" MACSTR,
  1359. drv->test_dir, MAC2STR(params->bssid));
  1360. drv->hostapd_addr_set = 1;
  1361. }
  1362. #endif /* DRIVER_TEST_UNIX */
  1363. if (params->mode == IEEE80211_MODE_AP) {
  1364. os_memcpy(dbss->ssid, params->ssid, params->ssid_len);
  1365. dbss->ssid_len = params->ssid_len;
  1366. os_memcpy(dbss->bssid, drv->own_addr, ETH_ALEN);
  1367. if (params->wpa_ie && params->wpa_ie_len) {
  1368. dbss->ie = os_malloc(params->wpa_ie_len);
  1369. if (dbss->ie) {
  1370. os_memcpy(dbss->ie, params->wpa_ie,
  1371. params->wpa_ie_len);
  1372. dbss->ielen = params->wpa_ie_len;
  1373. }
  1374. }
  1375. } else if (drv->test_socket >= 0 &&
  1376. (drv->hostapd_addr_set || drv->hostapd_addr_udp_set)) {
  1377. char cmd[200], *pos, *end;
  1378. int ret;
  1379. end = cmd + sizeof(cmd);
  1380. pos = cmd;
  1381. ret = os_snprintf(pos, end - pos, "ASSOC " MACSTR " ",
  1382. MAC2STR(drv->own_addr));
  1383. if (ret >= 0 && ret < end - pos)
  1384. pos += ret;
  1385. pos += wpa_snprintf_hex(pos, end - pos, params->ssid,
  1386. params->ssid_len);
  1387. ret = os_snprintf(pos, end - pos, " ");
  1388. if (ret >= 0 && ret < end - pos)
  1389. pos += ret;
  1390. pos += wpa_snprintf_hex(pos, end - pos, params->wpa_ie,
  1391. params->wpa_ie_len);
  1392. end[-1] = '\0';
  1393. #ifdef DRIVER_TEST_UNIX
  1394. if (drv->hostapd_addr_set &&
  1395. sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
  1396. (struct sockaddr *) &drv->hostapd_addr,
  1397. sizeof(drv->hostapd_addr)) < 0) {
  1398. perror("sendto(test_socket)");
  1399. return -1;
  1400. }
  1401. #endif /* DRIVER_TEST_UNIX */
  1402. if (drv->hostapd_addr_udp_set &&
  1403. sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
  1404. (struct sockaddr *) &drv->hostapd_addr_udp,
  1405. sizeof(drv->hostapd_addr_udp)) < 0) {
  1406. perror("sendto(test_socket)");
  1407. return -1;
  1408. }
  1409. os_memcpy(dbss->ssid, params->ssid, params->ssid_len);
  1410. dbss->ssid_len = params->ssid_len;
  1411. } else {
  1412. drv->associated = 1;
  1413. if (params->mode == IEEE80211_MODE_IBSS) {
  1414. os_memcpy(dbss->ssid, params->ssid, params->ssid_len);
  1415. dbss->ssid_len = params->ssid_len;
  1416. if (params->bssid)
  1417. os_memcpy(dbss->bssid, params->bssid,
  1418. ETH_ALEN);
  1419. else {
  1420. os_get_random(dbss->bssid, ETH_ALEN);
  1421. dbss->bssid[0] &= ~0x01;
  1422. dbss->bssid[0] |= 0x02;
  1423. }
  1424. }
  1425. wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
  1426. }
  1427. return 0;
  1428. }
  1429. static int wpa_driver_test_get_bssid(void *priv, u8 *bssid)
  1430. {
  1431. struct test_driver_bss *dbss = priv;
  1432. os_memcpy(bssid, dbss->bssid, ETH_ALEN);
  1433. return 0;
  1434. }
  1435. static int wpa_driver_test_get_ssid(void *priv, u8 *ssid)
  1436. {
  1437. struct test_driver_bss *dbss = priv;
  1438. os_memcpy(ssid, dbss->ssid, 32);
  1439. return dbss->ssid_len;
  1440. }
  1441. static int wpa_driver_test_send_disassoc(struct wpa_driver_test_data *drv)
  1442. {
  1443. #ifdef DRIVER_TEST_UNIX
  1444. if (drv->test_socket >= 0 &&
  1445. sendto(drv->test_socket, "DISASSOC", 8, 0,
  1446. (struct sockaddr *) &drv->hostapd_addr,
  1447. sizeof(drv->hostapd_addr)) < 0) {
  1448. perror("sendto(test_socket)");
  1449. return -1;
  1450. }
  1451. #endif /* DRIVER_TEST_UNIX */
  1452. if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set &&
  1453. sendto(drv->test_socket, "DISASSOC", 8, 0,
  1454. (struct sockaddr *) &drv->hostapd_addr_udp,
  1455. sizeof(drv->hostapd_addr_udp)) < 0) {
  1456. perror("sendto(test_socket)");
  1457. return -1;
  1458. }
  1459. return 0;
  1460. }
  1461. static int wpa_driver_test_deauthenticate(void *priv, const u8 *addr,
  1462. int reason_code)
  1463. {
  1464. struct test_driver_bss *dbss = priv;
  1465. struct wpa_driver_test_data *drv = dbss->drv;
  1466. wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
  1467. __func__, MAC2STR(addr), reason_code);
  1468. os_memset(dbss->bssid, 0, ETH_ALEN);
  1469. drv->associated = 0;
  1470. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  1471. return wpa_driver_test_send_disassoc(drv);
  1472. }
  1473. static int wpa_driver_test_disassociate(void *priv, const u8 *addr,
  1474. int reason_code)
  1475. {
  1476. struct test_driver_bss *dbss = priv;
  1477. struct wpa_driver_test_data *drv = dbss->drv;
  1478. wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
  1479. __func__, MAC2STR(addr), reason_code);
  1480. os_memset(dbss->bssid, 0, ETH_ALEN);
  1481. drv->associated = 0;
  1482. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  1483. return wpa_driver_test_send_disassoc(drv);
  1484. }
  1485. static const u8 * wpa_scan_get_ie(const struct wpa_scan_res *res, u8 ie)
  1486. {
  1487. const u8 *end, *pos;
  1488. pos = (const u8 *) (res + 1);
  1489. end = pos + res->ie_len;
  1490. while (pos + 1 < end) {
  1491. if (pos + 2 + pos[1] > end)
  1492. break;
  1493. if (pos[0] == ie)
  1494. return pos;
  1495. pos += 2 + pos[1];
  1496. }
  1497. return NULL;
  1498. }
  1499. static void wpa_driver_test_scanresp(struct wpa_driver_test_data *drv,
  1500. struct sockaddr *from,
  1501. socklen_t fromlen,
  1502. const char *data)
  1503. {
  1504. struct wpa_scan_res *res;
  1505. const char *pos, *pos2;
  1506. size_t len;
  1507. u8 *ie_pos, *ie_start, *ie_end;
  1508. #define MAX_IE_LEN 1000
  1509. const u8 *ds_params;
  1510. wpa_printf(MSG_DEBUG, "test_driver: SCANRESP %s", data);
  1511. if (drv->num_scanres >= MAX_SCAN_RESULTS) {
  1512. wpa_printf(MSG_DEBUG, "test_driver: No room for the new scan "
  1513. "result");
  1514. return;
  1515. }
  1516. /* SCANRESP BSSID SSID IEs */
  1517. res = os_zalloc(sizeof(*res) + MAX_IE_LEN);
  1518. if (res == NULL)
  1519. return;
  1520. ie_start = ie_pos = (u8 *) (res + 1);
  1521. ie_end = ie_pos + MAX_IE_LEN;
  1522. if (hwaddr_aton(data, res->bssid)) {
  1523. wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in scanres");
  1524. os_free(res);
  1525. return;
  1526. }
  1527. pos = data + 17;
  1528. while (*pos == ' ')
  1529. pos++;
  1530. pos2 = os_strchr(pos, ' ');
  1531. if (pos2 == NULL) {
  1532. wpa_printf(MSG_DEBUG, "test_driver: invalid SSID termination "
  1533. "in scanres");
  1534. os_free(res);
  1535. return;
  1536. }
  1537. len = (pos2 - pos) / 2;
  1538. if (len > 32)
  1539. len = 32;
  1540. /*
  1541. * Generate SSID IE from the SSID field since this IE is not included
  1542. * in the main IE field.
  1543. */
  1544. *ie_pos++ = WLAN_EID_SSID;
  1545. *ie_pos++ = len;
  1546. if (hexstr2bin(pos, ie_pos, len) < 0) {
  1547. wpa_printf(MSG_DEBUG, "test_driver: invalid SSID in scanres");
  1548. os_free(res);
  1549. return;
  1550. }
  1551. ie_pos += len;
  1552. pos = pos2 + 1;
  1553. pos2 = os_strchr(pos, ' ');
  1554. if (pos2 == NULL)
  1555. len = os_strlen(pos) / 2;
  1556. else
  1557. len = (pos2 - pos) / 2;
  1558. if ((int) len > ie_end - ie_pos)
  1559. len = ie_end - ie_pos;
  1560. if (hexstr2bin(pos, ie_pos, len) < 0) {
  1561. wpa_printf(MSG_DEBUG, "test_driver: invalid IEs in scanres");
  1562. os_free(res);
  1563. return;
  1564. }
  1565. ie_pos += len;
  1566. res->ie_len = ie_pos - ie_start;
  1567. if (pos2) {
  1568. pos = pos2 + 1;
  1569. while (*pos == ' ')
  1570. pos++;
  1571. if (os_strstr(pos, "PRIVACY"))
  1572. res->caps |= IEEE80211_CAP_PRIVACY;
  1573. if (os_strstr(pos, "IBSS"))
  1574. res->caps |= IEEE80211_CAP_IBSS;
  1575. }
  1576. ds_params = wpa_scan_get_ie(res, WLAN_EID_DS_PARAMS);
  1577. if (ds_params && ds_params[1] > 0) {
  1578. if (ds_params[2] >= 1 && ds_params[2] <= 13)
  1579. res->freq = 2407 + ds_params[2] * 5;
  1580. }
  1581. os_free(drv->scanres[drv->num_scanres]);
  1582. drv->scanres[drv->num_scanres++] = res;
  1583. }
  1584. static void wpa_driver_test_assocresp(struct wpa_driver_test_data *drv,
  1585. struct sockaddr *from,
  1586. socklen_t fromlen,
  1587. const char *data)
  1588. {
  1589. struct test_driver_bss *bss;
  1590. bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
  1591. /* ASSOCRESP BSSID <res> */
  1592. if (hwaddr_aton(data, bss->bssid)) {
  1593. wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in "
  1594. "assocresp");
  1595. }
  1596. if (drv->use_associnfo) {
  1597. union wpa_event_data event;
  1598. os_memset(&event, 0, sizeof(event));
  1599. event.assoc_info.req_ies = drv->assoc_wpa_ie;
  1600. event.assoc_info.req_ies_len = drv->assoc_wpa_ie_len;
  1601. wpa_supplicant_event(drv->ctx, EVENT_ASSOCINFO, &event);
  1602. }
  1603. drv->associated = 1;
  1604. wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
  1605. }
  1606. static void wpa_driver_test_disassoc(struct wpa_driver_test_data *drv,
  1607. struct sockaddr *from,
  1608. socklen_t fromlen)
  1609. {
  1610. drv->associated = 0;
  1611. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  1612. }
  1613. static void wpa_driver_test_eapol(struct wpa_driver_test_data *drv,
  1614. struct sockaddr *from,
  1615. socklen_t fromlen,
  1616. const u8 *data, size_t data_len)
  1617. {
  1618. const u8 *src;
  1619. struct test_driver_bss *bss;
  1620. bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
  1621. if (data_len > 14) {
  1622. /* Skip Ethernet header */
  1623. src = data + ETH_ALEN;
  1624. data += 14;
  1625. data_len -= 14;
  1626. } else
  1627. src = bss->bssid;
  1628. drv_event_eapol_rx(drv->ctx, src, data, data_len);
  1629. }
  1630. static void wpa_driver_test_mlme(struct wpa_driver_test_data *drv,
  1631. struct sockaddr *from,
  1632. socklen_t fromlen,
  1633. const u8 *data, size_t data_len)
  1634. {
  1635. int freq = 0, own_freq;
  1636. union wpa_event_data event;
  1637. const struct ieee80211_mgmt *mgmt;
  1638. u16 fc;
  1639. struct test_driver_bss *bss;
  1640. bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
  1641. if (data_len > 6 && os_memcmp(data, "freq=", 5) == 0) {
  1642. size_t pos;
  1643. for (pos = 5; pos < data_len; pos++) {
  1644. if (data[pos] == ' ')
  1645. break;
  1646. }
  1647. if (pos < data_len) {
  1648. freq = atoi((const char *) &data[5]);
  1649. wpa_printf(MSG_DEBUG, "test_driver(%s): MLME RX on "
  1650. "freq %d MHz", bss->ifname, freq);
  1651. pos++;
  1652. data += pos;
  1653. data_len -= pos;
  1654. }
  1655. }
  1656. if (drv->remain_on_channel_freq)
  1657. own_freq = drv->remain_on_channel_freq;
  1658. else
  1659. own_freq = drv->current_freq;
  1660. if (freq && own_freq && freq != own_freq) {
  1661. wpa_printf(MSG_DEBUG, "test_driver(%s): Ignore MLME RX on "
  1662. "another frequency %d MHz (own %d MHz)",
  1663. bss->ifname, freq, own_freq);
  1664. return;
  1665. }
  1666. os_memset(&event, 0, sizeof(event));
  1667. event.mlme_rx.buf = data;
  1668. event.mlme_rx.len = data_len;
  1669. event.mlme_rx.freq = freq;
  1670. wpa_supplicant_event(drv->ctx, EVENT_MLME_RX, &event);
  1671. mgmt = (const struct ieee80211_mgmt *) data;
  1672. fc = le_to_host16(mgmt->frame_control);
  1673. if (drv->probe_req_report && data_len >= 24) {
  1674. if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
  1675. WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_PROBE_REQ) {
  1676. os_memset(&event, 0, sizeof(event));
  1677. event.rx_probe_req.sa = mgmt->sa;
  1678. event.rx_probe_req.da = mgmt->da;
  1679. event.rx_probe_req.bssid = mgmt->bssid;
  1680. event.rx_probe_req.ie = mgmt->u.probe_req.variable;
  1681. event.rx_probe_req.ie_len =
  1682. data_len - (mgmt->u.probe_req.variable - data);
  1683. wpa_supplicant_event(drv->ctx, EVENT_RX_PROBE_REQ,
  1684. &event);
  1685. #ifdef CONFIG_P2P
  1686. if (drv->p2p)
  1687. p2p_probe_req_rx(drv->p2p, mgmt->sa,
  1688. mgmt->da, mgmt->bssid,
  1689. event.rx_probe_req.ie,
  1690. event.rx_probe_req.ie_len);
  1691. #endif /* CONFIG_P2P */
  1692. }
  1693. }
  1694. #ifdef CONFIG_P2P
  1695. if (drv->p2p &&
  1696. WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
  1697. WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION) {
  1698. size_t hdr_len;
  1699. hdr_len = (const u8 *)
  1700. &mgmt->u.action.u.vs_public_action.action - data;
  1701. p2p_rx_action(drv->p2p, mgmt->da, mgmt->sa, mgmt->bssid,
  1702. mgmt->u.action.category,
  1703. &mgmt->u.action.u.vs_public_action.action,
  1704. data_len - hdr_len, freq);
  1705. }
  1706. #endif /* CONFIG_P2P */
  1707. }
  1708. static void wpa_driver_test_scan_cmd(struct wpa_driver_test_data *drv,
  1709. struct sockaddr *from,
  1710. socklen_t fromlen,
  1711. const u8 *data, size_t data_len)
  1712. {
  1713. char buf[512], *pos, *end;
  1714. int ret;
  1715. struct test_driver_bss *bss;
  1716. bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
  1717. /* data: optional [ STA-addr | ' ' | IEs(hex) ] */
  1718. #ifdef CONFIG_P2P
  1719. if (drv->probe_req_report && drv->p2p && data_len) {
  1720. const char *d = (const char *) data;
  1721. u8 sa[ETH_ALEN];
  1722. u8 ie[512];
  1723. size_t ielen;
  1724. if (hwaddr_aton(d, sa))
  1725. return;
  1726. d += 18;
  1727. while (*d == ' ')
  1728. d++;
  1729. ielen = os_strlen(d) / 2;
  1730. if (ielen > sizeof(ie))
  1731. ielen = sizeof(ie);
  1732. if (hexstr2bin(d, ie, ielen) < 0)
  1733. ielen = 0;
  1734. drv->probe_from = from;
  1735. drv->probe_from_len = fromlen;
  1736. p2p_probe_req_rx(drv->p2p, sa, NULL, NULL, ie, ielen);
  1737. drv->probe_from = NULL;
  1738. }
  1739. #endif /* CONFIG_P2P */
  1740. if (!drv->ibss)
  1741. return;
  1742. pos = buf;
  1743. end = buf + sizeof(buf);
  1744. /* reply: SCANRESP BSSID SSID IEs */
  1745. ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
  1746. MAC2STR(bss->bssid));
  1747. if (ret < 0 || ret >= end - pos)
  1748. return;
  1749. pos += ret;
  1750. pos += wpa_snprintf_hex(pos, end - pos,
  1751. bss->ssid, bss->ssid_len);
  1752. ret = snprintf(pos, end - pos, " ");
  1753. if (ret < 0 || ret >= end - pos)
  1754. return;
  1755. pos += ret;
  1756. pos += wpa_snprintf_hex(pos, end - pos, drv->assoc_wpa_ie,
  1757. drv->assoc_wpa_ie_len);
  1758. if (bss->privacy) {
  1759. ret = snprintf(pos, end - pos, " PRIVACY");
  1760. if (ret < 0 || ret >= end - pos)
  1761. return;
  1762. pos += ret;
  1763. }
  1764. ret = snprintf(pos, end - pos, " IBSS");
  1765. if (ret < 0 || ret >= end - pos)
  1766. return;
  1767. pos += ret;
  1768. sendto(drv->test_socket, buf, pos - buf, 0,
  1769. (struct sockaddr *) from, fromlen);
  1770. }
  1771. static void wpa_driver_test_receive_unix(int sock, void *eloop_ctx,
  1772. void *sock_ctx)
  1773. {
  1774. struct wpa_driver_test_data *drv = eloop_ctx;
  1775. char *buf;
  1776. int res;
  1777. struct sockaddr_storage from;
  1778. socklen_t fromlen = sizeof(from);
  1779. const size_t buflen = 2000;
  1780. if (drv->ap) {
  1781. test_driver_receive_unix(sock, eloop_ctx, sock_ctx);
  1782. return;
  1783. }
  1784. buf = os_malloc(buflen);
  1785. if (buf == NULL)
  1786. return;
  1787. res = recvfrom(sock, buf, buflen - 1, 0,
  1788. (struct sockaddr *) &from, &fromlen);
  1789. if (res < 0) {
  1790. perror("recvfrom(test_socket)");
  1791. os_free(buf);
  1792. return;
  1793. }
  1794. buf[res] = '\0';
  1795. wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res);
  1796. if (os_strncmp(buf, "SCANRESP ", 9) == 0) {
  1797. wpa_driver_test_scanresp(drv, (struct sockaddr *) &from,
  1798. fromlen, buf + 9);
  1799. } else if (os_strncmp(buf, "ASSOCRESP ", 10) == 0) {
  1800. wpa_driver_test_assocresp(drv, (struct sockaddr *) &from,
  1801. fromlen, buf + 10);
  1802. } else if (os_strcmp(buf, "DISASSOC") == 0) {
  1803. wpa_driver_test_disassoc(drv, (struct sockaddr *) &from,
  1804. fromlen);
  1805. } else if (os_strcmp(buf, "DEAUTH") == 0) {
  1806. wpa_driver_test_disassoc(drv, (struct sockaddr *) &from,
  1807. fromlen);
  1808. } else if (os_strncmp(buf, "EAPOL ", 6) == 0) {
  1809. wpa_driver_test_eapol(drv, (struct sockaddr *) &from, fromlen,
  1810. (const u8 *) buf + 6, res - 6);
  1811. } else if (os_strncmp(buf, "MLME ", 5) == 0) {
  1812. wpa_driver_test_mlme(drv, (struct sockaddr *) &from, fromlen,
  1813. (const u8 *) buf + 5, res - 5);
  1814. } else if (os_strncmp(buf, "SCAN ", 5) == 0) {
  1815. wpa_driver_test_scan_cmd(drv, (struct sockaddr *) &from,
  1816. fromlen,
  1817. (const u8 *) buf + 5, res - 5);
  1818. } else {
  1819. wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command",
  1820. (u8 *) buf, res);
  1821. }
  1822. os_free(buf);
  1823. }
  1824. static void * wpa_driver_test_init2(void *ctx, const char *ifname,
  1825. void *global_priv)
  1826. {
  1827. struct wpa_driver_test_data *drv;
  1828. struct wpa_driver_test_global *global = global_priv;
  1829. struct test_driver_bss *bss;
  1830. drv = test_alloc_data(ctx, ifname);
  1831. if (drv == NULL)
  1832. return NULL;
  1833. bss = dl_list_first(&drv->bss, struct test_driver_bss, list);
  1834. drv->global = global_priv;
  1835. drv->test_socket = -1;
  1836. /* Set dummy BSSID and SSID for testing. */
  1837. bss->bssid[0] = 0x02;
  1838. bss->bssid[1] = 0x00;
  1839. bss->bssid[2] = 0x00;
  1840. bss->bssid[3] = 0x00;
  1841. bss->bssid[4] = 0x00;
  1842. bss->bssid[5] = 0x01;
  1843. os_memcpy(bss->ssid, "test", 5);
  1844. bss->ssid_len = 4;
  1845. if (global->bss_add_used) {
  1846. os_memcpy(drv->own_addr, global->req_addr, ETH_ALEN);
  1847. global->bss_add_used = 0;
  1848. }
  1849. eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL);
  1850. return bss;
  1851. }
  1852. static void wpa_driver_test_close_test_socket(struct wpa_driver_test_data *drv)
  1853. {
  1854. if (drv->test_socket >= 0) {
  1855. eloop_unregister_read_sock(drv->test_socket);
  1856. close(drv->test_socket);
  1857. drv->test_socket = -1;
  1858. }
  1859. if (drv->own_socket_path) {
  1860. unlink(drv->own_socket_path);
  1861. os_free(drv->own_socket_path);
  1862. drv->own_socket_path = NULL;
  1863. }
  1864. }
  1865. static void wpa_driver_test_deinit(void *priv)
  1866. {
  1867. struct test_driver_bss *dbss = priv;
  1868. struct wpa_driver_test_data *drv = dbss->drv;
  1869. struct test_client_socket *cli, *prev;
  1870. int i;
  1871. #ifdef CONFIG_P2P
  1872. if (drv->p2p)
  1873. p2p_deinit(drv->p2p);
  1874. wpabuf_free(drv->pending_action_tx);
  1875. #endif /* CONFIG_P2P */
  1876. cli = drv->cli;
  1877. while (cli) {
  1878. prev = cli;
  1879. cli = cli->next;
  1880. os_free(prev);
  1881. }
  1882. #ifdef HOSTAPD
  1883. /* There should be only one BSS remaining at this point. */
  1884. if (dl_list_len(&drv->bss) != 1)
  1885. wpa_printf(MSG_ERROR, "%s: %u remaining BSS entries",
  1886. __func__, dl_list_len(&drv->bss));
  1887. #endif /* HOSTAPD */
  1888. test_driver_free_bsses(drv);
  1889. wpa_driver_test_close_test_socket(drv);
  1890. eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx);
  1891. eloop_cancel_timeout(wpa_driver_test_poll, drv, NULL);
  1892. eloop_cancel_timeout(test_remain_on_channel_timeout, drv, NULL);
  1893. os_free(drv->test_dir);
  1894. for (i = 0; i < MAX_SCAN_RESULTS; i++)
  1895. os_free(drv->scanres[i]);
  1896. os_free(drv->probe_req_ie);
  1897. wpa_trace_remove_ref(drv, ctx, drv->ctx);
  1898. os_free(drv);
  1899. }
  1900. static int wpa_driver_test_attach(struct wpa_driver_test_data *drv,
  1901. const char *dir, int ap)
  1902. {
  1903. #ifdef DRIVER_TEST_UNIX
  1904. static unsigned int counter = 0;
  1905. struct sockaddr_un addr;
  1906. size_t len;
  1907. os_free(drv->own_socket_path);
  1908. if (dir) {
  1909. len = os_strlen(dir) + 30;
  1910. drv->own_socket_path = os_malloc(len);
  1911. if (drv->own_socket_path == NULL)
  1912. return -1;
  1913. os_snprintf(drv->own_socket_path, len, "%s/%s-" MACSTR,
  1914. dir, ap ? "AP" : "STA", MAC2STR(drv->own_addr));
  1915. } else {
  1916. drv->own_socket_path = os_malloc(100);
  1917. if (drv->own_socket_path == NULL)
  1918. return -1;
  1919. os_snprintf(drv->own_socket_path, 100,
  1920. "/tmp/wpa_supplicant_test-%d-%d",
  1921. getpid(), counter++);
  1922. }
  1923. drv->test_socket = socket(PF_UNIX, SOCK_DGRAM, 0);
  1924. if (drv->test_socket < 0) {
  1925. perror("socket(PF_UNIX)");
  1926. os_free(drv->own_socket_path);
  1927. drv->own_socket_path = NULL;
  1928. return -1;
  1929. }
  1930. os_memset(&addr, 0, sizeof(addr));
  1931. addr.sun_family = AF_UNIX;
  1932. os_strlcpy(addr.sun_path, drv->own_socket_path, sizeof(addr.sun_path));
  1933. if (bind(drv->test_socket, (struct sockaddr *) &addr,
  1934. sizeof(addr)) < 0) {
  1935. perror("bind(PF_UNIX)");
  1936. close(drv->test_socket);
  1937. unlink(drv->own_socket_path);
  1938. os_free(drv->own_socket_path);
  1939. drv->own_socket_path = NULL;
  1940. return -1;
  1941. }
  1942. eloop_register_read_sock(drv->test_socket,
  1943. wpa_driver_test_receive_unix, drv, NULL);
  1944. return 0;
  1945. #else /* DRIVER_TEST_UNIX */
  1946. return -1;
  1947. #endif /* DRIVER_TEST_UNIX */
  1948. }
  1949. static int wpa_driver_test_attach_udp(struct wpa_driver_test_data *drv,
  1950. char *dst)
  1951. {
  1952. char *pos;
  1953. pos = os_strchr(dst, ':');
  1954. if (pos == NULL)
  1955. return -1;
  1956. *pos++ = '\0';
  1957. wpa_printf(MSG_DEBUG, "%s: addr=%s port=%s", __func__, dst, pos);
  1958. drv->test_socket = socket(PF_INET, SOCK_DGRAM, 0);
  1959. if (drv->test_socket < 0) {
  1960. perror("socket(PF_INET)");
  1961. return -1;
  1962. }
  1963. os_memset(&drv->hostapd_addr_udp, 0, sizeof(drv->hostapd_addr_udp));
  1964. drv->hostapd_addr_udp.sin_family = AF_INET;
  1965. #if defined(CONFIG_NATIVE_WINDOWS) || defined(CONFIG_ANSI_C_EXTRA)
  1966. {
  1967. int a[4];
  1968. u8 *pos;
  1969. sscanf(dst, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]);
  1970. pos = (u8 *) &drv->hostapd_addr_udp.sin_addr;
  1971. *pos++ = a[0];
  1972. *pos++ = a[1];
  1973. *pos++ = a[2];
  1974. *pos++ = a[3];
  1975. }
  1976. #else /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
  1977. inet_aton(dst, &drv->hostapd_addr_udp.sin_addr);
  1978. #endif /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
  1979. drv->hostapd_addr_udp.sin_port = htons(atoi(pos));
  1980. drv->hostapd_addr_udp_set = 1;
  1981. eloop_register_read_sock(drv->test_socket,
  1982. wpa_driver_test_receive_unix, drv, NULL);
  1983. return 0;
  1984. }
  1985. static int wpa_driver_test_set_param(void *priv, const char *param)
  1986. {
  1987. struct test_driver_bss *dbss = priv;
  1988. struct wpa_driver_test_data *drv = dbss->drv;
  1989. const char *pos;
  1990. wpa_printf(MSG_DEBUG, "%s: param='%s'", __func__, param);
  1991. if (param == NULL)
  1992. return 0;
  1993. wpa_driver_test_close_test_socket(drv);
  1994. #ifdef DRIVER_TEST_UNIX
  1995. pos = os_strstr(param, "test_socket=");
  1996. if (pos) {
  1997. const char *pos2;
  1998. size_t len;
  1999. pos += 12;
  2000. pos2 = os_strchr(pos, ' ');
  2001. if (pos2)
  2002. len = pos2 - pos;
  2003. else
  2004. len = os_strlen(pos);
  2005. if (len > sizeof(drv->hostapd_addr.sun_path))
  2006. return -1;
  2007. os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr));
  2008. drv->hostapd_addr.sun_family = AF_UNIX;
  2009. os_memcpy(drv->hostapd_addr.sun_path, pos, len);
  2010. drv->hostapd_addr_set = 1;
  2011. }
  2012. #endif /* DRIVER_TEST_UNIX */
  2013. pos = os_strstr(param, "test_dir=");
  2014. if (pos) {
  2015. char *end;
  2016. os_free(drv->test_dir);
  2017. drv->test_dir = os_strdup(pos + 9);
  2018. if (drv->test_dir == NULL)
  2019. return -1;
  2020. end = os_strchr(drv->test_dir, ' ');
  2021. if (end)
  2022. *end = '\0';
  2023. if (wpa_driver_test_attach(drv, drv->test_dir, 0))
  2024. return -1;
  2025. } else {
  2026. pos = os_strstr(param, "test_udp=");
  2027. if (pos) {
  2028. char *dst, *epos;
  2029. dst = os_strdup(pos + 9);
  2030. if (dst == NULL)
  2031. return -1;
  2032. epos = os_strchr(dst, ' ');
  2033. if (epos)
  2034. *epos = '\0';
  2035. if (wpa_driver_test_attach_udp(drv, dst))
  2036. return -1;
  2037. os_free(dst);
  2038. } else if (wpa_driver_test_attach(drv, NULL, 0))
  2039. return -1;
  2040. }
  2041. if (os_strstr(param, "use_associnfo=1")) {
  2042. wpa_printf(MSG_DEBUG, "test_driver: Use AssocInfo events");
  2043. drv->use_associnfo = 1;
  2044. }
  2045. #ifdef CONFIG_CLIENT_MLME
  2046. if (os_strstr(param, "use_mlme=1")) {
  2047. wpa_printf(MSG_DEBUG, "test_driver: Use internal MLME");
  2048. drv->use_mlme = 1;
  2049. }
  2050. #endif /* CONFIG_CLIENT_MLME */
  2051. if (os_strstr(param, "p2p_mgmt=1")) {
  2052. wpa_printf(MSG_DEBUG, "test_driver: Use internal P2P "
  2053. "management");
  2054. if (wpa_driver_test_init_p2p(drv) < 0)
  2055. return -1;
  2056. }
  2057. return 0;
  2058. }
  2059. static const u8 * wpa_driver_test_get_mac_addr(void *priv)
  2060. {
  2061. struct test_driver_bss *dbss = priv;
  2062. struct wpa_driver_test_data *drv = dbss->drv;
  2063. wpa_printf(MSG_DEBUG, "%s", __func__);
  2064. return drv->own_addr;
  2065. }
  2066. static int wpa_driver_test_send_eapol(void *priv, const u8 *dest, u16 proto,
  2067. const u8 *data, size_t data_len)
  2068. {
  2069. struct test_driver_bss *dbss = priv;
  2070. struct wpa_driver_test_data *drv = dbss->drv;
  2071. char *msg;
  2072. size_t msg_len;
  2073. struct l2_ethhdr eth;
  2074. struct sockaddr *addr;
  2075. socklen_t alen;
  2076. #ifdef DRIVER_TEST_UNIX
  2077. struct sockaddr_un addr_un;
  2078. #endif /* DRIVER_TEST_UNIX */
  2079. wpa_hexdump(MSG_MSGDUMP, "test_send_eapol TX frame", data, data_len);
  2080. os_memset(&eth, 0, sizeof(eth));
  2081. os_memcpy(eth.h_dest, dest, ETH_ALEN);
  2082. os_memcpy(eth.h_source, drv->own_addr, ETH_ALEN);
  2083. eth.h_proto = host_to_be16(proto);
  2084. msg_len = 6 + sizeof(eth) + data_len;
  2085. msg = os_malloc(msg_len);
  2086. if (msg == NULL)
  2087. return -1;
  2088. os_memcpy(msg, "EAPOL ", 6);
  2089. os_memcpy(msg + 6, &eth, sizeof(eth));
  2090. os_memcpy(msg + 6 + sizeof(eth), data, data_len);
  2091. if (os_memcmp(dest, dbss->bssid, ETH_ALEN) == 0 ||
  2092. drv->test_dir == NULL) {
  2093. if (drv->hostapd_addr_udp_set) {
  2094. addr = (struct sockaddr *) &drv->hostapd_addr_udp;
  2095. alen = sizeof(drv->hostapd_addr_udp);
  2096. } else {
  2097. #ifdef DRIVER_TEST_UNIX
  2098. addr = (struct sockaddr *) &drv->hostapd_addr;
  2099. alen = sizeof(drv->hostapd_addr);
  2100. #else /* DRIVER_TEST_UNIX */
  2101. os_free(msg);
  2102. return -1;
  2103. #endif /* DRIVER_TEST_UNIX */
  2104. }
  2105. } else {
  2106. #ifdef DRIVER_TEST_UNIX
  2107. struct stat st;
  2108. os_memset(&addr_un, 0, sizeof(addr_un));
  2109. addr_un.sun_family = AF_UNIX;
  2110. os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path),
  2111. "%s/STA-" MACSTR, drv->test_dir, MAC2STR(dest));
  2112. if (stat(addr_un.sun_path, &st) < 0) {
  2113. os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path),
  2114. "%s/AP-" MACSTR,
  2115. drv->test_dir, MAC2STR(dest));
  2116. }
  2117. addr = (struct sockaddr *) &addr_un;
  2118. alen = sizeof(addr_un);
  2119. #else /* DRIVER_TEST_UNIX */
  2120. os_free(msg);
  2121. return -1;
  2122. #endif /* DRIVER_TEST_UNIX */
  2123. }
  2124. if (sendto(drv->test_socket, msg, msg_len, 0, addr, alen) < 0) {
  2125. perror("sendmsg(test_socket)");
  2126. os_free(msg);
  2127. return -1;
  2128. }
  2129. os_free(msg);
  2130. return 0;
  2131. }
  2132. static int wpa_driver_test_get_capa(void *priv, struct wpa_driver_capa *capa)
  2133. {
  2134. struct test_driver_bss *dbss = priv;
  2135. struct wpa_driver_test_data *drv = dbss->drv;
  2136. os_memset(capa, 0, sizeof(*capa));
  2137. capa->key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA |
  2138. WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
  2139. WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
  2140. WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK |
  2141. WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE |
  2142. WPA_DRIVER_CAPA_KEY_MGMT_FT |
  2143. WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK;
  2144. capa->enc = WPA_DRIVER_CAPA_ENC_WEP40 |
  2145. WPA_DRIVER_CAPA_ENC_WEP104 |
  2146. WPA_DRIVER_CAPA_ENC_TKIP |
  2147. WPA_DRIVER_CAPA_ENC_CCMP;
  2148. capa->auth = WPA_DRIVER_AUTH_OPEN |
  2149. WPA_DRIVER_AUTH_SHARED |
  2150. WPA_DRIVER_AUTH_LEAP;
  2151. if (drv->use_mlme)
  2152. capa->flags |= WPA_DRIVER_FLAGS_USER_SPACE_MLME;
  2153. if (drv->p2p)
  2154. capa->flags |= WPA_DRIVER_FLAGS_P2P_MGMT;
  2155. capa->flags |= WPA_DRIVER_FLAGS_AP;
  2156. capa->flags |= WPA_DRIVER_FLAGS_P2P_CONCURRENT;
  2157. capa->flags |= WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE;
  2158. capa->flags |= WPA_DRIVER_FLAGS_P2P_CAPABLE;
  2159. capa->max_scan_ssids = 2;
  2160. capa->max_remain_on_chan = 60000;
  2161. return 0;
  2162. }
  2163. static int wpa_driver_test_mlme_setprotection(void *priv, const u8 *addr,
  2164. int protect_type,
  2165. int key_type)
  2166. {
  2167. wpa_printf(MSG_DEBUG, "%s: protect_type=%d key_type=%d",
  2168. __func__, protect_type, key_type);
  2169. if (addr) {
  2170. wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR,
  2171. __func__, MAC2STR(addr));
  2172. }
  2173. return 0;
  2174. }
  2175. static int wpa_driver_test_set_channel(void *priv,
  2176. enum hostapd_hw_mode phymode,
  2177. int chan, int freq)
  2178. {
  2179. struct test_driver_bss *dbss = priv;
  2180. struct wpa_driver_test_data *drv = dbss->drv;
  2181. wpa_printf(MSG_DEBUG, "%s: phymode=%d chan=%d freq=%d",
  2182. __func__, phymode, chan, freq);
  2183. drv->current_freq = freq;
  2184. return 0;
  2185. }
  2186. static int wpa_driver_test_mlme_add_sta(void *priv, const u8 *addr,
  2187. const u8 *supp_rates,
  2188. size_t supp_rates_len)
  2189. {
  2190. wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr));
  2191. return 0;
  2192. }
  2193. static int wpa_driver_test_mlme_remove_sta(void *priv, const u8 *addr)
  2194. {
  2195. wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr));
  2196. return 0;
  2197. }
  2198. static int wpa_driver_test_set_ssid(void *priv, const u8 *ssid,
  2199. size_t ssid_len)
  2200. {
  2201. wpa_printf(MSG_DEBUG, "%s", __func__);
  2202. return 0;
  2203. }
  2204. static int wpa_driver_test_set_bssid(void *priv, const u8 *bssid)
  2205. {
  2206. wpa_printf(MSG_DEBUG, "%s: bssid=" MACSTR, __func__, MAC2STR(bssid));
  2207. return 0;
  2208. }
  2209. static void * wpa_driver_test_global_init(void)
  2210. {
  2211. struct wpa_driver_test_global *global;
  2212. global = os_zalloc(sizeof(*global));
  2213. return global;
  2214. }
  2215. static void wpa_driver_test_global_deinit(void *priv)
  2216. {
  2217. struct wpa_driver_test_global *global = priv;
  2218. os_free(global);
  2219. }
  2220. static struct wpa_interface_info *
  2221. wpa_driver_test_get_interfaces(void *global_priv)
  2222. {
  2223. /* struct wpa_driver_test_global *global = priv; */
  2224. struct wpa_interface_info *iface;
  2225. iface = os_zalloc(sizeof(*iface));
  2226. if (iface == NULL)
  2227. return iface;
  2228. iface->ifname = os_strdup("sta0");
  2229. iface->desc = os_strdup("test interface 0");
  2230. iface->drv_name = "test";
  2231. iface->next = os_zalloc(sizeof(*iface));
  2232. if (iface->next) {
  2233. iface->next->ifname = os_strdup("sta1");
  2234. iface->next->desc = os_strdup("test interface 1");
  2235. iface->next->drv_name = "test";
  2236. }
  2237. return iface;
  2238. }
  2239. static struct hostapd_hw_modes *
  2240. wpa_driver_test_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
  2241. {
  2242. struct hostapd_hw_modes *modes;
  2243. size_t i;
  2244. *num_modes = 3;
  2245. *flags = 0;
  2246. modes = os_zalloc(*num_modes * sizeof(struct hostapd_hw_modes));
  2247. if (modes == NULL)
  2248. return NULL;
  2249. modes[0].mode = HOSTAPD_MODE_IEEE80211G;
  2250. modes[0].num_channels = 11;
  2251. modes[0].num_rates = 12;
  2252. modes[0].channels =
  2253. os_zalloc(11 * sizeof(struct hostapd_channel_data));
  2254. modes[0].rates = os_zalloc(modes[0].num_rates * sizeof(int));
  2255. if (modes[0].channels == NULL || modes[0].rates == NULL)
  2256. goto fail;
  2257. for (i = 0; i < 11; i++) {
  2258. modes[0].channels[i].chan = i + 1;
  2259. modes[0].channels[i].freq = 2412 + 5 * i;
  2260. modes[0].channels[i].flag = 0;
  2261. }
  2262. modes[0].rates[0] = 10;
  2263. modes[0].rates[1] = 20;
  2264. modes[0].rates[2] = 55;
  2265. modes[0].rates[3] = 110;
  2266. modes[0].rates[4] = 60;
  2267. modes[0].rates[5] = 90;
  2268. modes[0].rates[6] = 120;
  2269. modes[0].rates[7] = 180;
  2270. modes[0].rates[8] = 240;
  2271. modes[0].rates[9] = 360;
  2272. modes[0].rates[10] = 480;
  2273. modes[0].rates[11] = 540;
  2274. modes[1].mode = HOSTAPD_MODE_IEEE80211B;
  2275. modes[1].num_channels = 11;
  2276. modes[1].num_rates = 4;
  2277. modes[1].channels =
  2278. os_zalloc(11 * sizeof(struct hostapd_channel_data));
  2279. modes[1].rates = os_zalloc(modes[1].num_rates * sizeof(int));
  2280. if (modes[1].channels == NULL || modes[1].rates == NULL)
  2281. goto fail;
  2282. for (i = 0; i < 11; i++) {
  2283. modes[1].channels[i].chan = i + 1;
  2284. modes[1].channels[i].freq = 2412 + 5 * i;
  2285. modes[1].channels[i].flag = 0;
  2286. }
  2287. modes[1].rates[0] = 10;
  2288. modes[1].rates[1] = 20;
  2289. modes[1].rates[2] = 55;
  2290. modes[1].rates[3] = 110;
  2291. modes[2].mode = HOSTAPD_MODE_IEEE80211A;
  2292. modes[2].num_channels = 1;
  2293. modes[2].num_rates = 8;
  2294. modes[2].channels = os_zalloc(sizeof(struct hostapd_channel_data));
  2295. modes[2].rates = os_zalloc(modes[2].num_rates * sizeof(int));
  2296. if (modes[2].channels == NULL || modes[2].rates == NULL)
  2297. goto fail;
  2298. modes[2].channels[0].chan = 60;
  2299. modes[2].channels[0].freq = 5300;
  2300. modes[2].channels[0].flag = 0;
  2301. modes[2].rates[0] = 60;
  2302. modes[2].rates[1] = 90;
  2303. modes[2].rates[2] = 120;
  2304. modes[2].rates[3] = 180;
  2305. modes[2].rates[4] = 240;
  2306. modes[2].rates[5] = 360;
  2307. modes[2].rates[6] = 480;
  2308. modes[2].rates[7] = 540;
  2309. return modes;
  2310. fail:
  2311. if (modes) {
  2312. for (i = 0; i < *num_modes; i++) {
  2313. os_free(modes[i].channels);
  2314. os_free(modes[i].rates);
  2315. }
  2316. os_free(modes);
  2317. }
  2318. return NULL;
  2319. }
  2320. static int wpa_driver_test_set_freq(void *priv,
  2321. struct hostapd_freq_params *freq)
  2322. {
  2323. struct test_driver_bss *dbss = priv;
  2324. struct wpa_driver_test_data *drv = dbss->drv;
  2325. wpa_printf(MSG_DEBUG, "test: set_freq %u MHz", freq->freq);
  2326. drv->current_freq = freq->freq;
  2327. return 0;
  2328. }
  2329. static int wpa_driver_test_send_action(void *priv, unsigned int freq,
  2330. unsigned int wait,
  2331. const u8 *dst, const u8 *src,
  2332. const u8 *bssid,
  2333. const u8 *data, size_t data_len)
  2334. {
  2335. struct test_driver_bss *dbss = priv;
  2336. struct wpa_driver_test_data *drv = dbss->drv;
  2337. int ret = -1;
  2338. u8 *buf;
  2339. struct ieee80211_hdr *hdr;
  2340. wpa_printf(MSG_DEBUG, "test: Send Action frame");
  2341. if ((drv->remain_on_channel_freq &&
  2342. freq != drv->remain_on_channel_freq) ||
  2343. (drv->remain_on_channel_freq == 0 &&
  2344. freq != (unsigned int) drv->current_freq)) {
  2345. wpa_printf(MSG_DEBUG, "test: Reject Action frame TX on "
  2346. "unexpected channel: freq=%u MHz (current_freq=%u "
  2347. "MHz, remain-on-channel freq=%u MHz)",
  2348. freq, drv->current_freq,
  2349. drv->remain_on_channel_freq);
  2350. return -1;
  2351. }
  2352. buf = os_zalloc(24 + data_len);
  2353. if (buf == NULL)
  2354. return ret;
  2355. os_memcpy(buf + 24, data, data_len);
  2356. hdr = (struct ieee80211_hdr *) buf;
  2357. hdr->frame_control =
  2358. IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION);
  2359. os_memcpy(hdr->addr1, dst, ETH_ALEN);
  2360. os_memcpy(hdr->addr2, src, ETH_ALEN);
  2361. os_memcpy(hdr->addr3, bssid, ETH_ALEN);
  2362. ret = wpa_driver_test_send_mlme(priv, buf, 24 + data_len);
  2363. os_free(buf);
  2364. return ret;
  2365. }
  2366. #ifdef CONFIG_P2P
  2367. static void test_send_action_cb(void *eloop_ctx, void *timeout_ctx)
  2368. {
  2369. struct wpa_driver_test_data *drv = eloop_ctx;
  2370. int res;
  2371. if (drv->pending_action_tx == NULL)
  2372. return;
  2373. if (drv->off_channel_freq != drv->pending_action_freq) {
  2374. wpa_printf(MSG_DEBUG, "P2P: Pending Action frame TX "
  2375. "waiting for another freq=%u",
  2376. drv->pending_action_freq);
  2377. return;
  2378. }
  2379. wpa_printf(MSG_DEBUG, "P2P: Sending pending Action frame to "
  2380. MACSTR, MAC2STR(drv->pending_action_dst));
  2381. res = wpa_driver_test_send_action(drv, drv->pending_action_freq, 0,
  2382. drv->pending_action_dst,
  2383. drv->pending_action_src,
  2384. drv->pending_action_bssid,
  2385. wpabuf_head(drv->pending_action_tx),
  2386. wpabuf_len(drv->pending_action_tx));
  2387. }
  2388. #endif /* CONFIG_P2P */
  2389. static void test_remain_on_channel_timeout(void *eloop_ctx, void *timeout_ctx)
  2390. {
  2391. struct wpa_driver_test_data *drv = eloop_ctx;
  2392. union wpa_event_data data;
  2393. wpa_printf(MSG_DEBUG, "test: Remain-on-channel timeout");
  2394. os_memset(&data, 0, sizeof(data));
  2395. data.remain_on_channel.freq = drv->remain_on_channel_freq;
  2396. data.remain_on_channel.duration = drv->remain_on_channel_duration;
  2397. if (drv->p2p)
  2398. drv->off_channel_freq = 0;
  2399. drv->remain_on_channel_freq = 0;
  2400. wpa_supplicant_event(drv->ctx, EVENT_CANCEL_REMAIN_ON_CHANNEL, &data);
  2401. }
  2402. static int wpa_driver_test_remain_on_channel(void *priv, unsigned int freq,
  2403. unsigned int duration)
  2404. {
  2405. struct test_driver_bss *dbss = priv;
  2406. struct wpa_driver_test_data *drv = dbss->drv;
  2407. union wpa_event_data data;
  2408. wpa_printf(MSG_DEBUG, "%s(freq=%u, duration=%u)",
  2409. __func__, freq, duration);
  2410. if (drv->remain_on_channel_freq &&
  2411. drv->remain_on_channel_freq != freq) {
  2412. wpa_printf(MSG_DEBUG, "test: Refuse concurrent "
  2413. "remain_on_channel request");
  2414. return -1;
  2415. }
  2416. drv->remain_on_channel_freq = freq;
  2417. drv->remain_on_channel_duration = duration;
  2418. eloop_cancel_timeout(test_remain_on_channel_timeout, drv, NULL);
  2419. eloop_register_timeout(duration / 1000, (duration % 1000) * 1000,
  2420. test_remain_on_channel_timeout, drv, NULL);
  2421. os_memset(&data, 0, sizeof(data));
  2422. data.remain_on_channel.freq = freq;
  2423. data.remain_on_channel.duration = duration;
  2424. wpa_supplicant_event(drv->ctx, EVENT_REMAIN_ON_CHANNEL, &data);
  2425. #ifdef CONFIG_P2P
  2426. if (drv->p2p) {
  2427. drv->off_channel_freq = drv->remain_on_channel_freq;
  2428. test_send_action_cb(drv, NULL);
  2429. if (drv->off_channel_freq == drv->pending_listen_freq) {
  2430. p2p_listen_cb(drv->p2p, drv->pending_listen_freq,
  2431. drv->pending_listen_duration);
  2432. drv->pending_listen_freq = 0;
  2433. }
  2434. }
  2435. #endif /* CONFIG_P2P */
  2436. return 0;
  2437. }
  2438. static int wpa_driver_test_cancel_remain_on_channel(void *priv)
  2439. {
  2440. struct test_driver_bss *dbss = priv;
  2441. struct wpa_driver_test_data *drv = dbss->drv;
  2442. wpa_printf(MSG_DEBUG, "%s", __func__);
  2443. if (!drv->remain_on_channel_freq)
  2444. return -1;
  2445. drv->remain_on_channel_freq = 0;
  2446. eloop_cancel_timeout(test_remain_on_channel_timeout, drv, NULL);
  2447. return 0;
  2448. }
  2449. static int wpa_driver_test_probe_req_report(void *priv, int report)
  2450. {
  2451. struct test_driver_bss *dbss = priv;
  2452. struct wpa_driver_test_data *drv = dbss->drv;
  2453. wpa_printf(MSG_DEBUG, "%s(report=%d)", __func__, report);
  2454. drv->probe_req_report = report;
  2455. return 0;
  2456. }
  2457. #ifdef CONFIG_P2P
  2458. static int wpa_driver_test_p2p_find(void *priv, unsigned int timeout, int type)
  2459. {
  2460. struct wpa_driver_test_data *drv = priv;
  2461. wpa_printf(MSG_DEBUG, "%s(timeout=%u)", __func__, timeout);
  2462. if (!drv->p2p)
  2463. return -1;
  2464. return p2p_find(drv->p2p, timeout, type, 0, NULL);
  2465. }
  2466. static int wpa_driver_test_p2p_stop_find(void *priv)
  2467. {
  2468. struct wpa_driver_test_data *drv = priv;
  2469. wpa_printf(MSG_DEBUG, "%s", __func__);
  2470. if (!drv->p2p)
  2471. return -1;
  2472. p2p_stop_find(drv->p2p);
  2473. return 0;
  2474. }
  2475. static int wpa_driver_test_p2p_listen(void *priv, unsigned int timeout)
  2476. {
  2477. struct wpa_driver_test_data *drv = priv;
  2478. wpa_printf(MSG_DEBUG, "%s(timeout=%u)", __func__, timeout);
  2479. if (!drv->p2p)
  2480. return -1;
  2481. return p2p_listen(drv->p2p, timeout);
  2482. }
  2483. static int wpa_driver_test_p2p_connect(void *priv, const u8 *peer_addr,
  2484. int wps_method, int go_intent,
  2485. const u8 *own_interface_addr,
  2486. unsigned int force_freq,
  2487. int persistent_group)
  2488. {
  2489. struct wpa_driver_test_data *drv = priv;
  2490. wpa_printf(MSG_DEBUG, "%s(peer_addr=" MACSTR " wps_method=%d "
  2491. "go_intent=%d "
  2492. "own_interface_addr=" MACSTR " force_freq=%u "
  2493. "persistent_group=%d)",
  2494. __func__, MAC2STR(peer_addr), wps_method, go_intent,
  2495. MAC2STR(own_interface_addr), force_freq, persistent_group);
  2496. if (!drv->p2p)
  2497. return -1;
  2498. return p2p_connect(drv->p2p, peer_addr, wps_method, go_intent,
  2499. own_interface_addr, force_freq, persistent_group);
  2500. }
  2501. static int wpa_driver_test_wps_success_cb(void *priv, const u8 *peer_addr)
  2502. {
  2503. struct wpa_driver_test_data *drv = priv;
  2504. wpa_printf(MSG_DEBUG, "%s(peer_addr=" MACSTR ")",
  2505. __func__, MAC2STR(peer_addr));
  2506. if (!drv->p2p)
  2507. return -1;
  2508. p2p_wps_success_cb(drv->p2p, peer_addr);
  2509. return 0;
  2510. }
  2511. static int wpa_driver_test_p2p_group_formation_failed(void *priv)
  2512. {
  2513. struct wpa_driver_test_data *drv = priv;
  2514. wpa_printf(MSG_DEBUG, "%s", __func__);
  2515. if (!drv->p2p)
  2516. return -1;
  2517. p2p_group_formation_failed(drv->p2p);
  2518. return 0;
  2519. }
  2520. static int wpa_driver_test_p2p_set_params(void *priv,
  2521. const struct p2p_params *params)
  2522. {
  2523. struct wpa_driver_test_data *drv = priv;
  2524. wpa_printf(MSG_DEBUG, "%s", __func__);
  2525. if (!drv->p2p)
  2526. return -1;
  2527. if (p2p_set_dev_name(drv->p2p, params->dev_name) < 0 ||
  2528. p2p_set_pri_dev_type(drv->p2p, params->pri_dev_type) < 0 ||
  2529. p2p_set_sec_dev_types(drv->p2p, params->sec_dev_type,
  2530. params->num_sec_dev_types) < 0)
  2531. return -1;
  2532. return 0;
  2533. }
  2534. static int test_p2p_scan(void *ctx, enum p2p_scan_type type, int freq,
  2535. unsigned int num_req_dev_types,
  2536. const u8 *req_dev_types)
  2537. {
  2538. struct wpa_driver_test_data *drv = ctx;
  2539. struct wpa_driver_scan_params params;
  2540. int ret;
  2541. struct wpabuf *wps_ie, *ies;
  2542. int social_channels[] = { 2412, 2437, 2462, 0, 0 };
  2543. size_t ielen;
  2544. wpa_printf(MSG_DEBUG, "%s(type=%d freq=%d)",
  2545. __func__, type, freq);
  2546. os_memset(&params, 0, sizeof(params));
  2547. /* P2P Wildcard SSID */
  2548. params.num_ssids = 1;
  2549. params.ssids[0].ssid = (u8 *) P2P_WILDCARD_SSID;
  2550. params.ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN;
  2551. #if 0 /* TODO: WPS IE */
  2552. wpa_s->wps->dev.p2p = 1;
  2553. wps_ie = wps_build_probe_req_ie(0, &wpa_s->wps->dev, wpa_s->wps->uuid,
  2554. WPS_REQ_ENROLLEE);
  2555. #else
  2556. wps_ie = wpabuf_alloc(1);
  2557. #endif
  2558. if (wps_ie == NULL)
  2559. return -1;
  2560. ielen = p2p_scan_ie_buf_len(drv->p2p);
  2561. ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen);
  2562. if (ies == NULL) {
  2563. wpabuf_free(wps_ie);
  2564. return -1;
  2565. }
  2566. wpabuf_put_buf(ies, wps_ie);
  2567. wpabuf_free(wps_ie);
  2568. p2p_scan_ie(drv->p2p, ies);
  2569. params.extra_ies = wpabuf_head(ies);
  2570. params.extra_ies_len = wpabuf_len(ies);
  2571. switch (type) {
  2572. case P2P_SCAN_SOCIAL:
  2573. params.freqs = social_channels;
  2574. break;
  2575. case P2P_SCAN_FULL:
  2576. break;
  2577. case P2P_SCAN_SPECIFIC:
  2578. social_channels[0] = freq;
  2579. social_channels[1] = 0;
  2580. params.freqs = social_channels;
  2581. break;
  2582. case P2P_SCAN_SOCIAL_PLUS_ONE:
  2583. social_channels[3] = freq;
  2584. params.freqs = social_channels;
  2585. break;
  2586. }
  2587. drv->pending_p2p_scan = 1;
  2588. ret = wpa_driver_test_scan(drv, &params);
  2589. wpabuf_free(ies);
  2590. return ret;
  2591. }
  2592. static int test_send_action(void *ctx, unsigned int freq, const u8 *dst,
  2593. const u8 *src, const u8 *bssid, const u8 *buf,
  2594. size_t len, unsigned int wait_time)
  2595. {
  2596. struct wpa_driver_test_data *drv = ctx;
  2597. wpa_printf(MSG_DEBUG, "%s(freq=%u dst=" MACSTR " src=" MACSTR
  2598. " bssid=" MACSTR " len=%d",
  2599. __func__, freq, MAC2STR(dst), MAC2STR(src), MAC2STR(bssid),
  2600. (int) len);
  2601. if (freq <= 0) {
  2602. wpa_printf(MSG_WARNING, "P2P: No frequency specified for "
  2603. "action frame TX");
  2604. return -1;
  2605. }
  2606. if (drv->pending_action_tx) {
  2607. wpa_printf(MSG_DEBUG, "P2P: Dropped pending Action frame TX "
  2608. "to " MACSTR, MAC2STR(drv->pending_action_dst));
  2609. wpabuf_free(drv->pending_action_tx);
  2610. }
  2611. drv->pending_action_tx = wpabuf_alloc(len);
  2612. if (drv->pending_action_tx == NULL)
  2613. return -1;
  2614. wpabuf_put_data(drv->pending_action_tx, buf, len);
  2615. os_memcpy(drv->pending_action_src, src, ETH_ALEN);
  2616. os_memcpy(drv->pending_action_dst, dst, ETH_ALEN);
  2617. os_memcpy(drv->pending_action_bssid, bssid, ETH_ALEN);
  2618. drv->pending_action_freq = freq;
  2619. if (drv->off_channel_freq == freq) {
  2620. /* Already on requested channel; send immediately */
  2621. /* TODO: Would there ever be need to extend the current
  2622. * duration on the channel? */
  2623. eloop_cancel_timeout(test_send_action_cb, drv, NULL);
  2624. eloop_register_timeout(0, 0, test_send_action_cb, drv, NULL);
  2625. return 0;
  2626. }
  2627. wpa_printf(MSG_DEBUG, "P2P: Schedule Action frame to be transmitted "
  2628. "once the driver gets to the requested channel");
  2629. if (wpa_driver_test_remain_on_channel(drv, freq, wait_time) < 0) {
  2630. wpa_printf(MSG_DEBUG, "P2P: Failed to request driver "
  2631. "to remain on channel (%u MHz) for Action "
  2632. "Frame TX", freq);
  2633. return -1;
  2634. }
  2635. return 0;
  2636. }
  2637. static void test_send_action_done(void *ctx)
  2638. {
  2639. wpa_printf(MSG_DEBUG, "%s", __func__);
  2640. /* TODO */
  2641. }
  2642. static void test_go_neg_completed(void *ctx, struct p2p_go_neg_results *res)
  2643. {
  2644. struct wpa_driver_test_data *drv = ctx;
  2645. union wpa_event_data event;
  2646. wpa_printf(MSG_DEBUG, "%s", __func__);
  2647. os_memset(&event, 0, sizeof(event));
  2648. event.p2p_go_neg_completed.res = res;
  2649. wpa_supplicant_event(drv->ctx, EVENT_P2P_GO_NEG_COMPLETED, &event);
  2650. }
  2651. static void test_go_neg_req_rx(void *ctx, const u8 *src, u16 dev_passwd_id)
  2652. {
  2653. struct wpa_driver_test_data *drv = ctx;
  2654. union wpa_event_data event;
  2655. wpa_printf(MSG_DEBUG, "%s(src=" MACSTR ")", __func__, MAC2STR(src));
  2656. os_memset(&event, 0, sizeof(event));
  2657. event.p2p_go_neg_req_rx.src = src;
  2658. event.p2p_go_neg_req_rx.dev_passwd_id = dev_passwd_id;
  2659. wpa_supplicant_event(drv->ctx, EVENT_P2P_GO_NEG_REQ_RX, &event);
  2660. }
  2661. static void test_dev_found(void *ctx, const u8 *addr,
  2662. const struct p2p_peer_info *info, int new_device)
  2663. {
  2664. struct wpa_driver_test_data *drv = ctx;
  2665. union wpa_event_data event;
  2666. char devtype[WPS_DEV_TYPE_BUFSIZE];
  2667. wpa_printf(MSG_DEBUG, "%s(" MACSTR " p2p_dev_addr=" MACSTR
  2668. " pri_dev_type=%s name='%s' config_methods=0x%x "
  2669. "dev_capab=0x%x group_capab=0x%x)",
  2670. __func__, MAC2STR(addr), MAC2STR(info->p2p_device_addr),
  2671. wps_dev_type_bin2str(info->pri_dev_type, devtype,
  2672. sizeof(devtype)),
  2673. info->device_name, info->config_methods, info->dev_capab,
  2674. info->group_capab);
  2675. os_memset(&event, 0, sizeof(event));
  2676. event.p2p_dev_found.addr = addr;
  2677. event.p2p_dev_found.dev_addr = info->p2p_device_addr;
  2678. event.p2p_dev_found.pri_dev_type = info->pri_dev_type;
  2679. event.p2p_dev_found.dev_name = info->device_name;
  2680. event.p2p_dev_found.config_methods = info->config_methods;
  2681. event.p2p_dev_found.dev_capab = info->dev_capab;
  2682. event.p2p_dev_found.group_capab = info->group_capab;
  2683. wpa_supplicant_event(drv->ctx, EVENT_P2P_DEV_FOUND, &event);
  2684. }
  2685. static int test_start_listen(void *ctx, unsigned int freq,
  2686. unsigned int duration,
  2687. const struct wpabuf *probe_resp_ie)
  2688. {
  2689. struct wpa_driver_test_data *drv = ctx;
  2690. wpa_printf(MSG_DEBUG, "%s(freq=%u duration=%u)",
  2691. __func__, freq, duration);
  2692. if (wpa_driver_test_probe_req_report(drv, 1) < 0)
  2693. return -1;
  2694. drv->pending_listen_freq = freq;
  2695. drv->pending_listen_duration = duration;
  2696. if (wpa_driver_test_remain_on_channel(drv, freq, duration) < 0) {
  2697. drv->pending_listen_freq = 0;
  2698. return -1;
  2699. }
  2700. return 0;
  2701. }
  2702. static void test_stop_listen(void *ctx)
  2703. {
  2704. wpa_printf(MSG_DEBUG, "%s", __func__);
  2705. /* TODO */
  2706. }
  2707. static int test_send_probe_resp(void *ctx, const struct wpabuf *buf)
  2708. {
  2709. struct wpa_driver_test_data *drv = ctx;
  2710. char resp[512], *pos, *end;
  2711. int ret;
  2712. const struct ieee80211_mgmt *mgmt;
  2713. const u8 *ie, *ie_end;
  2714. wpa_printf(MSG_DEBUG, "%s", __func__);
  2715. wpa_hexdump_buf(MSG_MSGDUMP, "Probe Response", buf);
  2716. if (wpabuf_len(buf) < 24)
  2717. return -1;
  2718. if (!drv->probe_from) {
  2719. wpa_printf(MSG_DEBUG, "%s: probe_from not set", __func__);
  2720. return -1;
  2721. }
  2722. pos = resp;
  2723. end = resp + sizeof(resp);
  2724. mgmt = wpabuf_head(buf);
  2725. /* reply: SCANRESP BSSID SSID IEs */
  2726. ret = os_snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
  2727. MAC2STR(mgmt->bssid));
  2728. if (ret < 0 || ret >= end - pos)
  2729. return -1;
  2730. pos += ret;
  2731. ie = mgmt->u.probe_resp.variable;
  2732. ie_end = wpabuf_head_u8(buf) + wpabuf_len(buf);
  2733. if (ie_end - ie < 2 || ie[0] != WLAN_EID_SSID ||
  2734. ie + 2 + ie[1] > ie_end)
  2735. return -1;
  2736. pos += wpa_snprintf_hex(pos, end - pos, ie + 2, ie[1]);
  2737. ret = os_snprintf(pos, end - pos, " ");
  2738. if (ret < 0 || ret >= end - pos)
  2739. return -1;
  2740. pos += ret;
  2741. pos += wpa_snprintf_hex(pos, end - pos, ie, ie_end - ie);
  2742. sendto(drv->test_socket, resp, pos - resp, 0,
  2743. drv->probe_from, drv->probe_from_len);
  2744. return 0;
  2745. }
  2746. static void test_sd_request(void *ctx, int freq, const u8 *sa, u8 dialog_token,
  2747. u16 update_indic, const u8 *tlvs, size_t tlvs_len)
  2748. {
  2749. wpa_printf(MSG_DEBUG, "%s", __func__);
  2750. /* TODO */
  2751. }
  2752. static void test_sd_response(void *ctx, const u8 *sa, u16 update_indic,
  2753. const u8 *tlvs, size_t tlvs_len)
  2754. {
  2755. wpa_printf(MSG_DEBUG, "%s", __func__);
  2756. /* TODO */
  2757. }
  2758. static void test_prov_disc_req(void *ctx, const u8 *peer, u16 config_methods,
  2759. const u8 *dev_addr, const u8 *pri_dev_type,
  2760. const char *dev_name, u16 supp_config_methods,
  2761. u8 dev_capab, u8 group_capab)
  2762. {
  2763. wpa_printf(MSG_DEBUG, "%s(peer=" MACSTR " config_methods=0x%x)",
  2764. __func__, MAC2STR(peer), config_methods);
  2765. /* TODO */
  2766. }
  2767. static void test_prov_disc_resp(void *ctx, const u8 *peer, u16 config_methods)
  2768. {
  2769. wpa_printf(MSG_DEBUG, "%s(peer=" MACSTR " config_methods=0x%x)",
  2770. __func__, MAC2STR(peer), config_methods);
  2771. /* TODO */
  2772. }
  2773. #endif /* CONFIG_P2P */
  2774. static int wpa_driver_test_init_p2p(struct wpa_driver_test_data *drv)
  2775. {
  2776. #ifdef CONFIG_P2P
  2777. struct p2p_config p2p;
  2778. unsigned int r;
  2779. int i;
  2780. os_memset(&p2p, 0, sizeof(p2p));
  2781. p2p.msg_ctx = drv->ctx;
  2782. p2p.cb_ctx = drv;
  2783. p2p.p2p_scan = test_p2p_scan;
  2784. p2p.send_action = test_send_action;
  2785. p2p.send_action_done = test_send_action_done;
  2786. p2p.go_neg_completed = test_go_neg_completed;
  2787. p2p.go_neg_req_rx = test_go_neg_req_rx;
  2788. p2p.dev_found = test_dev_found;
  2789. p2p.start_listen = test_start_listen;
  2790. p2p.stop_listen = test_stop_listen;
  2791. p2p.send_probe_resp = test_send_probe_resp;
  2792. p2p.sd_request = test_sd_request;
  2793. p2p.sd_response = test_sd_response;
  2794. p2p.prov_disc_req = test_prov_disc_req;
  2795. p2p.prov_disc_resp = test_prov_disc_resp;
  2796. os_memcpy(p2p.dev_addr, drv->own_addr, ETH_ALEN);
  2797. p2p.reg_class = 12; /* TODO: change depending on location */
  2798. /*
  2799. * Pick one of the social channels randomly as the listen
  2800. * channel.
  2801. */
  2802. os_get_random((u8 *) &r, sizeof(r));
  2803. p2p.channel = 1 + (r % 3) * 5;
  2804. /* TODO: change depending on location */
  2805. p2p.op_reg_class = 12;
  2806. /*
  2807. * For initial tests, pick the operation channel randomly.
  2808. * TODO: Use scan results (etc.) to select the best channel.
  2809. */
  2810. p2p.op_channel = 1 + r % 11;
  2811. os_memcpy(p2p.country, "US ", 3);
  2812. /* FIX: fetch available channels from the driver */
  2813. p2p.channels.reg_classes = 1;
  2814. p2p.channels.reg_class[0].reg_class = 12; /* US/12 = 2.4 GHz band */
  2815. p2p.channels.reg_class[0].channels = 11;
  2816. for (i = 0; i < 11; i++)
  2817. p2p.channels.reg_class[0].channel[i] = i + 1;
  2818. p2p.max_peers = 100;
  2819. drv->p2p = p2p_init(&p2p);
  2820. if (drv->p2p == NULL)
  2821. return -1;
  2822. return 0;
  2823. #else /* CONFIG_P2P */
  2824. wpa_printf(MSG_INFO, "driver_test: P2P support not included");
  2825. return -1;
  2826. #endif /* CONFIG_P2P */
  2827. }
  2828. const struct wpa_driver_ops wpa_driver_test_ops = {
  2829. "test",
  2830. "wpa_supplicant test driver",
  2831. .hapd_init = test_driver_init,
  2832. .hapd_deinit = wpa_driver_test_deinit,
  2833. .hapd_send_eapol = test_driver_send_eapol,
  2834. .send_mlme = wpa_driver_test_send_mlme,
  2835. .set_generic_elem = test_driver_set_generic_elem,
  2836. .sta_deauth = test_driver_sta_deauth,
  2837. .sta_disassoc = test_driver_sta_disassoc,
  2838. .get_hw_feature_data = wpa_driver_test_get_hw_feature_data,
  2839. .if_add = test_driver_if_add,
  2840. .if_remove = test_driver_if_remove,
  2841. .valid_bss_mask = test_driver_valid_bss_mask,
  2842. .hapd_set_ssid = test_driver_set_ssid,
  2843. .set_privacy = test_driver_set_privacy,
  2844. .set_sta_vlan = test_driver_set_sta_vlan,
  2845. .sta_add = test_driver_sta_add,
  2846. .send_ether = test_driver_send_ether,
  2847. .set_ap_wps_ie = test_driver_set_ap_wps_ie,
  2848. .get_bssid = wpa_driver_test_get_bssid,
  2849. .get_ssid = wpa_driver_test_get_ssid,
  2850. .set_key = wpa_driver_test_set_key,
  2851. .deinit = wpa_driver_test_deinit,
  2852. .set_param = wpa_driver_test_set_param,
  2853. .deauthenticate = wpa_driver_test_deauthenticate,
  2854. .disassociate = wpa_driver_test_disassociate,
  2855. .associate = wpa_driver_test_associate,
  2856. .get_capa = wpa_driver_test_get_capa,
  2857. .get_mac_addr = wpa_driver_test_get_mac_addr,
  2858. .send_eapol = wpa_driver_test_send_eapol,
  2859. .mlme_setprotection = wpa_driver_test_mlme_setprotection,
  2860. .set_channel = wpa_driver_test_set_channel,
  2861. .set_ssid = wpa_driver_test_set_ssid,
  2862. .set_bssid = wpa_driver_test_set_bssid,
  2863. .mlme_add_sta = wpa_driver_test_mlme_add_sta,
  2864. .mlme_remove_sta = wpa_driver_test_mlme_remove_sta,
  2865. .get_scan_results2 = wpa_driver_test_get_scan_results2,
  2866. .global_init = wpa_driver_test_global_init,
  2867. .global_deinit = wpa_driver_test_global_deinit,
  2868. .init2 = wpa_driver_test_init2,
  2869. .get_interfaces = wpa_driver_test_get_interfaces,
  2870. .scan2 = wpa_driver_test_scan,
  2871. .set_freq = wpa_driver_test_set_freq,
  2872. .send_action = wpa_driver_test_send_action,
  2873. .remain_on_channel = wpa_driver_test_remain_on_channel,
  2874. .cancel_remain_on_channel = wpa_driver_test_cancel_remain_on_channel,
  2875. .probe_req_report = wpa_driver_test_probe_req_report,
  2876. #ifdef CONFIG_P2P
  2877. .p2p_find = wpa_driver_test_p2p_find,
  2878. .p2p_stop_find = wpa_driver_test_p2p_stop_find,
  2879. .p2p_listen = wpa_driver_test_p2p_listen,
  2880. .p2p_connect = wpa_driver_test_p2p_connect,
  2881. .wps_success_cb = wpa_driver_test_wps_success_cb,
  2882. .p2p_group_formation_failed =
  2883. wpa_driver_test_p2p_group_formation_failed,
  2884. .p2p_set_params = wpa_driver_test_p2p_set_params,
  2885. #endif /* CONFIG_P2P */
  2886. };