driver_bsd.c 37 KB

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