X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fubus.c;h=973ae5a8b19ed23c30a582f6921afc27ed112ca9;hp=57863188602fcd8cd620f7a6539dde88b65deaea;hb=HEAD;hpb=570069d3e16e7679676ceeb1e973c1342a2f2684 diff --git a/src/ubus.c b/src/ubus.c index 5786318..973ae5a 100644 --- a/src/ubus.c +++ b/src/ubus.c @@ -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) { - if (iface->dhcpv4 != RELAYD_SERVER) + if (iface->dhcpv4 != MODE_SERVER || iface->dhcpv4_assignments.next == NULL) 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_u8(&b, "accept-reconf-nonce", c->accept_fr_nonce); 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); - 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); @@ -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); - 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); @@ -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) { - if (iface->dhcpv6 != RELAYD_SERVER) + if (iface->dhcpv6 != MODE_SERVER || iface->ia_assignments.next == NULL) 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) && - a->valid_until < now)) + a->valid_until < now)) 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_u8(&b, "accept-reconf", a->accept_reconf); 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 }, }; +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) @@ -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))) { - syslog(LOG_ERR, "Unable to connect to ubus: %s", strerror(errno)); + syslog(LOG_ERR, "Unable to connect to ubus: %m"); return -1; }