iface.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package ip
  2. import (
  3. "errors"
  4. "net"
  5. "syscall"
  6. "github.com/coreos/flannel/Godeps/_workspace/src/github.com/vishvananda/netlink"
  7. )
  8. func GetIfaceIP4Addr(iface *net.Interface) (net.IP, error) {
  9. addrs, err := iface.Addrs()
  10. if err != nil {
  11. return nil, err
  12. }
  13. for _, addr := range addrs {
  14. // Attempt to parse the address in CIDR notation
  15. // and assert it is IPv4
  16. ip, _, err := net.ParseCIDR(addr.String())
  17. if err == nil && ip.To4() != nil {
  18. return ip.To4(), nil
  19. }
  20. }
  21. return nil, errors.New("No IPv4 address found for given interface")
  22. }
  23. func GetIfaceIP4AddrMatch(iface *net.Interface, matchAddr net.IP) error {
  24. addrs, err := iface.Addrs()
  25. if err != nil {
  26. return err
  27. }
  28. for _, addr := range addrs {
  29. // Attempt to parse the address in CIDR notation
  30. // and assert it is IPv4
  31. ip, _, err := net.ParseCIDR(addr.String())
  32. if err == nil && ip.To4() != nil {
  33. if ip.To4().Equal(matchAddr) {
  34. return nil
  35. }
  36. }
  37. }
  38. return errors.New("No IPv4 address found for given interface")
  39. }
  40. func GetDefaultGatewayIface() (*net.Interface, error) {
  41. routes, err := netlink.RouteList(nil, syscall.AF_INET)
  42. if err != nil {
  43. return nil, err
  44. }
  45. for _, route := range routes {
  46. if route.Dst == nil || route.Dst.String() == "0.0.0.0/0" {
  47. if route.LinkIndex <= 0 {
  48. return nil, errors.New("Found default route but could not determine interface")
  49. }
  50. return net.InterfaceByIndex(route.LinkIndex)
  51. }
  52. }
  53. return nil, errors.New("Unable to find default route")
  54. }
  55. func GetInterfaceByIP(ip net.IP) (*net.Interface, error) {
  56. ifaces, err := net.Interfaces()
  57. if err != nil {
  58. return nil, err
  59. }
  60. for _, iface := range ifaces {
  61. err := GetIfaceIP4AddrMatch(&iface, ip)
  62. if err == nil {
  63. return &iface, nil
  64. }
  65. }
  66. return nil, errors.New("No interface with given IP found")
  67. }