From 8cbd4b91f719c4b837f119669be384f691285977 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 00:25:25 -0700 Subject: [PATCH 1/3] chore: better address parsing Use ma.SplitFunc instead of splitting the entire multiaddr and comparing bytes. This avoids a bunch of unnecessary allocation and copying. --- dial.go | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/dial.go b/dial.go index 6668f39..1b6e9db 100644 --- a/dial.go +++ b/dial.go @@ -20,28 +20,25 @@ func (d *RelayTransport) Dial(ctx context.Context, a ma.Multiaddr, p peer.ID) (t } func (r *Relay) Dial(ctx context.Context, a ma.Multiaddr, p peer.ID) (*Conn, error) { - if !r.Matches(a) { + // split /a/p2p-circuit/b into (/a, /p2p-circuit/b) + relayaddr, destaddr := ma.SplitFunc(a, func(c ma.Component) bool { + return c.Protocol().Code == P_CIRCUIT + }) + + // If the address contained no /p2p-circuit part, the second part is nil. + if destaddr == nil { return nil, fmt.Errorf("%s is not a relay address", a) } - parts := ma.Split(a) - - spl := ma.Cast(ma.CodeToVarint(P_CIRCUIT)) - var relayaddr, destaddr ma.Multiaddr - for i, p := range parts { - if p.Equal(spl) { - relayaddr = ma.Join(parts[:i]...) - destaddr = ma.Join(parts[i+1:]...) - break - } - } + // Strip the /p2p-circuit prefix from the destaddr. + _, destaddr = ma.SplitFirst(destaddr) dinfo := &peer.AddrInfo{ID: p, Addrs: []ma.Multiaddr{}} - if len(destaddr.Bytes()) > 0 { + if destaddr != nil { dinfo.Addrs = append(dinfo.Addrs, destaddr) } - if len(relayaddr.Bytes()) == 0 { + if relayaddr == nil { // unspecific relay address, try dialing using known hop relays return r.tryDialRelays(ctx, *dinfo) } From c7d6f3dae0d77351ba36337c797bce977b36a585 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 00:28:28 -0700 Subject: [PATCH 2/3] fix: expose full multiaddrs from conn.RemoteMultiaddr There's no reason _not_ to do this. --- conn.go | 15 +++++++++------ go.mod | 2 ++ listen.go | 2 +- transport.go | 3 +++ 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/conn.go b/conn.go index 8fa53b3..11f9476 100644 --- a/conn.go +++ b/conn.go @@ -80,12 +80,15 @@ func (c *Conn) untagHop() { // TODO: is it okay to cast c.Conn().RemotePeer() into a multiaddr? might be "user input" func (c *Conn) RemoteMultiaddr() ma.Multiaddr { - proto := ma.ProtocolWithCode(ma.P_P2P).Name - peerid := c.stream.Conn().RemotePeer().Pretty() - p2paddr := ma.StringCast(fmt.Sprintf("/%s/%s", proto, peerid)) - - circaddr := ma.Cast(ma.CodeToVarint(P_CIRCUIT)) - return p2paddr.Encapsulate(circaddr) + // TODO: We should be able to do this directly without converting to/from a string. + relayAddr, err := ma.NewComponent( + ma.ProtocolWithCode(ma.P_P2P).Name, + c.stream.Conn().RemotePeer().Pretty(), + ) + if err != nil { + panic(err) + } + return ma.Join(c.stream.Conn().RemoteMultiaddr(), relayAddr, circuitAddr) } func (c *Conn) LocalMultiaddr() ma.Multiaddr { diff --git a/go.mod b/go.mod index c9fb821..c4f1856 100644 --- a/go.mod +++ b/go.mod @@ -11,3 +11,5 @@ require ( github.com/multiformats/go-multiaddr v0.0.4 github.com/multiformats/go-multiaddr-net v0.0.1 ) + +go 1.12 diff --git a/listen.go b/listen.go index b00015b..2f0e60c 100644 --- a/listen.go +++ b/listen.go @@ -50,7 +50,7 @@ func (l *RelayListener) Addr() net.Addr { } func (l *RelayListener) Multiaddr() ma.Multiaddr { - return ma.Cast(ma.CodeToVarint(P_CIRCUIT)) + return circuitAddr } func (l *RelayListener) Close() error { diff --git a/transport.go b/transport.go index 57a6577..89ade49 100644 --- a/transport.go +++ b/transport.go @@ -20,8 +20,11 @@ var Protocol = ma.Protocol{ VCode: ma.CodeToVarint(P_CIRCUIT), } +var circuitAddr ma.Multiaddr + func init() { ma.AddProtocol(Protocol) + circuitAddr = ma.Cast(Protocol.VCode) } var _ transport.Transport = (*RelayTransport)(nil) From 9fde88933a1baf405b23688756719aee21881135 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 18 Sep 2019 10:02:44 -0700 Subject: [PATCH 3/3] test: don't hang on fail --- relay_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relay_test.go b/relay_test.go index 40a4829..b23c2e0 100644 --- a/relay_test.go +++ b/relay_test.go @@ -193,7 +193,6 @@ func TestRelayReset(t *testing.T) { func TestBasicRelayDial(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) - defer cancel() hosts := getNetHosts(t, ctx, 3) @@ -213,6 +212,7 @@ func TestBasicRelayDial(t *testing.T) { ) defer func() { + cancel() <-done if conn1 != nil { conn1.Close()