mirror of
https://github.com/bjdgyc/anylink.git
synced 2025-08-08 00:31:17 +08:00
增加 macvtap 模式支持
This commit is contained in:
@@ -4,6 +4,8 @@ import (
|
||||
"net"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/bjdgyc/anylink/pkg/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -16,7 +18,7 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
table = make(map[string]*Addr)
|
||||
table = make(map[string]*Addr, 128)
|
||||
tableMu sync.RWMutex
|
||||
)
|
||||
|
||||
@@ -40,25 +42,25 @@ func Lookup(ip net.IP, onlyTable bool) *Addr {
|
||||
|
||||
// Add adds a IP-MAC map to a runtime ARP table.
|
||||
func tableLookup(ip net.IP) *Addr {
|
||||
tableMu.Lock()
|
||||
tableMu.RLock()
|
||||
addr := table[ip.To4().String()]
|
||||
tableMu.Unlock()
|
||||
tableMu.RUnlock()
|
||||
if addr == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 判断老化过期时间
|
||||
tsub := time.Since(addr.disTime)
|
||||
tSub := utils.NowSec().Sub(addr.disTime)
|
||||
switch addr.Type {
|
||||
case TypeStatic:
|
||||
case TypeNormal:
|
||||
if tsub > StaleTimeNormal {
|
||||
if tSub > StaleTimeNormal {
|
||||
return nil
|
||||
}
|
||||
case TypeUnreachable:
|
||||
if tsub > StaleTimeUnreachable {
|
||||
if tSub > StaleTimeUnreachable {
|
||||
return nil
|
||||
}
|
||||
case TypeStatic:
|
||||
}
|
||||
|
||||
return addr
|
||||
@@ -70,7 +72,7 @@ func Add(addr *Addr) {
|
||||
return
|
||||
}
|
||||
if addr.disTime.IsZero() {
|
||||
addr.disTime = time.Now()
|
||||
addr.disTime = utils.NowSec()
|
||||
}
|
||||
ip := addr.IP.To4().String()
|
||||
tableMu.Lock()
|
||||
|
@@ -19,7 +19,8 @@ func doLookup(ip net.IP) *Addr {
|
||||
err := doPing(ip.String())
|
||||
if err != nil {
|
||||
// log.Println(err)
|
||||
addr := &Addr{IP: ip, Type: TypeUnreachable}
|
||||
addr := &Addr{IP: net.IPv4(1, 2, 3, 4), Type: TypeUnreachable}
|
||||
copy(addr.IP, ip)
|
||||
return addr
|
||||
}
|
||||
|
||||
@@ -50,7 +51,9 @@ func doArpShow(ip net.IP) *Addr {
|
||||
return nil
|
||||
}
|
||||
|
||||
return &Addr{IP: ip, HardwareAddr: mac}
|
||||
addr := &Addr{IP: net.IPv4(1, 2, 3, 4), HardwareAddr: mac}
|
||||
copy(addr.IP, ip)
|
||||
return addr
|
||||
}
|
||||
|
||||
// IP address HW type Flags HW address Mask Device
|
||||
|
17
server/pkg/utils/ip.go
Normal file
17
server/pkg/utils/ip.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"net"
|
||||
)
|
||||
|
||||
func Long2ip(i uint32) net.IP {
|
||||
ip := make([]byte, 4)
|
||||
binary.BigEndian.PutUint32(ip, i)
|
||||
return ip
|
||||
}
|
||||
|
||||
func Ip2long(ip net.IP) uint32 {
|
||||
ip = ip.To4()
|
||||
return binary.BigEndian.Uint32(ip)
|
||||
}
|
Reference in New Issue
Block a user