diff --git a/src/dhcpd-pools.h b/src/dhcpd-pools.h index 793172d..5568711 100644 --- a/src/dhcpd-pools.h +++ b/src/dhcpd-pools.h @@ -205,7 +205,7 @@ int parse_ipaddr(const char *restrict src, union ipaddr_t *restrict dst); void copy_ipaddr(union ipaddr_t *restrict dst, const union ipaddr_t *restrict src); const char *ntop_ipaddr(const union ipaddr_t *ip); -unsigned long get_range_size(const struct range_t *r); +double get_range_size(const struct range_t *r); int xstrstr(const char *__restrict a, const char *__restrict b, int len) __attribute__ ((nonnull(1, 2))) # if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) diff --git a/src/other.c b/src/other.c index 70b29e2..7b8ec99 100644 --- a/src/other.c +++ b/src/other.c @@ -125,17 +125,17 @@ const char *ntop_ipaddr(const union ipaddr_t *ip) * and last IP in the range. * \return Size of a range. */ -unsigned long get_range_size(const struct range_t *r) +double get_range_size(const struct range_t *r) { if (config.dhcp_version == VERSION_6) { - unsigned long size = 0; + double size = 0; int i; /* When calculating the size of an IPv6 range overflow may * occur. In that case only the last LONG_BIT bits are * preserved, thus we just skip the first (16 - LONG_BIT) * bits... */ - for (i = LONG_BIT / 8 < 16 ? 16 - LONG_BIT / 8 : 0; i < 16; i++) { - size <<= 8; + for (i = 0; i < 16; i++) { + size *= 256; size += (int)r->last_ip.v6[i] - (int)r->first_ip.v6[i]; } return size + 1;