From 4b270b172a6e570f4e9fa1ebb4bc67b0e715ee48 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Tue, 11 Dec 2007 10:03:28 -0800 Subject: [PATCH] Fix dotted quad for bit order Signed-off-by: Stephen Hemminger --- lib/utils.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/utils.c b/lib/utils.c index eb8e312c8..84948513d 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -47,7 +47,7 @@ int get_integer(int *val, const char *arg, int base) return 0; } -/* a valid netmask must be 2^n - 1 (n = 1..31) */ +/* a valid netmask must be 2^n - 1 */ static int is_valid_netmask(const inet_prefix *addr) { uint32_t host; @@ -60,6 +60,17 @@ static int is_valid_netmask(const inet_prefix *addr) return (host & (host + 1)) == 0; } +static unsigned cidr(const inet_prefix *addr) +{ + unsigned bits = 0; + u_int32_t mask; + + for (mask = ntohl(addr->data[0]); mask; mask <<= 1) + ++bits; + + return bits; +} + static int get_netmask(unsigned *val, const char *arg, int base) { inet_prefix addr; @@ -69,14 +80,10 @@ static int get_netmask(unsigned *val, const char *arg, int base) /* try coverting dotted quad to CIDR */ if (!get_addr_1(&addr, arg, AF_INET)) { - u_int32_t mask; - - *val=0; - for (mask = addr.data[0]; mask; mask >>= 1) - (*val)++; - if (is_valid_netmask(&addr)) return 0; + + *val = cidr(&addr); } return -1; -- 2.47.2