ubus: fix invalid ipv6-prefix json
[project/odhcpd.git] / src / ubus.c
index 5786318..973ae5a 100644 (file)
@@ -27,7 +27,7 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob
        a = blobmsg_open_table(&b, "device");
 
        list_for_each_entry(iface, &interfaces, head) {
        a = blobmsg_open_table(&b, "device");
 
        list_for_each_entry(iface, &interfaces, head) {
-               if (iface->dhcpv4 != RELAYD_SERVER)
+               if (iface->dhcpv4 != MODE_SERVER || iface->dhcpv4_assignments.next == NULL)
                        continue;
 
                void *i = blobmsg_open_table(&b, iface->ifname);
                        continue;
 
                void *i = blobmsg_open_table(&b, iface->ifname);
@@ -45,6 +45,7 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob
                        blobmsg_add_string_buffer(&b);
 
                        blobmsg_add_string(&b, "hostname", (c->hostname) ? c->hostname : "");
                        blobmsg_add_string_buffer(&b);
 
                        blobmsg_add_string(&b, "hostname", (c->hostname) ? c->hostname : "");
+                       blobmsg_add_u8(&b, "accept-reconf-nonce", c->accept_fr_nonce);
 
                        m = blobmsg_open_array(&b, "flags");
                        if (c->flags & OAF_BOUND)
 
                        m = blobmsg_open_array(&b, "flags");
                        if (c->flags & OAF_BOUND)
@@ -54,8 +55,8 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob
                                blobmsg_add_string(&b, NULL, "static");
                        blobmsg_close_array(&b, m);
 
                                blobmsg_add_string(&b, NULL, "static");
                        blobmsg_close_array(&b, m);
 
-                       buf = blobmsg_alloc_string_buffer(&b, "ip", INET_ADDRSTRLEN);
-                       struct in_addr addr = {htonl(c->addr)};
+                       buf = blobmsg_alloc_string_buffer(&b, "address", INET_ADDRSTRLEN);
+                       struct in_addr addr = {.s_addr = c->addr};
                        inet_ntop(AF_INET, &addr, buf, INET_ADDRSTRLEN);
                        blobmsg_add_string_buffer(&b);
 
                        inet_ntop(AF_INET, &addr, buf, INET_ADDRSTRLEN);
                        blobmsg_add_string_buffer(&b);
 
@@ -79,7 +80,7 @@ static void dhcpv6_blobmsg_ia_addr(struct in6_addr *addr, int prefix, uint32_t p
                                        uint32_t valid, _unused void *arg)
 {
        void *a = blobmsg_open_table(&b, NULL);
                                        uint32_t valid, _unused void *arg)
 {
        void *a = blobmsg_open_table(&b, NULL);
-       char *buf = blobmsg_alloc_string_buffer(&b, NULL, INET6_ADDRSTRLEN);
+       char *buf = blobmsg_alloc_string_buffer(&b, "address", INET6_ADDRSTRLEN);
 
        inet_ntop(AF_INET6, addr, buf, INET6_ADDRSTRLEN);
        blobmsg_add_string_buffer(&b);
 
        inet_ntop(AF_INET6, addr, buf, INET6_ADDRSTRLEN);
        blobmsg_add_string_buffer(&b);
@@ -106,7 +107,7 @@ static int handle_dhcpv6_leases(_unused struct ubus_context *ctx, _unused struct
        a = blobmsg_open_table(&b, "device");
 
        list_for_each_entry(iface, &interfaces, head) {
        a = blobmsg_open_table(&b, "device");
 
        list_for_each_entry(iface, &interfaces, head) {
-               if (iface->dhcpv6 != RELAYD_SERVER)
+               if (iface->dhcpv6 != MODE_SERVER || iface->ia_assignments.next == NULL)
                        continue;
 
                void *i = blobmsg_open_table(&b, iface->ifname);
                        continue;
 
                void *i = blobmsg_open_table(&b, iface->ifname);
@@ -117,7 +118,7 @@ static int handle_dhcpv6_leases(_unused struct ubus_context *ctx, _unused struct
 
                list_for_each_entry(a, &iface->ia_assignments, head) {
                        if (a == border || (!INFINITE_VALID(a->valid_until) &&
 
                list_for_each_entry(a, &iface->ia_assignments, head) {
                        if (a == border || (!INFINITE_VALID(a->valid_until) &&
-                                       a->valid_until < now))
+                                               a->valid_until < now))
                                continue;
 
                        void *m, *l = blobmsg_open_table(&b, NULL);
                                continue;
 
                        void *m, *l = blobmsg_open_table(&b, NULL);
@@ -128,6 +129,7 @@ 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_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);
 
                        m = blobmsg_open_array(&b, "flags");
                        blobmsg_add_u32(&b, "assigned", a->assigned);
 
                        m = blobmsg_open_array(&b, "flags");
@@ -309,6 +311,25 @@ static const struct blobmsg_policy obj_attrs[OBJ_ATTR_MAX] = {
        [OBJ_ATTR_PATH] = { .name = "path", .type = BLOBMSG_TYPE_STRING },
 };
 
        [OBJ_ATTR_PATH] = { .name = "path", .type = BLOBMSG_TYPE_STRING },
 };
 
+void ubus_bcast_dhcp_event(const char *type, const uint8_t *mac,
+               const size_t mlen, const struct in_addr *addr, const char *name,
+               const char *interface)
+{
+       if (!ubus || !main_object.has_subscribers)
+               return;
+
+       blob_buf_init(&b, 0);
+       if (mac)
+               blobmsg_add_string(&b, "mac", odhcpd_print_mac(mac, mlen));
+       if (addr)
+               blobmsg_add_string(&b, "ip", inet_ntoa(*addr));
+       if (name)
+               blobmsg_add_string(&b, "name", name);
+       if (interface)
+               blobmsg_add_string(&b, "interface", interface);
+
+       ubus_notify(ubus, &main_object, type, b.head, -1);
+}
 
 static void handle_event(_unused struct ubus_context *ctx, _unused struct ubus_event_handler *ev,
                 _unused const char *type, struct blob_attr *msg)
 
 static void handle_event(_unused struct ubus_context *ctx, _unused struct ubus_event_handler *ev,
                 _unused const char *type, struct blob_attr *msg)
@@ -388,10 +409,10 @@ bool ubus_has_prefix(const char *name, const char *ifname)
 }
 
 
 }
 
 
-int init_ubus(void)
+int ubus_init(void)
 {
        if (!(ubus = ubus_connect(NULL))) {
 {
        if (!(ubus = ubus_connect(NULL))) {
-               syslog(LOG_ERR, "Unable to connect to ubus: %s", strerror(errno));
+               syslog(LOG_ERR, "Unable to connect to ubus: %m");
                return -1;
        }
 
                return -1;
        }