asmap.cpp raw

   1  // Copyright (c) The Bitcoin Core developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #include <bench/bench.h>
   6  #include <netbase.h>
   7  #include <netgroup.h>
   8  #include <node/data/ip_asn.dat.h>
   9  #include <random.h>
  10  #include <util/asmap.h>
  11  #include <util/check.h>
  12  
  13  #include <algorithm>
  14  #include <array>
  15  #include <span>
  16  #include <string>
  17  
  18  static void BenchGetMappedAS(benchmark::Bench& bench, std::span<const CNetAddr> addrs, bool check = true)
  19  {
  20      std::span<const std::byte> asmap{node::data::ip_asn};
  21      assert(!asmap.empty() && CheckStandardAsmap(asmap));
  22      auto netgroupman{NetGroupManager::WithEmbeddedAsmap(asmap)};
  23  
  24      bench.batch(addrs.size()).run([&] {
  25          for (const CNetAddr& addr : addrs) {
  26              // The embedded ASMap file might change over time and cause some
  27              // addresses to become unmapped. We check the mapping to ensure
  28              // the addresses are actually mapped.
  29              assert((netgroupman.GetMappedAS(addr) > 0) == check);
  30          }
  31      });
  32  }
  33  
  34  static CNetAddr LookupAddr(const std::string& address) { return LookupHost(address, /*fAllowLookup=*/false).value(); }
  35  
  36  static void ASMapGetMappedASQuad9v4(benchmark::Bench& bench)
  37  {
  38      std::vector<CNetAddr> addrs{LookupAddr("9.9.9.9")};
  39      BenchGetMappedAS(bench, addrs);
  40  }
  41  
  42  static void ASMapGetMappedASQuad9v6(benchmark::Bench& bench)
  43  {
  44      std::vector<CNetAddr> addrs{LookupAddr("2620:fe::fe")};
  45      BenchGetMappedAS(bench, addrs);
  46  }
  47  
  48  static void ASMapGetMappedASCloudflarev4(benchmark::Bench& bench)
  49  {
  50      std::vector<CNetAddr> addrs{LookupAddr("1.1.1.1")};
  51      BenchGetMappedAS(bench, addrs);
  52  }
  53  
  54  static void ASMapGetMappedASCloudflarev6(benchmark::Bench& bench)
  55  {
  56      std::vector<CNetAddr> addrs{LookupAddr("2606:4700:4700::1111")};
  57      BenchGetMappedAS(bench, addrs);
  58  }
  59  
  60  static void ASMapGetMappedASGooglev4(benchmark::Bench& bench)
  61  {
  62      std::vector<CNetAddr> addrs{LookupAddr("8.8.8.8")};
  63      BenchGetMappedAS(bench, addrs);
  64  }
  65  
  66  static void ASMapGetMappedASGooglev6(benchmark::Bench& bench)
  67  {
  68      std::vector<CNetAddr> addrs{LookupAddr("2001:4860:4860::8888")};
  69      BenchGetMappedAS(bench, addrs);
  70  }
  71  
  72  static void ASMapGetMappedASUnmappedv4(benchmark::Bench& bench)
  73  {
  74      // Reserved as per RFC 5737 (unmapped)
  75      std::vector<CNetAddr> addrs{LookupAddr("203.0.113.0")};
  76      BenchGetMappedAS(bench, addrs, /*check=*/false);
  77  }
  78  
  79  static void ASMapGetMappedASUnmappedv6(benchmark::Bench& bench)
  80  {
  81      // Reserved as per RFC 9637 (unmapped)
  82      std::vector<CNetAddr> addrs{LookupAddr("3fff::1")};
  83      BenchGetMappedAS(bench, addrs, /*check=*/false);
  84  }
  85  
  86  static void ASMapGetMappedASMulti(benchmark::Bench& bench)
  87  {
  88      // A list of 25 IPv4 and 25 IPv6 addresses randomly sampled across
  89      // 50 ASNs to have a mix of different lookup times. These have been
  90      // masked to /24 and /64 respectively. Some of these could become
  91      // unmapped when updating the embedded ASMap file, which will cause
  92      // the benchmarks to assert and the IPs will need to be changed out.
  93      std::array addrs{
  94          LookupAddr("5.8.10.1"),
  95          LookupAddr("14.53.20.1"),
  96          LookupAddr("34.86.160.1"),
  97          LookupAddr("67.68.205.1"),
  98          LookupAddr("68.163.58.1"),
  99          LookupAddr("69.138.189.1"),
 100          LookupAddr("72.211.58.1"),
 101          LookupAddr("73.124.158.1"),
 102          LookupAddr("77.179.43.1"),
 103          LookupAddr("80.79.125.1"),
 104          LookupAddr("81.217.170.1"),
 105          LookupAddr("82.216.149.1"),
 106          LookupAddr("84.52.201.1"),
 107          LookupAddr("87.184.174.1"),
 108          LookupAddr("90.221.151.1"),
 109          LookupAddr("95.31.136.1"),
 110          LookupAddr("99.234.174.1"),
 111          LookupAddr("105.98.199.1"),
 112          LookupAddr("146.190.174.1"),
 113          LookupAddr("154.16.157.1"),
 114          LookupAddr("172.81.183.1"),
 115          LookupAddr("173.24.74.1"),
 116          LookupAddr("195.99.226.1"),
 117          LookupAddr("213.197.14.1"),
 118          LookupAddr("220.255.248.1"),
 119  
 120          LookupAddr("2001:16a2:c0b0:58b7::1"),
 121          LookupAddr("2001:67c:e60:c0c::1"),
 122          LookupAddr("2001:99a:213:27f0::1"),
 123          LookupAddr("2001:9e8:894b:be00::1"),
 124          LookupAddr("2406:2d40:1ebc:3508::1"),
 125          LookupAddr("2600:1015:a020:1e00::1"),
 126          LookupAddr("2600:1700:4228:a800::1"),
 127          LookupAddr("2601:603:5000:3309::1"),
 128          LookupAddr("2601:cd:ce01:9610::1"),
 129          LookupAddr("2603:800c:25f0:8350::1"),
 130          LookupAddr("2604:3d09:f89:d100::1"),
 131          LookupAddr("2607:fb90:236f:821f::1"),
 132          LookupAddr("2800:2331:5440:ba3::1"),
 133          LookupAddr("2a00:16e0:1012:c108::1"),
 134          LookupAddr("2a00:23c6:9d44:7801::1"),
 135          LookupAddr("2a00:79c0:609:4900::1"),
 136          LookupAddr("2a01:4f8:13a:1f8d::1"),
 137          LookupAddr("2a01:e0a:8a3:ab90::1"),
 138          LookupAddr("2a02:810b:449e:c900::1"),
 139          LookupAddr("2a02:8308:20d:e800::1"),
 140          LookupAddr("2a0a:ef40:331:4401::1"),
 141          LookupAddr("2a0c:5a86:a002:e700::1"),
 142          LookupAddr("2a10:3781:1d7:1::1"),
 143          LookupAddr("2a12:26c0:3303:a100::1"),
 144          LookupAddr("2a12:a800:2:1::1"),
 145      };
 146  
 147      FastRandomContext rng{/*fDeterministic=*/true};
 148      std::ranges::shuffle(addrs, rng);
 149  
 150      BenchGetMappedAS(bench, addrs, /*check=*/true);
 151  }
 152  
 153  BENCHMARK(ASMapGetMappedASQuad9v4);
 154  BENCHMARK(ASMapGetMappedASQuad9v6);
 155  BENCHMARK(ASMapGetMappedASCloudflarev4);
 156  BENCHMARK(ASMapGetMappedASCloudflarev6);
 157  BENCHMARK(ASMapGetMappedASGooglev4);
 158  BENCHMARK(ASMapGetMappedASGooglev6);
 159  BENCHMARK(ASMapGetMappedASUnmappedv4);
 160  BENCHMARK(ASMapGetMappedASUnmappedv6);
 161  BENCHMARK(ASMapGetMappedASMulti);
 162