2 * Driver interaction with OpenBSD net80211 layer
3 * Copyright (c) 2013, Mark Kettenis
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
10 #include <sys/ioctl.h>
13 #include <net80211/ieee80211.h>
14 #include <net80211/ieee80211_crypto.h>
15 #include <net80211/ieee80211_ioctl.h>
20 struct openbsd_driver_data
{
21 char ifname
[IFNAMSIZ
+ 1];
24 int sock
; /* open socket for 802.11 ioctls */
29 wpa_driver_openbsd_get_ssid(void *priv
, u8
*ssid
)
31 struct openbsd_driver_data
*drv
= priv
;
32 struct ieee80211_nwid nwid
;
35 os_memset(&ifr
, 0, sizeof(ifr
));
36 os_strlcpy(ifr
.ifr_name
, drv
->ifname
, sizeof(ifr
.ifr_name
));
37 ifr
.ifr_data
= (void *)&nwid
;
38 if (ioctl(drv
->sock
, SIOCG80211NWID
, &ifr
) < 0 ||
39 nwid
.i_len
> IEEE80211_NWID_LEN
)
42 os_memcpy(ssid
, nwid
.i_nwid
, nwid
.i_len
);
47 wpa_driver_openbsd_get_bssid(void *priv
, u8
*bssid
)
49 struct openbsd_driver_data
*drv
= priv
;
50 struct ieee80211_bssid id
;
52 os_strlcpy(id
.i_name
, drv
->ifname
, sizeof(id
.i_name
));
53 if (ioctl(drv
->sock
, SIOCG80211BSSID
, &id
) < 0)
56 os_memcpy(bssid
, id
.i_bssid
, IEEE80211_ADDR_LEN
);
62 wpa_driver_openbsd_get_capa(void *priv
, struct wpa_driver_capa
*capa
)
64 os_memset(capa
, 0, sizeof(*capa
));
65 capa
->flags
= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK
|
66 WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X
;
72 wpa_driver_openbsd_set_key(const char *ifname
, void *priv
, enum wpa_alg alg
,
73 const unsigned char *addr
, int key_idx
, int set_tx
, const u8
*seq
,
74 size_t seq_len
, const u8
*key
, size_t key_len
)
76 struct openbsd_driver_data
*drv
= priv
;
77 struct ieee80211_keyavail keyavail
;
79 if (alg
!= WPA_ALG_PMK
|| key_len
> IEEE80211_PMK_LEN
)
82 memset(&keyavail
, 0, sizeof(keyavail
));
83 os_strlcpy(keyavail
.i_name
, drv
->ifname
, sizeof(keyavail
.i_name
));
84 if (wpa_driver_openbsd_get_bssid(priv
, keyavail
.i_macaddr
) < 0)
86 memcpy(keyavail
.i_key
, key
, key_len
);
88 if (ioctl(drv
->sock
, SIOCS80211KEYAVAIL
, &keyavail
) < 0)
95 wpa_driver_openbsd_init(void *ctx
, const char *ifname
)
97 struct openbsd_driver_data
*drv
;
99 drv
= os_zalloc(sizeof(*drv
));
103 drv
->sock
= socket(PF_INET
, SOCK_DGRAM
, 0);
108 os_strlcpy(drv
->ifname
, ifname
, sizeof(drv
->ifname
));
119 wpa_driver_openbsd_deinit(void *priv
)
121 struct openbsd_driver_data
*drv
= priv
;
128 const struct wpa_driver_ops wpa_driver_openbsd_ops
= {
130 .desc
= "OpenBSD 802.11 support",
131 .get_ssid
= wpa_driver_openbsd_get_ssid
,
132 .get_bssid
= wpa_driver_openbsd_get_bssid
,
133 .get_capa
= wpa_driver_openbsd_get_capa
,
134 .set_key
= wpa_driver_openbsd_set_key
,
135 .init
= wpa_driver_openbsd_init
,
136 .deinit
= wpa_driver_openbsd_deinit
,