fix: handle utp packet in async

This commit is contained in:
thinkAfCod 2024-05-20 10:48:58 +08:00
parent b12bed8bde
commit 0159c17f46

View file

@ -53,7 +53,7 @@ const (
portalFindnodesResultLimit = 32 portalFindnodesResultLimit = 32
defaultUTPConnectTimeout = 15 * time.Second defaultUTPConnectTimeout = 60 * time.Second
defaultUTPWriteTimeout = 60 * time.Second defaultUTPWriteTimeout = 60 * time.Second
@ -235,7 +235,6 @@ func (p *PortalProtocol) Start() error {
if err != nil { if err != nil {
return err return err
} }
p.DiscV5.RegisterTalkHandler(p.protocolId, p.handleTalkRequest) p.DiscV5.RegisterTalkHandler(p.protocolId, p.handleTalkRequest)
p.DiscV5.RegisterTalkHandler(string(portalwire.UTPNetwork), p.handleUtpTalkRequest) p.DiscV5.RegisterTalkHandler(string(portalwire.UTPNetwork), p.handleUtpTalkRequest)
@ -296,13 +295,19 @@ func (p *PortalProtocol) setupUDPListening() error {
var err error var err error
p.packetRouter = utp.NewPacketRouter( p.packetRouter = utp.NewPacketRouter(
func(buf []byte, addr *net.UDPAddr) (int, error) { func(buf []byte, addr *net.UDPAddr) (int, error) {
p.Log.Info("will send to target data", "ip", addr.IP.To4().String(), "port", addr.Port, "bufLength", len(buf)) p.Log.Info("will send to target data", "network", string(portalwire.UTPNetwork), "ip", addr.IP.To4().String(), "port", addr.Port, "bufLength", len(buf))
p.cachedIdsLock.Lock() p.cachedIdsLock.Lock()
defer p.cachedIdsLock.Unlock() defer p.cachedIdsLock.Unlock()
if id, ok := p.cachedIds[addr.String()]; ok { if id, ok := p.cachedIds[addr.String()]; ok {
_, err := p.DiscV5.TalkRequestToID(id, addr, string(portalwire.UTPNetwork), buf) sendToId := id
return len(buf), err go func(targetId enode.ID, addr *net.UDPAddr, utpNetwork string, buffer []byte) {
_, err := p.DiscV5.TalkRequestToID(targetId, addr, utpNetwork, buffer)
if err != nil {
p.Log.Error("send utp talk request failed", "err", err)
}
}(sendToId, addr, string(portalwire.UTPNetwork), buf)
return len(buf), nil
} else { } else {
p.Log.Warn("not found target node info", "ip", addr.IP.To4().String(), "port", addr.Port, "bufLength", len(buf)) p.Log.Warn("not found target node info", "ip", addr.IP.To4().String(), "port", addr.Port, "bufLength", len(buf))
return 0, fmt.Errorf("not found target node id") return 0, fmt.Errorf("not found target node id")
@ -795,7 +800,6 @@ func (p *PortalProtocol) handleUtpTalkRequest(id enode.ID, addr *net.UDPAddr, ms
if n := p.DiscV5.getNode(id); n != nil { if n := p.DiscV5.getNode(id); n != nil {
p.table.addSeenNode(wrapNode(n)) p.table.addSeenNode(wrapNode(n))
} }
p.putCacheId(id, addr) p.putCacheId(id, addr)
p.Log.Trace("receive utp data", "addr", addr, "msg-length", len(msg)) p.Log.Trace("receive utp data", "addr", addr, "msg-length", len(msg))
p.packetRouter.ReceiveMessage(msg, addr) p.packetRouter.ReceiveMessage(msg, addr)