Fix prefix class logic
[project/odhcpd.git] / src / dhcpv4.c
index 38b4f9b..79fabe2 100644 (file)
@@ -38,6 +38,8 @@ static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
                enum dhcpv4_msg msg, const uint8_t *mac, struct in_addr reqaddr,
                const char *hostname);
 
+// Magic option for hnet internal (4B enterprise ID, 1B data-len, 1B subopt-code, 1B subopt-len)
+static uint8_t hnet_internal_data[7] = {0x00, 0x00, 0x76, 0xfe, 2, 1, 0};
 
 // Create socket and register events
 int init_dhcpv4(void)
@@ -49,6 +51,7 @@ int init_dhcpv4(void)
 int setup_dhcpv4_interface(struct interface *iface, bool enable)
 {
        if (iface->dhcpv4_event.uloop.fd > 0) {
+               uloop_fd_delete(&iface->dhcpv4_event.uloop);
                close(iface->dhcpv4_event.uloop.fd);
                iface->dhcpv4_event.uloop.fd = -1;
        }
@@ -65,7 +68,7 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable)
                setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val));
                setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &val, sizeof(val));
 
-               val = IPTOS_CLASS_CS6;
+               val = IPTOS_PREC_INTERNETCONTROL;
                setsockopt(sock, IPPROTO_IP, IP_TOS, &val, sizeof(val));
 
                val = IP_PMTUDISC_DONT;
@@ -119,8 +122,8 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable)
                                end = addr.s_addr & mask.s_addr;
 
                                if (ntohl(mask.s_addr) <= 0xffffff00) {
-                                       iface->dhcpv4_start.s_addr = start | htonl(20);
-                                       iface->dhcpv4_end.s_addr = end | htonl(199);
+                                       iface->dhcpv4_start.s_addr = start | htonl(100);
+                                       iface->dhcpv4_end.s_addr = end | htonl(250);
                                } else {
                                        iface->dhcpv4_start.s_addr = start | htonl(10);
                                        iface->dhcpv4_end.s_addr = end | htonl(59);
@@ -168,7 +171,7 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable)
 
 
                if (iface->dhcpv4_leasetime < 60)
-                       iface->dhcpv4_leasetime = 1800;
+                       iface->dhcpv4_leasetime = 43200;
 
                iface->dhcpv4_event.uloop.fd = sock;
                iface->dhcpv4_event.handle_dgram = handle_dhcpv4;
@@ -284,6 +287,10 @@ static void handle_dhcpv4(void *addr, void *data, size_t len,
                } else if (opt->type == DHCPV4_OPT_SERVERID && opt->len == 4) {
                        if (memcmp(opt->data, &ifaddr.sin_addr, 4))
                                return;
+               } else if (opt->type == DHCPV4_OPT_VENDOR_SPECIFIC_INFORMATION &&
+                               opt->len == sizeof(hnet_internal_data)) {
+                       if (!memcmp(opt->data, hnet_internal_data, sizeof(hnet_internal_data)))
+                               return; // Ignoring hnet internal routers
                }
        }