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
6 changed files with 44 additions and 4 deletions

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
}