aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-08-08 18:09:36 +0200
committerHarald Welte <laforge@gnumonks.org>2017-08-09 22:09:34 +0200
commit365f8fa4628b371551d6f5b20651ac06239f905d (patch)
treed9682184d250bfaf884b7793426992ec54ec82fe
parentd1bf1e11ba72a5e46c0d85b845110bd56d8d6e20 (diff)
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
-rw-r--r--lib/in46_addr.c17
-rw-r--r--lib/in46_addr.h1
2 files changed, 18 insertions, 0 deletions
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);