From 33a051e0435f6e78cc936f26f3b9ee16b7851025 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 12 Nov 2020 20:00:09 +0000 Subject: [PATCH] network: Add new subnet function The old one is too difficult to use in terms of order of input parameters and return value. Signed-off-by: Michael Tremer --- src/libloc.sym | 1 + src/loc/network.h | 1 + src/network.c | 15 +++++++++++++++ 3 files changed, 17 insertions(+) diff --git a/src/libloc.sym b/src/libloc.sym index c0b6b1f..5392437 100644 --- a/src/libloc.sym +++ b/src/libloc.sym @@ -87,6 +87,7 @@ global: loc_network_get_asn; loc_network_get_country_code; loc_network_has_flag; + loc_network_is_subnet; loc_network_is_subnet_of; loc_network_match_asn; loc_network_match_country_code; diff --git a/src/loc/network.h b/src/loc/network.h index e30d91c..2154cdc 100644 --- a/src/loc/network.h +++ b/src/loc/network.h @@ -56,6 +56,7 @@ int loc_network_match_flag(struct loc_network* network, uint32_t flag); int loc_network_eq(struct loc_network* self, struct loc_network* other); int loc_network_overlaps(struct loc_network* self, struct loc_network* other); +int loc_network_is_subnet(struct loc_network* self, struct loc_network* other); int loc_network_is_subnet_of(struct loc_network* self, struct loc_network* other); struct loc_network_list* loc_network_subnets(struct loc_network* network); struct loc_network_list* loc_network_exclude( diff --git a/src/network.c b/src/network.c index d41e873..5719111 100644 --- a/src/network.c +++ b/src/network.c @@ -479,6 +479,21 @@ LOC_EXPORT int loc_network_overlaps(struct loc_network* self, struct loc_network return 0; } +LOC_EXPORT int loc_network_is_subnet(struct loc_network* self, struct loc_network* other) { + // If the start address of the other network is smaller than this network, + // it cannot be a subnet. + if (in6_addr_cmp(&self->first_address, &other->first_address) < 0) + return 0; + + // If the end address of the other network is greater than this network, + // it cannot be a subnet. + if (in6_addr_cmp(&self->last_address, &other->last_address) > 0) + return 0; + + return 1; +} + +// XXX DEPRECATED - I find this too difficult to use LOC_EXPORT int loc_network_is_subnet_of(struct loc_network* self, struct loc_network* other) { // If the start address of the other network is smaller than this network, // it cannot be a subnet. -- 2.39.5