X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=wireless.c;h=0e293a0783d189581855737d4ec117f7e8679285;hp=0fd209e57867a325bb7967348a050bf9033f984e;hb=8f71737b1551d32e6e0f4c439940b2862a8a428c;hpb=a9b361becf7b8668247602403f870ad9503fd8e9 diff --git a/wireless.c b/wireless.c index 0fd209e..0e293a0 100644 --- a/wireless.c +++ b/wireless.c @@ -261,6 +261,9 @@ wireless_device_run_handler(struct wireless_device *wdev, bool up) static void __wireless_device_set_up(struct wireless_device *wdev) { + if (wdev->disabled) + return; + if (wdev->state != IFS_DOWN || config_init) return; @@ -314,17 +317,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); @@ -358,6 +350,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) @@ -410,15 +419,17 @@ static void wdev_change_config(struct wireless_device *wdev, struct wireless_device *wd_new) { struct blob_attr *new_config = wd_new->config; + bool disabled = wd_new->disabled; free(wd_new); - if (blob_attr_equal(wdev->config, new_config)) + if (blob_attr_equal(wdev->config, new_config) && wdev->disabled == disabled) return; D(WIRELESS, "Update configuration of wireless device '%s'\n", wdev->name); free(wdev->config); wdev->config = blob_memdup(new_config); + wdev->disabled = disabled; wdev_set_config_state(wdev, IFC_RELOAD); } @@ -462,10 +473,10 @@ wireless_add_handler(const char *script, const char *name, json_object *obj) return; drv = calloc_a(sizeof(*drv), - &name_str, strlen(name) + 1, - &script_str, strlen(script) + 1, &dev_config, sizeof(*dev_config) + sizeof(void *), - &iface_config, sizeof(*iface_config) + sizeof(void *)); + &iface_config, sizeof(*iface_config) + sizeof(void *), + &name_str, strlen(name) + 1, + &script_str, strlen(script) + 1); drv->name = strcpy(name_str, name); drv->script = strcpy(script_str, script); @@ -486,8 +497,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; @@ -611,10 +621,10 @@ wireless_device_create(struct wireless_driver *drv, const char *name, struct blo struct blob_attr *disabled; blobmsg_parse(&wdev_policy, 1, &disabled, blob_data(data), blob_len(data)); - if (disabled && blobmsg_get_bool(disabled)) - return; wdev = calloc_a(sizeof(*wdev), &name_buf, strlen(name) + 1); + if (disabled && blobmsg_get_bool(disabled)) + wdev->disabled = true; wdev->drv = drv; wdev->state = IFS_DOWN; wdev->config_state = IFC_NORMAL; @@ -625,7 +635,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; @@ -636,6 +645,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) @@ -687,6 +698,8 @@ wireless_device_status(struct wireless_device *wdev, struct blob_buf *b) 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); + blobmsg_add_u8(b, "disabled", wdev->disabled); + i = blobmsg_open_array(b, "interfaces"); vlist_for_each_element(&wdev->interfaces, iface, node) wireless_interface_status(iface, b); @@ -694,6 +707,30 @@ wireless_device_status(struct wireless_device *wdev, struct blob_buf *b) blobmsg_close_table(b, c); } +void +wireless_device_get_validate(struct wireless_device *wdev, struct blob_buf *b) +{ + struct uci_blob_param_list *p; + void *c, *d; + int i; + + c = blobmsg_open_table(b, wdev->name); + + d = blobmsg_open_table(b, "device"); + p = wdev->drv->device.config; + for (i = 0; i < p->n_params; i++) + blobmsg_add_string(b, p->params[i].name, uci_get_validate_string(p, i)); + blobmsg_close_table(b, d); + + d = blobmsg_open_table(b, "interface"); + p = wdev->drv->interface.config; + for (i = 0; i < p->n_params; i++) + blobmsg_add_string(b, p->params[i].name, uci_get_validate_string(p, i)); + blobmsg_close_table(b, d); + + blobmsg_close_table(b, c); +} + static void wireless_interface_set_data(struct wireless_interface *vif) { @@ -866,9 +903,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: