+ }
+}
+
+void wireless_start_pending(int timeout)
+{
+ static struct uloop_timeout timer = {
+ .cb = __wireless_start_pending
+ };
+
+ if (timeout) {
+ uloop_timeout_set(&timer, timeout);
+ return;
+ }
+
+ uloop_timeout_cancel(&timer);
+ timer.cb(&timer);
+}
+
+void wireless_check_network_enabled(void)
+{
+ struct wireless_device *wdev;
+
+ vlist_for_each_element(&wireless_devices, wdev, node) {
+ wdev_check_network_enabled(wdev);
+
+ if (wdev->config_update)
+ wireless_start_pending(1000);
+ }
+}
+
+void wireless_device_hotplug_event(const char *name, bool add)
+{
+ struct wireless_interface *vif;
+ struct wireless_device *wdev;
+ const char *s;
+ size_t len;
+
+ s = strstr(name, ".sta");
+ if (s) {
+ if (strchr(s + 4, '.'))
+ return;
+
+ len = s - name;
+ } else if (!device_find(name)) {
+ len = strlen(name);
+ } else {
+ return;
+ }
+
+ vlist_for_each_element(&wireless_devices, wdev, node) {
+ vlist_for_each_element(&wdev->interfaces, vif, node) {
+ if (!vif->ifname)
+ continue;
+
+ if (strlen(vif->ifname) != len ||
+ strncmp(vif->ifname, name, len) != 0)
+ continue;
+
+ wireless_interface_handle_link(vif, name, add);
+ }
+ }