github.com/sagernet/netlink@v0.0.0-20240612041022-b9a21c07ac6a/addr.go (about) 1 package netlink 2 3 import ( 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. 11 type 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 LinkIndex int 21 } 22 23 // String returns $ip/$netmask $label 24 func (a Addr) String() string { 25 return strings.TrimSpace(fmt.Sprintf("%s %s", a.IPNet, a.Label)) 26 } 27 28 // ParseAddr parses the string representation of an address in the 29 // form $ip/$netmask $label. The label portion is optional 30 func ParseAddr(s string) (*Addr, error) { 31 label := "" 32 parts := strings.Split(s, " ") 33 if len(parts) > 1 { 34 s = parts[0] 35 label = parts[1] 36 } 37 m, err := ParseIPNet(s) 38 if err != nil { 39 return nil, err 40 } 41 return &Addr{IPNet: m, Label: label}, nil 42 } 43 44 // Equal returns true if both Addrs have the same net.IPNet value. 45 func (a Addr) Equal(x Addr) bool { 46 sizea, _ := a.Mask.Size() 47 sizeb, _ := x.Mask.Size() 48 // ignore label for comparison 49 return a.IP.Equal(x.IP) && sizea == sizeb 50 } 51 52 func (a Addr) PeerEqual(x Addr) bool { 53 sizea, _ := a.Peer.Mask.Size() 54 sizeb, _ := x.Peer.Mask.Size() 55 // ignore label for comparison 56 return a.Peer.IP.Equal(x.Peer.IP) && sizea == sizeb 57 }