Source File
ip.go
Belonging Package
net
package net
import
func (, , , byte) IP {
:= make(IP, IPv6len)
copy(, v4InV6Prefix)
[12] =
[13] =
[14] =
[15] =
return
}
var v4InV6Prefix = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}
var (
IPv4bcast = IPv4(255, 255, 255, 255) // limited broadcast
IPv4allsys = IPv4(224, 0, 0, 1) // all systems
IPv4allrouter = IPv4(224, 0, 0, 2) // all routers
IPv4zero = IPv4(0, 0, 0, 0) // all zeros
)
var (
IPv6zero = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
IPv6unspecified = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
IPv6loopback = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
IPv6interfacelocalallnodes = IP{0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}
IPv6linklocalallnodes = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}
IPv6linklocalallrouters = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02}
)
func ( IP) () bool {
return (len() == IPv4len || len() == IPv6len) &&
!.Equal(IPv4bcast) &&
!.IsUnspecified() &&
!.IsLoopback() &&
!.IsMulticast() &&
!.IsLinkLocalUnicast()
}
var (
classAMask = IPv4Mask(0xff, 0, 0, 0)
classBMask = IPv4Mask(0xff, 0xff, 0, 0)
classCMask = IPv4Mask(0xff, 0xff, 0xff, 0)
)
func ( IP) () IPMask {
if = .To4(); == nil {
return nil
}
switch {
case [0] < 0x80:
return classAMask
case [0] < 0xC0:
return classBMask
default:
return classCMask
}
}
func ( []byte) bool {
for , := range {
if != 0xff {
return false
}
}
return true
}
for := 0; < IPv6len; += 2 {
if == {
= append(, ':', ':')
=
if >= IPv6len {
break
}
} else if > 0 {
= append(, ':')
}
= appendHex(, (uint32([])<<8)|uint32([+1]))
}
return string()
}
func ( []byte) string {
:= make([]byte, len()*2)
for , := range {
[*2], [*2+1] = hexDigit[>>4], hexDigit[&0xf]
}
return string()
}
func ( IP) ( IP) bool {
if len() == len() {
return bytealg.Equal(, )
}
if len() == IPv4len && len() == IPv6len {
return bytealg.Equal([0:12], v4InV6Prefix) && bytealg.Equal(, [12:])
}
if len() == IPv6len && len() == IPv4len {
return bytealg.Equal([0:12], v4InV6Prefix) && bytealg.Equal([12:], )
}
return false
}
func ( IP) ( IP) bool {
return .To4() != nil && .To4() != nil || .To16() != nil && .To4() == nil && .To16() != nil && .To4() == nil
}
for &0x80 != 0 {
++
<<= 1
if != 0 {
return -1
}
for ++; < len(); ++ {
if [] != 0 {
return -1
}
}
break
}
return
}
func ( IPMask) () (, int) {
, = simpleMaskLength(), len()*8
if == -1 {
return 0, 0
}
return
}
func ( IPMask) () string {
if len() == 0 {
return "<nil>"
}
return hexString()
}
func ( *IPNet) ( IP, IPMask) {
if = .IP.To4(); == nil {
= .IP
if len() != IPv6len {
return nil, nil
}
}
= .Mask
switch len() {
case IPv4len:
if len() != IPv4len {
return nil, nil
}
case IPv6len:
if len() == IPv4len {
= [12:]
}
default:
return nil, nil
}
return
}
func ( string) (IP, string) {
, := splitHostZone()
return parseIPv6(),
}
if len() >= 2 && [0] == ':' && [1] == ':' {
= 0
if len() == 0 {
return
}
}
:= 0
if < len() && [] == '.' {
return nil
}
= [:]
if len() == 0 {
break
}
return nil
}
return
}
func ( string) (IP, *IPNet, error) {
:= bytealg.IndexByteString(, '/')
if < 0 {
return nil, nil, &ParseError{Type: "CIDR address", Text: }
}
, := [:], [+1:]
:= IPv4len
:= parseIPv4()
if == nil {
= IPv6len
= parseIPv6()
}
, , := dtoi()
if == nil || ! || != len() || < 0 || > 8* {
return nil, nil, &ParseError{Type: "CIDR address", Text: }
}
:= CIDRMask(, 8*)
return , &IPNet{IP: .Mask(), Mask: }, nil
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |