diff options
Diffstat (limited to 'p2p/discover/udp.go')
-rw-r--r-- | p2p/discover/udp.go | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go index 1f91641f3..a9ed7fcb8 100644 --- a/p2p/discover/udp.go +++ b/p2p/discover/udp.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/p2p/nat" "github.com/ethereum/go-ethereum/rlp" ) @@ -82,6 +83,7 @@ type udp struct { addpending chan *pending replies chan reply closing chan struct{} + nat nat.Interface *Table } @@ -121,17 +123,26 @@ type reply struct { } // ListenUDP returns a new table that listens for UDP packets on laddr. -func ListenUDP(priv *ecdsa.PrivateKey, laddr string) (*Table, error) { - net, realaddr, err := listen(priv, laddr) +func ListenUDP(priv *ecdsa.PrivateKey, laddr string, natm nat.Interface) (*Table, error) { + t, realaddr, err := listen(priv, laddr, natm) if err != nil { return nil, err } - net.Table = newTable(net, PubkeyID(&priv.PublicKey), realaddr) - log.Debugf("Listening, %v\n", net.self) - return net.Table, nil + if natm != nil { + if !realaddr.IP.IsLoopback() { + go nat.Map(natm, t.closing, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") + } + // TODO: react to external IP changes over time. + if ext, err := natm.ExternalIP(); err == nil { + realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port} + } + } + t.Table = newTable(t, PubkeyID(&priv.PublicKey), realaddr) + log.Infoln("Listening, ", t.self) + return t.Table, nil } -func listen(priv *ecdsa.PrivateKey, laddr string) (*udp, *net.UDPAddr, error) { +func listen(priv *ecdsa.PrivateKey, laddr string, nat nat.Interface) (*udp, *net.UDPAddr, error) { addr, err := net.ResolveUDPAddr("udp", laddr) if err != nil { return nil, nil, err |