netlink.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. // Package netlink provides a simple library for netlink. Netlink is
  2. // the interface a user-space program in linux uses to communicate with
  3. // the kernel. It can be used to add and remove interfaces, set up ip
  4. // addresses and routes, and confiugre ipsec. Netlink communication
  5. // requires elevated privileges, so in most cases this code needs to
  6. // be run as root. The low level primitives for netlink are contained
  7. // in the nl subpackage. This package attempts to provide a high-level
  8. // interface that is loosly modeled on the iproute2 cli.
  9. package netlink
  10. import (
  11. "errors"
  12. "net"
  13. )
  14. var (
  15. // ErrNotImplemented is returned when a requested feature is not implemented.
  16. ErrNotImplemented = errors.New("not implemented")
  17. )
  18. // ParseIPNet parses a string in ip/net format and returns a net.IPNet.
  19. // This is valuable because addresses in netlink are often IPNets and
  20. // ParseCIDR returns an IPNet with the IP part set to the base IP of the
  21. // range.
  22. func ParseIPNet(s string) (*net.IPNet, error) {
  23. ip, ipNet, err := net.ParseCIDR(s)
  24. if err != nil {
  25. return nil, err
  26. }
  27. return &net.IPNet{IP: ip, Mask: ipNet.Mask}, nil
  28. }
  29. // NewIPNet generates an IPNet from an ip address using a netmask of 32 or 128.
  30. func NewIPNet(ip net.IP) *net.IPNet {
  31. if ip.To4() != nil {
  32. return &net.IPNet{IP: ip, Mask: net.CIDRMask(32, 32)}
  33. }
  34. return &net.IPNet{IP: ip, Mask: net.CIDRMask(128, 128)}
  35. }