driver_test.c 86 KB

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