static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
enum dhcpv4_msg msg, const uint8_t *mac, struct in_addr reqaddr,
const char *hostname);
-static const char *excluded_class = "HOMENET";
// Create socket and register events
int init_dhcpv4(void)
(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);
}
}
} 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_USER_CLASS) {
+ } else if (iface->filter_class && opt->type == DHCPV4_OPT_USER_CLASS) {
uint8_t *c = opt->data, *cend = &opt->data[opt->len];
for (; c < cend && &c[*c] < cend; c = &c[1 + *c]) {
- size_t elen = strlen(excluded_class);
- if (*c == elen && !memcmp(&c[1], excluded_class, elen))
+ size_t elen = strlen(iface->filter_class);
+ if (*c == elen && !memcmp(&c[1], iface->filter_class, elen))
return; // Ignore from homenet
}
}
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);