@@ -908,4 +908,109 @@ BOOST_AUTO_TEST_CASE(initial_advertise_from_version_message)
908908 TestOnlyResetTimeData ();
909909}
910910
911+
912+ BOOST_AUTO_TEST_CASE (advertise_local_address)
913+ {
914+ auto CreatePeer = [](const CAddress& addr) {
915+ return std::make_unique<CNode>(/* id=*/ 0 ,
916+ /* sock=*/ nullptr ,
917+ addr,
918+ /* nKeyedNetGroupIn=*/ 0 ,
919+ /* nLocalHostNonceIn=*/ 0 ,
920+ CAddress{},
921+ /* pszDest=*/ std::string{},
922+ ConnectionType::OUTBOUND_FULL_RELAY ,
923+ /* inbound_onion=*/ false );
924+ };
925+ SetReachable (NET_CJDNS , true );
926+
927+ CAddress addr_ipv4{Lookup (" 1.2.3.4" , 8333 , false ).value (), NODE_NONE };
928+ BOOST_REQUIRE (addr_ipv4.IsValid ());
929+ BOOST_REQUIRE (addr_ipv4.IsIPv4 ());
930+
931+ CAddress addr_ipv6{Lookup (" 1122:3344:5566:7788:9900:aabb:ccdd:eeff" , 8333 , false ).value (), NODE_NONE };
932+ BOOST_REQUIRE (addr_ipv6.IsValid ());
933+ BOOST_REQUIRE (addr_ipv6.IsIPv6 ());
934+
935+ CAddress addr_ipv6_tunnel{Lookup (" 2002:3344:5566:7788:9900:aabb:ccdd:eeff" , 8333 , false ).value (), NODE_NONE };
936+ BOOST_REQUIRE (addr_ipv6_tunnel.IsValid ());
937+ BOOST_REQUIRE (addr_ipv6_tunnel.IsIPv6 ());
938+ BOOST_REQUIRE (addr_ipv6_tunnel.IsRFC3964 ());
939+
940+ CAddress addr_teredo{Lookup (" 2001:0000:5566:7788:9900:aabb:ccdd:eeff" , 8333 , false ).value (), NODE_NONE };
941+ BOOST_REQUIRE (addr_teredo.IsValid ());
942+ BOOST_REQUIRE (addr_teredo.IsIPv6 ());
943+ BOOST_REQUIRE (addr_teredo.IsRFC4380 ());
944+
945+ CAddress addr_onion;
946+ BOOST_REQUIRE (addr_onion.SetSpecial (" pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion" ));
947+ BOOST_REQUIRE (addr_onion.IsValid ());
948+ BOOST_REQUIRE (addr_onion.IsTor ());
949+
950+ CAddress addr_i2p;
951+ BOOST_REQUIRE (addr_i2p.SetSpecial (" udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p" ));
952+ BOOST_REQUIRE (addr_i2p.IsValid ());
953+ BOOST_REQUIRE (addr_i2p.IsI2P ());
954+
955+ CService service_cjdns{Lookup (" fc00:3344:5566:7788:9900:aabb:ccdd:eeff" , 8333 , false ).value (), NODE_NONE };
956+ CAddress addr_cjdns{MaybeFlipIPv6toCJDNS (service_cjdns), NODE_NONE };
957+ BOOST_REQUIRE (addr_cjdns.IsValid ());
958+ BOOST_REQUIRE (addr_cjdns.IsCJDNS ());
959+
960+ const auto peer_ipv4{CreatePeer (addr_ipv4)};
961+ const auto peer_ipv6{CreatePeer (addr_ipv6)};
962+ const auto peer_ipv6_tunnel{CreatePeer (addr_ipv6_tunnel)};
963+ const auto peer_teredo{CreatePeer (addr_teredo)};
964+ const auto peer_onion{CreatePeer (addr_onion)};
965+ const auto peer_i2p{CreatePeer (addr_i2p)};
966+ const auto peer_cjdns{CreatePeer (addr_cjdns)};
967+
968+ // one local clearnet address - advertise to all but privacy peers
969+ AddLocal (addr_ipv4);
970+ BOOST_CHECK (GetLocalAddress (*peer_ipv4) == addr_ipv4);
971+ BOOST_CHECK (GetLocalAddress (*peer_ipv6) == addr_ipv4);
972+ BOOST_CHECK (GetLocalAddress (*peer_ipv6_tunnel) == addr_ipv4);
973+ BOOST_CHECK (GetLocalAddress (*peer_teredo) == addr_ipv4);
974+ BOOST_CHECK (GetLocalAddress (*peer_cjdns) == addr_ipv4);
975+ BOOST_CHECK (!GetLocalAddress (*peer_onion).IsValid ());
976+ BOOST_CHECK (!GetLocalAddress (*peer_i2p).IsValid ());
977+ RemoveLocal (addr_ipv4);
978+
979+ // local privacy addresses - don't advertise to clearnet peers
980+ AddLocal (addr_onion);
981+ AddLocal (addr_i2p);
982+ BOOST_CHECK (!GetLocalAddress (*peer_ipv4).IsValid ());
983+ BOOST_CHECK (!GetLocalAddress (*peer_ipv6).IsValid ());
984+ BOOST_CHECK (!GetLocalAddress (*peer_ipv6_tunnel).IsValid ());
985+ BOOST_CHECK (!GetLocalAddress (*peer_teredo).IsValid ());
986+ BOOST_CHECK (!GetLocalAddress (*peer_cjdns).IsValid ());
987+ BOOST_CHECK (GetLocalAddress (*peer_onion) == addr_onion);
988+ BOOST_CHECK (GetLocalAddress (*peer_i2p) == addr_i2p);
989+ RemoveLocal (addr_onion);
990+ RemoveLocal (addr_i2p);
991+
992+ // local addresses from all networks
993+ AddLocal (addr_ipv4);
994+ AddLocal (addr_ipv6);
995+ AddLocal (addr_ipv6_tunnel);
996+ AddLocal (addr_teredo);
997+ AddLocal (addr_onion);
998+ AddLocal (addr_i2p);
999+ AddLocal (addr_cjdns);
1000+ BOOST_CHECK (GetLocalAddress (*peer_ipv4) == addr_ipv4);
1001+ BOOST_CHECK (GetLocalAddress (*peer_ipv6) == addr_ipv6);
1002+ BOOST_CHECK (GetLocalAddress (*peer_ipv6_tunnel) == addr_ipv6);
1003+ BOOST_CHECK (GetLocalAddress (*peer_teredo) == addr_ipv4);
1004+ BOOST_CHECK (GetLocalAddress (*peer_onion) == addr_onion);
1005+ BOOST_CHECK (GetLocalAddress (*peer_i2p) == addr_i2p);
1006+ BOOST_CHECK (GetLocalAddress (*peer_cjdns) == addr_cjdns);
1007+ RemoveLocal (addr_ipv4);
1008+ RemoveLocal (addr_ipv6);
1009+ RemoveLocal (addr_ipv6_tunnel);
1010+ RemoveLocal (addr_teredo);
1011+ RemoveLocal (addr_onion);
1012+ RemoveLocal (addr_i2p);
1013+ RemoveLocal (addr_cjdns);
1014+ }
1015+
9111016BOOST_AUTO_TEST_SUITE_END ()
0 commit comments