IPv6: Export delegation setting via ubus
[project/netifd.git] / ubus.c
diff --git a/ubus.c b/ubus.c
index a26c3dd..9063680 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -135,11 +135,11 @@ netifd_add_dynamic(struct ubus_context *ctx, struct ubus_object *obj,
 
        const char *name = blobmsg_get_string(tb[DI_NAME]);
 
-       iface = calloc(1, sizeof(*iface));
+       iface = interface_alloc(name, msg);
        if (!iface)
                return UBUS_STATUS_UNKNOWN_ERROR;
 
-       interface_init(iface, name, msg, true);
+       interface_set_dynamic(iface);
        iface->device_config = true;
 
        config = blob_memdup(msg);
@@ -488,6 +488,11 @@ interface_ip_dump_route_list(struct interface_ip_settings *ip, bool enabled)
                if (route->valid_until)
                        blobmsg_add_u32(&b, "valid", route->valid_until - now);
 
+               buf = blobmsg_alloc_string_buffer(&b, "source", buflen);
+               inet_ntop(af, &route->source, buf, buflen);
+               snprintf(buf + strlen(buf), 4, "/%u", route->sourcemask);
+               blobmsg_add_string_buffer(&b);
+
                blobmsg_close_table(&b, r);
        }
 }
@@ -651,6 +656,7 @@ netifd_dump_status(struct interface *iface)
 
        if (iface->state == IFS_UP) {
                blobmsg_add_u32(&b, "metric", iface->metric);
+               blobmsg_add_u8(&b, "delegation", !iface->proto_ip.no_delegation);
                a = blobmsg_open_array(&b, "ipv4-address");
                interface_ip_dump_address_list(&iface->config_ip, false, true);
                interface_ip_dump_address_list(&iface->proto_ip, false, true);
@@ -727,6 +733,7 @@ netifd_handle_status(struct ubus_context *ctx, struct ubus_object *obj,
        return 0;
 }
 
+
 static int
 netifd_handle_dump(struct ubus_context *ctx, struct ubus_object *obj,
                     struct ubus_request_data *req, const char *method,
@@ -756,9 +763,7 @@ netifd_iface_handle_device(struct ubus_context *ctx, struct ubus_object *obj,
 {
        struct blob_attr *tb[__DEV_MAX];
        struct interface *iface;
-       struct device *dev;
        bool add = !strncmp(method, "add", 3);
-       int ret;
 
        iface = container_of(obj, struct interface, ubus);
 
@@ -767,29 +772,7 @@ netifd_iface_handle_device(struct ubus_context *ctx, struct ubus_object *obj,
        if (!tb[DEV_NAME])
                return UBUS_STATUS_INVALID_ARGUMENT;
 
-       device_lock();
-
-       dev = device_get(blobmsg_data(tb[DEV_NAME]), add ? 2 : 0);
-       if (!dev) {
-               ret = UBUS_STATUS_NOT_FOUND;
-               goto out;
-       }
-
-       if (add) {
-               device_set_present(dev, true);
-               if (iface->device_config)
-                       device_set_config(dev, &simple_device_type, iface->config);
-
-               system_if_apply_settings(dev, &dev->settings);
-               ret = interface_add_link(iface, dev);
-       } else {
-               ret = interface_remove_link(iface, dev);
-       }
-
-out:
-       device_unlock();
-
-       return ret;
+       return interface_handle_link(iface, blobmsg_data(tb[DEV_NAME]), add);
 }