diff options
author | Hans Dedecker <dedeckeh@gmail.com> | 2015-12-17 15:02:06 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2015-12-19 12:28:27 +0100 |
commit | 6a84e770ed9f4ea0ffe9b20625f8f15868f5424b (patch) | |
tree | 76b0a4e871ff0f595e3e087b68d47315b21b1cbc | |
parent | 245527193e90906451be35c2b8e972b8712ea6ab (diff) |
interface: Trigger interface update event when interface data is updated via ubus
Interface update event will trigger an interface hotplug event and an ubus notify event
which will inform subscribers about the updated interface data field
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
-rw-r--r-- | interface.c | 21 | ||||
-rw-r--r-- | interface.h | 1 | ||||
-rw-r--r-- | ubus.c | 10 |
3 files changed, 23 insertions, 9 deletions
diff --git a/interface.c b/interface.c index 2638342..2aab37c 100644 --- a/interface.c +++ b/interface.c @@ -75,6 +75,8 @@ const struct uci_blob_param_list interface_attr_list = { static void set_config_state(struct interface *iface, enum interface_config_state s); +static void +interface_event(struct interface *iface, enum interface_event ev); static void interface_error_flush(struct interface *iface) @@ -195,6 +197,25 @@ interface_add_data(struct interface *iface, const struct blob_attr *data) return 0; } +int interface_parse_data(struct interface *iface, const struct blob_attr *attr) +{ + struct blob_attr *cur; + int rem, ret; + + iface->updated = 0; + + blob_for_each_attr(cur, attr, rem) { + ret = interface_add_data(iface, cur); + if (ret) + return ret; + } + + if (iface->updated && iface->state == IFS_UP) + interface_event(iface, IFEV_UPDATE); + + return 0; +} + static void interface_event(struct interface *iface, enum interface_event ev) { diff --git a/interface.h b/interface.h index 6f9112c..c2049f1 100644 --- a/interface.h +++ b/interface.h @@ -193,6 +193,7 @@ void interface_add_error(struct interface *iface, const char *subsystem, const char *code, const char **data, int n_data); 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_complete(struct interface *iface); @@ -891,18 +891,10 @@ netifd_handle_set_data(struct ubus_context *ctx, struct ubus_object *obj, struct blob_attr *msg) { struct interface *iface; - struct blob_attr *cur; - int rem, ret; iface = container_of(obj, struct interface, ubus); - blob_for_each_attr(cur, msg, rem) { - ret = interface_add_data(iface, cur); - if (ret) - return ret; - } - - return 0; + return interface_parse_data(iface, msg); } static struct ubus_method iface_object_methods[] = { |