mirror of
https://github.com/sigcn/pg.git
synced 2025-10-27 22:31:39 +08:00
vpn/iface: merge ipv4/ipv6 routing
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user