From: Florian Forster Date: Sat, 16 May 2009 22:05:29 +0000 (+0200) Subject: util.c: Add the `mask62plen' utility function. X-Git-Tag: tcpdump-4.1.0~120 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/127b352b40cbbc12b6da8f300557596c385dfc8c util.c: Add the `mask62plen' utility function. The function does the same as `mask2plen' but for IPv6. Signed-off-by: Florian Forster --- diff --git a/interface.h b/interface.h index 688a2ac9..f6a4a191 100644 --- a/interface.h +++ b/interface.h @@ -336,6 +336,7 @@ extern void ripng_print(const u_char *, unsigned int); extern int rt6_print(const u_char *, const u_char *); extern void ospf6_print(const u_char *, u_int); extern void dhcp6_print(const u_char *, u_int); +extern int mask62plen(const u_char *); #endif /*INET6*/ extern u_short in_cksum(const u_short *, register u_int, int); extern u_int16_t in_cksum_shouldbe(u_int16_t, u_int16_t); diff --git a/util.c b/util.c index 784b09b7..526a0611 100644 --- a/util.c +++ b/util.c @@ -439,6 +439,35 @@ mask2plen (u_int32_t mask) return (prefix_len); } +#ifdef INET6 +int mask62plen(const u_char *mask) +{ + u_char bitmasks[] = + { + 0x00, 0x80, 0xc0, 0xe0, + 0xf0, 0xf8, 0xfc, 0xfe, 0xff + }; + int cidr_len = 0; + int byte; + + for (byte = 0; byte < 16; byte++) + { + int bits; + + for (bits = 0; bits < (sizeof (bitmasks) / sizeof (bitmasks[0])); bits++) + if (mask[byte] == bitmasks[bits]) + { + cidr_len += bits; + break; + } + + if (mask[byte] != 0xff) + break; + } + return (cidr_len); +} +#endif /* INET6 */ + /* VARARGS */ void error(const char *fmt, ...)