From 82910b953d663741f3774c2f180b663b673e78d6 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 3 Oct 2019 15:47:48 +0000 Subject: [PATCH] Implement filtering networks for the ASN they belong to Signed-off-by: Michael Tremer --- src/database.c | 14 ++++++++++++++ src/libloc.sym | 2 ++ src/loc/database.h | 1 + src/loc/network.h | 1 + src/network.c | 4 ++++ 5 files changed, 22 insertions(+) diff --git a/src/database.c b/src/database.c index 710fa56..75fc50a 100644 --- a/src/database.c +++ b/src/database.c @@ -78,6 +78,7 @@ struct loc_database_enumerator { // Search string char* string; char country_code[3]; + uint32_t asn; // Index of the AS we are looking at unsigned int as_index; @@ -651,6 +652,13 @@ LOC_EXPORT int loc_database_enumerator_set_country_code(struct loc_database_enum return 0; } +LOC_EXPORT int loc_database_enumerator_set_asn( + struct loc_database_enumerator* enumerator, unsigned int asn) { + enumerator->asn = asn; + + return 0; +} + LOC_EXPORT struct loc_as* loc_database_enumerator_next_as(struct loc_database_enumerator* enumerator) { struct loc_database* db = enumerator->db; struct loc_as* as; @@ -771,6 +779,12 @@ static int loc_database_enumerator_network_depth_first_search( continue; } + // Skip if the ASN does not match + if (e->asn && !loc_network_match_asn(*network, e->asn)) { + loc_network_unref(*network); + continue; + } + return 0; } } diff --git a/src/libloc.sym b/src/libloc.sym index 017faf3..976491a 100644 --- a/src/libloc.sym +++ b/src/libloc.sym @@ -55,6 +55,7 @@ global: loc_database_enumerator_next_as; loc_database_enumerator_next_network; loc_database_enumerator_ref; + loc_database_enumerator_set_asn; loc_database_enumerator_set_country_code; loc_database_enumerator_set_string; loc_database_enumerator_unref; @@ -62,6 +63,7 @@ global: # Network loc_network_get_asn; loc_network_get_country_code; + loc_network_match_asn; loc_network_match_country_code; loc_network_new; loc_network_new_from_string; diff --git a/src/loc/database.h b/src/loc/database.h index d0579ab..7d0b20c 100644 --- a/src/loc/database.h +++ b/src/loc/database.h @@ -50,6 +50,7 @@ struct loc_database_enumerator* loc_database_enumerator_unref(struct loc_databas int loc_database_enumerator_set_string(struct loc_database_enumerator* enumerator, const char* string); int loc_database_enumerator_set_country_code(struct loc_database_enumerator* enumerator, const char* country_code); +int loc_database_enumerator_set_asn(struct loc_database_enumerator* enumerator, unsigned int asn); struct loc_as* loc_database_enumerator_next_as(struct loc_database_enumerator* enumerator); struct loc_network* loc_database_enumerator_next_network(struct loc_database_enumerator* enumerator); diff --git a/src/loc/network.h b/src/loc/network.h index 63f4bfa..bb89a85 100644 --- a/src/loc/network.h +++ b/src/loc/network.h @@ -38,6 +38,7 @@ int loc_network_match_country_code(struct loc_network* network, const char* coun uint32_t loc_network_get_asn(struct loc_network* network); int loc_network_set_asn(struct loc_network* network, uint32_t asn); +int loc_network_match_asn(struct loc_network* network, uint32_t asn); #ifdef LIBLOC_PRIVATE diff --git a/src/network.c b/src/network.c index b8bc0f7..2bdb32b 100644 --- a/src/network.c +++ b/src/network.c @@ -324,6 +324,10 @@ LOC_EXPORT int loc_network_set_asn(struct loc_network* network, uint32_t asn) { return 0; } +LOC_EXPORT int loc_network_match_asn(struct loc_network* network, uint32_t asn) { + return network->asn == asn; +} + LOC_EXPORT int loc_network_to_database_v0(struct loc_network* network, struct loc_database_network_v0* dbobj) { // Add country code for (unsigned int i = 0; i < 2; i++) { -- 2.39.2