addr.go 1.3 KB

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