OSDN Git Service

WEXT: Set interface down in case of "driver stop" command,
authorDmitry Shmidt <dimitrysh@google.com>
Tue, 24 Nov 2009 18:45:09 +0000 (10:45 -0800)
committerDmitry Shmidt <dimitrysh@google.com>
Tue, 24 Nov 2009 18:45:09 +0000 (10:45 -0800)
      Add "HANGED" processing

Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
wpa_supplicant/src/drivers/driver_wext.c
wpa_supplicant/src/drivers/driver_wext.h

index 57ed33f..0f33818 100644 (file)
@@ -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) ||
index d956b3a..3f7fc4e 100644 (file)
@@ -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 */