diff --git a/net/arp.go b/net/arp.go index de97b67f..5fac79b2 100644 --- a/net/arp.go +++ b/net/arp.go @@ -33,9 +33,17 @@ func ArpUpdate(iface string) (ArpTable, error) { for _, line := range strings.Split(output, "\n") { m := ArpTableParser.FindStringSubmatch(line) if len(m) == ArpTableTokens { - address := m[ArpTableTokenIndex[0]] - mac := m[ArpTableTokenIndex[1]] - ifname := m[ArpTableTokenIndex[2]] + ipIndex := ArpTableTokenIndex[0] + hwIndex := ArpTableTokenIndex[1] + ifIndex := ArpTableTokenIndex[2] + + address := m[ipIndex] + mac := m[hwIndex] + ifname := iface + + if ifIndex != -1 { + ifname = m[ifIndex] + } if ifname == iface { newTable[address] = mac diff --git a/net/arp_parser_darwin.go b/net/arp_parser_darwin.go index 45eaa28f..0c6b6a8b 100644 --- a/net/arp_parser_darwin.go +++ b/net/arp_parser_darwin.go @@ -4,6 +4,6 @@ import "regexp" var ArpTableParser = regexp.MustCompile("^[^\\d\\.]+([\\d\\.]+).+\\s+([a-f0-9:]{11,17})\\s+on\\s+([^\\s]+)\\s+.+$") var ArpTableTokens = 4 -var ArpTableTokenIndex = []uint{1, 2, 3} +var ArpTableTokenIndex = []int{1, 2, 3} var ArpCmd = "arp" var ArpCmdOpts = []string{"-a", "-n"} diff --git a/net/arp_parser_linux.go b/net/arp_parser_linux.go index fa81c8fa..201969b7 100644 --- a/net/arp_parser_linux.go +++ b/net/arp_parser_linux.go @@ -4,6 +4,6 @@ import "regexp" var ArpTableParser = regexp.MustCompile("^([\\d\\.]+)\\s+dev\\s+(\\w+)\\s+\\w+\\s+([a-f0-9:]{17})\\s+\\w+$") var ArpTableTokens = 4 -var ArpTableTokenIndex = []uint{1, 3, 2} +var ArpTableTokenIndex = []int{1, 3, 2} var ArpCmd = "ip" var ArpCmdOpts = []string{"neigh"} diff --git a/net/arp_parser_windows.go b/net/arp_parser_windows.go new file mode 100644 index 00000000..8a6cf9bd --- /dev/null +++ b/net/arp_parser_windows.go @@ -0,0 +1,9 @@ +package net + +import "regexp" + +var ArpTableParser = regexp.MustCompile("^[^\\d\\.]+([\\d\\.]+).+\\s+([a-f0-9\\-]{11,17})\\s+.+$") +var ArpTableTokens = 3 +var ArpTableTokenIndex = []int{1, 2, -1} +var ArpCmd = "arp" +var ArpCmdOpts = []string{"-a"}