summaryrefslogtreecommitdiff
path: root/net-p2p/monero/files/monero-9999-dns-perform-AAAA-resolution.patch
blob: 9deea952d05a9ed7df75d5e5a002a06ead3c5bee (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
From a57141b6aabf44c33cfa57677774defb1f40c64a Mon Sep 17 00:00:00 2001
From: Bertrand Jacquin <bertrand@jacquin.bzh>
Date: Sun, 17 Jul 2022 23:52:34 +0100
Subject: [PATCH] dns: perform AAAA resolution

Address backlog item to resolve IPv6 address in addition to IPv4
address.

See: https://github.com/monero-project/monero/issues/8818
---
 src/debug_utilities/dns_checks.cpp |  4 +++-
 src/p2p/net_node.inl               | 27 ++++++++++++++++++++++++---
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/src/debug_utilities/dns_checks.cpp b/src/debug_utilities/dns_checks.cpp
index a59a08209901..eebb35fc5be1 100644
--- a/src/debug_utilities/dns_checks.cpp
+++ b/src/debug_utilities/dns_checks.cpp
@@ -42,7 +42,7 @@
 
 namespace po = boost::program_options;
 
-enum lookup_t { LOOKUP_A, LOOKUP_TXT };
+enum lookup_t { LOOKUP_A, LOOKUP_AAAA, LOOKUP_TXT };
 
 static std::vector<std::string> lookup(lookup_t type, const char *hostname)
 {
@@ -51,6 +51,7 @@ static std::vector<std::string> lookup(lookup_t type, const char *hostname)
   switch (type)
   {
     case LOOKUP_A: res = tools::DNSResolver::instance().get_ipv4(hostname, dnssec_available, dnssec_valid); break;
+    case LOOKUP_AAAA: res = tools::DNSResolver::instance().get_ipv6(hostname, dnssec_available, dnssec_valid); break;
     case LOOKUP_TXT: res = tools::DNSResolver::instance().get_txt_record(hostname, dnssec_available, dnssec_valid); break;
     default: MERROR("Invalid lookup type: " << (int)type); return {};
   }
@@ -130,6 +131,7 @@ int main(int argc, char* argv[])
   mlog_set_categories("+" MONERO_DEFAULT_LOG_CATEGORY ":INFO");
 
   lookup(LOOKUP_A, {"seeds.moneroseeds.se", "seeds.moneroseeds.ae.org", "seeds.moneroseeds.ch", "seeds.moneroseeds.li"});
+  lookup(LOOKUP_AAAA, {"seeds.moneroseeds.se", "seeds.moneroseeds.ae.org", "seeds.moneroseeds.ch", "seeds.moneroseeds.li"});
 
   lookup(LOOKUP_TXT, {"updates.moneropulse.org", "updates.moneropulse.net", "updates.moneropulse.co", "updates.moneropulse.se", "updates.moneropulse.fr", "updates.moneropulse.de", "updates.moneropulse.no", "updates.moneropulse.ch"});
 
diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl
index 1a43c8ac2ad1..f357c6037800 100644
--- a/src/p2p/net_node.inl
+++ b/src/p2p/net_node.inl
@@ -779,8 +779,6 @@ namespace nodetool
 
     // for each hostname in the seed nodes list, attempt to DNS resolve and
     // add the result addresses as seed nodes
-    // TODO: at some point add IPv6 support, but that won't be relevant
-    // for some time yet.
 
     std::vector<std::vector<std::string>> dns_results;
     dns_results.resize(m_seed_nodes_list.size());
@@ -802,10 +800,12 @@ namespace nodetool
         // TODO: care about dnssec avail/valid
         bool avail, valid;
         std::vector<std::string> addr_list;
+        std::vector<std::string> addr_list_ipv4;
+        std::vector<std::string> addr_list_ipv6;
 
         try
         {
-          addr_list = tools::DNSResolver::instance().get_ipv4(addr_str, avail, valid);
+          addr_list_ipv4 = tools::DNSResolver::instance().get_ipv4(addr_str, avail, valid);
           MDEBUG("dns_threads[" << result_index << "] DNS resolve done");
           boost::this_thread::interruption_point();
         }
@@ -815,9 +815,30 @@ namespace nodetool
           // even if we now have results, finish thread without setting
           // result variables, which are now out of scope in main thread
           MWARNING("dns_threads[" << result_index << "] interrupted");
+        }
+
+        try
+        {
+          addr_list_ipv6 = tools::DNSResolver::instance().get_ipv6(addr_str, avail, valid);
+          MDEBUG("dns_threads[" << result_index << "] DNS resolve done");
+          boost::this_thread::interruption_point();
+        }
+        catch(const boost::thread_interrupted&)
+        {
+          // thread interruption request
+          // even if we now have results, finish thread without setting
+          // result variables, which are now out of scope in main thread
+          MWARNING("dns_threads[" << result_index << "] interrupted");
+        }
+
+        if (addr_list_ipv4.empty() && addr_list_ipv6.empty())
+        {
           return;
         }
 
+        addr_list.insert(addr_list.end(), addr_list_ipv4.begin(), addr_list_ipv4.end());
+        addr_list.insert(addr_list.end(), addr_list_ipv6.begin(), addr_list_ipv6.end());
+
         MINFO("dns_threads[" << result_index << "] addr_str: " << addr_str << "  number of results: " << addr_list.size());
         dns_results[result_index] = addr_list;
       });