interface: Fix triggering of interface update event
authorHans Dedecker <dedeckeh@gmail.com>
Wed, 2 Nov 2016 08:22:10 +0000 (09:22 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 4 Nov 2016 12:24:02 +0000 (13:24 +0100)
In case the keep flag is set in proto_shell_update_link no interface
update event is triggered when IPv4/6 addresses/routes/... are updated
as the proto_event callback is not called due to keep being set.

Unconditionally call the proto_event callback handler in proto_shell_update_link
but let the proto_event callback handler; in this case interface_proto_event_cb,
decide which actions need to be taken dependant on the interface state.

In case the interface is already in the up state trigger an update event
only if the interface updated flag actually indicates either an IP address/
route/data change; before interface update events were actually sent wihtout
any parameter change.

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
interface.c
interface.h
proto-shell.c

index 5870422f418a30d68d5246b7168c03c1d7ec3f42..a014111aaadb4478ae9e2cdd978d2bc21d767028 100644 (file)
@@ -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
index aa2085dac0f3625dba329ac411aac6b61cee8ba3..7d5b3094346a9ac1f388caea76bbc740e300e09b 100644 (file)
@@ -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);
index 998a44c55f7d4ee3f42d2fd7e84e63b439819d5d..ef56aa808fc33e39fdf95a8bee50ecc35ec49316 100644 (file)
@@ -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;
        }