driver_bsd.c 42 KB

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