X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=interface.c;h=4ad89f538a41328f006d49c49c3576f1348463da;hp=2404878a3e03177a1ec02941c2b67738cab22fe3;hb=75baeca6f817b161f522a9961bfe5c3718397189;hpb=aff73720b65ca33a487c813f27644f8d5aea0df1 diff --git a/interface.c b/interface.c index 2404878..4ad89f5 100644 --- a/interface.c +++ b/interface.c @@ -120,6 +120,8 @@ __interface_set_down(struct interface *iface, bool force) if (iface->state == IFS_UP) interface_event(iface, IFEV_DOWN); iface->state = IFS_TEARDOWN; + interface_ip_flush(&iface->config_ip); + interface_ip_flush(&iface->proto_ip); interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, force); if (force) interface_flush_state(iface); @@ -195,7 +197,7 @@ interface_claim_device(struct interface *iface) static void -interface_cleanup(struct interface *iface) +interface_cleanup(struct interface *iface, bool reload) { struct interface_user *dep, *tmp; @@ -205,7 +207,8 @@ interface_cleanup(struct interface *iface) interface_ip_flush(&iface->config_ip); interface_flush_state(iface); interface_clear_errors(iface); - if (iface->main_dev.dev) + if (iface->main_dev.dev && + (!reload || !iface->main_dev.hotplug)) device_remove_user(&iface->main_dev); iface->l3_dev = &iface->main_dev; interface_set_proto_state(iface, NULL); @@ -214,7 +217,7 @@ interface_cleanup(struct interface *iface) static void interface_do_free(struct interface *iface) { - interface_cleanup(iface); + interface_cleanup(iface, false); free(iface->config); netifd_ubus_remove_interface(iface); avl_delete(&interfaces.avl, &iface->node.avl); @@ -224,7 +227,7 @@ interface_do_free(struct interface *iface) static void interface_do_reload(struct interface *iface) { - interface_cleanup(iface); + interface_cleanup(iface, true); proto_init_interface(iface, iface->config); interface_claim_device(iface); } @@ -348,7 +351,7 @@ interface_add(struct interface *iface, struct blob_attr *config) iface->ifname = blobmsg_data(cur); iface->config = config; - vlist_add(&interfaces, &iface->node); + vlist_add(&interfaces, &iface->node, iface->name); } int @@ -552,8 +555,7 @@ interface_update(struct vlist_tree *tree, struct vlist_node *node_new, static void __init interface_init_list(void) { - vlist_init(&interfaces, avl_strcmp, interface_update, - struct interface, node, name); + vlist_init(&interfaces, avl_strcmp, interface_update); interfaces.keep_old = true; interfaces.no_delete = true; }