summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--interface.c9
-rw-r--r--interface.h2
-rw-r--r--proto-shell.c7
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;
}