From 365f8fa4628b371551d6f5b20651ac06239f905d Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Tue, 8 Aug 2017 18:09:36 +0200 Subject: in46_addr: Add new function in46a_prefix_equal() This function is used to compare an IPv6 address against another, using the smaller of the two prefix lengths. Change-Id: Ic993d8abdc90897cb55276f01ae3b8a5eadf5a0d --- lib/in46_addr.c | 17 +++++++++++++++++ lib/in46_addr.h | 1 + 2 files changed, 18 insertions(+) diff --git a/lib/in46_addr.c b/lib/in46_addr.c index 844e318..a220583 100644 --- a/lib/in46_addr.c +++ b/lib/in46_addr.c @@ -74,6 +74,23 @@ int in46a_equal(const struct in46_addr *a, const struct in46_addr *b) return 0; } +/*! Determine if two in46_addr prefix are equal or not + * The prefix length is determined by the shortest of the prefixes of a and b + * \returns 1 in case the common prefix are equal; 0 otherwise */ +int in46a_prefix_equal(const struct in46_addr *a, const struct in46_addr *b) +{ + unsigned int len; + if (a->len > b->len) + len = b->len; + else + len = a->len; + + if (!memcmp(&a->v6, &b->v6, len)) + return 1; + else + return 0; +} + /*! Match if IPv6 addr1 + addr2 are within same \a mask */ static int ipv6_within_mask(const struct in6_addr *addr1, const struct in6_addr *addr2, const struct in6_addr *mask) diff --git a/lib/in46_addr.h b/lib/in46_addr.h index a0ad6e1..0afd2b4 100644 --- a/lib/in46_addr.h +++ b/lib/in46_addr.h @@ -18,6 +18,7 @@ extern int in46a_to_af(const struct in46_addr *in); extern int in46a_to_sas(struct sockaddr_storage *out, const struct in46_addr *in); extern const char *in46a_ntop(const struct in46_addr *in, char *dst, socklen_t dst_size); extern int in46a_equal(const struct in46_addr *a, const struct in46_addr *b); +extern int in46a_prefix_equal(const struct in46_addr *a, const struct in46_addr *b); extern int in46a_within_mask(const struct in46_addr *addr, const struct in46_addr *net, size_t prefixlen); int in46a_to_eua(const struct in46_addr *src, struct ul66_t *eua); -- cgit v1.2.3