60 lines
2.0 KiB
Diff
60 lines
2.0 KiB
Diff
|
diff --git a/src/drivers/driver_wext.c b/src/drivers/driver_wext.c
|
||
|
index e6242da..698e4f3 100644
|
||
|
--- a/src/drivers/driver_wext.c
|
||
|
+++ b/src/drivers/driver_wext.c
|
||
|
@@ -1923,21 +1923,35 @@ static int wpa_driver_wext_mlme(struct wpa_driver_wext_data *drv,
|
||
|
|
||
|
static void wpa_driver_wext_disconnect(struct wpa_driver_wext_data *drv)
|
||
|
{
|
||
|
+ struct iwreq iwr;
|
||
|
const u8 null_bssid[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 };
|
||
|
u8 ssid[32];
|
||
|
int i;
|
||
|
|
||
|
- /*
|
||
|
- * Clear the BSSID selection and set a random SSID to make sure the
|
||
|
- * driver will not be trying to associate with something even if it
|
||
|
- * does not understand SIOCSIWMLME commands (or tries to associate
|
||
|
- * automatically after deauth/disassoc).
|
||
|
+ /* Only force-disconnect when the card is in infrastructure mode,
|
||
|
+ * otherwise the driver might interpret the cleared BSSID and random
|
||
|
+ * SSID as an attempt to create a new ad-hoc network.
|
||
|
*/
|
||
|
- wpa_driver_wext_set_bssid(drv, null_bssid);
|
||
|
+ os_memset(&iwr, 0, sizeof(iwr));
|
||
|
+ os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
|
||
|
+ if (ioctl(drv->ioctl_sock, SIOCGIWMODE, &iwr) < 0) {
|
||
|
+ perror("ioctl[SIOCGIWMODE]");
|
||
|
+ iwr.u.mode = IW_MODE_INFRA;
|
||
|
+ }
|
||
|
|
||
|
- for (i = 0; i < 32; i++)
|
||
|
- ssid[i] = rand() & 0xFF;
|
||
|
- wpa_driver_wext_set_ssid(drv, ssid, 32);
|
||
|
+ if (iwr.u.mode == IW_MODE_INFRA) {
|
||
|
+ /*
|
||
|
+ * Clear the BSSID selection and set a random SSID to make sure
|
||
|
+ * the driver will not be trying to associate with something
|
||
|
+ * even if it does not understand SIOCSIWMLME commands (or tries
|
||
|
+ * to associate automatically after deauth/disassoc).
|
||
|
+ */
|
||
|
+ wpa_driver_wext_set_bssid(drv, null_bssid);
|
||
|
+
|
||
|
+ for (i = 0; i < 32; i++)
|
||
|
+ ssid[i] = rand() & 0xFF;
|
||
|
+ wpa_driver_wext_set_ssid(drv, ssid, 32);
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
|
||
|
@@ -1947,8 +1961,8 @@ static int wpa_driver_wext_deauthenticate(void *priv, const u8 *addr,
|
||
|
struct wpa_driver_wext_data *drv = priv;
|
||
|
int ret;
|
||
|
wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
|
||
|
- wpa_driver_wext_disconnect(drv);
|
||
|
ret = wpa_driver_wext_mlme(drv, addr, IW_MLME_DEAUTH, reason_code);
|
||
|
+ wpa_driver_wext_disconnect(drv);
|
||
|
return ret;
|
||
|
}
|
||
|
|