64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package arp
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// ARPEntry represents an entry in the ARP table
|
|
type ARPEntry struct {
|
|
IP net.IP
|
|
HWType int
|
|
Flags int
|
|
HWAddress net.HardwareAddr
|
|
Mask string
|
|
Device string
|
|
}
|
|
|
|
// parseARPTable reads and parses ARP table from /proc/net/arp format
|
|
func parseARPTable(path string) ([]ARPEntry, error) {
|
|
var entries []ARPEntry
|
|
|
|
content, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return entries, err
|
|
}
|
|
|
|
for _, line := range strings.Split(string(content), "\n") {
|
|
fields := strings.Fields(line)
|
|
if len(fields) > 5 {
|
|
var entry ARPEntry
|
|
|
|
// Parse HWType (hex format)
|
|
if _, err := fmt.Sscanf(fields[1], "0x%x", &entry.HWType); err != nil {
|
|
continue
|
|
}
|
|
|
|
// Parse Flags (hex format)
|
|
if _, err := fmt.Sscanf(fields[2], "0x%x", &entry.Flags); err != nil {
|
|
continue
|
|
}
|
|
|
|
// Parse IP address
|
|
entry.IP = net.ParseIP(fields[0])
|
|
if entry.IP == nil {
|
|
continue
|
|
}
|
|
|
|
// Parse MAC address
|
|
entry.HWAddress, err = net.ParseMAC(fields[3])
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
entry.Mask = fields[4]
|
|
entry.Device = fields[5]
|
|
|
|
entries = append(entries, entry)
|
|
}
|
|
}
|
|
|
|
return entries, nil
|
|
}
|