mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
p2p/discover: export Ping and RequestENR
These two are useful for checking the status of a node.
This commit is contained in:
parent
645756cda5
commit
ba7b5f1f51
3 changed files with 14 additions and 8 deletions
|
|
@ -85,10 +85,10 @@ type Table struct {
|
||||||
// transport is implemented by the UDP transports.
|
// transport is implemented by the UDP transports.
|
||||||
type transport interface {
|
type transport interface {
|
||||||
Self() *enode.Node
|
Self() *enode.Node
|
||||||
|
RequestENR(*enode.Node) (*enode.Node, error)
|
||||||
lookupRandom() []*enode.Node
|
lookupRandom() []*enode.Node
|
||||||
lookupSelf() []*enode.Node
|
lookupSelf() []*enode.Node
|
||||||
ping(*enode.Node) (seq uint64, err error)
|
ping(*enode.Node) (seq uint64, err error)
|
||||||
requestENR(*enode.Node) (*enode.Node, error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// bucket contains nodes, ordered by their last activity. the entry
|
// bucket contains nodes, ordered by their last activity. the entry
|
||||||
|
|
@ -344,7 +344,7 @@ func (tab *Table) doRevalidate(done chan<- struct{}) {
|
||||||
|
|
||||||
// Also fetch record if the node replied and returned a higher sequence number.
|
// Also fetch record if the node replied and returned a higher sequence number.
|
||||||
if last.Seq() < remoteSeq {
|
if last.Seq() < remoteSeq {
|
||||||
n, err := tab.net.requestENR(unwrapNode(last))
|
n, err := tab.net.RequestENR(unwrapNode(last))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
tab.log.Debug("ENR request failed", "id", last.ID(), "addr", last.addr(), "err", err)
|
tab.log.Debug("ENR request failed", "id", last.ID(), "addr", last.addr(), "err", err)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -145,7 +145,7 @@ func (t *pingRecorder) ping(n *enode.Node) (seq uint64, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// requestENR simulates an ENR request.
|
// requestENR simulates an ENR request.
|
||||||
func (t *pingRecorder) requestENR(n *enode.Node) (*enode.Node, error) {
|
func (t *pingRecorder) RequestENR(n *enode.Node) (*enode.Node, error) {
|
||||||
t.mu.Lock()
|
t.mu.Lock()
|
||||||
defer t.mu.Unlock()
|
defer t.mu.Unlock()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -415,13 +415,13 @@ func (t *UDPv4) lookupWorker(n *node, targetKey encPubkey, reply chan<- []*node)
|
||||||
// version of the node record for it. It returns n if the node could not be resolved.
|
// version of the node record for it. It returns n if the node could not be resolved.
|
||||||
func (t *UDPv4) Resolve(n *enode.Node) *enode.Node {
|
func (t *UDPv4) Resolve(n *enode.Node) *enode.Node {
|
||||||
// Try asking directly. This works if the node is still responding on the endpoint we have.
|
// Try asking directly. This works if the node is still responding on the endpoint we have.
|
||||||
if rn, err := t.requestENR(n); err == nil {
|
if rn, err := t.RequestENR(n); err == nil {
|
||||||
return rn
|
return rn
|
||||||
}
|
}
|
||||||
// Check table for the ID, we might have a newer version there.
|
// Check table for the ID, we might have a newer version there.
|
||||||
if intable := t.tab.getNode(n.ID()); intable != nil && intable.Seq() > n.Seq() {
|
if intable := t.tab.getNode(n.ID()); intable != nil && intable.Seq() > n.Seq() {
|
||||||
n = intable
|
n = intable
|
||||||
if rn, err := t.requestENR(n); err == nil {
|
if rn, err := t.RequestENR(n); err == nil {
|
||||||
return rn
|
return rn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -433,7 +433,7 @@ func (t *UDPv4) Resolve(n *enode.Node) *enode.Node {
|
||||||
result := t.LookupPubkey((*ecdsa.PublicKey)(&key))
|
result := t.LookupPubkey((*ecdsa.PublicKey)(&key))
|
||||||
for _, rn := range result {
|
for _, rn := range result {
|
||||||
if rn.ID() == n.ID() {
|
if rn.ID() == n.ID() {
|
||||||
if rn, err := t.requestENR(rn); err == nil {
|
if rn, err := t.RequestENR(rn); err == nil {
|
||||||
return rn
|
return rn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -447,6 +447,12 @@ func (t *UDPv4) ourEndpoint() rpcEndpoint {
|
||||||
return makeEndpoint(a, uint16(n.TCP()))
|
return makeEndpoint(a, uint16(n.TCP()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ping sends a ping message to the given node.
|
||||||
|
func (t *UDPv4) Ping(n *enode.Node) error {
|
||||||
|
_, err := t.ping(n)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// ping sends a ping message to the given node and waits for a reply.
|
// ping sends a ping message to the given node and waits for a reply.
|
||||||
func (t *UDPv4) ping(n *enode.Node) (seq uint64, err error) {
|
func (t *UDPv4) ping(n *enode.Node) (seq uint64, err error) {
|
||||||
rm := t.sendPing(n.ID(), &net.UDPAddr{IP: n.IP(), Port: n.UDP()}, nil)
|
rm := t.sendPing(n.ID(), &net.UDPAddr{IP: n.IP(), Port: n.UDP()}, nil)
|
||||||
|
|
@ -521,8 +527,8 @@ func (t *UDPv4) findnode(toid enode.ID, toaddr *net.UDPAddr, target encPubkey) (
|
||||||
return nodes, <-rm.errc
|
return nodes, <-rm.errc
|
||||||
}
|
}
|
||||||
|
|
||||||
// requestENR sends enrRequest to the given node and waits for a response.
|
// RequestENR sends enrRequest to the given node and waits for a response.
|
||||||
func (t *UDPv4) requestENR(n *enode.Node) (*enode.Node, error) {
|
func (t *UDPv4) RequestENR(n *enode.Node) (*enode.Node, error) {
|
||||||
addr := &net.UDPAddr{IP: n.IP(), Port: n.UDP()}
|
addr := &net.UDPAddr{IP: n.IP(), Port: n.UDP()}
|
||||||
t.ensureBond(n.ID(), addr)
|
t.ensureBond(n.ID(), addr)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue