dhcpv6: send NotOnLink status on global level
[project/odhcpd.git] / src / dhcpv4.c
index 628efcd..62ddab8 100644 (file)
@@ -119,16 +119,22 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable)
                                                (addr.s_addr & mask.s_addr);
                                iface->dhcpv4_end.s_addr = htonl(end) |
                                                (addr.s_addr & mask.s_addr);
-                       } else if (ntohl(mask.s_addr) <= 0xffffffc0) {
+                       } else if (ntohl(mask.s_addr) <= 0xfffffff0) {
                                start = addr.s_addr & mask.s_addr;
                                end = addr.s_addr & mask.s_addr;
 
                                if (ntohl(mask.s_addr) <= 0xffffff00) {
                                        iface->dhcpv4_start.s_addr = start | htonl(100);
                                        iface->dhcpv4_end.s_addr = end | htonl(250);
-                               } else {
+                               } else if (ntohl(mask.s_addr) <= 0xffffffc0) {
+                                       iface->dhcpv4_start.s_addr = start | htonl(10);
+                                       iface->dhcpv4_end.s_addr = end | htonl(60);
+                               } else if (ntohl(mask.s_addr) <= 0xffffffe0) {
                                        iface->dhcpv4_start.s_addr = start | htonl(10);
-                                       iface->dhcpv4_end.s_addr = end | htonl(59);
+                                       iface->dhcpv4_end.s_addr = end | htonl(30);
+                               } else {
+                                       iface->dhcpv4_start.s_addr = start | htonl(3);
+                                       iface->dhcpv4_end.s_addr = end | htonl(12);
                                }
                        }
 
@@ -356,14 +362,16 @@ static void handle_dhcpv4(void *addr, void *data, size_t len,
                dhcpv4_put(&reply, &cookie, DHCPV4_OPT_MTU, 2, &mtu);
        }
 
-       if (iface->search) {
-               char b[256];
-               if (dn_expand(iface->search, iface->search + iface->search_len,
-                               iface->search, b, sizeof(b)) > 0)
-                       dhcpv4_put(&reply, &cookie, DHCPV4_OPT_DOMAIN, strlen(b), b);
+       if (iface->search && iface->search_len <= 255) {
+               dhcpv4_put(&reply, &cookie, DHCPV4_OPT_SEARCH_DOMAIN,
+                               iface->search_len, iface->search);
        } else if (!res_init() && _res.dnsrch[0] && _res.dnsrch[0][0]) {
-               dhcpv4_put(&reply, &cookie, DHCPV4_OPT_DOMAIN,
-                               strlen(_res.dnsrch[0]), _res.dnsrch[0]);
+               uint8_t search_buf[256];
+               int len = dn_comp(_res.dnsrch[0], search_buf,
+                                               sizeof(search_buf), NULL, NULL);
+               if (len > 0)
+                       dhcpv4_put(&reply, &cookie, DHCPV4_OPT_SEARCH_DOMAIN,
+                                       len, search_buf);
        }
 
        dhcpv4_put(&reply, &cookie, DHCPV4_OPT_ROUTER, 4, &ifaddr.sin_addr);
@@ -511,6 +519,9 @@ static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
                        a = NULL;
                }
 
+               if (a)
+                       update_state = true;
+
                if (assigned && a)
                        lease = a;
        } else if (msg == DHCPV4_MSG_RELEASE) {