driver_bsd.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539
  1. /*
  2. * WPA Supplicant - driver interaction with BSD net80211 layer
  3. * Copyright (c) 2004, Sam Leffler <sam@errno.com>
  4. * Copyright (c) 2004, 2Wire, Inc
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. *
  10. * Alternatively, this software may be distributed under the terms of BSD
  11. * license.
  12. *
  13. * See README and COPYING for more details.
  14. */
  15. #include "includes.h"
  16. #include <sys/ioctl.h>
  17. #include "common.h"
  18. #include "driver.h"
  19. #include "eloop.h"
  20. #include "common/ieee802_11_defs.h"
  21. #include <net/if.h>
  22. #include <net/if_media.h>
  23. #ifdef __NetBSD__
  24. #include <net/if_ether.h>
  25. #else
  26. #include <net/ethernet.h>
  27. #endif
  28. #include <net/route.h>
  29. #ifdef __DragonFly__
  30. #include <netproto/802_11/ieee80211_ioctl.h>
  31. #include <netproto/802_11/ieee80211_dragonfly.h>
  32. #else /* __DragonFly__ */
  33. #include <net80211/ieee80211.h>
  34. #include <net80211/ieee80211_ioctl.h>
  35. #include <net80211/ieee80211_crypto.h>
  36. #endif /* __DragonFly__ */
  37. #if __FreeBSD__
  38. #include <net80211/ieee80211_freebsd.h>
  39. #endif
  40. #if __NetBSD__
  41. #include <net80211/ieee80211_netbsd.h>
  42. #endif
  43. #include "l2_packet/l2_packet.h"
  44. struct bsd_driver_data {
  45. struct hostapd_data *hapd; /* back pointer */
  46. int sock; /* open socket for 802.11 ioctls */
  47. struct l2_packet_data *sock_xmit;/* raw packet xmit socket */
  48. int route; /* routing socket for events */
  49. char ifname[IFNAMSIZ+1]; /* interface name */
  50. unsigned int ifindex; /* interface index */
  51. void *ctx;
  52. struct wpa_driver_capa capa; /* driver capability */
  53. int is_ap; /* Access point mode */
  54. int prev_roaming; /* roaming state to restore on deinit */
  55. int prev_privacy; /* privacy state to restore on deinit */
  56. int prev_wpa; /* wpa state to restore on deinit */
  57. };
  58. /* Generic functions for hostapd and wpa_supplicant */
  59. static int
  60. bsd_set80211(void *priv, int op, int val, const void *arg, int arg_len)
  61. {
  62. struct bsd_driver_data *drv = priv;
  63. struct ieee80211req ireq;
  64. os_memset(&ireq, 0, sizeof(ireq));
  65. os_strlcpy(ireq.i_name, drv->ifname, sizeof(ireq.i_name));
  66. ireq.i_type = op;
  67. ireq.i_val = val;
  68. ireq.i_data = (void *) arg;
  69. ireq.i_len = arg_len;
  70. if (ioctl(drv->sock, SIOCS80211, &ireq) < 0) {
  71. wpa_printf(MSG_ERROR, "ioctl[SIOCS80211, op=%u, val=%u, "
  72. "arg_len=%u]: %s", op, val, arg_len,
  73. strerror(errno));
  74. return -1;
  75. }
  76. return 0;
  77. }
  78. static int
  79. bsd_get80211(void *priv, struct ieee80211req *ireq, int op, void *arg,
  80. int arg_len)
  81. {
  82. struct bsd_driver_data *drv = priv;
  83. os_memset(ireq, 0, sizeof(*ireq));
  84. os_strlcpy(ireq->i_name, drv->ifname, sizeof(ireq->i_name));
  85. ireq->i_type = op;
  86. ireq->i_len = arg_len;
  87. ireq->i_data = arg;
  88. if (ioctl(drv->sock, SIOCG80211, ireq) < 0) {
  89. wpa_printf(MSG_ERROR, "ioctl[SIOCS80211, op=%u, "
  90. "arg_len=%u]: %s", op, arg_len, strerror(errno));
  91. return -1;
  92. }
  93. return 0;
  94. }
  95. static int
  96. get80211var(struct bsd_driver_data *drv, int op, void *arg, int arg_len)
  97. {
  98. struct ieee80211req ireq;
  99. if (bsd_get80211(drv, &ireq, op, arg, arg_len) < 0)
  100. return -1;
  101. return ireq.i_len;
  102. }
  103. static int
  104. set80211var(struct bsd_driver_data *drv, int op, const void *arg, int arg_len)
  105. {
  106. return bsd_set80211(drv, op, 0, arg, arg_len);
  107. }
  108. static int
  109. set80211param(struct bsd_driver_data *drv, int op, int arg)
  110. {
  111. return bsd_set80211(drv, op, arg, NULL, 0);
  112. }
  113. static int
  114. bsd_get_ssid(const char *ifname, void *priv, u8 *ssid, int len)
  115. {
  116. struct bsd_driver_data *drv = priv;
  117. #ifdef SIOCG80211NWID
  118. struct ieee80211_nwid nwid;
  119. struct ifreq ifr;
  120. os_memset(&ifr, 0, sizeof(ifr));
  121. os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name));
  122. ifr.ifr_data = (void *)&nwid;
  123. if (ioctl(drv->sock, SIOCG80211NWID, &ifr) < 0 ||
  124. nwid.i_len > IEEE80211_NWID_LEN)
  125. return -1;
  126. os_memcpy(ssid, nwid.i_nwid, nwid.i_len);
  127. return nwid.i_len;
  128. #else
  129. return get80211var(drv, IEEE80211_IOC_SSID, ssid, IEEE80211_NWID_LEN);
  130. #endif
  131. }
  132. static int
  133. bsd_set_ssid(const char *ifname, void *priv, const u8 *ssid, int ssid_len)
  134. {
  135. struct bsd_driver_data *drv = priv;
  136. #ifdef SIOCS80211NWID
  137. struct ieee80211_nwid nwid;
  138. struct ifreq ifr;
  139. os_memcpy(nwid.i_nwid, ssid, ssid_len);
  140. nwid.i_len = ssid_len;
  141. os_memset(&ifr, 0, sizeof(ifr));
  142. os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name));
  143. ifr.ifr_data = (void *)&nwid;
  144. return ioctl(drv->sock, SIOCS80211NWID, &ifr);
  145. #else
  146. return set80211var(drv, IEEE80211_IOC_SSID, ssid, ssid_len);
  147. #endif
  148. }
  149. static int
  150. bsd_get_if_media(void *priv)
  151. {
  152. struct bsd_driver_data *drv = priv;
  153. struct ifmediareq ifmr;
  154. os_memset(&ifmr, 0, sizeof(ifmr));
  155. os_strlcpy(ifmr.ifm_name, drv->ifname, sizeof(ifmr.ifm_name));
  156. if (ioctl(drv->sock, SIOCGIFMEDIA, &ifmr) < 0) {
  157. wpa_printf(MSG_ERROR, "%s: SIOCGIFMEDIA %s", __func__,
  158. strerror(errno));
  159. return -1;
  160. }
  161. return ifmr.ifm_current;
  162. }
  163. static int
  164. bsd_set_if_media(void *priv, int media)
  165. {
  166. struct bsd_driver_data *drv = priv;
  167. struct ifreq ifr;
  168. os_memset(&ifr, 0, sizeof(ifr));
  169. os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name));
  170. ifr.ifr_media = media;
  171. if (ioctl(drv->sock, SIOCSIFMEDIA, &ifr) < 0) {
  172. wpa_printf(MSG_ERROR, "%s: SIOCSIFMEDIA %s", __func__,
  173. strerror(errno));
  174. return -1;
  175. }
  176. return 0;
  177. }
  178. static int
  179. bsd_set_mediaopt(void *priv, uint32_t mask, uint32_t mode)
  180. {
  181. int media = bsd_get_if_media(priv);
  182. if (media < 0)
  183. return -1;
  184. media &= ~mask;
  185. media |= mode;
  186. if (bsd_set_if_media(priv, media) < 0)
  187. return -1;
  188. return 0;
  189. }
  190. static int
  191. bsd_del_key(void *priv, const u8 *addr, int key_idx)
  192. {
  193. struct ieee80211req_del_key wk;
  194. os_memset(&wk, 0, sizeof(wk));
  195. if (addr == NULL) {
  196. wpa_printf(MSG_DEBUG, "%s: key_idx=%d", __func__, key_idx);
  197. wk.idk_keyix = key_idx;
  198. } else {
  199. wpa_printf(MSG_DEBUG, "%s: addr=" MACSTR, __func__,
  200. MAC2STR(addr));
  201. os_memcpy(wk.idk_macaddr, addr, IEEE80211_ADDR_LEN);
  202. wk.idk_keyix = (u_int8_t) IEEE80211_KEYIX_NONE; /* XXX */
  203. }
  204. return set80211var(priv, IEEE80211_IOC_DELKEY, &wk, sizeof(wk));
  205. }
  206. static int
  207. bsd_send_mlme_param(void *priv, const u8 op, const u16 reason, const u8 *addr)
  208. {
  209. struct ieee80211req_mlme mlme;
  210. os_memset(&mlme, 0, sizeof(mlme));
  211. mlme.im_op = op;
  212. mlme.im_reason = reason;
  213. os_memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);
  214. return set80211var(priv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme));
  215. }
  216. static int
  217. bsd_ctrl_iface(void *priv, int enable)
  218. {
  219. struct bsd_driver_data *drv = priv;
  220. struct ifreq ifr;
  221. os_memset(&ifr, 0, sizeof(ifr));
  222. os_strlcpy(ifr.ifr_name, drv->ifname, sizeof(ifr.ifr_name));
  223. if (ioctl(drv->sock, SIOCGIFFLAGS, &ifr) < 0) {
  224. perror("ioctl[SIOCGIFFLAGS]");
  225. return -1;
  226. }
  227. if (enable)
  228. ifr.ifr_flags |= IFF_UP;
  229. else
  230. ifr.ifr_flags &= ~IFF_UP;
  231. if (ioctl(drv->sock, SIOCSIFFLAGS, &ifr) < 0) {
  232. perror("ioctl[SIOCSIFFLAGS]");
  233. return -1;
  234. }
  235. return 0;
  236. }
  237. static int
  238. bsd_set_key(const char *ifname, void *priv, enum wpa_alg alg,
  239. const unsigned char *addr, int key_idx, int set_tx, const u8 *seq,
  240. size_t seq_len, const u8 *key, size_t key_len)
  241. {
  242. struct ieee80211req_key wk;
  243. wpa_printf(MSG_DEBUG, "%s: alg=%d addr=%p key_idx=%d set_tx=%d "
  244. "seq_len=%zu key_len=%zu", __func__, alg, addr, key_idx,
  245. set_tx, seq_len, key_len);
  246. if (alg == WPA_ALG_NONE) {
  247. #ifndef HOSTAPD
  248. if (addr == NULL ||
  249. os_memcmp(addr, "\xff\xff\xff\xff\xff\xff",
  250. IEEE80211_ADDR_LEN) == 0)
  251. return bsd_del_key(priv, NULL, key_idx);
  252. else
  253. #endif /* HOSTAPD */
  254. return bsd_del_key(priv, addr, key_idx);
  255. }
  256. os_memset(&wk, 0, sizeof(wk));
  257. switch (alg) {
  258. case WPA_ALG_WEP:
  259. wk.ik_type = IEEE80211_CIPHER_WEP;
  260. break;
  261. case WPA_ALG_TKIP:
  262. wk.ik_type = IEEE80211_CIPHER_TKIP;
  263. break;
  264. case WPA_ALG_CCMP:
  265. wk.ik_type = IEEE80211_CIPHER_AES_CCM;
  266. break;
  267. default:
  268. wpa_printf(MSG_ERROR, "%s: unknown alg=%d", __func__, alg);
  269. return -1;
  270. }
  271. wk.ik_flags = IEEE80211_KEY_RECV;
  272. if (set_tx)
  273. wk.ik_flags |= IEEE80211_KEY_XMIT;
  274. if (addr == NULL) {
  275. os_memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN);
  276. wk.ik_keyix = key_idx;
  277. } else {
  278. os_memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN);
  279. /*
  280. * Deduce whether group/global or unicast key by checking
  281. * the address (yech). Note also that we can only mark global
  282. * keys default; doing this for a unicast key is an error.
  283. */
  284. if (os_memcmp(addr, "\xff\xff\xff\xff\xff\xff",
  285. IEEE80211_ADDR_LEN) == 0) {
  286. wk.ik_flags |= IEEE80211_KEY_GROUP;
  287. wk.ik_keyix = key_idx;
  288. } else {
  289. wk.ik_keyix = key_idx == 0 ? IEEE80211_KEYIX_NONE :
  290. key_idx;
  291. }
  292. }
  293. if (wk.ik_keyix != IEEE80211_KEYIX_NONE && set_tx)
  294. wk.ik_flags |= IEEE80211_KEY_DEFAULT;
  295. wk.ik_keylen = key_len;
  296. os_memcpy(&wk.ik_keyrsc, seq, seq_len);
  297. os_memcpy(wk.ik_keydata, key, key_len);
  298. return set80211var(priv, IEEE80211_IOC_WPAKEY, &wk, sizeof(wk));
  299. }
  300. static int
  301. bsd_configure_wpa(void *priv, struct wpa_bss_params *params)
  302. {
  303. #ifndef IEEE80211_IOC_APPIE
  304. static const char *ciphernames[] =
  305. { "WEP", "TKIP", "AES-OCB", "AES-CCM", "CKIP", "NONE" };
  306. int v;
  307. switch (params->wpa_group) {
  308. case WPA_CIPHER_CCMP:
  309. v = IEEE80211_CIPHER_AES_CCM;
  310. break;
  311. case WPA_CIPHER_TKIP:
  312. v = IEEE80211_CIPHER_TKIP;
  313. break;
  314. case WPA_CIPHER_WEP104:
  315. v = IEEE80211_CIPHER_WEP;
  316. break;
  317. case WPA_CIPHER_WEP40:
  318. v = IEEE80211_CIPHER_WEP;
  319. break;
  320. case WPA_CIPHER_NONE:
  321. v = IEEE80211_CIPHER_NONE;
  322. break;
  323. default:
  324. printf("Unknown group key cipher %u\n",
  325. params->wpa_group);
  326. return -1;
  327. }
  328. wpa_printf(MSG_DEBUG, "%s: group key cipher=%s (%u)",
  329. __func__, ciphernames[v], v);
  330. if (set80211param(priv, IEEE80211_IOC_MCASTCIPHER, v)) {
  331. printf("Unable to set group key cipher to %u (%s)\n",
  332. v, ciphernames[v]);
  333. return -1;
  334. }
  335. if (v == IEEE80211_CIPHER_WEP) {
  336. /* key length is done only for specific ciphers */
  337. v = (params->wpa_group == WPA_CIPHER_WEP104 ? 13 : 5);
  338. if (set80211param(priv, IEEE80211_IOC_MCASTKEYLEN, v)) {
  339. printf("Unable to set group key length to %u\n", v);
  340. return -1;
  341. }
  342. }
  343. v = 0;
  344. if (params->wpa_pairwise & WPA_CIPHER_CCMP)
  345. v |= 1<<IEEE80211_CIPHER_AES_CCM;
  346. if (params->wpa_pairwise & WPA_CIPHER_TKIP)
  347. v |= 1<<IEEE80211_CIPHER_TKIP;
  348. if (params->wpa_pairwise & WPA_CIPHER_NONE)
  349. v |= 1<<IEEE80211_CIPHER_NONE;
  350. wpa_printf(MSG_DEBUG, "%s: pairwise key ciphers=0x%x", __func__, v);
  351. if (set80211param(priv, IEEE80211_IOC_UCASTCIPHERS, v)) {
  352. printf("Unable to set pairwise key ciphers to 0x%x\n", v);
  353. return -1;
  354. }
  355. wpa_printf(MSG_DEBUG, "%s: key management algorithms=0x%x",
  356. __func__, params->wpa_key_mgmt);
  357. if (set80211param(priv, IEEE80211_IOC_KEYMGTALGS,
  358. params->wpa_key_mgmt)) {
  359. printf("Unable to set key management algorithms to 0x%x\n",
  360. params->wpa_key_mgmt);
  361. return -1;
  362. }
  363. v = 0;
  364. if (params->rsn_preauth)
  365. v |= BIT(0);
  366. wpa_printf(MSG_DEBUG, "%s: rsn capabilities=0x%x",
  367. __func__, params->rsn_preauth);
  368. if (set80211param(priv, IEEE80211_IOC_RSNCAPS, v)) {
  369. printf("Unable to set RSN capabilities to 0x%x\n", v);
  370. return -1;
  371. }
  372. #endif /* IEEE80211_IOC_APPIE */
  373. wpa_printf(MSG_DEBUG, "%s: enable WPA= 0x%x", __func__, params->wpa);
  374. if (set80211param(priv, IEEE80211_IOC_WPA, params->wpa)) {
  375. printf("Unable to set WPA to %u\n", params->wpa);
  376. return -1;
  377. }
  378. return 0;
  379. }
  380. static int
  381. bsd_set_ieee8021x(void *priv, struct wpa_bss_params *params)
  382. {
  383. wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, params->enabled);
  384. if (!params->enabled) {
  385. /* XXX restore state */
  386. return set80211param(priv, IEEE80211_IOC_AUTHMODE,
  387. IEEE80211_AUTH_AUTO);
  388. }
  389. if (!params->wpa && !params->ieee802_1x) {
  390. wpa_printf(MSG_ERROR, "%s: No 802.1X or WPA enabled",
  391. __func__);
  392. return -1;
  393. }
  394. if (params->wpa && bsd_configure_wpa(priv, params) != 0) {
  395. wpa_printf(MSG_ERROR, "%s: Failed to configure WPA state",
  396. __func__);
  397. return -1;
  398. }
  399. if (set80211param(priv, IEEE80211_IOC_AUTHMODE,
  400. (params->wpa ? IEEE80211_AUTH_WPA : IEEE80211_AUTH_8021X))) {
  401. wpa_printf(MSG_ERROR, "%s: Failed to enable WPA/802.1X",
  402. __func__);
  403. return -1;
  404. }
  405. return bsd_ctrl_iface(priv, 1);
  406. }
  407. static int
  408. bsd_set_sta_authorized(void *priv, const u8 *addr, int total_flags,
  409. int flags_or, int flags_and)
  410. {
  411. int authorized = -1;
  412. /* For now, only support setting Authorized flag */
  413. if (flags_or & WPA_STA_AUTHORIZED)
  414. authorized = 1;
  415. if (!(flags_and & WPA_STA_AUTHORIZED))
  416. authorized = 0;
  417. if (authorized < 0)
  418. return 0;
  419. return bsd_send_mlme_param(priv, authorized ?
  420. IEEE80211_MLME_AUTHORIZE :
  421. IEEE80211_MLME_UNAUTHORIZE, 0, addr);
  422. }
  423. static void
  424. bsd_new_sta(void *priv, void *ctx, u8 addr[IEEE80211_ADDR_LEN])
  425. {
  426. struct ieee80211req_wpaie ie;
  427. int ielen = 0;
  428. u8 *iebuf = NULL;
  429. /*
  430. * Fetch and validate any negotiated WPA/RSN parameters.
  431. */
  432. memset(&ie, 0, sizeof(ie));
  433. memcpy(ie.wpa_macaddr, addr, IEEE80211_ADDR_LEN);
  434. if (get80211var(priv, IEEE80211_IOC_WPAIE, &ie, sizeof(ie)) < 0) {
  435. printf("Failed to get WPA/RSN information element.\n");
  436. goto no_ie;
  437. }
  438. iebuf = ie.wpa_ie;
  439. ielen = ie.wpa_ie[1];
  440. if (ielen == 0)
  441. iebuf = NULL;
  442. else
  443. ielen += 2;
  444. no_ie:
  445. drv_event_assoc(ctx, addr, iebuf, ielen);
  446. }
  447. static int
  448. bsd_send_eapol(void *priv, const u8 *addr, const u8 *data, size_t data_len,
  449. int encrypt, const u8 *own_addr)
  450. {
  451. struct bsd_driver_data *drv = priv;
  452. wpa_hexdump(MSG_MSGDUMP, "TX EAPOL", data, data_len);
  453. return l2_packet_send(drv->sock_xmit, addr, ETH_P_EAPOL, data,
  454. data_len);
  455. }
  456. static int
  457. bsd_set_freq(void *priv, u16 channel)
  458. {
  459. struct bsd_driver_data *drv = priv;
  460. #ifdef SIOCS80211CHANNEL
  461. struct ieee80211chanreq creq;
  462. #endif /* SIOCS80211CHANNEL */
  463. u32 mode;
  464. if (channel < 14)
  465. mode = IFM_IEEE80211_11G;
  466. else if (channel == 14)
  467. mode = IFM_IEEE80211_11B;
  468. else
  469. mode = IFM_IEEE80211_11A;
  470. if (bsd_set_mediaopt(drv, IFM_MMASK, mode) < 0) {
  471. wpa_printf(MSG_ERROR, "%s: failed to set modulation mode",
  472. __func__);
  473. return -1;
  474. }
  475. #ifdef SIOCS80211CHANNEL
  476. os_memset(&creq, 0, sizeof(creq));
  477. os_strlcpy(creq.i_name, drv->ifname, sizeof(creq.i_name));
  478. creq.i_channel = channel;
  479. return ioctl(drv->sock, SIOCS80211CHANNEL, &creq);
  480. #else /* SIOCS80211CHANNEL */
  481. return set80211param(priv, IEEE80211_IOC_CHANNEL, channel);
  482. #endif /* SIOCS80211CHANNEL */
  483. }
  484. static int
  485. bsd_set_opt_ie(const char *ifname, void *priv, const u8 *ie, size_t ie_len)
  486. {
  487. #ifdef IEEE80211_IOC_APPIE
  488. wpa_printf(MSG_DEBUG, "%s: set WPA+RSN ie (len %lu)", __func__,
  489. (unsigned long)ie_len);
  490. return bsd_set80211(priv, IEEE80211_IOC_APPIE, IEEE80211_APPIE_WPA,
  491. ie, ie_len);
  492. #endif /* IEEE80211_IOC_APPIE */
  493. return 0;
  494. }
  495. #ifdef HOSTAPD
  496. /*
  497. * Avoid conflicts with hostapd definitions by undefining couple of defines
  498. * from net80211 header files.
  499. */
  500. #undef RSN_VERSION
  501. #undef WPA_VERSION
  502. #undef WPA_OUI_TYPE
  503. static int bsd_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
  504. int reason_code);
  505. static const char *
  506. ether_sprintf(const u8 *addr)
  507. {
  508. static char buf[sizeof(MACSTR)];
  509. if (addr != NULL)
  510. snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
  511. else
  512. snprintf(buf, sizeof(buf), MACSTR, 0,0,0,0,0,0);
  513. return buf;
  514. }
  515. static int
  516. bsd_set_privacy(const char *ifname, void *priv, int enabled)
  517. {
  518. wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, enabled);
  519. return set80211param(priv, IEEE80211_IOC_PRIVACY, enabled);
  520. }
  521. static int
  522. bsd_get_seqnum(const char *ifname, void *priv, const u8 *addr, int idx,
  523. u8 *seq)
  524. {
  525. struct ieee80211req_key wk;
  526. wpa_printf(MSG_DEBUG, "%s: addr=%s idx=%d",
  527. __func__, ether_sprintf(addr), idx);
  528. memset(&wk, 0, sizeof(wk));
  529. if (addr == NULL)
  530. memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN);
  531. else
  532. memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN);
  533. wk.ik_keyix = idx;
  534. if (get80211var(priv, IEEE80211_IOC_WPAKEY, &wk, sizeof(wk)) < 0) {
  535. printf("Failed to get encryption.\n");
  536. return -1;
  537. }
  538. #ifdef WORDS_BIGENDIAN
  539. {
  540. /*
  541. * wk.ik_keytsc is in host byte order (big endian), need to
  542. * swap it to match with the byte order used in WPA.
  543. */
  544. int i;
  545. u8 tmp[WPA_KEY_RSC_LEN];
  546. memcpy(tmp, &wk.ik_keytsc, sizeof(wk.ik_keytsc));
  547. for (i = 0; i < WPA_KEY_RSC_LEN; i++) {
  548. seq[i] = tmp[WPA_KEY_RSC_LEN - i - 1];
  549. }
  550. }
  551. #else /* WORDS_BIGENDIAN */
  552. memcpy(seq, &wk.ik_keytsc, sizeof(wk.ik_keytsc));
  553. #endif /* WORDS_BIGENDIAN */
  554. return 0;
  555. }
  556. static int
  557. bsd_flush(void *priv)
  558. {
  559. u8 allsta[IEEE80211_ADDR_LEN];
  560. memset(allsta, 0xff, IEEE80211_ADDR_LEN);
  561. return bsd_sta_deauth(priv, NULL, allsta, IEEE80211_REASON_AUTH_LEAVE);
  562. }
  563. static int
  564. bsd_read_sta_driver_data(void *priv, struct hostap_sta_driver_data *data,
  565. const u8 *addr)
  566. {
  567. struct ieee80211req_sta_stats stats;
  568. memcpy(stats.is_u.macaddr, addr, IEEE80211_ADDR_LEN);
  569. if (get80211var(priv, IEEE80211_IOC_STA_STATS, &stats, sizeof(stats))
  570. > 0) {
  571. /* XXX? do packets counts include non-data frames? */
  572. data->rx_packets = stats.is_stats.ns_rx_data;
  573. data->rx_bytes = stats.is_stats.ns_rx_bytes;
  574. data->tx_packets = stats.is_stats.ns_tx_data;
  575. data->tx_bytes = stats.is_stats.ns_tx_bytes;
  576. }
  577. return 0;
  578. }
  579. static int
  580. bsd_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr, int reason_code)
  581. {
  582. return bsd_send_mlme_param(priv, IEEE80211_MLME_DEAUTH, reason_code,
  583. addr);
  584. }
  585. static int
  586. bsd_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
  587. int reason_code)
  588. {
  589. return bsd_send_mlme_param(priv, IEEE80211_MLME_DISASSOC, reason_code,
  590. addr);
  591. }
  592. static void
  593. bsd_wireless_event_receive(int sock, void *ctx, void *sock_ctx)
  594. {
  595. struct bsd_driver_data *drv = ctx;
  596. char buf[2048];
  597. struct if_announcemsghdr *ifan;
  598. struct rt_msghdr *rtm;
  599. struct ieee80211_michael_event *mic;
  600. struct ieee80211_join_event *join;
  601. struct ieee80211_leave_event *leave;
  602. int n;
  603. union wpa_event_data data;
  604. n = read(sock, buf, sizeof(buf));
  605. if (n < 0) {
  606. if (errno != EINTR && errno != EAGAIN)
  607. perror("read(PF_ROUTE)");
  608. return;
  609. }
  610. rtm = (struct rt_msghdr *) buf;
  611. if (rtm->rtm_version != RTM_VERSION) {
  612. wpa_printf(MSG_DEBUG, "Routing message version %d not "
  613. "understood\n", rtm->rtm_version);
  614. return;
  615. }
  616. ifan = (struct if_announcemsghdr *) rtm;
  617. switch (rtm->rtm_type) {
  618. case RTM_IEEE80211:
  619. switch (ifan->ifan_what) {
  620. case RTM_IEEE80211_ASSOC:
  621. case RTM_IEEE80211_REASSOC:
  622. case RTM_IEEE80211_DISASSOC:
  623. case RTM_IEEE80211_SCAN:
  624. break;
  625. case RTM_IEEE80211_LEAVE:
  626. leave = (struct ieee80211_leave_event *) &ifan[1];
  627. drv_event_disassoc(drv->hapd, leave->iev_addr);
  628. break;
  629. case RTM_IEEE80211_JOIN:
  630. #ifdef RTM_IEEE80211_REJOIN
  631. case RTM_IEEE80211_REJOIN:
  632. #endif
  633. join = (struct ieee80211_join_event *) &ifan[1];
  634. bsd_new_sta(drv, drv->hapd, join->iev_addr);
  635. break;
  636. case RTM_IEEE80211_REPLAY:
  637. /* ignore */
  638. break;
  639. case RTM_IEEE80211_MICHAEL:
  640. mic = (struct ieee80211_michael_event *) &ifan[1];
  641. wpa_printf(MSG_DEBUG,
  642. "Michael MIC failure wireless event: "
  643. "keyix=%u src_addr=" MACSTR, mic->iev_keyix,
  644. MAC2STR(mic->iev_src));
  645. os_memset(&data, 0, sizeof(data));
  646. data.michael_mic_failure.unicast = 1;
  647. data.michael_mic_failure.src = mic->iev_src;
  648. wpa_supplicant_event(drv->hapd,
  649. EVENT_MICHAEL_MIC_FAILURE, &data);
  650. break;
  651. }
  652. break;
  653. }
  654. }
  655. static void
  656. handle_read(void *ctx, const u8 *src_addr, const u8 *buf, size_t len)
  657. {
  658. struct bsd_driver_data *drv = ctx;
  659. drv_event_eapol_rx(drv->hapd, src_addr, buf, len);
  660. }
  661. static int
  662. hostapd_bsd_set_freq(void *priv, struct hostapd_freq_params *freq)
  663. {
  664. return bsd_set_freq(priv, freq->channel);
  665. }
  666. static void *
  667. bsd_init(struct hostapd_data *hapd, struct wpa_init_params *params)
  668. {
  669. struct bsd_driver_data *drv;
  670. drv = os_zalloc(sizeof(struct bsd_driver_data));
  671. if (drv == NULL) {
  672. printf("Could not allocate memory for bsd driver data\n");
  673. goto bad;
  674. }
  675. drv->hapd = hapd;
  676. drv->sock = socket(PF_INET, SOCK_DGRAM, 0);
  677. if (drv->sock < 0) {
  678. perror("socket[PF_INET,SOCK_DGRAM]");
  679. goto bad;
  680. }
  681. os_strlcpy(drv->ifname, params->ifname, sizeof(drv->ifname));
  682. drv->sock_xmit = l2_packet_init(drv->ifname, NULL, ETH_P_EAPOL,
  683. handle_read, drv, 0);
  684. if (drv->sock_xmit == NULL)
  685. goto bad;
  686. if (l2_packet_get_own_addr(drv->sock_xmit, params->own_addr))
  687. goto bad;
  688. /* mark down during setup */
  689. if (bsd_ctrl_iface(drv, 0) < 0)
  690. goto bad;
  691. drv->route = socket(PF_ROUTE, SOCK_RAW, 0);
  692. if (drv->route < 0) {
  693. perror("socket(PF_ROUTE,SOCK_RAW)");
  694. goto bad;
  695. }
  696. eloop_register_read_sock(drv->route, bsd_wireless_event_receive, drv,
  697. NULL);
  698. if (bsd_set_mediaopt(drv, IFM_OMASK, IFM_IEEE80211_HOSTAP) < 0) {
  699. wpa_printf(MSG_ERROR, "%s: failed to set operation mode",
  700. __func__);
  701. goto bad;
  702. }
  703. return drv;
  704. bad:
  705. if (drv->sock_xmit != NULL)
  706. l2_packet_deinit(drv->sock_xmit);
  707. if (drv->sock >= 0)
  708. close(drv->sock);
  709. if (drv != NULL)
  710. os_free(drv);
  711. return NULL;
  712. }
  713. static void
  714. bsd_deinit(void *priv)
  715. {
  716. struct bsd_driver_data *drv = priv;
  717. if (drv->route >= 0) {
  718. eloop_unregister_read_sock(drv->route);
  719. close(drv->route);
  720. }
  721. bsd_ctrl_iface(drv, 0);
  722. if (drv->sock >= 0)
  723. close(drv->sock);
  724. if (drv->sock_xmit != NULL)
  725. l2_packet_deinit(drv->sock_xmit);
  726. os_free(drv);
  727. }
  728. #else /* HOSTAPD */
  729. static int
  730. get80211param(struct bsd_driver_data *drv, int op)
  731. {
  732. struct ieee80211req ireq;
  733. if (bsd_get80211(drv, &ireq, op, NULL, 0) < 0)
  734. return -1;
  735. return ireq.i_val;
  736. }
  737. static int
  738. wpa_driver_bsd_get_bssid(void *priv, u8 *bssid)
  739. {
  740. struct bsd_driver_data *drv = priv;
  741. #ifdef SIOCG80211BSSID
  742. struct ieee80211_bssid bs;
  743. os_strlcpy(bs.i_name, drv->ifname, sizeof(bs.i_name));
  744. if (ioctl(drv->sock, SIOCG80211BSSID, &bs) < 0)
  745. return -1;
  746. os_memcpy(bssid, bs.i_bssid, sizeof(bs.i_bssid));
  747. return 0;
  748. #else
  749. return get80211var(drv, IEEE80211_IOC_BSSID,
  750. bssid, IEEE80211_ADDR_LEN) < 0 ? -1 : 0;
  751. #endif
  752. }
  753. static int
  754. wpa_driver_bsd_get_ssid(void *priv, u8 *ssid)
  755. {
  756. struct bsd_driver_data *drv = priv;
  757. return bsd_get_ssid(drv->ifname, drv, ssid, 0);
  758. }
  759. static int
  760. wpa_driver_bsd_set_wpa_ie(struct bsd_driver_data *drv, const u8 *wpa_ie,
  761. size_t wpa_ie_len)
  762. {
  763. #ifdef IEEE80211_IOC_APPIE
  764. return bsd_set_opt_ie(drv->ifname, drv, wpa_ie, wpa_ie_len);
  765. #else /* IEEE80211_IOC_APPIE */
  766. return set80211var(drv, IEEE80211_IOC_OPTIE, wpa_ie, wpa_ie_len);
  767. #endif /* IEEE80211_IOC_APPIE */
  768. }
  769. static int
  770. wpa_driver_bsd_set_wpa_internal(void *priv, int wpa, int privacy)
  771. {
  772. int ret = 0;
  773. wpa_printf(MSG_DEBUG, "%s: wpa=%d privacy=%d",
  774. __FUNCTION__, wpa, privacy);
  775. if (!wpa && wpa_driver_bsd_set_wpa_ie(priv, NULL, 0) < 0)
  776. ret = -1;
  777. if (set80211param(priv, IEEE80211_IOC_PRIVACY, privacy) < 0)
  778. ret = -1;
  779. if (set80211param(priv, IEEE80211_IOC_WPA, wpa) < 0)
  780. ret = -1;
  781. return ret;
  782. }
  783. static int
  784. wpa_driver_bsd_set_wpa(void *priv, int enabled)
  785. {
  786. wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
  787. return wpa_driver_bsd_set_wpa_internal(priv, enabled ? 3 : 0, enabled);
  788. }
  789. static int
  790. wpa_driver_bsd_set_countermeasures(void *priv, int enabled)
  791. {
  792. wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, enabled);
  793. return set80211param(priv, IEEE80211_IOC_COUNTERMEASURES, enabled);
  794. }
  795. static int
  796. wpa_driver_bsd_set_drop_unencrypted(void *priv, int enabled)
  797. {
  798. wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, enabled);
  799. return set80211param(priv, IEEE80211_IOC_DROPUNENCRYPTED, enabled);
  800. }
  801. static int
  802. wpa_driver_bsd_deauthenticate(void *priv, const u8 *addr, int reason_code)
  803. {
  804. return bsd_send_mlme_param(priv, IEEE80211_MLME_DEAUTH, reason_code,
  805. addr);
  806. }
  807. static int
  808. wpa_driver_bsd_disassociate(void *priv, const u8 *addr, int reason_code)
  809. {
  810. return bsd_send_mlme_param(priv, IEEE80211_MLME_DISASSOC, reason_code,
  811. addr);
  812. }
  813. static int
  814. wpa_driver_bsd_set_auth_alg(void *priv, int auth_alg)
  815. {
  816. int authmode;
  817. if ((auth_alg & WPA_AUTH_ALG_OPEN) &&
  818. (auth_alg & WPA_AUTH_ALG_SHARED))
  819. authmode = IEEE80211_AUTH_AUTO;
  820. else if (auth_alg & WPA_AUTH_ALG_SHARED)
  821. authmode = IEEE80211_AUTH_SHARED;
  822. else
  823. authmode = IEEE80211_AUTH_OPEN;
  824. return set80211param(priv, IEEE80211_IOC_AUTHMODE, authmode);
  825. }
  826. static void
  827. handle_read(void *ctx, const u8 *src_addr, const u8 *buf, size_t len)
  828. {
  829. struct bsd_driver_data *drv = ctx;
  830. drv_event_eapol_rx(drv->ctx, src_addr, buf, len);
  831. }
  832. static int
  833. wpa_driver_bsd_associate(void *priv, struct wpa_driver_associate_params *params)
  834. {
  835. struct bsd_driver_data *drv = priv;
  836. struct ieee80211req_mlme mlme;
  837. u32 mode;
  838. u16 channel;
  839. int privacy;
  840. int ret = 0;
  841. wpa_printf(MSG_DEBUG,
  842. "%s: ssid '%.*s' wpa ie len %u pairwise %u group %u key mgmt %u"
  843. , __func__
  844. , (unsigned int) params->ssid_len, params->ssid
  845. , (unsigned int) params->wpa_ie_len
  846. , params->pairwise_suite
  847. , params->group_suite
  848. , params->key_mgmt_suite
  849. );
  850. switch (params->mode) {
  851. case IEEE80211_MODE_INFRA:
  852. mode = 0 /* STA */;
  853. break;
  854. case IEEE80211_MODE_IBSS:
  855. mode = IFM_IEEE80211_IBSS;
  856. break;
  857. case IEEE80211_MODE_AP:
  858. mode = IFM_IEEE80211_HOSTAP;
  859. break;
  860. default:
  861. wpa_printf(MSG_ERROR, "%s: unknown operation mode", __func__);
  862. return -1;
  863. }
  864. if (bsd_set_mediaopt(drv, IFM_OMASK, mode) < 0) {
  865. wpa_printf(MSG_ERROR, "%s: failed to set operation mode",
  866. __func__);
  867. return -1;
  868. }
  869. if (params->mode == IEEE80211_MODE_AP) {
  870. if (params->freq >= 2412 && params->freq <= 2472)
  871. channel = (params->freq - 2407) / 5;
  872. else if (params->freq == 2484)
  873. channel = 14;
  874. else if ((params->freq >= 5180 && params->freq <= 5240) ||
  875. (params->freq >= 5745 && params->freq <= 5825))
  876. channel = (params->freq - 5000) / 5;
  877. else
  878. channel = 0;
  879. if (bsd_set_freq(drv, channel) < 0)
  880. return -1;
  881. drv->sock_xmit = l2_packet_init(drv->ifname, NULL, ETH_P_EAPOL,
  882. handle_read, drv, 0);
  883. if (drv->sock_xmit == NULL)
  884. return -1;
  885. drv->is_ap = 1;
  886. return 0;
  887. }
  888. if (wpa_driver_bsd_set_drop_unencrypted(drv, params->drop_unencrypted)
  889. < 0)
  890. ret = -1;
  891. if (wpa_driver_bsd_set_auth_alg(drv, params->auth_alg) < 0)
  892. ret = -1;
  893. /* XXX error handling is wrong but unclear what to do... */
  894. if (wpa_driver_bsd_set_wpa_ie(drv, params->wpa_ie, params->wpa_ie_len) < 0)
  895. return -1;
  896. privacy = !(params->pairwise_suite == CIPHER_NONE &&
  897. params->group_suite == CIPHER_NONE &&
  898. params->key_mgmt_suite == KEY_MGMT_NONE &&
  899. params->wpa_ie_len == 0);
  900. wpa_printf(MSG_DEBUG, "%s: set PRIVACY %u", __func__, privacy);
  901. if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0)
  902. return -1;
  903. if (params->wpa_ie_len &&
  904. set80211param(drv, IEEE80211_IOC_WPA,
  905. params->wpa_ie[0] == WLAN_EID_RSN ? 2 : 1) < 0)
  906. return -1;
  907. os_memset(&mlme, 0, sizeof(mlme));
  908. mlme.im_op = IEEE80211_MLME_ASSOC;
  909. if (params->ssid != NULL)
  910. os_memcpy(mlme.im_ssid, params->ssid, params->ssid_len);
  911. mlme.im_ssid_len = params->ssid_len;
  912. if (params->bssid != NULL)
  913. os_memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN);
  914. if (set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme)) < 0)
  915. return -1;
  916. return ret;
  917. }
  918. static int
  919. wpa_driver_bsd_scan(void *priv, struct wpa_driver_scan_params *params)
  920. {
  921. struct bsd_driver_data *drv = priv;
  922. #ifdef IEEE80211_IOC_SCAN_MAX_SSID
  923. struct ieee80211_scan_req sr;
  924. int i;
  925. #endif /* IEEE80211_IOC_SCAN_MAX_SSID */
  926. if (bsd_set_mediaopt(drv, IFM_OMASK, 0 /* STA */) < 0) {
  927. wpa_printf(MSG_ERROR, "%s: failed to set operation mode",
  928. __func__);
  929. return -1;
  930. }
  931. if (set80211param(drv, IEEE80211_IOC_ROAMING,
  932. IEEE80211_ROAMING_MANUAL) < 0) {
  933. wpa_printf(MSG_ERROR, "%s: failed to set "
  934. "wpa_supplicant-based roaming: %s", __func__,
  935. strerror(errno));
  936. return -1;
  937. }
  938. if (wpa_driver_bsd_set_wpa(drv, 1) < 0) {
  939. wpa_printf(MSG_ERROR, "%s: failed to set wpa: %s", __func__,
  940. strerror(errno));
  941. return -1;
  942. }
  943. /* NB: interface must be marked UP to do a scan */
  944. if (bsd_ctrl_iface(drv, 1) < 0)
  945. return -1;
  946. #ifdef IEEE80211_IOC_SCAN_MAX_SSID
  947. os_memset(&sr, 0, sizeof(sr));
  948. sr.sr_flags = IEEE80211_IOC_SCAN_ACTIVE | IEEE80211_IOC_SCAN_ONCE |
  949. IEEE80211_IOC_SCAN_NOJOIN;
  950. sr.sr_duration = IEEE80211_IOC_SCAN_FOREVER;
  951. if (params->num_ssids > 0) {
  952. sr.sr_nssid = params->num_ssids;
  953. #if 0
  954. /* Boundary check is done by upper layer */
  955. if (sr.sr_nssid > IEEE80211_IOC_SCAN_MAX_SSID)
  956. sr.sr_nssid = IEEE80211_IOC_SCAN_MAX_SSID;
  957. #endif
  958. /* NB: check scan cache first */
  959. sr.sr_flags |= IEEE80211_IOC_SCAN_CHECK;
  960. }
  961. for (i = 0; i < sr.sr_nssid; i++) {
  962. sr.sr_ssid[i].len = params->ssids[i].ssid_len;
  963. os_memcpy(sr.sr_ssid[i].ssid, params->ssids[i].ssid,
  964. sr.sr_ssid[i].len);
  965. }
  966. /* NB: net80211 delivers a scan complete event so no need to poll */
  967. return set80211var(drv, IEEE80211_IOC_SCAN_REQ, &sr, sizeof(sr));
  968. #else /* IEEE80211_IOC_SCAN_MAX_SSID */
  969. /* set desired ssid before scan */
  970. if (bsd_set_ssid(drv->ifname, drv, params->ssids[0].ssid,
  971. params->ssids[0].ssid_len) < 0)
  972. return -1;
  973. /* NB: net80211 delivers a scan complete event so no need to poll */
  974. return set80211param(drv, IEEE80211_IOC_SCAN_REQ, 0);
  975. #endif /* IEEE80211_IOC_SCAN_MAX_SSID */
  976. }
  977. static void
  978. wpa_driver_bsd_event_receive(int sock, void *ctx, void *sock_ctx)
  979. {
  980. struct bsd_driver_data *drv = sock_ctx;
  981. char buf[2048];
  982. struct if_announcemsghdr *ifan;
  983. struct if_msghdr *ifm;
  984. struct rt_msghdr *rtm;
  985. union wpa_event_data event;
  986. struct ieee80211_michael_event *mic;
  987. struct ieee80211_leave_event *leave;
  988. struct ieee80211_join_event *join;
  989. int n;
  990. n = read(sock, buf, sizeof(buf));
  991. if (n < 0) {
  992. if (errno != EINTR && errno != EAGAIN)
  993. perror("read(PF_ROUTE)");
  994. return;
  995. }
  996. rtm = (struct rt_msghdr *) buf;
  997. if (rtm->rtm_version != RTM_VERSION) {
  998. wpa_printf(MSG_DEBUG, "Routing message version %d not "
  999. "understood\n", rtm->rtm_version);
  1000. return;
  1001. }
  1002. os_memset(&event, 0, sizeof(event));
  1003. switch (rtm->rtm_type) {
  1004. case RTM_IFANNOUNCE:
  1005. ifan = (struct if_announcemsghdr *) rtm;
  1006. if (ifan->ifan_index != drv->ifindex)
  1007. break;
  1008. os_strlcpy(event.interface_status.ifname, drv->ifname,
  1009. sizeof(event.interface_status.ifname));
  1010. switch (ifan->ifan_what) {
  1011. case IFAN_DEPARTURE:
  1012. event.interface_status.ievent = EVENT_INTERFACE_REMOVED;
  1013. default:
  1014. return;
  1015. }
  1016. wpa_printf(MSG_DEBUG, "RTM_IFANNOUNCE: Interface '%s' %s",
  1017. event.interface_status.ifname,
  1018. ifan->ifan_what == IFAN_DEPARTURE ?
  1019. "removed" : "added");
  1020. wpa_supplicant_event(ctx, EVENT_INTERFACE_STATUS, &event);
  1021. break;
  1022. case RTM_IEEE80211:
  1023. ifan = (struct if_announcemsghdr *) rtm;
  1024. if (ifan->ifan_index != drv->ifindex)
  1025. break;
  1026. switch (ifan->ifan_what) {
  1027. case RTM_IEEE80211_ASSOC:
  1028. case RTM_IEEE80211_REASSOC:
  1029. if (drv->is_ap)
  1030. break;
  1031. wpa_supplicant_event(ctx, EVENT_ASSOC, NULL);
  1032. break;
  1033. case RTM_IEEE80211_DISASSOC:
  1034. if (drv->is_ap)
  1035. break;
  1036. wpa_supplicant_event(ctx, EVENT_DISASSOC, NULL);
  1037. break;
  1038. case RTM_IEEE80211_SCAN:
  1039. if (drv->is_ap)
  1040. break;
  1041. wpa_supplicant_event(ctx, EVENT_SCAN_RESULTS, NULL);
  1042. break;
  1043. case RTM_IEEE80211_LEAVE:
  1044. leave = (struct ieee80211_leave_event *) &ifan[1];
  1045. drv_event_disassoc(ctx, leave->iev_addr);
  1046. break;
  1047. case RTM_IEEE80211_JOIN:
  1048. #ifdef RTM_IEEE80211_REJOIN
  1049. case RTM_IEEE80211_REJOIN:
  1050. #endif
  1051. join = (struct ieee80211_join_event *) &ifan[1];
  1052. bsd_new_sta(drv, ctx, join->iev_addr);
  1053. break;
  1054. case RTM_IEEE80211_REPLAY:
  1055. /* ignore */
  1056. break;
  1057. case RTM_IEEE80211_MICHAEL:
  1058. mic = (struct ieee80211_michael_event *) &ifan[1];
  1059. wpa_printf(MSG_DEBUG,
  1060. "Michael MIC failure wireless event: "
  1061. "keyix=%u src_addr=" MACSTR, mic->iev_keyix,
  1062. MAC2STR(mic->iev_src));
  1063. os_memset(&event, 0, sizeof(event));
  1064. event.michael_mic_failure.unicast =
  1065. !IEEE80211_IS_MULTICAST(mic->iev_dst);
  1066. wpa_supplicant_event(ctx, EVENT_MICHAEL_MIC_FAILURE,
  1067. &event);
  1068. break;
  1069. }
  1070. break;
  1071. case RTM_IFINFO:
  1072. ifm = (struct if_msghdr *) rtm;
  1073. if (ifm->ifm_index != drv->ifindex)
  1074. break;
  1075. if ((rtm->rtm_flags & RTF_UP) == 0) {
  1076. os_strlcpy(event.interface_status.ifname, drv->ifname,
  1077. sizeof(event.interface_status.ifname));
  1078. event.interface_status.ievent = EVENT_INTERFACE_REMOVED;
  1079. wpa_printf(MSG_DEBUG, "RTM_IFINFO: Interface '%s' DOWN",
  1080. event.interface_status.ifname);
  1081. wpa_supplicant_event(ctx, EVENT_INTERFACE_STATUS, &event);
  1082. }
  1083. break;
  1084. }
  1085. }
  1086. static void
  1087. wpa_driver_bsd_add_scan_entry(struct wpa_scan_results *res,
  1088. struct ieee80211req_scan_result *sr)
  1089. {
  1090. struct wpa_scan_res *result, **tmp;
  1091. size_t extra_len;
  1092. u8 *pos;
  1093. extra_len = 2 + sr->isr_ssid_len;
  1094. extra_len += 2 + sr->isr_nrates;
  1095. extra_len += 3; /* ERP IE */
  1096. extra_len += sr->isr_ie_len;
  1097. result = os_zalloc(sizeof(*result) + extra_len);
  1098. if (result == NULL)
  1099. return;
  1100. os_memcpy(result->bssid, sr->isr_bssid, ETH_ALEN);
  1101. result->freq = sr->isr_freq;
  1102. result->beacon_int = sr->isr_intval;
  1103. result->caps = sr->isr_capinfo;
  1104. result->qual = sr->isr_rssi;
  1105. result->noise = sr->isr_noise;
  1106. pos = (u8 *)(result + 1);
  1107. *pos++ = WLAN_EID_SSID;
  1108. *pos++ = sr->isr_ssid_len;
  1109. os_memcpy(pos, sr + 1, sr->isr_ssid_len);
  1110. pos += sr->isr_ssid_len;
  1111. /*
  1112. * Deal all rates as supported rate.
  1113. * Because net80211 doesn't report extended supported rate or not.
  1114. */
  1115. *pos++ = WLAN_EID_SUPP_RATES;
  1116. *pos++ = sr->isr_nrates;
  1117. os_memcpy(pos, sr->isr_rates, sr->isr_nrates);
  1118. pos += sr->isr_nrates;
  1119. *pos++ = WLAN_EID_ERP_INFO;
  1120. *pos++ = 1;
  1121. *pos++ = sr->isr_erp;
  1122. os_memcpy(pos, (u8 *)(sr + 1) + sr->isr_ssid_len, sr->isr_ie_len);
  1123. pos += sr->isr_ie_len;
  1124. result->ie_len = pos - (u8 *)(result + 1);
  1125. tmp = os_realloc(res->res,
  1126. (res->num + 1) * sizeof(struct wpa_scan_res *));
  1127. if (tmp == NULL) {
  1128. os_free(result);
  1129. return;
  1130. }
  1131. tmp[res->num++] = result;
  1132. res->res = tmp;
  1133. }
  1134. struct wpa_scan_results *
  1135. wpa_driver_bsd_get_scan_results2(void *priv)
  1136. {
  1137. struct ieee80211req_scan_result *sr;
  1138. struct wpa_scan_results *res;
  1139. int len, rest;
  1140. uint8_t buf[24*1024], *pos;
  1141. len = get80211var(priv, IEEE80211_IOC_SCAN_RESULTS, buf, 24*1024);
  1142. if (len < 0)
  1143. return NULL;
  1144. res = os_zalloc(sizeof(*res));
  1145. if (res == NULL)
  1146. return NULL;
  1147. pos = buf;
  1148. rest = len;
  1149. while (rest >= sizeof(struct ieee80211req_scan_result)) {
  1150. sr = (struct ieee80211req_scan_result *)pos;
  1151. wpa_driver_bsd_add_scan_entry(res, sr);
  1152. pos += sr->isr_len;
  1153. rest -= sr->isr_len;
  1154. }
  1155. wpa_printf(MSG_DEBUG, "Received %d bytes of scan results (%lu BSSes)",
  1156. len, (unsigned long)res->num);
  1157. return res;
  1158. }
  1159. static int wpa_driver_bsd_capa(struct bsd_driver_data *drv)
  1160. {
  1161. #ifdef IEEE80211_IOC_DEVCAPS
  1162. /* kernel definitions copied from net80211/ieee80211_var.h */
  1163. #define IEEE80211_CIPHER_WEP 0
  1164. #define IEEE80211_CIPHER_TKIP 1
  1165. #define IEEE80211_CIPHER_AES_CCM 3
  1166. #define IEEE80211_CRYPTO_WEP (1<<IEEE80211_CIPHER_WEP)
  1167. #define IEEE80211_CRYPTO_TKIP (1<<IEEE80211_CIPHER_TKIP)
  1168. #define IEEE80211_CRYPTO_AES_CCM (1<<IEEE80211_CIPHER_AES_CCM)
  1169. #define IEEE80211_C_HOSTAP 0x00000400 /* CAPABILITY: HOSTAP avail */
  1170. #define IEEE80211_C_WPA1 0x00800000 /* CAPABILITY: WPA1 avail */
  1171. #define IEEE80211_C_WPA2 0x01000000 /* CAPABILITY: WPA2 avail */
  1172. struct ieee80211_devcaps_req devcaps;
  1173. if (get80211var(drv, IEEE80211_IOC_DEVCAPS, &devcaps,
  1174. sizeof(devcaps)) < 0) {
  1175. wpa_printf(MSG_ERROR, "failed to IEEE80211_IOC_DEVCAPS: %s",
  1176. strerror(errno));
  1177. return -1;
  1178. }
  1179. wpa_printf(MSG_DEBUG, "%s: drivercaps=0x%08x,cryptocaps=0x%08x",
  1180. __func__, devcaps.dc_drivercaps, devcaps.dc_cryptocaps);
  1181. if (devcaps.dc_drivercaps & IEEE80211_C_WPA1)
  1182. drv->capa.key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA |
  1183. WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK;
  1184. if (devcaps.dc_drivercaps & IEEE80211_C_WPA2)
  1185. drv->capa.key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
  1186. WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK;
  1187. if (devcaps.dc_cryptocaps & IEEE80211_CRYPTO_WEP)
  1188. drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP40 |
  1189. WPA_DRIVER_CAPA_ENC_WEP104;
  1190. if (devcaps.dc_cryptocaps & IEEE80211_CRYPTO_TKIP)
  1191. drv->capa.enc |= WPA_DRIVER_CAPA_ENC_TKIP;
  1192. if (devcaps.dc_cryptocaps & IEEE80211_CRYPTO_AES_CCM)
  1193. drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP;
  1194. if (devcaps.dc_drivercaps & IEEE80211_C_HOSTAP)
  1195. drv->capa.flags |= WPA_DRIVER_FLAGS_AP;
  1196. #undef IEEE80211_CIPHER_WEP
  1197. #undef IEEE80211_CIPHER_TKIP
  1198. #undef IEEE80211_CIPHER_AES_CCM
  1199. #undef IEEE80211_CRYPTO_WEP
  1200. #undef IEEE80211_CRYPTO_TKIP
  1201. #undef IEEE80211_CRYPTO_AES_CCM
  1202. #undef IEEE80211_C_HOSTAP
  1203. #undef IEEE80211_C_WPA1
  1204. #undef IEEE80211_C_WPA2
  1205. #else /* IEEE80211_IOC_DEVCAPS */
  1206. /* For now, assume TKIP, CCMP, WPA, WPA2 are supported */
  1207. drv->capa.key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA |
  1208. WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK |
  1209. WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
  1210. WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK;
  1211. drv->capa.enc = WPA_DRIVER_CAPA_ENC_WEP40 |
  1212. WPA_DRIVER_CAPA_ENC_WEP104 |
  1213. WPA_DRIVER_CAPA_ENC_TKIP |
  1214. WPA_DRIVER_CAPA_ENC_CCMP;
  1215. drv->capa.flags |= WPA_DRIVER_FLAGS_AP;
  1216. #endif /* IEEE80211_IOC_DEVCAPS */
  1217. #ifdef IEEE80211_IOC_SCAN_MAX_SSID
  1218. drv->capa.max_scan_ssids = IEEE80211_IOC_SCAN_MAX_SSID;
  1219. #else /* IEEE80211_IOC_SCAN_MAX_SSID */
  1220. drv->capa.max_scan_ssids = 1;
  1221. #endif /* IEEE80211_IOC_SCAN_MAX_SSID */
  1222. drv->capa.auth = WPA_DRIVER_AUTH_OPEN |
  1223. WPA_DRIVER_AUTH_SHARED |
  1224. WPA_DRIVER_AUTH_LEAP;
  1225. return 0;
  1226. }
  1227. static void *
  1228. wpa_driver_bsd_init(void *ctx, const char *ifname)
  1229. {
  1230. #define GETPARAM(drv, param, v) \
  1231. (((v) = get80211param(drv, param)) != -1)
  1232. struct bsd_driver_data *drv;
  1233. drv = os_zalloc(sizeof(*drv));
  1234. if (drv == NULL)
  1235. return NULL;
  1236. /*
  1237. * NB: We require the interface name be mappable to an index.
  1238. * This implies we do not support having wpa_supplicant
  1239. * wait for an interface to appear. This seems ok; that
  1240. * doesn't belong here; it's really the job of devd.
  1241. */
  1242. drv->ifindex = if_nametoindex(ifname);
  1243. if (drv->ifindex == 0) {
  1244. wpa_printf(MSG_DEBUG, "%s: interface %s does not exist",
  1245. __func__, ifname);
  1246. goto fail1;
  1247. }
  1248. drv->sock = socket(PF_INET, SOCK_DGRAM, 0);
  1249. if (drv->sock < 0)
  1250. goto fail1;
  1251. drv->route = socket(PF_ROUTE, SOCK_RAW, 0);
  1252. if (drv->route < 0)
  1253. goto fail;
  1254. eloop_register_read_sock(drv->route,
  1255. wpa_driver_bsd_event_receive, ctx, drv);
  1256. drv->ctx = ctx;
  1257. os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
  1258. /* Down interface during setup. */
  1259. if (bsd_ctrl_iface(drv, 0) < 0)
  1260. goto fail;
  1261. if (!GETPARAM(drv, IEEE80211_IOC_ROAMING, drv->prev_roaming)) {
  1262. wpa_printf(MSG_DEBUG, "%s: failed to get roaming state: %s",
  1263. __func__, strerror(errno));
  1264. goto fail;
  1265. }
  1266. if (!GETPARAM(drv, IEEE80211_IOC_PRIVACY, drv->prev_privacy)) {
  1267. wpa_printf(MSG_DEBUG, "%s: failed to get privacy state: %s",
  1268. __func__, strerror(errno));
  1269. goto fail;
  1270. }
  1271. if (!GETPARAM(drv, IEEE80211_IOC_WPA, drv->prev_wpa)) {
  1272. wpa_printf(MSG_DEBUG, "%s: failed to get wpa state: %s",
  1273. __func__, strerror(errno));
  1274. goto fail;
  1275. }
  1276. if (wpa_driver_bsd_capa(drv))
  1277. goto fail;
  1278. return drv;
  1279. fail:
  1280. close(drv->sock);
  1281. fail1:
  1282. os_free(drv);
  1283. return NULL;
  1284. #undef GETPARAM
  1285. }
  1286. static void
  1287. wpa_driver_bsd_deinit(void *priv)
  1288. {
  1289. struct bsd_driver_data *drv = priv;
  1290. wpa_driver_bsd_set_wpa(drv, 0);
  1291. eloop_unregister_read_sock(drv->route);
  1292. /* NB: mark interface down */
  1293. bsd_ctrl_iface(drv, 0);
  1294. wpa_driver_bsd_set_wpa_internal(drv, drv->prev_wpa, drv->prev_privacy);
  1295. if (set80211param(drv, IEEE80211_IOC_ROAMING, drv->prev_roaming) < 0)
  1296. wpa_printf(MSG_DEBUG, "%s: failed to restore roaming state",
  1297. __func__);
  1298. if (drv->sock_xmit != NULL)
  1299. l2_packet_deinit(drv->sock_xmit);
  1300. (void) close(drv->route); /* ioctl socket */
  1301. (void) close(drv->sock); /* event socket */
  1302. os_free(drv);
  1303. }
  1304. static int
  1305. wpa_driver_bsd_get_capa(void *priv, struct wpa_driver_capa *capa)
  1306. {
  1307. struct bsd_driver_data *drv = priv;
  1308. os_memcpy(capa, &drv->capa, sizeof(*capa));
  1309. return 0;
  1310. }
  1311. #endif /* HOSTAPD */
  1312. const struct wpa_driver_ops wpa_driver_bsd_ops = {
  1313. .name = "bsd",
  1314. .desc = "BSD 802.11 support",
  1315. #ifdef HOSTAPD
  1316. .hapd_init = bsd_init,
  1317. .hapd_deinit = bsd_deinit,
  1318. .set_privacy = bsd_set_privacy,
  1319. .get_seqnum = bsd_get_seqnum,
  1320. .flush = bsd_flush,
  1321. .read_sta_data = bsd_read_sta_driver_data,
  1322. .sta_disassoc = bsd_sta_disassoc,
  1323. .sta_deauth = bsd_sta_deauth,
  1324. .set_freq = hostapd_bsd_set_freq,
  1325. #else /* HOSTAPD */
  1326. .init = wpa_driver_bsd_init,
  1327. .deinit = wpa_driver_bsd_deinit,
  1328. .get_bssid = wpa_driver_bsd_get_bssid,
  1329. .get_ssid = wpa_driver_bsd_get_ssid,
  1330. .set_countermeasures = wpa_driver_bsd_set_countermeasures,
  1331. .scan2 = wpa_driver_bsd_scan,
  1332. .get_scan_results2 = wpa_driver_bsd_get_scan_results2,
  1333. .deauthenticate = wpa_driver_bsd_deauthenticate,
  1334. .disassociate = wpa_driver_bsd_disassociate,
  1335. .associate = wpa_driver_bsd_associate,
  1336. .get_capa = wpa_driver_bsd_get_capa,
  1337. #endif /* HOSTAPD */
  1338. .set_key = bsd_set_key,
  1339. .set_ieee8021x = bsd_set_ieee8021x,
  1340. .hapd_set_ssid = bsd_set_ssid,
  1341. .hapd_get_ssid = bsd_get_ssid,
  1342. .hapd_send_eapol = bsd_send_eapol,
  1343. .sta_set_flags = bsd_set_sta_authorized,
  1344. .set_generic_elem = bsd_set_opt_ie,
  1345. };