aboutsummaryrefslogtreecommitdiffstats
path: root/p2p/server.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2015-02-12 00:19:31 +0800
committerFelix Lange <fjl@twurst.com>2015-02-13 18:39:31 +0800
commitd0a2e655c9599f462bb20bd49bc69b8e1e330a21 (patch)
treeebd2685477461d33b80207b5eeee2f08ade33f3a /p2p/server.go
parent1543833ca0b920d38e98994367f3871867d66781 (diff)
downloaddexon-d0a2e655c9599f462bb20bd49bc69b8e1e330a21.tar.gz
dexon-d0a2e655c9599f462bb20bd49bc69b8e1e330a21.tar.zst
dexon-d0a2e655c9599f462bb20bd49bc69b8e1e330a21.zip
cmd/ethereum, cmd/mist, eth, p2p: use package p2p/nat
This deletes the old NAT implementation.
Diffstat (limited to 'p2p/server.go')
-rw-r--r--p2p/server.go70
1 files changed, 11 insertions, 59 deletions
diff --git a/p2p/server.go b/p2p/server.go
index 3cab61102..a0f2dee23 100644
--- a/p2p/server.go
+++ b/p2p/server.go
@@ -13,13 +13,12 @@ import (
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/p2p/discover"
+ "github.com/ethereum/go-ethereum/p2p/nat"
)
const (
- defaultDialTimeout = 10 * time.Second
- refreshPeersInterval = 30 * time.Second
- portMappingUpdateInterval = 15 * time.Minute
- portMappingTimeout = 20 * time.Minute
+ defaultDialTimeout = 10 * time.Second
+ refreshPeersInterval = 30 * time.Second
)
var srvlog = logger.NewLogger("P2P Server")
@@ -72,7 +71,7 @@ type Server struct {
// If set to a non-nil value, the given NAT port mapper
// is used to make the listening port available to the
// Internet.
- NAT NAT
+ NAT nat.Interface
// If Dialer is set to a non-nil value, the given Dialer
// is used to dial outbound peer connections.
@@ -89,7 +88,6 @@ type Server struct {
lock sync.RWMutex
running bool
listener net.Listener
- laddr *net.TCPAddr // real listen addr
peers map[discover.NodeID]*Peer
ntab *discover.Table
@@ -100,16 +98,6 @@ type Server struct {
peerConnect chan *discover.Node
}
-// NAT is implemented by NAT traversal methods.
-type NAT interface {
- GetExternalAddress() (net.IP, error)
- AddPortMapping(protocol string, extport, intport int, name string, lifetime time.Duration) error
- DeletePortMapping(protocol string, extport, intport int) error
-
- // Should return name of the method.
- String() string
-}
-
type handshakeFunc func(io.ReadWriter, *ecdsa.PrivateKey, *discover.Node) (discover.NodeID, []byte, error)
type newPeerHook func(*Peer)
@@ -220,14 +208,17 @@ func (srv *Server) startListening() error {
if err != nil {
return err
}
- srv.ListenAddr = listener.Addr().String()
- srv.laddr = listener.Addr().(*net.TCPAddr)
+ laddr := listener.Addr().(*net.TCPAddr)
+ srv.ListenAddr = laddr.String()
srv.listener = listener
srv.loopWG.Add(1)
go srv.listenLoop()
- if !srv.laddr.IP.IsLoopback() && srv.NAT != nil {
+ if !laddr.IP.IsLoopback() && srv.NAT != nil {
srv.loopWG.Add(1)
- go srv.natLoop(srv.laddr.Port)
+ go func() {
+ nat.Map(srv.NAT, srv.quit, "tcp", laddr.Port, laddr.Port, "ethereum p2p")
+ srv.loopWG.Done()
+ }()
}
return nil
}
@@ -276,45 +267,6 @@ func (srv *Server) listenLoop() {
}
}
-func (srv *Server) natLoop(port int) {
- defer srv.loopWG.Done()
- for {
- srv.updatePortMapping(port)
- select {
- case <-time.After(portMappingUpdateInterval):
- // one more round
- case <-srv.quit:
- srv.removePortMapping(port)
- return
- }
- }
-}
-
-func (srv *Server) updatePortMapping(port int) {
- srvlog.Infoln("Attempting to map port", port, "with", srv.NAT)
- err := srv.NAT.AddPortMapping("tcp", port, port, "ethereum p2p", portMappingTimeout)
- if err != nil {
- srvlog.Errorln("Port mapping error:", err)
- return
- }
- extip, err := srv.NAT.GetExternalAddress()
- if err != nil {
- srvlog.Errorln("Error getting external IP:", err)
- return
- }
- srv.lock.Lock()
- extaddr := *(srv.listener.Addr().(*net.TCPAddr))
- extaddr.IP = extip
- srvlog.Infoln("Mapped port, external addr is", &extaddr)
- srv.laddr = &extaddr
- srv.lock.Unlock()
-}
-
-func (srv *Server) removePortMapping(port int) {
- srvlog.Infoln("Removing port mapping for", port, "with", srv.NAT)
- srv.NAT.DeletePortMapping("tcp", port, port)
-}
-
func (srv *Server) dialLoop() {
defer srv.loopWG.Done()
refresh := time.NewTicker(refreshPeersInterval)