X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=wireless.c;h=33fab451184d32cd94eaf148e49fec53cdf9af3f;hp=d886bf20a394e85872766e249acf270de250bf53;hb=26cb3b2a0aebb1b9dc07daf7b54bd8400d6d659b;hpb=b5cfcfe34e6b44f2be90bf24e879dc25f0f07b9e diff --git a/wireless.c b/wireless.c index d886bf2..33fab45 100644 --- a/wireless.c +++ b/wireless.c @@ -51,9 +51,9 @@ static const struct uci_blob_param_list vif_param = { static void put_container(struct blob_buf *buf, struct blob_attr *attr, const char *name) { - void *c = blobmsg_open_table(&b, name); - blob_put_raw(&b, blob_data(attr), blob_len(attr)); - blobmsg_close_table(&b, c); + void *c = blobmsg_open_table(buf, name); + blob_put_raw(buf, blob_data(attr), blob_len(attr)); + blobmsg_close_table(buf, c); } static void @@ -202,6 +202,12 @@ static void wireless_interface_handle_link(struct wireless_interface *vif, bool if (!vif->network || !vif->ifname) return; + if (up) { + struct device *dev = device_get(vif->ifname, 2); + if (dev) + dev->wireless = true; + } + blobmsg_for_each_attr(cur, vif->network, rem) { network = blobmsg_data(cur); @@ -209,7 +215,7 @@ static void wireless_interface_handle_link(struct wireless_interface *vif, bool if (!iface) continue; - interface_handle_link(iface, vif->ifname, up); + interface_handle_link(iface, vif->ifname, up, true); } } @@ -317,17 +323,6 @@ wireless_device_mark_down(struct wireless_device *wdev) } static void -wireless_device_mark_up(struct wireless_device *wdev) -{ - struct wireless_interface *vif; - - D(WIRELESS, "Wireless device '%s' is now up\n", wdev->name); - wdev->state = IFS_UP; - vlist_for_each_element(&wdev->interfaces, vif, node) - wireless_interface_handle_link(vif, true); -} - -static void wireless_device_setup_timeout(struct uloop_timeout *timeout) { struct wireless_device *wdev = container_of(timeout, struct wireless_device, timeout); @@ -361,6 +356,23 @@ __wireless_device_set_down(struct wireless_device *wdev) } static void +wireless_device_mark_up(struct wireless_device *wdev) +{ + struct wireless_interface *vif; + + if (wdev->cancel) { + wdev->cancel = false; + __wireless_device_set_down(wdev); + return; + } + + D(WIRELESS, "Wireless device '%s' is now up\n", wdev->name); + wdev->state = IFS_UP; + vlist_for_each_element(&wdev->interfaces, vif, node) + wireless_interface_handle_link(vif, true); +} + +static void wireless_device_retry_setup(struct wireless_device *wdev) { if (wdev->state == IFS_TEARDOWN || wdev->state == IFS_DOWN || wdev->cancel) @@ -417,7 +429,7 @@ wdev_change_config(struct wireless_device *wdev, struct wireless_device *wd_new) free(wd_new); - if (blob_attr_equal(wdev->config, new_config) || wdev->disabled == disabled) + if (blob_attr_equal(wdev->config, new_config) && wdev->disabled == disabled) return; D(WIRELESS, "Update configuration of wireless device '%s'\n", wdev->name); @@ -491,8 +503,7 @@ wireless_add_handler(const char *script, const char *name, json_object *obj) D(WIRELESS, "Add handler for script %s: %s\n", script, name); } -static void __init -wireless_init_list(void) +void wireless_init(void) { vlist_init(&wireless_devices, avl_strcmp, wdev_update); wireless_devices.keep_old = true; @@ -630,7 +641,6 @@ wireless_device_create(struct wireless_driver *drv, const char *name, struct blo INIT_LIST_HEAD(&wdev->script_proc); vlist_init(&wdev->interfaces, avl_strcmp, vif_update); wdev->interfaces.keep_old = true; - vlist_add(&wireless_devices, &wdev->node, wdev->name); wdev->timeout.cb = wireless_device_setup_timeout; wdev->script_task.cb = wireless_device_script_task_cb; @@ -641,6 +651,8 @@ wireless_device_create(struct wireless_driver *drv, const char *name, struct blo wdev->script_proc_fd.cb = wireless_proc_poll_fd; wdev->script_check.cb = wireless_device_check_script_tasks; + + vlist_add(&wireless_devices, &wdev->node, wdev->name); } void wireless_interface_create(struct wireless_device *wdev, struct blob_attr *data, const char *section) @@ -648,7 +660,7 @@ void wireless_interface_create(struct wireless_device *wdev, struct blob_attr *d struct wireless_interface *vif; struct blob_attr *tb[__VIF_ATTR_MAX]; struct blob_attr *cur; - char *name_buf; + char *name_buf, *section_buf; char name[8]; blobmsg_parse(vif_policy, __VIF_ATTR_MAX, tb, blob_data(data), blob_len(data)); @@ -659,11 +671,13 @@ void wireless_interface_create(struct wireless_device *wdev, struct blob_attr *d sprintf(name, "%d", wdev->vif_idx++); - vif = calloc_a(sizeof(*vif), &name_buf, strlen(name) + 1); + vif = calloc_a(sizeof(*vif), + &name_buf, strlen(name) + 1, + §ion_buf, strlen(section) + 1); vif->name = strcpy(name_buf, name); vif->wdev = wdev; vif->config = data; - vif->section = section; + vif->section = strcpy(section_buf, section); vlist_add(&wdev->interfaces, &vif->node, vif->name); } @@ -897,9 +911,6 @@ wireless_device_notify(struct wireless_device *wdev, struct blob_attr *data, if (wdev->state != IFS_SETUP) return UBUS_STATUS_PERMISSION_DENIED; - if (wdev->cancel) - return 0; - wireless_device_mark_up(wdev); break; case NOTIFY_CMD_SET_DATA: