Browse Source

Merge pull request #38 from josselin-c/master

Handle interfaces with multiples IPv4 addresses
Eugene Yakubovich 10 năm trước cách đây
mục cha
commit
98ef1d0dc9
1 tập tin đã thay đổi với 22 bổ sung2 xóa
  1. 22 2
      pkg/ip/iface.go

+ 22 - 2
pkg/ip/iface.go

@@ -25,6 +25,26 @@ func GetIfaceIP4Addr(iface *net.Interface) (net.IP, error) {
 	return nil, errors.New("No IPv4 address found for given interface")
 }
 
+func GetIfaceIP4AddrMatch(iface *net.Interface, matchAddr net.IP) (error) {
+	addrs, err := iface.Addrs()
+	if err != nil {
+		return err
+	}
+
+	for _, addr := range addrs {
+		// Attempt to parse the address in CIDR notation
+		// and assert it is IPv4
+		ip, _, err := net.ParseCIDR(addr.String())
+		if err == nil && ip.To4() != nil {
+			if ip.To4().Equal(matchAddr) {
+				return nil
+			}
+		}
+	}
+
+	return errors.New("No IPv4 address found for given interface")
+}
+
 func GetDefaultGatewayIface() (*net.Interface, error) {
 	routes, err := netlink.NetworkGetRoutes()
 	if err != nil {
@@ -50,8 +70,8 @@ func GetInterfaceByIP(ip net.IP) (*net.Interface, error) {
 	}
 
 	for _, iface := range ifaces {
-		addr, err := GetIfaceIP4Addr(&iface)
-		if err == nil && ip.Equal(addr) {
+		err := GetIfaceIP4AddrMatch(&iface, ip)
+		if err == nil {
 			return &iface, nil
 		}
 	}