diff options
author | Felix Fietkau <nbd@openwrt.org> | 2011-10-06 03:48:16 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2011-10-06 03:48:16 +0200 |
commit | b357d5f359f32f9f686fe77c63580ecbf6212501 (patch) | |
tree | 15474f6ebdb54fabb866958e9ee16e213b4e9441 | |
parent | 47c3179fb2dc5af83d776d1fd6c06cc468fc9264 (diff) |
detect interface configuration changes
-rw-r--r-- | interface.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/interface.c b/interface.c index eb2f754..b8b3fd1 100644 --- a/interface.c +++ b/interface.c @@ -400,6 +400,8 @@ static void interface_change_config(struct interface *if_old, struct interface *if_new) { struct blob_attr *old_config = if_old->config; + const char *old_ifname = if_old->ifname; + const struct proto_handler *proto = if_old->proto_handler; interface_clear_errors(if_old); if_old->config = if_new->config; @@ -408,8 +410,30 @@ interface_change_config(struct interface *if_old, struct interface *if_new) if_old->config_autostart = if_new->config_autostart; if_old->ifname = if_new->ifname; + if_old->proto_handler = if_new->proto_handler; + if (strcmp(old_ifname, if_new->ifname) != 0 || + proto != if_new->proto_handler) { + D(INTERFACE, "Reload interface '%s' because of ifname/proto change\n", + if_old->name); + goto reload; + } + + if (!proto->config_params) + D(INTERFACE, "No config parameters for interface '%s'\n", + if_old->name); + else if (!config_check_equal(old_config, if_new->config, + proto->config_params)) { + D(INTERFACE, "Reload interface '%s because of config changes\n", + if_old->name); + goto reload; + } + + goto out; + +reload: set_config_state(if_old, IFC_RELOAD); +out: free(old_config); free(if_new); } |