diff --git a/feeds/ucentral/udhcpsnoop/src/dev.c b/feeds/ucentral/udhcpsnoop/src/dev.c index 20d9a02a1..8adcfdef4 100644 --- a/feeds/ucentral/udhcpsnoop/src/dev.c +++ b/feeds/ucentral/udhcpsnoop/src/dev.c @@ -449,15 +449,19 @@ free: return; } -void dhcpsnoop_dev_config_update(struct blob_attr *data) +void dhcpsnoop_dev_config_update(struct blob_attr *data, bool add_only) { struct blob_attr *cur; int rem; - vlist_update(&devices); + if (!add_only) + vlist_update(&devices); + blobmsg_for_each_attr(cur, data, rem) dhcpsnoop_dev_config_add(cur); - vlist_flush(&devices); + + if (!add_only) + vlist_flush(&devices); } void dhcpsnoop_dev_check(void) diff --git a/feeds/ucentral/udhcpsnoop/src/dhcpsnoop.h b/feeds/ucentral/udhcpsnoop/src/dhcpsnoop.h index 2ae799c06..cc46ceb0c 100644 --- a/feeds/ucentral/udhcpsnoop/src/dhcpsnoop.h +++ b/feeds/ucentral/udhcpsnoop/src/dhcpsnoop.h @@ -16,7 +16,7 @@ int dhcpsnoop_run_cmd(char *cmd, bool ignore_error); int dhcpsnoop_dev_init(void); void dhcpsnoop_dev_done(void); -void dhcpsnoop_dev_config_update(struct blob_attr *data); +void dhcpsnoop_dev_config_update(struct blob_attr *data, bool add_only); void dhcpsnoop_dev_check(void); void dhcpsnoop_ubus_init(void); diff --git a/feeds/ucentral/udhcpsnoop/src/ubus.c b/feeds/ucentral/udhcpsnoop/src/ubus.c index e95849009..4567e1c65 100644 --- a/feeds/ucentral/udhcpsnoop/src/ubus.c +++ b/feeds/ucentral/udhcpsnoop/src/ubus.c @@ -27,7 +27,7 @@ dhcpsnoop_ubus_config(struct ubus_context *ctx, struct ubus_object *obj, blobmsg_parse(dhcpsnoop_config_policy, __DS_CONFIG_MAX, tb, blobmsg_data(msg), blobmsg_len(msg)); - dhcpsnoop_dev_config_update(tb[DS_CONFIG_DEVICES]); + dhcpsnoop_dev_config_update(tb[DS_CONFIG_DEVICES], false); dhcpsnoop_dev_check(); @@ -35,6 +35,23 @@ dhcpsnoop_ubus_config(struct ubus_context *ctx, struct ubus_object *obj, } +static int +dhcpsnoop_ubus_add_devices(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct blob_attr *tb[__DS_CONFIG_MAX]; + + blobmsg_parse(dhcpsnoop_config_policy, __DS_CONFIG_MAX, tb, + blobmsg_data(msg), blobmsg_len(msg)); + + dhcpsnoop_dev_config_update(tb[DS_CONFIG_DEVICES], true); + + dhcpsnoop_dev_check(); + + return 0; +} + static int dhcpsnoop_ubus_check_devices(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, @@ -61,6 +78,7 @@ dhcpsnoop_ubus_dump(struct ubus_context *ctx, struct ubus_object *obj, static const struct ubus_method dhcpsnoop_methods[] = { UBUS_METHOD("config", dhcpsnoop_ubus_config, dhcpsnoop_config_policy), + UBUS_METHOD("add_devices", dhcpsnoop_ubus_add_devices, dhcpsnoop_config_policy), UBUS_METHOD_NOARG("check_devices", dhcpsnoop_ubus_check_devices), UBUS_METHOD_NOARG("dump", dhcpsnoop_ubus_dump), };