dhcpv4: notify DHCP ACK and RELEASE via ubus
authorHans Dedecker <dedeckeh@gmail.com>
Tue, 28 Nov 2017 14:08:27 +0000 (15:08 +0100)
committerHans Dedecker <dedeckeh@gmail.com>
Wed, 6 Dec 2017 09:30:33 +0000 (10:30 +0100)
If the ubus object has any subscription notify DHCP ACK and DHCP RELEASE
events using ubus notifications.

Signed-off-by: Borja Salazar <borja.salazar@fon.com>
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
src/dhcpv4.c
src/odhcpd.c
src/odhcpd.h
src/ubus.c

index 166582e94ebe2fe971c97c457b0f7ad2a7a1a61b..c36750783c3276f2d6d33a137c25eeb714d9af20 100644 (file)
@@ -723,6 +723,11 @@ static void handle_dhcpv4(void *addr, void *data, size_t len,
                        req->chaddr[0],req->chaddr[1],req->chaddr[2],
                        req->chaddr[3],req->chaddr[4],req->chaddr[5]);
 
+#ifdef WITH_UBUS
+       if (reqmsg == DHCPV4_MSG_RELEASE)
+               ubus_bcast_dhcp_event("dhcp.release", req->chaddr, req->hlen,
+                                       &req->ciaddr, hostname, iface->ifname);
+#endif
        if (reqmsg == DHCPV4_MSG_DECLINE || reqmsg == DHCPV4_MSG_RELEASE)
                return;
 
@@ -872,6 +877,12 @@ static void handle_dhcpv4(void *addr, void *data, size_t len,
 
        sendto(sock, &reply, sizeof(reply), MSG_DONTWAIT,
                        (struct sockaddr*)&dest, sizeof(dest));
+
+#ifdef WITH_UBUS
+       if (msg == DHCPV4_MSG_ACK)
+               ubus_bcast_dhcp_event("dhcp.ack", req->chaddr, req->hlen, &reply.yiaddr,
+                                       hostname, iface->ifname);
+#endif
 }
 
 static bool dhcpv4_assign(struct interface *iface,
index 13697b77ba879429e5e1a0776ab6e02a53735d2f..97a6de92f34620fa79f2d8516d354e957a4b3f08 100644 (file)
@@ -466,6 +466,16 @@ void odhcpd_hexlify(char *dst, const uint8_t *src, size_t len)
        *dst = 0;
 }
 
+const char *odhcpd_print_mac(const uint8_t *mac, const size_t len)
+{
+       static char buf[32];
+
+       snprintf(buf, sizeof(buf), "%02x", mac[0]);
+       for (size_t i = 1, j = 2; i < len && j < sizeof(buf); i++, j += 3)
+               snprintf(buf + j, sizeof(buf) - j, ":%02x", mac[i]);
+
+       return buf;
+}
 
 int odhcpd_bmemcmp(const void *av, const void *bv, size_t bits)
 {
index 45badd3c012acbf553f773ce536e342132ca5117..fbfeb671c977e299fb0a0513eca0e3088d51f3f1 100644 (file)
@@ -282,6 +282,7 @@ void odhcpd_run(void);
 time_t odhcpd_time(void);
 ssize_t odhcpd_unhexlify(uint8_t *dst, size_t len, const char *src);
 void odhcpd_hexlify(char *dst, const uint8_t *src, size_t len);
+const char *odhcpd_print_mac(const uint8_t *mac, const size_t len);
 
 int odhcpd_bmemcmp(const void *av, const void *bv, size_t bits);
 void odhcpd_bmemcpy(void *av, const void *bv, size_t bits);
@@ -296,6 +297,8 @@ int ubus_init(void);
 const char* ubus_get_ifname(const char *name);
 void ubus_apply_network(void);
 bool ubus_has_prefix(const char *name, const char *ifname);
+void ubus_bcast_dhcp_event(const char *type, const uint8_t *mac, const size_t mac_len,
+               const struct in_addr *addr, const char *name, const char *interface);
 #endif
 
 int netlink_add_netevent_handler(struct netevent_handler *hdlr);
index 95eeff7b9fe5004367c1682171e0c50416515223..19b14be9175a875456624d863e7faf312f835117 100644 (file)
@@ -311,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)