aboutsummaryrefslogtreecommitdiffstats
path: root/p2p/dial.go
diff options
context:
space:
mode:
Diffstat (limited to 'p2p/dial.go')
-rw-r--r--p2p/dial.go23
1 files changed, 20 insertions, 3 deletions
diff --git a/p2p/dial.go b/p2p/dial.go
index b77971396..2d9e3a0ed 100644
--- a/p2p/dial.go
+++ b/p2p/dial.go
@@ -47,6 +47,24 @@ const (
maxResolveDelay = time.Hour
)
+// NodeDialer is used to connect to nodes in the network, typically by using
+// an underlying net.Dialer but also using net.Pipe in tests
+type NodeDialer interface {
+ Dial(*discover.Node) (net.Conn, error)
+}
+
+// TCPDialer implements the NodeDialer interface by using a net.Dialer to
+// create TCP connections to nodes in the network
+type TCPDialer struct {
+ *net.Dialer
+}
+
+// Dial creates a TCP connection to the node
+func (t TCPDialer) Dial(dest *discover.Node) (net.Conn, error) {
+ addr := &net.TCPAddr{IP: dest.IP, Port: int(dest.TCP)}
+ return t.Dialer.Dial("tcp", addr.String())
+}
+
// dialstate schedules dials and discovery lookups.
// it get's a chance to compute new tasks on every iteration
// of the main loop in Server.run.
@@ -318,14 +336,13 @@ func (t *dialTask) resolve(srv *Server) bool {
// dial performs the actual connection attempt.
func (t *dialTask) dial(srv *Server, dest *discover.Node) bool {
- addr := &net.TCPAddr{IP: dest.IP, Port: int(dest.TCP)}
- fd, err := srv.Dialer.Dial("tcp", addr.String())
+ fd, err := srv.Dialer.Dial(dest)
if err != nil {
log.Trace("Dial error", "task", t, "err", err)
return false
}
mfd := newMeteredConn(fd, false)
- srv.setupConn(mfd, t.flags, dest)
+ srv.SetupConn(mfd, t.flags, dest)
return true
}