Converted everything to ipv6.
This commit is contained in:
parent
953bc460f4
commit
28ad9837b0
5 changed files with 81 additions and 51 deletions
|
@ -49,7 +49,7 @@ namespace
|
|||
}
|
||||
bool constexpr log_to_cerr ()
|
||||
{
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -89,7 +89,7 @@ void rai::genesis::initialize (rai::block_store & store_a) const
|
|||
}
|
||||
|
||||
rai::network::network (boost::asio::io_service & service_a, uint16_t port, rai::client & client_a) :
|
||||
socket (service_a, boost::asio::ip::udp::endpoint (boost::asio::ip::address_v4::any (), port)),
|
||||
socket (service_a, boost::asio::ip::udp::endpoint (boost::asio::ip::address_v6::any (), port)),
|
||||
service (service_a),
|
||||
resolver (service_a),
|
||||
client (client_a),
|
||||
|
@ -125,7 +125,7 @@ void rai::network::stop ()
|
|||
|
||||
void rai::network::maintain_keepalive (boost::asio::ip::udp::endpoint const & endpoint_a)
|
||||
{
|
||||
if (!client.peers.contacting_peer (endpoint_a) && endpoint_a != endpoint ())
|
||||
if (endpoint_a != rai::endpoint (boost::asio::ip::address_v6::any (), 0) && !client.peers.contacting_peer (endpoint_a))
|
||||
{
|
||||
rai::keepalive message;
|
||||
client.peers.random_fill (message.peers);
|
||||
|
@ -1274,24 +1274,33 @@ std::vector <rai::peer_information> rai::peer_container::list ()
|
|||
return result;
|
||||
}
|
||||
|
||||
void rai::keepalive::visit (rai::message_visitor & visitor_a) const
|
||||
{
|
||||
visitor_a.keepalive (*this);
|
||||
}
|
||||
|
||||
void rai::publish::visit (rai::message_visitor & visitor_a) const
|
||||
{
|
||||
visitor_a.publish (*this);
|
||||
}
|
||||
|
||||
rai::keepalive::keepalive ()
|
||||
{
|
||||
boost::asio::ip::udp::endpoint endpoint (boost::asio::ip::address_v6 {}, 0);
|
||||
for (auto i (peers.begin ()), n (peers.end ()); i != n; ++i)
|
||||
{
|
||||
*i = endpoint;
|
||||
}
|
||||
}
|
||||
|
||||
void rai::keepalive::visit (rai::message_visitor & visitor_a) const
|
||||
{
|
||||
visitor_a.keepalive (*this);
|
||||
}
|
||||
|
||||
void rai::keepalive::serialize (rai::stream & stream_a)
|
||||
{
|
||||
write (stream_a, rai::message_type::keepalive);
|
||||
for (auto i (peers.begin ()), j (peers.end ()); i != j; ++i)
|
||||
{
|
||||
assert (i->address ().is_v4 ());
|
||||
uint32_t address (i->address ().to_v4 ().to_ulong ());
|
||||
write (stream_a, address);
|
||||
assert (i->address ().is_v6 ());
|
||||
auto bytes (i->address ().to_v6 ().to_bytes ());
|
||||
write (stream_a, bytes);
|
||||
write (stream_a, i->port ());
|
||||
}
|
||||
write (stream_a, checksum);
|
||||
|
@ -1304,11 +1313,11 @@ bool rai::keepalive::deserialize (rai::stream & stream_a)
|
|||
assert (type == rai::message_type::keepalive);
|
||||
for (auto i (peers.begin ()), j (peers.end ()); i != j; ++i)
|
||||
{
|
||||
uint32_t address;
|
||||
std::array <uint8_t, 16> address;
|
||||
uint16_t port;
|
||||
read (stream_a, address);
|
||||
read (stream_a, port);
|
||||
*i = rai::endpoint (boost::asio::ip::address_v4 (address), port);
|
||||
*i = rai::endpoint (boost::asio::ip::address_v6 (address), port);
|
||||
}
|
||||
read (stream_a, checksum);
|
||||
return result;
|
||||
|
@ -2008,7 +2017,7 @@ void rai::processor::connect_bootstrap (std::vector <std::string> const & peers_
|
|||
|
||||
rai::bootstrap_receiver::bootstrap_receiver (boost::asio::io_service & service_a, uint16_t port_a, rai::client & client_a) :
|
||||
acceptor (service_a),
|
||||
local (boost::asio::ip::tcp::endpoint (boost::asio::ip::address_v4::any (), port_a)),
|
||||
local (boost::asio::ip::tcp::endpoint (boost::asio::ip::address_v6::any (), port_a)),
|
||||
service (service_a),
|
||||
client (client_a)
|
||||
{
|
||||
|
@ -2729,12 +2738,12 @@ void rai::block_store::bootstrap_del (rai::block_hash const & hash_a)
|
|||
|
||||
rai::endpoint rai::network::endpoint ()
|
||||
{
|
||||
return rai::endpoint (boost::asio::ip::address_v4::loopback (), socket.local_endpoint ().port ());
|
||||
return rai::endpoint (boost::asio::ip::address_v6::loopback (), socket.local_endpoint ().port ());
|
||||
}
|
||||
|
||||
boost::asio::ip::tcp::endpoint rai::bootstrap_receiver::endpoint ()
|
||||
{
|
||||
return boost::asio::ip::tcp::endpoint (boost::asio::ip::address_v4::loopback (), local.port ());
|
||||
return boost::asio::ip::tcp::endpoint (boost::asio::ip::address_v6::loopback (), local.port ());
|
||||
}
|
||||
|
||||
rai::bootstrap_initiator::~bootstrap_initiator ()
|
||||
|
@ -2766,9 +2775,12 @@ void rai::peer_container::random_fill (std::array <rai::endpoint, 24> & target_a
|
|||
auto k (target_a.begin ());
|
||||
for (auto i (peers.begin ()), j (peers.begin () + std::min (peers.size (), target_a.size ())); i != j; ++i, ++k)
|
||||
{
|
||||
assert (i->endpoint.address ().is_v6 ());
|
||||
*k = i->endpoint;
|
||||
}
|
||||
std::fill (target_a.begin () + std::min (peers.size (), target_a.size ()), target_a.end (), rai::endpoint ());
|
||||
auto endpoint (rai::endpoint (boost::asio::ip::address_v6 {}, 0));
|
||||
assert (endpoint.address ().is_v6 ());
|
||||
std::fill (target_a.begin () + std::min (peers.size (), target_a.size ()), target_a.end (), endpoint);
|
||||
}
|
||||
|
||||
void rai::processor::ongoing_keepalive ()
|
||||
|
@ -2823,31 +2835,39 @@ bool rai::peer_container::contacting_peer (rai::endpoint const & endpoint_a)
|
|||
return result;
|
||||
}
|
||||
|
||||
namespace {
|
||||
boost::asio::ip::address_v6 mapped_from_v4_bytes (unsigned long address_a)
|
||||
{
|
||||
return boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (address_a));
|
||||
}
|
||||
}
|
||||
|
||||
bool rai::reserved_address (rai::endpoint const & endpoint_a)
|
||||
{
|
||||
auto bytes (endpoint_a.address ().to_v4().to_ulong ());
|
||||
assert (endpoint_a.address ().is_v6 ());
|
||||
auto bytes (endpoint_a.address ().to_v6 ());
|
||||
auto result (false);
|
||||
if (bytes <= 0x00ffffffu)
|
||||
if (bytes >= mapped_from_v4_bytes (0x00000000ul) && bytes <= mapped_from_v4_bytes (0x00fffffful)) // Broadcast RFC1700
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
else if (bytes >= 0xc0000200ul && bytes <= 0xc00002fful)
|
||||
else if (bytes >= mapped_from_v4_bytes (0xc0000200ul) && bytes <= mapped_from_v4_bytes (0xc00002fful)) // TEST-NET RFC5737
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
else if (bytes >= 0xc6336400ul && bytes <= 0xc63364fful)
|
||||
else if (bytes >= mapped_from_v4_bytes (0xc6336400ul) && bytes <= mapped_from_v4_bytes (0xc63364fful)) // TEST-NET-2 RFC5737
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
else if (bytes >= 0xcb007100ul && bytes <= 0xcb0071fful)
|
||||
else if (bytes >= mapped_from_v4_bytes (0xcb007100ul) && bytes <= mapped_from_v4_bytes (0xcb0071fful)) // TEST-NET-3 RFC5737
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
else if (bytes >= 0xe9fc0000ul && bytes <= 0xe9fc00fful)
|
||||
else if (bytes >= mapped_from_v4_bytes (0xe9fc0000ul) && bytes <= mapped_from_v4_bytes (0xe9fc00fful))
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
else if (bytes >= 0xf0000000ul)
|
||||
else if (bytes >= mapped_from_v4_bytes (0xf0000000ul)) // Reserver RFC6890
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
|
|
|
@ -44,7 +44,10 @@ namespace std
|
|||
{
|
||||
size_t operator () (rai::endpoint const & endpoint_a) const
|
||||
{
|
||||
auto result (endpoint_a.address ().to_v4 ().to_ulong () ^ endpoint_a.port ());
|
||||
assert (endpoint_a.address ().is_v6 ());
|
||||
rai::uint128_union address;
|
||||
address.bytes = endpoint_a.address ().to_v6 ().to_bytes ();
|
||||
auto result (address.dwords [0] ^ address.dwords [1] ^ address.dwords [2] ^ address.dwords [3] ^ endpoint_a.port ());
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
@ -53,7 +56,10 @@ namespace std
|
|||
{
|
||||
size_t operator () (rai::endpoint const & endpoint_a) const
|
||||
{
|
||||
auto result ((endpoint_a.address ().to_v4 ().to_ulong () << 2) | endpoint_a.port ());
|
||||
assert (endpoint_a.address ().is_v6 ());
|
||||
rai::uint128_union address;
|
||||
address.bytes = endpoint_a.address ().to_v6 ().to_bytes ();
|
||||
auto result (address.qwords [0] ^ address.qwords [1] ^ endpoint_a.port ());
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
@ -139,6 +145,7 @@ namespace rai {
|
|||
class keepalive : public message
|
||||
{
|
||||
public:
|
||||
keepalive ();
|
||||
void visit (rai::message_visitor &) const override;
|
||||
bool deserialize (rai::stream &);
|
||||
void serialize (rai::stream &) override;
|
||||
|
|
|
@ -49,6 +49,7 @@ namespace rai
|
|||
void clear ();
|
||||
std::array <uint8_t, 16> bytes;
|
||||
std::array <char, 16> chars;
|
||||
std::array <uint32_t, 4> dwords;
|
||||
std::array <uint64_t, 2> qwords;
|
||||
};
|
||||
using amount = uint128_union;
|
||||
|
|
|
@ -66,7 +66,7 @@ TEST (network, self_discard)
|
|||
TEST (keepalive, deserialize)
|
||||
{
|
||||
rai::keepalive message1;
|
||||
message1.peers [0] = rai::endpoint (boost::asio::ip::address_v4 (0x7f000001), 10000);
|
||||
message1.peers [0] = rai::endpoint (boost::asio::ip::address_v6::loopback (), 10000);
|
||||
message1.checksum = 1;
|
||||
std::vector <uint8_t> bytes;
|
||||
{
|
||||
|
@ -89,6 +89,8 @@ TEST (network, send_keepalive)
|
|||
client1->start ();
|
||||
system.clients [0]->network.maintain_keepalive (client1->network.endpoint ());
|
||||
auto initial (system.clients [0]->network.keepalive_count);
|
||||
ASSERT_EQ (1, system.clients [0]->peers.list ().size ());
|
||||
ASSERT_EQ (0, client1->peers.list ().size ());
|
||||
while (system.clients [0]->network.keepalive_count == initial)
|
||||
{
|
||||
system.service->run_one ();
|
||||
|
|
|
@ -11,7 +11,7 @@ TEST (peer_container, empty_peers)
|
|||
TEST (peer_container, no_recontact)
|
||||
{
|
||||
rai::peer_container peers (rai::endpoint {});
|
||||
rai::endpoint endpoint1 (boost::asio::ip::address_v4 (0x7f000001), 10000);
|
||||
rai::endpoint endpoint1 (boost::asio::ip::address_v6::loopback (), 10000);
|
||||
ASSERT_EQ (0, peers.size ());
|
||||
ASSERT_FALSE (peers.contacting_peer (endpoint1));
|
||||
ASSERT_EQ (1, peers.size ());
|
||||
|
@ -20,7 +20,7 @@ TEST (peer_container, no_recontact)
|
|||
|
||||
TEST (peer_container, no_self_incoming)
|
||||
{
|
||||
rai::endpoint self (boost::asio::ip::address_v4 (0x7f000001), 10000);
|
||||
rai::endpoint self (boost::asio::ip::address_v6::loopback (), 10000);
|
||||
rai::peer_container peers (self);
|
||||
peers.incoming_from_peer (self);
|
||||
ASSERT_TRUE (peers.peers.empty ());
|
||||
|
@ -28,7 +28,7 @@ TEST (peer_container, no_self_incoming)
|
|||
|
||||
TEST (peer_container, no_self_contacting)
|
||||
{
|
||||
rai::endpoint self (boost::asio::ip::address_v4 (0x7f000001), 10000);
|
||||
rai::endpoint self (boost::asio::ip::address_v6::loopback (), 10000);
|
||||
rai::peer_container peers (self);
|
||||
peers.contacting_peer (self);
|
||||
ASSERT_TRUE (peers.peers.empty ());
|
||||
|
@ -36,8 +36,8 @@ TEST (peer_container, no_self_contacting)
|
|||
|
||||
TEST (peer_container, old_known)
|
||||
{
|
||||
rai::endpoint self (boost::asio::ip::address_v4 (0x7f000001), 10000);
|
||||
rai::endpoint other (boost::asio::ip::address_v4 (0x7f000001), 10001);
|
||||
rai::endpoint self (boost::asio::ip::address_v6::loopback (), 10000);
|
||||
rai::endpoint other (boost::asio::ip::address_v6::loopback (), 10001);
|
||||
rai::peer_container peers (self);
|
||||
peers.contacting_peer (other);
|
||||
ASSERT_FALSE (peers.known_peer (other));
|
||||
|
@ -48,13 +48,13 @@ TEST (peer_container, old_known)
|
|||
TEST (peer_container, reserved_peers_no_contact)
|
||||
{
|
||||
rai::peer_container peers (rai::endpoint {});
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v4 (0x00000001), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v4 (0xc0000201), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v4 (0xc6336401), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v4 (0xcb007101), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v4 (0xe9fc0001), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v4 (0xf0000001), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v4 (0xffffffff), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0x00000001)), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xc0000201)), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xc6336401)), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xcb007101)), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xe9fc0001)), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xf0000001)), 10000)));
|
||||
ASSERT_TRUE (peers.contacting_peer (rai::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xffffffff)), 10000)));
|
||||
ASSERT_EQ (0, peers.size ());
|
||||
}
|
||||
|
||||
|
@ -62,8 +62,8 @@ TEST (peer_container, split)
|
|||
{
|
||||
rai::peer_container peers (rai::endpoint {});
|
||||
auto now (std::chrono::system_clock::now ());
|
||||
rai::endpoint endpoint1 (boost::asio::ip::address_v4::any (), 100);
|
||||
rai::endpoint endpoint2 (boost::asio::ip::address_v4::any (), 101);
|
||||
rai::endpoint endpoint1 (boost::asio::ip::address_v6::any (), 100);
|
||||
rai::endpoint endpoint2 (boost::asio::ip::address_v6::any (), 101);
|
||||
peers.peers.insert ({endpoint1, now - std::chrono::seconds (1), now - std::chrono::seconds (1)});
|
||||
peers.peers.insert ({endpoint2, now + std::chrono::seconds (1), now + std::chrono::seconds (1)});
|
||||
auto list (peers.purge_list (now));
|
||||
|
@ -75,9 +75,9 @@ TEST (peer_container, fill_random_clear)
|
|||
{
|
||||
rai::peer_container peers (rai::endpoint {});
|
||||
std::array <rai::endpoint, 24> target;
|
||||
std::fill (target.begin (), target.end (), rai::endpoint (boost::asio::ip::address_v4 (0x7f000001), 10000));
|
||||
std::fill (target.begin (), target.end (), rai::endpoint (boost::asio::ip::address_v6::loopback (), 10000));
|
||||
peers.random_fill (target);
|
||||
ASSERT_TRUE (std::all_of (target.begin (), target.end (), [] (rai::endpoint const & endpoint_a) {return endpoint_a == rai::endpoint (boost::asio::ip::address_v4 (0), 0); }));
|
||||
ASSERT_TRUE (std::all_of (target.begin (), target.end (), [] (rai::endpoint const & endpoint_a) {return endpoint_a == rai::endpoint (boost::asio::ip::address_v6::any (), 0); }));
|
||||
}
|
||||
|
||||
TEST (peer_container, fill_random_full)
|
||||
|
@ -85,12 +85,12 @@ TEST (peer_container, fill_random_full)
|
|||
rai::peer_container peers (rai::endpoint {});
|
||||
for (auto i (0); i < 100; ++i)
|
||||
{
|
||||
peers.incoming_from_peer (rai::endpoint (boost::asio::ip::address_v4 (0x7f000001), i));
|
||||
peers.incoming_from_peer (rai::endpoint (boost::asio::ip::address_v6::loopback (), i));
|
||||
}
|
||||
std::array <rai::endpoint, 24> target;
|
||||
std::fill (target.begin (), target.end (), rai::endpoint (boost::asio::ip::address_v4 (0x7f000001), 10000));
|
||||
std::fill (target.begin (), target.end (), rai::endpoint (boost::asio::ip::address_v6::loopback (), 10000));
|
||||
peers.random_fill (target);
|
||||
ASSERT_TRUE (std::none_of (target.begin (), target.end (), [] (rai::endpoint const & endpoint_a) {return endpoint_a == rai::endpoint (boost::asio::ip::address_v4 (0x7f000001), 10000); }));
|
||||
ASSERT_TRUE (std::none_of (target.begin (), target.end (), [] (rai::endpoint const & endpoint_a) {return endpoint_a == rai::endpoint (boost::asio::ip::address_v6::loopback (), 10000); }));
|
||||
}
|
||||
|
||||
TEST (peer_container, fill_random_part)
|
||||
|
@ -98,12 +98,12 @@ TEST (peer_container, fill_random_part)
|
|||
rai::peer_container peers (rai::endpoint {});
|
||||
for (auto i (0); i < 16; ++i)
|
||||
{
|
||||
peers.incoming_from_peer (rai::endpoint (boost::asio::ip::address_v4 (0x7f000001), i + 1));
|
||||
peers.incoming_from_peer (rai::endpoint (boost::asio::ip::address_v6::loopback (), i + 1));
|
||||
}
|
||||
std::array <rai::endpoint, 24> target;
|
||||
std::fill (target.begin (), target.end (), rai::endpoint (boost::asio::ip::address_v4 (0x7f000001), 10000));
|
||||
std::fill (target.begin (), target.end (), rai::endpoint (boost::asio::ip::address_v6::loopback (), 10000));
|
||||
peers.random_fill (target);
|
||||
ASSERT_TRUE (std::none_of (target.begin (), target.begin () + 16, [] (rai::endpoint const & endpoint_a) {return endpoint_a == rai::endpoint (boost::asio::ip::address_v4 (0x7f000001), 10000); }));
|
||||
ASSERT_TRUE (std::none_of (target.begin (), target.begin () + 16, [] (rai::endpoint const & endpoint_a) {return endpoint_a == rai::endpoint (boost::asio::ip::address_v4 (0x7f000001), 0); }));
|
||||
ASSERT_TRUE (std::all_of (target.begin () + 16, target.end (), [] (rai::endpoint const & endpoint_a) {return endpoint_a == rai::endpoint (boost::asio::ip::address_v4 (0), 0); }));
|
||||
ASSERT_TRUE (std::none_of (target.begin (), target.begin () + 16, [] (rai::endpoint const & endpoint_a) {return endpoint_a == rai::endpoint (boost::asio::ip::address_v6::loopback (), 10000); }));
|
||||
ASSERT_TRUE (std::none_of (target.begin (), target.begin () + 16, [] (rai::endpoint const & endpoint_a) {return endpoint_a == rai::endpoint (boost::asio::ip::address_v6::loopback (), 0); }));
|
||||
ASSERT_TRUE (std::all_of (target.begin () + 16, target.end (), [] (rai::endpoint const & endpoint_a) {return endpoint_a == rai::endpoint (boost::asio::ip::address_v6::any (), 0); }));
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue