350-hostap_multicall_fix.patch 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. --- a/src/drivers/driver_hostap.c
  2. +++ b/src/drivers/driver_hostap.c
  3. @@ -22,9 +22,6 @@
  4. #include "eloop.h"
  5. #include "driver_hostap.h"
  6. -
  7. -#ifdef HOSTAPD
  8. -
  9. #include <net/if_arp.h>
  10. #include <netpacket/packet.h>
  11. @@ -43,10 +40,16 @@
  12. static const u8 rfc1042_header[6] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
  13. struct hostap_driver_data {
  14. + void *wext; /* private data for driver_wext */
  15. + void *ctx;
  16. + char ifname[IFNAMSIZ + 1];
  17. + int sock;
  18. + int current_mode; /* infra/adhoc */
  19. +
  20. +#ifdef HOSTAPD
  21. struct hostapd_data *hapd;
  22. char iface[IFNAMSIZ + 1];
  23. - int sock; /* raw packet socket for driver access */
  24. int ioctl_sock; /* socket for ioctl() use */
  25. struct netlink_data *netlink;
  26. @@ -56,9 +59,11 @@ struct hostap_driver_data {
  27. size_t generic_ie_len;
  28. u8 *wps_ie;
  29. size_t wps_ie_len;
  30. +#endif
  31. };
  32. +#ifdef HOSTAPD
  33. static int hostapd_ioctl(void *priv, struct prism2_hostapd_param *param,
  34. int len);
  35. static int hostap_set_iface_flags(void *priv, int dev_up);
  36. @@ -399,65 +404,6 @@ static int hostapd_ioctl(void *priv, str
  37. }
  38. -static int wpa_driver_hostap_set_key(const char *ifname, void *priv,
  39. - enum wpa_alg alg, const u8 *addr,
  40. - int key_idx, int set_tx,
  41. - const u8 *seq, size_t seq_len,
  42. - const u8 *key, size_t key_len)
  43. -{
  44. - struct hostap_driver_data *drv = priv;
  45. - struct prism2_hostapd_param *param;
  46. - u8 *buf;
  47. - size_t blen;
  48. - int ret = 0;
  49. -
  50. - blen = sizeof(*param) + key_len;
  51. - buf = os_zalloc(blen);
  52. - if (buf == NULL)
  53. - return -1;
  54. -
  55. - param = (struct prism2_hostapd_param *) buf;
  56. - param->cmd = PRISM2_SET_ENCRYPTION;
  57. - if (addr == NULL)
  58. - memset(param->sta_addr, 0xff, ETH_ALEN);
  59. - else
  60. - memcpy(param->sta_addr, addr, ETH_ALEN);
  61. - switch (alg) {
  62. - case WPA_ALG_NONE:
  63. - os_strlcpy((char *) param->u.crypt.alg, "NONE",
  64. - HOSTAP_CRYPT_ALG_NAME_LEN);
  65. - break;
  66. - case WPA_ALG_WEP:
  67. - os_strlcpy((char *) param->u.crypt.alg, "WEP",
  68. - HOSTAP_CRYPT_ALG_NAME_LEN);
  69. - break;
  70. - case WPA_ALG_TKIP:
  71. - os_strlcpy((char *) param->u.crypt.alg, "TKIP",
  72. - HOSTAP_CRYPT_ALG_NAME_LEN);
  73. - break;
  74. - case WPA_ALG_CCMP:
  75. - os_strlcpy((char *) param->u.crypt.alg, "CCMP",
  76. - HOSTAP_CRYPT_ALG_NAME_LEN);
  77. - break;
  78. - default:
  79. - os_free(buf);
  80. - return -1;
  81. - }
  82. - param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0;
  83. - param->u.crypt.idx = key_idx;
  84. - param->u.crypt.key_len = key_len;
  85. - memcpy((u8 *) (param + 1), key, key_len);
  86. -
  87. - if (hostapd_ioctl(drv, param, blen)) {
  88. - printf("Failed to set encryption.\n");
  89. - ret = -1;
  90. - }
  91. - free(buf);
  92. -
  93. - return ret;
  94. -}
  95. -
  96. -
  97. static int hostap_get_seqnum(const char *ifname, void *priv, const u8 *addr,
  98. int idx, u8 *seq)
  99. {
  100. @@ -1171,21 +1117,9 @@ static void wpa_driver_hostap_poll_clien
  101. hostap_send_mlme(priv, (u8 *)&hdr, sizeof(hdr));
  102. }
  103. -#else /* HOSTAPD */
  104. -
  105. -struct wpa_driver_hostap_data {
  106. - void *wext; /* private data for driver_wext */
  107. - void *ctx;
  108. - char ifname[IFNAMSIZ + 1];
  109. - int sock;
  110. - int current_mode; /* infra/adhoc */
  111. -};
  112. -
  113. -
  114. -static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg);
  115. -
  116. +#endif /* HOSTAPD */
  117. -static int hostapd_ioctl(struct wpa_driver_hostap_data *drv,
  118. +static int wpa_hostapd_ioctl(struct hostap_driver_data *drv,
  119. struct prism2_hostapd_param *param,
  120. int len, int show_err)
  121. {
  122. @@ -1207,7 +1141,12 @@ static int hostapd_ioctl(struct wpa_driv
  123. }
  124. -static int wpa_driver_hostap_set_wpa_ie(struct wpa_driver_hostap_data *drv,
  125. +#if !defined(NO_SUPPLICANT)
  126. +
  127. +static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg);
  128. +
  129. +
  130. +static int wpa_driver_hostap_set_wpa_ie(struct hostap_driver_data *drv,
  131. const u8 *wpa_ie, size_t wpa_ie_len)
  132. {
  133. struct prism2_hostapd_param *param;
  134. @@ -1223,7 +1162,7 @@ static int wpa_driver_hostap_set_wpa_ie(
  135. param->cmd = PRISM2_HOSTAPD_SET_GENERIC_ELEMENT;
  136. param->u.generic_elem.len = wpa_ie_len;
  137. os_memcpy(param->u.generic_elem.data, wpa_ie, wpa_ie_len);
  138. - res = hostapd_ioctl(drv, param, blen, 1);
  139. + res = wpa_hostapd_ioctl(drv, param, blen, 1);
  140. os_free(param);
  141. @@ -1231,7 +1170,7 @@ static int wpa_driver_hostap_set_wpa_ie(
  142. }
  143. -static int prism2param(struct wpa_driver_hostap_data *drv, int param,
  144. +static int prism2param(struct hostap_driver_data *drv, int param,
  145. int value)
  146. {
  147. struct iwreq iwr;
  148. @@ -1253,7 +1192,7 @@ static int prism2param(struct wpa_driver
  149. static int wpa_driver_hostap_set_wpa(void *priv, int enabled)
  150. {
  151. - struct wpa_driver_hostap_data *drv = priv;
  152. + struct hostap_driver_data *drv = priv;
  153. int ret = 0;
  154. wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
  155. @@ -1269,125 +1208,15 @@ static int wpa_driver_hostap_set_wpa(voi
  156. }
  157. -static void show_set_key_error(struct prism2_hostapd_param *param)
  158. -{
  159. - switch (param->u.crypt.err) {
  160. - case HOSTAP_CRYPT_ERR_UNKNOWN_ALG:
  161. - wpa_printf(MSG_INFO, "Unknown algorithm '%s'.",
  162. - param->u.crypt.alg);
  163. - wpa_printf(MSG_INFO, "You may need to load kernel module to "
  164. - "register that algorithm.");
  165. - wpa_printf(MSG_INFO, "E.g., 'modprobe hostap_crypt_wep' for "
  166. - "WEP.");
  167. - break;
  168. - case HOSTAP_CRYPT_ERR_UNKNOWN_ADDR:
  169. - wpa_printf(MSG_INFO, "Unknown address " MACSTR ".",
  170. - MAC2STR(param->sta_addr));
  171. - break;
  172. - case HOSTAP_CRYPT_ERR_CRYPT_INIT_FAILED:
  173. - wpa_printf(MSG_INFO, "Crypt algorithm initialization failed.");
  174. - break;
  175. - case HOSTAP_CRYPT_ERR_KEY_SET_FAILED:
  176. - wpa_printf(MSG_INFO, "Key setting failed.");
  177. - break;
  178. - case HOSTAP_CRYPT_ERR_TX_KEY_SET_FAILED:
  179. - wpa_printf(MSG_INFO, "TX key index setting failed.");
  180. - break;
  181. - case HOSTAP_CRYPT_ERR_CARD_CONF_FAILED:
  182. - wpa_printf(MSG_INFO, "Card configuration failed.");
  183. - break;
  184. - }
  185. -}
  186. -
  187. -
  188. -static int wpa_driver_hostap_set_key(const char *ifname, void *priv,
  189. - enum wpa_alg alg, const u8 *addr,
  190. - int key_idx, int set_tx,
  191. - const u8 *seq, size_t seq_len,
  192. - const u8 *key, size_t key_len)
  193. -{
  194. - struct wpa_driver_hostap_data *drv = priv;
  195. - struct prism2_hostapd_param *param;
  196. - u8 *buf;
  197. - size_t blen;
  198. - int ret = 0;
  199. - char *alg_name;
  200. -
  201. - switch (alg) {
  202. - case WPA_ALG_NONE:
  203. - alg_name = "none";
  204. - break;
  205. - case WPA_ALG_WEP:
  206. - alg_name = "WEP";
  207. - break;
  208. - case WPA_ALG_TKIP:
  209. - alg_name = "TKIP";
  210. - break;
  211. - case WPA_ALG_CCMP:
  212. - alg_name = "CCMP";
  213. - break;
  214. - default:
  215. - return -1;
  216. - }
  217. -
  218. - wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu "
  219. - "key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx,
  220. - (unsigned long) seq_len, (unsigned long) key_len);
  221. -
  222. - if (seq_len > 8)
  223. - return -2;
  224. -
  225. - blen = sizeof(*param) + key_len;
  226. - buf = os_zalloc(blen);
  227. - if (buf == NULL)
  228. - return -1;
  229. -
  230. - param = (struct prism2_hostapd_param *) buf;
  231. - param->cmd = PRISM2_SET_ENCRYPTION;
  232. - /* TODO: In theory, STA in client mode can use five keys; four default
  233. - * keys for receiving (with keyidx 0..3) and one individual key for
  234. - * both transmitting and receiving (keyidx 0) _unicast_ packets. Now,
  235. - * keyidx 0 is reserved for this unicast use and default keys can only
  236. - * use keyidx 1..3 (i.e., default key with keyidx 0 is not supported).
  237. - * This should be fine for more or less all cases, but for completeness
  238. - * sake, the driver could be enhanced to support the missing key. */
  239. -#if 0
  240. - if (addr == NULL)
  241. - os_memset(param->sta_addr, 0xff, ETH_ALEN);
  242. - else
  243. - os_memcpy(param->sta_addr, addr, ETH_ALEN);
  244. -#else
  245. - os_memset(param->sta_addr, 0xff, ETH_ALEN);
  246. -#endif
  247. - os_strlcpy((char *) param->u.crypt.alg, alg_name,
  248. - HOSTAP_CRYPT_ALG_NAME_LEN);
  249. - param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0;
  250. - param->u.crypt.idx = key_idx;
  251. - if (seq)
  252. - os_memcpy(param->u.crypt.seq, seq, seq_len);
  253. - param->u.crypt.key_len = key_len;
  254. - os_memcpy((u8 *) (param + 1), key, key_len);
  255. -
  256. - if (hostapd_ioctl(drv, param, blen, 1)) {
  257. - wpa_printf(MSG_WARNING, "Failed to set encryption.");
  258. - show_set_key_error(param);
  259. - ret = -1;
  260. - }
  261. - os_free(buf);
  262. -
  263. - return ret;
  264. -}
  265. -
  266. -
  267. static int wpa_driver_hostap_set_countermeasures(void *priv, int enabled)
  268. {
  269. - struct wpa_driver_hostap_data *drv = priv;
  270. + struct hostap_driver_data *drv = priv;
  271. wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
  272. return prism2param(drv, PRISM2_PARAM_TKIP_COUNTERMEASURES, enabled);
  273. }
  274. -static int wpa_driver_hostap_reset(struct wpa_driver_hostap_data *drv,
  275. +static int wpa_driver_hostap_reset(struct hostap_driver_data *drv,
  276. int type)
  277. {
  278. struct iwreq iwr;
  279. @@ -1408,7 +1237,7 @@ static int wpa_driver_hostap_reset(struc
  280. }
  281. -static int wpa_driver_hostap_mlme(struct wpa_driver_hostap_data *drv,
  282. +static int wpa_driver_hostap_mlme(struct hostap_driver_data *drv,
  283. const u8 *addr, int cmd, int reason_code)
  284. {
  285. struct prism2_hostapd_param param;
  286. @@ -1423,7 +1252,7 @@ static int wpa_driver_hostap_mlme(struct
  287. os_memcpy(param.sta_addr, addr, ETH_ALEN);
  288. param.u.mlme.cmd = cmd;
  289. param.u.mlme.reason_code = reason_code;
  290. - ret = hostapd_ioctl(drv, &param, sizeof(param), 1);
  291. + ret = wpa_hostapd_ioctl(drv, &param, sizeof(param), 1);
  292. if (ret == 0) {
  293. os_sleep(0, 100000);
  294. ret = wpa_driver_hostap_reset(drv, 2);
  295. @@ -1435,7 +1264,7 @@ static int wpa_driver_hostap_mlme(struct
  296. static int wpa_driver_hostap_deauthenticate(void *priv, const u8 *addr,
  297. int reason_code)
  298. {
  299. - struct wpa_driver_hostap_data *drv = priv;
  300. + struct hostap_driver_data *drv = priv;
  301. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  302. return wpa_driver_hostap_mlme(drv, addr, MLME_STA_DEAUTH,
  303. reason_code);
  304. @@ -1445,7 +1274,7 @@ static int wpa_driver_hostap_deauthentic
  305. static int wpa_driver_hostap_disassociate(void *priv, const u8 *addr,
  306. int reason_code)
  307. {
  308. - struct wpa_driver_hostap_data *drv = priv;
  309. + struct hostap_driver_data *drv = priv;
  310. wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
  311. return wpa_driver_hostap_mlme(drv, addr, MLME_STA_DISASSOC,
  312. reason_code);
  313. @@ -1456,7 +1285,7 @@ static int
  314. wpa_driver_hostap_associate(void *priv,
  315. struct wpa_driver_associate_params *params)
  316. {
  317. - struct wpa_driver_hostap_data *drv = priv;
  318. + struct hostap_driver_data *drv = priv;
  319. int ret = 0;
  320. int allow_unencrypted_eapol;
  321. @@ -1520,7 +1349,7 @@ wpa_driver_hostap_associate(void *priv,
  322. static int wpa_driver_hostap_scan(void *priv,
  323. struct wpa_driver_scan_params *params)
  324. {
  325. - struct wpa_driver_hostap_data *drv = priv;
  326. + struct hostap_driver_data *drv = priv;
  327. struct prism2_hostapd_param param;
  328. int ret;
  329. const u8 *ssid = params->ssids[0].ssid;
  330. @@ -1541,7 +1370,7 @@ static int wpa_driver_hostap_scan(void *
  331. param.cmd = PRISM2_HOSTAPD_SCAN_REQ;
  332. param.u.scan_req.ssid_len = ssid_len;
  333. os_memcpy(param.u.scan_req.ssid, ssid, ssid_len);
  334. - ret = hostapd_ioctl(drv, &param, sizeof(param), 1);
  335. + ret = wpa_hostapd_ioctl(drv, &param, sizeof(param), 1);
  336. /* Not all drivers generate "scan completed" wireless event, so try to
  337. * read results after a timeout. */
  338. @@ -1556,7 +1385,7 @@ static int wpa_driver_hostap_scan(void *
  339. static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg)
  340. {
  341. - struct wpa_driver_hostap_data *drv = priv;
  342. + struct hostap_driver_data *drv = priv;
  343. int algs = 0;
  344. if (auth_alg & WPA_AUTH_ALG_OPEN)
  345. @@ -1574,35 +1403,35 @@ static int wpa_driver_hostap_set_auth_al
  346. static int wpa_driver_hostap_get_bssid(void *priv, u8 *bssid)
  347. {
  348. - struct wpa_driver_hostap_data *drv = priv;
  349. + struct hostap_driver_data *drv = priv;
  350. return wpa_driver_wext_get_bssid(drv->wext, bssid);
  351. }
  352. static int wpa_driver_hostap_get_ssid(void *priv, u8 *ssid)
  353. {
  354. - struct wpa_driver_hostap_data *drv = priv;
  355. + struct hostap_driver_data *drv = priv;
  356. return wpa_driver_wext_get_ssid(drv->wext, ssid);
  357. }
  358. static struct wpa_scan_results * wpa_driver_hostap_get_scan_results(void *priv)
  359. {
  360. - struct wpa_driver_hostap_data *drv = priv;
  361. + struct hostap_driver_data *drv = priv;
  362. return wpa_driver_wext_get_scan_results(drv->wext);
  363. }
  364. static int wpa_driver_hostap_set_operstate(void *priv, int state)
  365. {
  366. - struct wpa_driver_hostap_data *drv = priv;
  367. + struct hostap_driver_data *drv = priv;
  368. return wpa_driver_wext_set_operstate(drv->wext, state);
  369. }
  370. static void * wpa_driver_hostap_init(void *ctx, const char *ifname)
  371. {
  372. - struct wpa_driver_hostap_data *drv;
  373. + struct hostap_driver_data *drv;
  374. drv = os_zalloc(sizeof(*drv));
  375. if (drv == NULL)
  376. @@ -1642,14 +1471,120 @@ static void * wpa_driver_hostap_init(voi
  377. static void wpa_driver_hostap_deinit(void *priv)
  378. {
  379. - struct wpa_driver_hostap_data *drv = priv;
  380. + struct hostap_driver_data *drv = priv;
  381. wpa_driver_hostap_set_wpa(drv, 0);
  382. wpa_driver_wext_deinit(drv->wext);
  383. close(drv->sock);
  384. os_free(drv);
  385. }
  386. -#endif /* HOSTAPD */
  387. +#endif
  388. +
  389. +
  390. +static void show_set_key_error(struct prism2_hostapd_param *param)
  391. +{
  392. + switch (param->u.crypt.err) {
  393. + case HOSTAP_CRYPT_ERR_UNKNOWN_ALG:
  394. + wpa_printf(MSG_INFO, "Unknown algorithm '%s'.",
  395. + param->u.crypt.alg);
  396. + wpa_printf(MSG_INFO, "You may need to load kernel module to "
  397. + "register that algorithm.");
  398. + wpa_printf(MSG_INFO, "E.g., 'modprobe hostap_crypt_wep' for "
  399. + "WEP.");
  400. + break;
  401. + case HOSTAP_CRYPT_ERR_UNKNOWN_ADDR:
  402. + wpa_printf(MSG_INFO, "Unknown address " MACSTR ".",
  403. + MAC2STR(param->sta_addr));
  404. + break;
  405. + case HOSTAP_CRYPT_ERR_CRYPT_INIT_FAILED:
  406. + wpa_printf(MSG_INFO, "Crypt algorithm initialization failed.");
  407. + break;
  408. + case HOSTAP_CRYPT_ERR_KEY_SET_FAILED:
  409. + wpa_printf(MSG_INFO, "Key setting failed.");
  410. + break;
  411. + case HOSTAP_CRYPT_ERR_TX_KEY_SET_FAILED:
  412. + wpa_printf(MSG_INFO, "TX key index setting failed.");
  413. + break;
  414. + case HOSTAP_CRYPT_ERR_CARD_CONF_FAILED:
  415. + wpa_printf(MSG_INFO, "Card configuration failed.");
  416. + break;
  417. + }
  418. +}
  419. +
  420. +
  421. +static int wpa_driver_hostap_set_key(const char *ifname, void *priv,
  422. + enum wpa_alg alg, const u8 *addr,
  423. + int key_idx, int set_tx,
  424. + const u8 *seq, size_t seq_len,
  425. + const u8 *key, size_t key_len)
  426. +{
  427. + struct hostap_driver_data *drv = priv;
  428. + struct prism2_hostapd_param *param;
  429. + u8 *buf;
  430. + size_t blen;
  431. + int ret = 0;
  432. + char *alg_name;
  433. +
  434. + switch (alg) {
  435. + case WPA_ALG_NONE:
  436. + alg_name = "none";
  437. + break;
  438. + case WPA_ALG_WEP:
  439. + alg_name = "WEP";
  440. + break;
  441. + case WPA_ALG_TKIP:
  442. + alg_name = "TKIP";
  443. + break;
  444. + case WPA_ALG_CCMP:
  445. + alg_name = "CCMP";
  446. + break;
  447. + default:
  448. + return -1;
  449. + }
  450. +
  451. + wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu "
  452. + "key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx,
  453. + (unsigned long) seq_len, (unsigned long) key_len);
  454. +
  455. + if (seq_len > 8)
  456. + return -2;
  457. +
  458. + blen = sizeof(*param) + key_len;
  459. + buf = os_zalloc(blen);
  460. + if (buf == NULL)
  461. + return -1;
  462. +
  463. + param = (struct prism2_hostapd_param *) buf;
  464. + param->cmd = PRISM2_SET_ENCRYPTION;
  465. + /* TODO: In theory, STA in client mode can use five keys; four default
  466. + * keys for receiving (with keyidx 0..3) and one individual key for
  467. + * both transmitting and receiving (keyidx 0) _unicast_ packets. Now,
  468. + * keyidx 0 is reserved for this unicast use and default keys can only
  469. + * use keyidx 1..3 (i.e., default key with keyidx 0 is not supported).
  470. + * This should be fine for more or less all cases, but for completeness
  471. + * sake, the driver could be enhanced to support the missing key. */
  472. + if (addr == NULL)
  473. + os_memset(param->sta_addr, 0xff, ETH_ALEN);
  474. + else
  475. + os_memcpy(param->sta_addr, addr, ETH_ALEN);
  476. + os_strlcpy((char *) param->u.crypt.alg, alg_name,
  477. + HOSTAP_CRYPT_ALG_NAME_LEN);
  478. + param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0;
  479. + param->u.crypt.idx = key_idx;
  480. + if (seq)
  481. + os_memcpy(param->u.crypt.seq, seq, seq_len);
  482. + param->u.crypt.key_len = key_len;
  483. + os_memcpy((u8 *) (param + 1), key, key_len);
  484. +
  485. + if (wpa_hostapd_ioctl(drv, param, blen, 1)) {
  486. + wpa_printf(MSG_WARNING, "Failed to set encryption.");
  487. + show_set_key_error(param);
  488. + ret = -1;
  489. + }
  490. + os_free(buf);
  491. +
  492. + return ret;
  493. +}
  494. const struct wpa_driver_ops wpa_driver_hostap_ops = {
  495. @@ -1679,7 +1614,8 @@ const struct wpa_driver_ops wpa_driver_h
  496. .set_ap_wps_ie = hostap_set_ap_wps_ie,
  497. .set_freq = hostap_set_freq,
  498. .poll_client = wpa_driver_hostap_poll_client,
  499. -#else /* HOSTAPD */
  500. +#endif /* HOSTAPD */
  501. +#if !defined(NO_SUPPLICANT)
  502. .get_bssid = wpa_driver_hostap_get_bssid,
  503. .get_ssid = wpa_driver_hostap_get_ssid,
  504. .set_countermeasures = wpa_driver_hostap_set_countermeasures,
  505. @@ -1691,5 +1627,5 @@ const struct wpa_driver_ops wpa_driver_h
  506. .init = wpa_driver_hostap_init,
  507. .deinit = wpa_driver_hostap_deinit,
  508. .set_operstate = wpa_driver_hostap_set_operstate,
  509. -#endif /* HOSTAPD */
  510. +#endif
  511. };