Initial commit
This commit is contained in:
commit
404792c2eb
4 changed files with 174 additions and 0 deletions
61
validator/arp.go
Normal file
61
validator/arp.go
Normal file
|
@ -0,0 +1,61 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var ARPTable string = "/proc/net/arp"
|
||||
|
||||
type ARPEntry struct {
|
||||
IP net.IP
|
||||
HWType int
|
||||
Flags int
|
||||
HWAddress net.HardwareAddr
|
||||
Mask string
|
||||
Device string
|
||||
}
|
||||
|
||||
func ARPAnalyze() (ents []ARPEntry, err error) {
|
||||
var content []byte
|
||||
if content, err = ioutil.ReadFile(ARPTable); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, line := range strings.Split(string(content), "\n") {
|
||||
f := strings.Fields(line)
|
||||
if len(f) > 5 {
|
||||
var e ARPEntry
|
||||
|
||||
if _, err := fmt.Sscanf(f[1], "0x%x", &e.HWType); err != nil {
|
||||
continue
|
||||
}
|
||||
if _, err := fmt.Sscanf(f[2], "0x%x", &e.Flags); err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
e.IP = net.ParseIP(f[0])
|
||||
if e.HWAddress, err = net.ParseMAC(f[3]); err != nil {
|
||||
continue
|
||||
}
|
||||
e.Mask = f[4]
|
||||
e.Device = f[5]
|
||||
|
||||
ents = append(ents, e)
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func ARPContainsIP(ents []ARPEntry, ip net.IP) *ARPEntry {
|
||||
for i, e := range ents {
|
||||
if e.IP.Equal(ip) && e.Flags == 2 {
|
||||
return &ents[i]
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Reference in a new issue