Browse Source

Merge pull request #33 from ipfs/feat/multistream-crypto

add multistream select to select which crypto to use
pull/36/head
Jeromy Johnson 9 years ago
parent
commit
fe95f0a086
  1. 12
      p2p/net/conn/dial.go
  2. 30
      p2p/net/conn/dial_test.go
  3. 18
      p2p/net/conn/listen.go
  4. 4
      p2p/net/swarm/swarm.go
  5. 2
      p2p/protocol/identify/id.go
  6. 2
      p2p/protocol/ping/ping.go
  7. 2
      p2p/protocol/relay/relay.go

12
p2p/net/conn/dial.go

@ -10,6 +10,7 @@ import (
addrutil "github.com/ipfs/go-libp2p/p2p/net/swarm/addr" addrutil "github.com/ipfs/go-libp2p/p2p/net/swarm/addr"
transport "github.com/ipfs/go-libp2p/p2p/net/transport" transport "github.com/ipfs/go-libp2p/p2p/net/transport"
peer "github.com/ipfs/go-libp2p/p2p/peer" peer "github.com/ipfs/go-libp2p/p2p/peer"
msmux "gx/ipfs/QmUeEcYJrzAEKdQXjzTxCgNZgc9sRuwharsvzzm5Gd2oGB/go-multistream"
manet "gx/ipfs/QmYVqhVfbK4BKvbW88Lhm26b3ud14sTBvcm1H7uWUx1Fkp/go-multiaddr-net" manet "gx/ipfs/QmYVqhVfbK4BKvbW88Lhm26b3ud14sTBvcm1H7uWUx1Fkp/go-multiaddr-net"
context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context"
ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr"
@ -62,6 +63,17 @@ func (d *Dialer) Dial(ctx context.Context, raddr ma.Multiaddr, remote peer.ID) (
maconn = d.Wrapper(maconn) maconn = d.Wrapper(maconn)
} }
cryptoProtoChoice := SecioTag
if !EncryptConnections {
cryptoProtoChoice = NoEncryptionTag
}
err = msmux.SelectProtoOrFail(cryptoProtoChoice, maconn)
if err != nil {
errOut = err
return
}
c, err := newSingleConn(ctx, d.LocalPeer, remote, maconn) c, err := newSingleConn(ctx, d.LocalPeer, remote, maconn)
if err != nil { if err != nil {
maconn.Close() maconn.Close()

30
p2p/net/conn/dial_test.go

@ -13,6 +13,7 @@ import (
peer "github.com/ipfs/go-libp2p/p2p/peer" peer "github.com/ipfs/go-libp2p/p2p/peer"
tu "github.com/ipfs/go-libp2p/testutil" tu "github.com/ipfs/go-libp2p/testutil"
msmux "gx/ipfs/QmUeEcYJrzAEKdQXjzTxCgNZgc9sRuwharsvzzm5Gd2oGB/go-multistream"
context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context"
ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr"
) )
@ -319,3 +320,32 @@ func TestDialerCloseEarlySecure(t *testing.T) {
// t.Skip("Skipping in favor of another test") // t.Skip("Skipping in favor of another test")
testDialerCloseEarly(t, true) testDialerCloseEarly(t, true)
} }
func TestMultistreamHeader(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
p1 := tu.RandPeerNetParamsOrFatal(t)
l1, err := Listen(ctx, p1.Addr, p1.ID, p1.PrivKey)
if err != nil {
t.Fatal(err)
}
p1.Addr = l1.Multiaddr() // Addr has been determined by kernel.
go func() {
_, _ = l1.Accept()
}()
con, err := net.Dial("tcp", l1.Addr().String())
if err != nil {
t.Fatal(err)
}
defer con.Close()
err = msmux.SelectProtoOrFail(SecioTag, con)
if err != nil {
t.Fatal(err)
}
}

18
p2p/net/conn/listen.go

@ -11,11 +11,15 @@ import (
peer "github.com/ipfs/go-libp2p/p2p/peer" peer "github.com/ipfs/go-libp2p/p2p/peer"
"gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess" "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess"
goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context" goprocessctx "gx/ipfs/QmQopLATEYMNg7dVqZRNDfeE2S1yKy8zrRh5xnYiuqeZBn/goprocess/context"
msmux "gx/ipfs/QmUeEcYJrzAEKdQXjzTxCgNZgc9sRuwharsvzzm5Gd2oGB/go-multistream"
tec "gx/ipfs/QmWHgLqrghM9zw77nF6gdvT9ExQ2RB9pLxkd8sDHZf1rWb/go-temp-err-catcher" tec "gx/ipfs/QmWHgLqrghM9zw77nF6gdvT9ExQ2RB9pLxkd8sDHZf1rWb/go-temp-err-catcher"
context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context" context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context"
ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr" ma "gx/ipfs/QmcobAGsCjYt5DXoq9et9L8yR8er7o7Cu3DTvpaq12jYSz/go-multiaddr"
) )
const SecioTag = "/secio/1.0.0"
const NoEncryptionTag = "/plaintext/1.0.0"
// ConnWrapper is any function that wraps a raw multiaddr connection // ConnWrapper is any function that wraps a raw multiaddr connection
type ConnWrapper func(transport.Conn) transport.Conn type ConnWrapper func(transport.Conn) transport.Conn
@ -31,6 +35,8 @@ type listener struct {
wrapper ConnWrapper wrapper ConnWrapper
proc goprocess.Process proc goprocess.Process
mux *msmux.MultistreamMuxer
} }
func (l *listener) teardown() error { func (l *listener) teardown() error {
@ -98,6 +104,11 @@ func (l *listener) Accept() (net.Conn, error) {
maconn = l.wrapper(maconn) maconn = l.wrapper(maconn)
} }
_, _, err = l.mux.Negotiate(maconn)
if err != nil {
return nil, err
}
c, err := newSingleConn(ctx, l.local, "", maconn) c, err := newSingleConn(ctx, l.local, "", maconn)
if err != nil { if err != nil {
if catcher.IsTemporary(err) { if catcher.IsTemporary(err) {
@ -150,9 +161,16 @@ func WrapTransportListener(ctx context.Context, ml transport.Listener, local pee
Listener: ml, Listener: ml,
local: local, local: local,
privk: sk, privk: sk,
mux: msmux.NewMultistreamMuxer(),
} }
l.proc = goprocessctx.WithContextAndTeardown(ctx, l.teardown) l.proc = goprocessctx.WithContextAndTeardown(ctx, l.teardown)
if EncryptConnections {
l.mux.AddHandler(SecioTag, nil)
} else {
l.mux.AddHandler(NoEncryptionTag, nil)
}
log.Debugf("Conn Listener on %s", l.Multiaddr()) log.Debugf("Conn Listener on %s", l.Multiaddr())
log.Event(ctx, "swarmListen", l) log.Event(ctx, "swarmListen", l)
return l, nil return l, nil

4
p2p/net/swarm/swarm.go

@ -46,8 +46,8 @@ func init() {
LogOutput: ioutil.Discard, LogOutput: ioutil.Discard,
} }
msstpt.AddTransport("/yamux", ymxtpt) msstpt.AddTransport("/yamux/1.0.0", ymxtpt)
msstpt.AddTransport("/spdystream", spdy.Transport) msstpt.AddTransport("/spdy/3.1.0", spdy.Transport)
PSTransport = msstpt PSTransport = msstpt
} }

2
p2p/protocol/identify/id.go

@ -22,7 +22,7 @@ import (
var log = logging.Logger("net/identify") var log = logging.Logger("net/identify")
// ID is the protocol.ID of the Identify Service. // ID is the protocol.ID of the Identify Service.
const ID = "/ipfs/identify" const ID = "/ipfs/id/1.0.0"
// LibP2PVersion holds the current protocol version for a client running this code // LibP2PVersion holds the current protocol version for a client running this code
// TODO(jbenet): fix the versioning mess. // TODO(jbenet): fix the versioning mess.

2
p2p/protocol/ping/ping.go

@ -18,7 +18,7 @@ var log = logging.Logger("ping")
const PingSize = 32 const PingSize = 32
const ID = "/ipfs/ping" const ID = "/ipfs/ping/1.0.0"
type PingService struct { type PingService struct {
Host host.Host Host host.Host

2
p2p/protocol/relay/relay.go

@ -17,7 +17,7 @@ import (
var log = logging.Logger("github.com/ipfs/go-libp2p/p2p/protocol/relay") var log = logging.Logger("github.com/ipfs/go-libp2p/p2p/protocol/relay")
// ID is the protocol.ID of the Relay Service. // ID is the protocol.ID of the Relay Service.
const ID protocol.ID = "/ipfs/relay" const ID protocol.ID = "/ipfs/relay/line/0.1.0"
// Relay is a structure that implements ProtocolRelay. // Relay is a structure that implements ProtocolRelay.
// It is a simple relay service which forwards traffic // It is a simple relay service which forwards traffic

Loading…
Cancel
Save