diff --git a/addrmgr/network.go b/addrmgr/network.go index afcc25313..ea6d445d4 100644 --- a/addrmgr/network.go +++ b/addrmgr/network.go @@ -20,6 +20,10 @@ var ( ipNet("192.168.0.0", 16, 32), } + // rfc2544Net specifies the the IPv4 block as defined by RFC2544 + // (198.18.0.0/15) + rfc2544Net = ipNet("198.18.0.0", 15, 32) + // rfc3849Net specifies the IPv6 documentation address block as defined // by RFC3849 (2001:DB8::/32). rfc3849Net = ipNet("2001:DB8::", 32, 128) @@ -48,6 +52,14 @@ var ( // address block as defined by RFC4862 (FE80::/64). rfc4862Net = ipNet("FE80::", 64, 128) + // rfc5737Net specifies the IPv4 documentation address blocks as defined + // by RFC5737 (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24) + rfc5737Net = []net.IPNet{ + ipNet("192.0.2.0", 24, 32), + ipNet("198.51.100.0", 24, 32), + ipNet("203.0.113.0", 24, 32), + } + // rfc6052Net specifies the IPv6 well-known prefix address block as // defined by RFC6052 (64:FF9B::/96). rfc6052Net = ipNet("64:FF9B::", 96, 128) @@ -56,6 +68,9 @@ var ( // defined by RFC6145 (::FFFF:0:0:0/96). rfc6145Net = ipNet("::FFFF:0:0:0", 96, 128) + // rfc6598Net specifies the IPv4 block as defined by RFC6598 (100.64.0.0/10) + rfc6598Net = ipNet("100.64.0.0", 10, 32) + // onionCatNet defines the IPv6 address block used to support Tor. // bitcoind encodes a .onion address as a 16 byte number by decoding the // address prior to the .onion (i.e. the key hash) base32 into a ten @@ -114,6 +129,12 @@ func IsRFC1918(na *btcwire.NetAddress) bool { return false } +// IsRFC2544 returns whether or not the passed address is part of the IPv4 +// address space as defined by RFC2544 (198.18.0.0/15) +func IsRFC2544(na *btcwire.NetAddress) bool { + return rfc2544Net.Contains(na.IP) +} + // IsRFC3849 returns whether or not the passed address is part of the IPv6 // documentation range as defined by RFC3849 (2001:DB8::/32). func IsRFC3849(na *btcwire.NetAddress) bool { @@ -156,18 +177,37 @@ func IsRFC4862(na *btcwire.NetAddress) bool { return rfc4862Net.Contains(na.IP) } +// IsRFC5737 returns whether or not the passed address is part of the IPv4 +// documentation address space as defined by RFC5737 (192.0.2.0/24, +// 198.51.100.0/24, 203.0.113.0/24) +func IsRFC5737(na *btcwire.NetAddress) bool { + for _, rfc := range rfc5737Net { + if rfc.Contains(na.IP) { + return true + } + } + + return false +} + // IsRFC6052 returns whether or not the passed address is part of the IPv6 // well-known prefix range as defined by RFC6052 (64:FF9B::/96). func IsRFC6052(na *btcwire.NetAddress) bool { return rfc6052Net.Contains(na.IP) } -// IsRFC6145 returns whether or not the passed address is part of the IPv6 to +// IsRFC6145 returns whether or not the passed address is part of the IPv6 to // IPv4 translated address range as defined by RFC6145 (::FFFF:0:0:0/96). func IsRFC6145(na *btcwire.NetAddress) bool { return rfc6145Net.Contains(na.IP) } +// IsRFC6598 returns whether or not the passed address is part of the IPv4 +// shared address space specified by RFC6598 (100.64.0.0/10) +func IsRFC6598(na *btcwire.NetAddress) bool { + return rfc6598Net.Contains(na.IP) +} + // IsValid returns whether or not the passed address is valid. The address is // considered invalid under the following circumstances: // IPv4: It is either a zero or all bits set address. @@ -183,8 +223,9 @@ func IsValid(na *btcwire.NetAddress) bool { // the public internet. This is true as long as the address is valid and is not // in any reserved ranges. func IsRoutable(na *btcwire.NetAddress) bool { - return IsValid(na) && !(IsRFC1918(na) || IsRFC3927(na) || - IsRFC4862(na) || IsRFC3849(na) || IsRFC4843(na) || + return IsValid(na) && !(IsRFC1918(na) || IsRFC2544(na) || + IsRFC3927(na) || IsRFC4862(na) || IsRFC3849(na) || + IsRFC4843(na) || IsRFC5737(na) || IsRFC6598(na) || IsLocal(na) || (IsRFC4193(na) && !IsOnionCatTor(na))) } diff --git a/addrmgr/network_test.go b/addrmgr/network_test.go index 733083988..761f57476 100644 --- a/addrmgr/network_test.go +++ b/addrmgr/network_test.go @@ -19,6 +19,7 @@ func TestIPTypes(t *testing.T) { type ipTest struct { in btcwire.NetAddress rfc1918 bool + rfc2544 bool rfc3849 bool rfc3927 bool rfc3964 bool @@ -26,16 +27,18 @@ func TestIPTypes(t *testing.T) { rfc4380 bool rfc4843 bool rfc4862 bool + rfc5737 bool rfc6052 bool rfc6145 bool + rfc6598 bool local bool valid bool routable bool } - newIPTest := func(ip string, rfc1918, rfc3849, rfc3927, rfc3964, - rfc4193, rfc4380, rfc4843, rfc4862, rfc6052, rfc6145, local, - valid, routable bool) ipTest { + newIPTest := func(ip string, rfc1918, rfc2544, rfc3849, rfc3927, rfc3964, + rfc4193, rfc4380, rfc4843, rfc4862, rfc5737, rfc6052, rfc6145, rfc6598, + local, valid, routable bool) ipTest { nip := net.ParseIP(ip) na := btcwire.NetAddress{ Timestamp: time.Now(), @@ -43,44 +46,50 @@ func TestIPTypes(t *testing.T) { IP: nip, Port: 8333, } - test := ipTest{na, rfc1918, rfc3849, rfc3927, rfc3964, rfc4193, rfc4380, - rfc4843, rfc4862, rfc6052, rfc6145, local, valid, routable} + test := ipTest{na, rfc1918, rfc2544, rfc3849, rfc3927, rfc3964, rfc4193, rfc4380, + rfc4843, rfc4862, rfc5737, rfc6052, rfc6145, rfc6598, local, valid, routable} return test } tests := []ipTest{ - newIPTest("10.255.255.255", true, false, false, false, false, - false, false, false, false, false, false, true, false), - newIPTest("192.168.0.1", true, false, false, false, false, - false, false, false, false, false, false, true, false), - newIPTest("172.31.255.1", true, false, false, false, false, - false, false, false, false, false, false, true, false), - newIPTest("172.32.1.1", false, false, false, false, false, + newIPTest("10.255.255.255", true, false, false, false, false, false, + false, false, false, false, false, false, false, false, true, false), + newIPTest("192.168.0.1", true, false, false, false, false, false, + false, false, false, false, false, false, false, false, true, false), + newIPTest("172.31.255.1", true, false, false, false, false, false, + false, false, false, false, false, false, false, false, true, false), + newIPTest("172.32.1.1", false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true), - newIPTest("169.254.250.120", false, false, true, false, false, - false, false, false, false, false, false, true, false), - newIPTest("0.0.0.0", false, false, false, false, false, false, - false, false, false, false, true, false, false), - newIPTest("255.255.255.255", false, false, false, false, false, - false, false, false, false, false, false, false, false), - newIPTest("127.0.0.1", false, false, false, false, false, - false, false, false, false, false, true, true, false), - newIPTest("fd00:dead::1", false, false, false, false, true, - false, false, false, false, false, false, true, false), - newIPTest("2001::1", false, false, false, false, false, - true, false, false, false, false, false, true, true), - newIPTest("2001:10:abcd::1:1", false, false, false, false, false, - false, true, false, false, false, false, true, false), - newIPTest("fe80::1", false, false, false, false, false, - false, false, true, false, false, false, true, false), - newIPTest("fe80:1::1", false, false, false, false, false, - false, false, false, false, false, false, true, true), - newIPTest("64:ff9b::1", false, false, false, false, false, - false, false, false, true, false, false, true, true), - newIPTest("::ffff:abcd:ef12:1", false, false, false, false, false, - false, false, false, false, false, false, true, true), - newIPTest("::1", false, false, false, false, false, + newIPTest("169.254.250.120", false, false, false, true, false, false, + false, false, false, false, false, false, false, false, true, false), + newIPTest("0.0.0.0", false, false, false, false, false, false, false, + false, false, false, false, false, false, true, false, false), + newIPTest("255.255.255.255", false, false, false, false, false, false, + false, false, false, false, false, false, false, false, false, false), + newIPTest("127.0.0.1", false, false, false, false, false, false, + false, false, false, false, false, false, false, true, true, false), + newIPTest("fd00:dead::1", false, false, false, false, false, true, + false, false, false, false, false, false, false, false, true, false), + newIPTest("2001::1", false, false, false, false, false, false, + true, false, false, false, false, false, false, false, true, true), + newIPTest("2001:10:abcd::1:1", false, false, false, false, false, false, + false, true, false, false, false, false, false, false, true, false), + newIPTest("fe80::1", false, false, false, false, false, false, + false, false, true, false, false, false, false, false, true, false), + newIPTest("fe80:1::1", false, false, false, false, false, false, + false, false, false, false, false, false, false, false, true, true), + newIPTest("64:ff9b::1", false, false, false, false, false, false, + false, false, false, false, true, false, false, false, true, true), + newIPTest("::ffff:abcd:ef12:1", false, false, false, false, false, false, + false, false, false, false, false, false, false, false, true, true), + newIPTest("::1", false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false), + newIPTest("198.18.0.1", false, true, false, false, false, false, false, + false, false, false, false, false, false, false, true, false), + newIPTest("100.127.255.1", false, false, false, false, false, false, false, + false, false, false, false, false, true, false, true, false), + newIPTest("203.0.113.1", false, false, false, false, false, false, false, + false, false, false, false, false, false, false, true, false), } t.Logf("Running %d tests", len(tests)) diff --git a/addrmgr/test_coverage.txt b/addrmgr/test_coverage.txt index 93057019e..c67e0f6d0 100644 --- a/addrmgr/test_coverage.txt +++ b/addrmgr/test_coverage.txt @@ -1,58 +1,62 @@ -github.com/conformal/btcd/addrmgr/network.go GroupKey 100.00% (23/23) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.reset 100.00% (6/6) -github.com/conformal/btcd/addrmgr/network.go IsRFC1918 100.00% (4/4) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.NumAddresses 100.00% (3/3) -github.com/conformal/btcd/addrmgr/addrmanager.go NetAddressKey 100.00% (3/3) -github.com/conformal/btcd/addrmgr/addrmanager.go New 100.00% (3/3) -github.com/conformal/btcd/addrmgr/network.go IsRFC4193 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsRFC3964 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsRFC3927 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsRFC3849 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsRFC4843 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsOnionCatTor 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsRoutable 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsLocal 100.00% (1/1) -github.com/conformal/btcd/addrmgr/log.go init 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsValid 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsRFC6145 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsRFC6052 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsRFC4862 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsRFC4380 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go IsIPv4 100.00% (1/1) -github.com/conformal/btcd/addrmgr/network.go ipNet 100.00% (1/1) -github.com/conformal/btcd/addrmgr/log.go DisableLog 100.00% (1/1) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.GetBestLocalAddress 94.74% (18/19) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.AddLocalAddress 90.91% (10/11) -github.com/conformal/btcd/addrmgr/addrmanager.go getReachabilityFrom 51.52% (17/33) -github.com/conformal/btcd/addrmgr/addrmanager.go ipString 50.00% (2/4) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.GetAddress 4.65% (2/43) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.deserializePeers 0.00% (0/50) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.Good 0.00% (0/44) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.savePeers 0.00% (0/41) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.updateAddress 0.00% (0/32) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.expireNew 0.00% (0/21) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.AddressCache 0.00% (0/16) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.AddAddressByIP 0.00% (0/16) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.getNewBucket 0.00% (0/15) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.getTriedBucket 0.00% (0/14) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.HostToNetAddress 0.00% (0/14) -github.com/conformal/btcd/addrmgr/addrmanager.go chance 0.00% (0/13) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.loadPeers 0.00% (0/13) -github.com/conformal/btcd/addrmgr/addrmanager.go bad 0.00% (0/11) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.Connected 0.00% (0/10) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.addressHandler 0.00% (0/9) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.pickTried 0.00% (0/8) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.DeserializeNetAddress 0.00% (0/7) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.Attempt 0.00% (0/7) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.Stop 0.00% (0/7) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.Start 0.00% (0/6) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.AddAddresses 0.00% (0/2) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.NeedMoreAddresses 0.00% (0/1) -github.com/conformal/btcd/addrmgr/log.go UseLogger 0.00% (0/1) -github.com/conformal/btcd/addrmgr/addrmanager.go knownAddress.LastAttempt 0.00% (0/1) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.find 0.00% (0/1) -github.com/conformal/btcd/addrmgr/addrmanager.go knownAddress.NetAddress 0.00% (0/1) -github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.AddAddress 0.00% (0/1) -github.com/conformal/btcd/addrmgr --------------------------------- 20.34% (108/531) +github.com/conformal/btcd/addrmgr/network.go GroupKey 100.00% (23/23) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.reset 100.00% (6/6) +github.com/conformal/btcd/addrmgr/network.go IsRFC5737 100.00% (4/4) +github.com/conformal/btcd/addrmgr/network.go IsRFC1918 100.00% (4/4) +github.com/conformal/btcd/addrmgr/addrmanager.go New 100.00% (3/3) +github.com/conformal/btcd/addrmgr/addrmanager.go NetAddressKey 100.00% (2/2) +github.com/conformal/btcd/addrmgr/network.go IsRFC4862 100.00% (1/1) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.numAddresses 100.00% (1/1) +github.com/conformal/btcd/addrmgr/log.go init 100.00% (1/1) +github.com/conformal/btcd/addrmgr/log.go DisableLog 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go ipNet 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsIPv4 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsLocal 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsOnionCatTor 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRFC2544 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRFC3849 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRFC3927 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRFC3964 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRFC4193 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRFC4380 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRFC4843 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRFC6052 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRFC6145 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRFC6598 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsValid 100.00% (1/1) +github.com/conformal/btcd/addrmgr/network.go IsRoutable 100.00% (1/1) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.GetBestLocalAddress 94.74% (18/19) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.AddLocalAddress 90.91% (10/11) +github.com/conformal/btcd/addrmgr/addrmanager.go getReachabilityFrom 51.52% (17/33) +github.com/conformal/btcd/addrmgr/addrmanager.go ipString 50.00% (2/4) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.GetAddress 9.30% (4/43) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.deserializePeers 0.00% (0/50) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.Good 0.00% (0/44) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.savePeers 0.00% (0/39) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.updateAddress 0.00% (0/30) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.expireNew 0.00% (0/22) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.AddressCache 0.00% (0/16) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.HostToNetAddress 0.00% (0/15) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.getNewBucket 0.00% (0/15) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.AddAddressByIP 0.00% (0/14) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.getTriedBucket 0.00% (0/14) +github.com/conformal/btcd/addrmgr/knownaddress.go knownAddress.chance 0.00% (0/13) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.loadPeers 0.00% (0/11) +github.com/conformal/btcd/addrmgr/knownaddress.go knownAddress.isBad 0.00% (0/11) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.Connected 0.00% (0/10) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.addressHandler 0.00% (0/9) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.pickTried 0.00% (0/8) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.DeserializeNetAddress 0.00% (0/7) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.Stop 0.00% (0/7) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.Attempt 0.00% (0/7) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.Start 0.00% (0/6) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.AddAddresses 0.00% (0/4) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.NeedMoreAddresses 0.00% (0/3) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.NumAddresses 0.00% (0/3) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.AddAddress 0.00% (0/3) +github.com/conformal/btcd/addrmgr/knownaddress.go knownAddress.LastAttempt 0.00% (0/1) +github.com/conformal/btcd/addrmgr/knownaddress.go knownAddress.NetAddress 0.00% (0/1) +github.com/conformal/btcd/addrmgr/addrmanager.go AddrManager.find 0.00% (0/1) +github.com/conformal/btcd/addrmgr/log.go UseLogger 0.00% (0/1) +github.com/conformal/btcd/addrmgr --------------------------------- 21.04% (113/537)