This commit is contained in:
rayoo 2026-07-17 21:53:16 -07:00 committed by GitHub
commit 2e874f9b77
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 30 additions and 6 deletions

View file

@ -303,7 +303,10 @@ func (t *UDPv5) RegisterTalkHandler(protocol string, handler TalkRequestHandler)
// TalkRequest sends a talk request to a node and waits for a response. // TalkRequest sends a talk request to a node and waits for a response.
func (t *UDPv5) TalkRequest(n *enode.Node, protocol string, request []byte) ([]byte, error) { func (t *UDPv5) TalkRequest(n *enode.Node, protocol string, request []byte) ([]byte, error) {
req := &v5wire.TalkRequest{Protocol: protocol, Message: request} req := &v5wire.TalkRequest{Protocol: protocol, Message: request}
resp := t.callToNode(n, v5wire.TalkResponseMsg, req) resp, err := t.callToNode(n, v5wire.TalkResponseMsg, req)
if err != nil {
return nil, err
}
defer t.callDone(resp) defer t.callDone(resp)
select { select {
case respMsg := <-resp.ch: case respMsg := <-resp.ch:
@ -411,7 +414,10 @@ func (t *UDPv5) ping(n *enode.Node) (uint64, error) {
// Ping calls PING on a node and waits for a PONG response. // Ping calls PING on a node and waits for a PONG response.
func (t *UDPv5) Ping(n *enode.Node) (*v5wire.Pong, error) { func (t *UDPv5) Ping(n *enode.Node) (*v5wire.Pong, error) {
req := &v5wire.Ping{ENRSeq: t.localNode.Node().Seq()} req := &v5wire.Ping{ENRSeq: t.localNode.Node().Seq()}
resp := t.callToNode(n, v5wire.PongMsg, req) resp, err := t.callToNode(n, v5wire.PongMsg, req)
if err != nil {
return nil, err
}
defer t.callDone(resp) defer t.callDone(resp)
select { select {
@ -436,7 +442,10 @@ func (t *UDPv5) RequestENR(n *enode.Node) (*enode.Node, error) {
// Findnode calls FINDNODE on a node and waits for responses. // Findnode calls FINDNODE on a node and waits for responses.
func (t *UDPv5) Findnode(n *enode.Node, distances []uint) ([]*enode.Node, error) { func (t *UDPv5) Findnode(n *enode.Node, distances []uint) ([]*enode.Node, error) {
resp := t.callToNode(n, v5wire.NodesMsg, &v5wire.Findnode{Distances: distances}) resp, err := t.callToNode(n, v5wire.NodesMsg, &v5wire.Findnode{Distances: distances})
if err != nil {
return nil, err
}
return t.waitForNodes(resp, distances) return t.waitForNodes(resp, distances)
} }
@ -503,11 +512,14 @@ func (t *UDPv5) verifyResponseNode(c *callV5, r *enr.Record, distances []uint, s
// callToNode sends the given call and sets up a handler for response packets (of message // callToNode sends the given call and sets up a handler for response packets (of message
// type responseType). Responses are dispatched to the call's response channel. // type responseType). Responses are dispatched to the call's response channel.
func (t *UDPv5) callToNode(n *enode.Node, responseType byte, req v5wire.Packet) *callV5 { func (t *UDPv5) callToNode(n *enode.Node, responseType byte, req v5wire.Packet) (*callV5, error) {
addr, _ := n.UDPEndpoint() addr, ok := n.UDPEndpoint()
if !ok {
return nil, errNoUDPEndpoint
}
c := &callV5{id: n.ID(), addr: addr, node: n} c := &callV5{id: n.ID(), addr: addr, node: n}
t.initCall(c, responseType, req) t.initCall(c, responseType, req)
return c return c, nil
} }
// callToID is like callToNode, but for cases where the node record is not available. // callToID is like callToNode, but for cases where the node record is not available.

View file

@ -289,6 +289,18 @@ func (test *udpV5Test) expectNodes(wantReqID []byte, wantTotal uint8, wantNodes
} }
// This test checks that outgoing PING calls work. // This test checks that outgoing PING calls work.
func TestUDPv5_pingNoUDPEndpoint(t *testing.T) {
t.Parallel()
test := newUDPV5Test(t)
defer test.close()
key := newkey()
node := enode.NewV4(&key.PublicKey, net.ParseIP("1.2.3.4"), 2222, 0)
if _, err := test.udp.Ping(node); err != errNoUDPEndpoint {
t.Errorf("expected errNoUDPEndpoint, got %v", err)
}
}
func TestUDPv5_pingCall(t *testing.T) { func TestUDPv5_pingCall(t *testing.T) {
t.Parallel() t.Parallel()
test := newUDPV5Test(t) test := newUDPV5Test(t)