config: set RFC defaults for preferred lifetime
[project/odhcpd.git] / src / ubus.c
index eb6e84513595884304c4d603f372a35cb66be921..45b29a4e6459d86d46a6d6f2cd7961ab552fcd51 100644 (file)
@@ -29,13 +29,13 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob
        a = blobmsg_open_table(&b, "device");
 
        avl_for_each_element(&interfaces, iface, avl) {
-               if (iface->dhcpv4 != MODE_SERVER || iface->dhcpv4_assignments.next == NULL)
+               if (iface->dhcpv4 != MODE_SERVER)
                        continue;
 
                void *i = blobmsg_open_table(&b, iface->ifname);
                void *j = blobmsg_open_array(&b, "leases");
 
-               struct dhcpv4_assignment *c;
+               struct dhcp_assignment *c;
                list_for_each_entry(c, &iface->dhcpv4_assignments, head) {
                        if (!INFINITE_VALID(c->valid_until) && c->valid_until < now)
                                continue;
@@ -49,6 +49,16 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob
                        blobmsg_add_string(&b, "hostname", (c->hostname) ? c->hostname : "");
                        blobmsg_add_u8(&b, "accept-reconf-nonce", c->accept_fr_nonce);
 
+                       if (c->reqopts) {
+                               int opt = 0;
+                               int chars = 0;
+                               buf = blobmsg_alloc_string_buffer(&b, "reqopts", strlen(c->reqopts) * 4 + 1);
+                               for(; c->reqopts[opt]; opt++)
+                                       chars += snprintf(buf + chars, 6, "%u,", (uint8_t)c->reqopts[opt]);
+                               buf[chars - 1] = '\0';
+                               blobmsg_add_string_buffer(&b);
+                       }
+
                        m = blobmsg_open_array(&b, "flags");
                        if (c->flags & OAF_BOUND)
                                blobmsg_add_string(&b, NULL, "bound");
@@ -112,14 +122,14 @@ static int handle_dhcpv6_leases(_unused struct ubus_context *ctx, _unused struct
        a = blobmsg_open_table(&b, "device");
 
        avl_for_each_element(&interfaces, iface, avl) {
-               if (iface->dhcpv6 != MODE_SERVER || iface->ia_assignments.next == NULL)
+               if (iface->dhcpv6 != MODE_SERVER)
                        continue;
 
                void *i = blobmsg_open_table(&b, iface->ifname);
                void *j = blobmsg_open_array(&b, "leases");
 
-               struct dhcpv6_assignment *a, *border = list_last_entry(
-                               &iface->ia_assignments, struct dhcpv6_assignment, head);
+               struct dhcp_assignment *a, *border = list_last_entry(
+                               &iface->ia_assignments, struct dhcp_assignment, head);
 
                list_for_each_entry(a, &iface->ia_assignments, head) {
                        if (a == border || (!INFINITE_VALID(a->valid_until) &&
@@ -135,7 +145,10 @@ static int handle_dhcpv6_leases(_unused struct ubus_context *ctx, _unused struct
                        blobmsg_add_u32(&b, "iaid", ntohl(a->iaid));
                        blobmsg_add_string(&b, "hostname", (a->hostname) ? a->hostname : "");
                        blobmsg_add_u8(&b, "accept-reconf", a->accept_reconf);
-                       blobmsg_add_u32(&b, "assigned", a->assigned);
+                       if (a->flags & OAF_DHCPV6_NA)
+                               blobmsg_add_u64(&b, "assigned", a->assigned_host_id);
+                       else
+                               blobmsg_add_u16(&b, "assigned", a->assigned_subnet_id);
 
                        m = blobmsg_open_array(&b, "flags");
                        if (a->flags & OAF_BOUND)
@@ -145,8 +158,8 @@ static int handle_dhcpv6_leases(_unused struct ubus_context *ctx, _unused struct
                                blobmsg_add_string(&b, NULL, "static");
                        blobmsg_close_array(&b, m);
 
-                       m = blobmsg_open_array(&b, a->length == 128 ? "ipv6-addr": "ipv6-prefix");
-                       dhcpv6_enum_ia_addrs(iface, a, now, dhcpv6_blobmsg_ia_addr, NULL);
+                       m = blobmsg_open_array(&b, a->flags & OAF_DHCPV6_NA ? "ipv6-addr": "ipv6-prefix");
+                       dhcpv6_ia_enum_addrs(iface, a, now, dhcpv6_blobmsg_ia_addr, NULL);
                        blobmsg_close_table(&b, m);
 
                        blobmsg_add_u32(&b, "valid", INFINITE_VALID(a->valid_until) ?
@@ -164,10 +177,20 @@ static int handle_dhcpv6_leases(_unused struct ubus_context *ctx, _unused struct
        return 0;
 }
 
+static int handle_add_lease(_unused struct ubus_context *ctx, _unused struct ubus_object *obj,
+               _unused struct ubus_request_data *req, _unused const char *method,
+               struct blob_attr *msg)
+{
+       if (!set_lease_from_blobmsg(msg))
+               return UBUS_STATUS_OK;
+
+       return UBUS_STATUS_INVALID_ARGUMENT;
+}
 
 static struct ubus_method main_object_methods[] = {
        {.name = "ipv4leases", .handler = handle_dhcpv4_leases},
        {.name = "ipv6leases", .handler = handle_dhcpv6_leases},
+       UBUS_METHOD("add_lease", handle_add_lease, lease_attrs),
 };
 
 static struct ubus_object_type main_object_type =
@@ -245,15 +268,15 @@ static int handle_update(_unused struct ubus_context *ctx, _unused struct ubus_o
 {
        struct blob_attr *tb[IFACE_ATTR_MAX];
        struct interface *c;
-       bool update = false;
+       bool update = true;
 
        blobmsg_parse(iface_attrs, IFACE_ATTR_MAX, tb, blob_data(msg), blob_len(msg));
        const char *interface = (tb[IFACE_ATTR_INTERFACE]) ?
                        blobmsg_get_string(tb[IFACE_ATTR_INTERFACE]) : "";
 
        avl_for_each_element(&interfaces, c, avl) {
-               if (!strcmp(interface, c->name) && !c->ignore) {
-                       update = true;
+               if (!strcmp(interface, c->name) && c->ignore) {
+                       update = false;
                        break;
                }
        }