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)