mirror of
https://github.com/fumiama/WireGold.git
synced 2026-06-23 12:00:34 +08:00
优化代码结构,router增加ttl
This commit is contained in:
@@ -24,14 +24,14 @@ type Link struct {
|
||||
endpoint *net.UDPAddr
|
||||
// 本机允许接收/发送的 ip 网段
|
||||
allowedips []*net.IPNet
|
||||
// 是否允许转发
|
||||
allowtrans bool
|
||||
// 连接的状态,详见下方 const
|
||||
status int
|
||||
// 连接所用对称加密密钥
|
||||
key []tea.TEA
|
||||
// 本机信息
|
||||
me *Me
|
||||
// 连接的状态,详见下方 const
|
||||
status int
|
||||
// 是否允许转发
|
||||
allowtrans bool
|
||||
}
|
||||
|
||||
const (
|
||||
|
||||
@@ -6,12 +6,14 @@ import (
|
||||
"net"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/fumiama/WireGold/gold/head"
|
||||
"github.com/fumiama/WireGold/helper"
|
||||
"github.com/fumiama/WireGold/lower"
|
||||
"github.com/fumiama/water/waterutil"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/wdvxdr1123/ZeroBot/extension/ttl"
|
||||
)
|
||||
|
||||
// Me 是本机的抽象
|
||||
@@ -51,15 +53,23 @@ type Me struct {
|
||||
srcport, dstport, mtu uint16
|
||||
}
|
||||
|
||||
type MyConfig struct {
|
||||
MyIPwithMask string
|
||||
MyEndpoint string
|
||||
PrivateKey *[32]byte
|
||||
NIC lower.NICIO
|
||||
SrcPort, DstPort, MTU uint16
|
||||
}
|
||||
|
||||
// NewMe 设置本机参数
|
||||
func NewMe(privateKey *[32]byte, myipwithmask string, myEndpoint string, nic lower.NICIO, srcport, dstport, mtu uint16) (m Me) {
|
||||
m.privKey = *privateKey
|
||||
func NewMe(cfg *MyConfig) (m Me) {
|
||||
m.privKey = *cfg.PrivateKey
|
||||
var err error
|
||||
m.myend, err = net.ResolveUDPAddr("udp", myEndpoint)
|
||||
m.myend, err = net.ResolveUDPAddr("udp", cfg.MyEndpoint)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
ip, cidr, err := net.ParseCIDR(myipwithmask)
|
||||
ip, cidr, err := net.ParseCIDR(cfg.MyIPwithMask)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@@ -70,18 +80,23 @@ func NewMe(privateKey *[32]byte, myipwithmask string, myEndpoint string, nic low
|
||||
panic(err)
|
||||
}
|
||||
m.connections = make(map[string]*Link)
|
||||
m.nic = nic
|
||||
m.nic = cfg.NIC
|
||||
m.router = &Router{
|
||||
list: make([]*net.IPNet, 1, 16),
|
||||
table: make(map[string]*Link, 16),
|
||||
cache: ttl.NewCache[string, *Link](time.Minute),
|
||||
}
|
||||
m.router.SetDefault(nil)
|
||||
m.loop = m.AddPeer(m.me.String(), nil, "127.0.0.1:56789", []string{myipwithmask}, nil, 0, 0, false, nic != nil)
|
||||
m.srcport = srcport
|
||||
m.dstport = dstport
|
||||
m.mtu = mtu & 0xfff8
|
||||
m.writer = helper.SelectWriter()
|
||||
go m.initrecvpool()
|
||||
m.loop = m.AddPeer(&PeerConfig{
|
||||
PeerIP: m.me.String(),
|
||||
EndPoint: "127.0.0.1:56789",
|
||||
AllowedIPs: []string{cfg.MyIPwithMask},
|
||||
NoPipe: cfg.NIC != nil,
|
||||
})
|
||||
m.srcport = cfg.SrcPort
|
||||
m.dstport = cfg.DstPort
|
||||
m.mtu = cfg.MTU & 0xfff8
|
||||
m.initrecvpool()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -125,13 +140,13 @@ func (m *Me) ListenFromNIC() (written int64, err error) {
|
||||
return io.Copy(m, m.nic)
|
||||
}
|
||||
|
||||
type PacketID [2]byte
|
||||
type packetID [2]byte
|
||||
|
||||
func newpacketid(packet []byte) PacketID {
|
||||
func newpacketid(packet []byte) packetID {
|
||||
return waterutil.IPv4Identification(packet)
|
||||
}
|
||||
|
||||
func (p PacketID) issame(packet []byte) bool {
|
||||
func (p packetID) issame(packet []byte) bool {
|
||||
return p == waterutil.IPv4Identification(packet)
|
||||
}
|
||||
|
||||
|
||||
@@ -10,27 +10,36 @@ import (
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type PeerConfig struct {
|
||||
PeerIP string
|
||||
EndPoint string
|
||||
AllowedIPs, Querys []string
|
||||
PubicKey *[32]byte
|
||||
KeepAliveDur, QueryTick int64
|
||||
AllowTrans, NoPipe bool
|
||||
}
|
||||
|
||||
// AddPeer 添加一个 peer
|
||||
func (m *Me) AddPeer(peerip string, pubicKey *[32]byte, endPoint string, allowedIPs, querys []string, keepAliveDur, queryTick int64, allowTrans, nopipe bool) (l *Link) {
|
||||
peerip = net.ParseIP(peerip).String()
|
||||
func (m *Me) AddPeer(cfg *PeerConfig) (l *Link) {
|
||||
cfg.PeerIP = net.ParseIP(cfg.PeerIP).String()
|
||||
var ok bool
|
||||
l, ok = m.IsInPeer(peerip)
|
||||
l, ok = m.IsInPeer(cfg.PeerIP)
|
||||
if ok {
|
||||
return
|
||||
}
|
||||
l = &Link{
|
||||
pubk: pubicKey,
|
||||
peerip: net.ParseIP(peerip),
|
||||
allowtrans: allowTrans,
|
||||
pubk: cfg.PubicKey,
|
||||
peerip: net.ParseIP(cfg.PeerIP),
|
||||
allowtrans: cfg.AllowTrans,
|
||||
me: m,
|
||||
}
|
||||
|
||||
if !nopipe {
|
||||
if !cfg.NoPipe {
|
||||
l.pipe = make(chan *head.Packet, 32)
|
||||
}
|
||||
if pubicKey != nil {
|
||||
if cfg.PubicKey != nil {
|
||||
c := curve.Get(m.privKey[:])
|
||||
k, err := c.Shared(pubicKey)
|
||||
k, err := c.Shared(cfg.PubicKey)
|
||||
if err == nil {
|
||||
l.key = make([]tea.TEA, 16)
|
||||
for i := range l.key {
|
||||
@@ -38,31 +47,31 @@ func (m *Me) AddPeer(peerip string, pubicKey *[32]byte, endPoint string, allowed
|
||||
}
|
||||
}
|
||||
}
|
||||
if endPoint != "" {
|
||||
e, err := net.ResolveUDPAddr("udp", endPoint)
|
||||
if cfg.EndPoint != "" {
|
||||
e, err := net.ResolveUDPAddr("udp", cfg.EndPoint)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
l.endpoint = e
|
||||
}
|
||||
if allowedIPs != nil {
|
||||
l.allowedips = make([]*net.IPNet, 0, len(allowedIPs))
|
||||
for _, ipnet := range allowedIPs {
|
||||
if cfg.AllowedIPs != nil {
|
||||
l.allowedips = make([]*net.IPNet, 0, len(cfg.AllowedIPs))
|
||||
for _, ipnet := range cfg.AllowedIPs {
|
||||
_, cidr, err := net.ParseCIDR(ipnet)
|
||||
if err == nil {
|
||||
l.allowedips = append(l.allowedips, cidr)
|
||||
l.me.router.SetItem(cidr, l)
|
||||
l.me.connmapmu.Lock()
|
||||
l.me.connections[peerip] = l
|
||||
l.me.connections[cfg.PeerIP] = l
|
||||
l.me.connmapmu.Unlock()
|
||||
} else {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
logrus.Infoln("[peer] add peer:", peerip, "allow:", allowedIPs)
|
||||
go l.keepAlive(keepAliveDur)
|
||||
go l.sendquery(time.Second*time.Duration(queryTick), querys...)
|
||||
logrus.Infoln("[peer] add peer:", cfg.PeerIP, "allow:", cfg.AllowedIPs)
|
||||
go l.keepAlive(cfg.KeepAliveDur)
|
||||
go l.sendquery(time.Second*time.Duration(cfg.QueryTick), cfg.Querys...)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/fumiama/WireGold/gold/head"
|
||||
"github.com/fumiama/WireGold/helper"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
@@ -16,6 +17,9 @@ func (l *Link) Read() *head.Packet {
|
||||
}
|
||||
|
||||
func (m *Me) initrecvpool() {
|
||||
if m.writer == nil {
|
||||
m.writer = helper.SelectWriter()
|
||||
}
|
||||
if m.recving == nil {
|
||||
m.recving = make(map[[32]byte]*head.Packet, 128)
|
||||
}
|
||||
@@ -23,23 +27,25 @@ func (m *Me) initrecvpool() {
|
||||
m.clock = make(map[*head.Packet]uint8, 128)
|
||||
var delhs []*head.Packet
|
||||
t := time.NewTicker(time.Second)
|
||||
for range t.C {
|
||||
m.recvmu.Lock()
|
||||
for k, v := range m.clock {
|
||||
if v > 10 { // 10s
|
||||
delete(m.recving, k.Hash)
|
||||
delhs = append(delhs, k)
|
||||
} else {
|
||||
m.clock[k]++
|
||||
go func() {
|
||||
for range t.C {
|
||||
m.recvmu.Lock()
|
||||
for k, v := range m.clock {
|
||||
if v > 10 { // 10s
|
||||
delete(m.recving, k.Hash)
|
||||
delhs = append(delhs, k)
|
||||
} else {
|
||||
m.clock[k]++
|
||||
}
|
||||
}
|
||||
for _, k := range delhs {
|
||||
delete(m.clock, k)
|
||||
logrus.Warnln("[recv] drop timeout packet from", k.Src)
|
||||
}
|
||||
delhs = delhs[:0]
|
||||
m.recvmu.Unlock()
|
||||
}
|
||||
for _, k := range delhs {
|
||||
delete(m.clock, k)
|
||||
logrus.Warnln("[recv] drop timeout packet from", k.Src)
|
||||
}
|
||||
delhs = delhs[:0]
|
||||
m.recvmu.Unlock()
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func (m *Me) wait(data []byte) *head.Packet {
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"sync"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/wdvxdr1123/ZeroBot/extension/ttl"
|
||||
)
|
||||
|
||||
type Router struct {
|
||||
@@ -13,6 +14,7 @@ type Router struct {
|
||||
table map[string]*Link
|
||||
mu sync.RWMutex
|
||||
list []*net.IPNet
|
||||
cache *ttl.Cache[string, *Link]
|
||||
}
|
||||
|
||||
// Accept 判断是否应当接受 ip 发来的包
|
||||
@@ -41,6 +43,11 @@ func (r *Router) SetDefault(l *Link) {
|
||||
|
||||
// NextHop 得到前往 ip 的下一跳的 link
|
||||
func (r *Router) NextHop(ip string) (l *Link) {
|
||||
l = r.cache.Get(ip)
|
||||
if l != nil {
|
||||
logrus.Debugln("[router] get cached nexthop to", ip, "link", l)
|
||||
return
|
||||
}
|
||||
ipb := net.ParseIP(ip)
|
||||
if ipb == nil {
|
||||
logrus.Errorln("[router] nil ip")
|
||||
@@ -56,6 +63,7 @@ func (r *Router) NextHop(ip string) (l *Link) {
|
||||
if c.Contains(ipb) {
|
||||
l = r.table[c.String()]
|
||||
logrus.Debugln("[router] get nexthop to", ipb, "-->", c, "link", l)
|
||||
r.cache.Set(ip, l)
|
||||
return l
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user