#include "ubus.h"
#include "config.h"
#include "system.h"
+#include "wireless.h"
struct vlist_tree interfaces;
static LIST_HEAD(iface_all_users);
netifd_log_message(L_NOTICE, "Interface '%s' is now down\n", iface->name);
mark_interface_down(iface);
interface_write_resolv_conf(iface->jail);
- if (iface->main_dev.dev)
+ if (iface->main_dev.dev && !(iface->config_state == IFC_NORMAL && iface->autostart && iface->available))
device_release(&iface->main_dev);
if (iface->l3_dev.dev)
device_remove_user(&iface->l3_dev);
const char *error = NULL;
iface->autostart = true;
+ wireless_check_network_enabled();
if (iface->state != IFS_DOWN)
return;
__interface_set_down(iface, false);
} else {
iface->autostart = false;
+ wireless_check_network_enabled();
__interface_set_down(iface, false);
}
}
struct blob_attr *ntb[__DEV_ATTR_MAX];
struct blob_attr *otb[__DEV_ATTR_MAX];
struct device *dev = if_old->main_dev.dev;
- unsigned long diff = 0;
+ unsigned long diff[2] = {};
BUILD_BUG_ON(sizeof(diff) < __DEV_ATTR_MAX / 8);
blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, ntb,
blob_data(if_new->config), blob_len(if_new->config));
- uci_blob_diff(ntb, otb, &device_attr_list, &diff);
- return diff;
+ uci_blob_diff(ntb, otb, &device_attr_list, diff);
+
+ return diff[0] | diff[1];
}
static void