52
52
ireq.i_data = (void *) arg;
54
54
if (ioctl(drv->sock, SIOCS80211, &ireq) < 0) {
55
perror("ioctl[SIOCS80211]");
55
fprintf(stderr, "ioctl[SIOCS80211, op %u, len %u]: %s\n",
56
op, arg_len, strerror(errno));
89
91
if (ioctl(drv->sock, SIOCS80211, &ireq) < 0) {
90
perror("ioctl[SIOCS80211]");
92
fprintf(stderr, "ioctl[SIOCS80211, op %u, arg 0x%x]: %s\n",
93
op, arg, strerror(errno));
100
get80211param(struct wpa_driver_bsd_data *drv, int op)
102
struct ieee80211req ireq;
104
memset(&ireq, 0, sizeof(ireq));
105
strncpy(ireq.i_name, drv->ifname, IFNAMSIZ);
108
if (ioctl(drv->sock, SIOCG80211, &ireq) < 0) {
109
fprintf(stderr, "ioctl[SIOCG80211, op %u]: %s\n",
110
op, strerror(errno));
97
117
getifflags(struct wpa_driver_bsd_data *drv, int *flags)
192
wpa_driver_bsd_set_wpa_internal(void *priv, int wpa, int privacy)
194
struct wpa_driver_bsd_data *drv = priv;
197
wpa_printf(MSG_DEBUG, "%s: wpa=%d privacy=%d",
198
__FUNCTION__, wpa, privacy);
200
if (!wpa && wpa_driver_bsd_set_wpa_ie(drv, NULL, 0) < 0)
202
if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0)
204
if (set80211param(drv, IEEE80211_IOC_WPA, wpa) < 0)
172
211
wpa_driver_bsd_set_wpa(void *priv, int enabled)
174
struct wpa_driver_bsd_data *drv = priv;
177
213
wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
179
if (!enabled && wpa_driver_bsd_set_wpa_ie(drv, NULL, 0) < 0)
181
if (set80211param(drv, IEEE80211_IOC_ROAMING, enabled ? 2 : 0) < 0)
183
if (set80211param(drv, IEEE80211_IOC_PRIVACY, enabled) < 0)
185
if (set80211param(drv, IEEE80211_IOC_WPA, enabled ? 3 : 0) < 0)
215
return wpa_driver_bsd_set_wpa_internal(priv, enabled ? 3 : 0, enabled);
195
222
struct ieee80211req_del_key wk;
197
wpa_printf(MSG_DEBUG, "%s: keyidx=%d", __FUNCTION__, key_idx);
198
224
memset(&wk, 0, sizeof(wk));
199
wk.idk_keyix = key_idx;
226
bcmp(addr, "\xff\xff\xff\xff\xff\xff", IEEE80211_ADDR_LEN) != 0) {
227
struct ether_addr ea;
229
memcpy(&ea, addr, IEEE80211_ADDR_LEN);
230
wpa_printf(MSG_DEBUG, "%s: addr=%s keyidx=%d",
231
__func__, ether_ntoa(&ea), key_idx);
201
232
memcpy(wk.idk_macaddr, addr, IEEE80211_ADDR_LEN);
233
wk.idk_keyix = (uint8_t) IEEE80211_KEYIX_NONE;
235
wpa_printf(MSG_DEBUG, "%s: keyidx=%d", __func__, key_idx);
236
wk.idk_keyix = key_idx;
203
238
return set80211var(drv, IEEE80211_IOC_DELKEY, &wk, sizeof(wk));
234
270
wpa_printf(MSG_DEBUG, "%s: unknown/unsupported algorithm %d",
239
wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%d "
240
"key_len=%d", __FUNCTION__, alg_name, key_idx, set_tx,
275
memcpy(&ea, addr, IEEE80211_ADDR_LEN);
276
wpa_printf(MSG_DEBUG,
277
"%s: alg=%s addr=%s key_idx=%d set_tx=%d seq_len=%zu key_len=%zu",
278
__func__, alg_name, ether_ntoa(&ea), key_idx, set_tx,
243
281
if (seq_len > sizeof(u_int64_t)) {
244
wpa_printf(MSG_DEBUG, "%s: seq_len %d too big",
245
__FUNCTION__, seq_len);
282
wpa_printf(MSG_DEBUG, "%s: seq_len %zu too big",
248
286
if (key_len > sizeof(wk.ik_keydata)) {
249
wpa_printf(MSG_DEBUG, "%s: key length %d too big",
250
__FUNCTION__, key_len);
287
wpa_printf(MSG_DEBUG, "%s: key length %zu too big",
254
292
memset(&wk, 0, sizeof(wk));
255
293
wk.ik_type = cipher;
256
294
wk.ik_flags = IEEE80211_KEY_RECV;
258
wk.ik_flags |= IEEE80211_KEY_XMIT | IEEE80211_KEY_DEFAULT;
259
memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN);
261
memset(wk.ik_macaddr, 0, IEEE80211_ADDR_LEN);
262
wk.ik_keyix = key_idx;
296
wk.ik_flags |= IEEE80211_KEY_XMIT;
297
memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN);
299
* Deduce whether group/global or unicast key by checking
300
* the address (yech). Note also that we can only mark global
301
* keys default; doing this for a unicast key is an error.
303
if (bcmp(addr, "\xff\xff\xff\xff\xff\xff", IEEE80211_ADDR_LEN) == 0) {
304
wk.ik_flags |= IEEE80211_KEY_GROUP;
305
wk.ik_keyix = key_idx;
307
wk.ik_keyix = (key_idx == 0 ? IEEE80211_KEYIX_NONE : key_idx);
309
if (wk.ik_keyix != IEEE80211_KEYIX_NONE && set_tx)
310
wk.ik_flags |= IEEE80211_KEY_DEFAULT;
263
311
wk.ik_keylen = key_len;
264
312
memcpy(&wk.ik_keyrsc, seq, seq_len);
265
313
memcpy(wk.ik_keydata, key, key_len);
292
340
struct wpa_driver_bsd_data *drv = priv;
293
341
struct ieee80211req_mlme mlme;
295
wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
343
wpa_printf(MSG_DEBUG, "%s", __func__);
344
memset(&mlme, 0, sizeof(mlme));
296
345
mlme.im_op = IEEE80211_MLME_DEAUTH;
297
346
mlme.im_reason = reason_code;
298
347
memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);
305
354
struct wpa_driver_bsd_data *drv = priv;
306
355
struct ieee80211req_mlme mlme;
308
wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
357
wpa_printf(MSG_DEBUG, "%s", __func__);
358
memset(&mlme, 0, sizeof(mlme));
309
359
mlme.im_op = IEEE80211_MLME_DISASSOC;
310
360
mlme.im_reason = reason_code;
311
361
memcpy(mlme.im_macaddr, addr, IEEE80211_ADDR_LEN);
318
368
struct wpa_driver_bsd_data *drv = priv;
319
369
struct ieee80211req_mlme mlme;
323
wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
326
* NB: Don't need to set the freq or cipher-related state as
327
* this is implied by the bssid which is used to locate
328
* the scanned node state which holds it. The ssid is
329
* needed to disambiguate an AP that broadcasts multiple
330
* ssid's but uses the same bssid.
372
wpa_printf(MSG_DEBUG,
373
"%s: ssid '%.*s' wpa ie len %u pairwise %u group %u key mgmt %u"
375
, params->ssid_len, params->ssid
377
, params->pairwise_suite
378
, params->group_suite
379
, params->key_mgmt_suite
332
382
/* XXX error handling is wrong but unclear what to do... */
333
383
if (wpa_driver_bsd_set_wpa_ie(drv, params->wpa_ie, params->wpa_ie_len) < 0)
385
#ifndef NEW_FREEBSD_MLME_ASSOC
335
386
if (wpa_driver_bsd_set_ssid(drv, params->ssid, params->ssid_len) < 0)
390
privacy = !(params->pairwise_suite == CIPHER_NONE &&
391
params->group_suite == CIPHER_NONE &&
392
params->key_mgmt_suite == KEY_MGMT_NONE &&
393
params->wpa_ie_len == 0);
394
wpa_printf(MSG_DEBUG, "%s: set PRIVACY %u", __func__, privacy);
396
if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0)
399
if (params->wpa_ie_len &&
400
set80211param(drv, IEEE80211_IOC_WPA,
401
params->wpa_ie[0] == RSN_INFO_ELEM ? 2 : 1) < 0)
337
404
memset(&mlme, 0, sizeof(mlme));
338
405
mlme.im_op = IEEE80211_MLME_ASSOC;
339
memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN);
406
#ifdef NEW_FREEBSD_MLME_ASSOC
407
if (params->ssid != NULL)
408
memcpy(mlme.im_ssid, params->ssid, params->ssid_len);
409
mlme.im_ssid_len = params->ssid_len;
411
if (params->bssid != NULL)
412
memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN);
340
413
if (set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme)) < 0)
419
wpa_driver_bsd_set_auth_alg(void *priv, int auth_alg)
421
struct wpa_driver_bsd_data *drv = priv;
424
if ((auth_alg & AUTH_ALG_OPEN_SYSTEM) &&
425
(auth_alg & AUTH_ALG_SHARED_KEY))
426
authmode = IEEE80211_AUTH_AUTO;
427
else if (auth_alg & AUTH_ALG_SHARED_KEY)
428
authmode = IEEE80211_AUTH_SHARED;
430
authmode = IEEE80211_AUTH_OPEN;
432
return set80211param(drv, IEEE80211_IOC_AUTHMODE, authmode);
387
478
"understood\n", rtm->rtm_version);
390
ifan = (struct if_announcemsghdr *) rtm;
481
memset(&event, 0, sizeof(event));
391
482
switch (rtm->rtm_type) {
392
483
case RTM_IFANNOUNCE:
393
memset(&event, 0, sizeof(event));
394
/* XXX name buffer must be >= IFNAMSIZ */
395
/* XXX check return value */
396
if_indextoname(ifan->ifan_index, event.interface_status.ifname);
484
ifan = (struct if_announcemsghdr *) rtm;
485
if (ifan->ifan_index != drv->ifindex)
487
strlcpy(event.interface_status.ifname, drv->ifname,
488
sizeof(event.interface_status.ifname));
397
489
switch (ifan->ifan_what) {
399
event.interface_status.ievent = EVENT_INTERFACE_ADDED;
401
490
case IFAN_DEPARTURE:
402
491
event.interface_status.ievent = EVENT_INTERFACE_REMOVED;
410
499
wpa_supplicant_event(ctx, EVENT_INTERFACE_STATUS, &event);
412
501
case RTM_IEEE80211:
502
ifan = (struct if_announcemsghdr *) rtm;
503
if (ifan->ifan_index != drv->ifindex)
413
505
switch (ifan->ifan_what) {
414
506
case RTM_IEEE80211_ASSOC:
507
case RTM_IEEE80211_REASSOC:
415
508
wpa_supplicant_event(ctx, EVENT_ASSOC, NULL);
417
510
case RTM_IEEE80211_DISASSOC:
535
ifm = (struct if_msghdr *) rtm;
536
if (ifm->ifm_index != drv->ifindex)
538
if ((rtm->rtm_flags & RTF_UP) == 0) {
539
strlcpy(event.interface_status.ifname, drv->ifname,
540
sizeof(event.interface_status.ifname));
541
event.interface_status.ievent = EVENT_INTERFACE_REMOVED;
542
wpa_printf(MSG_DEBUG, "RTM_IFINFO: Interface '%s' DOWN",
543
event.interface_status.ifname);
544
wpa_supplicant_event(ctx, EVENT_INTERFACE_STATUS, &event);
575
680
wpa_driver_bsd_init(void *ctx, const char *ifname)
682
#define GETPARAM(drv, param, v) \
683
(((v) = get80211param(drv, param)) != -1)
577
684
struct wpa_driver_bsd_data *drv;
579
drv = malloc(sizeof(*drv));
686
drv = wpa_zalloc(sizeof(*drv));
582
memset(drv, 0, sizeof(*drv));
690
* NB: We require the interface name be mappable to an index.
691
* This implies we do not support having wpa_supplicant
692
* wait for an interface to appear. This seems ok; that
693
* doesn't belong here; it's really the job of devd.
695
drv->ifindex = if_nametoindex(ifname);
696
if (drv->ifindex == 0) {
697
wpa_printf(MSG_DEBUG, "%s: interface %s does not exist",
583
701
drv->sock = socket(PF_INET, SOCK_DGRAM, 0);
588
704
drv->route = socket(PF_ROUTE, SOCK_RAW, 0);
589
if (drv->route < 0) {
594
707
eloop_register_read_sock(drv->route,
595
wpa_driver_bsd_event_receive, ctx, NULL);
708
wpa_driver_bsd_event_receive, ctx, drv);
598
711
strncpy(drv->ifname, ifname, sizeof(drv->ifname));
713
if (!GETPARAM(drv, IEEE80211_IOC_ROAMING, drv->prev_roaming)) {
714
wpa_printf(MSG_DEBUG, "%s: failed to get roaming state: %s",
715
__func__, strerror(errno));
718
if (!GETPARAM(drv, IEEE80211_IOC_PRIVACY, drv->prev_privacy)) {
719
wpa_printf(MSG_DEBUG, "%s: failed to get privacy state: %s",
720
__func__, strerror(errno));
723
if (!GETPARAM(drv, IEEE80211_IOC_WPA, drv->prev_wpa)) {
724
wpa_printf(MSG_DEBUG, "%s: failed to get wpa state: %s",
725
__func__, strerror(errno));
728
if (set80211param(drv, IEEE80211_IOC_ROAMING, IEEE80211_ROAMING_MANUAL) < 0) {
729
wpa_printf(MSG_DEBUG, "%s: failed to set wpa_supplicant-based "
730
"roaming: %s", __func__, strerror(errno));
734
if (set80211param(drv, IEEE80211_IOC_WPA, 1+2) < 0) {
735
wpa_printf(MSG_DEBUG, "%s: failed to enable WPA support %s",
736
__func__, strerror(errno));
610
756
if (getifflags(drv, &flags) == 0)
611
757
(void) setifflags(drv, flags &~ IFF_UP);
759
wpa_driver_bsd_set_wpa_internal(drv, drv->prev_wpa, drv->prev_privacy);
760
if (set80211param(drv, IEEE80211_IOC_ROAMING, drv->prev_roaming) < 0)
761
wpa_printf(MSG_DEBUG, "%s: failed to restore roaming state",
613
764
(void) close(drv->route); /* ioctl socket */
614
765
(void) close(drv->sock); /* event socket */
619
struct wpa_driver_ops wpa_driver_bsd_ops = {
770
const struct wpa_driver_ops wpa_driver_bsd_ops = {
621
772
.desc = "BSD 802.11 support (Atheros, etc.)",
622
773
.init = wpa_driver_bsd_init,