From ddb3d8945d4cea38a90819f263d3be5834ceb2a4 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Wed, 19 Jul 2017 15:03:36 -0400 Subject: [PATCH] p2p: allow listener with no external connection --- node/node.go | 13 +------------ p2p/listener.go | 11 +++++++---- rpc/lib/types/types.go | 1 + 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/node/node.go b/node/node.go index 4286fece..824a0926 100644 --- a/node/node.go +++ b/node/node.go @@ -309,7 +309,7 @@ func NewNode(config *cfg.Config, // OnStart starts the Node. It implements cmn.Service. func (n *Node) OnStart() error { // Create & add listener - protocol, address := ProtocolAndAddress(n.config.P2P.ListenAddress) + protocol, address := cmn.ProtocolAndAddress(n.config.P2P.ListenAddress) l := p2p.NewDefaultListener(protocol, address, n.config.P2P.SkipUPNP, n.Logger.With("module", "p2p")) n.sw.AddListener(l) @@ -535,15 +535,4 @@ func (n *Node) DialSeeds(seeds []string) error { return n.sw.DialSeeds(n.addrBook, seeds) } -// ProtocolAndAddress returns the transport protocol -// and the ip address from the given string. Defaults to tcp. -func ProtocolAndAddress(listenAddr string) (string, string) { - protocol, address := "tcp", listenAddr - parts := strings.SplitN(address, "://", 2) - if len(parts) == 2 { - protocol, address = parts[0], parts[1] - } - return protocol, address -} - //------------------------------------------------------------------------------ diff --git a/p2p/listener.go b/p2p/listener.go index 02d958d6..a382fbed 100644 --- a/p2p/listener.go +++ b/p2p/listener.go @@ -87,7 +87,7 @@ func NewDefaultListener(protocol string, lAddr string, skipUPNP bool, logger log } // Otherwise just use the local address... if extAddr == nil { - extAddr = getNaiveExternalAddress(listenerPort) + extAddr = getNaiveExternalAddress(listenerPort, false, logger) } if extAddr == nil { cmn.PanicCrisis("Could not determine external address!") @@ -197,7 +197,7 @@ func getUPNPExternalAddress(externalPort, internalPort int, logger log.Logger) * } // TODO: use syscalls: http://pastebin.com/9exZG4rh -func getNaiveExternalAddress(port int) *NetAddress { +func getNaiveExternalAddress(port int, settleForLocal bool, logger log.Logger) *NetAddress { addrs, err := net.InterfaceAddrs() if err != nil { cmn.PanicCrisis(cmn.Fmt("Could not fetch interface addresses: %v", err)) @@ -209,10 +209,13 @@ func getNaiveExternalAddress(port int) *NetAddress { continue } v4 := ipnet.IP.To4() - if v4 == nil || v4[0] == 127 { + if v4 == nil || (!settleForLocal && v4[0] == 127) { continue } // loopback return NewNetAddressIPPort(ipnet.IP, uint16(port)) } - return nil + + // try again, but settle for local + logger.Info("Node may not be connected to internet. Settling for local address") + return getNaiveExternalAddress(port, true, logger) } diff --git a/rpc/lib/types/types.go b/rpc/lib/types/types.go index 0267c529..4928db51 100644 --- a/rpc/lib/types/types.go +++ b/rpc/lib/types/types.go @@ -144,6 +144,7 @@ type WSRPCContext struct { // // Determine if its a unix or tcp socket. // If tcp, must specify the port; `0.0.0.0` will return incorrectly as "unix" since there's no port +// TODO: deprecate func SocketType(listenAddr string) string { socketType := "unix" if len(strings.Split(listenAddr, ":")) >= 2 {