1 // Copyright 2016 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
14 // An Addr represents an address associated with packet routing.
16 // Family returns an address family.
20 // An Inet4Addr represents an internet address for IPv4.
21 type Inet4Addr
struct {
22 IP
[4]byte // IP address
23 PrefixLen
int // address prefix length
26 // Family implements the Family method of Addr interface.
27 func (a
*Inet4Addr
) Family() int { return sysAF_INET
}
29 // An Inet6Addr represents an internet address for IPv6.
30 type Inet6Addr
struct {
31 IP
[16]byte // IP address
32 PrefixLen
int // address prefix length
33 ZoneID
int // zone identifier
36 // Family implements the Family method of Addr interface.
37 func (a
*Inet6Addr
) Family() int { return sysAF_INET6
}
39 // Addrs returns a list of interface addresses.
41 // The provided af must be an address family and name must be a data
42 // link name. The zero value of af or name means a wildcard.
43 func Addrs(af
int, name
string) ([]Addr
, error
) {
44 eps
, err
:= newEndpoints(af
)
49 for _
, ep
:= range eps
{
53 lls
, err
:= links(eps
, name
)
58 for _
, ll
:= range lls
{
60 for i
:= 0; i
< len(ll
.Name
); i
++ {
61 lifr
.Name
[i
] = int8(ll
.Name
[i
])
63 for _
, ep
:= range eps
{
64 ioc
:= int64(sysSIOCGLIFADDR
)
65 err
:= ioctl(ep
.s
, uintptr(ioc
), unsafe
.Pointer(&lifr
))
69 sa
:= (*sockaddrStorage
)(unsafe
.Pointer(&lifr
.Lifru
[0]))
70 l
:= int(nativeEndian
.Uint32(lifr
.Lifru1
[:4]))
76 a
:= &Inet4Addr
{PrefixLen
: l
}
77 copy(a
.IP
[:], lifr
.Lifru
[4:8])
80 a
:= &Inet6Addr
{PrefixLen
: l
, ZoneID
: int(nativeEndian
.Uint32(lifr
.Lifru
[24:28]))}
81 copy(a
.IP
[:], lifr
.Lifru
[8:24])
89 func parseLinkAddr(b
[]byte) ([]byte, error
) {
90 nlen
, alen
, slen
:= int(b
[1]), int(b
[2]), int(b
[3])
91 l
:= 4 + nlen
+ alen
+ slen
93 return nil, errors
.New("invalid address")
101 addr
= make([]byte, alen
)