@@ -169,7 +169,8 @@ func DefaultPortalProtocolConfig() *PortalProtocolConfig {
169169type PortalProtocol struct {
170170 table * Table
171171 cachedIdsLock sync.Mutex
172- cachedIds map [string ]* enode.Node
172+ cachedNodes map [string ]* enode.Node
173+ cachedIds map [string ]enode.ID
173174
174175 protocolId string
175176 protocolName string
@@ -213,7 +214,8 @@ func NewPortalProtocol(config *PortalProtocolConfig, protocolId portalwire.Proto
213214 closeCtx , cancelCloseCtx := context .WithCancel (context .Background ())
214215
215216 protocol := & PortalProtocol {
216- cachedIds : make (map [string ]* enode.Node ),
217+ cachedNodes : make (map [string ]* enode.Node ),
218+ cachedIds : make (map [string ]enode.ID ),
217219 protocolId : string (protocolId ),
218220 protocolName : protocolId .Name (),
219221 ListenAddr : config .ListenAddr ,
@@ -330,11 +332,17 @@ func (p *PortalProtocol) setupUDPListening() error {
330332
331333 p .cachedIdsLock .Lock ()
332334 defer p .cachedIdsLock .Unlock ()
333- if n , ok := p .cachedIds [addr .String ()]; ok {
335+ if n , ok := p .cachedNodes [addr .String ()]; ok {
334336 //_, err := p.DiscV5.TalkRequestToID(id, addr, string(portalwire.UTPNetwork), buf)
335337 req := & v5wire.TalkRequest {Protocol : string (portalwire .Utp ), Message : buf }
336338 p .DiscV5 .sendFromAnotherThreadWithNode (n , netip .AddrPortFrom (netutil .IPToAddr (addr .IP ), uint16 (addr .Port )), req )
337339
340+ return len (buf ), err
341+ } else if id , ok := p .cachedIds [addr .String ()]; ok {
342+ //_, err := p.DiscV5.TalkRequestToID(id, addr, string(portalwire.UTPNetwork), buf)
343+ req := & v5wire.TalkRequest {Protocol : string (portalwire .Utp ), Message : buf }
344+ p .DiscV5 .sendFromAnotherThread (id , netip .AddrPortFrom (netutil .IPToAddr (addr .IP ), uint16 (addr .Port )), req )
345+
338346 return len (buf ), err
339347 } else {
340348 p .Log .Warn ("not found target node info" , "ip" , addr .IP .To4 ().String (), "port" , addr .Port , "bufLength" , len (buf ))
@@ -392,14 +400,23 @@ func (p *PortalProtocol) cacheNode(node *enode.Node) {
392400 p .cachedIdsLock .Lock ()
393401 defer p .cachedIdsLock .Unlock ()
394402 addr := & net.UDPAddr {IP : node .IP (), Port : node .UDP ()}
395- if _ , ok := p .cachedIds [addr .String ()]; ! ok {
396- p .cachedIds [addr .String ()] = node
403+ if _ , ok := p .cachedNodes [addr .String ()]; ! ok && node != nil {
404+ p .cachedNodes [addr .String ()] = node
405+ }
406+ }
407+
408+ func (p * PortalProtocol ) cacheNodeId (id enode.ID , addr * net.UDPAddr ) {
409+ p .cachedIdsLock .Lock ()
410+ defer p .cachedIdsLock .Unlock ()
411+ if (id != enode.ID {}) {
412+ p .cachedIds [addr .String ()] = id
397413 }
398414}
399415
400416func (p * PortalProtocol ) cacheNodeById (id enode.ID , addr * net.UDPAddr ) {
401417 go func () {
402- if _ , ok := p .cachedIds [addr .String ()]; ! ok {
418+ p .cacheNodeId (id , addr )
419+ if _ , ok := p .cachedNodes [addr .String ()]; ! ok {
403420 n := p .ResolveNodeId (id )
404421 if n != nil {
405422 p .cacheNode (n )
0 commit comments