X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=wireless.c;h=387f4baf709b6242fe8f0100daf49e3c7c75b94f;hp=dcadfad28ec816a2490f4e0de0027a28b814bda5;hb=d397e8ca5dd492a1fac2e186e2a8b91ac8e463df;hpb=03834f80dc526cc3ed6c1a78730bb393f202277c diff --git a/wireless.c b/wireless.c index dcadfad..387f4ba 100644 --- a/wireless.c +++ b/wireless.c @@ -83,7 +83,7 @@ vif_config_add_bridge(struct blob_buf *buf, struct blob_attr *networks, bool pre if (!dev) return; - if (dev->type != &bridge_device_type) + if (!dev->type->bridge_capability) return; } @@ -287,6 +287,12 @@ __wireless_device_set_up(struct wireless_device *wdev) if (wdev->disabled) return; + if (wdev->retry_setup_failed) + return; + + if (!wdev->autostart) + return; + if (wdev->state != IFS_DOWN || config_init) return; @@ -314,9 +320,9 @@ wdev_handle_config_change(struct wireless_device *wdev) switch(state) { case IFC_NORMAL: case IFC_RELOAD: + __wireless_device_set_up(wdev); + wdev->config_state = IFC_NORMAL; - if (wdev->autostart) - __wireless_device_set_up(wdev); break; case IFC_REMOVE: wireless_device_free(wdev); @@ -399,7 +405,7 @@ wireless_device_retry_setup(struct wireless_device *wdev) return; if (--wdev->retry < 0) - wdev->autostart = false; + wdev->retry_setup_failed = true; __wireless_device_set_down(wdev); } @@ -424,6 +430,7 @@ wireless_device_script_task_cb(struct netifd_process *proc, int ret) void wireless_device_set_down(struct wireless_device *wdev) { + wdev->retry_setup_failed = false; wdev->autostart = false; __wireless_device_set_down(wdev); } @@ -467,6 +474,7 @@ wdev_change_config(struct wireless_device *wdev, struct wireless_device *wd_new) free(wdev->config); wdev->config = blob_memdup(new_config); wdev->disabled = disabled; + wdev->retry_setup_failed = false; wdev_set_config_state(wdev, IFC_RELOAD); } @@ -559,6 +567,14 @@ wireless_interface_init_config(struct wireless_interface *vif) if ((cur = tb[VIF_ATTR_NETWORK])) vif->network = cur; + + cur = tb[VIF_ATTR_ISOLATE]; + if (cur) + vif->isolate = blobmsg_get_bool(cur); + + cur = tb[VIF_ATTR_MODE]; + if (cur) + vif->ap_mode = !strcmp(blobmsg_get_string(cur), "ap"); } static void @@ -583,6 +599,7 @@ vif_update(struct vlist_tree *tree, struct vlist_node *node_new, } D(WIRELESS, "Update wireless interface %s on device %s\n", vif_new->name, wdev->name); + wireless_interface_handle_link(vif_old, false); free(vif_old->config); vif_old->config = blob_memdup(vif_new->config); vif_old->isolate = vif_new->isolate; @@ -596,6 +613,7 @@ vif_update(struct vlist_tree *tree, struct vlist_node *node_new, wireless_interface_init_config(vif_new); } else if (vif_old) { D(WIRELESS, "Delete wireless interface %s on device %s\n", vif_old->name, wdev->name); + wireless_interface_handle_link(vif_old, false); free((void *) vif_old->section); free(vif_old->config); free(vif_old); @@ -672,8 +690,8 @@ wireless_device_create(struct wireless_driver *drv, const char *name, struct blo wdev->config_state = IFC_NORMAL; wdev->name = strcpy(name_buf, name); wdev->config = data; - wdev->config_autostart = true; - wdev->autostart = wdev->config_autostart; + wdev->retry_setup_failed = false; + wdev->autostart = true; INIT_LIST_HEAD(&wdev->script_proc); vlist_init(&wdev->interfaces, avl_strcmp, vif_update); wdev->interfaces.keep_old = true; @@ -715,14 +733,6 @@ void wireless_interface_create(struct wireless_device *wdev, struct blob_attr *d vif->section = section; vif->isolate = false; - cur = tb[VIF_ATTR_ISOLATE]; - if (cur && blobmsg_get_bool(cur)) - vif->isolate = blobmsg_get_bool(cur); - - cur = tb[VIF_ATTR_MODE]; - if (cur && !strcmp(blobmsg_get_string(cur), "ap")) - vif->ap_mode = true; - vlist_add(&wdev->interfaces, &vif->node, vif->name); } @@ -751,6 +761,7 @@ wireless_device_status(struct wireless_device *wdev, struct blob_buf *b) 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); + blobmsg_add_u8(b, "retry_setup_failed", wdev->retry_setup_failed); put_container(b, wdev->config, "config"); i = blobmsg_open_array(b, "interfaces"); @@ -990,6 +1001,5 @@ wireless_start_pending(void) struct wireless_device *wdev; vlist_for_each_element(&wireless_devices, wdev, node) - if (wdev->autostart) - __wireless_device_set_up(wdev); + __wireless_device_set_up(wdev); }