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