vpn/iface: merge ipv4/ipv6 routing

This commit is contained in:
rkonfj
2024-06-01 13:54:19 +08:00
parent af9b20857f
commit 9a511afaec
2 changed files with 15 additions and 41 deletions

View File

@@ -28,8 +28,7 @@ var _ RoutingTable = (*TunInterface)(nil)
type TunInterface struct { type TunInterface struct {
dev tun.Device dev tun.Device
ifName string ifName string
ipv6 *lru.Cache[string, []*net.IPNet] routing *lru.Cache[string, []*net.IPNet]
ipv4 *lru.Cache[string, []*net.IPNet]
peers *lru.Cache[string, net.Addr] peers *lru.Cache[string, net.Addr]
peersMutex sync.RWMutex peersMutex sync.RWMutex
} }
@@ -46,11 +45,10 @@ func Create(tunName string, cfg Config) (*TunInterface, error) {
link.SetupLink(tunName, cfg.IPv6) link.SetupLink(tunName, cfg.IPv6)
} }
return &TunInterface{ return &TunInterface{
dev: device, dev: device,
ifName: tunName, ifName: tunName,
ipv6: lru.New[string, []*net.IPNet](256), routing: lru.New[string, []*net.IPNet](512),
ipv4: lru.New[string, []*net.IPNet](256), peers: lru.New[string, net.Addr](1024),
peers: lru.New[string, net.Addr](1024),
}, nil }, nil
} }
@@ -62,18 +60,7 @@ func (r *TunInterface) GetPeer(ip string) (net.Addr, bool) {
return peerID, true return peerID, true
} }
dstIP := net.ParseIP(ip) dstIP := net.ParseIP(ip)
if dstIP.To4() != nil { k, _, _ := r.routing.Find(func(k string, v []*net.IPNet) bool {
k, _, _ := r.ipv4.Find(func(k string, v []*net.IPNet) bool {
for _, cidr := range v {
if cidr.Contains(dstIP) {
return true
}
}
return false
})
return r.peers.Get(k)
}
k, _, _ := r.ipv6.Find(func(k string, v []*net.IPNet) bool {
for _, cidr := range v { for _, cidr := range v {
if cidr.Contains(dstIP) { if cidr.Contains(dstIP) {
return true return true
@@ -98,26 +85,14 @@ func (r *TunInterface) AddPeer(ipv4, ipv6 string, peer net.Addr) {
func (r *TunInterface) AddRoute(cidr *net.IPNet, via net.IP) { func (r *TunInterface) AddRoute(cidr *net.IPNet, via net.IP) {
r.peersMutex.Lock() r.peersMutex.Lock()
defer r.peersMutex.Unlock() defer r.peersMutex.Unlock()
var cidrs []*net.IPNet cidrs, _ := r.routing.Get(via.String())
if via.To4() != nil { for _, cmp := range cidrs {
cidrs, _ = r.ipv4.Get(via.String()) if cmp.String() == cidr.String() {
for _, cmp := range cidrs { return
if cmp.String() == cidr.String() {
return
}
} }
cidrs = append(cidrs, cidr)
r.ipv4.Put(via.String(), cidrs)
} else {
cidrs, _ := r.ipv6.Get(via.String())
for _, cmp := range cidrs {
if cmp.String() == cidr.String() {
return
}
}
cidrs = append(cidrs, cidr)
r.ipv6.Put(via.String(), cidrs)
} }
cidrs = append(cidrs, cidr)
r.routing.Put(via.String(), cidrs)
r.updateRoute(via, cidrs[:len(cidrs)-1], cidrs) r.updateRoute(via, cidrs[:len(cidrs)-1], cidrs)
} }

View File

@@ -22,9 +22,8 @@ func CreateFD(tunFD int, cfg Config) (*TunInterface, error) {
return nil, err return nil, err
} }
return &TunInterface{ return &TunInterface{
dev: device, dev: device,
ipv6: lru.New[string, []*net.IPNet](256), routing: lru.New[string, []*net.IPNet](512),
ipv4: lru.New[string, []*net.IPNet](256), peers: lru.New[string, net.Addr](1024),
peers: lru.New[string, net.Addr](1024),
}, nil }, nil
} }