From 304e7e9d53621b78b44c52e6aff20ed5828afc67 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 21 Feb 2019 13:31:35 +0900 Subject: network: generate random prefix from address pool Fixes #9955. --- src/network/networkd-address-pool.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'src/network/networkd-address-pool.c') diff --git a/src/network/networkd-address-pool.c b/src/network/networkd-address-pool.c index 26c73acbb7..eaf056d118 100644 --- a/src/network/networkd-address-pool.c +++ b/src/network/networkd-address-pool.c @@ -6,6 +6,8 @@ #include "set.h" #include "string-util.h" +#define RANDOM_PREFIX_TRIAL_MAX 1024 + static int address_pool_new( Manager *m, AddressPool **ret, @@ -121,35 +123,34 @@ static bool address_pool_prefix_is_taken( int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found) { union in_addr_union u; + unsigned i; + int r; assert(p); assert(prefixlen > 0); assert(found); - if (p->prefixlen > prefixlen) + if (p->prefixlen >= prefixlen) return 0; u = p->in_addr; - for (;;) { - if (!address_pool_prefix_is_taken(p, &u, prefixlen)) { - _cleanup_free_ char *s = NULL; - int r; - r = in_addr_to_string(p->family, &u, &s); - if (r < 0) - return r; + for (i = 0; i < RANDOM_PREFIX_TRIAL_MAX; i++) { + r = in_addr_random_prefix(p->family, &u, p->prefixlen, prefixlen); + if (r <= 0) + return r; - log_debug("Found range %s/%u", strna(s), prefixlen); + if (!address_pool_prefix_is_taken(p, &u, prefixlen)) { + if (DEBUG_LOGGING) { + _cleanup_free_ char *s = NULL; + + (void) in_addr_to_string(p->family, &u, &s); + log_debug("Found range %s/%u", strna(s), prefixlen); + } *found = u; return 1; } - - if (!in_addr_prefix_next(p->family, &u, prefixlen)) - return 0; - - if (!in_addr_prefix_intersect(p->family, &p->in_addr, p->prefixlen, &u, prefixlen)) - return 0; } return 0; -- cgit v1.2.3