diff options
Diffstat (limited to 'usr.sbin/wpa/wpa_supplicant/Packet32.c')
-rw-r--r-- | usr.sbin/wpa/wpa_supplicant/Packet32.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/usr.sbin/wpa/wpa_supplicant/Packet32.c b/usr.sbin/wpa/wpa_supplicant/Packet32.c index d689489..7346395 100644 --- a/usr.sbin/wpa/wpa_supplicant/Packet32.c +++ b/usr.sbin/wpa/wpa_supplicant/Packet32.c @@ -57,6 +57,8 @@ __FBSDID("$FreeBSD$"); #include <netdb.h> #include <net/route.h> +#include <net80211/ieee80211_ioctl.h> + #include <stdio.h> #include <string.h> #include <stdlib.h> @@ -97,6 +99,7 @@ typedef struct NDIS_802_11_KEY_COMPAT { struct adapter { int socket; char name[IFNAMSIZ]; + int prev_roaming; }; PCHAR @@ -113,6 +116,7 @@ PacketOpenAdapter(iface) int s; int ifflags; struct ifreq ifr; + struct ieee80211req ireq; s = socket(PF_INET, SOCK_DGRAM, 0); @@ -124,8 +128,24 @@ PacketOpenAdapter(iface) return(NULL); a->socket = s; + if (strncmp(iface, "\\Device\\NPF_", 12) == 0) + iface += 12; + else if (strncmp(iface, "\\DEVICE\\", 8) == 0) + iface += 8; snprintf(a->name, IFNAMSIZ, "%s", iface); + /* Turn off net80211 roaming */ + bzero((char *)&ireq, sizeof(ireq)); + strncpy(ireq.i_name, iface, sizeof (ifr.ifr_name)); + ireq.i_type = IEEE80211_IOC_ROAMING; + if (ioctl(a->socket, SIOCG80211, &ireq) == 0) { + a->prev_roaming = ireq.i_val; + ireq.i_val = IEEE80211_ROAMING_MANUAL; + if (ioctl(a->socket, SIOCS80211, &ireq) < 0) + fprintf(stderr, + "Could not set IEEE80211_ROAMING_MANUAL\n"); + } + bzero((char *)&ifr, sizeof(ifr)); strncpy(ifr.ifr_name, iface, sizeof (ifr.ifr_name)); if (ioctl(a->socket, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { @@ -326,12 +346,20 @@ PacketCloseAdapter(iface) { struct adapter *a; struct ifreq ifr; + struct ieee80211req ireq; if (iface == NULL) return; a = iface; + /* Reset net80211 roaming */ + bzero((char *)&ireq, sizeof(ireq)); + strncpy(ireq.i_name, a->name, sizeof (ifr.ifr_name)); + ireq.i_type = IEEE80211_IOC_ROAMING; + ireq.i_val = a->prev_roaming; + ioctl(a->socket, SIOCS80211, &ireq); + bzero((char *)&ifr, sizeof(ifr)); strncpy(ifr.ifr_name, a->name, sizeof (ifr.ifr_name)); ioctl(a->socket, SIOCGIFFLAGS, (caddr_t)&ifr); |