driver_test.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320
  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 dure 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. struct wpa_driver_test_global {
  33. int dummy;
  34. };
  35. struct wpa_driver_test_data {
  36. struct wpa_driver_test_global *global;
  37. void *ctx;
  38. u8 own_addr[ETH_ALEN];
  39. int test_socket;
  40. #ifdef DRIVER_TEST_UNIX
  41. struct sockaddr_un hostapd_addr;
  42. #endif /* DRIVER_TEST_UNIX */
  43. int hostapd_addr_set;
  44. struct sockaddr_in hostapd_addr_udp;
  45. int hostapd_addr_udp_set;
  46. char *own_socket_path;
  47. char *test_dir;
  48. u8 bssid[ETH_ALEN];
  49. u8 ssid[32];
  50. size_t ssid_len;
  51. #define MAX_SCAN_RESULTS 30
  52. struct wpa_scan_res *scanres[MAX_SCAN_RESULTS];
  53. size_t num_scanres;
  54. int use_associnfo;
  55. u8 assoc_wpa_ie[80];
  56. size_t assoc_wpa_ie_len;
  57. int use_mlme;
  58. int associated;
  59. u8 *probe_req_ie;
  60. size_t probe_req_ie_len;
  61. int ibss;
  62. int privacy;
  63. };
  64. static void wpa_driver_test_poll(void *eloop_ctx, void *timeout_ctx)
  65. {
  66. struct wpa_driver_test_data *drv = eloop_ctx;
  67. #ifdef DRIVER_TEST_UNIX
  68. if (drv->associated && drv->hostapd_addr_set) {
  69. struct stat st;
  70. if (stat(drv->hostapd_addr.sun_path, &st) < 0) {
  71. wpa_printf(MSG_DEBUG, "%s: lost connection to AP: %s",
  72. __func__, strerror(errno));
  73. drv->associated = 0;
  74. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  75. }
  76. }
  77. #endif /* DRIVER_TEST_UNIX */
  78. eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL);
  79. }
  80. static int wpa_driver_test_set_wpa(void *priv, int enabled)
  81. {
  82. wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, enabled);
  83. return 0;
  84. }
  85. static void wpa_driver_test_scan_timeout(void *eloop_ctx, void *timeout_ctx)
  86. {
  87. wpa_printf(MSG_DEBUG, "Scan timeout - try to get results");
  88. wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
  89. }
  90. #ifdef DRIVER_TEST_UNIX
  91. static void wpa_driver_scan_dir(struct wpa_driver_test_data *drv,
  92. const char *path)
  93. {
  94. struct dirent *dent;
  95. DIR *dir;
  96. struct sockaddr_un addr;
  97. char cmd[512], *pos, *end;
  98. int ret;
  99. dir = opendir(path);
  100. if (dir == NULL)
  101. return;
  102. end = cmd + sizeof(cmd);
  103. pos = cmd;
  104. ret = os_snprintf(pos, end - pos, "SCAN " MACSTR,
  105. MAC2STR(drv->own_addr));
  106. if (ret >= 0 && ret < end - pos)
  107. pos += ret;
  108. if (drv->probe_req_ie) {
  109. ret = os_snprintf(pos, end - pos, " ");
  110. if (ret >= 0 && ret < end - pos)
  111. pos += ret;
  112. pos += wpa_snprintf_hex(pos, end - pos, drv->probe_req_ie,
  113. drv->probe_req_ie_len);
  114. }
  115. end[-1] = '\0';
  116. while ((dent = readdir(dir))) {
  117. if (os_strncmp(dent->d_name, "AP-", 3) != 0 &&
  118. os_strncmp(dent->d_name, "STA-", 4) != 0)
  119. continue;
  120. if (drv->own_socket_path) {
  121. size_t olen, dlen;
  122. olen = os_strlen(drv->own_socket_path);
  123. dlen = os_strlen(dent->d_name);
  124. if (olen >= dlen &&
  125. os_strcmp(dent->d_name,
  126. drv->own_socket_path + olen - dlen) == 0)
  127. continue;
  128. }
  129. wpa_printf(MSG_DEBUG, "%s: SCAN %s", __func__, dent->d_name);
  130. os_memset(&addr, 0, sizeof(addr));
  131. addr.sun_family = AF_UNIX;
  132. os_snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/%s",
  133. path, dent->d_name);
  134. if (sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
  135. (struct sockaddr *) &addr, sizeof(addr)) < 0) {
  136. perror("sendto(test_socket)");
  137. }
  138. }
  139. closedir(dir);
  140. }
  141. #endif /* DRIVER_TEST_UNIX */
  142. static int wpa_driver_test_scan(void *priv, const u8 *ssid, size_t ssid_len)
  143. {
  144. struct wpa_driver_test_data *drv = priv;
  145. wpa_printf(MSG_DEBUG, "%s: priv=%p", __func__, priv);
  146. drv->num_scanres = 0;
  147. #ifdef DRIVER_TEST_UNIX
  148. if (drv->test_socket >= 0 && drv->test_dir)
  149. wpa_driver_scan_dir(drv, drv->test_dir);
  150. if (drv->test_socket >= 0 && drv->hostapd_addr_set &&
  151. sendto(drv->test_socket, "SCAN", 4, 0,
  152. (struct sockaddr *) &drv->hostapd_addr,
  153. sizeof(drv->hostapd_addr)) < 0) {
  154. perror("sendto(test_socket)");
  155. }
  156. #endif /* DRIVER_TEST_UNIX */
  157. if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set &&
  158. sendto(drv->test_socket, "SCAN", 4, 0,
  159. (struct sockaddr *) &drv->hostapd_addr_udp,
  160. sizeof(drv->hostapd_addr_udp)) < 0) {
  161. perror("sendto(test_socket)");
  162. }
  163. eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx);
  164. eloop_register_timeout(1, 0, wpa_driver_test_scan_timeout, drv,
  165. drv->ctx);
  166. return 0;
  167. }
  168. static struct wpa_scan_results * wpa_driver_test_get_scan_results2(void *priv)
  169. {
  170. struct wpa_driver_test_data *drv = priv;
  171. struct wpa_scan_results *res;
  172. size_t i;
  173. res = os_zalloc(sizeof(*res));
  174. if (res == NULL)
  175. return NULL;
  176. res->res = os_zalloc(drv->num_scanres * sizeof(struct wpa_scan_res *));
  177. if (res->res == NULL) {
  178. os_free(res);
  179. return NULL;
  180. }
  181. for (i = 0; i < drv->num_scanres; i++) {
  182. struct wpa_scan_res *r;
  183. if (drv->scanres[i] == NULL)
  184. continue;
  185. r = os_malloc(sizeof(*r) + drv->scanres[i]->ie_len);
  186. if (r == NULL)
  187. break;
  188. os_memcpy(r, drv->scanres[i],
  189. sizeof(*r) + drv->scanres[i]->ie_len);
  190. res->res[res->num++] = r;
  191. }
  192. return res;
  193. }
  194. static int wpa_driver_test_set_key(void *priv, wpa_alg alg, const u8 *addr,
  195. int key_idx, int set_tx,
  196. const u8 *seq, size_t seq_len,
  197. const u8 *key, size_t key_len)
  198. {
  199. wpa_printf(MSG_DEBUG, "%s: priv=%p alg=%d key_idx=%d set_tx=%d",
  200. __func__, priv, alg, key_idx, set_tx);
  201. if (addr) {
  202. wpa_printf(MSG_DEBUG, " addr=" MACSTR, MAC2STR(addr));
  203. }
  204. if (seq) {
  205. wpa_hexdump(MSG_DEBUG, " seq", seq, seq_len);
  206. }
  207. if (key) {
  208. wpa_hexdump(MSG_DEBUG, " key", key, key_len);
  209. }
  210. return 0;
  211. }
  212. static int wpa_driver_test_associate(
  213. void *priv, struct wpa_driver_associate_params *params)
  214. {
  215. struct wpa_driver_test_data *drv = priv;
  216. wpa_printf(MSG_DEBUG, "%s: priv=%p freq=%d pairwise_suite=%d "
  217. "group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",
  218. __func__, priv, params->freq, params->pairwise_suite,
  219. params->group_suite, params->key_mgmt_suite,
  220. params->auth_alg, params->mode);
  221. if (params->bssid) {
  222. wpa_printf(MSG_DEBUG, " bssid=" MACSTR,
  223. MAC2STR(params->bssid));
  224. }
  225. if (params->ssid) {
  226. wpa_hexdump_ascii(MSG_DEBUG, " ssid",
  227. params->ssid, params->ssid_len);
  228. }
  229. if (params->wpa_ie) {
  230. wpa_hexdump(MSG_DEBUG, " wpa_ie",
  231. params->wpa_ie, params->wpa_ie_len);
  232. drv->assoc_wpa_ie_len = params->wpa_ie_len;
  233. if (drv->assoc_wpa_ie_len > sizeof(drv->assoc_wpa_ie))
  234. drv->assoc_wpa_ie_len = sizeof(drv->assoc_wpa_ie);
  235. os_memcpy(drv->assoc_wpa_ie, params->wpa_ie,
  236. drv->assoc_wpa_ie_len);
  237. } else
  238. drv->assoc_wpa_ie_len = 0;
  239. drv->ibss = params->mode == IEEE80211_MODE_IBSS;
  240. drv->privacy = params->key_mgmt_suite &
  241. (WPA_KEY_MGMT_IEEE8021X |
  242. WPA_KEY_MGMT_PSK |
  243. WPA_KEY_MGMT_WPA_NONE |
  244. WPA_KEY_MGMT_FT_IEEE8021X |
  245. WPA_KEY_MGMT_FT_PSK |
  246. WPA_KEY_MGMT_IEEE8021X_SHA256 |
  247. WPA_KEY_MGMT_PSK_SHA256);
  248. if (params->wep_key_len[params->wep_tx_keyidx])
  249. drv->privacy = 1;
  250. #ifdef DRIVER_TEST_UNIX
  251. if (drv->test_dir && params->bssid &&
  252. params->mode != IEEE80211_MODE_IBSS) {
  253. os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr));
  254. drv->hostapd_addr.sun_family = AF_UNIX;
  255. os_snprintf(drv->hostapd_addr.sun_path,
  256. sizeof(drv->hostapd_addr.sun_path),
  257. "%s/AP-" MACSTR,
  258. drv->test_dir, MAC2STR(params->bssid));
  259. drv->hostapd_addr_set = 1;
  260. }
  261. #endif /* DRIVER_TEST_UNIX */
  262. if (drv->test_socket >= 0 &&
  263. (drv->hostapd_addr_set || drv->hostapd_addr_udp_set)) {
  264. char cmd[200], *pos, *end;
  265. int ret;
  266. end = cmd + sizeof(cmd);
  267. pos = cmd;
  268. ret = os_snprintf(pos, end - pos, "ASSOC " MACSTR " ",
  269. MAC2STR(drv->own_addr));
  270. if (ret >= 0 && ret < end - pos)
  271. pos += ret;
  272. pos += wpa_snprintf_hex(pos, end - pos, params->ssid,
  273. params->ssid_len);
  274. ret = os_snprintf(pos, end - pos, " ");
  275. if (ret >= 0 && ret < end - pos)
  276. pos += ret;
  277. pos += wpa_snprintf_hex(pos, end - pos, params->wpa_ie,
  278. params->wpa_ie_len);
  279. end[-1] = '\0';
  280. #ifdef DRIVER_TEST_UNIX
  281. if (drv->hostapd_addr_set &&
  282. sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
  283. (struct sockaddr *) &drv->hostapd_addr,
  284. sizeof(drv->hostapd_addr)) < 0) {
  285. perror("sendto(test_socket)");
  286. return -1;
  287. }
  288. #endif /* DRIVER_TEST_UNIX */
  289. if (drv->hostapd_addr_udp_set &&
  290. sendto(drv->test_socket, cmd, os_strlen(cmd), 0,
  291. (struct sockaddr *) &drv->hostapd_addr_udp,
  292. sizeof(drv->hostapd_addr_udp)) < 0) {
  293. perror("sendto(test_socket)");
  294. return -1;
  295. }
  296. os_memcpy(drv->ssid, params->ssid, params->ssid_len);
  297. drv->ssid_len = params->ssid_len;
  298. } else {
  299. drv->associated = 1;
  300. if (params->mode == IEEE80211_MODE_IBSS) {
  301. os_memcpy(drv->ssid, params->ssid, params->ssid_len);
  302. drv->ssid_len = params->ssid_len;
  303. if (params->bssid)
  304. os_memcpy(drv->bssid, params->bssid, ETH_ALEN);
  305. else {
  306. os_get_random(drv->bssid, ETH_ALEN);
  307. drv->bssid[0] &= ~0x01;
  308. drv->bssid[0] |= 0x02;
  309. }
  310. }
  311. wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
  312. }
  313. return 0;
  314. }
  315. static int wpa_driver_test_get_bssid(void *priv, u8 *bssid)
  316. {
  317. struct wpa_driver_test_data *drv = priv;
  318. os_memcpy(bssid, drv->bssid, ETH_ALEN);
  319. return 0;
  320. }
  321. static int wpa_driver_test_get_ssid(void *priv, u8 *ssid)
  322. {
  323. struct wpa_driver_test_data *drv = priv;
  324. os_memcpy(ssid, drv->ssid, 32);
  325. return drv->ssid_len;
  326. }
  327. static int wpa_driver_test_send_disassoc(struct wpa_driver_test_data *drv)
  328. {
  329. #ifdef DRIVER_TEST_UNIX
  330. if (drv->test_socket >= 0 &&
  331. sendto(drv->test_socket, "DISASSOC", 8, 0,
  332. (struct sockaddr *) &drv->hostapd_addr,
  333. sizeof(drv->hostapd_addr)) < 0) {
  334. perror("sendto(test_socket)");
  335. return -1;
  336. }
  337. #endif /* DRIVER_TEST_UNIX */
  338. if (drv->test_socket >= 0 && drv->hostapd_addr_udp_set &&
  339. sendto(drv->test_socket, "DISASSOC", 8, 0,
  340. (struct sockaddr *) &drv->hostapd_addr_udp,
  341. sizeof(drv->hostapd_addr_udp)) < 0) {
  342. perror("sendto(test_socket)");
  343. return -1;
  344. }
  345. return 0;
  346. }
  347. static int wpa_driver_test_deauthenticate(void *priv, const u8 *addr,
  348. int reason_code)
  349. {
  350. struct wpa_driver_test_data *drv = priv;
  351. wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
  352. __func__, MAC2STR(addr), reason_code);
  353. os_memset(drv->bssid, 0, ETH_ALEN);
  354. drv->associated = 0;
  355. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  356. return wpa_driver_test_send_disassoc(drv);
  357. }
  358. static int wpa_driver_test_disassociate(void *priv, const u8 *addr,
  359. int reason_code)
  360. {
  361. struct wpa_driver_test_data *drv = priv;
  362. wpa_printf(MSG_DEBUG, "%s addr=" MACSTR " reason_code=%d",
  363. __func__, MAC2STR(addr), reason_code);
  364. os_memset(drv->bssid, 0, ETH_ALEN);
  365. drv->associated = 0;
  366. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  367. return wpa_driver_test_send_disassoc(drv);
  368. }
  369. static void wpa_driver_test_scanresp(struct wpa_driver_test_data *drv,
  370. struct sockaddr *from,
  371. socklen_t fromlen,
  372. const char *data)
  373. {
  374. struct wpa_scan_res *res;
  375. const char *pos, *pos2;
  376. size_t len;
  377. u8 *ie_pos, *ie_start, *ie_end;
  378. #define MAX_IE_LEN 1000
  379. wpa_printf(MSG_DEBUG, "test_driver: SCANRESP %s", data);
  380. if (drv->num_scanres >= MAX_SCAN_RESULTS) {
  381. wpa_printf(MSG_DEBUG, "test_driver: No room for the new scan "
  382. "result");
  383. return;
  384. }
  385. /* SCANRESP BSSID SSID IEs */
  386. res = os_zalloc(sizeof(*res) + MAX_IE_LEN);
  387. if (res == NULL)
  388. return;
  389. ie_start = ie_pos = (u8 *) (res + 1);
  390. ie_end = ie_pos + MAX_IE_LEN;
  391. if (hwaddr_aton(data, res->bssid)) {
  392. wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in scanres");
  393. os_free(res);
  394. return;
  395. }
  396. pos = data + 17;
  397. while (*pos == ' ')
  398. pos++;
  399. pos2 = os_strchr(pos, ' ');
  400. if (pos2 == NULL) {
  401. wpa_printf(MSG_DEBUG, "test_driver: invalid SSID termination "
  402. "in scanres");
  403. os_free(res);
  404. return;
  405. }
  406. len = (pos2 - pos) / 2;
  407. if (len > 32)
  408. len = 32;
  409. /*
  410. * Generate SSID IE from the SSID field since this IE is not included
  411. * in the main IE field.
  412. */
  413. *ie_pos++ = WLAN_EID_SSID;
  414. *ie_pos++ = len;
  415. if (hexstr2bin(pos, ie_pos, len) < 0) {
  416. wpa_printf(MSG_DEBUG, "test_driver: invalid SSID in scanres");
  417. os_free(res);
  418. return;
  419. }
  420. ie_pos += len;
  421. pos = pos2 + 1;
  422. pos2 = os_strchr(pos, ' ');
  423. if (pos2 == NULL)
  424. len = os_strlen(pos) / 2;
  425. else
  426. len = (pos2 - pos) / 2;
  427. if ((int) len > ie_end - ie_pos)
  428. len = ie_end - ie_pos;
  429. if (hexstr2bin(pos, ie_pos, len) < 0) {
  430. wpa_printf(MSG_DEBUG, "test_driver: invalid IEs in scanres");
  431. os_free(res);
  432. return;
  433. }
  434. ie_pos += len;
  435. res->ie_len = ie_pos - ie_start;
  436. if (pos2) {
  437. pos = pos2 + 1;
  438. while (*pos == ' ')
  439. pos++;
  440. if (os_strstr(pos, "PRIVACY"))
  441. res->caps |= IEEE80211_CAP_PRIVACY;
  442. if (os_strstr(pos, "IBSS"))
  443. res->caps |= IEEE80211_CAP_IBSS;
  444. }
  445. os_free(drv->scanres[drv->num_scanres]);
  446. drv->scanres[drv->num_scanres++] = res;
  447. }
  448. static void wpa_driver_test_assocresp(struct wpa_driver_test_data *drv,
  449. struct sockaddr *from,
  450. socklen_t fromlen,
  451. const char *data)
  452. {
  453. /* ASSOCRESP BSSID <res> */
  454. if (hwaddr_aton(data, drv->bssid)) {
  455. wpa_printf(MSG_DEBUG, "test_driver: invalid BSSID in "
  456. "assocresp");
  457. }
  458. if (drv->use_associnfo) {
  459. union wpa_event_data event;
  460. os_memset(&event, 0, sizeof(event));
  461. event.assoc_info.req_ies = drv->assoc_wpa_ie;
  462. event.assoc_info.req_ies_len = drv->assoc_wpa_ie_len;
  463. wpa_supplicant_event(drv->ctx, EVENT_ASSOCINFO, &event);
  464. }
  465. drv->associated = 1;
  466. wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
  467. }
  468. static void wpa_driver_test_disassoc(struct wpa_driver_test_data *drv,
  469. struct sockaddr *from,
  470. socklen_t fromlen)
  471. {
  472. drv->associated = 0;
  473. wpa_supplicant_event(drv->ctx, EVENT_DISASSOC, NULL);
  474. }
  475. static void wpa_driver_test_eapol(struct wpa_driver_test_data *drv,
  476. struct sockaddr *from,
  477. socklen_t fromlen,
  478. const u8 *data, size_t data_len)
  479. {
  480. const u8 *src = drv->bssid;
  481. if (data_len > 14) {
  482. /* Skip Ethernet header */
  483. src = data + ETH_ALEN;
  484. data += 14;
  485. data_len -= 14;
  486. }
  487. wpa_supplicant_rx_eapol(drv->ctx, src, data, data_len);
  488. }
  489. static void wpa_driver_test_mlme(struct wpa_driver_test_data *drv,
  490. struct sockaddr *from,
  491. socklen_t fromlen,
  492. const u8 *data, size_t data_len)
  493. {
  494. #ifdef CONFIG_CLIENT_MLME
  495. struct ieee80211_rx_status rx_status;
  496. os_memset(&rx_status, 0, sizeof(rx_status));
  497. wpa_supplicant_sta_rx(drv->ctx, data, data_len, &rx_status);
  498. #endif /* CONFIG_CLIENT_MLME */
  499. }
  500. static void wpa_driver_test_scan_cmd(struct wpa_driver_test_data *drv,
  501. struct sockaddr *from,
  502. socklen_t fromlen,
  503. const u8 *data, size_t data_len)
  504. {
  505. char buf[512], *pos, *end;
  506. int ret;
  507. /* data: optional [ STA-addr | ' ' | IEs(hex) ] */
  508. if (!drv->ibss)
  509. return;
  510. pos = buf;
  511. end = buf + sizeof(buf);
  512. /* reply: SCANRESP BSSID SSID IEs */
  513. ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ",
  514. MAC2STR(drv->bssid));
  515. if (ret < 0 || ret >= end - pos)
  516. return;
  517. pos += ret;
  518. pos += wpa_snprintf_hex(pos, end - pos,
  519. drv->ssid, drv->ssid_len);
  520. ret = snprintf(pos, end - pos, " ");
  521. if (ret < 0 || ret >= end - pos)
  522. return;
  523. pos += ret;
  524. pos += wpa_snprintf_hex(pos, end - pos, drv->assoc_wpa_ie,
  525. drv->assoc_wpa_ie_len);
  526. if (drv->privacy) {
  527. ret = snprintf(pos, end - pos, " PRIVACY");
  528. if (ret < 0 || ret >= end - pos)
  529. return;
  530. pos += ret;
  531. }
  532. ret = snprintf(pos, end - pos, " IBSS");
  533. if (ret < 0 || ret >= end - pos)
  534. return;
  535. pos += ret;
  536. sendto(drv->test_socket, buf, pos - buf, 0,
  537. (struct sockaddr *) from, fromlen);
  538. }
  539. static void wpa_driver_test_receive_unix(int sock, void *eloop_ctx,
  540. void *sock_ctx)
  541. {
  542. struct wpa_driver_test_data *drv = eloop_ctx;
  543. char *buf;
  544. int res;
  545. struct sockaddr_storage from;
  546. socklen_t fromlen = sizeof(from);
  547. const size_t buflen = 2000;
  548. buf = os_malloc(buflen);
  549. if (buf == NULL)
  550. return;
  551. res = recvfrom(sock, buf, buflen - 1, 0,
  552. (struct sockaddr *) &from, &fromlen);
  553. if (res < 0) {
  554. perror("recvfrom(test_socket)");
  555. os_free(buf);
  556. return;
  557. }
  558. buf[res] = '\0';
  559. wpa_printf(MSG_DEBUG, "test_driver: received %u bytes", res);
  560. if (os_strncmp(buf, "SCANRESP ", 9) == 0) {
  561. wpa_driver_test_scanresp(drv, (struct sockaddr *) &from,
  562. fromlen, buf + 9);
  563. } else if (os_strncmp(buf, "ASSOCRESP ", 10) == 0) {
  564. wpa_driver_test_assocresp(drv, (struct sockaddr *) &from,
  565. fromlen, buf + 10);
  566. } else if (os_strcmp(buf, "DISASSOC") == 0) {
  567. wpa_driver_test_disassoc(drv, (struct sockaddr *) &from,
  568. fromlen);
  569. } else if (os_strcmp(buf, "DEAUTH") == 0) {
  570. wpa_driver_test_disassoc(drv, (struct sockaddr *) &from,
  571. fromlen);
  572. } else if (os_strncmp(buf, "EAPOL ", 6) == 0) {
  573. wpa_driver_test_eapol(drv, (struct sockaddr *) &from, fromlen,
  574. (const u8 *) buf + 6, res - 6);
  575. } else if (os_strncmp(buf, "MLME ", 5) == 0) {
  576. wpa_driver_test_mlme(drv, (struct sockaddr *) &from, fromlen,
  577. (const u8 *) buf + 5, res - 5);
  578. } else if (os_strncmp(buf, "SCAN ", 5) == 0) {
  579. wpa_driver_test_scan_cmd(drv, (struct sockaddr *) &from,
  580. fromlen,
  581. (const u8 *) buf + 5, res - 5);
  582. } else {
  583. wpa_hexdump_ascii(MSG_DEBUG, "Unknown test_socket command",
  584. (u8 *) buf, res);
  585. }
  586. os_free(buf);
  587. }
  588. static void * wpa_driver_test_init2(void *ctx, const char *ifname,
  589. void *global_priv)
  590. {
  591. struct wpa_driver_test_data *drv;
  592. drv = os_zalloc(sizeof(*drv));
  593. if (drv == NULL)
  594. return NULL;
  595. drv->global = global_priv;
  596. drv->ctx = ctx;
  597. drv->test_socket = -1;
  598. /* Set dummy BSSID and SSID for testing. */
  599. drv->bssid[0] = 0x02;
  600. drv->bssid[1] = 0x00;
  601. drv->bssid[2] = 0x00;
  602. drv->bssid[3] = 0x00;
  603. drv->bssid[4] = 0x00;
  604. drv->bssid[5] = 0x01;
  605. os_memcpy(drv->ssid, "test", 5);
  606. drv->ssid_len = 4;
  607. /* Generate a MAC address to help testing with multiple STAs */
  608. drv->own_addr[0] = 0x02; /* locally administered */
  609. sha1_prf((const u8 *) ifname, os_strlen(ifname),
  610. "wpa_supplicant test mac addr generation",
  611. NULL, 0, drv->own_addr + 1, ETH_ALEN - 1);
  612. eloop_register_timeout(1, 0, wpa_driver_test_poll, drv, NULL);
  613. return drv;
  614. }
  615. static void wpa_driver_test_close_test_socket(struct wpa_driver_test_data *drv)
  616. {
  617. if (drv->test_socket >= 0) {
  618. eloop_unregister_read_sock(drv->test_socket);
  619. close(drv->test_socket);
  620. drv->test_socket = -1;
  621. }
  622. if (drv->own_socket_path) {
  623. unlink(drv->own_socket_path);
  624. os_free(drv->own_socket_path);
  625. drv->own_socket_path = NULL;
  626. }
  627. }
  628. static void wpa_driver_test_deinit(void *priv)
  629. {
  630. struct wpa_driver_test_data *drv = priv;
  631. int i;
  632. wpa_driver_test_close_test_socket(drv);
  633. eloop_cancel_timeout(wpa_driver_test_scan_timeout, drv, drv->ctx);
  634. eloop_cancel_timeout(wpa_driver_test_poll, drv, NULL);
  635. os_free(drv->test_dir);
  636. for (i = 0; i < MAX_SCAN_RESULTS; i++)
  637. os_free(drv->scanres[i]);
  638. os_free(drv->probe_req_ie);
  639. os_free(drv);
  640. }
  641. static int wpa_driver_test_attach(struct wpa_driver_test_data *drv,
  642. const char *dir)
  643. {
  644. #ifdef DRIVER_TEST_UNIX
  645. static unsigned int counter = 0;
  646. struct sockaddr_un addr;
  647. size_t len;
  648. os_free(drv->own_socket_path);
  649. if (dir) {
  650. len = os_strlen(dir) + 30;
  651. drv->own_socket_path = os_malloc(len);
  652. if (drv->own_socket_path == NULL)
  653. return -1;
  654. os_snprintf(drv->own_socket_path, len, "%s/STA-" MACSTR,
  655. dir, MAC2STR(drv->own_addr));
  656. } else {
  657. drv->own_socket_path = os_malloc(100);
  658. if (drv->own_socket_path == NULL)
  659. return -1;
  660. os_snprintf(drv->own_socket_path, 100,
  661. "/tmp/wpa_supplicant_test-%d-%d",
  662. getpid(), counter++);
  663. }
  664. drv->test_socket = socket(PF_UNIX, SOCK_DGRAM, 0);
  665. if (drv->test_socket < 0) {
  666. perror("socket(PF_UNIX)");
  667. os_free(drv->own_socket_path);
  668. drv->own_socket_path = NULL;
  669. return -1;
  670. }
  671. os_memset(&addr, 0, sizeof(addr));
  672. addr.sun_family = AF_UNIX;
  673. os_strlcpy(addr.sun_path, drv->own_socket_path, sizeof(addr.sun_path));
  674. if (bind(drv->test_socket, (struct sockaddr *) &addr,
  675. sizeof(addr)) < 0) {
  676. perror("bind(PF_UNIX)");
  677. close(drv->test_socket);
  678. unlink(drv->own_socket_path);
  679. os_free(drv->own_socket_path);
  680. drv->own_socket_path = NULL;
  681. return -1;
  682. }
  683. eloop_register_read_sock(drv->test_socket,
  684. wpa_driver_test_receive_unix, drv, NULL);
  685. return 0;
  686. #else /* DRIVER_TEST_UNIX */
  687. return -1;
  688. #endif /* DRIVER_TEST_UNIX */
  689. }
  690. static int wpa_driver_test_attach_udp(struct wpa_driver_test_data *drv,
  691. char *dst)
  692. {
  693. char *pos;
  694. pos = os_strchr(dst, ':');
  695. if (pos == NULL)
  696. return -1;
  697. *pos++ = '\0';
  698. wpa_printf(MSG_DEBUG, "%s: addr=%s port=%s", __func__, dst, pos);
  699. drv->test_socket = socket(PF_INET, SOCK_DGRAM, 0);
  700. if (drv->test_socket < 0) {
  701. perror("socket(PF_INET)");
  702. return -1;
  703. }
  704. os_memset(&drv->hostapd_addr_udp, 0, sizeof(drv->hostapd_addr_udp));
  705. drv->hostapd_addr_udp.sin_family = AF_INET;
  706. #if defined(CONFIG_NATIVE_WINDOWS) || defined(CONFIG_ANSI_C_EXTRA)
  707. {
  708. int a[4];
  709. u8 *pos;
  710. sscanf(dst, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]);
  711. pos = (u8 *) &drv->hostapd_addr_udp.sin_addr;
  712. *pos++ = a[0];
  713. *pos++ = a[1];
  714. *pos++ = a[2];
  715. *pos++ = a[3];
  716. }
  717. #else /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
  718. inet_aton(dst, &drv->hostapd_addr_udp.sin_addr);
  719. #endif /* CONFIG_NATIVE_WINDOWS or CONFIG_ANSI_C_EXTRA */
  720. drv->hostapd_addr_udp.sin_port = htons(atoi(pos));
  721. drv->hostapd_addr_udp_set = 1;
  722. eloop_register_read_sock(drv->test_socket,
  723. wpa_driver_test_receive_unix, drv, NULL);
  724. return 0;
  725. }
  726. static int wpa_driver_test_set_param(void *priv, const char *param)
  727. {
  728. struct wpa_driver_test_data *drv = priv;
  729. const char *pos;
  730. wpa_printf(MSG_DEBUG, "%s: param='%s'", __func__, param);
  731. if (param == NULL)
  732. return 0;
  733. wpa_driver_test_close_test_socket(drv);
  734. #ifdef DRIVER_TEST_UNIX
  735. pos = os_strstr(param, "test_socket=");
  736. if (pos) {
  737. const char *pos2;
  738. size_t len;
  739. pos += 12;
  740. pos2 = os_strchr(pos, ' ');
  741. if (pos2)
  742. len = pos2 - pos;
  743. else
  744. len = os_strlen(pos);
  745. if (len > sizeof(drv->hostapd_addr.sun_path))
  746. return -1;
  747. os_memset(&drv->hostapd_addr, 0, sizeof(drv->hostapd_addr));
  748. drv->hostapd_addr.sun_family = AF_UNIX;
  749. os_memcpy(drv->hostapd_addr.sun_path, pos, len);
  750. drv->hostapd_addr_set = 1;
  751. }
  752. #endif /* DRIVER_TEST_UNIX */
  753. pos = os_strstr(param, "test_dir=");
  754. if (pos) {
  755. char *end;
  756. os_free(drv->test_dir);
  757. drv->test_dir = os_strdup(pos + 9);
  758. if (drv->test_dir == NULL)
  759. return -1;
  760. end = os_strchr(drv->test_dir, ' ');
  761. if (end)
  762. *end = '\0';
  763. if (wpa_driver_test_attach(drv, drv->test_dir))
  764. return -1;
  765. } else {
  766. pos = os_strstr(param, "test_udp=");
  767. if (pos) {
  768. char *dst, *epos;
  769. dst = os_strdup(pos + 9);
  770. if (dst == NULL)
  771. return -1;
  772. epos = os_strchr(dst, ' ');
  773. if (epos)
  774. *epos = '\0';
  775. if (wpa_driver_test_attach_udp(drv, dst))
  776. return -1;
  777. os_free(dst);
  778. } else if (wpa_driver_test_attach(drv, NULL))
  779. return -1;
  780. }
  781. if (os_strstr(param, "use_associnfo=1")) {
  782. wpa_printf(MSG_DEBUG, "test_driver: Use AssocInfo events");
  783. drv->use_associnfo = 1;
  784. }
  785. #ifdef CONFIG_CLIENT_MLME
  786. if (os_strstr(param, "use_mlme=1")) {
  787. wpa_printf(MSG_DEBUG, "test_driver: Use internal MLME");
  788. drv->use_mlme = 1;
  789. }
  790. #endif /* CONFIG_CLIENT_MLME */
  791. return 0;
  792. }
  793. static const u8 * wpa_driver_test_get_mac_addr(void *priv)
  794. {
  795. struct wpa_driver_test_data *drv = priv;
  796. wpa_printf(MSG_DEBUG, "%s", __func__);
  797. return drv->own_addr;
  798. }
  799. static int wpa_driver_test_send_eapol(void *priv, const u8 *dest, u16 proto,
  800. const u8 *data, size_t data_len)
  801. {
  802. struct wpa_driver_test_data *drv = priv;
  803. char *msg;
  804. size_t msg_len;
  805. struct l2_ethhdr eth;
  806. struct sockaddr *addr;
  807. socklen_t alen;
  808. #ifdef DRIVER_TEST_UNIX
  809. struct sockaddr_un addr_un;
  810. #endif /* DRIVER_TEST_UNIX */
  811. wpa_hexdump(MSG_MSGDUMP, "test_send_eapol TX frame", data, data_len);
  812. os_memset(&eth, 0, sizeof(eth));
  813. os_memcpy(eth.h_dest, dest, ETH_ALEN);
  814. os_memcpy(eth.h_source, drv->own_addr, ETH_ALEN);
  815. eth.h_proto = host_to_be16(proto);
  816. msg_len = 6 + sizeof(eth) + data_len;
  817. msg = os_malloc(msg_len);
  818. if (msg == NULL)
  819. return -1;
  820. os_memcpy(msg, "EAPOL ", 6);
  821. os_memcpy(msg + 6, &eth, sizeof(eth));
  822. os_memcpy(msg + 6 + sizeof(eth), data, data_len);
  823. if (os_memcmp(dest, drv->bssid, ETH_ALEN) == 0 ||
  824. drv->test_dir == NULL) {
  825. if (drv->hostapd_addr_udp_set) {
  826. addr = (struct sockaddr *) &drv->hostapd_addr_udp;
  827. alen = sizeof(drv->hostapd_addr_udp);
  828. } else {
  829. #ifdef DRIVER_TEST_UNIX
  830. addr = (struct sockaddr *) &drv->hostapd_addr;
  831. alen = sizeof(drv->hostapd_addr);
  832. #else /* DRIVER_TEST_UNIX */
  833. os_free(msg);
  834. return -1;
  835. #endif /* DRIVER_TEST_UNIX */
  836. }
  837. } else {
  838. #ifdef DRIVER_TEST_UNIX
  839. struct stat st;
  840. os_memset(&addr_un, 0, sizeof(addr_un));
  841. addr_un.sun_family = AF_UNIX;
  842. os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path),
  843. "%s/STA-" MACSTR, drv->test_dir, MAC2STR(dest));
  844. if (stat(addr_un.sun_path, &st) < 0) {
  845. os_snprintf(addr_un.sun_path, sizeof(addr_un.sun_path),
  846. "%s/AP-" MACSTR,
  847. drv->test_dir, MAC2STR(dest));
  848. }
  849. addr = (struct sockaddr *) &addr_un;
  850. alen = sizeof(addr_un);
  851. #else /* DRIVER_TEST_UNIX */
  852. os_free(msg);
  853. return -1;
  854. #endif /* DRIVER_TEST_UNIX */
  855. }
  856. if (sendto(drv->test_socket, msg, msg_len, 0, addr, alen) < 0) {
  857. perror("sendmsg(test_socket)");
  858. os_free(msg);
  859. return -1;
  860. }
  861. os_free(msg);
  862. return 0;
  863. }
  864. static int wpa_driver_test_get_capa(void *priv, struct wpa_driver_capa *capa)
  865. {
  866. struct wpa_driver_test_data *drv = priv;
  867. os_memset(capa, 0, sizeof(*capa));
  868. capa->key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA |
  869. WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
  870. WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
  871. WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK |
  872. WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE |
  873. WPA_DRIVER_CAPA_KEY_MGMT_FT |
  874. WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK;
  875. capa->enc = WPA_DRIVER_CAPA_ENC_WEP40 |
  876. WPA_DRIVER_CAPA_ENC_WEP104 |
  877. WPA_DRIVER_CAPA_ENC_TKIP |
  878. WPA_DRIVER_CAPA_ENC_CCMP;
  879. capa->auth = WPA_DRIVER_AUTH_OPEN |
  880. WPA_DRIVER_AUTH_SHARED |
  881. WPA_DRIVER_AUTH_LEAP;
  882. if (drv->use_mlme)
  883. capa->flags |= WPA_DRIVER_FLAGS_USER_SPACE_MLME;
  884. return 0;
  885. }
  886. static int wpa_driver_test_mlme_setprotection(void *priv, const u8 *addr,
  887. int protect_type,
  888. int key_type)
  889. {
  890. wpa_printf(MSG_DEBUG, "%s: protect_type=%d key_type=%d",
  891. __func__, protect_type, key_type);
  892. if (addr) {
  893. wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR,
  894. __func__, MAC2STR(addr));
  895. }
  896. return 0;
  897. }
  898. #ifdef CONFIG_CLIENT_MLME
  899. static struct wpa_hw_modes *
  900. wpa_driver_test_get_hw_feature_data(void *priv, u16 *num_modes, u16 *flags)
  901. {
  902. struct wpa_hw_modes *modes;
  903. *num_modes = 1;
  904. *flags = 0;
  905. modes = os_zalloc(*num_modes * sizeof(struct wpa_hw_modes));
  906. if (modes == NULL)
  907. return NULL;
  908. modes[0].mode = WPA_MODE_IEEE80211G;
  909. modes[0].num_channels = 1;
  910. modes[0].num_rates = 1;
  911. modes[0].channels = os_zalloc(sizeof(struct wpa_channel_data));
  912. modes[0].rates = os_zalloc(sizeof(struct wpa_rate_data));
  913. if (modes[0].channels == NULL || modes[0].rates == NULL) {
  914. wpa_supplicant_sta_free_hw_features(modes, *num_modes);
  915. return NULL;
  916. }
  917. modes[0].channels[0].chan = 1;
  918. modes[0].channels[0].freq = 2412;
  919. modes[0].channels[0].flag = WPA_CHAN_W_SCAN | WPA_CHAN_W_ACTIVE_SCAN;
  920. modes[0].rates[0].rate = 10;
  921. modes[0].rates[0].flags = WPA_RATE_BASIC | WPA_RATE_SUPPORTED |
  922. WPA_RATE_CCK | WPA_RATE_MANDATORY;
  923. return modes;
  924. }
  925. static int wpa_driver_test_set_channel(void *priv, wpa_hw_mode phymode,
  926. int chan, int freq)
  927. {
  928. wpa_printf(MSG_DEBUG, "%s: phymode=%d chan=%d freq=%d",
  929. __func__, phymode, chan, freq);
  930. return 0;
  931. }
  932. static int wpa_driver_test_send_mlme(void *priv, const u8 *data,
  933. size_t data_len)
  934. {
  935. struct wpa_driver_test_data *drv = priv;
  936. struct msghdr msg;
  937. struct iovec io[2];
  938. struct sockaddr_un addr;
  939. const u8 *dest;
  940. struct dirent *dent;
  941. DIR *dir;
  942. wpa_hexdump(MSG_MSGDUMP, "test_send_mlme", data, data_len);
  943. if (data_len < 10)
  944. return -1;
  945. dest = data + 4;
  946. io[0].iov_base = "MLME ";
  947. io[0].iov_len = 5;
  948. io[1].iov_base = (u8 *) data;
  949. io[1].iov_len = data_len;
  950. os_memset(&msg, 0, sizeof(msg));
  951. msg.msg_iov = io;
  952. msg.msg_iovlen = 2;
  953. if (os_memcmp(dest, drv->bssid, ETH_ALEN) == 0 ||
  954. drv->test_dir == NULL) {
  955. if (drv->hostapd_addr_udp_set) {
  956. msg.msg_name = &drv->hostapd_addr_udp;
  957. msg.msg_namelen = sizeof(drv->hostapd_addr_udp);
  958. } else {
  959. #ifdef DRIVER_TEST_UNIX
  960. msg.msg_name = &drv->hostapd_addr;
  961. msg.msg_namelen = sizeof(drv->hostapd_addr);
  962. #endif /* DRIVER_TEST_UNIX */
  963. }
  964. } else if (os_memcmp(dest, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) == 0)
  965. {
  966. dir = opendir(drv->test_dir);
  967. if (dir == NULL)
  968. return -1;
  969. while ((dent = readdir(dir))) {
  970. #ifdef _DIRENT_HAVE_D_TYPE
  971. /* Skip the file if it is not a socket.
  972. * Also accept DT_UNKNOWN (0) in case
  973. * the C library or underlying file
  974. * system does not support d_type. */
  975. if (dent->d_type != DT_SOCK &&
  976. dent->d_type != DT_UNKNOWN)
  977. continue;
  978. #endif /* _DIRENT_HAVE_D_TYPE */
  979. if (os_strcmp(dent->d_name, ".") == 0 ||
  980. os_strcmp(dent->d_name, "..") == 0)
  981. continue;
  982. wpa_printf(MSG_DEBUG, "%s: Send broadcast MLME to %s",
  983. __func__, dent->d_name);
  984. os_memset(&addr, 0, sizeof(addr));
  985. addr.sun_family = AF_UNIX;
  986. os_snprintf(addr.sun_path, sizeof(addr.sun_path),
  987. "%s/%s", drv->test_dir, dent->d_name);
  988. msg.msg_name = &addr;
  989. msg.msg_namelen = sizeof(addr);
  990. if (sendmsg(drv->test_socket, &msg, 0) < 0)
  991. perror("sendmsg(test_socket)");
  992. }
  993. closedir(dir);
  994. return 0;
  995. } else {
  996. struct stat st;
  997. os_memset(&addr, 0, sizeof(addr));
  998. addr.sun_family = AF_UNIX;
  999. os_snprintf(addr.sun_path, sizeof(addr.sun_path),
  1000. "%s/AP-" MACSTR, drv->test_dir, MAC2STR(dest));
  1001. if (stat(addr.sun_path, &st) < 0) {
  1002. os_snprintf(addr.sun_path, sizeof(addr.sun_path),
  1003. "%s/STA-" MACSTR,
  1004. drv->test_dir, MAC2STR(dest));
  1005. }
  1006. msg.msg_name = &addr;
  1007. msg.msg_namelen = sizeof(addr);
  1008. }
  1009. if (sendmsg(drv->test_socket, &msg, 0) < 0) {
  1010. perror("sendmsg(test_socket)");
  1011. return -1;
  1012. }
  1013. return 0;
  1014. }
  1015. static int wpa_driver_test_mlme_add_sta(void *priv, const u8 *addr,
  1016. const u8 *supp_rates,
  1017. size_t supp_rates_len)
  1018. {
  1019. wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr));
  1020. return 0;
  1021. }
  1022. static int wpa_driver_test_mlme_remove_sta(void *priv, const u8 *addr)
  1023. {
  1024. wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__, MAC2STR(addr));
  1025. return 0;
  1026. }
  1027. static int wpa_driver_test_set_ssid(void *priv, const u8 *ssid,
  1028. size_t ssid_len)
  1029. {
  1030. wpa_printf(MSG_DEBUG, "%s", __func__);
  1031. return 0;
  1032. }
  1033. static int wpa_driver_test_set_bssid(void *priv, const u8 *bssid)
  1034. {
  1035. wpa_printf(MSG_DEBUG, "%s: bssid=" MACSTR, __func__, MAC2STR(bssid));
  1036. return 0;
  1037. }
  1038. #endif /* CONFIG_CLIENT_MLME */
  1039. static int wpa_driver_test_set_probe_req_ie(void *priv, const u8 *ies,
  1040. size_t ies_len)
  1041. {
  1042. struct wpa_driver_test_data *drv = priv;
  1043. os_free(drv->probe_req_ie);
  1044. if (ies) {
  1045. drv->probe_req_ie = os_malloc(ies_len);
  1046. if (drv->probe_req_ie == NULL) {
  1047. drv->probe_req_ie_len = 0;
  1048. return -1;
  1049. }
  1050. os_memcpy(drv->probe_req_ie, ies, ies_len);
  1051. drv->probe_req_ie_len = ies_len;
  1052. } else {
  1053. drv->probe_req_ie = NULL;
  1054. drv->probe_req_ie_len = 0;
  1055. }
  1056. return 0;
  1057. }
  1058. static void * wpa_driver_test_global_init(void)
  1059. {
  1060. struct wpa_driver_test_global *global;
  1061. global = os_zalloc(sizeof(*global));
  1062. return global;
  1063. }
  1064. static void wpa_driver_test_global_deinit(void *priv)
  1065. {
  1066. struct wpa_driver_test_global *global = priv;
  1067. os_free(global);
  1068. }
  1069. static struct wpa_interface_info *
  1070. wpa_driver_test_get_interfaces(void *global_priv)
  1071. {
  1072. /* struct wpa_driver_test_global *global = priv; */
  1073. struct wpa_interface_info *iface;
  1074. iface = os_zalloc(sizeof(*iface));
  1075. if (iface == NULL)
  1076. return iface;
  1077. iface->ifname = os_strdup("sta0");
  1078. iface->desc = os_strdup("test interface 0");
  1079. iface->drv_name = "test";
  1080. iface->next = os_zalloc(sizeof(*iface));
  1081. if (iface->next) {
  1082. iface->next->ifname = os_strdup("sta1");
  1083. iface->next->desc = os_strdup("test interface 1");
  1084. iface->next->drv_name = "test";
  1085. }
  1086. return iface;
  1087. }
  1088. const struct wpa_driver_ops wpa_driver_test_ops = {
  1089. "test",
  1090. "wpa_supplicant test driver",
  1091. wpa_driver_test_get_bssid,
  1092. wpa_driver_test_get_ssid,
  1093. wpa_driver_test_set_wpa,
  1094. wpa_driver_test_set_key,
  1095. NULL /* init */,
  1096. wpa_driver_test_deinit,
  1097. wpa_driver_test_set_param,
  1098. NULL /* set_countermeasures */,
  1099. NULL /* set_drop_unencrypted */,
  1100. wpa_driver_test_scan,
  1101. NULL /* get_scan_results */,
  1102. wpa_driver_test_deauthenticate,
  1103. wpa_driver_test_disassociate,
  1104. wpa_driver_test_associate,
  1105. NULL /* set_auth_alg */,
  1106. NULL /* add_pmkid */,
  1107. NULL /* remove_pmkid */,
  1108. NULL /* flush_pmkid */,
  1109. wpa_driver_test_get_capa,
  1110. NULL /* poll */,
  1111. NULL /* get_ifname */,
  1112. wpa_driver_test_get_mac_addr,
  1113. wpa_driver_test_send_eapol,
  1114. NULL /* set_operstate */,
  1115. wpa_driver_test_mlme_setprotection,
  1116. #ifdef CONFIG_CLIENT_MLME
  1117. wpa_driver_test_get_hw_feature_data,
  1118. wpa_driver_test_set_channel,
  1119. wpa_driver_test_set_ssid,
  1120. wpa_driver_test_set_bssid,
  1121. wpa_driver_test_send_mlme,
  1122. wpa_driver_test_mlme_add_sta,
  1123. wpa_driver_test_mlme_remove_sta,
  1124. #else /* CONFIG_CLIENT_MLME */
  1125. NULL /* get_hw_feature_data */,
  1126. NULL /* set_channel */,
  1127. NULL /* set_ssid */,
  1128. NULL /* set_bssid */,
  1129. NULL /* send_mlme */,
  1130. NULL /* mlme_add_sta */,
  1131. NULL /* mlme_remove_sta */,
  1132. #endif /* CONFIG_CLIENT_MLME */
  1133. NULL /* update_ft_ies */,
  1134. NULL /* send_ft_action */,
  1135. wpa_driver_test_get_scan_results2,
  1136. wpa_driver_test_set_probe_req_ie,
  1137. NULL /* set_mode */,
  1138. NULL /* set_country */,
  1139. wpa_driver_test_global_init,
  1140. wpa_driver_test_global_deinit,
  1141. wpa_driver_test_init2,
  1142. wpa_driver_test_get_interfaces
  1143. };