From 3c66bc8e5b606c29d60fd2bc0ae12b1e9b42cf87 Mon Sep 17 00:00:00 2001 From: Dmitry Shmidt Date: Tue, 24 Nov 2009 10:45:09 -0800 Subject: [PATCH] WEXT: Set interface down in case of "driver stop" command, Add "HANGED" processing Signed-off-by: Dmitry Shmidt --- wpa_supplicant/src/drivers/driver_wext.c | 26 ++++++++++++++++++++++++-- wpa_supplicant/src/drivers/driver_wext.h | 2 ++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/wpa_supplicant/src/drivers/driver_wext.c b/wpa_supplicant/src/drivers/driver_wext.c index 57ed33f..0f33818 100644 --- a/wpa_supplicant/src/drivers/driver_wext.c +++ b/wpa_supplicant/src/drivers/driver_wext.c @@ -951,6 +951,8 @@ void * wpa_driver_wext_init(void *ctx, const char *ifname) drv->mlme_sock = -1; + drv->errors = 0; + wpa_driver_wext_finish_drv_init(drv); return drv; @@ -2375,7 +2377,7 @@ static int wpa_driver_priv_driver_cmd( void *priv, char *cmd, char *buf, size_t struct wpa_driver_wext_data *drv = priv; struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)(drv->ctx); struct iwreq iwr; - int ret = 0; + int ret = 0, flags; wpa_printf(MSG_DEBUG, "%s %s len = %d", __func__, cmd, buf_len); @@ -2389,6 +2391,19 @@ static int wpa_driver_priv_driver_cmd( void *priv, char *cmd, char *buf, size_t os_snprintf(cmd, MAX_DRV_CMD_SIZE, "COUNTRY %s", wpa_driver_get_country_code(no_of_chan)); } + else if (os_strcasecmp(cmd, "STOP") == 0) { + if ((wpa_driver_wext_get_ifflags(drv, &flags) == 0) && + (flags & IFF_UP)) { + wpa_printf(MSG_ERROR, "WEXT: %s when iface is UP", cmd); + wpa_driver_wext_set_ifflags(drv, flags & ~IFF_UP); + } + } + else if( os_strcasecmp(cmd, "RELOAD") == 0 ) { + wpa_printf(MSG_DEBUG,"Reload command"); + wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED"); + return ret; + } + os_memset(&iwr, 0, sizeof(iwr)); os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ); os_memcpy(buf, cmd, strlen(cmd) + 1); @@ -2399,9 +2414,16 @@ static int wpa_driver_priv_driver_cmd( void *priv, char *cmd, char *buf, size_t perror("ioctl[SIOCSIWPRIV]"); } - if (ret < 0) + if (ret < 0) { wpa_printf(MSG_ERROR, "%s failed", __func__); + drv->errors++; + if (drv->errors > WEXT_NUMBER_SEQUENTIAL_ERRORS) { + drv->errors = 0; + wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED"); + } + } else { + drv->errors = 0; ret = 0; if ((os_strcasecmp(cmd, "RSSI") == 0) || (os_strcasecmp(cmd, "LINKSPEED") == 0) || diff --git a/wpa_supplicant/src/drivers/driver_wext.h b/wpa_supplicant/src/drivers/driver_wext.h index d956b3a..3f7fc4e 100644 --- a/wpa_supplicant/src/drivers/driver_wext.h +++ b/wpa_supplicant/src/drivers/driver_wext.h @@ -43,6 +43,7 @@ struct wpa_driver_wext_data { char mlmedev[IFNAMSIZ + 1]; int scan_complete_events; + int errors; }; int wpa_driver_wext_get_ifflags(struct wpa_driver_wext_data *drv, int *flags); @@ -86,6 +87,7 @@ int wpa_driver_wext_keymgmt2wext(int keymgmt); #define WPA_DRIVER_WEXT_WAIT_US 400000 #define MAX_DRV_CMD_SIZE 248 +#define WEXT_NUMBER_SEQUENTIAL_ERRORS 4 #endif #endif /* DRIVER_WEXT_H */ -- 2.11.0