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;
71 wpa_driver_openbsd_set_key(const char *ifname, void *priv, enum wpa_alg alg,
72 const unsigned char *addr, int key_idx, int set_tx, const u8 *seq,
73 size_t seq_len, const u8 *key, size_t key_len)
75 struct openbsd_driver_data *drv = priv;
76 struct ieee80211_keyavail keyavail;
78 if (alg != WPA_ALG_PMK || key_len > IEEE80211_PMK_LEN)
81 memset(&keyavail, 0, sizeof(keyavail));
82 os_strlcpy(keyavail.i_name, drv->ifname, sizeof(keyavail.i_name));
83 if (wpa_driver_openbsd_get_bssid(priv, keyavail.i_macaddr) < 0)
85 memcpy(keyavail.i_key, key, key_len);
87 if (ioctl(drv->sock, SIOCS80211KEYAVAIL, &keyavail) < 0)
94 wpa_driver_openbsd_init(void *ctx, const char *ifname)
96 struct openbsd_driver_data *drv;
98 drv = os_zalloc(sizeof(*drv));
102 drv->sock = socket(PF_INET, SOCK_DGRAM, 0);
107 os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
118 wpa_driver_openbsd_deinit(void *priv)
120 struct openbsd_driver_data *drv = priv;
127 const struct wpa_driver_ops wpa_driver_openbsd_ops = {
129 .desc = "OpenBSD 802.11 support",
130 .get_ssid = wpa_driver_openbsd_get_ssid,
131 .get_bssid = wpa_driver_openbsd_get_bssid,
132 .get_capa = wpa_driver_openbsd_get_capa,
133 .set_key = wpa_driver_openbsd_set_key,
134 .init = wpa_driver_openbsd_init,
135 .deinit = wpa_driver_openbsd_deinit,