if (dev->type != &bridge_device_type)
return;
+ if (dev->hotplug_ops && dev->hotplug_ops->prepare)
+ dev->hotplug_ops->prepare(dev);
+
blobmsg_add_string(buf, "bridge", dev->ifname);
}
{
struct wireless_interface *vif;
+ uloop_timeout_cancel(&wdev->timeout);
wireless_complete_kill_request(wdev);
free(wdev->data);
wdev->data = NULL;
}
static void
+wireless_device_free(struct wireless_device *wdev)
+{
+ vlist_flush_all(&wdev->interfaces);
+ free(wdev->config);
+ free(wdev);
+}
+
+static void
+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:
+ if (wdev->autostart)
+ __wireless_device_set_up(wdev);
+ break;
+ case IFC_REMOVE:
+ wireless_device_free(wdev);
+ break;
+ }
+}
+
+static void
wireless_device_mark_down(struct wireless_device *wdev)
{
struct wireless_interface *vif;
wireless_process_kill_all(wdev, SIGTERM, true);
+ wdev->cancel = false;
wdev->state = IFS_DOWN;
wireless_device_free_state(wdev);
-
- if (wdev->autostart)
- __wireless_device_set_up(wdev);
+ wdev_handle_config_change(wdev);
}
static void
static void
wireless_device_retry_setup(struct wireless_device *wdev)
{
+ if (wdev->state == IFS_TEARDOWN || wdev->state == IFS_DOWN || wdev->cancel)
+ return;
+
if (--wdev->retry < 0)
wdev->autostart = false;
}
static void
-wireless_device_free(struct wireless_device *wdev)
-{
- vlist_flush_all(&wdev->interfaces);
- free(wdev->config);
- free(wdev);
-}
-
-static void
-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:
- break;
- case IFC_RELOAD:
- if (wdev->autostart)
- __wireless_device_set_up(wdev);
- break;
- case IFC_REMOVE:
- wireless_device_free(wdev);
- break;
- }
-}
-
-static void
wdev_set_config_state(struct wireless_device *wdev, enum interface_config_state s)
{
enum interface_config_state old_state = wdev->config_state;
{
void *i;
- i = blobmsg_open_table(b, iface->name);
+ i = blobmsg_open_table(b, NULL);
if (iface->section)
blobmsg_add_string(b, "section", iface->section);
if (iface->ifname)
blobmsg_add_u8(b, "up", wdev->state == IFS_UP);
blobmsg_add_u8(b, "pending", wdev->state == IFS_SETUP || wdev->state == IFS_TEARDOWN);
blobmsg_add_u8(b, "autostart", wdev->autostart);
- i = blobmsg_open_table(b, "interfaces");
+ i = blobmsg_open_array(b, "interfaces");
vlist_for_each_element(&wdev->interfaces, iface, node)
wireless_interface_status(iface, b);
- blobmsg_close_table(b, i);
+ blobmsg_close_array(b, i);
blobmsg_close_table(b, c);
}