From 71877f5f024a2d8d2e4f90abc8d580c12be71512 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 2 Sep 2021 13:20:16 +0000 Subject: [PATCH] network: Move some helper functions into network.h These are used in multiple places, but there is no good place where those should go, yet. To make them usable in more places, I am temporarily moving them here. Signed-off-by: Michael Tremer --- src/loc/network.h | 50 +++++++++++++++++++++++++++++++++++++++++++++++ src/network.c | 20 +------------------ 2 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/loc/network.h b/src/loc/network.h index a30f653..9e452bf 100644 --- a/src/loc/network.h +++ b/src/loc/network.h @@ -70,6 +70,56 @@ struct loc_network_list* loc_network_exclude_list( #ifdef LIBLOC_PRIVATE + +static inline struct in6_addr address_increment(const struct in6_addr* address) { + struct in6_addr a = *address; + + for (int octet = 15; octet >= 0; octet--) { + if (a.s6_addr[octet] < 255) { + a.s6_addr[octet]++; + break; + } else { + a.s6_addr[octet] = 0; + } + } + + return a; +} + +static inline struct in6_addr address_decrement(const struct in6_addr* address) { + struct in6_addr a = *address; + + for (int octet = 15; octet >= 0; octet--) { + if (a.s6_addr[octet] > 0) { + a.s6_addr[octet]--; + break; + } + } + + return a; +} + +static inline int loc_address_family(const struct in6_addr* address) { + if (IN6_IS_ADDR_V4MAPPED(address)) + return AF_INET; + else + return AF_INET6; +} + +static inline int loc_address_count_trailing_zero_bits(const struct in6_addr* address) { + int zeroes = 0; + + for (int octet = 15; octet >= 0; octet--) { + if (address->s6_addr[octet]) { + zeroes += __builtin_ctz(address->s6_addr[octet]); + break; + } else + zeroes += 8; + } + + return zeroes; +} + int loc_network_to_database_v1(struct loc_network* network, struct loc_database_network_v1* dbobj); int loc_network_new_from_database_v1(struct loc_ctx* ctx, struct loc_network** network, struct in6_addr* address, unsigned int prefix, const struct loc_database_network_v1* dbobj); diff --git a/src/network.c b/src/network.c index a6b679c..24c593d 100644 --- a/src/network.c +++ b/src/network.c @@ -98,21 +98,6 @@ static struct in6_addr make_last_address(const struct in6_addr* address, const s return a; } -static struct in6_addr address_increment(const struct in6_addr* address) { - struct in6_addr a = *address; - - for (int octet = 15; octet >= 0; octet--) { - if (a.s6_addr[octet] < 255) { - a.s6_addr[octet]++; - break; - } else { - a.s6_addr[octet] = 0; - } - } - - return a; -} - LOC_EXPORT int loc_network_new(struct loc_ctx* ctx, struct loc_network** network, struct in6_addr* address, unsigned int prefix) { // Address cannot be unspecified @@ -163,10 +148,7 @@ LOC_EXPORT int loc_network_new(struct loc_ctx* ctx, struct loc_network** network n->last_address = make_last_address(&n->first_address, &bitmask); // Set family - if (IN6_IS_ADDR_V4MAPPED(&n->first_address)) - n->family = AF_INET; - else - n->family = AF_INET6; + n->family = loc_address_family(&n->first_address); DEBUG(n->ctx, "Network allocated at %p\n", n); *network = n; -- 2.39.5