driver_test.c 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572
  1. /*
  2. * WPA Supplicant - testing driver interface
  3. * Copyright (c) 2004-2008, 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 "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 "common.h"
  27. #include "driver.h"
  28. #include "l2_packet/l2_packet.h"
  29. #include "eloop.h"
  30. #include "sha1.h"
  31. #include "ieee802_11_defs.h"
  32. #ifdef HOSTAPD
  33. #include "../../hostapd/hostapd.h"
  34. #include "../../hostapd/wpa.h"
  35. #include "../../hostapd/hw_features.h"
  36. #include "../../hostapd/wps_hostapd.h"
  37. struct test_client_socket {
  38. struct test_client_socket *next;
  39. u8 addr[ETH_ALEN];
  40. struct sockaddr_un un;
  41. socklen_t unlen;
  42. struct test_driver_bss *bss;
  43. };
  44. struct test_driver_bss {
  45. struct test_driver_bss *next;
  46. char ifname[IFNAMSIZ + 1];
  47. u8 bssid[ETH_ALEN];
  48. u8 *ie;
  49. size_t ielen;
  50. u8 *wps_beacon_ie;
  51. size_t wps_beacon_ie_len;
  52. u8 *wps_probe_resp_ie;
  53. size_t wps_probe_resp_ie_len;
  54. u8 ssid[32];
  55. size_t ssid_len;
  56. int privacy;
  57. };
  58. struct test_driver_data {
  59. struct hostapd_data *hapd;
  60. struct test_client_socket *cli;
  61. int test_socket;
  62. struct test_driver_bss *bss;
  63. char *socket_dir;
  64. char *own_socket_path;
  65. int udp_port;
  66. };
  67. #else /* HOSTAPD */
  68. struct wpa_driver_test_global {
  69. int dummy;
  70. };
  71. struct wpa_driver_test_data {
  72. struct wpa_driver_test_global *global;
  73. void *ctx;
  74. u8 own_addr[ETH_ALEN];
  75. int test_socket;
  76. #ifdef DRIVER_TEST_UNIX
  77. struct sockaddr_un hostapd_addr;
  78. #endif /* DRIVER_TEST_UNIX */
  79. int hostapd_addr_set;
  80. struct sockaddr_in hostapd_addr_udp;
  81. int hostapd_addr_udp_set;
  82. char *own_socket_path;
  83. char *test_dir;
  84. u8 bssid[ETH_ALEN];
  85. u8 ssid[32];
  86. size_t ssid_len;
  87. #define MAX_SCAN_RESULTS 30
  88. struct wpa_scan_res *scanres[MAX_SCAN_RESULTS];
  89. size_t num_scanres;
  90. int use_associnfo;
  91. u8 assoc_wpa_ie[80];
  92. size_t assoc_wpa_ie_len;
  93. int use_mlme;
  94. int associated;
  95. u8 *probe_req_ie;
  96. size_t probe_req_ie_len;
  97. int ibss;
  98. int privacy;
  99. };
  100. #endif /* HOSTAPD */
  101. #ifdef HOSTAPD
  102. static void test_driver_free_bss(struct test_driver_bss *bss)
  103. {
  104. free(bss->ie);
  105. free(bss->wps_beacon_ie);
  106. free(bss->wps_probe_resp_ie);
  107. free(bss);
  108. }
  109. static void test_driver_free_priv(struct test_driver_data *drv)
  110. {
  111. struct test_driver_bss *bss, *prev;
  112. if (drv == NULL)
  113. return;
  114. bss = drv->bss;
  115. while (bss) {
  116. prev = bss;
  117. bss = bss->next;
  118. test_driver_free_bss(prev);
  119. }
  120. free(drv->own_socket_path);
  121. free(drv->socket_dir);
  122. free(drv);
  123. }
  124. static struct test_client_socket *
  125. test_driver_get_cli(struct test_driver_data *drv, struct sockaddr_un *from,
  126. socklen_t fromlen)
  127. {
  128. struct test_client_socket *cli = drv->cli;
  129. while (cli) {
  130. if (cli->unlen == fromlen &&
  131. strncmp(cli->un.sun_path, from->sun_path,
  132. fromlen - sizeof(cli->un.sun_family)) == 0)
  133. return cli;
  134. cli = cli->next;
  135. }
  136. return NULL;
  137. }
  138. static int test_driver_send_eapol(void *priv, const u8 *addr, const u8 *data,
  139. size_t data_len, int encrypt,
  140. const u8 *own_addr)
  141. {
  142. struct test_driver_data *drv = priv;
  143. struct test_client_socket *cli;
  144. struct msghdr msg;
  145. struct iovec io[3];
  146. struct l2_ethhdr eth;
  147. if (drv->test_socket < 0)
  148. return -1;
  149. cli = drv->cli;
  150. while (cli) {
  151. if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
  152. break;
  153. cli = cli->next;
  154. }
  155. if (!cli) {
  156. wpa_printf(MSG_DEBUG, "%s: no destination client entry",
  157. __func__);
  158. return -1;
  159. }
  160. memcpy(eth.h_dest, addr, ETH_ALEN);
  161. memcpy(eth.h_source, own_addr, ETH_ALEN);
  162. eth.h_proto = host_to_be16(ETH_P_EAPOL);
  163. io[0].iov_base = "EAPOL ";
  164. io[0].iov_len = 6;
  165. io[1].iov_base = &eth;
  166. io[1].iov_len = sizeof(eth);
  167. io[2].iov_base = (u8 *) data;
  168. io[2].iov_len = data_len;
  169. memset(&msg, 0, sizeof(msg));
  170. msg.msg_iov = io;
  171. msg.msg_iovlen = 3;
  172. msg.msg_name = &cli->un;
  173. msg.msg_namelen = cli->unlen;
  174. return sendmsg(drv->test_socket, &msg, 0);
  175. }
  176. static int test_driver_send_ether(void *priv, const u8 *dst, const u8 *src,
  177. u16 proto, const u8 *data, size_t data_len)
  178. {
  179. struct test_driver_data *drv = priv;
  180. struct msghdr msg;
  181. struct iovec io[3];
  182. struct l2_ethhdr eth;
  183. char desttxt[30];
  184. struct sockaddr_un addr;
  185. struct dirent *dent;
  186. DIR *dir;
  187. int ret = 0, broadcast = 0, count = 0;
  188. if (drv->test_socket < 0 || drv->socket_dir == NULL) {
  189. wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d "
  190. "socket_dir=%p)",
  191. __func__, drv->test_socket, drv->socket_dir);
  192. return -1;
  193. }
  194. broadcast = memcmp(dst, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0;
  195. snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dst));
  196. memcpy(eth.h_dest, dst, ETH_ALEN);
  197. memcpy(eth.h_source, src, ETH_ALEN);
  198. eth.h_proto = host_to_be16(proto);
  199. io[0].iov_base = "ETHER ";
  200. io[0].iov_len = 6;
  201. io[1].iov_base = &eth;
  202. io[1].iov_len = sizeof(eth);
  203. io[2].iov_base = (u8 *) data;
  204. io[2].iov_len = data_len;
  205. memset(&msg, 0, sizeof(msg));
  206. msg.msg_iov = io;
  207. msg.msg_iovlen = 3;
  208. dir = opendir(drv->socket_dir);
  209. if (dir == NULL) {
  210. perror("test_driver: opendir");
  211. return -1;
  212. }
  213. while ((dent = readdir(dir))) {
  214. #ifdef _DIRENT_HAVE_D_TYPE
  215. /* Skip the file if it is not a socket. Also accept
  216. * DT_UNKNOWN (0) in case the C library or underlying file
  217. * system does not support d_type. */
  218. if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
  219. continue;
  220. #endif /* _DIRENT_HAVE_D_TYPE */
  221. if (strcmp(dent->d_name, ".") == 0 ||
  222. strcmp(dent->d_name, "..") == 0)
  223. continue;
  224. memset(&addr, 0, sizeof(addr));
  225. addr.sun_family = AF_UNIX;
  226. snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
  227. drv->socket_dir, dent->d_name);
  228. if (strcmp(addr.sun_path, drv->own_socket_path) == 0)
  229. continue;
  230. if (!broadcast && strstr(dent->d_name, desttxt) == NULL)
  231. continue;
  232. wpa_printf(MSG_DEBUG, "%s: Send ether frame to %s",
  233. __func__, dent->d_name);
  234. msg.msg_name = &addr;
  235. msg.msg_namelen = sizeof(addr);
  236. ret = sendmsg(drv->test_socket, &msg, 0);
  237. if (ret < 0)
  238. perror("driver_test: sendmsg");
  239. count++;
  240. }
  241. closedir(dir);
  242. if (!broadcast && count == 0) {
  243. wpa_printf(MSG_DEBUG, "%s: Destination " MACSTR " not found",
  244. __func__, MAC2STR(dst));
  245. return -1;
  246. }
  247. return ret;
  248. }
  249. static int wpa_driver_test_send_mlme(void *priv, const u8 *buf, size_t len)
  250. {
  251. struct test_driver_data *drv = priv;
  252. struct msghdr msg;
  253. struct iovec io[2];
  254. const u8 *dest;
  255. int ret = 0, broadcast = 0;
  256. char desttxt[30];
  257. struct sockaddr_un addr;
  258. struct dirent *dent;
  259. DIR *dir;
  260. struct ieee80211_hdr *hdr;
  261. u16 fc;
  262. if (drv->test_socket < 0 || len < 10 || drv->socket_dir == NULL) {
  263. wpa_printf(MSG_DEBUG, "%s: invalid parameters (sock=%d len=%lu"
  264. " socket_dir=%p)",
  265. __func__, drv->test_socket, (unsigned long) len,
  266. drv->socket_dir);
  267. return -1;
  268. }
  269. dest = buf;
  270. dest += 4;
  271. broadcast = memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0;
  272. snprintf(desttxt, sizeof(desttxt), MACSTR, MAC2STR(dest));
  273. io[0].iov_base = "MLME ";
  274. io[0].iov_len = 5;
  275. io[1].iov_base = (void *) buf;
  276. io[1].iov_len = len;
  277. memset(&msg, 0, sizeof(msg));
  278. msg.msg_iov = io;
  279. msg.msg_iovlen = 2;
  280. dir = opendir(drv->socket_dir);
  281. if (dir == NULL) {
  282. perror("test_driver: opendir");
  283. return -1;
  284. }
  285. while ((dent = readdir(dir))) {
  286. #ifdef _DIRENT_HAVE_D_TYPE
  287. /* Skip the file if it is not a socket. Also accept
  288. * DT_UNKNOWN (0) in case the C library or underlying file
  289. * system does not support d_type. */
  290. if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
  291. continue;
  292. #endif /* _DIRENT_HAVE_D_TYPE */
  293. if (strcmp(dent->d_name, ".") == 0 ||
  294. strcmp(dent->d_name, "..") == 0)
  295. continue;
  296. memset(&addr, 0, sizeof(addr));
  297. addr.sun_family = AF_UNIX;
  298. snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
  299. drv->socket_dir, dent->d_name);
  300. if (strcmp(addr.sun_path, drv->own_socket_path) == 0)
  301. continue;
  302. if (!broadcast && strstr(dent->d_name, desttxt) == NULL)
  303. continue;
  304. wpa_printf(MSG_DEBUG, "%s: Send management frame to %s",
  305. __func__, dent->d_name);
  306. msg.msg_name = &addr;
  307. msg.msg_namelen = sizeof(addr);
  308. ret = sendmsg(drv->test_socket, &msg, 0);
  309. if (ret < 0)
  310. perror("driver_test: sendmsg");
  311. }
  312. closedir(dir);
  313. hdr = (struct ieee80211_hdr *) buf;
  314. fc = le_to_host16(hdr->frame_control);
  315. hostapd_mgmt_tx_cb(drv->hapd, (u8 *) buf, len, WLAN_FC_GET_STYPE(fc),
  316. ret >= 0);
  317. return ret;
  318. }
  319. static void test_driver_scan(struct test_driver_data *drv,
  320. struct sockaddr_un *from, socklen_t fromlen,
  321. char *data)
  322. {
  323. char buf[512], *pos, *end;
  324. int ret;
  325. struct test_driver_bss *bss;
  326. u8 sa[ETH_ALEN];
  327. u8 ie[512];
  328. size_t ielen;
  329. /* data: optional [ ' ' | STA-addr | ' ' | IEs(hex) ] */
  330. wpa_printf(MSG_DEBUG, "test_driver: SCAN");
  331. if (*data) {
  332. if (*data != ' ' ||
  333. hwaddr_aton(data + 1, sa)) {
  334. wpa_printf(MSG_DEBUG, "test_driver: Unexpected SCAN "
  335. "command format");
  336. return;
  337. }
  338. data += 18;
  339. while (*data == ' ')
  340. data++;
  341. ielen = os_strlen(data) / 2;
  342. if (ielen > sizeof(ie))
  343. ielen = sizeof(ie);
  344. if (hexstr2bin(data, ie, ielen) < 0)
  345. ielen = 0;
  346. wpa_printf(MSG_DEBUG, "test_driver: Scan from " MACSTR,
  347. MAC2STR(sa));
  348. wpa_hexdump(MSG_MSGDUMP, "test_driver: scan IEs", ie, ielen);
  349. hostapd_wps_probe_req_rx(drv->hapd, sa, ie, ielen);
  350. }
  351. for (bss = drv->bss; bss; bss = bss->next) {
  352. pos = buf;
  353. end = buf + sizeof(buf);
  354. /* reply: SCANRESP BSSID SSID IEs */
  355. ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
  356. MAC2STR(bss->bssid));
  357. if (ret < 0 || ret >= end - pos)
  358. return;
  359. pos += ret;
  360. pos += wpa_snprintf_hex(pos, end - pos,
  361. bss->ssid, bss->ssid_len);
  362. ret = snprintf(pos, end - pos, " ");
  363. if (ret < 0 || ret >= end - pos)
  364. return;
  365. pos += ret;
  366. pos += wpa_snprintf_hex(pos, end - pos, bss->ie, bss->ielen);
  367. pos += wpa_snprintf_hex(pos, end - pos, bss->wps_probe_resp_ie,
  368. bss->wps_probe_resp_ie_len);
  369. if (bss->privacy) {
  370. ret = snprintf(pos, end - pos, " PRIVACY");
  371. if (ret < 0 || ret >= end - pos)
  372. return;
  373. pos += ret;
  374. }
  375. sendto(drv->test_socket, buf, pos - buf, 0,
  376. (struct sockaddr *) from, fromlen);
  377. }
  378. }
  379. static struct hostapd_data * test_driver_get_hapd(struct test_driver_data *drv,
  380. struct test_driver_bss *bss)
  381. {
  382. struct hostapd_iface *iface = drv->hapd->iface;
  383. struct hostapd_data *hapd = NULL;
  384. size_t i;
  385. if (bss == NULL) {
  386. wpa_printf(MSG_DEBUG, "%s: bss == NULL", __func__);
  387. return NULL;
  388. }
  389. for (i = 0; i < iface->num_bss; i++) {
  390. hapd = iface->bss[i];
  391. if (memcmp(hapd->own_addr, bss->bssid, ETH_ALEN) == 0)
  392. break;
  393. }
  394. if (i == iface->num_bss) {
  395. wpa_printf(MSG_DEBUG, "%s: no matching interface entry found "
  396. "for BSSID " MACSTR, __func__, MAC2STR(bss->bssid));
  397. return NULL;
  398. }
  399. return hapd;
  400. }
  401. static int test_driver_new_sta(struct test_driver_data *drv,
  402. struct test_driver_bss *bss, const u8 *addr,
  403. const u8 *ie, size_t ielen)
  404. {
  405. struct hostapd_data *hapd;
  406. hapd = test_driver_get_hapd(drv, bss);
  407. if (hapd == NULL)
  408. return -1;
  409. return hostapd_notif_assoc(hapd, addr, ie, ielen);
  410. }
  411. static void test_driver_assoc(struct test_driver_data *drv,
  412. struct sockaddr_un *from, socklen_t fromlen,
  413. char *data)
  414. {
  415. struct test_client_socket *cli;
  416. u8 ie[256], ssid[32];
  417. size_t ielen, ssid_len = 0;
  418. char *pos, *pos2, cmd[50];
  419. struct test_driver_bss *bss;
  420. /* data: STA-addr SSID(hex) IEs(hex) */
  421. cli = os_zalloc(sizeof(*cli));
  422. if (cli == NULL)
  423. return;
  424. if (hwaddr_aton(data, cli->addr)) {
  425. printf("test_socket: Invalid MAC address '%s' in ASSOC\n",
  426. data);
  427. free(cli);
  428. return;
  429. }
  430. pos = data + 17;
  431. while (*pos == ' ')
  432. pos++;
  433. pos2 = strchr(pos, ' ');
  434. ielen = 0;
  435. if (pos2) {
  436. ssid_len = (pos2 - pos) / 2;
  437. if (hexstr2bin(pos, ssid, ssid_len) < 0) {
  438. wpa_printf(MSG_DEBUG, "%s: Invalid SSID", __func__);
  439. free(cli);
  440. return;
  441. }
  442. wpa_hexdump_ascii(MSG_DEBUG, "test_driver_assoc: SSID",
  443. ssid, ssid_len);
  444. pos = pos2 + 1;
  445. ielen = strlen(pos) / 2;
  446. if (ielen > sizeof(ie))
  447. ielen = sizeof(ie);
  448. if (hexstr2bin(pos, ie, ielen) < 0)
  449. ielen = 0;
  450. }
  451. for (bss = drv->bss; bss; bss = bss->next) {
  452. if (bss->ssid_len == ssid_len &&
  453. memcmp(bss->ssid, ssid, ssid_len) == 0)
  454. break;
  455. }
  456. if (bss == NULL) {
  457. wpa_printf(MSG_DEBUG, "%s: No matching SSID found from "
  458. "configured BSSes", __func__);
  459. free(cli);
  460. return;
  461. }
  462. cli->bss = bss;
  463. memcpy(&cli->un, from, sizeof(cli->un));
  464. cli->unlen = fromlen;
  465. cli->next = drv->cli;
  466. drv->cli = cli;
  467. wpa_hexdump_ascii(MSG_DEBUG, "test_socket: ASSOC sun_path",
  468. (const u8 *) cli->un.sun_path,
  469. cli->unlen - sizeof(cli->un.sun_family));
  470. snprintf(cmd, sizeof(cmd), "ASSOCRESP " MACSTR " 0",
  471. MAC2STR(bss->bssid));
  472. sendto(drv->test_socket, cmd, strlen(cmd), 0,
  473. (struct sockaddr *) from, fromlen);
  474. if (test_driver_new_sta(drv, bss, cli->addr, ie, ielen) < 0) {
  475. wpa_printf(MSG_DEBUG, "test_driver: failed to add new STA");
  476. }
  477. }
  478. static void test_driver_disassoc(struct test_driver_data *drv,
  479. struct sockaddr_un *from, socklen_t fromlen)
  480. {
  481. struct test_client_socket *cli;
  482. cli = test_driver_get_cli(drv, from, fromlen);
  483. if (!cli)
  484. return;
  485. hostapd_notif_disassoc(drv->hapd, cli->addr);
  486. }
  487. static void test_driver_eapol(struct test_driver_data *drv,
  488. struct sockaddr_un *from, socklen_t fromlen,
  489. u8 *data, size_t datalen)
  490. {
  491. struct test_client_socket *cli;
  492. if (datalen > 14) {
  493. /* Skip Ethernet header */
  494. wpa_printf(MSG_DEBUG, "test_driver: dst=" MACSTR " src="
  495. MACSTR " proto=%04x",
  496. MAC2STR(data), MAC2STR(data + ETH_ALEN),
  497. WPA_GET_BE16(data + 2 * ETH_ALEN));
  498. data += 14;
  499. datalen -= 14;
  500. }
  501. cli = test_driver_get_cli(drv, from, fromlen);
  502. if (cli) {
  503. struct hostapd_data *hapd;
  504. hapd = test_driver_get_hapd(drv, cli->bss);
  505. if (hapd == NULL)
  506. return;
  507. hostapd_eapol_receive(hapd, cli->addr, data, datalen);
  508. } else {
  509. wpa_printf(MSG_DEBUG, "test_socket: EAPOL from unknown "
  510. "client");
  511. }
  512. }
  513. static void test_driver_ether(struct test_driver_data *drv,
  514. struct sockaddr_un *from, socklen_t fromlen,
  515. u8 *data, size_t datalen)
  516. {
  517. struct l2_ethhdr *eth;
  518. if (datalen < sizeof(*eth))
  519. return;
  520. eth = (struct l2_ethhdr *) data;
  521. wpa_printf(MSG_DEBUG, "test_driver: RX ETHER dst=" MACSTR " src="
  522. MACSTR " proto=%04x",
  523. MAC2STR(eth->h_dest), MAC2STR(eth->h_source),
  524. be_to_host16(eth->h_proto));
  525. #ifdef CONFIG_IEEE80211R
  526. if (be_to_host16(eth->h_proto) == ETH_P_RRB) {
  527. wpa_ft_rrb_rx(drv->hapd->wpa_auth, eth->h_source,
  528. data + sizeof(*eth), datalen - sizeof(*eth));
  529. }
  530. #endif /* CONFIG_IEEE80211R */
  531. }
  532. static void test_driver_mlme(struct test_driver_data *drv,
  533. struct sockaddr_un *from, socklen_t fromlen,
  534. u8 *data, size_t datalen)
  535. {
  536. struct ieee80211_hdr *hdr;
  537. u16 fc;
  538. hdr = (struct ieee80211_hdr *) data;
  539. if (test_driver_get_cli(drv, from, fromlen) == NULL && datalen >= 16) {
  540. struct test_client_socket *cli;
  541. cli = os_zalloc(sizeof(*cli));
  542. if (cli == NULL)
  543. return;
  544. wpa_printf(MSG_DEBUG, "Adding client entry for " MACSTR,
  545. MAC2STR(hdr->addr2));
  546. memcpy(cli->addr, hdr->addr2, ETH_ALEN);
  547. memcpy(&cli->un, from, sizeof(cli->un));
  548. cli->unlen = fromlen;
  549. cli->next = drv->cli;
  550. drv->cli = cli;
  551. }
  552. wpa_hexdump(MSG_MSGDUMP, "test_driver_mlme: received frame",
  553. data, datalen);
  554. fc = le_to_host16(hdr->frame_control);
  555. if (WLAN_FC_GET_TYPE(fc) != WLAN_FC_TYPE_MGMT) {
  556. wpa_printf(MSG_ERROR, "%s: received non-mgmt frame",
  557. __func__);
  558. return;
  559. }
  560. hostapd_mgmt_rx(drv->hapd, data, datalen, WLAN_FC_GET_STYPE(fc), NULL);
  561. }
  562. static void test_driver_receive_unix(int sock, void *eloop_ctx, void *sock_ctx)
  563. {
  564. struct test_driver_data *drv = eloop_ctx;
  565. char buf[2000];
  566. int res;
  567. struct sockaddr_un from;
  568. socklen_t fromlen = sizeof(from);
  569. res = recvfrom(sock, buf, sizeof(buf) - 1, 0,
  570. (struct sockaddr *) &from, &fromlen);
  571. if (res < 0) {
  572. perror("recvfrom(test_socket)");
  573. return;
  574. }
  575. buf[res] = '\0';
  576. wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res);
  577. if (strncmp(buf, "SCAN", 4) == 0) {
  578. test_driver_scan(drv, &from, fromlen, buf + 4);
  579. } else if (strncmp(buf, "ASSOC ", 6) == 0) {
  580. test_driver_assoc(drv, &from, fromlen, buf + 6);
  581. } else if (strcmp(buf, "DISASSOC") == 0) {
  582. test_driver_disassoc(drv, &from, fromlen);
  583. } else if (strncmp(buf, "EAPOL ", 6) == 0) {
  584. test_driver_eapol(drv, &from, fromlen, (u8 *) buf + 6,
  585. res - 6);
  586. } else if (strncmp(buf, "ETHER ", 6) == 0) {
  587. test_driver_ether(drv, &from, fromlen, (u8 *) buf + 6,
  588. res - 6);
  589. } else if (strncmp(buf, "MLME ", 5) == 0) {
  590. test_driver_mlme(drv, &from, fromlen, (u8 *) buf + 5, res - 5);
  591. } else {
  592. wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command",
  593. (u8 *) buf, res);
  594. }
  595. }
  596. static struct test_driver_bss *
  597. test_driver_get_bss(struct test_driver_data *drv, const char *ifname)
  598. {
  599. struct test_driver_bss *bss;
  600. for (bss = drv->bss; bss; bss = bss->next) {
  601. if (strcmp(bss->ifname, ifname) == 0)
  602. return bss;
  603. }
  604. return NULL;
  605. }
  606. static int test_driver_set_generic_elem(const char *ifname, void *priv,
  607. const u8 *elem, size_t elem_len)
  608. {
  609. struct test_driver_data *drv = priv;
  610. struct test_driver_bss *bss;
  611. bss = test_driver_get_bss(drv, ifname);
  612. if (bss == NULL)
  613. return -1;
  614. free(bss->ie);
  615. if (elem == NULL) {
  616. bss->ie = NULL;
  617. bss->ielen = 0;
  618. return 0;
  619. }
  620. bss->ie = malloc(elem_len);
  621. if (bss->ie == NULL) {
  622. bss->ielen = 0;
  623. return -1;
  624. }
  625. memcpy(bss->ie, elem, elem_len);
  626. bss->ielen = elem_len;
  627. return 0;
  628. }
  629. static int test_driver_set_wps_beacon_ie(const char *ifname, void *priv,
  630. const u8 *ie, size_t len)
  631. {
  632. struct test_driver_data *drv = priv;
  633. struct test_driver_bss *bss;
  634. wpa_hexdump(MSG_DEBUG, "test_driver: Beacon WPS IE", ie, len);
  635. bss = test_driver_get_bss(drv, ifname);
  636. if (bss == NULL)
  637. return -1;
  638. free(bss->wps_beacon_ie);
  639. if (ie == NULL) {
  640. bss->wps_beacon_ie = NULL;
  641. bss->wps_beacon_ie_len = 0;
  642. return 0;
  643. }
  644. bss->wps_beacon_ie = malloc(len);
  645. if (bss->wps_beacon_ie == NULL) {
  646. bss->wps_beacon_ie_len = 0;
  647. return -1;
  648. }
  649. memcpy(bss->wps_beacon_ie, ie, len);
  650. bss->wps_beacon_ie_len = len;
  651. return 0;
  652. }
  653. static int test_driver_set_wps_probe_resp_ie(const char *ifname, void *priv,
  654. const u8 *ie, size_t len)
  655. {
  656. struct test_driver_data *drv = priv;
  657. struct test_driver_bss *bss;
  658. wpa_hexdump(MSG_DEBUG, "test_driver: ProbeResp WPS IE", ie, len);
  659. bss = test_driver_get_bss(drv, ifname);
  660. if (bss == NULL)
  661. return -1;
  662. free(bss->wps_probe_resp_ie);
  663. if (ie == NULL) {
  664. bss->wps_probe_resp_ie = NULL;
  665. bss->wps_probe_resp_ie_len = 0;
  666. return 0;
  667. }
  668. bss->wps_probe_resp_ie = malloc(len);
  669. if (bss->wps_probe_resp_ie == NULL) {
  670. bss->wps_probe_resp_ie_len = 0;
  671. return -1;
  672. }
  673. memcpy(bss->wps_probe_resp_ie, ie, len);
  674. bss->wps_probe_resp_ie_len = len;
  675. return 0;
  676. }
  677. static int test_driver_sta_deauth(void *priv, const u8 *addr, int reason)
  678. {
  679. struct test_driver_data *drv = priv;
  680. struct test_client_socket *cli;
  681. if (drv->test_socket < 0)
  682. return -1;
  683. cli = drv->cli;
  684. while (cli) {
  685. if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
  686. break;
  687. cli = cli->next;
  688. }
  689. if (!cli)
  690. return -1;
  691. return sendto(drv->test_socket, "DEAUTH", 6, 0,
  692. (struct sockaddr *) &cli->un, cli->unlen);
  693. }
  694. static int test_driver_sta_disassoc(void *priv, const u8 *addr, int reason)
  695. {
  696. struct test_driver_data *drv = priv;
  697. struct test_client_socket *cli;
  698. if (drv->test_socket < 0)
  699. return -1;
  700. cli = drv->cli;
  701. while (cli) {
  702. if (memcmp(cli->addr, addr, ETH_ALEN) == 0)
  703. break;
  704. cli = cli->next;
  705. }
  706. if (!cli)
  707. return -1;
  708. return sendto(drv->test_socket, "DISASSOC", 8, 0,
  709. (struct sockaddr *) &cli->un, cli->unlen);
  710. }
  711. static int test_driver_bss_add(void *priv, const char *ifname, const u8 *bssid)
  712. {
  713. struct test_driver_data *drv = priv;
  714. struct test_driver_bss *bss;
  715. wpa_printf(MSG_DEBUG, "%s(ifname=%s bssid=" MACSTR ")",
  716. __func__, ifname, MAC2STR(bssid));
  717. bss = os_zalloc(sizeof(*bss));
  718. if (bss == NULL)
  719. return -1;
  720. os_strlcpy(bss->ifname, ifname, IFNAMSIZ);
  721. memcpy(bss->bssid, bssid, ETH_ALEN);
  722. bss->next = drv->bss;
  723. drv->bss = bss;
  724. return 0;
  725. }
  726. static int test_driver_bss_remove(void *priv, const char *ifname)
  727. {
  728. struct test_driver_data *drv = priv;
  729. struct test_driver_bss *bss, *prev;
  730. struct test_client_socket *cli, *prev_c;
  731. wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, ifname);
  732. for (prev = NULL, bss = drv->bss; bss; prev = bss, bss = bss->next) {
  733. if (strcmp(bss->ifname, ifname) != 0)
  734. continue;
  735. if (prev)
  736. prev->next = bss->next;
  737. else
  738. drv->bss = bss->next;
  739. for (prev_c = NULL, cli = drv->cli; cli;
  740. prev_c = cli, cli = cli->next) {
  741. if (cli->bss != bss)
  742. continue;
  743. if (prev_c)
  744. prev_c->next = cli->next;
  745. else
  746. drv->cli = cli->next;
  747. free(cli);
  748. break;
  749. }
  750. test_driver_free_bss(bss);
  751. return 0;
  752. }
  753. return -1;
  754. }
  755. static int test_driver_if_add(const char *iface, void *priv,
  756. enum hostapd_driver_if_type type, char *ifname,
  757. const u8 *addr)
  758. {
  759. wpa_printf(MSG_DEBUG, "%s(iface=%s type=%d ifname=%s)",
  760. __func__, iface, type, ifname);
  761. return 0;
  762. }
  763. static int test_driver_if_update(void *priv, enum hostapd_driver_if_type type,
  764. char *ifname, const u8 *addr)
  765. {
  766. wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s)", __func__, type, ifname);
  767. return 0;
  768. }
  769. static int test_driver_if_remove(void *priv, enum hostapd_driver_if_type type,
  770. const char *ifname, const u8 *addr)
  771. {
  772. wpa_printf(MSG_DEBUG, "%s(type=%d ifname=%s)", __func__, type, ifname);
  773. return 0;
  774. }
  775. static int test_driver_valid_bss_mask(void *priv, const u8 *addr,
  776. const u8 *mask)
  777. {
  778. return 0;
  779. }
  780. static int test_driver_set_ssid(const char *ifname, void *priv, const u8 *buf,
  781. int len)
  782. {
  783. struct test_driver_data *drv = priv;
  784. struct test_driver_bss *bss;
  785. wpa_printf(MSG_DEBUG, "%s(ifname=%s)", __func__, ifname);
  786. wpa_hexdump_ascii(MSG_DEBUG, "test_driver_set_ssid: SSID", buf, len);
  787. for (bss = drv->bss; bss; bss = bss->next) {
  788. if (strcmp(bss->ifname, ifname) != 0)
  789. continue;
  790. if (len < 0 || (size_t) len > sizeof(bss->ssid))
  791. return -1;
  792. memcpy(bss->ssid, buf, len);
  793. bss->ssid_len = len;
  794. return 0;
  795. }
  796. return -1;
  797. }
  798. static int test_driver_set_privacy(const char *ifname, void *priv, int enabled)
  799. {
  800. struct test_driver_data *drv = priv;
  801. struct test_driver_bss *bss;
  802. wpa_printf(MSG_DEBUG, "%s(ifname=%s enabled=%d)",
  803. __func__, ifname, enabled);
  804. for (bss = drv->bss; bss; bss = bss->next) {
  805. if (strcmp(bss->ifname, ifname) != 0)
  806. continue;
  807. bss->privacy = enabled;
  808. return 0;
  809. }
  810. return -1;
  811. }
  812. static int test_driver_set_key(const char *iface, void *priv, wpa_alg alg,
  813. const u8 *addr, int key_idx, int set_tx,
  814. const u8 *seq, size_t seq_len,
  815. const u8 *key, size_t key_len)
  816. {
  817. wpa_printf(MSG_DEBUG, "%s(iface=%s alg=%d idx=%d set_tx=%d)",
  818. __func__, iface, alg, key_idx, set_tx);
  819. if (addr)
  820. wpa_printf(MSG_DEBUG, " addr=" MACSTR, MAC2STR(addr));
  821. if (key)
  822. wpa_hexdump_key(MSG_DEBUG, " key", key, key_len);
  823. return 0;
  824. }
  825. static int test_driver_set_sta_vlan(void *priv, const u8 *addr,
  826. const char *ifname, int vlan_id)
  827. {
  828. wpa_printf(MSG_DEBUG, "%s(addr=" MACSTR " ifname=%s vlan_id=%d)",
  829. __func__, MAC2STR(addr), ifname, vlan_id);
  830. return 0;
  831. }
  832. static int test_driver_sta_add(const char *ifname, void *priv,
  833. struct hostapd_sta_add_params *params)
  834. {
  835. struct test_driver_data *drv = priv;
  836. struct test_client_socket *cli;
  837. struct test_driver_bss *bss;
  838. wpa_printf(MSG_DEBUG, "%s(ifname=%s addr=" MACSTR " aid=%d "
  839. "capability=0x%x flags=0x%x listen_interval=%d)",
  840. __func__, ifname, MAC2STR(params->addr), params->aid,
  841. params->capability, params->flags,
  842. params->listen_interval);
  843. wpa_hexdump(MSG_DEBUG, "test_driver_sta_add - supp_rates",
  844. params->supp_rates, params->supp_rates_len);
  845. cli = drv->cli;
  846. while (cli) {
  847. if (os_memcmp(cli->addr, params->addr, ETH_ALEN) == 0)
  848. break;
  849. cli = cli->next;
  850. }
  851. if (!cli) {
  852. wpa_printf(MSG_DEBUG, "%s: no matching client entry",
  853. __func__);
  854. return -1;
  855. }
  856. for (bss = drv->bss; bss; bss = bss->next) {
  857. if (strcmp(ifname, bss->ifname) == 0)
  858. break;
  859. }
  860. if (bss == NULL) {
  861. wpa_printf(MSG_DEBUG, "%s: No matching interface found from "
  862. "configured BSSes", __func__);
  863. return -1;
  864. }
  865. cli->bss = bss;
  866. return 0;
  867. }
  868. static void * test_driver_init(struct hostapd_data *hapd,
  869. struct wpa_init_params *params)
  870. {
  871. struct test_driver_data *drv;
  872. struct sockaddr_un addr_un;
  873. struct sockaddr_in addr_in;
  874. struct sockaddr *addr;
  875. socklen_t alen;
  876. drv = os_zalloc(sizeof(struct test_driver_data));
  877. if (drv == NULL) {
  878. printf("Could not allocate memory for test driver data\n");
  879. return NULL;
  880. }
  881. drv->bss = os_zalloc(sizeof(*drv->bss));
  882. if (drv->bss == NULL) {
  883. printf("Could not allocate memory for test driver BSS data\n");
  884. free(drv);
  885. return NULL;
  886. }
  887. drv->hapd = hapd;
  888. /* Generate a MAC address to help testing with multiple APs */
  889. hapd->own_addr[0] = 0x02; /* locally administered */
  890. sha1_prf((const u8 *) params->ifname, strlen(params->ifname),
  891. "hostapd test bssid generation",
  892. params->ssid, params->ssid_len,
  893. hapd->own_addr + 1, ETH_ALEN - 1);
  894. os_strlcpy(drv->bss->ifname, params->ifname, IFNAMSIZ);
  895. memcpy(drv->bss->bssid, hapd->own_addr, ETH_ALEN);
  896. if (params->test_socket) {
  897. if (os_strlen(params->test_socket) >=
  898. sizeof(addr_un.sun_path)) {
  899. printf("Too long test_socket path\n");
  900. test_driver_free_priv(drv);
  901. return NULL;
  902. }
  903. if (strncmp(params->test_socket, "DIR:", 4) == 0) {
  904. size_t len = strlen(params->test_socket) + 30;
  905. drv->socket_dir = strdup(params->test_socket + 4);
  906. drv->own_socket_path = malloc(len);
  907. if (drv->own_socket_path) {
  908. snprintf(drv->own_socket_path, len,
  909. "%s/AP-" MACSTR,
  910. params->test_socket + 4,
  911. MAC2STR(hapd->own_addr));
  912. }
  913. } else if (strncmp(params->test_socket, "UDP:", 4) == 0) {
  914. drv->udp_port = atoi(params->test_socket + 4);
  915. } else {
  916. drv->own_socket_path = strdup(params->test_socket);
  917. }
  918. if (drv->own_socket_path == NULL && drv->udp_port == 0) {
  919. test_driver_free_priv(drv);
  920. return NULL;
  921. }
  922. drv->test_socket = socket(drv->udp_port ? PF_INET : PF_UNIX,
  923. SOCK_DGRAM, 0);
  924. if (drv->test_socket < 0) {
  925. perror("socket");
  926. test_driver_free_priv(drv);
  927. return NULL;
  928. }
  929. if (drv->udp_port) {
  930. os_memset(&addr_in, 0, sizeof(addr_in));
  931. addr_in.sin_family = AF_INET;
  932. addr_in.sin_port = htons(drv->udp_port);
  933. addr = (struct sockaddr *) &addr_in;
  934. alen = sizeof(addr_in);
  935. } else {
  936. os_memset(&addr_un, 0, sizeof(addr_un));
  937. addr_un.sun_family = AF_UNIX;
  938. os_strlcpy(addr_un.sun_path, drv->own_socket_path,
  939. sizeof(addr_un.sun_path));
  940. addr = (struct sockaddr *) &addr_un;
  941. alen = sizeof(addr_un);
  942. }
  943. if (bind(drv->test_socket, addr, alen) < 0) {
  944. perror("bind(PF_UNIX)");
  945. close(drv->test_socket);
  946. if (drv->own_socket_path)
  947. unlink(drv->own_socket_path);
  948. test_driver_free_priv(drv);
  949. return NULL;
  950. }
  951. eloop_register_read_sock(drv->test_socket,
  952. test_driver_receive_unix, drv, NULL);
  953. } else
  954. drv->test_socket = -1;
  955. return drv;
  956. }
  957. static void test_driver_deinit(void *priv)
  958. {
  959. struct test_driver_data *drv = priv;
  960. struct test_client_socket *cli, *prev;
  961. cli = drv->cli;
  962. while (cli) {
  963. prev = cli;
  964. cli = cli->next;
  965. free(prev);
  966. }
  967. if (drv->test_socket >= 0) {
  968. eloop_unregister_read_sock(drv->test_socket);
  969. close(drv->test_socket);
  970. if (drv->own_socket_path)
  971. unlink(drv->own_socket_path);
  972. }
  973. /* There should be only one BSS remaining at this point. */
  974. if (drv->bss == NULL)
  975. wpa_printf(MSG_ERROR, "%s: drv->bss == NULL", __func__);
  976. else if (drv->bss->next)
  977. wpa_printf(MSG_ERROR, "%s: drv->bss->next != NULL", __func__);
  978. test_driver_free_priv(drv);
  979. }
  980. #else /* HOSTAPD */
  981. static void wpa_driver_test_poll(void *eloop_ctx, void *timeout_ctx)
  982. {
  983. struct wpa_driver_test_data *drv = eloop_ctx;
  984. #ifdef DRIVER_TEST_UNIX
  985. if (drv->associated && drv->hostapd_addr_set) {
  986. struct stat st;
  987. if (stat(drv->hostapd_addr.sun_path, &st) < 0) {
  988. wpa_printf(MSG_DEBUG, "%s: lost connection to AP: %s",
  989. __func__, strerror(errno));
  990. drv->associated = 0;
  991. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  992. }
  993. }
  994. #endif /* DRIVER_TEST_UNIX */
  995. eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL);
  996. }
  997. static int wpa_driver_test_set_wpa(void *priv, int enabled)
  998. {
  999. wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, enabled);
  1000. return 0;
  1001. }
  1002. static void wpa_driver_test_scan_timeout(void *eloop_ctx, void *timeout_ctx)
  1003. {
  1004. wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
  1005. wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
  1006. }
  1007. #ifdef DRIVER_TEST_UNIX
  1008. static void wpa_driver_scan_dir(struct wpa_driver_test_data *drv,
  1009. const char *path)
  1010. {
  1011. struct dirent *dent;
  1012. DIR *dir;
  1013. struct sockaddr_un addr;
  1014. char cmd[512], *pos, *end;
  1015. int ret;
  1016. dir = opendir(path);
  1017. if (dir == NULL)
  1018. return;
  1019. end = cmd + sizeof(cmd);
  1020. pos = cmd;
  1021. ret = os_snprintf(pos, end - pos, "SCAN " MACSTR,
  1022. MAC2STR(drv->own_addr));
  1023. if (ret >= 0 && ret < end - pos)
  1024. pos += ret;
  1025. if (drv->probe_req_ie) {
  1026. ret = os_snprintf(pos, end - pos, " ");
  1027. if (ret >= 0 && ret < end - pos)
  1028. pos += ret;
  1029. pos += wpa_snprintf_hex(pos, end - pos, drv->probe_req_ie,
  1030. drv->probe_req_ie_len);
  1031. }
  1032. end[-1] = '\0';
  1033. while ((dent = readdir(dir))) {
  1034. if (os_strncmp(dent->d_name, "AP-", 3) != 0 &&
  1035. os_strncmp(dent->d_name, "STA-", 4) != 0)
  1036. continue;
  1037. if (drv->own_socket_path) {
  1038. size_t olen, dlen;
  1039. olen = os_strlen(drv->own_socket_path);
  1040. dlen = os_strlen(dent->d_name);
  1041. if (olen >= dlen &&
  1042. os_strcmp(dent->d_name,
  1043. drv->own_socket_path + olen - dlen) == 0)
  1044. continue;
  1045. }
  1046. wpa_printf(MSG_DEBUG, "%s: SCAN %s", __func__, dent->d_name);
  1047. os_memset(&addr, 0, sizeof(addr));
  1048. addr.sun_family = AF_UNIX;
  1049. os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
  1050. path, dent->d_name);
  1051. if (sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
  1052. (struct sockaddr *) &addr, sizeof(addr)) < 0) {
  1053. perror("sendto(test_socket)");
  1054. }
  1055. }
  1056. closedir(dir);
  1057. }
  1058. #endif /* DRIVER_TEST_UNIX */
  1059. static int wpa_driver_test_scan(void *priv,
  1060. struct wpa_driver_scan_params *params)
  1061. {
  1062. struct wpa_driver_test_data *drv = priv;
  1063. size_t i;
  1064. wpa_printf(MSG_DEBUG, "%s: priv=%p", __func__, priv);
  1065. for (i = 0; i < params->num_ssids; i++)
  1066. wpa_hexdump(MSG_DEBUG, "Scan SSID",
  1067. params->ssids[i].ssid, params->ssids[i].ssid_len);
  1068. wpa_hexdump(MSG_DEBUG, "Scan extra IE(s)",
  1069. params->extra_ies, params->extra_ies_len);
  1070. drv->num_scanres = 0;
  1071. #ifdef DRIVER_TEST_UNIX
  1072. if (drv->test_socket >= 0 && drv->test_dir)
  1073. wpa_driver_scan_dir(drv, drv->test_dir);
  1074. if (drv->test_socket >= 0 && drv->hostapd_addr_set &&
  1075. sendto(drv->test_socket, "SCAN", 4, 0,
  1076. (struct sockaddr *) &drv->hostapd_addr,
  1077. sizeof(drv->hostapd_addr)) < 0) {
  1078. perror("sendto(test_socket)");
  1079. }
  1080. #endif /* DRIVER_TEST_UNIX */
  1081. if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set &&
  1082. sendto(drv->test_socket, "SCAN", 4, 0,
  1083. (struct sockaddr *) &drv->hostapd_addr_udp,
  1084. sizeof(drv->hostapd_addr_udp)) < 0) {
  1085. perror("sendto(test_socket)");
  1086. }
  1087. eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx);
  1088. eloop_register_timeout(1, 0, wpa_driver_test_scan_timeout, drv,
  1089. drv->ctx);
  1090. return 0;
  1091. }
  1092. static struct wpa_scan_results * wpa_driver_test_get_scan_results2(void *priv)
  1093. {
  1094. struct wpa_driver_test_data *drv = priv;
  1095. struct wpa_scan_results *res;
  1096. size_t i;
  1097. res = os_zalloc(sizeof(*res));
  1098. if (res == NULL)
  1099. return NULL;
  1100. res->res = os_zalloc(drv->num_scanres * sizeof(struct wpa_scan_res *));
  1101. if (res->res == NULL) {
  1102. os_free(res);
  1103. return NULL;
  1104. }
  1105. for (i = 0; i < drv->num_scanres; i++) {
  1106. struct wpa_scan_res *r;
  1107. if (drv->scanres[i] == NULL)
  1108. continue;
  1109. r = os_malloc(sizeof(*r) + drv->scanres[i]->ie_len);
  1110. if (r == NULL)
  1111. break;
  1112. os_memcpy(r, drv->scanres[i],
  1113. sizeof(*r) + drv->scanres[i]->ie_len);
  1114. res->res[res->num++] = r;
  1115. }
  1116. return res;
  1117. }
  1118. static int wpa_driver_test_set_key(void *priv, wpa_alg alg, const u8 *addr,
  1119. int key_idx, int set_tx,
  1120. const u8 *seq, size_t seq_len,
  1121. const u8 *key, size_t key_len)
  1122. {
  1123. wpa_printf(MSG_DEBUG, "%s: priv=%p alg=%d key_idx=%d set_tx=%d",
  1124. __func__, priv, alg, key_idx, set_tx);
  1125. if (addr) {
  1126. wpa_printf(MSG_DEBUG, " addr=" MACSTR, MAC2STR(addr));
  1127. }
  1128. if (seq) {
  1129. wpa_hexdump(MSG_DEBUG, " seq", seq, seq_len);
  1130. }
  1131. if (key) {
  1132. wpa_hexdump(MSG_DEBUG, " key", key, key_len);
  1133. }
  1134. return 0;
  1135. }
  1136. static int wpa_driver_test_associate(
  1137. void *priv, struct wpa_driver_associate_params *params)
  1138. {
  1139. struct wpa_driver_test_data *drv = priv;
  1140. wpa_printf(MSG_DEBUG, "%s: priv=%p freq=%d pairwise_suite=%d "
  1141. "group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",
  1142. __func__, priv, params->freq, params->pairwise_suite,
  1143. params->group_suite, params->key_mgmt_suite,
  1144. params->auth_alg, params->mode);
  1145. if (params->bssid) {
  1146. wpa_printf(MSG_DEBUG, " bssid=" MACSTR,
  1147. MAC2STR(params->bssid));
  1148. }
  1149. if (params->ssid) {
  1150. wpa_hexdump_ascii(MSG_DEBUG, " ssid",
  1151. params->ssid, params->ssid_len);
  1152. }
  1153. if (params->wpa_ie) {
  1154. wpa_hexdump(MSG_DEBUG, " wpa_ie",
  1155. params->wpa_ie, params->wpa_ie_len);
  1156. drv->assoc_wpa_ie_len = params->wpa_ie_len;
  1157. if (drv->assoc_wpa_ie_len > sizeof(drv->assoc_wpa_ie))
  1158. drv->assoc_wpa_ie_len = sizeof(drv->assoc_wpa_ie);
  1159. os_memcpy(drv->assoc_wpa_ie, params->wpa_ie,
  1160. drv->assoc_wpa_ie_len);
  1161. } else
  1162. drv->assoc_wpa_ie_len = 0;
  1163. drv->ibss = params->mode == IEEE80211_MODE_IBSS;
  1164. drv->privacy = params->key_mgmt_suite &
  1165. (WPA_KEY_MGMT_IEEE8021X |
  1166. WPA_KEY_MGMT_PSK |
  1167. WPA_KEY_MGMT_WPA_NONE |
  1168. WPA_KEY_MGMT_FT_IEEE8021X |
  1169. WPA_KEY_MGMT_FT_PSK |
  1170. WPA_KEY_MGMT_IEEE8021X_SHA256 |
  1171. WPA_KEY_MGMT_PSK_SHA256);
  1172. if (params->wep_key_len[params->wep_tx_keyidx])
  1173. drv->privacy = 1;
  1174. #ifdef DRIVER_TEST_UNIX
  1175. if (drv->test_dir && params->bssid &&
  1176. params->mode != IEEE80211_MODE_IBSS) {
  1177. os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr));
  1178. drv->hostapd_addr.sun_family = AF_UNIX;
  1179. os_snprintf(drv->hostapd_addr.sun_path,
  1180. sizeof(drv->hostapd_addr.sun_path),
  1181. "%s/AP-" MACSTR,
  1182. drv->test_dir, MAC2STR(params->bssid));
  1183. drv->hostapd_addr_set = 1;
  1184. }
  1185. #endif /* DRIVER_TEST_UNIX */
  1186. if (drv->test_socket >= 0 &&
  1187. (drv->hostapd_addr_set || drv->hostapd_addr_udp_set)) {
  1188. char cmd[200], *pos, *end;
  1189. int ret;
  1190. end = cmd + sizeof(cmd);
  1191. pos = cmd;
  1192. ret = os_snprintf(pos, end - pos, "ASSOC " MACSTR " ",
  1193. MAC2STR(drv->own_addr));
  1194. if (ret >= 0 && ret < end - pos)
  1195. pos += ret;
  1196. pos += wpa_snprintf_hex(pos, end - pos, params->ssid,
  1197. params->ssid_len);
  1198. ret = os_snprintf(pos, end - pos, " ");
  1199. if (ret >= 0 && ret < end - pos)
  1200. pos += ret;
  1201. pos += wpa_snprintf_hex(pos, end - pos, params->wpa_ie,
  1202. params->wpa_ie_len);
  1203. end[-1] = '\0';
  1204. #ifdef DRIVER_TEST_UNIX
  1205. if (drv->hostapd_addr_set &&
  1206. sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
  1207. (struct sockaddr *) &drv->hostapd_addr,
  1208. sizeof(drv->hostapd_addr)) < 0) {
  1209. perror("sendto(test_socket)");
  1210. return -1;
  1211. }
  1212. #endif /* DRIVER_TEST_UNIX */
  1213. if (drv->hostapd_addr_udp_set &&
  1214. sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
  1215. (struct sockaddr *) &drv->hostapd_addr_udp,
  1216. sizeof(drv->hostapd_addr_udp)) < 0) {
  1217. perror("sendto(test_socket)");
  1218. return -1;
  1219. }
  1220. os_memcpy(drv->ssid, params->ssid, params->ssid_len);
  1221. drv->ssid_len = params->ssid_len;
  1222. } else {
  1223. drv->associated = 1;
  1224. if (params->mode == IEEE80211_MODE_IBSS) {
  1225. os_memcpy(drv->ssid, params->ssid, params->ssid_len);
  1226. drv->ssid_len = params->ssid_len;
  1227. if (params->bssid)
  1228. os_memcpy(drv->bssid, params->bssid, ETH_ALEN);
  1229. else {
  1230. os_get_random(drv->bssid, ETH_ALEN);
  1231. drv->bssid[0] &= ~0x01;
  1232. drv->bssid[0] |= 0x02;
  1233. }
  1234. }
  1235. wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
  1236. }
  1237. return 0;
  1238. }
  1239. static int wpa_driver_test_get_bssid(void *priv, u8 *bssid)
  1240. {
  1241. struct wpa_driver_test_data *drv = priv;
  1242. os_memcpy(bssid, drv->bssid, ETH_ALEN);
  1243. return 0;
  1244. }
  1245. static int wpa_driver_test_get_ssid(void *priv, u8 *ssid)
  1246. {
  1247. struct wpa_driver_test_data *drv = priv;
  1248. os_memcpy(ssid, drv->ssid, 32);
  1249. return drv->ssid_len;
  1250. }
  1251. static int wpa_driver_test_send_disassoc(struct wpa_driver_test_data *drv)
  1252. {
  1253. #ifdef DRIVER_TEST_UNIX
  1254. if (drv->test_socket >= 0 &&
  1255. sendto(drv->test_socket, "DISASSOC", 8, 0,
  1256. (struct sockaddr *) &drv->hostapd_addr,
  1257. sizeof(drv->hostapd_addr)) < 0) {
  1258. perror("sendto(test_socket)");
  1259. return -1;
  1260. }
  1261. #endif /* DRIVER_TEST_UNIX */
  1262. if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set &&
  1263. sendto(drv->test_socket, "DISASSOC", 8, 0,
  1264. (struct sockaddr *) &drv->hostapd_addr_udp,
  1265. sizeof(drv->hostapd_addr_udp)) < 0) {
  1266. perror("sendto(test_socket)");
  1267. return -1;
  1268. }
  1269. return 0;
  1270. }
  1271. static int wpa_driver_test_deauthenticate(void *priv, const u8 *addr,
  1272. int reason_code)
  1273. {
  1274. struct wpa_driver_test_data *drv = priv;
  1275. wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
  1276. __func__, MAC2STR(addr), reason_code);
  1277. os_memset(drv->bssid, 0, ETH_ALEN);
  1278. drv->associated = 0;
  1279. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  1280. return wpa_driver_test_send_disassoc(drv);
  1281. }
  1282. static int wpa_driver_test_disassociate(void *priv, const u8 *addr,
  1283. int reason_code)
  1284. {
  1285. struct wpa_driver_test_data *drv = priv;
  1286. wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
  1287. __func__, MAC2STR(addr), reason_code);
  1288. os_memset(drv->bssid, 0, ETH_ALEN);
  1289. drv->associated = 0;
  1290. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  1291. return wpa_driver_test_send_disassoc(drv);
  1292. }
  1293. static void wpa_driver_test_scanresp(struct wpa_driver_test_data *drv,
  1294. struct sockaddr *from,
  1295. socklen_t fromlen,
  1296. const char *data)
  1297. {
  1298. struct wpa_scan_res *res;
  1299. const char *pos, *pos2;
  1300. size_t len;
  1301. u8 *ie_pos, *ie_start, *ie_end;
  1302. #define MAX_IE_LEN 1000
  1303. wpa_printf(MSG_DEBUG, "test_driver: SCANRESP %s", data);
  1304. if (drv->num_scanres >= MAX_SCAN_RESULTS) {
  1305. wpa_printf(MSG_DEBUG, "test_driver: No room for the new scan "
  1306. "result");
  1307. return;
  1308. }
  1309. /* SCANRESP BSSID SSID IEs */
  1310. res = os_zalloc(sizeof(*res) + MAX_IE_LEN);
  1311. if (res == NULL)
  1312. return;
  1313. ie_start = ie_pos = (u8 *) (res + 1);
  1314. ie_end = ie_pos + MAX_IE_LEN;
  1315. if (hwaddr_aton(data, res->bssid)) {
  1316. wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in scanres");
  1317. os_free(res);
  1318. return;
  1319. }
  1320. pos = data + 17;
  1321. while (*pos == ' ')
  1322. pos++;
  1323. pos2 = os_strchr(pos, ' ');
  1324. if (pos2 == NULL) {
  1325. wpa_printf(MSG_DEBUG, "test_driver: invalid SSID termination "
  1326. "in scanres");
  1327. os_free(res);
  1328. return;
  1329. }
  1330. len = (pos2 - pos) / 2;
  1331. if (len > 32)
  1332. len = 32;
  1333. /*
  1334. * Generate SSID IE from the SSID field since this IE is not included
  1335. * in the main IE field.
  1336. */
  1337. *ie_pos++ = WLAN_EID_SSID;
  1338. *ie_pos++ = len;
  1339. if (hexstr2bin(pos, ie_pos, len) < 0) {
  1340. wpa_printf(MSG_DEBUG, "test_driver: invalid SSID in scanres");
  1341. os_free(res);
  1342. return;
  1343. }
  1344. ie_pos += len;
  1345. pos = pos2 + 1;
  1346. pos2 = os_strchr(pos, ' ');
  1347. if (pos2 == NULL)
  1348. len = os_strlen(pos) / 2;
  1349. else
  1350. len = (pos2 - pos) / 2;
  1351. if ((int) len > ie_end - ie_pos)
  1352. len = ie_end - ie_pos;
  1353. if (hexstr2bin(pos, ie_pos, len) < 0) {
  1354. wpa_printf(MSG_DEBUG, "test_driver: invalid IEs in scanres");
  1355. os_free(res);
  1356. return;
  1357. }
  1358. ie_pos += len;
  1359. res->ie_len = ie_pos - ie_start;
  1360. if (pos2) {
  1361. pos = pos2 + 1;
  1362. while (*pos == ' ')
  1363. pos++;
  1364. if (os_strstr(pos, "PRIVACY"))
  1365. res->caps |= IEEE80211_CAP_PRIVACY;
  1366. if (os_strstr(pos, "IBSS"))
  1367. res->caps |= IEEE80211_CAP_IBSS;
  1368. }
  1369. os_free(drv->scanres[drv->num_scanres]);
  1370. drv->scanres[drv->num_scanres++] = res;
  1371. }
  1372. static void wpa_driver_test_assocresp(struct wpa_driver_test_data *drv,
  1373. struct sockaddr *from,
  1374. socklen_t fromlen,
  1375. const char *data)
  1376. {
  1377. /* ASSOCRESP BSSID <res> */
  1378. if (hwaddr_aton(data, drv->bssid)) {
  1379. wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in "
  1380. "assocresp");
  1381. }
  1382. if (drv->use_associnfo) {
  1383. union wpa_event_data event;
  1384. os_memset(&event, 0, sizeof(event));
  1385. event.assoc_info.req_ies = drv->assoc_wpa_ie;
  1386. event.assoc_info.req_ies_len = drv->assoc_wpa_ie_len;
  1387. wpa_supplicant_event(drv->ctx, EVENT_ASSOCINFO, &event);
  1388. }
  1389. drv->associated = 1;
  1390. wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
  1391. }
  1392. static void wpa_driver_test_disassoc(struct wpa_driver_test_data *drv,
  1393. struct sockaddr *from,
  1394. socklen_t fromlen)
  1395. {
  1396. drv->associated = 0;
  1397. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  1398. }
  1399. static void wpa_driver_test_eapol(struct wpa_driver_test_data *drv,
  1400. struct sockaddr *from,
  1401. socklen_t fromlen,
  1402. const u8 *data, size_t data_len)
  1403. {
  1404. const u8 *src = drv->bssid;
  1405. if (data_len > 14) {
  1406. /* Skip Ethernet header */
  1407. src = data + ETH_ALEN;
  1408. data += 14;
  1409. data_len -= 14;
  1410. }
  1411. wpa_supplicant_rx_eapol(drv->ctx, src, data, data_len);
  1412. }
  1413. static void wpa_driver_test_mlme(struct wpa_driver_test_data *drv,
  1414. struct sockaddr *from,
  1415. socklen_t fromlen,
  1416. const u8 *data, size_t data_len)
  1417. {
  1418. #ifdef CONFIG_CLIENT_MLME
  1419. struct ieee80211_rx_status rx_status;
  1420. os_memset(&rx_status, 0, sizeof(rx_status));
  1421. wpa_supplicant_sta_rx(drv->ctx, data, data_len, &rx_status);
  1422. #endif /* CONFIG_CLIENT_MLME */
  1423. }
  1424. static void wpa_driver_test_scan_cmd(struct wpa_driver_test_data *drv,
  1425. struct sockaddr *from,
  1426. socklen_t fromlen,
  1427. const u8 *data, size_t data_len)
  1428. {
  1429. char buf[512], *pos, *end;
  1430. int ret;
  1431. /* data: optional [ STA-addr | ' ' | IEs(hex) ] */
  1432. if (!drv->ibss)
  1433. return;
  1434. pos = buf;
  1435. end = buf + sizeof(buf);
  1436. /* reply: SCANRESP BSSID SSID IEs */
  1437. ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
  1438. MAC2STR(drv->bssid));
  1439. if (ret < 0 || ret >= end - pos)
  1440. return;
  1441. pos += ret;
  1442. pos += wpa_snprintf_hex(pos, end - pos,
  1443. drv->ssid, drv->ssid_len);
  1444. ret = snprintf(pos, end - pos, " ");
  1445. if (ret < 0 || ret >= end - pos)
  1446. return;
  1447. pos += ret;
  1448. pos += wpa_snprintf_hex(pos, end - pos, drv->assoc_wpa_ie,
  1449. drv->assoc_wpa_ie_len);
  1450. if (drv->privacy) {
  1451. ret = snprintf(pos, end - pos, " PRIVACY");
  1452. if (ret < 0 || ret >= end - pos)
  1453. return;
  1454. pos += ret;
  1455. }
  1456. ret = snprintf(pos, end - pos, " IBSS");
  1457. if (ret < 0 || ret >= end - pos)
  1458. return;
  1459. pos += ret;
  1460. sendto(drv->test_socket, buf, pos - buf, 0,
  1461. (struct sockaddr *) from, fromlen);
  1462. }
  1463. static void wpa_driver_test_receive_unix(int sock, void *eloop_ctx,
  1464. void *sock_ctx)
  1465. {
  1466. struct wpa_driver_test_data *drv = eloop_ctx;
  1467. char *buf;
  1468. int res;
  1469. struct sockaddr_storage from;
  1470. socklen_t fromlen = sizeof(from);
  1471. const size_t buflen = 2000;
  1472. buf = os_malloc(buflen);
  1473. if (buf == NULL)
  1474. return;
  1475. res = recvfrom(sock, buf, buflen - 1, 0,
  1476. (struct sockaddr *) &from, &fromlen);
  1477. if (res < 0) {
  1478. perror("recvfrom(test_socket)");
  1479. os_free(buf);
  1480. return;
  1481. }
  1482. buf[res] = '\0';
  1483. wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res);
  1484. if (os_strncmp(buf, "SCANRESP ", 9) == 0) {
  1485. wpa_driver_test_scanresp(drv, (struct sockaddr *) &from,
  1486. fromlen, buf + 9);
  1487. } else if (os_strncmp(buf, "ASSOCRESP ", 10) == 0) {
  1488. wpa_driver_test_assocresp(drv, (struct sockaddr *) &from,
  1489. fromlen, buf + 10);
  1490. } else if (os_strcmp(buf, "DISASSOC") == 0) {
  1491. wpa_driver_test_disassoc(drv, (struct sockaddr *) &from,
  1492. fromlen);
  1493. } else if (os_strcmp(buf, "DEAUTH") == 0) {
  1494. wpa_driver_test_disassoc(drv, (struct sockaddr *) &from,
  1495. fromlen);
  1496. } else if (os_strncmp(buf, "EAPOL ", 6) == 0) {
  1497. wpa_driver_test_eapol(drv, (struct sockaddr *) &from, fromlen,
  1498. (const u8 *) buf + 6, res - 6);
  1499. } else if (os_strncmp(buf, "MLME ", 5) == 0) {
  1500. wpa_driver_test_mlme(drv, (struct sockaddr *) &from, fromlen,
  1501. (const u8 *) buf + 5, res - 5);
  1502. } else if (os_strncmp(buf, "SCAN ", 5) == 0) {
  1503. wpa_driver_test_scan_cmd(drv, (struct sockaddr *) &from,
  1504. fromlen,
  1505. (const u8 *) buf + 5, res - 5);
  1506. } else {
  1507. wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command",
  1508. (u8 *) buf, res);
  1509. }
  1510. os_free(buf);
  1511. }
  1512. static void * wpa_driver_test_init2(void *ctx, const char *ifname,
  1513. void *global_priv)
  1514. {
  1515. struct wpa_driver_test_data *drv;
  1516. drv = os_zalloc(sizeof(*drv));
  1517. if (drv == NULL)
  1518. return NULL;
  1519. drv->global = global_priv;
  1520. drv->ctx = ctx;
  1521. drv->test_socket = -1;
  1522. /* Set dummy BSSID and SSID for testing. */
  1523. drv->bssid[0] = 0x02;
  1524. drv->bssid[1] = 0x00;
  1525. drv->bssid[2] = 0x00;
  1526. drv->bssid[3] = 0x00;
  1527. drv->bssid[4] = 0x00;
  1528. drv->bssid[5] = 0x01;
  1529. os_memcpy(drv->ssid, "test", 5);
  1530. drv->ssid_len = 4;
  1531. /* Generate a MAC address to help testing with multiple STAs */
  1532. drv->own_addr[0] = 0x02; /* locally administered */
  1533. sha1_prf((const u8 *) ifname, os_strlen(ifname),
  1534. "wpa_supplicant test mac addr generation",
  1535. NULL, 0, drv->own_addr + 1, ETH_ALEN - 1);
  1536. eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL);
  1537. return drv;
  1538. }
  1539. static void wpa_driver_test_close_test_socket(struct wpa_driver_test_data *drv)
  1540. {
  1541. if (drv->test_socket >= 0) {
  1542. eloop_unregister_read_sock(drv->test_socket);
  1543. close(drv->test_socket);
  1544. drv->test_socket = -1;
  1545. }
  1546. if (drv->own_socket_path) {
  1547. unlink(drv->own_socket_path);
  1548. os_free(drv->own_socket_path);
  1549. drv->own_socket_path = NULL;
  1550. }
  1551. }
  1552. static void wpa_driver_test_deinit(void *priv)
  1553. {
  1554. struct wpa_driver_test_data *drv = priv;
  1555. int i;
  1556. wpa_driver_test_close_test_socket(drv);
  1557. eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx);
  1558. eloop_cancel_timeout(wpa_driver_test_poll, drv, NULL);
  1559. os_free(drv->test_dir);
  1560. for (i = 0; i < MAX_SCAN_RESULTS; i++)
  1561. os_free(drv->scanres[i]);
  1562. os_free(drv->probe_req_ie);
  1563. os_free(drv);
  1564. }
  1565. static int wpa_driver_test_attach(struct wpa_driver_test_data *drv,
  1566. const char *dir)
  1567. {
  1568. #ifdef DRIVER_TEST_UNIX
  1569. static unsigned int counter = 0;
  1570. struct sockaddr_un addr;
  1571. size_t len;
  1572. os_free(drv->own_socket_path);
  1573. if (dir) {
  1574. len = os_strlen(dir) + 30;
  1575. drv->own_socket_path = os_malloc(len);
  1576. if (drv->own_socket_path == NULL)
  1577. return -1;
  1578. os_snprintf(drv->own_socket_path, len, "%s/STA-" MACSTR,
  1579. dir, MAC2STR(drv->own_addr));
  1580. } else {
  1581. drv->own_socket_path = os_malloc(100);
  1582. if (drv->own_socket_path == NULL)
  1583. return -1;
  1584. os_snprintf(drv->own_socket_path, 100,
  1585. "/tmp/wpa_supplicant_test-%d-%d",
  1586. getpid(), counter++);
  1587. }
  1588. drv->test_socket = socket(PF_UNIX, SOCK_DGRAM, 0);
  1589. if (drv->test_socket < 0) {
  1590. perror("socket(PF_UNIX)");
  1591. os_free(drv->own_socket_path);
  1592. drv->own_socket_path = NULL;
  1593. return -1;
  1594. }
  1595. os_memset(&addr, 0, sizeof(addr));
  1596. addr.sun_family = AF_UNIX;
  1597. os_strlcpy(addr.sun_path, drv->own_socket_path, sizeof(addr.sun_path));
  1598. if (bind(drv->test_socket, (struct sockaddr *) &addr,
  1599. sizeof(addr)) < 0) {
  1600. perror("bind(PF_UNIX)");
  1601. close(drv->test_socket);
  1602. unlink(drv->own_socket_path);
  1603. os_free(drv->own_socket_path);
  1604. drv->own_socket_path = NULL;
  1605. return -1;
  1606. }
  1607. eloop_register_read_sock(drv->test_socket,
  1608. wpa_driver_test_receive_unix, drv, NULL);
  1609. return 0;
  1610. #else /* DRIVER_TEST_UNIX */
  1611. return -1;
  1612. #endif /* DRIVER_TEST_UNIX */
  1613. }
  1614. static int wpa_driver_test_attach_udp(struct wpa_driver_test_data *drv,
  1615. char *dst)
  1616. {
  1617. char *pos;
  1618. pos = os_strchr(dst, ':');
  1619. if (pos == NULL)
  1620. return -1;
  1621. *pos++ = '\0';
  1622. wpa_printf(MSG_DEBUG, "%s: addr=%s port=%s", __func__, dst, pos);
  1623. drv->test_socket = socket(PF_INET, SOCK_DGRAM, 0);
  1624. if (drv->test_socket < 0) {
  1625. perror("socket(PF_INET)");
  1626. return -1;
  1627. }
  1628. os_memset(&drv->hostapd_addr_udp, 0, sizeof(drv->hostapd_addr_udp));
  1629. drv->hostapd_addr_udp.sin_family = AF_INET;
  1630. #if defined(CONFIG_NATIVE_WINDOWS) || defined(CONFIG_ANSI_C_EXTRA)
  1631. {
  1632. int a[4];
  1633. u8 *pos;
  1634. sscanf(dst, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]);
  1635. pos = (u8 *) &drv->hostapd_addr_udp.sin_addr;
  1636. *pos++ = a[0];
  1637. *pos++ = a[1];
  1638. *pos++ = a[2];
  1639. *pos++ = a[3];
  1640. }
  1641. #else /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
  1642. inet_aton(dst, &drv->hostapd_addr_udp.sin_addr);
  1643. #endif /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
  1644. drv->hostapd_addr_udp.sin_port = htons(atoi(pos));
  1645. drv->hostapd_addr_udp_set = 1;
  1646. eloop_register_read_sock(drv->test_socket,
  1647. wpa_driver_test_receive_unix, drv, NULL);
  1648. return 0;
  1649. }
  1650. static int wpa_driver_test_set_param(void *priv, const char *param)
  1651. {
  1652. struct wpa_driver_test_data *drv = priv;
  1653. const char *pos;
  1654. wpa_printf(MSG_DEBUG, "%s: param='%s'", __func__, param);
  1655. if (param == NULL)
  1656. return 0;
  1657. wpa_driver_test_close_test_socket(drv);
  1658. #ifdef DRIVER_TEST_UNIX
  1659. pos = os_strstr(param, "test_socket=");
  1660. if (pos) {
  1661. const char *pos2;
  1662. size_t len;
  1663. pos += 12;
  1664. pos2 = os_strchr(pos, ' ');
  1665. if (pos2)
  1666. len = pos2 - pos;
  1667. else
  1668. len = os_strlen(pos);
  1669. if (len > sizeof(drv->hostapd_addr.sun_path))
  1670. return -1;
  1671. os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr));
  1672. drv->hostapd_addr.sun_family = AF_UNIX;
  1673. os_memcpy(drv->hostapd_addr.sun_path, pos, len);
  1674. drv->hostapd_addr_set = 1;
  1675. }
  1676. #endif /* DRIVER_TEST_UNIX */
  1677. pos = os_strstr(param, "test_dir=");
  1678. if (pos) {
  1679. char *end;
  1680. os_free(drv->test_dir);
  1681. drv->test_dir = os_strdup(pos + 9);
  1682. if (drv->test_dir == NULL)
  1683. return -1;
  1684. end = os_strchr(drv->test_dir, ' ');
  1685. if (end)
  1686. *end = '\0';
  1687. if (wpa_driver_test_attach(drv, drv->test_dir))
  1688. return -1;
  1689. } else {
  1690. pos = os_strstr(param, "test_udp=");
  1691. if (pos) {
  1692. char *dst, *epos;
  1693. dst = os_strdup(pos + 9);
  1694. if (dst == NULL)
  1695. return -1;
  1696. epos = os_strchr(dst, ' ');
  1697. if (epos)
  1698. *epos = '\0';
  1699. if (wpa_driver_test_attach_udp(drv, dst))
  1700. return -1;
  1701. os_free(dst);
  1702. } else if (wpa_driver_test_attach(drv, NULL))
  1703. return -1;
  1704. }
  1705. if (os_strstr(param, "use_associnfo=1")) {
  1706. wpa_printf(MSG_DEBUG, "test_driver: Use AssocInfo events");
  1707. drv->use_associnfo = 1;
  1708. }
  1709. #ifdef CONFIG_CLIENT_MLME
  1710. if (os_strstr(param, "use_mlme=1")) {
  1711. wpa_printf(MSG_DEBUG, "test_driver: Use internal MLME");
  1712. drv->use_mlme = 1;
  1713. }
  1714. #endif /* CONFIG_CLIENT_MLME */
  1715. return 0;
  1716. }
  1717. static const u8 * wpa_driver_test_get_mac_addr(void *priv)
  1718. {
  1719. struct wpa_driver_test_data *drv = priv;
  1720. wpa_printf(MSG_DEBUG, "%s", __func__);
  1721. return drv->own_addr;
  1722. }
  1723. static int wpa_driver_test_send_eapol(void *priv, const u8 *dest, u16 proto,
  1724. const u8 *data, size_t data_len)
  1725. {
  1726. struct wpa_driver_test_data *drv = priv;
  1727. char *msg;
  1728. size_t msg_len;
  1729. struct l2_ethhdr eth;
  1730. struct sockaddr *addr;
  1731. socklen_t alen;
  1732. #ifdef DRIVER_TEST_UNIX
  1733. struct sockaddr_un addr_un;
  1734. #endif /* DRIVER_TEST_UNIX */
  1735. wpa_hexdump(MSG_MSGDUMP, "test_send_eapol TX frame", data, data_len);
  1736. os_memset(&eth, 0, sizeof(eth));
  1737. os_memcpy(eth.h_dest, dest, ETH_ALEN);
  1738. os_memcpy(eth.h_source, drv->own_addr, ETH_ALEN);
  1739. eth.h_proto = host_to_be16(proto);
  1740. msg_len = 6 + sizeof(eth) + data_len;
  1741. msg = os_malloc(msg_len);
  1742. if (msg == NULL)
  1743. return -1;
  1744. os_memcpy(msg, "EAPOL ", 6);
  1745. os_memcpy(msg + 6, &eth, sizeof(eth));
  1746. os_memcpy(msg + 6 + sizeof(eth), data, data_len);
  1747. if (os_memcmp(dest, drv->bssid, ETH_ALEN) == 0 ||
  1748. drv->test_dir == NULL) {
  1749. if (drv->hostapd_addr_udp_set) {
  1750. addr = (struct sockaddr *) &drv->hostapd_addr_udp;
  1751. alen = sizeof(drv->hostapd_addr_udp);
  1752. } else {
  1753. #ifdef DRIVER_TEST_UNIX
  1754. addr = (struct sockaddr *) &drv->hostapd_addr;
  1755. alen = sizeof(drv->hostapd_addr);
  1756. #else /* DRIVER_TEST_UNIX */
  1757. os_free(msg);
  1758. return -1;
  1759. #endif /* DRIVER_TEST_UNIX */
  1760. }
  1761. } else {
  1762. #ifdef DRIVER_TEST_UNIX
  1763. struct stat st;
  1764. os_memset(&addr_un, 0, sizeof(addr_un));
  1765. addr_un.sun_family = AF_UNIX;
  1766. os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path),
  1767. "%s/STA-" MACSTR, drv->test_dir, MAC2STR(dest));
  1768. if (stat(addr_un.sun_path, &st) < 0) {
  1769. os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path),
  1770. "%s/AP-" MACSTR,
  1771. drv->test_dir, MAC2STR(dest));
  1772. }
  1773. addr = (struct sockaddr *) &addr_un;
  1774. alen = sizeof(addr_un);
  1775. #else /* DRIVER_TEST_UNIX */
  1776. os_free(msg);
  1777. return -1;
  1778. #endif /* DRIVER_TEST_UNIX */
  1779. }
  1780. if (sendto(drv->test_socket, msg, msg_len, 0, addr, alen) < 0) {
  1781. perror("sendmsg(test_socket)");
  1782. os_free(msg);
  1783. return -1;
  1784. }
  1785. os_free(msg);
  1786. return 0;
  1787. }
  1788. static int wpa_driver_test_get_capa(void *priv, struct wpa_driver_capa *capa)
  1789. {
  1790. struct wpa_driver_test_data *drv = priv;
  1791. os_memset(capa, 0, sizeof(*capa));
  1792. capa->key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA |
  1793. WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
  1794. WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
  1795. WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK |
  1796. WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE |
  1797. WPA_DRIVER_CAPA_KEY_MGMT_FT |
  1798. WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK;
  1799. capa->enc = WPA_DRIVER_CAPA_ENC_WEP40 |
  1800. WPA_DRIVER_CAPA_ENC_WEP104 |
  1801. WPA_DRIVER_CAPA_ENC_TKIP |
  1802. WPA_DRIVER_CAPA_ENC_CCMP;
  1803. capa->auth = WPA_DRIVER_AUTH_OPEN |
  1804. WPA_DRIVER_AUTH_SHARED |
  1805. WPA_DRIVER_AUTH_LEAP;
  1806. if (drv->use_mlme)
  1807. capa->flags |= WPA_DRIVER_FLAGS_USER_SPACE_MLME;
  1808. capa->max_scan_ssids = 2;
  1809. return 0;
  1810. }
  1811. static int wpa_driver_test_mlme_setprotection(void *priv, const u8 *addr,
  1812. int protect_type,
  1813. int key_type)
  1814. {
  1815. wpa_printf(MSG_DEBUG, "%s: protect_type=%d key_type=%d",
  1816. __func__, protect_type, key_type);
  1817. if (addr) {
  1818. wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR,
  1819. __func__, MAC2STR(addr));
  1820. }
  1821. return 0;
  1822. }
  1823. #ifdef CONFIG_CLIENT_MLME
  1824. static int wpa_driver_test_set_channel(void *priv, hostapd_hw_mode phymode,
  1825. int chan, int freq)
  1826. {
  1827. wpa_printf(MSG_DEBUG, "%s: phymode=%d chan=%d freq=%d",
  1828. __func__, phymode, chan, freq);
  1829. return 0;
  1830. }
  1831. static int wpa_driver_test_send_mlme(void *priv, const u8 *data,
  1832. size_t data_len)
  1833. {
  1834. struct wpa_driver_test_data *drv = priv;
  1835. struct msghdr msg;
  1836. struct iovec io[2];
  1837. struct sockaddr_un addr;
  1838. const u8 *dest;
  1839. struct dirent *dent;
  1840. DIR *dir;
  1841. wpa_hexdump(MSG_MSGDUMP, "test_send_mlme", data, data_len);
  1842. if (data_len < 10)
  1843. return -1;
  1844. dest = data + 4;
  1845. io[0].iov_base = "MLME ";
  1846. io[0].iov_len = 5;
  1847. io[1].iov_base = (u8 *) data;
  1848. io[1].iov_len = data_len;
  1849. os_memset(&msg, 0, sizeof(msg));
  1850. msg.msg_iov = io;
  1851. msg.msg_iovlen = 2;
  1852. if (os_memcmp(dest, drv->bssid, ETH_ALEN) == 0 ||
  1853. drv->test_dir == NULL) {
  1854. if (drv->hostapd_addr_udp_set) {
  1855. msg.msg_name = &drv->hostapd_addr_udp;
  1856. msg.msg_namelen = sizeof(drv->hostapd_addr_udp);
  1857. } else {
  1858. #ifdef DRIVER_TEST_UNIX
  1859. msg.msg_name = &drv->hostapd_addr;
  1860. msg.msg_namelen = sizeof(drv->hostapd_addr);
  1861. #endif /* DRIVER_TEST_UNIX */
  1862. }
  1863. } else if (os_memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0)
  1864. {
  1865. dir = opendir(drv->test_dir);
  1866. if (dir == NULL)
  1867. return -1;
  1868. while ((dent = readdir(dir))) {
  1869. #ifdef _DIRENT_HAVE_D_TYPE
  1870. /* Skip the file if it is not a socket.
  1871. * Also accept DT_UNKNOWN (0) in case
  1872. * the C library or underlying file
  1873. * system does not support d_type. */
  1874. if (dent->d_type != DT_SOCK &&
  1875. dent->d_type != DT_UNKNOWN)
  1876. continue;
  1877. #endif /* _DIRENT_HAVE_D_TYPE */
  1878. if (os_strcmp(dent->d_name, ".") == 0 ||
  1879. os_strcmp(dent->d_name, "..") == 0)
  1880. continue;
  1881. wpa_printf(MSG_DEBUG, "%s: Send broadcast MLME to %s",
  1882. __func__, dent->d_name);
  1883. os_memset(&addr, 0, sizeof(addr));
  1884. addr.sun_family = AF_UNIX;
  1885. os_snprintf(addr.sun_path, sizeof(addr.sun_path),
  1886. "%s/%s", drv->test_dir, dent->d_name);
  1887. msg.msg_name = &addr;
  1888. msg.msg_namelen = sizeof(addr);
  1889. if (sendmsg(drv->test_socket, &msg, 0) < 0)
  1890. perror("sendmsg(test_socket)");
  1891. }
  1892. closedir(dir);
  1893. return 0;
  1894. } else {
  1895. struct stat st;
  1896. os_memset(&addr, 0, sizeof(addr));
  1897. addr.sun_family = AF_UNIX;
  1898. os_snprintf(addr.sun_path, sizeof(addr.sun_path),
  1899. "%s/AP-" MACSTR, drv->test_dir, MAC2STR(dest));
  1900. if (stat(addr.sun_path, &st) < 0) {
  1901. os_snprintf(addr.sun_path, sizeof(addr.sun_path),
  1902. "%s/STA-" MACSTR,
  1903. drv->test_dir, MAC2STR(dest));
  1904. }
  1905. msg.msg_name = &addr;
  1906. msg.msg_namelen = sizeof(addr);
  1907. }
  1908. if (sendmsg(drv->test_socket, &msg, 0) < 0) {
  1909. perror("sendmsg(test_socket)");
  1910. return -1;
  1911. }
  1912. return 0;
  1913. }
  1914. static int wpa_driver_test_mlme_add_sta(void *priv, const u8 *addr,
  1915. const u8 *supp_rates,
  1916. size_t supp_rates_len)
  1917. {
  1918. wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr));
  1919. return 0;
  1920. }
  1921. static int wpa_driver_test_mlme_remove_sta(void *priv, const u8 *addr)
  1922. {
  1923. wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr));
  1924. return 0;
  1925. }
  1926. static int wpa_driver_test_set_ssid(void *priv, const u8 *ssid,
  1927. size_t ssid_len)
  1928. {
  1929. wpa_printf(MSG_DEBUG, "%s", __func__);
  1930. return 0;
  1931. }
  1932. static int wpa_driver_test_set_bssid(void *priv, const u8 *bssid)
  1933. {
  1934. wpa_printf(MSG_DEBUG, "%s: bssid=" MACSTR, __func__, MAC2STR(bssid));
  1935. return 0;
  1936. }
  1937. #endif /* CONFIG_CLIENT_MLME */
  1938. static int wpa_driver_test_set_probe_req_ie(void *priv, const u8 *ies,
  1939. size_t ies_len)
  1940. {
  1941. struct wpa_driver_test_data *drv = priv;
  1942. os_free(drv->probe_req_ie);
  1943. if (ies) {
  1944. drv->probe_req_ie = os_malloc(ies_len);
  1945. if (drv->probe_req_ie == NULL) {
  1946. drv->probe_req_ie_len = 0;
  1947. return -1;
  1948. }
  1949. os_memcpy(drv->probe_req_ie, ies, ies_len);
  1950. drv->probe_req_ie_len = ies_len;
  1951. } else {
  1952. drv->probe_req_ie = NULL;
  1953. drv->probe_req_ie_len = 0;
  1954. }
  1955. return 0;
  1956. }
  1957. static void * wpa_driver_test_global_init(void)
  1958. {
  1959. struct wpa_driver_test_global *global;
  1960. global = os_zalloc(sizeof(*global));
  1961. return global;
  1962. }
  1963. static void wpa_driver_test_global_deinit(void *priv)
  1964. {
  1965. struct wpa_driver_test_global *global = priv;
  1966. os_free(global);
  1967. }
  1968. static struct wpa_interface_info *
  1969. wpa_driver_test_get_interfaces(void *global_priv)
  1970. {
  1971. /* struct wpa_driver_test_global *global = priv; */
  1972. struct wpa_interface_info *iface;
  1973. iface = os_zalloc(sizeof(*iface));
  1974. if (iface == NULL)
  1975. return iface;
  1976. iface->ifname = os_strdup("sta0");
  1977. iface->desc = os_strdup("test interface 0");
  1978. iface->drv_name = "test";
  1979. iface->next = os_zalloc(sizeof(*iface));
  1980. if (iface->next) {
  1981. iface->next->ifname = os_strdup("sta1");
  1982. iface->next->desc = os_strdup("test interface 1");
  1983. iface->next->drv_name = "test";
  1984. }
  1985. return iface;
  1986. }
  1987. #endif /* HOSTAPD */
  1988. #if defined(HOSTAPD) || defined(CONFIG_CLIENT_MLME)
  1989. static struct hostapd_hw_modes *
  1990. wpa_driver_test_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
  1991. {
  1992. struct hostapd_hw_modes *modes;
  1993. *num_modes = 3;
  1994. *flags = 0;
  1995. modes = os_zalloc(*num_modes * sizeof(struct hostapd_hw_modes));
  1996. if (modes == NULL)
  1997. return NULL;
  1998. modes[0].mode = HOSTAPD_MODE_IEEE80211G;
  1999. modes[0].num_channels = 1;
  2000. modes[0].num_rates = 1;
  2001. modes[0].channels = os_zalloc(sizeof(struct hostapd_channel_data));
  2002. modes[0].rates = os_zalloc(sizeof(struct hostapd_rate_data));
  2003. if (modes[0].channels == NULL || modes[0].rates == NULL)
  2004. goto fail;
  2005. modes[0].channels[0].chan = 1;
  2006. modes[0].channels[0].freq = 2412;
  2007. modes[0].channels[0].flag = 0;
  2008. modes[0].rates[0].rate = 10;
  2009. modes[0].rates[0].flags = HOSTAPD_RATE_BASIC | HOSTAPD_RATE_SUPPORTED |
  2010. HOSTAPD_RATE_CCK | HOSTAPD_RATE_MANDATORY;
  2011. modes[1].mode = HOSTAPD_MODE_IEEE80211B;
  2012. modes[1].num_channels = 1;
  2013. modes[1].num_rates = 1;
  2014. modes[1].channels = os_zalloc(sizeof(struct hostapd_channel_data));
  2015. modes[1].rates = os_zalloc(sizeof(struct hostapd_rate_data));
  2016. if (modes[1].channels == NULL || modes[1].rates == NULL)
  2017. goto fail;
  2018. modes[1].channels[0].chan = 1;
  2019. modes[1].channels[0].freq = 2412;
  2020. modes[1].channels[0].flag = 0;
  2021. modes[1].rates[0].rate = 10;
  2022. modes[1].rates[0].flags = HOSTAPD_RATE_BASIC | HOSTAPD_RATE_SUPPORTED |
  2023. HOSTAPD_RATE_CCK | HOSTAPD_RATE_MANDATORY;
  2024. modes[2].mode = HOSTAPD_MODE_IEEE80211A;
  2025. modes[2].num_channels = 1;
  2026. modes[2].num_rates = 1;
  2027. modes[2].channels = os_zalloc(sizeof(struct hostapd_channel_data));
  2028. modes[2].rates = os_zalloc(sizeof(struct hostapd_rate_data));
  2029. if (modes[2].channels == NULL || modes[2].rates == NULL)
  2030. goto fail;
  2031. modes[2].channels[0].chan = 60;
  2032. modes[2].channels[0].freq = 5300;
  2033. modes[2].channels[0].flag = 0;
  2034. modes[2].rates[0].rate = 60;
  2035. modes[2].rates[0].flags = HOSTAPD_RATE_BASIC | HOSTAPD_RATE_SUPPORTED |
  2036. HOSTAPD_RATE_MANDATORY;
  2037. return modes;
  2038. fail:
  2039. if (modes) {
  2040. size_t i;
  2041. for (i = 0; i < *num_modes; i++) {
  2042. os_free(modes[i].channels);
  2043. os_free(modes[i].rates);
  2044. }
  2045. os_free(modes);
  2046. }
  2047. return NULL;
  2048. }
  2049. #endif /* HOSTAPD || CONFIG_CLIENT_MLME */
  2050. const struct wpa_driver_ops wpa_driver_test_ops = {
  2051. "test",
  2052. "wpa_supplicant test driver",
  2053. #ifdef HOSTAPD
  2054. .hapd_init = test_driver_init,
  2055. .hapd_deinit = test_driver_deinit,
  2056. .hapd_send_eapol = test_driver_send_eapol,
  2057. .send_mlme = wpa_driver_test_send_mlme,
  2058. .set_generic_elem = test_driver_set_generic_elem,
  2059. .sta_deauth = test_driver_sta_deauth,
  2060. .sta_disassoc = test_driver_sta_disassoc,
  2061. .get_hw_feature_data = wpa_driver_test_get_hw_feature_data,
  2062. .bss_add = test_driver_bss_add,
  2063. .bss_remove = test_driver_bss_remove,
  2064. .if_add = test_driver_if_add,
  2065. .if_update = test_driver_if_update,
  2066. .if_remove = test_driver_if_remove,
  2067. .valid_bss_mask = test_driver_valid_bss_mask,
  2068. .hapd_set_ssid = test_driver_set_ssid,
  2069. .set_privacy = test_driver_set_privacy,
  2070. .hapd_set_key = test_driver_set_key,
  2071. .set_sta_vlan = test_driver_set_sta_vlan,
  2072. .sta_add = test_driver_sta_add,
  2073. .send_ether = test_driver_send_ether,
  2074. .set_wps_beacon_ie = test_driver_set_wps_beacon_ie,
  2075. .set_wps_probe_resp_ie = test_driver_set_wps_probe_resp_ie,
  2076. #else /* HOSTAPD */
  2077. wpa_driver_test_get_bssid,
  2078. wpa_driver_test_get_ssid,
  2079. wpa_driver_test_set_wpa,
  2080. wpa_driver_test_set_key,
  2081. NULL /* init */,
  2082. wpa_driver_test_deinit,
  2083. wpa_driver_test_set_param,
  2084. NULL /* set_countermeasures */,
  2085. NULL /* set_drop_unencrypted */,
  2086. NULL /* scan */,
  2087. NULL /* get_scan_results */,
  2088. wpa_driver_test_deauthenticate,
  2089. wpa_driver_test_disassociate,
  2090. wpa_driver_test_associate,
  2091. NULL /* set_auth_alg */,
  2092. NULL /* add_pmkid */,
  2093. NULL /* remove_pmkid */,
  2094. NULL /* flush_pmkid */,
  2095. wpa_driver_test_get_capa,
  2096. NULL /* poll */,
  2097. NULL /* get_ifname */,
  2098. wpa_driver_test_get_mac_addr,
  2099. wpa_driver_test_send_eapol,
  2100. NULL /* set_operstate */,
  2101. wpa_driver_test_mlme_setprotection,
  2102. #ifdef CONFIG_CLIENT_MLME
  2103. wpa_driver_test_get_hw_feature_data,
  2104. wpa_driver_test_set_channel,
  2105. wpa_driver_test_set_ssid,
  2106. wpa_driver_test_set_bssid,
  2107. wpa_driver_test_send_mlme,
  2108. wpa_driver_test_mlme_add_sta,
  2109. wpa_driver_test_mlme_remove_sta,
  2110. #else /* CONFIG_CLIENT_MLME */
  2111. NULL /* get_hw_feature_data */,
  2112. NULL /* set_channel */,
  2113. NULL /* set_ssid */,
  2114. NULL /* set_bssid */,
  2115. NULL /* send_mlme */,
  2116. NULL /* mlme_add_sta */,
  2117. NULL /* mlme_remove_sta */,
  2118. #endif /* CONFIG_CLIENT_MLME */
  2119. NULL /* update_ft_ies */,
  2120. NULL /* send_ft_action */,
  2121. wpa_driver_test_get_scan_results2,
  2122. wpa_driver_test_set_probe_req_ie,
  2123. NULL /* set_mode */,
  2124. NULL /* set_country */,
  2125. wpa_driver_test_global_init,
  2126. wpa_driver_test_global_deinit,
  2127. wpa_driver_test_init2,
  2128. wpa_driver_test_get_interfaces,
  2129. wpa_driver_test_scan,
  2130. NULL /* authenticate */,
  2131. NULL /* set_beacon */,
  2132. NULL /* set_beacon_int */,
  2133. NULL /* hapd_init */,
  2134. NULL /* hapd_deinit */,
  2135. NULL /* set_ieee8021x */,
  2136. NULL /* set_privacy */,
  2137. NULL /* hapd_set_key */,
  2138. NULL /* get_seqnum */,
  2139. NULL /* get_seqnum_igtk */,
  2140. NULL /* flush */,
  2141. NULL /* set_generic_elem */,
  2142. NULL /* read_sta_data */,
  2143. NULL /* hapd_send_eapol */,
  2144. NULL /* sta_deauth */,
  2145. NULL /* sta_disassoc */,
  2146. NULL /* sta_remove */,
  2147. NULL /* hapd_get_ssid */,
  2148. NULL /* hapd_set_ssid */,
  2149. NULL /* hapd_set_countermeasures */,
  2150. NULL /* sta_add */,
  2151. NULL /* get_inact_sec */,
  2152. NULL /* sta_clear_stats */,
  2153. NULL /* set_freq */,
  2154. NULL /* set_rts */,
  2155. NULL /* set_frag */,
  2156. NULL /* set_retry */,
  2157. NULL /* sta_set_flags */,
  2158. NULL /* set_rate_sets */,
  2159. NULL /* set_ieee80211d */,
  2160. NULL /* hapd_set_beacon */,
  2161. NULL /* set_internal_bridge */,
  2162. NULL /* set_broadcast_ssid */,
  2163. NULL /* set_cts_protect */,
  2164. NULL /* set_preamble */,
  2165. NULL /* set_short_slot_time */,
  2166. NULL /* set_tx_queue_params */,
  2167. NULL /* bss_add */,
  2168. NULL /* bss_remove */,
  2169. NULL /* valid_bss_mask */,
  2170. NULL /* passive_scan */,
  2171. NULL /* if_add */,
  2172. NULL /* if_update */,
  2173. NULL /* if_remove */,
  2174. NULL /* set_sta_vlan */,
  2175. NULL /* commit */,
  2176. NULL /* send_ether */,
  2177. NULL /* set_radius_acl_auth */,
  2178. NULL /* set_radius_acl_expire */,
  2179. NULL /* set_ht_params */,
  2180. NULL /* set_wps_beacon_ie */,
  2181. NULL /* set_wps_probe_resp_ie */
  2182. #endif /* HOSTAPD */
  2183. };