diff options
-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[] = { |