diff --git a/arping.go b/arping.go index b305731..b689be2 100644 --- a/arping.go +++ b/arping.go @@ -102,14 +102,14 @@ func PingOverIfaceByName(dstIP net.IP, ifaceName string) (net.HardwareAddr, time return PingOverIface(dstIP, *iface) } -// PingOverIface sends an arp ping over interface 'iface' to 'dstIP' +// PingOverIface forcedly sends an arp ping over interface 'iface' to 'dstIP' func PingOverIface(dstIP net.IP, iface net.Interface) (net.HardwareAddr, time.Duration, error) { if err := validateIP(dstIP); err != nil { return nil, 0, err } srcMac := iface.HardwareAddr - srcIP, err := findIPInNetworkFromIface(dstIP, iface) + srcIP, err := findIPInNetworkFromIface(dstIP, iface, true) if err != nil { return nil, 0, err } diff --git a/cmd/arping/main.go b/cmd/arping/main.go index 8c1fb77..fc2cdcd 100644 --- a/cmd/arping/main.go +++ b/cmd/arping/main.go @@ -24,10 +24,11 @@ package main import ( "flag" "fmt" - "github.com/j-keck/arping" "net" "os" "time" + + "github.com/fzu-huang/arping" ) var ( diff --git a/go.mod b/go.mod index 04c772b..17ec164 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module github.com/j-keck/arping +module github.com/fzu-huang/arping -go 1.12 +go 1.17 diff --git a/netutils.go b/netutils.go index 2b707d3..6885f71 100644 --- a/netutils.go +++ b/netutils.go @@ -6,20 +6,33 @@ import ( "net" ) -func findIPInNetworkFromIface(dstIP net.IP, iface net.Interface) (net.IP, error) { +// findIPInNetworkFromIface find an ip from iface as src +func findIPInNetworkFromIface(dstIP net.IP, iface net.Interface, ignoreNet bool) (net.IP, error) { addrs, err := iface.Addrs() if err != nil { return nil, err } - for _, a := range addrs { + if len(addrs) == 0 { + return nil, fmt.Errorf("iface: '%s' do not contains any ip", iface.Name) + } + + var firstIP net.IP + for i, a := range addrs { if ipnet, ok := a.(*net.IPNet); ok { if ipnet.Contains(dstIP) { return ipnet.IP, nil } + if i == 0 { + firstIP = ipnet.IP + } } } + + if ignoreNet { + return firstIP, nil + } return nil, fmt.Errorf("iface: '%s' can't reach ip: '%s'", iface.Name, dstIP) } @@ -35,7 +48,7 @@ func findUsableInterfaceForNetwork(dstIP net.IP) (*net.Interface, error) { } hasAddressInNetwork := func(iface net.Interface) bool { - if _, err := findIPInNetworkFromIface(dstIP, iface); err != nil { + if _, err := findIPInNetworkFromIface(dstIP, iface, false); err != nil { return false } return true