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;
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");
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) &&
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)
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) ?
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 =
{
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;
}
}