From 7473a7604ac351f105da1a740d0a08fb9ea4bd7d Mon Sep 17 00:00:00 2001 From: mangoyhuang Date: Thu, 27 Apr 2023 10:55:50 +0800 Subject: [PATCH 1/9] set PingOverIface forcedly, add option to ignore ipnet check --- arping.go | 4 ++-- netutils.go | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) 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/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 From b3881a7909d9394e3af64caf2bef43301c56d588 Mon Sep 17 00:00:00 2001 From: mangoyhuang Date: Thu, 27 Apr 2023 11:01:58 +0800 Subject: [PATCH 2/9] update go mod --- go.mod | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 929de1889816fdf3e58f3b1051dc1e702e06560a Mon Sep 17 00:00:00 2001 From: mangoyhuang Date: Thu, 27 Apr 2023 17:39:17 +0800 Subject: [PATCH 3/9] fix import --- cmd/arping/main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 ( From 3d0899d8f53276865f8141338914e5ceb1be27e2 Mon Sep 17 00:00:00 2001 From: mangoyhuang Date: Thu, 24 Oct 2024 14:47:01 +0800 Subject: [PATCH 4/9] arp ping support specific srcIP --- arping.go | 103 +++++++++++++++++++++++---------------------- arping_test.go | 6 +-- cmd/arping/main.go | 25 ++++++----- 3 files changed, 67 insertions(+), 67 deletions(-) diff --git a/arping.go b/arping.go index b689be2..f310944 100644 --- a/arping.go +++ b/arping.go @@ -2,60 +2,57 @@ // // The currently supported platforms are: Linux and BSD. // -// // The library requires raw socket access. So it must run as root, or with appropriate capabilities under linux: // `sudo setcap cap_net_raw+ep `. // -// // Examples: // -// ping a host: -// ------------ -// package main -// import ("fmt"; "github.com/j-keck/arping"; "net") -// -// func main(){ -// dstIP := net.ParseIP("192.168.1.1") -// if hwAddr, duration, err := arping.Ping(dstIP); err != nil { -// fmt.Println(err) -// } else { -// fmt.Printf("%s (%s) %d usec\n", dstIP, hwAddr, duration/1000) -// } -// } +// ping a host: +// ------------ +// package main +// import ("fmt"; "github.com/j-keck/arping"; "net") // +// func main(){ +// dstIP := net.ParseIP("192.168.1.1") +// if hwAddr, duration, err := arping.Ping(dstIP); err != nil { +// fmt.Println(err) +// } else { +// fmt.Printf("%s (%s) %d usec\n", dstIP, hwAddr, duration/1000) +// } +// } // -// resolve mac address: -// -------------------- -// package main -// import ("fmt"; "github.com/j-keck/arping"; "net") // -// func main(){ -// dstIP := net.ParseIP("192.168.1.1") -// if hwAddr, _, err := arping.Ping(dstIP); err != nil { -// fmt.Println(err) -// } else { -// fmt.Printf("%s is at %s\n", dstIP, hwAddr) -// } -// } +// resolve mac address: +// -------------------- +// package main +// import ("fmt"; "github.com/j-keck/arping"; "net") // +// func main(){ +// dstIP := net.ParseIP("192.168.1.1") +// if hwAddr, _, err := arping.Ping(dstIP); err != nil { +// fmt.Println(err) +// } else { +// fmt.Printf("%s is at %s\n", dstIP, hwAddr) +// } +// } // -// check if host is online: -// ------------------------ -// package main -// import ("fmt"; "github.com/j-keck/arping"; "net") // -// func main(){ -// dstIP := net.ParseIP("192.168.1.1") -// _, _, err := arping.Ping(dstIP) -// if err == arping.ErrTimeout { -// fmt.Println("offline") -// }else if err != nil { -// fmt.Println(err.Error()) -// }else{ -// fmt.Println("online") -// } -// } +// check if host is online: +// ------------------------ +// package main +// import ("fmt"; "github.com/j-keck/arping"; "net") // +// func main(){ +// dstIP := net.ParseIP("192.168.1.1") +// _, _, err := arping.Ping(dstIP) +// if err == arping.ErrTimeout { +// fmt.Println("offline") +// }else if err != nil { +// fmt.Println(err.Error()) +// }else{ +// fmt.Println("online") +// } +// } package arping import ( @@ -77,7 +74,7 @@ var ( ) // Ping sends an arp ping to 'dstIP' -func Ping(dstIP net.IP) (net.HardwareAddr, time.Duration, error) { +func Ping(dstIP, srcIP net.IP) (net.HardwareAddr, time.Duration, error) { if err := validateIP(dstIP); err != nil { return nil, 0, err } @@ -86,11 +83,11 @@ func Ping(dstIP net.IP) (net.HardwareAddr, time.Duration, error) { if err != nil { return nil, 0, err } - return PingOverIface(dstIP, *iface) + return PingOverIface(dstIP, srcIP, *iface) } // PingOverIfaceByName sends an arp ping over interface name 'ifaceName' to 'dstIP' -func PingOverIfaceByName(dstIP net.IP, ifaceName string) (net.HardwareAddr, time.Duration, error) { +func PingOverIfaceByName(dstIP, srcIP net.IP, ifaceName string) (net.HardwareAddr, time.Duration, error) { if err := validateIP(dstIP); err != nil { return nil, 0, err } @@ -99,19 +96,23 @@ func PingOverIfaceByName(dstIP net.IP, ifaceName string) (net.HardwareAddr, time if err != nil { return nil, 0, err } - return PingOverIface(dstIP, *iface) + return PingOverIface(dstIP, srcIP, *iface) } // 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 { +func PingOverIface(dstIP, srcIP net.IP, iface net.Interface) (net.HardwareAddr, time.Duration, error) { + err := validateIP(dstIP) + if err != nil { return nil, 0, err } srcMac := iface.HardwareAddr - srcIP, err := findIPInNetworkFromIface(dstIP, iface, true) - if err != nil { - return nil, 0, err + + if srcIP == nil { + srcIP, err = findIPInNetworkFromIface(dstIP, iface, true) + if err != nil { + return nil, 0, err + } } broadcastMac := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff} diff --git a/arping_test.go b/arping_test.go index cabf4f5..e45be70 100644 --- a/arping_test.go +++ b/arping_test.go @@ -11,7 +11,7 @@ import ( func TestPingWithInvalidIP(t *testing.T) { ip := net.ParseIP("invalid") - _, _, err := Ping(ip) + _, _, err := Ping(ip, nil) if err == nil { t.Error("error expected") } @@ -22,7 +22,7 @@ func TestPingWithInvalidIP(t *testing.T) { func TestPingWithV6IP(t *testing.T) { ip := net.ParseIP("fe80::e2cb:4eff:fed5:ca4e") - _, _, err := Ping(ip) + _, _, err := Ping(ip, nil) if err == nil { t.Error("error expected") } @@ -58,7 +58,7 @@ func TestGoroutinesDoesNotLeak(t *testing.T) { spawnNumGoroutines := 5 for i := 0; i < spawnNumGoroutines; i++ { - _, _, err := Ping(ip) + _, _, err := Ping(ip, nil) if err != ErrTimeout { t.Fatalf("timeout error expected, but not received - received err: %v", err) } diff --git a/cmd/arping/main.go b/cmd/arping/main.go index fc2cdcd..fe12d75 100644 --- a/cmd/arping/main.go +++ b/cmd/arping/main.go @@ -1,24 +1,23 @@ -// // command line arping utility which use the 'arping' library // // this utility need raw socket access, please run it -// under FreeBSD: as root -// under Linux: as root or with 'cap_net_raw' permission: sudo setcap cap_net_raw+ep // +// under FreeBSD: as root +// under Linux: as root or with 'cap_net_raw' permission: sudo setcap cap_net_raw+ep // // options: -// -h: print help and exit -// -v: verbose output -// -U: unsolicited/gratuitous ARP mode -// -i: interface name to use -// -t: timeout - duration with unit - such as 100ms, 500ms, 1s ... // +// -h: print help and exit +// -v: verbose output +// -U: unsolicited/gratuitous ARP mode +// -i: interface name to use +// -t: timeout - duration with unit - such as 100ms, 500ms, 1s ... // // exit code: -// 0: target online -// 1: target offline -// 2: error occurred - see command output // +// 0: target online +// 1: target offline +// 2: error occurred - see command output package main import ( @@ -67,9 +66,9 @@ func main() { } } else { if len(*ifaceNameFlag) > 0 { - hwAddr, durationNanos, err = arping.PingOverIfaceByName(dstIP, *ifaceNameFlag) + hwAddr, durationNanos, err = arping.PingOverIfaceByName(dstIP, nil, *ifaceNameFlag) } else { - hwAddr, durationNanos, err = arping.Ping(dstIP) + hwAddr, durationNanos, err = arping.Ping(dstIP, nil) } } From f3142e772c808494b73a719c0e6104fca8688258 Mon Sep 17 00:00:00 2001 From: mangoyhuang Date: Fri, 25 Oct 2024 14:26:19 +0800 Subject: [PATCH 5/9] support DAD arping --- arp_datagram.go | 5 +++++ arping.go | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/arp_datagram.go b/arp_datagram.go index 1443bc2..07c1abb 100644 --- a/arp_datagram.go +++ b/arp_datagram.go @@ -77,6 +77,11 @@ func (datagram arpDatagram) IsResponseOf(request arpDatagram) bool { bytes.Equal(request.tpa, datagram.spa) } +func (datagram arpDatagram) IsDuplicateRequestOf(request arpDatagram) bool { + return datagram.oper == requestOper && bytes.Equal(request.spa, datagram.tpa) && + bytes.Equal(request.tpa, datagram.tpa) +} + func parseArpDatagram(buffer []byte) arpDatagram { var datagram arpDatagram diff --git a/arping.go b/arping.go index f310944..57b411b 100644 --- a/arping.go +++ b/arping.go @@ -146,6 +146,17 @@ func PingOverIface(dstIP, srcIP net.IP, iface net.Interface) (net.HardwareAddr, return } + if srcIP.Equal(net.IPv4zero) || srcIP.Equal(net.IPv6zero) { + // if arping with src IP as IPv4zero, we expect no response but request from dst IP + if response.IsDuplicateRequestOf(request) { + duration := receiveTime.Sub(sendTime) + verboseLog.Printf("process received arp: srcIP: '%s', srcMac: '%s'\n", + response.SenderIP(), response.SenderMac()) + pingResultChan <- PingResult{response.SenderMac(), duration, err} + return + } + } + if response.IsResponseOf(request) { duration := receiveTime.Sub(sendTime) verboseLog.Printf("process received arp: srcIP: '%s', srcMac: '%s'\n", From 29c2673c17624a28d2d818a3fd4e16139a516ef6 Mon Sep 17 00:00:00 2001 From: mangoyhuang Date: Fri, 25 Oct 2024 15:03:44 +0800 Subject: [PATCH 6/9] fix DAD arping packet check --- arp_datagram.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arp_datagram.go b/arp_datagram.go index 07c1abb..2a13f32 100644 --- a/arp_datagram.go +++ b/arp_datagram.go @@ -78,7 +78,7 @@ func (datagram arpDatagram) IsResponseOf(request arpDatagram) bool { } func (datagram arpDatagram) IsDuplicateRequestOf(request arpDatagram) bool { - return datagram.oper == requestOper && bytes.Equal(request.spa, datagram.tpa) && + return datagram.oper == requestOper && bytes.Equal(request.tpa, datagram.spa) && bytes.Equal(request.tpa, datagram.tpa) } From 852197bcaedb292d782e5db74532f6b14b2d8c2b Mon Sep 17 00:00:00 2001 From: mangoyhuang Date: Wed, 30 Oct 2024 16:27:54 +0800 Subject: [PATCH 7/9] add option to ignore address match check --- arp_datagram.go | 11 +++++++++++ arping.go | 21 +++++++++++++++------ arping_test.go | 6 +++--- cmd/arping/main.go | 4 ++-- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/arp_datagram.go b/arp_datagram.go index 2a13f32..34c6969 100644 --- a/arp_datagram.go +++ b/arp_datagram.go @@ -77,11 +77,22 @@ func (datagram arpDatagram) IsResponseOf(request arpDatagram) bool { bytes.Equal(request.tpa, datagram.spa) } +func (datagram arpDatagram) IsResponseOfTarget(request arpDatagram) bool { + return datagram.oper == responseOper && bytes.Equal(request.tpa, datagram.spa) +} + +// IsDuplicateRequestOf case: Cisco switch will re-send an ARP request when it received a DAD-ARP request func (datagram arpDatagram) IsDuplicateRequestOf(request arpDatagram) bool { return datagram.oper == requestOper && bytes.Equal(request.tpa, datagram.spa) && bytes.Equal(request.tpa, datagram.tpa) } +// IsResponseOfDADRequest case: H3C switch will reply DAD ARP request when it received a DAD-ARP request +func (datagram arpDatagram) IsResponseOfDADRequest(request arpDatagram) bool { + return datagram.oper == responseOper && bytes.Equal(request.tpa, datagram.tpa) && + bytes.Equal(request.tpa, datagram.spa) +} + func parseArpDatagram(buffer []byte) arpDatagram { var datagram arpDatagram diff --git a/arping.go b/arping.go index 57b411b..d7bbd36 100644 --- a/arping.go +++ b/arping.go @@ -74,7 +74,7 @@ var ( ) // Ping sends an arp ping to 'dstIP' -func Ping(dstIP, srcIP net.IP) (net.HardwareAddr, time.Duration, error) { +func Ping(dstIP, srcIP net.IP, ignoreAddrMatch bool) (net.HardwareAddr, time.Duration, error) { if err := validateIP(dstIP); err != nil { return nil, 0, err } @@ -83,11 +83,11 @@ func Ping(dstIP, srcIP net.IP) (net.HardwareAddr, time.Duration, error) { if err != nil { return nil, 0, err } - return PingOverIface(dstIP, srcIP, *iface) + return PingOverIface(dstIP, srcIP, *iface, ignoreAddrMatch) } // PingOverIfaceByName sends an arp ping over interface name 'ifaceName' to 'dstIP' -func PingOverIfaceByName(dstIP, srcIP net.IP, ifaceName string) (net.HardwareAddr, time.Duration, error) { +func PingOverIfaceByName(dstIP, srcIP net.IP, ifaceName string, ignoreAddrMatch bool) (net.HardwareAddr, time.Duration, error) { if err := validateIP(dstIP); err != nil { return nil, 0, err } @@ -96,11 +96,12 @@ func PingOverIfaceByName(dstIP, srcIP net.IP, ifaceName string) (net.HardwareAdd if err != nil { return nil, 0, err } - return PingOverIface(dstIP, srcIP, *iface) + return PingOverIface(dstIP, srcIP, *iface, ignoreAddrMatch) } // PingOverIface forcedly sends an arp ping over interface 'iface' to 'dstIP' -func PingOverIface(dstIP, srcIP net.IP, iface net.Interface) (net.HardwareAddr, time.Duration, error) { +func PingOverIface(dstIP, srcIP net.IP, iface net.Interface, ignoreAddrMatch bool) ( + net.HardwareAddr, time.Duration, error) { err := validateIP(dstIP) if err != nil { return nil, 0, err @@ -146,9 +147,17 @@ func PingOverIface(dstIP, srcIP net.IP, iface net.Interface) (net.HardwareAddr, return } + if ignoreAddrMatch && response.IsResponseOfTarget(request) { + duration := receiveTime.Sub(sendTime) + verboseLog.Printf("process received arp: srcIP: '%s', srcMac: '%s'\n", + response.SenderIP(), response.SenderMac()) + pingResultChan <- PingResult{response.SenderMac(), duration, err} + return + } + if srcIP.Equal(net.IPv4zero) || srcIP.Equal(net.IPv6zero) { // if arping with src IP as IPv4zero, we expect no response but request from dst IP - if response.IsDuplicateRequestOf(request) { + if response.IsDuplicateRequestOf(request) || response.IsResponseOfDADRequest(request) { duration := receiveTime.Sub(sendTime) verboseLog.Printf("process received arp: srcIP: '%s', srcMac: '%s'\n", response.SenderIP(), response.SenderMac()) diff --git a/arping_test.go b/arping_test.go index e45be70..30210f9 100644 --- a/arping_test.go +++ b/arping_test.go @@ -11,7 +11,7 @@ import ( func TestPingWithInvalidIP(t *testing.T) { ip := net.ParseIP("invalid") - _, _, err := Ping(ip, nil) + _, _, err := Ping(ip, nil, false) if err == nil { t.Error("error expected") } @@ -22,7 +22,7 @@ func TestPingWithInvalidIP(t *testing.T) { func TestPingWithV6IP(t *testing.T) { ip := net.ParseIP("fe80::e2cb:4eff:fed5:ca4e") - _, _, err := Ping(ip, nil) + _, _, err := Ping(ip, nil, false) if err == nil { t.Error("error expected") } @@ -58,7 +58,7 @@ func TestGoroutinesDoesNotLeak(t *testing.T) { spawnNumGoroutines := 5 for i := 0; i < spawnNumGoroutines; i++ { - _, _, err := Ping(ip, nil) + _, _, err := Ping(ip, nil, false) if err != ErrTimeout { t.Fatalf("timeout error expected, but not received - received err: %v", err) } diff --git a/cmd/arping/main.go b/cmd/arping/main.go index fe12d75..898d867 100644 --- a/cmd/arping/main.go +++ b/cmd/arping/main.go @@ -66,9 +66,9 @@ func main() { } } else { if len(*ifaceNameFlag) > 0 { - hwAddr, durationNanos, err = arping.PingOverIfaceByName(dstIP, nil, *ifaceNameFlag) + hwAddr, durationNanos, err = arping.PingOverIfaceByName(dstIP, nil, *ifaceNameFlag, false) } else { - hwAddr, durationNanos, err = arping.Ping(dstIP, nil) + hwAddr, durationNanos, err = arping.Ping(dstIP, nil, false) } } From c0fcc861c9eb18fad93422a251410a2b1f9df217 Mon Sep 17 00:00:00 2001 From: mangoyhuang Date: Wed, 30 Oct 2024 16:53:33 +0800 Subject: [PATCH 8/9] fix dad arp check --- arp_datagram.go | 15 ++++++++------- arping.go | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/arp_datagram.go b/arp_datagram.go index 34c6969..c715ac0 100644 --- a/arp_datagram.go +++ b/arp_datagram.go @@ -73,8 +73,8 @@ func (datagram arpDatagram) SenderMac() net.HardwareAddr { } func (datagram arpDatagram) IsResponseOf(request arpDatagram) bool { - return datagram.oper == responseOper && bytes.Equal(request.spa, datagram.tpa) && - bytes.Equal(request.tpa, datagram.spa) + return datagram.oper == responseOper && bytes.Equal(request.tpa, datagram.spa) && + bytes.Equal(request.spa, datagram.tpa) } func (datagram arpDatagram) IsResponseOfTarget(request arpDatagram) bool { @@ -82,15 +82,16 @@ func (datagram arpDatagram) IsResponseOfTarget(request arpDatagram) bool { } // IsDuplicateRequestOf case: Cisco switch will re-send an ARP request when it received a DAD-ARP request -func (datagram arpDatagram) IsDuplicateRequestOf(request arpDatagram) bool { +func (datagram arpDatagram) IsDuplicateRequestOf(request arpDatagram, ignoreCheck bool) bool { return datagram.oper == requestOper && bytes.Equal(request.tpa, datagram.spa) && - bytes.Equal(request.tpa, datagram.tpa) + (!ignoreCheck && bytes.Equal(request.tpa, datagram.tpa)) } // IsResponseOfDADRequest case: H3C switch will reply DAD ARP request when it received a DAD-ARP request -func (datagram arpDatagram) IsResponseOfDADRequest(request arpDatagram) bool { - return datagram.oper == responseOper && bytes.Equal(request.tpa, datagram.tpa) && - bytes.Equal(request.tpa, datagram.spa) +func (datagram arpDatagram) IsResponseOfDADRequest(request arpDatagram, ignoreCheck bool) bool { + return datagram.oper == responseOper && bytes.Equal(request.tpa, datagram.spa) && + (!ignoreCheck && bytes.Equal(request.tpa, datagram.tpa)) + } func parseArpDatagram(buffer []byte) arpDatagram { diff --git a/arping.go b/arping.go index d7bbd36..4b79cf7 100644 --- a/arping.go +++ b/arping.go @@ -157,7 +157,8 @@ func PingOverIface(dstIP, srcIP net.IP, iface net.Interface, ignoreAddrMatch boo if srcIP.Equal(net.IPv4zero) || srcIP.Equal(net.IPv6zero) { // if arping with src IP as IPv4zero, we expect no response but request from dst IP - if response.IsDuplicateRequestOf(request) || response.IsResponseOfDADRequest(request) { + if response.IsDuplicateRequestOf(request, ignoreAddrMatch) || + response.IsResponseOfDADRequest(request, ignoreAddrMatch) { duration := receiveTime.Sub(sendTime) verboseLog.Printf("process received arp: srcIP: '%s', srcMac: '%s'\n", response.SenderIP(), response.SenderMac()) From b4c22970dc663f4f428c665c7310e1bbf6dda080 Mon Sep 17 00:00:00 2001 From: mangoyhuang Date: Wed, 30 Oct 2024 17:23:57 +0800 Subject: [PATCH 9/9] fix bugs --- arp_datagram.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/arp_datagram.go b/arp_datagram.go index c715ac0..162a76c 100644 --- a/arp_datagram.go +++ b/arp_datagram.go @@ -84,14 +84,13 @@ func (datagram arpDatagram) IsResponseOfTarget(request arpDatagram) bool { // IsDuplicateRequestOf case: Cisco switch will re-send an ARP request when it received a DAD-ARP request func (datagram arpDatagram) IsDuplicateRequestOf(request arpDatagram, ignoreCheck bool) bool { return datagram.oper == requestOper && bytes.Equal(request.tpa, datagram.spa) && - (!ignoreCheck && bytes.Equal(request.tpa, datagram.tpa)) + (ignoreCheck || bytes.Equal(request.tpa, datagram.tpa)) } // IsResponseOfDADRequest case: H3C switch will reply DAD ARP request when it received a DAD-ARP request func (datagram arpDatagram) IsResponseOfDADRequest(request arpDatagram, ignoreCheck bool) bool { return datagram.oper == responseOper && bytes.Equal(request.tpa, datagram.spa) && - (!ignoreCheck && bytes.Equal(request.tpa, datagram.tpa)) - + (ignoreCheck || bytes.Equal(request.tpa, datagram.tpa)) } func parseArpDatagram(buffer []byte) arpDatagram {