From 20cc417a53e22a742adaaabc6b5033af2eebffa2 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 5 Nov 2014 01:47:02 -0800 Subject: [PATCH] added ipv6 link-local loopback --- net/convert.go | 18 +++++++++++++++++- net/net_test.go | 12 ++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/net/convert.go b/net/convert.go index d1dc7af..9062a46 100644 --- a/net/convert.go +++ b/net/convert.go @@ -1,6 +1,7 @@ package manet import ( + "bytes" "fmt" "net" "strings" @@ -14,6 +15,9 @@ var ( // IP6Loopback is the ip6 loopback multiaddr IP6Loopback = ma.StringCast("/ip6/::1") + + // IP6LinkLocalLoopback is the ip6 link-local loopback multiaddr + IP6LinkLocalLoopback = ma.StringCast("/ip6/fe80::1") ) var errIncorrectNetAddr = fmt.Errorf("incorrect network addr conversion") @@ -169,5 +173,17 @@ func IsThinWaist(m ma.Multiaddr) bool { // IsIPLoopback returns whether a Multiaddr is a "Loopback" IP address // This means either /ip4/127.0.0.1 or /ip6/::1 func IsIPLoopback(m ma.Multiaddr) bool { - return m.Equal(IP4Loopback) || m.Equal(IP6Loopback) + b := m.Bytes() + + // /ip4/127 prefix (_entire_ /8 is loopback...) + if bytes.HasPrefix(b, []byte{4, 127}) { + return true + } + + // /ip6/::1 + if IP6Loopback.Equal(m) || IP6LinkLocalLoopback.Equal(m) { + return true + } + + return false } diff --git a/net/net_test.go b/net/net_test.go index c212c7c..bd01f3c 100644 --- a/net/net_test.go +++ b/net/net_test.go @@ -208,11 +208,19 @@ func TestLoopback(t *testing.T) { t.Error("IP6Loopback incorrect:", IP6Loopback) } + if IP6LinkLocalLoopback.String() != "/ip6/fe80::1" { + t.Error("IP6LinkLocalLoopback incorrect:", IP6Loopback) + } + if !IsIPLoopback(IP4Loopback) { - t.Error("IsIPLoopback failed (IP4)") + t.Error("IsIPLoopback failed (IP4Loopback)") } if !IsIPLoopback(IP6Loopback) { - t.Error("IsIPLoopback failed (IP6)") + t.Error("IsIPLoopback failed (IP6Loopback)") + } + + if !IsIPLoopback(IP6LinkLocalLoopback) { + t.Error("IsIPLoopback failed (IP6LinkLocalLoopback)") } }