projects
/
project
/
netifd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
properly flush routes and l3 devices when tearing down interfaces
[project/netifd.git]
/
interface.c
diff --git
a/interface.c
b/interface.c
index
2404878
..
4ad89f5
100644
(file)
--- 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;
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);
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
static void
-interface_cleanup(struct interface *iface)
+interface_cleanup(struct interface *iface
, bool reload
)
{
struct interface_user *dep, *tmp;
{
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);
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);
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)
{
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);
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)
{
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);
}
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;
iface->ifname = blobmsg_data(cur);
iface->config = config;
- vlist_add(&interfaces, &iface->node);
+ vlist_add(&interfaces, &iface->node
, iface->name
);
}
int
}
int
@@
-552,8
+555,7
@@
interface_update(struct vlist_tree *tree, struct vlist_node *node_new,
static void __init
interface_init_list(void)
{
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;
}
interfaces.keep_old = true;
interfaces.no_delete = true;
}