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