diff options
-rw-r--r-- | interface.c | 9 | ||||
-rw-r--r-- | interface.h | 2 | ||||
-rw-r--r-- | proto-shell.c | 7 |
3 files changed, 10 insertions, 8 deletions
diff --git a/interface.c b/interface.c index 5870422..a014111 100644 --- a/interface.c +++ b/interface.c @@ -693,7 +693,8 @@ interface_proto_event_cb(struct interface_proto_state *state, enum interface_pro switch (ev) { case IFPEV_UP: if (iface->state != IFS_SETUP) { - interface_event(iface, IFEV_UPDATE); + if (iface->state == IFS_UP && iface->updated) + interface_event(iface, IFEV_UPDATE); return; } @@ -1091,10 +1092,12 @@ set_config_state(struct interface *iface, enum interface_config_state s) } void -interface_update_start(struct interface *iface) +interface_update_start(struct interface *iface, const bool keep_old) { iface->updated = 0; - interface_ip_update_start(&iface->proto_ip); + + if (!keep_old) + interface_ip_update_start(&iface->proto_ip); } void diff --git a/interface.h b/interface.h index aa2085d..7d5b309 100644 --- a/interface.h +++ b/interface.h @@ -199,7 +199,7 @@ void interface_add_error(struct interface *iface, const char *subsystem, int interface_add_data(struct interface *iface, const struct blob_attr *data); int interface_parse_data(struct interface *iface, const struct blob_attr *attr); -void interface_update_start(struct interface *iface); +void interface_update_start(struct interface *iface, const bool keep_old); void interface_update_complete(struct interface *iface); void interface_start_pending(void); diff --git a/proto-shell.c b/proto-shell.c index 998a44c..ef56aa8 100644 --- a/proto-shell.c +++ b/proto-shell.c @@ -538,10 +538,10 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr *data, return UBUS_STATUS_UNKNOWN_ERROR; device_set_present(dev, true); - - interface_update_start(iface); } + interface_update_start(iface, keep); + proto_apply_ip_settings(iface, data, addr_ext); if ((cur = tb[NOTIFY_ROUTES]) != NULL) @@ -562,8 +562,7 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr *data, interface_update_complete(state->proto.iface); if ((state->sm != S_SETUP_ABORT) && (state->sm != S_TEARDOWN)) { - if (!keep) - state->proto.proto_event(&state->proto, IFPEV_UP); + state->proto.proto_event(&state->proto, IFPEV_UP); state->sm = S_IDLE; } |