diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/prefix.c | 20 | ||||
| -rw-r--r-- | lib/prefix.h | 31 | ||||
| -rw-r--r-- | lib/table.c | 2 |
3 files changed, 26 insertions, 27 deletions
diff --git a/lib/prefix.c b/lib/prefix.c index 858f860ee8..0203301562 100644 --- a/lib/prefix.c +++ b/lib/prefix.c @@ -451,7 +451,7 @@ int is_zero_mac(struct ethaddr *mac) return 1; } -unsigned int prefix_bit(const uint8_t *prefix, const uint8_t prefixlen) +unsigned int prefix_bit(const uint8_t *prefix, const uint16_t prefixlen) { unsigned int offset = prefixlen / 8; unsigned int shift = 7 - (prefixlen % 8); @@ -459,7 +459,7 @@ unsigned int prefix_bit(const uint8_t *prefix, const uint8_t prefixlen) return (prefix[offset] >> shift) & 1; } -unsigned int prefix6_bit(const struct in6_addr *prefix, const uint8_t prefixlen) +unsigned int prefix6_bit(const struct in6_addr *prefix, const uint16_t prefixlen) { return prefix_bit((const uint8_t *)&prefix->s6_addr, prefixlen); } @@ -966,18 +966,16 @@ void masklen2ip(const int masklen, struct in_addr *netmask) } /* Convert IP address's netmask into integer. We assume netmask is - sequential one. Argument netmask should be network byte order. */ + * sequential one. Argument netmask should be network byte order. */ uint8_t ip_masklen(struct in_addr netmask) { uint32_t tmp = ~ntohl(netmask.s_addr); - if (tmp) - /* clz: count leading zeroes. sadly, the behaviour of this - * builtin - * is undefined for a 0 argument, even though most CPUs give 32 - */ - return __builtin_clz(tmp); - else - return 32; + + /* + * clz: count leading zeroes. sadly, the behaviour of this builtin is + * undefined for a 0 argument, even though most CPUs give 32 + */ + return tmp ? __builtin_clz(tmp) : 32; } /* Apply mask to IPv4 prefix (network byte order). */ diff --git a/lib/prefix.h b/lib/prefix.h index 04c62b19e2..aaffb1e0c5 100644 --- a/lib/prefix.h +++ b/lib/prefix.h @@ -151,7 +151,7 @@ struct flowspec_prefix { /* FRR generic prefix structure. */ struct prefix { uint8_t family; - uint8_t prefixlen; + uint16_t prefixlen; union { uint8_t prefix; struct in_addr prefix4; @@ -172,20 +172,20 @@ struct prefix { /* IPv4 prefix structure. */ struct prefix_ipv4 { uint8_t family; - uint8_t prefixlen; + uint16_t prefixlen; struct in_addr prefix __attribute__((aligned(8))); }; /* IPv6 prefix structure. */ struct prefix_ipv6 { uint8_t family; - uint8_t prefixlen; + uint16_t prefixlen; struct in6_addr prefix __attribute__((aligned(8))); }; struct prefix_ls { uint8_t family; - uint8_t prefixlen; + uint16_t prefixlen; struct in_addr id __attribute__((aligned(8))); struct in_addr adv_router; }; @@ -193,21 +193,21 @@ struct prefix_ls { /* Prefix for routing distinguisher. */ struct prefix_rd { uint8_t family; - uint8_t prefixlen; + uint16_t prefixlen; uint8_t val[8] __attribute__((aligned(8))); }; /* Prefix for ethernet. */ struct prefix_eth { uint8_t family; - uint8_t prefixlen; + uint16_t prefixlen; struct ethaddr eth_addr __attribute__((aligned(8))); /* AF_ETHERNET */ }; /* EVPN prefix structure. */ struct prefix_evpn { uint8_t family; - uint8_t prefixlen; + uint16_t prefixlen; struct evpn_addr prefix __attribute__((aligned(8))); }; @@ -253,20 +253,20 @@ static inline int is_evpn_prefix_ipaddr_v6(const struct prefix_evpn *evp) /* Prefix for a generic pointer */ struct prefix_ptr { uint8_t family; - uint8_t prefixlen; + uint16_t prefixlen; uintptr_t prefix __attribute__((aligned(8))); }; /* Prefix for a Flowspec entry */ struct prefix_fs { uint8_t family; - uint8_t prefixlen; /* unused */ + uint16_t prefixlen; /* unused */ struct flowspec_prefix prefix __attribute__((aligned(8))); }; struct prefix_sg { uint8_t family; - uint8_t prefixlen; + uint16_t prefixlen; struct in_addr src __attribute__((aligned(8))); struct in_addr grp; }; @@ -297,15 +297,16 @@ union prefixconstptr { #endif /* INET_ADDRSTRLEN */ #ifndef INET6_ADDRSTRLEN +/* dead:beef:dead:beef:dead:beef:dead:beef + \0 */ #define INET6_ADDRSTRLEN 46 #endif /* INET6_ADDRSTRLEN */ #ifndef INET6_BUFSIZ -#define INET6_BUFSIZ 51 +#define INET6_BUFSIZ 53 #endif /* INET6_BUFSIZ */ -/* Maximum prefix string length (IPv6) */ -#define PREFIX_STRLEN 51 +/* Maximum string length of the result of prefix2str */ +#define PREFIX_STRLEN 80 /* Max bit/byte length of IPv4 address. */ #define IPV4_MAX_BYTELEN 4 @@ -368,9 +369,9 @@ extern const char *safi2str(safi_t safi); extern const char *afi2str(afi_t afi); /* Check bit of the prefix. */ -extern unsigned int prefix_bit(const uint8_t *prefix, const uint8_t prefixlen); +extern unsigned int prefix_bit(const uint8_t *prefix, const uint16_t prefixlen); extern unsigned int prefix6_bit(const struct in6_addr *prefix, - const uint8_t prefixlen); + const uint16_t prefixlen); extern struct prefix *prefix_new(void); extern void prefix_free(struct prefix *); diff --git a/lib/table.c b/lib/table.c index 0026b7692b..edba7f1932 100644 --- a/lib/table.c +++ b/lib/table.c @@ -283,7 +283,7 @@ struct route_node *route_node_get(struct route_table *const table, struct route_node *node; struct route_node *match; struct route_node *inserted; - uint8_t prefixlen = p->prefixlen; + uint16_t prefixlen = p->prefixlen; const uint8_t *prefix = &p->u.prefix; apply_mask((struct prefix *)p); |
