From ea7c83079088ff327413ed4df1035a4ef04a5067 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Wed, 8 Jun 2022 23:40:38 -0400 Subject: [PATCH] openbsd_wlan: Implement IEEE80211_IOC_MLME for leaving networks. --- .../freebsd_wlan/net80211/ieee80211_ioctl.h | 6 ++-- .../openbsd_wlan/net80211/ieee80211_haiku.cpp | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/libs/compat/freebsd_wlan/net80211/ieee80211_ioctl.h b/src/libs/compat/freebsd_wlan/net80211/ieee80211_ioctl.h index 3b49fc1670..c5f2e772ac 100644 --- a/src/libs/compat/freebsd_wlan/net80211/ieee80211_ioctl.h +++ b/src/libs/compat/freebsd_wlan/net80211/ieee80211_ioctl.h @@ -299,6 +299,8 @@ struct ieee80211req_del_key { uint8_t idk_macaddr[IEEE80211_ADDR_LEN]; }; +#endif /* IEEE80211_IOCTLS_ABBREVIATED */ + /* * MLME state manipulation request. IEEE80211_MLME_ASSOC * only makes sense when operating as a station. The other @@ -319,6 +321,8 @@ struct ieee80211req_mlme { uint8_t im_ssid[IEEE80211_NWID_LEN]; }; +#ifndef IEEE80211_IOCTLS_ABBREVIATED + /* * MAC ACL operations. */ @@ -382,7 +386,6 @@ struct ieee80211req_chanlist { uint8_t ic_channels[32]; /* NB: can be variable length */ }; -#ifndef IEEE80211_IOCTLS_ABBREVIATED /* * Get the active channel list info. */ @@ -395,7 +398,6 @@ struct ieee80211req_chaninfo { (((_nchan)-1) * sizeof(struct ieee80211_channel))) #define IEEE80211_CHANINFO_SPACE(_ci) \ IEEE80211_CHANINFO_SIZE((_ci)->ic_nchans) -#endif /* * Retrieve the WPA/RSN information element for an associated station. diff --git a/src/libs/compat/openbsd_wlan/net80211/ieee80211_haiku.cpp b/src/libs/compat/openbsd_wlan/net80211/ieee80211_haiku.cpp index ecfab05d19..266e99151c 100644 --- a/src/libs/compat/openbsd_wlan/net80211/ieee80211_haiku.cpp +++ b/src/libs/compat/openbsd_wlan/net80211/ieee80211_haiku.cpp @@ -321,6 +321,39 @@ wlan_control(void* cookie, uint32 op, void* arg, size_t length) break; } + case IEEE80211_IOC_MLME: { + if (op != SIOCS80211) + return B_BAD_VALUE; + + struct ieee80211req_mlme mlme; + if (user_memcpy(&mlme, ireq.i_data, min_c(sizeof(mlme), ireq.i_len)) != B_OK) + return B_BAD_ADDRESS; + + switch (mlme.im_op) { + case IEEE80211_MLME_DISASSOC: + case IEEE80211_MLME_DEAUTH: { + struct ifreq ifr; + struct ieee80211_nwid nwid; + ifr.ifr_data = (uint8_t*)&nwid; + nwid.i_len = 0; + + IFF_LOCKGIANT(ifp); + status_t status = ifp->if_ioctl(ifp, SIOCS80211NWID, (caddr_t)&ifr); + IFF_UNLOCKGIANT(ifp); + if (status != 0) + return status; + break; + } + + default: + TRACE("openbsd wlan_control: unsupported MLME operation %" B_PRIu8 "\n", + mlme.im_op); + return EOPNOTSUPP; + } + + break; + } + case IEEE80211_IOC_HAIKU_JOIN: { if (op != SIOCS80211) return B_BAD_VALUE;