1package netlink 2 3import ( 4 "fmt" 5 "net" 6 "strings" 7) 8 9// Addr represents an IP address from netlink. Netlink ip addresses 10// include a mask, so it stores the address as a net.IPNet. 11type Addr struct { 12 *net.IPNet 13 Label string 14 Flags int 15 Scope int 16 Peer *net.IPNet 17 Broadcast net.IP 18 PreferedLft int 19 ValidLft int 20} 21 22// String returns $ip/$netmask $label 23func (a Addr) String() string { 24 return strings.TrimSpace(fmt.Sprintf("%s %s", a.IPNet, a.Label)) 25} 26 27// ParseAddr parses the string representation of an address in the 28// form $ip/$netmask $label. The label portion is optional 29func ParseAddr(s string) (*Addr, error) { 30 label := "" 31 parts := strings.Split(s, " ") 32 if len(parts) > 1 { 33 s = parts[0] 34 label = parts[1] 35 } 36 m, err := ParseIPNet(s) 37 if err != nil { 38 return nil, err 39 } 40 return &Addr{IPNet: m, Label: label}, nil 41} 42 43// Equal returns true if both Addrs have the same net.IPNet value. 44func (a Addr) Equal(x Addr) bool { 45 sizea, _ := a.Mask.Size() 46 sizeb, _ := x.Mask.Size() 47 // ignore label for comparison 48 return a.IP.Equal(x.IP) && sizea == sizeb 49} 50 51func (a Addr) PeerEqual(x Addr) bool { 52 sizea, _ := a.Peer.Mask.Size() 53 sizeb, _ := x.Peer.Mask.Size() 54 // ignore label for comparison 55 return a.Peer.IP.Equal(x.Peer.IP) && sizea == sizeb 56} 57