X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=interface.c;h=83d7f94fe8268354925d65463ca62db7c54d93bf;hp=e66b58a1da658b876f1af4a939592f4924f2396e;hb=02713a50084b26a927d5d1f95455829d320aa4e1;hpb=5844d3caa26f5f8810476836a8b711107e4ba8d7 diff --git a/interface.c b/interface.c index e66b58a..83d7f94 100644 --- a/interface.c +++ b/interface.c @@ -271,12 +271,16 @@ interface_check_state(struct interface *iface) switch (iface->state) { case IFS_UP: + case IFS_SETUP: if (!iface->enabled || !link_state) { - mark_interface_down(iface); interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, false); + mark_interface_down(iface); } break; case IFS_DOWN: + if (!iface->available) + return; + if (iface->autostart && iface->enabled && link_state && !config_init) __interface_set_up(iface); break; @@ -498,6 +502,8 @@ interface_claim_device(struct interface *iface) } else if (iface->ifname && !(iface->proto_handler->flags & PROTO_FLAG_NODEV)) { dev = device_get(iface->ifname, true); + if (dev && dev->default_config && iface->device_config) + device_set_config(dev, dev->type, iface->config); } else { dev = iface->ext_dev.dev; } @@ -527,6 +533,7 @@ interface_cleanup(struct interface *iface) { struct interface_user *dep, *tmp; + uloop_timeout_cancel(&iface->remove_timer); device_remove_user(&iface->ext_dev); if (iface->parent_iface.iface) @@ -652,6 +659,7 @@ interface_alloc(const char *name, struct blob_attr *config) struct blob_attr *cur; const char *proto_name = NULL; char *iface_name; + bool force_link = false; iface = calloc_a(sizeof(*iface), &iface_name, strlen(name) + 1); iface->name = strcpy(iface_name, name); @@ -673,9 +681,11 @@ interface_alloc(const char *name, struct blob_attr *config) proto_name = blobmsg_data(cur); proto_attach_interface(iface, proto_name); + if (iface->proto_handler->flags & PROTO_FLAG_FORCE_LINK_DEFAULT) + force_link = true; iface->autostart = blobmsg_get_bool_default(tb[IFACE_ATTR_AUTO], true); - iface->force_link = blobmsg_get_bool_default(tb[IFACE_ATTR_FORCE_LINK], false); + iface->force_link = blobmsg_get_bool_default(tb[IFACE_ATTR_FORCE_LINK], force_link); iface->proto_ip.no_defaultroute = !blobmsg_get_bool_default(tb[IFACE_ATTR_DEFAULTROUTE], true); iface->proto_ip.no_dns = @@ -832,8 +842,8 @@ interface_remove_link(struct interface *iface, struct device *dev) return 0; } -int -interface_add_link(struct interface *iface, struct device *dev) +static int +interface_add_link(struct interface *iface, struct device *dev, bool link_ext) { struct device *mdev = iface->main_dev.dev; @@ -850,21 +860,23 @@ interface_add_link(struct interface *iface, struct device *dev) return UBUS_STATUS_NOT_SUPPORTED; } - device_add_user(&iface->ext_dev, dev); + if (link_ext) + device_add_user(&iface->ext_dev, dev); + interface_set_main_dev(iface, dev); iface->main_dev.hotplug = true; return 0; } int -interface_handle_link(struct interface *iface, const char *name, bool add) +interface_handle_link(struct interface *iface, const char *name, bool add, bool link_ext) { struct device *dev; int ret; device_lock(); - dev = device_get(name, add ? 2 : 0); + dev = device_get(name, add ? (link_ext ? 2 : 1) : 0); if (!dev) { ret = UBUS_STATUS_NOT_FOUND; goto out; @@ -872,11 +884,11 @@ interface_handle_link(struct interface *iface, const char *name, bool add) if (add) { device_set_present(dev, true); - if (iface->device_config) - device_set_config(dev, &simple_device_type, iface->config); + if (iface->device_config && dev->default_config) + device_set_config(dev, dev->type, iface->config); system_if_apply_settings(dev, &dev->settings, dev->settings.flags); - ret = interface_add_link(iface, dev); + ret = interface_add_link(iface, dev, link_ext); } else { ret = interface_remove_link(iface, dev); } @@ -1004,8 +1016,12 @@ interface_change_config(struct interface *if_old, struct interface *if_new) }) if_old->config = if_new->config; - if (!if_old->config_autostart && if_new->config_autostart) - if_old->autostart = true; + if (if_old->config_autostart != if_new->config_autostart) { + if (if_old->config_autostart) + reload = true; + + if_old->autostart = if_new->config_autostart; + } if_old->device_config = if_new->device_config; if_old->config_autostart = if_new->config_autostart; @@ -1034,10 +1050,13 @@ interface_change_config(struct interface *if_old, struct interface *if_new) } if (reload_ip) { + bool config_ip_enabled = if_old->config_ip.enabled; + bool proto_ip_enabled = if_old->proto_ip.enabled; + interface_ip_set_enabled(&if_old->config_ip, false); interface_ip_set_enabled(&if_old->proto_ip, false); - interface_ip_set_enabled(&if_old->proto_ip, if_new->proto_ip.enabled); - interface_ip_set_enabled(&if_old->config_ip, if_new->config_ip.enabled); + interface_ip_set_enabled(&if_old->proto_ip, proto_ip_enabled); + interface_ip_set_enabled(&if_old->config_ip, config_ip_enabled); } interface_write_resolv_conf();