diff --git a/patches/openwrt/0097-netifd-Fix-triggering-of-interface-update-event.patch b/patches/openwrt/0097-netifd-Fix-triggering-of-interface-update-event.patch new file mode 100644 index 0000000000000000000000000000000000000000..290ce25fd908d568c8337d937e47d3fb8b3d0efe --- /dev/null +++ b/patches/openwrt/0097-netifd-Fix-triggering-of-interface-update-event.patch @@ -0,0 +1,122 @@ +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 ++