summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2011-10-02 22:18:50 +0200
committerFelix Fietkau <nbd@openwrt.org>2011-10-02 22:18:50 +0200
commitf9d0f688fa84f53dfde9bb2c0f04ec2528cf8a14 (patch)
treee0660470d9829c244b8a8283e22c6d5261639379
parentb9f116ece5ca85c38105a8e33f0d9cc818a05694 (diff)
add an ubus callback for removing an interface
-rw-r--r--ubus.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/ubus.c b/ubus.c
index a8d3e3c..5d9d921 100644
--- a/ubus.c
+++ b/ubus.c
@@ -257,6 +257,31 @@ netifd_iface_notify_proto(struct ubus_context *ctx, struct ubus_object *obj,
return iface->proto->notify(iface->proto, msg);
}
+static void
+netifd_iface_do_remove(struct uloop_timeout *timeout)
+{
+ struct interface *iface;
+
+ iface = container_of(timeout, struct interface, remove_timer);
+ vlist_delete(&interfaces, &iface->node);
+}
+
+static int
+netifd_iface_remove(struct ubus_context *ctx, struct ubus_object *obj,
+ struct ubus_request_data *req, const char *method,
+ struct blob_attr *msg)
+{
+ struct interface *iface;
+
+ iface = container_of(obj, struct interface, ubus);
+ if (iface->remove_timer.cb)
+ return UBUS_STATUS_INVALID_ARGUMENT;
+
+ iface->remove_timer.cb = netifd_iface_do_remove;
+ uloop_timeout_set(&iface->remove_timer, 100);
+ return 0;
+}
+
static struct ubus_method iface_object_methods[] = {
{ .name = "up", .handler = netifd_handle_up },
{ .name = "down", .handler = netifd_handle_down },
@@ -266,6 +291,7 @@ static struct ubus_method iface_object_methods[] = {
{ .name = "remove_device", .handler = netifd_iface_handle_device,
.policy = dev_policy, .n_policy = __DEV_MAX_NOFORCE },
{ .name = "notify_proto", .handler = netifd_iface_notify_proto },
+ { .name = "remove", .handler = netifd_iface_remove }
};
static struct ubus_object_type iface_object_type =