aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Blair <snipa@jagtech.io>2020-12-03 12:19:15 -0800
committerAlexander Blair <snipa@jagtech.io>2020-12-03 12:19:15 -0800
commite78669257e9d76ad45e28223b885f2b032783740 (patch)
tree3bae6d8a38fcee94ce939450d3faae9d6f0a4627
parentMerge pull request #6984 (diff)
parentp2p: fix endianness when checking IPv6 addresses mapping to IPv4 (diff)
downloadmonero-e78669257e9d76ad45e28223b885f2b032783740.tar.xz
Merge pull request #7056
c64b94bd1 p2p: fix endianness when checking IPv6 addresses mapping to IPv4 (moneromooo-monero) 67f2bec2d p2p: make this work with boost <= 1.65 (pffff) (moneromooo-monero) ffdf1fb1d p2p: rewrite boost's make_address_v4 to cater for < 1.66 (moneromooo)
-rw-r--r--src/p2p/net_node.inl27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl
index 5ef40218d..93a925971 100644
--- a/src/p2p/net_node.inl
+++ b/src/p2p/net_node.inl
@@ -71,6 +71,17 @@
#define MIN_WANTED_SEED_NODES 12
+static inline boost::asio::ip::address_v4 make_address_v4_from_v6(const boost::asio::ip::address_v6& a)
+{
+ const auto &bytes = a.to_bytes();
+ uint32_t v4 = 0;
+ v4 = (v4 << 8) | bytes[12];
+ v4 = (v4 << 8) | bytes[13];
+ v4 = (v4 << 8) | bytes[14];
+ v4 = (v4 << 8) | bytes[15];
+ return boost::asio::ip::address_v4(v4);
+}
+
namespace nodetool
{
template<class t_payload_net_handler>
@@ -1496,36 +1507,34 @@ namespace nodetool
const uint32_t actual_ip = na.as<const epee::net_utils::ipv4_network_address>().ip();
classB.insert(actual_ip & 0x0000ffff);
}
-#if BOOST_VERSION > 106600
else if (cntxt.m_remote_address.get_type_id() == epee::net_utils::ipv6_network_address::get_type_id())
{
const epee::net_utils::network_address na = cntxt.m_remote_address;
const boost::asio::ip::address_v6 &actual_ip = na.as<const epee::net_utils::ipv6_network_address>().ip();
if (actual_ip.is_v4_mapped())
{
- boost::asio::ip::address_v4 v4ip = make_address_v4(boost::asio::ip::v4_mapped, actual_ip);
+ boost::asio::ip::address_v4 v4ip = make_address_v4_from_v6(actual_ip);
uint32_t actual_ipv4;
memcpy(&actual_ipv4, v4ip.to_bytes().data(), sizeof(actual_ipv4));
classB.insert(actual_ipv4 & ntohl(0xffff0000));
}
}
-#endif
return true;
});
}
auto get_host_string = [](const epee::net_utils::network_address &address) {
-#if BOOST_VERSION > 106600
if (address.get_type_id() == epee::net_utils::ipv6_network_address::get_type_id())
{
boost::asio::ip::address_v6 actual_ip = address.as<const epee::net_utils::ipv6_network_address>().ip();
if (actual_ip.is_v4_mapped())
{
- boost::asio::ip::address_v4 v4ip = make_address_v4(boost::asio::ip::v4_mapped, actual_ip);
- return epee::net_utils::ipv4_network_address(v4ip.to_uint(), 0).host_str();
+ boost::asio::ip::address_v4 v4ip = make_address_v4_from_v6(actual_ip);
+ uint32_t actual_ipv4;
+ memcpy(&actual_ipv4, v4ip.to_bytes().data(), sizeof(actual_ipv4));
+ return epee::net_utils::ipv4_network_address(actual_ipv4, 0).host_str();
}
}
-#endif
return address.host_str();
};
std::unordered_set<std::string> hosts_added;
@@ -1545,20 +1554,18 @@ namespace nodetool
uint32_t actual_ip = na.as<const epee::net_utils::ipv4_network_address>().ip();
skip = classB.find(actual_ip & 0x0000ffff) != classB.end();
}
-#if BOOST_VERSION > 106600
else if (skip_duplicate_class_B && pe.adr.get_type_id() == epee::net_utils::ipv6_network_address::get_type_id())
{
const epee::net_utils::network_address na = pe.adr;
const boost::asio::ip::address_v6 &actual_ip = na.as<const epee::net_utils::ipv6_network_address>().ip();
if (actual_ip.is_v4_mapped())
{
- boost::asio::ip::address_v4 v4ip = make_address_v4(boost::asio::ip::v4_mapped, actual_ip);
+ boost::asio::ip::address_v4 v4ip = make_address_v4_from_v6(actual_ip);
uint32_t actual_ipv4;
memcpy(&actual_ipv4, v4ip.to_bytes().data(), sizeof(actual_ipv4));
skip = classB.find(actual_ipv4 & ntohl(0xffff0000)) != classB.end();
}
}
-#endif
// consider each host once, to avoid giving undue inflence to hosts running several nodes
if (!skip)