void gdmaps_test_lookup_check(const gdmaps_t* gdmaps, const char* map_name, const char* addr_txt, const char* dclist_cmp, const unsigned scope_cmp) { const int rv = gdmaps_name2idx(gdmaps, map_name); if(rv < 0) log_fatal("Map name '%s' not found in configuration", map_name); const unsigned map_idx = (unsigned)rv; client_info_t cinfo; cinfo.edns_client_mask = 128U; unsigned scope = 175U; const int addr_err = gdnsd_anysin_getaddrinfo(addr_txt, NULL, &cinfo.edns_client); if(addr_err) log_fatal("Cannot parse address '%s': %s", addr_txt, gai_strerror(addr_err)); const uint8_t* dclist = gdmaps_lookup(gdmaps, map_idx, &cinfo, &scope); ok(!strcmp((const char*)dclist, dclist_cmp), "gdmaps_lookup(%s, %s) returns dclist %s (got %s)", map_name, addr_txt, gdmaps_logf_dclist(gdmaps, map_idx, (const uint8_t*)dclist_cmp), gdmaps_logf_dclist(gdmaps, map_idx, dclist)); ok(scope == scope_cmp, "gdmaps_lookup(%s, %s) returns scope %u (got %u)", map_name, addr_txt, scope_cmp, scope); }
F_NONNULL static void do_lookup(const gdmaps_t* gdmaps, const char* map_name, const char* ip_arg) { dmn_assert(gdmaps); dmn_assert(map_name); dmn_assert(ip_arg); int map_idx = gdmaps_name2idx(gdmaps, map_name); if(map_idx < 0) { log_err("Mapping name '%s' not found in configuration", map_name); return; } client_info_t cinfo; // mostly ignored, but needs to be nonzero, and 150 is interesting in that // it easily differentiates source -> scope copies from actual database scope netmasks, // since it's larger than any legal netmask in the database. cinfo.edns_client_mask = 150U; const int addr_err = gdnsd_anysin_getaddrinfo(ip_arg, NULL, &cinfo.edns_client); if(addr_err) { log_err("Could not parse address '%s': %s", ip_arg, gai_strerror(addr_err)); return; } // To void gdmaps fallback pitfalls memcpy(&cinfo.dns_source, &cinfo.edns_client, sizeof(dmn_anysin_t)); // w/ edns_client_mask set, scope_mask should *always* be set by gdmaps_lookup(); // (and regardless, dclist should also always be set and contain something) unsigned scope_mask = 175U; const uint8_t* dclist = gdmaps_lookup(gdmaps, map_idx, &cinfo, &scope_mask); dmn_assert(scope_mask != 175U); dmn_assert(dclist); // Scope was set to Source. Since we always query as edns, this implies // the database was V4-only and the address input was a non-v4-compat v6 address, // and the lookup code fell back to the default dclist (1). if(scope_mask == 150U) { printf( "%s => %s => %s\n", map_name, dmn_logf_anysin_noport(&cinfo.edns_client), gdmaps_logf_dclist(gdmaps, map_idx, dclist) ); } else { printf( "%s => %s/%u => %s\n", map_name, dmn_logf_anysin_noport(&cinfo.edns_client), scope_mask, gdmaps_logf_dclist(gdmaps, map_idx, dclist) ); } dmn_fmtbuf_reset(); }
void gdmaps_test_lookup_check(const unsigned tnum, const gdmaps_t* gdmaps, const char* map_name, const char* addr_txt, const char* dclist_cmp, const unsigned scope_cmp) { dmn_assert(gdmaps); dmn_assert(map_name); dmn_assert(addr_txt); dmn_assert(dclist_cmp); log_info("Subtest %u starting", tnum); int map_idx = gdmaps_name2idx(gdmaps, map_name); if(map_idx < 0) log_fatal("Subtest %u failed: Map name '%s' not found in configuration", tnum, map_name); client_info_t cinfo; cinfo.edns_client_mask = 150U; unsigned scope = 175U; const int addr_err = gdnsd_anysin_getaddrinfo(addr_txt, NULL, &cinfo.edns_client); if(addr_err) log_fatal("Subtest %u failed: Cannot parse address '%s': %s", tnum, addr_txt, gai_strerror(addr_err)); // To void gdmaps fallback pitfalls memcpy(&cinfo.dns_source, &cinfo.edns_client, sizeof(anysin_t)); const uint8_t* dclist = gdmaps_lookup(gdmaps, map_idx, &cinfo, &scope); // w/ edns_client_mask set, scope_mask should *always* be set by gdmaps_lookup(); // (and regardless, dclist should also always be set and contain something) if(!dclist) log_fatal("Subtest %u failed: gdmaps_lookup(%s, %s) returned NULL", tnum, map_name, addr_txt); if(scope == 175U) log_fatal("Subtest %u failed: gdmaps_lookup(%s, %s) failed to set the scope mask", tnum, map_name, addr_txt); if(strcmp((const char*)dclist, dclist_cmp)) log_fatal("Subtest %u failed: Wanted dclist %s, got dclist %s", tnum, gdmaps_logf_dclist(gdmaps, map_idx, (const uint8_t*)dclist_cmp), gdmaps_logf_dclist(gdmaps, map_idx, dclist)); if(scope != scope_cmp) log_fatal("Subtest %u failed: Wanted scope mask %u, got %u", tnum, scope_cmp, scope); }