This function computes the number of common octets between two IPv6 addresses, for use in Babel prefix compression.
Signed-off-by: Toke Høiland-Jørgensen <t...@toke.dk> --- lib/ip.c | 14 ++++++++++++++ lib/ip.h | 1 + 2 files changed, 15 insertions(+) diff --git a/lib/ip.c b/lib/ip.c index 9497248c..af81704b 100644 --- a/lib/ip.c +++ b/lib/ip.c @@ -33,6 +33,20 @@ ip6_compare(ip6_addr a, ip6_addr b) return 0; } +int +ip6_common_octets(ip6_addr a, ip6_addr b) +{ + int i, j, common = 0; + for (i=0; i<4; i++) + for (j=3; j>=0; j--) + if ((0xff & (a.addr[i] >> (8*j))) == (0xff & (b.addr[i] >> (8*j)))) + common++; + else + return common; + + return common; +} + ip6_addr ip6_mkmask(uint n) { diff --git a/lib/ip.h b/lib/ip.h index 5cfce1f1..b4909984 100644 --- a/lib/ip.h +++ b/lib/ip.h @@ -205,6 +205,7 @@ static inline int ip4_compare(ip4_addr a, ip4_addr b) { return (_I(a) > _I(b)) - (_I(a) < _I(b)); } int ip6_compare(ip6_addr a, ip6_addr b); +int ip6_common_octets(ip6_addr a, ip6_addr b); #define ipa_hash(x) ip6_hash(x) #define ipa_compare(x,y) ip6_compare(x,y) -- 2.13.0