summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/prefix.c16
-rw-r--r--lib/prefix.h30
-rw-r--r--lib/table.c2
-rw-r--r--zebra/connected.c8
-rw-r--r--zebra/connected.h8
5 files changed, 30 insertions, 34 deletions
diff --git a/lib/prefix.c b/lib/prefix.c
index 21c3af7d49..f3b707af3a 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,12 @@ 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;
+
+ 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 4247569137..825b8bc75d 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;
@@ -171,20 +171,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;
};
@@ -192,21 +192,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)));
};
@@ -252,20 +252,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;
};
@@ -296,15 +296,17 @@ 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
+/* dead:beef:dead:beef:dead:beef:dead:beef:255.255.255.255 + / + 65535 + \0 */
+#define PREFIX_STRLEN 53
/* Max bit/byte length of IPv4 address. */
#define IPV4_MAX_BYTELEN 4
@@ -367,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 3adb793891..1fb7d3e682 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);
diff --git a/zebra/connected.c b/zebra/connected.c
index 54f4394a56..ab66eb3324 100644
--- a/zebra/connected.c
+++ b/zebra/connected.c
@@ -275,7 +275,7 @@ void connected_up(struct interface *ifp, struct connected *ifc)
/* Add connected IPv4 route to the interface. */
void connected_add_ipv4(struct interface *ifp, int flags, struct in_addr *addr,
- uint8_t prefixlen, struct in_addr *broad,
+ uint16_t prefixlen, struct in_addr *broad,
const char *label)
{
struct prefix_ipv4 *p;
@@ -473,7 +473,7 @@ static void connected_delete_helper(struct connected *ifc, struct prefix *p)
/* Delete connected IPv4 route to the interface. */
void connected_delete_ipv4(struct interface *ifp, int flags,
- struct in_addr *addr, uint8_t prefixlen,
+ struct in_addr *addr, uint16_t prefixlen,
struct in_addr *broad)
{
struct prefix p, d;
@@ -499,7 +499,7 @@ void connected_delete_ipv4(struct interface *ifp, int flags,
/* Add connected IPv6 route to the interface. */
void connected_add_ipv6(struct interface *ifp, int flags, struct in6_addr *addr,
- struct in6_addr *broad, uint8_t prefixlen,
+ struct in6_addr *broad, uint16_t prefixlen,
const char *label)
{
struct prefix_ipv6 *p;
@@ -556,7 +556,7 @@ void connected_add_ipv6(struct interface *ifp, int flags, struct in6_addr *addr,
}
void connected_delete_ipv6(struct interface *ifp, struct in6_addr *address,
- struct in6_addr *broad, uint8_t prefixlen)
+ struct in6_addr *broad, uint16_t prefixlen)
{
struct prefix p, d;
struct connected *ifc;
diff --git a/zebra/connected.h b/zebra/connected.h
index 75b6e05bda..415ecfd965 100644
--- a/zebra/connected.h
+++ b/zebra/connected.h
@@ -35,11 +35,11 @@ extern struct connected *connected_check_ptp(struct interface *ifp,
union prefixconstptr d);
extern void connected_add_ipv4(struct interface *ifp, int flags,
- struct in_addr *addr, uint8_t prefixlen,
+ struct in_addr *addr, uint16_t prefixlen,
struct in_addr *broad, const char *label);
extern void connected_delete_ipv4(struct interface *ifp, int flags,
- struct in_addr *addr, uint8_t prefixlen,
+ struct in_addr *addr, uint16_t prefixlen,
struct in_addr *broad);
extern void connected_delete_ipv4_unnumbered(struct connected *ifc);
@@ -49,10 +49,10 @@ extern void connected_down(struct interface *ifp, struct connected *ifc);
extern void connected_add_ipv6(struct interface *ifp, int flags,
struct in6_addr *address, struct in6_addr *broad,
- uint8_t prefixlen, const char *label);
+ uint16_t prefixlen, const char *label);
extern void connected_delete_ipv6(struct interface *ifp,
struct in6_addr *address,
- struct in6_addr *broad, uint8_t prefixlen);
+ struct in6_addr *broad, uint16_t prefixlen);
extern int connected_is_unnumbered(struct interface *);