// IsIPLoopback returns whether a Multiaddr is a "Loopback" IP address // This means either /ip4/127.0.0.1 or /ip6/::1 // TODO: differentiate IsIPLoopback and OverIPLoopback func IsIPLoopback(m ma.Multiaddr) bool { b := m.Bytes() // /ip4/127 prefix (_entire_ /8 is loopback...) if bytes.HasPrefix(b, []byte{ma.P_IP4, 127}) { return true } // /ip6/::1 if IP6Loopback.Equal(m) || IP6LinkLocalLoopback.Equal(m) { return true } return false }
func outfmt(m ma.Multiaddr) string { switch format { case "string": return m.String() case "slice": return fmt.Sprintf("%v", m.Bytes()) case "bytes": return string(m.Bytes()) case "hex": return "0x" + hex.EncodeToString(m.Bytes()) } die("error: invalid format", format) return "" }
// IP6 Link Local addresses are non routable. The prefix is technically // fe80::/10, but we test fe80::/16 for simplicity (no need to mask). // So far, no hardware interfaces exist long enough to use those 2 bits. // Send a PR if there is. func IsIP6LinkLocal(m ma.Multiaddr) bool { return bytes.HasPrefix(m.Bytes(), []byte{ma.P_IP6, 0xfe, 0x80}) }