]> git.ipfire.org Git - location/libloc.git/commitdiff
network: Move some helper functions into network.h
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 2 Sep 2021 13:20:16 +0000 (13:20 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 2 Sep 2021 13:20:16 +0000 (13:20 +0000)
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 <michael.tremer@ipfire.org>
src/loc/network.h
src/network.c

index a30f65347d4c7143550667c75c02b30c66f79374..9e452bf013374256eb27fd2a25d64fe274e24eff 100644 (file)
@@ -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);
index a6b679c84f4e8909ff737d84fb353cf7dbe19479..24c593d1cf57097b20ad1138cc47a62be598c035 100644 (file)
@@ -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;