9a0aeb9b74
This fixes excessively frequent calls to some init scripts.
123 lines
4.7 KiB
Diff
123 lines
4.7 KiB
Diff
From: Jan-Philipp Litza <janphilipp@litza.de>
|
|
Date: Fri, 10 Mar 2017 00:21:24 +0100
|
|
Subject: netifd: Fix triggering of interface update event
|
|
|
|
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>
|
|
|
|
diff --git a/package/network/config/netifd/patches/001-interface-fix-triggering-of-interface-update-event.patch b/package/network/config/netifd/patches/001-interface-fix-triggering-of-interface-update-event.patch
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..9eda2f59ea016cbbd370ad5d3589891c1ac7d18b
|
|
--- /dev/null
|
|
+++ b/package/network/config/netifd/patches/001-interface-fix-triggering-of-interface-update-event.patch
|
|
@@ -0,0 +1,97 @@
|
|
+From b8ef742bd04ebef324ae11aee56c6e1d2cb7e0ad Mon Sep 17 00:00:00 2001
|
|
+From: Hans Dedecker <dedeckeh@gmail.com>
|
|
+Date: Wed, 2 Nov 2016 09:22:10 +0100
|
|
+Subject: [PATCH] interface: Fix triggering of interface update event
|
|
+
|
|
+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 | 9 ++++++---
|
|
+ interface.h | 2 +-
|
|
+ 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;
|
|
+ }
|
|
+
|
|
+--
|
|
+2.1.4
|
|
+
|