go.mod: github.com/j-keck/arping v1.0.1

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2021-03-12 17:36:27 +01:00
parent f4d2925220
commit 2eac102887
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
6 changed files with 44 additions and 4 deletions

2
go.mod
View File

@ -13,7 +13,7 @@ require (
github.com/d2g/dhcp4client v1.0.0
github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5
github.com/godbus/dbus/v5 v5.0.3
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56
github.com/j-keck/arping v1.0.1
github.com/mattn/go-shellwords v1.0.11
github.com/onsi/ginkgo v1.13.0
github.com/onsi/gomega v1.10.3

3
go.sum
View File

@ -332,8 +332,9 @@ github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ
github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56 h1:742eGXur0715JMq73aD95/FU0XpVKXqNuTnEfXsLOYQ=
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
github.com/j-keck/arping v1.0.1 h1:XrO9juQieAQHE7DlwT7zFLUK2u3Oi/4Uz2B3ZTxvhxg=
github.com/j-keck/arping v1.0.1/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw=
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=

View File

@ -1,3 +1,5 @@
[![pkg.go.dev](https://godoc.org/github.com/j-keck/arping?status.svg)](https://pkg.go.dev/github.com/j-keck/arping)
# arping
arping is a native go library to ping a host per arp datagram, or query a host mac address

View File

@ -65,6 +65,7 @@ import (
"net"
"os"
"time"
"fmt"
)
var (
@ -77,6 +78,10 @@ var (
// Ping sends an arp ping to 'dstIP'
func Ping(dstIP net.IP) (net.HardwareAddr, time.Duration, error) {
if err := validateIP(dstIP); err != nil {
return nil, 0, err
}
iface, err := findUsableInterfaceForNetwork(dstIP)
if err != nil {
return nil, 0, err
@ -86,6 +91,10 @@ func Ping(dstIP net.IP) (net.HardwareAddr, time.Duration, error) {
// PingOverIfaceByName sends an arp ping over interface name 'ifaceName' to 'dstIP'
func PingOverIfaceByName(dstIP net.IP, ifaceName string) (net.HardwareAddr, time.Duration, error) {
if err := validateIP(dstIP); err != nil {
return nil, 0, err
}
iface, err := net.InterfaceByName(ifaceName)
if err != nil {
return nil, 0, err
@ -95,6 +104,10 @@ func PingOverIfaceByName(dstIP net.IP, ifaceName string) (net.HardwareAddr, time
// PingOverIface 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)
if err != nil {
@ -114,7 +127,7 @@ func PingOverIface(dstIP net.IP, iface net.Interface) (net.HardwareAddr, time.Du
duration time.Duration
err error
}
pingResultChan := make(chan PingResult)
pingResultChan := make(chan PingResult, 1)
go func() {
// send arp request
@ -149,12 +162,17 @@ func PingOverIface(dstIP net.IP, iface net.Interface) (net.HardwareAddr, time.Du
case pingResult := <-pingResultChan:
return pingResult.mac, pingResult.duration, pingResult.err
case <-time.After(timeout):
deinitialize()
return nil, 0, ErrTimeout
}
}
// GratuitousArp sends an gratuitous arp from 'srcIP'
func GratuitousArp(srcIP net.IP) error {
if err := validateIP(srcIP); err != nil {
return err
}
iface, err := findUsableInterfaceForNetwork(srcIP)
if err != nil {
return err
@ -164,6 +182,10 @@ func GratuitousArp(srcIP net.IP) error {
// GratuitousArpOverIfaceByName sends an gratuitous arp over interface name 'ifaceName' from 'srcIP'
func GratuitousArpOverIfaceByName(srcIP net.IP, ifaceName string) error {
if err := validateIP(srcIP); err != nil {
return err
}
iface, err := net.InterfaceByName(ifaceName)
if err != nil {
return err
@ -173,6 +195,10 @@ func GratuitousArpOverIfaceByName(srcIP net.IP, ifaceName string) error {
// GratuitousArpOverIface sends an gratuitous arp over interface 'iface' from 'srcIP'
func GratuitousArpOverIface(srcIP net.IP, iface net.Interface) error {
if err := validateIP(srcIP); err != nil {
return err
}
srcMac := iface.HardwareAddr
broadcastMac := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
request := newArpRequest(srcMac, srcIP, broadcastMac, srcIP)
@ -195,3 +221,11 @@ func EnableVerboseLog() {
func SetTimeout(t time.Duration) {
timeout = t
}
func validateIP(ip net.IP) error {
// ip must be a valid V4 address
if len(ip.To4()) != net.IPv4len {
return fmt.Errorf("not a valid v4 Address: %s", ip)
}
return nil
}

3
vendor/github.com/j-keck/arping/go.mod generated vendored Normal file
View File

@ -0,0 +1,3 @@
module github.com/j-keck/arping
go 1.12

2
vendor/modules.txt vendored
View File

@ -78,7 +78,7 @@ github.com/gogo/protobuf/proto
github.com/gogo/protobuf/protoc-gen-gogo/descriptor
# github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e
github.com/golang/groupcache/lru
# github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56
# github.com/j-keck/arping v1.0.1
## explicit
github.com/j-keck/arping
# github.com/mattn/go-shellwords v1.0.11