refactor codebase and fix bugs
- merge dante.go and dante_control.go into single dante.go - consolidate buildDantePacket and buildDantePacket28 into one function - fix broken comparison logic in SetDanteClockMaster - split ARP parsing into platform-specific files with build tags - implement Linux ARP table parsing via /proc/net/arp - run gofmt on all files Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
62
arp_darwin.go
Normal file
62
arp_darwin.go
Normal file
@@ -0,0 +1,62 @@
|
||||
//go:build darwin
|
||||
|
||||
package tendrils
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"log"
|
||||
"net"
|
||||
"os/exec"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func (t *Tendrils) parseARPTable() []arpEntry {
|
||||
cmd := exec.Command("arp", "-an")
|
||||
output, err := cmd.Output()
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
var entries []arpEntry
|
||||
scanner := bufio.NewScanner(strings.NewReader(string(output)))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
if strings.Contains(line, "permanent") {
|
||||
continue
|
||||
}
|
||||
|
||||
fields := strings.Fields(line)
|
||||
if len(fields) < 6 {
|
||||
continue
|
||||
}
|
||||
|
||||
ipStr := strings.Trim(fields[1], "()")
|
||||
ip := net.ParseIP(ipStr)
|
||||
if ip == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
macStr := fields[3]
|
||||
if macStr == "(incomplete)" {
|
||||
continue
|
||||
}
|
||||
|
||||
macStr = normalizeMACAddress(macStr)
|
||||
mac, err := net.ParseMAC(macStr)
|
||||
if err != nil {
|
||||
log.Printf("[arp] failed to parse MAC %q for IP %s: %v", macStr, ipStr, err)
|
||||
continue
|
||||
}
|
||||
|
||||
ifaceName := fields[5]
|
||||
|
||||
entries = append(entries, arpEntry{
|
||||
ip: ip,
|
||||
mac: mac,
|
||||
iface: ifaceName,
|
||||
})
|
||||
}
|
||||
|
||||
return entries
|
||||
}
|
||||
Reference in New Issue
Block a user