X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fdhcpv4.c;h=79fabe2dc6f3bd561eb28a77342249afe706cd77;hp=38b4f9ba5bb9869a19da709897117dc5665e2c37;hb=1565d76bd6ff2d1064c3d30e947dc70613417853;hpb=8b19de666e02f24280728938dd985ecb3673b83e;ds=sidebyside diff --git a/src/dhcpv4.c b/src/dhcpv4.c index 38b4f9b..79fabe2 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -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 } }