]> git.ipfire.org Git - thirdparty/FORT-validator.git/commitdiff
Test & patch the previous commit
authorAlberto Leiva Popper <ydahhrk@gmail.com>
Tue, 26 Oct 2021 23:01:51 +0000 (18:01 -0500)
committerAlberto Leiva Popper <ydahhrk@gmail.com>
Tue, 26 Oct 2021 23:20:29 +0000 (18:20 -0500)
Also adds a bunch of database stringify functions for debugging.

Could use some more testing, but I want to merge first.

16 files changed:
src/Makefile.am
src/output_printer.c
src/rtr/db/delta.c
src/rtr/db/delta.h
src/rtr/db/deltas_array.h
src/rtr/db/vrp.c [new file with mode: 0644]
src/rtr/db/vrp.h
src/rtr/db/vrps.c
src/rtr/db/vrps.h
src/slurm/db_slurm.c
test/impersonator.c
test/rtr/db/db_table_test.c
test/rtr/db/deltas_array_test.c
test/rtr/db/rtr_db_impersonator.c
test/rtr/db/vrps_test.c
test/rtr/pdu_handler_test.c

index 755d57085fae0483124398641cbd8fad2b1e6d21..cc01d63282148b07134cc2bce0735c834f169077 100644 (file)
@@ -111,7 +111,7 @@ fort_SOURCES += rtr/db/db_table.c rtr/db/db_table.h
 fort_SOURCES += rtr/db/delta.c rtr/db/delta.h
 fort_SOURCES += rtr/db/deltas_array.c rtr/db/deltas_array.h
 fort_SOURCES += rtr/db/roa.c rtr/db/roa.h
-fort_SOURCES += rtr/db/vrp.h
+fort_SOURCES += rtr/db/vrp.c rtr/db/vrp.h
 fort_SOURCES += rtr/db/vrps.c rtr/db/vrps.h
 
 fort_SOURCES += slurm/db_slurm.c slurm/db_slurm.h
index dcaffc44b9b135d081fbc0e85a8ea95a73fe9d8d..0803828b9344d0c86f6116c07f2fbfdb095e8717 100644 (file)
@@ -48,20 +48,12 @@ print_roa_csv(struct vrp const *vrp, void *arg)
 {
        FILE *out = arg;
 
-       switch (vrp->addr_fam) {
-       case AF_INET:
-               fprintf(out, "AS%u,%s/%u,%u\n", vrp->asn,
-                   addr2str4(&vrp->prefix.v4, addr_buf), vrp->prefix_length,
-                   vrp->max_prefix_length);
-               break;
-       case AF_INET6:
-               fprintf(out, "AS%u,%s/%u,%u\n", vrp->asn,
-                   addr2str6(&vrp->prefix.v6, addr_buf), vrp->prefix_length,
-                   vrp->max_prefix_length);
-               break;
-       default:
+       if (vrp->addr_fam != AF_INET && vrp->addr_fam != AF_INET6)
                pr_crit("Unknown family type");
-       }
+
+       fprintf(out, "AS%u,%s/%u,%u\n", vrp->asn,
+           inet_ntop(vrp->addr_fam, &vrp->prefix, addr_buf, INET6_ADDRSTRLEN),
+           vrp->prefix_length, vrp->max_prefix_length);
 
        return 0;
 }
@@ -76,26 +68,15 @@ print_roa_json(struct vrp const *vrp, void *arg)
        if (!json_out->first)
                fprintf(out, ",");
 
-       switch (vrp->addr_fam) {
-       case AF_INET:
-               fprintf(out,
-                   "\n  { \"asn\" : \"AS%u\", \"prefix\" : \"%s/%u\", \"maxLength\" : %u }",
-                   vrp->asn,
-                   addr2str4(&vrp->prefix.v4, addr_buf),
-                   vrp->prefix_length,
-                   vrp->max_prefix_length);
-               break;
-       case AF_INET6:
-               fprintf(out,
-                   "\n  { \"asn\" : \"AS%u\", \"prefix\" : \"%s/%u\", \"maxLength\" : %u }",
-                   vrp->asn,
-                   addr2str6(&vrp->prefix.v6, addr_buf),
-                   vrp->prefix_length,
-                   vrp->max_prefix_length);
-               break;
-       default:
+       if (vrp->addr_fam != AF_INET && vrp->addr_fam != AF_INET6)
                pr_crit("Unknown family type");
-       }
+
+       fprintf(out,
+           "\n  { \"asn\" : \"AS%u\", \"prefix\" : \"%s/%u\", \"maxLength\" : %u }",
+           vrp->asn,
+           inet_ntop(vrp->addr_fam, &vrp->prefix, addr_buf, INET6_ADDRSTRLEN),
+           vrp->prefix_length,
+           vrp->max_prefix_length);
 
        json_out->first = false;
        return 0;
index b55333201d8b31393017a85094f33b6dc32f5050..d8ecf9174d2d7cec9d0645d61bb54aef6a12e986 100644 (file)
@@ -261,3 +261,9 @@ deltas_foreach(struct deltas *deltas, delta_vrp_foreach_cb cb_vrp,
 
        return __foreach_rk(&deltas->rk.removes, cb_rk, arg, FLAG_WITHDRAWAL);
 }
+
+void
+deltas_print(struct deltas *deltas)
+{
+       deltas_foreach(deltas, delta_vrp_print, delta_rk_print, NULL);
+}
index a0878f143edea5cf1c801646f8221cc9f3e79524..693b9d815a5e4a42451ec352c303144223a0278e 100644 (file)
@@ -18,5 +18,6 @@ int deltas_add_router_key(struct deltas *, struct router_key const *, int);
 bool deltas_is_empty(struct deltas *);
 int deltas_foreach(struct deltas *, delta_vrp_foreach_cb,
     delta_router_key_foreach_cb, void *);
+void deltas_print(struct deltas *);
 
 #endif /* SRC_DELTA_H_ */
index a9bcf5769f48c5ea52c78e1b7f6d1f8e564dcbc9..5866682db7b0157341380187cb3d9b28cf52d6c7 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef SRC_RTR_DB_DELTAS_ARRAY_H_
 #define SRC_RTR_DB_DELTAS_ARRAY_H_
 
+#include "serial.h"
 #include "rtr/db/delta.h"
 
 struct deltas_array;
diff --git a/src/rtr/db/vrp.c b/src/rtr/db/vrp.c
new file mode 100644 (file)
index 0000000..659aae2
--- /dev/null
@@ -0,0 +1,50 @@
+#include "rtr/db/vrp.h"
+
+#include <arpa/inet.h>
+
+static void
+print_flag(uint8_t flag)
+{
+       switch (flag) {
+       case FLAG_WITHDRAWAL:
+               printf("- DEL ");
+               break;
+       case FLAG_ANNOUNCEMENT:
+               printf("- ADD ");
+               break;
+       default:
+               printf("- (unknown)");
+               break;
+       }
+}
+
+int
+vrp_print(struct vrp const *roa, void *arg)
+{
+       char buffer[INET6_ADDRSTRLEN];
+       printf("- [ROA ASN:%u Prefix:%s/(%u-%u)]\n", roa->asn,
+           inet_ntop(roa->addr_fam, &roa->prefix, buffer, INET6_ADDRSTRLEN),
+           roa->prefix_length, roa->max_prefix_length);
+       return 0;
+}
+
+int
+delta_vrp_print(struct delta_vrp const *delta, void *arg)
+{
+       print_flag(delta->flags);
+       return vrp_print(&delta->vrp, arg);
+}
+
+int
+router_key_print(struct router_key const *rk, void *arg)
+{
+       printf("- [RK  ASN:%u]\n", rk->as);
+       return 0;
+}
+
+int
+delta_rk_print(struct delta_router_key const *delta, void *arg)
+{
+       print_flag(delta->flags);
+       return router_key_print(&delta->router_key, arg);
+}
index a1f78711006af236e5d18633d08b3ba66b745ae1..f7f1054921df063e5a18084c399a6f24ad4d8a13 100644 (file)
@@ -3,7 +3,6 @@
 
 #include <netinet/in.h>
 #include "address.h"
-#include "serial.h"
 #include "object/router_key.h"
 
 #define FLAG_WITHDRAWAL                0
 #define VRP_EQ(a, b)                                                   \
        (VRP_ASN_EQ(a, b) && VRP_PREFIX_EQ(a, b) && VRP_MAX_PREFIX_LEN_EQ(a, b))
 
+/*
+ * A ROA.
+ *
+ * I think it's called "VRP" ("Validated ROA Payload") because it was originally
+ * meant to represent an already validated ROA, and used exclusively by the RTR
+ * code. But it doesn't matter anymore.
+ */
 struct vrp {
-       uint32_t        asn;
+       uint32_t asn;
        union {
-               struct  in_addr v4;
-               struct  in6_addr v6;
+               struct in_addr v4;
+               struct in6_addr v6;
        } prefix;
-       uint8_t prefix_length;
-       uint8_t max_prefix_length;
-       uint8_t addr_fam;
+       uint8_t prefix_length;
+       uint8_t max_prefix_length;
+       uint8_t addr_fam;
 };
 
 struct delta_vrp {
@@ -68,7 +74,6 @@ struct delta_vrp {
 };
 
 struct delta_router_key {
-       serial_t serial;
        struct router_key router_key;
        uint8_t flags;
 };
@@ -80,4 +85,9 @@ typedef int (*delta_vrp_foreach_cb)(struct delta_vrp const *, void *);
 typedef int (*delta_router_key_foreach_cb)(struct delta_router_key const *,
     void *);
 
+int vrp_print(struct vrp const *, void *);
+int delta_vrp_print(struct delta_vrp const *, void *);
+int router_key_print(struct router_key const *, void *);
+int delta_rk_print(struct delta_router_key const *, void *);
+
 #endif /* SRC_RTR_DB_VRP_H_ */
index 1366122eae3ddd773ed26d2ea030d3c9dee219c3..cb42ff364b1259bf61ddbcd2f94ab554ba42aeaf 100644 (file)
@@ -595,3 +595,9 @@ get_current_session_id(uint8_t rtr_version)
                return state.v1_session_id;
        return state.v0_session_id;
 }
+
+void
+vrps_print_base(void)
+{
+       vrps_foreach_base(vrp_print, router_key_print, NULL);
+}
index 31b0ab0792cd94f26a62c1f4e8fbdfc882294322..79681f13307026ed8a4a538068595d99dfd938db 100644 (file)
@@ -34,4 +34,6 @@ int handle_router_key(unsigned char const *, uint32_t, unsigned char const *,
 
 uint16_t get_current_session_id(uint8_t);
 
+void vrps_print_base(void);
+
 #endif /* SRC_VRPS_H_ */
index df672b4a96cbc10839cab0e0d5bce826eea062ef..aa16eaa8a70f07bdc0a67e60795d1b90f783bdcb 100644 (file)
@@ -456,21 +456,9 @@ print_prefix_data(struct slurm_prefix *prefix, void *arg)
                pr_op_info("%s ASN: %u", pad, prefix->vrp.asn);
 
        if (prefix->data_flag & SLURM_PFX_FLAG_PREFIX) {
-               switch (prefix->vrp.addr_fam) {
-               case AF_INET:
-                       pr_op_info("%s Prefix: %s/%u", pad,
-                           addr2str4(&prefix->vrp.prefix.v4, addr_buf),
-                           prefix->vrp.prefix_length);
-                       break;
-               case AF_INET6:
-                       pr_op_info("%s Prefix: %s/%u", pad,
-                           addr2str6(&prefix->vrp.prefix.v6, addr_buf),
-                           prefix->vrp.prefix_length);
-                       break;
-               default:
-                       pr_crit("Unknown addr family type: %u",
-                           prefix->vrp.addr_fam);
-               }
+               pr_op_info("%s Prefix: %s/%u", pad,
+                   inet_ntop(prefix->vrp.addr_fam, &prefix->vrp.prefix,
+                   addr_buf, INET6_ADDRSTRLEN), prefix->vrp.prefix_length);
        }
 
        if (prefix->data_flag & SLURM_PFX_FLAG_MAX_LENGTH)
index a98039b47eabfe123f13eedfd66d474568baae6a..7ccf6496a86865d0fbfd7d8454a145ff549a7ecd 100644 (file)
@@ -228,3 +228,16 @@ config_get_thread_pool_validation_max(void)
 {
        return 10;
 }
+
+unsigned int
+config_get_max_asn_per_pfx(void)
+{
+       return 10;
+}
+
+unsigned int
+config_get_max_pfx_per_asn(void)
+{
+       return 10;
+}
+
index 449e38e723e41055853fdd81aeb1db925f7059b8..eb1cfb1d1bbd0da14577e988e415aa8a3c4a2ed6 100644 (file)
@@ -6,6 +6,7 @@
 #include "log.c"
 #include "impersonator.c"
 #include "object/router_key.c"
+#include "rtr/db/vrp.c"
 #include "rtr/db/delta.c"
 #include "rtr/db/db_table.c"
 
@@ -108,7 +109,6 @@ START_TEST(test_basic)
        prefix6.len = 120;
 
        /* Duplicates should be transparently not re-added. */
-
        ck_assert_int_eq(0, rtrhandler_handle_roa_v4(table, 10, &prefix4, 32));
        ck_assert_int_eq(0, rtrhandler_handle_roa_v4(table, 10, &prefix4, 32));
 
@@ -126,7 +126,7 @@ START_TEST(test_basic)
        ck_assert_int_eq(0, rtrhandler_handle_roa_v4(table, 10, &prefix4, 32));
        ck_assert_int_eq(0, rtrhandler_handle_roa_v4(table, 10, &prefix4, 32));
 
-       /* Change the max prefix length slightly */
+       /* Change the max prefix length (counts as duplicate) */
        prefix4.len = 24;
        ck_assert_int_eq(0, rtrhandler_handle_roa_v4(table, 10, &prefix4, 30));
        ck_assert_int_eq(0, rtrhandler_handle_roa_v4(table, 10, &prefix4, 30));
@@ -163,113 +163,16 @@ START_TEST(test_basic)
 }
 END_TEST
 
-START_TEST(test_merge)
-{
-       struct ipv4_prefix prefix4;
-       struct ipv6_prefix prefix6;
-       struct db_table *left, *right, *merged;
-       array_index i;
-       int left_count, right_count, total_merged;
-
-       left = db_table_create();
-       ck_assert_ptr_ne(NULL, left);
-       right = db_table_create();
-       ck_assert_ptr_ne(NULL, right);
-       merged = db_table_create();
-       ck_assert_ptr_ne(NULL, merged);
-
-       prefix4.addr.s_addr = ADDR1;
-       prefix4.len = 24;
-       in6_addr_init(&prefix6.addr, 0x20010DB8u, 0, 0, 1);
-       prefix6.len = 120;
-
-       left_count = 0;
-       right_count = 0;
-       total_merged = 0;
-
-       /** Add the same roas on both tables*/
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v4(left, 10, &prefix4, 32));
-       left_count++;
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v4(right, 10, &prefix4, 32));
-       right_count++;
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v4(left, 11, &prefix4, 32));
-       left_count++;
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v4(right, 11, &prefix4, 32));
-       right_count++;
-
-       /** And add distinct roas on each table */
-       prefix4.addr.s_addr = ADDR2;
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v4(left, 10, &prefix4, 32));
-       left_count++;
-
-       prefix4.addr.s_addr = ADDR1;
-       prefix4.len = 25;
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v4(right, 10, &prefix4, 32));
-       right_count++;
-
-       prefix4.len = 24;
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v4(left, 10, &prefix4, 30));
-       left_count++;
-
-       /* IPv6 */
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v6(right, 10, &prefix6, 128));
-       right_count++;
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v6(left, 11, &prefix6, 128));
-       left_count++;
-
-       in6_addr_init(&prefix6.addr, 0x20010DB8u, 0, 0, 2);
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v6(right, 10, &prefix6, 128));
-       right_count++;
-
-       in6_addr_init(&prefix6.addr, 0x20010DB8u, 0, 0, 1);
-       prefix6.len = 121;
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v6(left, 10, &prefix6, 128));
-       left_count++;
-
-       prefix6.len = 120;
-       ck_assert_int_eq(0, rtrhandler_handle_roa_v6(right, 10, &prefix6, 127));
-       right_count++;
-
-       /** Do the merge */
-       ck_assert_int_eq(0, db_table_merge(merged, left));
-       ck_assert_int_eq(0, db_table_merge(merged, right));
-
-       /**
-        * Must have:
-        * count(left) + count(right) - 2 (duplicated elements)
-        */
-       total_merged = left_count + right_count - 2;
-       ck_assert_int_eq(total_merged, TOTAL_ROAS);
-
-       /* Check table contents and that merged table has new memory refs */
-       db_table_destroy(left);
-       db_table_destroy(right);
-
-       memset(roas_found, 0, sizeof(roas_found));
-       total_found = 0;
-       ck_assert_int_eq(0, db_table_foreach_roa(merged, foreach_cb, NULL));
-       ck_assert_int_eq(TOTAL_ROAS, total_found);
-       for (i = 0; i < TOTAL_ROAS; i++)
-               ck_assert_int_eq(true, roas_found[i]);
-
-       db_table_destroy(merged);
-}
-END_TEST
-
 Suite *pdu_suite(void)
 {
        Suite *suite;
-       TCase *core, *merge;
+       TCase *core;
 
        core = tcase_create("Core");
        tcase_add_test(core, test_basic);
 
-       merge = tcase_create("Merge");
-       tcase_add_test(core, test_merge);
-
        suite = suite_create("DB Table");
        suite_add_tcase(suite, core);
-       suite_add_tcase(suite, merge);
        return suite;
 }
 
index cce227d60535bf93878ff2c7f47ee9cf9d9f2596..b20d00894960e0a9f7c183bf4e81da15d4ddfd60 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "log.c"
 #include "impersonator.c"
+#include "rtr/db/vrp.c"
 #include "rtr/db/delta.c"
 #include "rtr/db/deltas_array.c"
 
index 2abe23fe3db852e4b65d64935691f0cf7d1c4227..84ff9745af0a2b3dd475fa9a8196a889c01dab50 100644 (file)
@@ -56,7 +56,7 @@ __handle_roa_v4(uint32_t as, struct ipv4_prefix const *prefix,
 }
 
 int
-__handle_roa_v6(uint32_t as, struct ipv6_prefix const * prefix,
+__handle_roa_v6(uint32_t as, struct ipv6_prefix const *prefix,
     uint8_t max_length, void *arg)
 {
        return rtrhandler_handle_roa_v6(arg, as, prefix, max_length);
index 50188eb9610010dd3e4017e70797d0e50457cc52..c5a1d72d9f36f2dd8220fe3b62277a5a5a72c8f0 100644 (file)
@@ -12,6 +12,7 @@
 #include "output_printer.c"
 #include "serial.c"
 #include "object/router_key.c"
+#include "rtr/db/vrp.c"
 #include "rtr/db/delta.c"
 #include "rtr/db/deltas_array.c"
 #include "rtr/db/db_table.c"
@@ -329,25 +330,32 @@ check_no_deltas(serial_t from)
 }
 
 static void
-create_deltas_1to2(serial_t *serial, bool *changed, bool *iterated_entries)
+create_deltas_1to2(void)
 {
+       serial_t serial;
+       bool changed;
+       bool iterated_entries[12];
+
        ck_assert_int_eq(0, vrps_init());
 
        /* First validation not yet performed: Tell routers to wait */
-       ck_assert_int_eq(-EAGAIN, get_last_serial_number(serial));
+       ck_assert_int_eq(-EAGAIN, get_last_serial_number(&serial));
        ck_assert_int_eq(-EAGAIN, vrps_foreach_base(vrp_fail, rk_fail,
            iterated_entries));
-       ck_assert_int_eq(-EAGAIN, vrps_foreach_delta_since(0, serial, dvrp_fail,
-           drk_fail, NULL));
+       ck_assert_int_eq(-EAGAIN, vrps_foreach_delta_since(0, &serial,
+           dvrp_fail, drk_fail, NULL));
 
        /* First validation: One tree, no deltas */
-       ck_assert_int_eq(0, vrps_update(changed));
+       ck_assert_int_eq(0, vrps_update(&changed));
+       ck_assert(changed);
        check_serial(1);
        check_base(1, iteration1_base);
        check_deltas(1, 1, deltas_1to1);
 
        /* Second validation: One tree, added deltas */
-       ck_assert_int_eq(0, vrps_update(changed));
+       ck_assert_int_eq(0, vrps_update(&changed));
+
+       ck_assert(changed);
        check_serial(2);
        check_base(2, iteration2_base);
        check_deltas(1, 2, deltas_1to2);
@@ -356,16 +364,15 @@ create_deltas_1to2(serial_t *serial, bool *changed, bool *iterated_entries)
 
 START_TEST(test_basic)
 {
-       serial_t serial;
        bool changed;
-       bool iterated_entries[12];
 
        deltas_lifetime = 5;
 
-       create_deltas_1to2(&serial, &changed, iterated_entries);
+       create_deltas_1to2();
 
        /* Third validation: One tree, removed deltas */
        ck_assert_int_eq(0, vrps_update(&changed));
+       ck_assert(changed);
        check_serial(3);
        check_base(3, iteration3_base);
        check_deltas(1, 3, deltas_1to3);
@@ -378,16 +385,15 @@ END_TEST
 
 START_TEST(test_delta_forget)
 {
-       serial_t serial;
        bool changed;
-       bool iterated_entries[12];
 
        deltas_lifetime = 1;
 
-       create_deltas_1to2(&serial, &changed, iterated_entries);
+       create_deltas_1to2();
 
        /* Third validation: One tree, removed deltas and delta 1 removed */
        ck_assert_int_eq(0, vrps_update(&changed));
+       ck_assert(changed);
        check_serial(3);
        check_base(3, iteration3_base);
        check_no_deltas(1);
@@ -400,16 +406,15 @@ END_TEST
 
 START_TEST(test_delta_ovrd)
 {
-       serial_t serial;
        bool changed;
-       bool iterated_entries[12];
 
        deltas_lifetime = 3;
 
-       create_deltas_1to2(&serial, &changed, iterated_entries);
+       create_deltas_1to2();
 
        /* Third validation: One tree, removed deltas */
        ck_assert_int_eq(0, vrps_update(&changed));
+       ck_assert(changed);
        check_serial(3);
        check_base(3, iteration3_base);
        check_deltas(1, 3, deltas_1to3);
@@ -418,6 +423,7 @@ START_TEST(test_delta_ovrd)
 
        /* Fourth validation with deltas that override each other */
        ck_assert_int_eq(0, vrps_update(&changed));
+       ck_assert(changed);
        check_serial(4);
        check_base(4, iteration4_base);
        check_deltas(1, 4, deltas_1to4);
index 3e6571a4047c8c432fea5197fcb40cdd3e9dc6fb..3fca9f42c1f7b674ae0947a6231745d414bf7049 100644 (file)
@@ -18,6 +18,7 @@
 #include "rtr/primitive_reader.c"
 #include "rtr/primitive_writer.c"
 #include "rtr/err_pdu.c"
+#include "rtr/db/vrp.c"
 #include "rtr/db/delta.c"
 #include "rtr/db/deltas_array.c"
 #include "rtr/db/db_table.c"