wireless: fix handling of wdev->config_state, prevent handling of multiple state...
[project/netifd.git] / wireless.c
index 1f7fc5d..a4d7c26 100644 (file)
@@ -270,9 +270,10 @@ __wireless_device_set_up(struct wireless_device *wdev)
 static void
 wireless_device_free(struct wireless_device *wdev)
 {
-    vlist_flush_all(&wdev->interfaces);
-    free(wdev->config);
-    free(wdev);
+       vlist_flush_all(&wdev->interfaces);
+       avl_delete(&wireless_devices.avl, &wdev->node.avl);
+       free(wdev->config);
+       free(wdev);
 }
 
 static void
@@ -280,10 +281,10 @@ wdev_handle_config_change(struct wireless_device *wdev)
 {
        enum interface_config_state state = wdev->config_state;
 
-       wdev->config_state = IFC_NORMAL;
        switch(state) {
        case IFC_NORMAL:
        case IFC_RELOAD:
+               wdev->config_state = IFC_NORMAL;
                if (wdev->autostart)
                        __wireless_device_set_up(wdev);
                break;
@@ -394,12 +395,10 @@ wireless_device_set_down(struct wireless_device *wdev)
 static void
 wdev_set_config_state(struct wireless_device *wdev, enum interface_config_state s)
 {
-       enum interface_config_state old_state = wdev->config_state;
-
-       wdev->config_state = s;
-       if (old_state != IFC_NORMAL)
+       if (wdev->config_state != IFC_NORMAL)
                return;
 
+       wdev->config_state = s;
        if (wdev->state == IFS_DOWN)
                wdev_handle_config_change(wdev);
        else