summaryrefslogtreecommitdiffstats
path: root/usr.sbin/wpa/wpa_supplicant/Packet32.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/wpa/wpa_supplicant/Packet32.c')
-rw-r--r--usr.sbin/wpa/wpa_supplicant/Packet32.c28
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);
OpenPOWER on IntegriCloud