Implement filtering networks for the ASN they belong to
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 3 Oct 2019 15:47:48 +0000 (15:47 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 3 Oct 2019 15:47:48 +0000 (15:47 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/database.c
src/libloc.sym
src/loc/database.h
src/loc/network.h
src/network.c

index 710fa56..75fc50a 100644 (file)
@@ -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;
                }
        }
index 017faf3..976491a 100644 (file)
@@ -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;
index d0579ab..7d0b20c 100644 (file)
@@ -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);
 
index 63f4bfa..bb89a85 100644 (file)
@@ -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
 
index b8bc0f7..2bdb32b 100644 (file)
@@ -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++) {