From: Patrick Grimm Date: Thu, 18 Jun 2015 23:30:29 +0000 (+0200) Subject: dhcpv4: add in_addr dhcpv4_mask and in_addr dhcpv4_addr to struct interface X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=ebbff3872a1f242ef5b0a7c029895848876a54b2;p=oweals%2Fodhcpd.git dhcpv4: add in_addr dhcpv4_mask and in_addr dhcpv4_addr to struct interface Signed-off-by: Patrick Grimm --- diff --git a/src/dhcpv4.c b/src/dhcpv4.c index f6f4b0a..09cca91 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -121,6 +121,7 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable) const char* saddr = ubus_get_address4(iface->name); struct in_addr addr; inet_pton(AF_INET,saddr, &addr); + iface->dhcpv4_addr.s_addr = addr.s_addr; int bits = ubus_get_mask4(iface->name); struct in_addr mask; if (bits < -32 || bits > 32) @@ -130,6 +131,7 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable) if (bits < 0) mask.s_addr = ~mask.s_addr; + iface->dhcpv4_mask.s_addr = mask.s_addr; // Create a range if not specified if (!(iface->dhcpv4_start.s_addr & htonl(0xffff0000)) && @@ -168,6 +170,11 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable) } + syslog(LOG_WARNING, "DHCPv4 dhcp addr %s", inet_ntoa(iface->dhcpv4_addr)); + syslog(LOG_WARNING, "DHCPv4 dhcp mask %s", inet_ntoa(iface->dhcpv4_mask)); + syslog(LOG_WARNING, "DHCPv4 dhcp start %s", inet_ntoa(iface->dhcpv4_start)); + syslog(LOG_WARNING, "DHCPv4 dhcp end %s", inet_ntoa(iface->dhcpv4_end)); + // Parse static entries struct lease *lease; @@ -262,10 +269,8 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, return; int sock = iface->dhcpv4_event.uloop.fd; - struct sockaddr_in ifaddr; - struct sockaddr_in ifnetmask; - syslog(LOG_NOTICE, "Got DHCPv4 request"); + syslog(LOG_WARNING, "Got DHCPv4 request"); struct ifreq ifreq; memcpy(ifreq.ifr_name, iface->ifname, sizeof(ifreq.ifr_name)); @@ -274,15 +279,10 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, return; } - memcpy(&ifaddr, &ifreq.ifr_addr, sizeof(ifaddr)); - if (ioctl(sock, SIOCGIFNETMASK, &ifreq)) - return; - - memcpy(&ifnetmask, &ifreq.ifr_netmask, sizeof(ifnetmask)); - uint32_t network = ifaddr.sin_addr.s_addr & ifnetmask.sin_addr.s_addr; + uint32_t network = iface->dhcpv4_addr.s_addr & iface->dhcpv4_mask.s_addr; - if ((iface->dhcpv4_start.s_addr & ifnetmask.sin_addr.s_addr) != network || - (iface->dhcpv4_end.s_addr & ifnetmask.sin_addr.s_addr) != network) { + if ((iface->dhcpv4_start.s_addr & iface->dhcpv4_mask.s_addr) != network || + (iface->dhcpv4_end.s_addr & iface->dhcpv4_mask.s_addr) != network) { syslog(LOG_WARNING, "DHCPv4 range out of assigned network"); return; } @@ -300,7 +300,7 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, .flags = req->flags, .ciaddr = {INADDR_ANY}, .giaddr = req->giaddr, - .siaddr = ifaddr.sin_addr, + .siaddr = iface->dhcpv4_addr, }; memcpy(reply.chaddr, req->chaddr, sizeof(reply.chaddr)); @@ -329,7 +329,7 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, } else if (opt->type == DHCPV4_OPT_IPADDRESS && opt->len == 4) { memcpy(&reqaddr, opt->data, 4); } else if (opt->type == DHCPV4_OPT_SERVERID && opt->len == 4) { - if (memcmp(opt->data, &ifaddr.sin_addr, 4)) + if (memcmp(opt->data, &iface->dhcpv4_addr, 4)) return; } else if (iface->filter_class && opt->type == DHCPV4_OPT_USER_CLASS) { uint8_t *c = opt->data, *cend = &opt->data[opt->len]; @@ -381,7 +381,7 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, return; dhcpv4_put(&reply, &cookie, DHCPV4_OPT_MESSAGE, 1, &msg); - dhcpv4_put(&reply, &cookie, DHCPV4_OPT_SERVERID, 4, &ifaddr.sin_addr); + dhcpv4_put(&reply, &cookie, DHCPV4_OPT_SERVERID, 4, &iface->dhcpv4_addr); if (lease) { reply.yiaddr.s_addr = htonl(lease->addr); @@ -395,7 +395,7 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, val = htonl(875 * iface->dhcpv4_leasetime / 1000); dhcpv4_put(&reply, &cookie, DHCPV4_OPT_REBIND, 4, &val); - dhcpv4_put(&reply, &cookie, DHCPV4_OPT_NETMASK, 4, &ifnetmask.sin_addr); + dhcpv4_put(&reply, &cookie, DHCPV4_OPT_NETMASK, 4, &iface->dhcpv4_mask); if (lease->hostname[0]) dhcpv4_put(&reply, &cookie, DHCPV4_OPT_HOSTNAME, @@ -425,14 +425,14 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, } if (iface->dhcpv4_router_cnt == 0) - dhcpv4_put(&reply, &cookie, DHCPV4_OPT_ROUTER, 4, &ifaddr.sin_addr); + dhcpv4_put(&reply, &cookie, DHCPV4_OPT_ROUTER, 4, &iface->dhcpv4_addr); else dhcpv4_put(&reply, &cookie, DHCPV4_OPT_ROUTER, 4 * iface->dhcpv4_router_cnt, iface->dhcpv4_router); if (iface->dhcpv4_dns_cnt == 0) - dhcpv4_put(&reply, &cookie, DHCPV4_OPT_DNSSERVER, 4, &ifaddr.sin_addr); + dhcpv4_put(&reply, &cookie, DHCPV4_OPT_DNSSERVER, 4, &iface->dhcpv4_addr); else dhcpv4_put(&reply, &cookie, DHCPV4_OPT_DNSSERVER, 4 * iface->dhcpv4_dns_cnt, iface->dhcpv4_dns); diff --git a/src/odhcpd.h b/src/odhcpd.h index b8cbeb2..d3a5ad6 100644 --- a/src/odhcpd.h +++ b/src/odhcpd.h @@ -145,6 +145,8 @@ struct interface { int route_preference; // DHCPv4 + struct in_addr dhcpv4_addr; + struct in_addr dhcpv4_mask; struct in_addr dhcpv4_start; struct in_addr dhcpv4_end; struct in_addr *dhcpv4_router;