From 4807127def5d44f2cc71f15f3023e4f0190b54df Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 24 Dec 2014 10:17:26 -0800 Subject: [PATCH 01/21] net: move Network implementation to own pkg I needed the network implementation in its own package, because I'll be writing several services that will plug into _it_ that shouldn't be part of the core net package. and then there were dependency conflicts. yay. mux + identify are good examples of what i mean. --- core/core.go | 3 +- net/backpressure/backpressure_test.go | 44 +++--------- net/interface.go | 6 +- net/{ => ipfsnet}/net.go | 98 +++++++++++++------------- net/{ => ipfsnet}/net_test.go | 6 +- net/ipfsnet/util/util.go | 31 ++++++++ net/mock/mock_conn.go | 3 +- net/mock/mock_peernet.go | 12 ++-- net/{ => services/identify}/id.go | 35 +++++---- net/{ => services/identify}/id_test.go | 29 ++------ net/{ => services/mux}/mux.go | 34 ++++++--- net/{ => services/mux}/mux_test.go | 10 +-- routing/dht/dht_test.go | 4 +- 13 files changed, 165 insertions(+), 150 deletions(-) rename net/{ => ipfsnet}/net.go (71%) rename net/{ => ipfsnet}/net_test.go (93%) create mode 100644 net/ipfsnet/util/util.go rename net/{ => services/identify}/id.go (84%) rename net/{ => services/identify}/id_test.go (82%) rename net/{ => services/mux}/mux.go (78%) rename net/{ => services/mux}/mux_test.go (86%) diff --git a/core/core.go b/core/core.go index 7cabef281..41e974c30 100644 --- a/core/core.go +++ b/core/core.go @@ -21,6 +21,7 @@ import ( merkledag "github.com/jbenet/go-ipfs/merkledag" namesys "github.com/jbenet/go-ipfs/namesys" inet "github.com/jbenet/go-ipfs/net" + ipfsnet "github.com/jbenet/go-ipfs/net/ipfsnet" path "github.com/jbenet/go-ipfs/path" peer "github.com/jbenet/go-ipfs/peer" pin "github.com/jbenet/go-ipfs/pin" @@ -121,7 +122,7 @@ func NewIpfsNode(ctx context.Context, cfg *config.Config, online bool) (n *IpfsN return nil, debugerror.Wrap(err) } - n.Network, err = inet.NewNetwork(ctx, listenAddrs, n.Identity, n.Peerstore) + n.Network, err = ipfsnet.NewNetwork(ctx, listenAddrs, n.Identity, n.Peerstore) if err != nil { return nil, debugerror.Wrap(err) } diff --git a/net/backpressure/backpressure_test.go b/net/backpressure/backpressure_test.go index 7a8593ee4..72e0b2634 100644 --- a/net/backpressure/backpressure_test.go +++ b/net/backpressure/backpressure_test.go @@ -8,30 +8,15 @@ import ( "time" inet "github.com/jbenet/go-ipfs/net" + netutil "github.com/jbenet/go-ipfs/net/ipfsnet/util" peer "github.com/jbenet/go-ipfs/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" - testutil "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) var log = eventlog.Logger("backpressure") -func GenNetwork(t *testing.T, ctx context.Context) (inet.Network, error) { - p := testutil.RandPeerNetParamsOrFatal(t) - ps := peer.NewPeerstore() - ps.AddAddress(p.ID, p.Addr) - ps.AddPubKey(p.ID, p.PubKey) - ps.AddPrivKey(p.ID, p.PrivKey) - return inet.NewNetwork(ctx, ps.Addresses(p.ID), p.ID, ps) -} - -func divulgeAddresses(a, b inet.Network) { - id := a.LocalPeer() - addrs := a.Peerstore().Addresses(id) - b.Peerstore().AddAddresses(id, addrs) -} - // TestBackpressureStreamHandler tests whether mux handler // ratelimiting works. Meaning, since the handler is sequential // it should block senders. @@ -149,14 +134,8 @@ a problem. // ok that's enough setup. let's do it! ctx := context.Background() - n1, err := GenNetwork(t, ctx) - if err != nil { - t.Fatal(err) - } - n2, err := GenNetwork(t, ctx) - if err != nil { - t.Fatal(err) - } + n1 := netutil.GenNetwork(t, ctx) + n2 := netutil.GenNetwork(t, ctx) // setup receiver handler n1.SetHandler(inet.ProtocolTesting, receiver) @@ -291,17 +270,11 @@ func TestStBackpressureStreamWrite(t *testing.T) { // setup the networks ctx := context.Background() - n1, err := GenNetwork(t, ctx) - if err != nil { - t.Fatal(err) - } - n2, err := GenNetwork(t, ctx) - if err != nil { - t.Fatal(err) - } + n1 := netutil.GenNetwork(t, ctx) + n2 := netutil.GenNetwork(t, ctx) - divulgeAddresses(n1, n2) - divulgeAddresses(n2, n1) + netutil.DivulgeAddresses(n1, n2) + netutil.DivulgeAddresses(n2, n1) // setup sender handler on 1 n1.SetHandler(inet.ProtocolTesting, sender) @@ -313,6 +286,9 @@ func TestStBackpressureStreamWrite(t *testing.T) { // open a stream, from 2->1, this is our reader s, err := n2.NewStream(inet.ProtocolTesting, n1.LocalPeer()) + if err != nil { + t.Fatal(err) + } // let's make sure r/w works. testSenderWrote := func(bytesE int) { diff --git a/net/interface.go b/net/interface.go index 7f9f3e617..5f16ec84e 100644 --- a/net/interface.go +++ b/net/interface.go @@ -23,6 +23,7 @@ const ( ProtocolDHT ProtocolID = "/ipfs/dht" ProtocolIdentify ProtocolID = "/ipfs/id" ProtocolDiag ProtocolID = "/ipfs/diagnostics" + ProtocolRelay ProtocolID = "/ipfs/relay" ) // MessageSizeMax is a soft (recommended) maximum for network messages. @@ -96,11 +97,6 @@ type Network interface { // CtxGroup returns the network's contextGroup CtxGroup() ctxgroup.ContextGroup - - // IdentifyProtocol returns the instance of the object running the Identify - // Protocol. This is what runs the ifps handshake-- this should be removed - // if this abstracted out to its own package. - IdentifyProtocol() *IDService } // Dialer represents a service that can dial out to peers diff --git a/net/net.go b/net/ipfsnet/net.go similarity index 71% rename from net/net.go rename to net/ipfsnet/net.go index 39afc6b10..bbd356ff9 100644 --- a/net/net.go +++ b/net/ipfsnet/net.go @@ -5,14 +5,20 @@ import ( "fmt" ic "github.com/jbenet/go-ipfs/crypto" + inet "github.com/jbenet/go-ipfs/net" + ids "github.com/jbenet/go-ipfs/net/services/identify" + mux "github.com/jbenet/go-ipfs/net/services/mux" swarm "github.com/jbenet/go-ipfs/net/swarm" peer "github.com/jbenet/go-ipfs/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) +var log = eventlog.Logger("net/mux") + type stream swarm.Stream func (s *stream) SwarmStream() *swarm.Stream { @@ -20,7 +26,7 @@ func (s *stream) SwarmStream() *swarm.Stream { } // Conn returns the connection this stream is part of. -func (s *stream) Conn() Conn { +func (s *stream) Conn() inet.Conn { c := s.SwarmStream().Conn() return (*conn_)(c) } @@ -50,7 +56,7 @@ func (c *conn_) SwarmConn() *swarm.Conn { return (*swarm.Conn)(c) } -func (c *conn_) NewStreamWithProtocol(pr ProtocolID) (Stream, error) { +func (c *conn_) NewStreamWithProtocol(pr inet.ProtocolID) (inet.Stream, error) { s, err := (*swarm.Conn)(c).NewStream() if err != nil { return nil, err @@ -58,7 +64,7 @@ func (c *conn_) NewStreamWithProtocol(pr ProtocolID) (Stream, error) { ss := (*stream)(s) - if err := WriteProtocolHeader(pr, ss); err != nil { + if err := mux.WriteProtocolHeader(pr, ss); err != nil { ss.Close() return nil, err } @@ -90,30 +96,32 @@ func (c *conn_) RemotePublicKey() ic.PubKey { return c.SwarmConn().RemotePublicKey() } -// network implements the Network interface, -type network struct { - local peer.ID // local peer - mux Mux // protocol multiplexing - swarm *swarm.Swarm // peer connection multiplexing +// Network implements the inet.Network interface. +// It uses a swarm to connect to remote hosts. +type Network struct { + local peer.ID // local peer ps peer.Peerstore - ids *IDService + + swarm *swarm.Swarm // peer connection multiplexing + mux mux.Mux // protocol multiplexing + ids *ids.IDService cg ctxgroup.ContextGroup // for Context closing } // NewNetwork constructs a new network and starts listening on given addresses. func NewNetwork(ctx context.Context, listen []ma.Multiaddr, local peer.ID, - peers peer.Peerstore) (Network, error) { + peers peer.Peerstore) (*Network, error) { s, err := swarm.NewSwarm(ctx, listen, local, peers) if err != nil { return nil, err } - n := &network{ + n := &Network{ local: local, swarm: s, - mux: Mux{Handlers: StreamHandlerMap{}}, + mux: mux.Mux{Handlers: inet.StreamHandlerMap{}}, cg: ctxgroup.WithContext(ctx), ps: peers, } @@ -127,20 +135,20 @@ func NewNetwork(ctx context.Context, listen []ma.Multiaddr, local peer.ID, // setup a conn handler that immediately "asks the other side about them" // this is ProtocolIdentify. - n.ids = NewIDService(n) + n.ids = ids.NewIDService(n) s.SetConnHandler(n.newConnHandler) return n, nil } -func (n *network) newConnHandler(c *swarm.Conn) { +func (n *Network) newConnHandler(c *swarm.Conn) { cc := (*conn_)(c) n.ids.IdentifyConn(cc) } // DialPeer attempts to establish a connection to a given peer. // Respects the context. -func (n *network) DialPeer(ctx context.Context, p peer.ID) error { +func (n *Network) DialPeer(ctx context.Context, p peer.ID) error { log.Debugf("[%s] network dialing peer [%s]", n.local, p) sc, err := n.swarm.Dial(ctx, p) if err != nil { @@ -165,39 +173,40 @@ func (n *network) DialPeer(ctx context.Context, p peer.ID) error { return nil } -func (n *network) Protocols() []ProtocolID { +// Protocols returns the ProtocolIDs of all the registered handlers. +func (n *Network) Protocols() []inet.ProtocolID { return n.mux.Protocols() } // CtxGroup returns the network's ContextGroup -func (n *network) CtxGroup() ctxgroup.ContextGroup { +func (n *Network) CtxGroup() ctxgroup.ContextGroup { return n.cg } // Swarm returns the network's peerstream.Swarm -func (n *network) Swarm() *swarm.Swarm { +func (n *Network) Swarm() *swarm.Swarm { return n.Swarm() } // LocalPeer the network's LocalPeer -func (n *network) LocalPeer() peer.ID { +func (n *Network) LocalPeer() peer.ID { return n.swarm.LocalPeer() } // Peers returns the connected peers -func (n *network) Peers() []peer.ID { +func (n *Network) Peers() []peer.ID { return n.swarm.Peers() } // Peers returns the connected peers -func (n *network) Peerstore() peer.Peerstore { +func (n *Network) Peerstore() peer.Peerstore { return n.ps } // Conns returns the connected peers -func (n *network) Conns() []Conn { +func (n *Network) Conns() []inet.Conn { conns1 := n.swarm.Connections() - out := make([]Conn, len(conns1)) + out := make([]inet.Conn, len(conns1)) for i, c := range conns1 { out[i] = (*conn_)(c) } @@ -205,9 +214,9 @@ func (n *network) Conns() []Conn { } // ConnsToPeer returns the connections in this Netowrk for given peer. -func (n *network) ConnsToPeer(p peer.ID) []Conn { +func (n *Network) ConnsToPeer(p peer.ID) []inet.Conn { conns1 := n.swarm.ConnectionsToPeer(p) - out := make([]Conn, len(conns1)) + out := make([]inet.Conn, len(conns1)) for i, c := range conns1 { out[i] = (*conn_)(c) } @@ -215,53 +224,53 @@ func (n *network) ConnsToPeer(p peer.ID) []Conn { } // ClosePeer connection to peer -func (n *network) ClosePeer(p peer.ID) error { +func (n *Network) ClosePeer(p peer.ID) error { return n.swarm.CloseConnection(p) } // close is the real teardown function -func (n *network) close() error { +func (n *Network) close() error { return n.swarm.Close() } // Close calls the ContextCloser func -func (n *network) Close() error { +func (n *Network) Close() error { return n.cg.Close() } // BandwidthTotals returns the total amount of bandwidth transferred -func (n *network) BandwidthTotals() (in uint64, out uint64) { +func (n *Network) BandwidthTotals() (in uint64, out uint64) { // need to implement this. probably best to do it in swarm this time. // need a "metrics" object return 0, 0 } // ListenAddresses returns a list of addresses at which this network listens. -func (n *network) ListenAddresses() []ma.Multiaddr { +func (n *Network) ListenAddresses() []ma.Multiaddr { return n.swarm.ListenAddresses() } // InterfaceListenAddresses returns a list of addresses at which this network // listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to // use the known local interfaces. -func (n *network) InterfaceListenAddresses() ([]ma.Multiaddr, error) { +func (n *Network) InterfaceListenAddresses() ([]ma.Multiaddr, error) { return swarm.InterfaceListenAddresses(n.swarm) } // Connectedness returns a state signaling connection capabilities // For now only returns Connected || NotConnected. Expand into more later. -func (n *network) Connectedness(p peer.ID) Connectedness { +func (n *Network) Connectedness(p peer.ID) inet.Connectedness { c := n.swarm.ConnectionsToPeer(p) if c != nil && len(c) > 0 { - return Connected + return inet.Connected } - return NotConnected + return inet.NotConnected } // NewStream returns a new stream to given peer p. // If there is no connection to p, attempts to create one. // If ProtocolID is "", writes no header. -func (n *network) NewStream(pr ProtocolID, p peer.ID) (Stream, error) { +func (n *Network) NewStream(pr inet.ProtocolID, p peer.ID) (inet.Stream, error) { log.Debugf("[%s] network opening stream to peer [%s]: %s", n.local, p, pr) s, err := n.swarm.NewStreamWithPeer(p) if err != nil { @@ -270,7 +279,7 @@ func (n *network) NewStream(pr ProtocolID, p peer.ID) (Stream, error) { ss := (*stream)(s) - if err := WriteProtocolHeader(pr, ss); err != nil { + if err := mux.WriteProtocolHeader(pr, ss); err != nil { ss.Close() return nil, err } @@ -280,23 +289,16 @@ func (n *network) NewStream(pr ProtocolID, p peer.ID) (Stream, error) { // SetHandler sets the protocol handler on the Network's Muxer. // This operation is threadsafe. -func (n *network) SetHandler(p ProtocolID, h StreamHandler) { +func (n *Network) SetHandler(p inet.ProtocolID, h inet.StreamHandler) { n.mux.SetHandler(p, h) } -func (n *network) String() string { +// String returns a string representation of Network. +func (n *Network) String() string { return fmt.Sprintf("", n.LocalPeer()) } -func (n *network) IdentifyProtocol() *IDService { +// IdentifyProtocol returns the network's IDService +func (n *Network) IdentifyProtocol() *ids.IDService { return n.ids } - -func WriteProtocolHeader(pr ProtocolID, s Stream) error { - if pr != "" { // only write proper protocol headers - if err := WriteLengthPrefix(s, string(pr)); err != nil { - return err - } - } - return nil -} diff --git a/net/net_test.go b/net/ipfsnet/net_test.go similarity index 93% rename from net/net_test.go rename to net/ipfsnet/net_test.go index 0704ec25c..8cdd30f84 100644 --- a/net/net_test.go +++ b/net/ipfsnet/net_test.go @@ -6,7 +6,9 @@ import ( "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + inet "github.com/jbenet/go-ipfs/net" + netutil "github.com/jbenet/go-ipfs/net/ipfsnet/util" ) // TestConnectednessCorrect starts a few networks, connects a few @@ -17,13 +19,13 @@ func TestConnectednessCorrect(t *testing.T) { nets := make([]inet.Network, 4) for i := 0; i < 4; i++ { - nets[i] = GenNetwork(t, ctx) + nets[i] = netutil.GenNetwork(t, ctx) } // connect 0-1, 0-2, 0-3, 1-2, 2-3 dial := func(a, b inet.Network) { - DivulgeAddresses(b, a) + netutil.DivulgeAddresses(b, a) if err := a.DialPeer(ctx, b.LocalPeer()); err != nil { t.Fatalf("Failed to dial: %s", err) } diff --git a/net/ipfsnet/util/util.go b/net/ipfsnet/util/util.go new file mode 100644 index 000000000..6260cfc3f --- /dev/null +++ b/net/ipfsnet/util/util.go @@ -0,0 +1,31 @@ +package testutil + +import ( + "testing" + + inet "github.com/jbenet/go-ipfs/net" + in "github.com/jbenet/go-ipfs/net/ipfsnet" + peer "github.com/jbenet/go-ipfs/peer" + tu "github.com/jbenet/go-ipfs/util/testutil" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +func GenNetwork(t *testing.T, ctx context.Context) *in.Network { + p := tu.RandPeerNetParamsOrFatal(t) + ps := peer.NewPeerstore() + ps.AddAddress(p.ID, p.Addr) + ps.AddPubKey(p.ID, p.PubKey) + ps.AddPrivKey(p.ID, p.PrivKey) + n, err := in.NewNetwork(ctx, ps.Addresses(p.ID), p.ID, ps) + if err != nil { + t.Fatal(err) + } + return n +} + +func DivulgeAddresses(a, b inet.Network) { + id := a.LocalPeer() + addrs := a.Peerstore().Addresses(id) + b.Peerstore().AddAddresses(id, addrs) +} diff --git a/net/mock/mock_conn.go b/net/mock/mock_conn.go index e92ff6fa4..89af0a4a4 100644 --- a/net/mock/mock_conn.go +++ b/net/mock/mock_conn.go @@ -6,6 +6,7 @@ import ( ic "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" + mux "github.com/jbenet/go-ipfs/net/services/mux" peer "github.com/jbenet/go-ipfs/peer" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" @@ -86,7 +87,7 @@ func (c *conn) NewStreamWithProtocol(pr inet.ProtocolID) (inet.Stream, error) { log.Debugf("Conn.NewStreamWithProtocol: %s --> %s", c.local, c.remote) s := c.openStream() - if err := inet.WriteProtocolHeader(pr, s); err != nil { + if err := mux.WriteProtocolHeader(pr, s); err != nil { s.Close() return nil, err } diff --git a/net/mock/mock_peernet.go b/net/mock/mock_peernet.go index 51ffb1e72..675c73442 100644 --- a/net/mock/mock_peernet.go +++ b/net/mock/mock_peernet.go @@ -7,6 +7,8 @@ import ( ic "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" + ids "github.com/jbenet/go-ipfs/net/services/identify" + mux "github.com/jbenet/go-ipfs/net/services/mux" peer "github.com/jbenet/go-ipfs/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -28,8 +30,8 @@ type peernet struct { connsByLink map[*link]map[*conn]struct{} // needed to implement inet.Network - mux inet.Mux - ids *inet.IDService + mux mux.Mux + ids *ids.IDService cg ctxgroup.ContextGroup sync.RWMutex @@ -54,7 +56,7 @@ func newPeernet(ctx context.Context, m *mocknet, k ic.PrivKey, mocknet: m, peer: p, ps: ps, - mux: inet.Mux{Handlers: inet.StreamHandlerMap{}}, + mux: mux.Mux{Handlers: inet.StreamHandlerMap{}}, cg: ctxgroup.WithContext(ctx), connsByPeer: map[peer.ID]map[*conn]struct{}{}, @@ -65,7 +67,7 @@ func newPeernet(ctx context.Context, m *mocknet, k ic.PrivKey, // setup a conn handler that immediately "asks the other side about them" // this is ProtocolIdentify. - n.ids = inet.NewIDService(n) + n.ids = ids.NewIDService(n) return n, nil } @@ -338,6 +340,6 @@ func (pn *peernet) SetHandler(p inet.ProtocolID, h inet.StreamHandler) { pn.mux.SetHandler(p, h) } -func (pn *peernet) IdentifyProtocol() *inet.IDService { +func (pn *peernet) IdentifyProtocol() *ids.IDService { return pn.ids } diff --git a/net/id.go b/net/services/identify/id.go similarity index 84% rename from net/id.go rename to net/services/identify/id.go index 802d54794..df624187d 100644 --- a/net/id.go +++ b/net/services/identify/id.go @@ -1,15 +1,22 @@ -package net +package identify import ( "sync" - handshake "github.com/jbenet/go-ipfs/net/handshake" - pb "github.com/jbenet/go-ipfs/net/handshake/pb" - ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + + inet "github.com/jbenet/go-ipfs/net" + handshake "github.com/jbenet/go-ipfs/net/handshake" + pb "github.com/jbenet/go-ipfs/net/handshake/pb" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) +var log = eventlog.Logger("net/identify") + +// ProtocolIdentify is the ProtocolID of the Identify Service. +const ProtocolIdentify inet.ProtocolID = "/ipfs/identify" + // IDService is a structure that implements ProtocolIdentify. // It is a trivial service that gives the other peer some // useful information about the local peer. A sort of hello. @@ -19,24 +26,24 @@ import ( // * Our IPFS Agent Version // * Our public Listen Addresses type IDService struct { - Network Network + Network inet.Network // connections undergoing identification // for wait purposes - currid map[Conn]chan struct{} + currid map[inet.Conn]chan struct{} currmu sync.RWMutex } -func NewIDService(n Network) *IDService { +func NewIDService(n inet.Network) *IDService { s := &IDService{ Network: n, - currid: make(map[Conn]chan struct{}), + currid: make(map[inet.Conn]chan struct{}), } n.SetHandler(ProtocolIdentify, s.RequestHandler) return s } -func (ids *IDService) IdentifyConn(c Conn) { +func (ids *IDService) IdentifyConn(c inet.Conn) { ids.currmu.Lock() if wait, found := ids.currid[c]; found { ids.currmu.Unlock() @@ -70,7 +77,7 @@ func (ids *IDService) IdentifyConn(c Conn) { close(ch) // release everyone waiting. } -func (ids *IDService) RequestHandler(s Stream) { +func (ids *IDService) RequestHandler(s inet.Stream) { defer s.Close() c := s.Conn() @@ -83,7 +90,7 @@ func (ids *IDService) RequestHandler(s Stream) { c.RemotePeer(), c.RemoteMultiaddr()) } -func (ids *IDService) ResponseHandler(s Stream) { +func (ids *IDService) ResponseHandler(s inet.Stream) { defer s.Close() c := s.Conn() @@ -100,7 +107,7 @@ func (ids *IDService) ResponseHandler(s Stream) { c.RemotePeer(), c.RemoteMultiaddr()) } -func (ids *IDService) populateMessage(mes *pb.Handshake3, c Conn) { +func (ids *IDService) populateMessage(mes *pb.Handshake3, c inet.Conn) { // set protocols this node is currently handling protos := ids.Network.Protocols() @@ -129,7 +136,7 @@ func (ids *IDService) populateMessage(mes *pb.Handshake3, c Conn) { mes.H1 = handshake.NewHandshake1("", "") } -func (ids *IDService) consumeMessage(mes *pb.Handshake3, c Conn) { +func (ids *IDService) consumeMessage(mes *pb.Handshake3, c inet.Conn) { p := c.RemotePeer() // mes.Protocols @@ -164,7 +171,7 @@ func (ids *IDService) consumeMessage(mes *pb.Handshake3, c Conn) { // This happens async so the connection can start to be used // even if handshake3 knowledge is not necesary. // Users **MUST** call IdentifyWait _after_ IdentifyConn -func (ids *IDService) IdentifyWait(c Conn) <-chan struct{} { +func (ids *IDService) IdentifyWait(c inet.Conn) <-chan struct{} { ids.currmu.Lock() ch, found := ids.currid[c] ids.currmu.Unlock() diff --git a/net/id_test.go b/net/services/identify/id_test.go similarity index 82% rename from net/id_test.go rename to net/services/identify/id_test.go index 524616a2d..6583683a4 100644 --- a/net/id_test.go +++ b/net/services/identify/id_test.go @@ -1,4 +1,4 @@ -package net_test +package identify_test import ( "testing" @@ -6,38 +6,19 @@ import ( inet "github.com/jbenet/go-ipfs/net" handshake "github.com/jbenet/go-ipfs/net/handshake" + netutil "github.com/jbenet/go-ipfs/net/ipfsnet/util" peer "github.com/jbenet/go-ipfs/peer" - testutil "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ) -func GenNetwork(t *testing.T, ctx context.Context) inet.Network { - p := testutil.RandPeerNetParamsOrFatal(t) - ps := peer.NewPeerstore() - ps.AddAddress(p.ID, p.Addr) - ps.AddPubKey(p.ID, p.PubKey) - ps.AddPrivKey(p.ID, p.PrivKey) - n, err := inet.NewNetwork(ctx, ps.Addresses(p.ID), p.ID, ps) - if err != nil { - t.Fatal(err) - } - return n -} - -func DivulgeAddresses(a, b inet.Network) { - id := a.LocalPeer() - addrs := a.Peerstore().Addresses(id) - b.Peerstore().AddAddresses(id, addrs) -} - func subtestIDService(t *testing.T, postDialWait time.Duration) { // the generated networks should have the id service wired in. ctx := context.Background() - n1 := GenNetwork(t, ctx) - n2 := GenNetwork(t, ctx) + n1 := netutil.GenNetwork(t, ctx) + n2 := netutil.GenNetwork(t, ctx) n1p := n1.LocalPeer() n2p := n2.LocalPeer() @@ -46,7 +27,7 @@ func subtestIDService(t *testing.T, postDialWait time.Duration) { testKnowsAddrs(t, n2, n1p, []ma.Multiaddr{}) // nothing // have n2 tell n1, so we can dial... - DivulgeAddresses(n2, n1) + netutil.DivulgeAddresses(n2, n1) testKnowsAddrs(t, n1, n2p, n2.Peerstore().Addresses(n2p)) // has them testKnowsAddrs(t, n2, n1p, []ma.Multiaddr{}) // nothing diff --git a/net/mux.go b/net/services/mux/mux.go similarity index 78% rename from net/mux.go rename to net/services/mux/mux.go index d2bb7dc22..a89c32678 100644 --- a/net/mux.go +++ b/net/services/mux/mux.go @@ -1,4 +1,4 @@ -package net +package mux import ( "fmt" @@ -6,11 +6,13 @@ import ( "sync" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + + inet "github.com/jbenet/go-ipfs/net" eventlog "github.com/jbenet/go-ipfs/util/eventlog" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" ) -var log = eventlog.Logger("network") +var log = eventlog.Logger("net/mux") // Mux provides simple stream multixplexing. // It helps you precisely when: @@ -30,16 +32,16 @@ var log = eventlog.Logger("network") // WARNING: this datastructure IS NOT threadsafe. // do not modify it once the network is using it. type Mux struct { - Default StreamHandler // handles unknown protocols. - Handlers StreamHandlerMap + Default inet.StreamHandler // handles unknown protocols. + Handlers inet.StreamHandlerMap sync.RWMutex } // Protocols returns the list of protocols this muxer has handlers for -func (m *Mux) Protocols() []ProtocolID { +func (m *Mux) Protocols() []inet.ProtocolID { m.RLock() - l := make([]ProtocolID, 0, len(m.Handlers)) + l := make([]inet.ProtocolID, 0, len(m.Handlers)) for p := range m.Handlers { l = append(l, p) } @@ -49,7 +51,7 @@ func (m *Mux) Protocols() []ProtocolID { // ReadProtocolHeader reads the stream and returns the next Handler function // according to the muxer encoding. -func (m *Mux) ReadProtocolHeader(s io.Reader) (string, StreamHandler, error) { +func (m *Mux) ReadProtocolHeader(s io.Reader) (string, inet.StreamHandler, error) { // log.Error("ReadProtocolHeader") name, err := ReadLengthPrefix(s) if err != nil { @@ -58,7 +60,7 @@ func (m *Mux) ReadProtocolHeader(s io.Reader) (string, StreamHandler, error) { // log.Debug("ReadProtocolHeader got:", name) m.RLock() - h, found := m.Handlers[ProtocolID(name)] + h, found := m.Handlers[inet.ProtocolID(name)] m.RUnlock() switch { @@ -80,7 +82,7 @@ func (m *Mux) String() string { // SetHandler sets the protocol handler on the Network's Muxer. // This operation is threadsafe. -func (m *Mux) SetHandler(p ProtocolID, h StreamHandler) { +func (m *Mux) SetHandler(p inet.ProtocolID, h inet.StreamHandler) { log.Debugf("%s setting handler for protocol: %s (%d)", m, p, len(p)) m.Lock() m.Handlers[p] = h @@ -88,7 +90,8 @@ func (m *Mux) SetHandler(p ProtocolID, h StreamHandler) { } // Handle reads the next name off the Stream, and calls a function -func (m *Mux) Handle(s Stream) { +func (m *Mux) Handle(s inet.Stream) { + ctx := context.Background() name, handler, err := m.ReadProtocolHeader(s) @@ -133,3 +136,14 @@ func WriteLengthPrefix(w io.Writer, name string) error { _, err := w.Write(s) return err } + +// WriteProtocolHeader defines how a protocol is written into the header of +// a stream. This is so the muxer can multiplex between services. +func WriteProtocolHeader(pr inet.ProtocolID, s inet.Stream) error { + if pr != "" { // only write proper protocol headers + if err := WriteLengthPrefix(s, string(pr)); err != nil { + return err + } + } + return nil +} diff --git a/net/mux_test.go b/net/services/mux/mux_test.go similarity index 86% rename from net/mux_test.go rename to net/services/mux/mux_test.go index 2dff54c33..ac6e54843 100644 --- a/net/mux_test.go +++ b/net/services/mux/mux_test.go @@ -1,8 +1,10 @@ -package net +package mux import ( "bytes" "testing" + + inet "github.com/jbenet/go-ipfs/net" ) var testCases = map[string]string{ @@ -28,13 +30,13 @@ func TestHandler(t *testing.T) { outs := make(chan string, 10) - h := func(n string) func(s Stream) { - return func(s Stream) { + h := func(n string) func(s inet.Stream) { + return func(s inet.Stream) { outs <- n } } - m := Mux{Handlers: StreamHandlerMap{}} + m := Mux{Handlers: inet.StreamHandlerMap{}} m.Default = h("default") m.Handlers["dht"] = h("bitswap") // m.Handlers["ipfs"] = h("bitswap") // default! diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 5eeb3a2bc..4e49b8f96 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,7 +14,7 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - inet "github.com/jbenet/go-ipfs/net" + ipfsnet "github.com/jbenet/go-ipfs/net/ipfsnet" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" @@ -49,7 +49,7 @@ func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT { peerstore.AddPubKey(p, pk) peerstore.AddAddress(p, addr) - n, err := inet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) + n, err := ipfsnet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) if err != nil { t.Fatal(err) } From 7bbc0084be6c623b85046b9d1e6a652b25e106fa Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 24 Dec 2014 10:30:35 -0800 Subject: [PATCH 02/21] updated go.crypto/sha3 --- Godeps/Godeps.json | 8 +- .../code.google.com/p/go.crypto/sha3/doc.go | 68 +++ .../p/go.crypto/sha3/hashes.go | 65 +++ .../p/go.crypto/sha3/keccakKats.json.deflate | Bin 0 -> 521342 bytes .../p/go.crypto/sha3/keccakf.go | 491 +++++++++++++----- .../p/go.crypto/sha3/register.go | 18 + .../code.google.com/p/go.crypto/sha3/sha3.go | 359 +++++++------ .../p/go.crypto/sha3/sha3_test.go | 299 +++++------ .../code.google.com/p/go.crypto/sha3/shake.go | 60 +++ 9 files changed, 908 insertions(+), 460 deletions(-) create mode 100644 Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/doc.go create mode 100644 Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/hashes.go create mode 100644 Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/keccakKats.json.deflate create mode 100644 Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/register.go create mode 100644 Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/shake.go diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index ffd4f1ceb..9803360f6 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -21,13 +21,13 @@ }, { "ImportPath": "code.google.com/p/go.crypto/blowfish", - "Comment": "null-219", - "Rev": "00a7d3b31bbab5795b4a51933c04fc2768242970" + "Comment": "null-236", + "Rev": "69e2a90ed92d03812364aeb947b7068dc42e561e" }, { "ImportPath": "code.google.com/p/go.crypto/sha3", - "Comment": "null-219", - "Rev": "00a7d3b31bbab5795b4a51933c04fc2768242970" + "Comment": "null-236", + "Rev": "69e2a90ed92d03812364aeb947b7068dc42e561e" }, { "ImportPath": "code.google.com/p/go.net/context", diff --git a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/doc.go b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/doc.go new file mode 100644 index 000000000..0ba123b1f --- /dev/null +++ b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/doc.go @@ -0,0 +1,68 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package sha3 implements the SHA-3 fixed-output-length hash functions and +// the SHAKE variable-output-length hash functions defined by FIPS-202. +// +// Both types of hash function use the "sponge" construction and the Keccak +// permutation. For a detailed specification see http://keccak.noekeon.org/ +// +// +// Guidance +// +// If you aren't sure what function you need, use SHAKE256 with at least 64 +// bytes of output. +// +// If you need a secret-key MAC (message authentication code), prepend the +// secret key to the input, hash with SHAKE256 and read at least 32 bytes of +// output. +// +// +// Security strengths +// +// The SHA3-x functions have a security strength against preimage attacks of x +// bits. Since they only produce x bits of output, their collision-resistance +// is only x/2 bits. +// +// The SHAKE-x functions have a generic security strength of x bits against +// all attacks, provided that at least 2x bits of their output is used. +// Requesting more than 2x bits of output does not increase the collision- +// resistance of the SHAKE functions. +// +// +// The sponge construction +// +// A sponge builds a pseudo-random function from a pseudo-random permutation, +// by applying the permutation to a state of "rate + capacity" bytes, but +// hiding "capacity" of the bytes. +// +// A sponge starts out with a zero state. To hash an input using a sponge, up +// to "rate" bytes of the input are XORed into the sponge's state. The sponge +// has thus been "filled up" and the permutation is applied. This process is +// repeated until all the input has been "absorbed". The input is then padded. +// The digest is "squeezed" from the sponge by the same method, except that +// output is copied out. +// +// A sponge is parameterized by its generic security strength, which is equal +// to half its capacity; capacity + rate is equal to the permutation's width. +// +// Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means +// that security_strength == (1600 - bitrate) / 2. +// +// +// Recommendations, detailed +// +// The SHAKE functions are recommended for most new uses. They can produce +// output of arbitrary length. SHAKE256, with an output length of at least +// 64 bytes, provides 256-bit security against all attacks. +// +// The Keccak team recommends SHAKE256 for most applications upgrading from +// SHA2-512. (NIST chose a much stronger, but much slower, sponge instance +// for SHA3-512.) +// +// The SHA-3 functions are "drop-in" replacements for the SHA-2 functions. +// They produce output of the same length, with the same security strengths +// against all attacks. This means, in particular, that SHA3-256 only has +// 128-bit collision resistance, because its output length is 32 bytes. +package sha3 diff --git a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/hashes.go b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/hashes.go new file mode 100644 index 000000000..2b51cf4e9 --- /dev/null +++ b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/hashes.go @@ -0,0 +1,65 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package sha3 + +// This file provides functions for creating instances of the SHA-3 +// and SHAKE hash functions, as well as utility functions for hashing +// bytes. + +import ( + "hash" +) + +// New224 creates a new SHA3-224 hash. +// Its generic security strength is 224 bits against preimage attacks, +// and 112 bits against collision attacks. +func New224() hash.Hash { return &state{rate: 144, outputLen: 28, dsbyte: 0x06} } + +// New256 creates a new SHA3-256 hash. +// Its generic security strength is 256 bits against preimage attacks, +// and 128 bits against collision attacks. +func New256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x06} } + +// New384 creates a new SHA3-384 hash. +// Its generic security strength is 384 bits against preimage attacks, +// and 192 bits against collision attacks. +func New384() hash.Hash { return &state{rate: 104, outputLen: 48, dsbyte: 0x06} } + +// New512 creates a new SHA3-512 hash. +// Its generic security strength is 512 bits against preimage attacks, +// and 256 bits against collision attacks. +func New512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x06} } + +// Sum224 returns the SHA3-224 digest of the data. +func Sum224(data []byte) (digest [28]byte) { + h := New224() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum256 returns the SHA3-256 digest of the data. +func Sum256(data []byte) (digest [32]byte) { + h := New256() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum384 returns the SHA3-384 digest of the data. +func Sum384(data []byte) (digest [48]byte) { + h := New384() + h.Write(data) + h.Sum(digest[:0]) + return +} + +// Sum512 returns the SHA3-512 digest of the data. +func Sum512(data []byte) (digest [64]byte) { + h := New512() + h.Write(data) + h.Sum(digest[:0]) + return +} diff --git a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/keccakKats.json.deflate b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/keccakKats.json.deflate new file mode 100644 index 0000000000000000000000000000000000000000..62e85ae24236b46c09e5cfa84c71c69f5cc33cf6 GIT binary patch literal 521342 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%0DdSPIES;LF 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

;TQ8)#7l>4Snz*J)FMZ0Q-2>;ACWq)?04 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 z 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

nJLYnt<$PQi86UnxvK+ceSbB#mC5$ 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 literal 0 HcmV?d00001 diff --git a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/keccakf.go b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/keccakf.go index 76c0312a0..13e7058fa 100644 --- a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/keccakf.go +++ b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/keccakf.go @@ -1,16 +1,11 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 -// This file implements the core Keccak permutation function necessary for computing SHA3. -// This is implemented in a separate file to allow for replacement by an optimized implementation. -// Nothing in this package is exported. -// For the detailed specification, refer to the Keccak web site (http://keccak.noekeon.org/). - // rc stores the round constants for use in the ι step. -var rc = [...]uint64{ +var rc = [24]uint64{ 0x0000000000000001, 0x0000000000008082, 0x800000000000808A, @@ -37,129 +32,379 @@ var rc = [...]uint64{ 0x8000000080008008, } -// keccakF computes the complete Keccak-f function consisting of 24 rounds with a different -// constant (rc) in each round. This implementation fully unrolls the round function to avoid -// inner loops, as well as pre-calculating shift offsets. -func keccakF(a *[numLanes]uint64) { - var t, bc0, bc1, bc2, bc3, bc4 uint64 - for _, roundConstant := range rc { - // θ step +// keccakF1600 applies the Keccak permutation to a 1600b-wide +// state represented as a slice of 25 uint64s. +func keccakF1600(a *[25]uint64) { + // Implementation translated from Keccak-inplace.c + // in the keccak reference code. + var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64 + + for i := 0; i < 24; i += 4 { + // Combines the 5 steps in each round into 2 steps. + // Unrolls 4 rounds per loop and spreads some steps across rounds. + + // Round 1 bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] - t = bc4 ^ (bc1<<1 ^ bc1>>63) - a[0] ^= t - a[5] ^= t - a[10] ^= t - a[15] ^= t - a[20] ^= t - t = bc0 ^ (bc2<<1 ^ bc2>>63) - a[1] ^= t - a[6] ^= t - a[11] ^= t - a[16] ^= t - a[21] ^= t - t = bc1 ^ (bc3<<1 ^ bc3>>63) - a[2] ^= t - a[7] ^= t - a[12] ^= t - a[17] ^= t - a[22] ^= t - t = bc2 ^ (bc4<<1 ^ bc4>>63) - a[3] ^= t - a[8] ^= t - a[13] ^= t - a[18] ^= t - a[23] ^= t - t = bc3 ^ (bc0<<1 ^ bc0>>63) - a[4] ^= t - a[9] ^= t - a[14] ^= t - a[19] ^= t - a[24] ^= t + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) - // ρ and π steps - t = a[1] - t, a[10] = a[10], t<<1^t>>(64-1) - t, a[7] = a[7], t<<3^t>>(64-3) - t, a[11] = a[11], t<<6^t>>(64-6) - t, a[17] = a[17], t<<10^t>>(64-10) - t, a[18] = a[18], t<<15^t>>(64-15) - t, a[3] = a[3], t<<21^t>>(64-21) - t, a[5] = a[5], t<<28^t>>(64-28) - t, a[16] = a[16], t<<36^t>>(64-36) - t, a[8] = a[8], t<<45^t>>(64-45) - t, a[21] = a[21], t<<55^t>>(64-55) - t, a[24] = a[24], t<<2^t>>(64-2) - t, a[4] = a[4], t<<14^t>>(64-14) - t, a[15] = a[15], t<<27^t>>(64-27) - t, a[23] = a[23], t<<41^t>>(64-41) - t, a[19] = a[19], t<<56^t>>(64-56) - t, a[13] = a[13], t<<8^t>>(64-8) - t, a[12] = a[12], t<<25^t>>(64-25) - t, a[2] = a[2], t<<43^t>>(64-43) - t, a[20] = a[20], t<<62^t>>(64-62) - t, a[14] = a[14], t<<18^t>>(64-18) - t, a[22] = a[22], t<<39^t>>(64-39) - t, a[9] = a[9], t<<61^t>>(64-61) - t, a[6] = a[6], t<<20^t>>(64-20) - a[1] = t<<44 ^ t>>(64-44) + bc0 = a[0] ^ d0 + t = a[6] ^ d1 + bc1 = t<<44 | t>>(64-44) + t = a[12] ^ d2 + bc2 = t<<43 | t>>(64-43) + t = a[18] ^ d3 + bc3 = t<<21 | t>>(64-21) + t = a[24] ^ d4 + bc4 = t<<14 | t>>(64-14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i] + a[6] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) - // χ step - bc0 = a[0] - bc1 = a[1] - bc2 = a[2] - bc3 = a[3] - bc4 = a[4] - a[0] ^= bc2 &^ bc1 - a[1] ^= bc3 &^ bc2 - a[2] ^= bc4 &^ bc3 - a[3] ^= bc0 &^ bc4 - a[4] ^= bc1 &^ bc0 - bc0 = a[5] - bc1 = a[6] - bc2 = a[7] - bc3 = a[8] - bc4 = a[9] - a[5] ^= bc2 &^ bc1 - a[6] ^= bc3 &^ bc2 - a[7] ^= bc4 &^ bc3 - a[8] ^= bc0 &^ bc4 - a[9] ^= bc1 &^ bc0 - bc0 = a[10] - bc1 = a[11] - bc2 = a[12] - bc3 = a[13] - bc4 = a[14] - a[10] ^= bc2 &^ bc1 - a[11] ^= bc3 &^ bc2 - a[12] ^= bc4 &^ bc3 - a[13] ^= bc0 &^ bc4 - a[14] ^= bc1 &^ bc0 - bc0 = a[15] - bc1 = a[16] - bc2 = a[17] - bc3 = a[18] - bc4 = a[19] - a[15] ^= bc2 &^ bc1 - a[16] ^= bc3 &^ bc2 - a[17] ^= bc4 &^ bc3 - a[18] ^= bc0 &^ bc4 - a[19] ^= bc1 &^ bc0 - bc0 = a[20] - bc1 = a[21] - bc2 = a[22] - bc3 = a[23] - bc4 = a[24] - a[20] ^= bc2 &^ bc1 - a[21] ^= bc3 &^ bc2 - a[22] ^= bc4 &^ bc3 - a[23] ^= bc0 &^ bc4 - a[24] ^= bc1 &^ bc0 + t = a[10] ^ d0 + bc2 = t<<3 | t>>(64-3) + t = a[16] ^ d1 + bc3 = t<<45 | t>>(64-45) + t = a[22] ^ d2 + bc4 = t<<61 | t>>(64-61) + t = a[3] ^ d3 + bc0 = t<<28 | t>>(64-28) + t = a[9] ^ d4 + bc1 = t<<20 | t>>(64-20) + a[10] = bc0 ^ (bc2 &^ bc1) + a[16] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) - // ι step - a[0] ^= roundConstant + t = a[20] ^ d0 + bc4 = t<<18 | t>>(64-18) + t = a[1] ^ d1 + bc0 = t<<1 | t>>(64-1) + t = a[7] ^ d2 + bc1 = t<<6 | t>>(64-6) + t = a[13] ^ d3 + bc2 = t<<25 | t>>(64-25) + t = a[19] ^ d4 + bc3 = t<<8 | t>>(64-8) + a[20] = bc0 ^ (bc2 &^ bc1) + a[1] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc1 = t<<36 | t>>(64-36) + t = a[11] ^ d1 + bc2 = t<<10 | t>>(64-10) + t = a[17] ^ d2 + bc3 = t<<15 | t>>(64-15) + t = a[23] ^ d3 + bc4 = t<<56 | t>>(64-56) + t = a[4] ^ d4 + bc0 = t<<27 | t>>(64-27) + a[5] = bc0 ^ (bc2 &^ bc1) + a[11] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc3 = t<<41 | t>>(64-41) + t = a[21] ^ d1 + bc4 = t<<2 | t>>(64-2) + t = a[2] ^ d2 + bc0 = t<<62 | t>>(64-62) + t = a[8] ^ d3 + bc1 = t<<55 | t>>(64-55) + t = a[14] ^ d4 + bc2 = t<<39 | t>>(64-39) + a[15] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + // Round 2 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[16] ^ d1 + bc1 = t<<44 | t>>(64-44) + t = a[7] ^ d2 + bc2 = t<<43 | t>>(64-43) + t = a[23] ^ d3 + bc3 = t<<21 | t>>(64-21) + t = a[14] ^ d4 + bc4 = t<<14 | t>>(64-14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1] + a[16] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc2 = t<<3 | t>>(64-3) + t = a[11] ^ d1 + bc3 = t<<45 | t>>(64-45) + t = a[2] ^ d2 + bc4 = t<<61 | t>>(64-61) + t = a[18] ^ d3 + bc0 = t<<28 | t>>(64-28) + t = a[9] ^ d4 + bc1 = t<<20 | t>>(64-20) + a[20] = bc0 ^ (bc2 &^ bc1) + a[11] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc4 = t<<18 | t>>(64-18) + t = a[6] ^ d1 + bc0 = t<<1 | t>>(64-1) + t = a[22] ^ d2 + bc1 = t<<6 | t>>(64-6) + t = a[13] ^ d3 + bc2 = t<<25 | t>>(64-25) + t = a[4] ^ d4 + bc3 = t<<8 | t>>(64-8) + a[15] = bc0 ^ (bc2 &^ bc1) + a[6] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc1 = t<<36 | t>>(64-36) + t = a[1] ^ d1 + bc2 = t<<10 | t>>(64-10) + t = a[17] ^ d2 + bc3 = t<<15 | t>>(64-15) + t = a[8] ^ d3 + bc4 = t<<56 | t>>(64-56) + t = a[24] ^ d4 + bc0 = t<<27 | t>>(64-27) + a[10] = bc0 ^ (bc2 &^ bc1) + a[1] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc3 = t<<41 | t>>(64-41) + t = a[21] ^ d1 + bc4 = t<<2 | t>>(64-2) + t = a[12] ^ d2 + bc0 = t<<62 | t>>(64-62) + t = a[3] ^ d3 + bc1 = t<<55 | t>>(64-55) + t = a[19] ^ d4 + bc2 = t<<39 | t>>(64-39) + a[5] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + // Round 3 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[11] ^ d1 + bc1 = t<<44 | t>>(64-44) + t = a[22] ^ d2 + bc2 = t<<43 | t>>(64-43) + t = a[8] ^ d3 + bc3 = t<<21 | t>>(64-21) + t = a[19] ^ d4 + bc4 = t<<14 | t>>(64-14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2] + a[11] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc2 = t<<3 | t>>(64-3) + t = a[1] ^ d1 + bc3 = t<<45 | t>>(64-45) + t = a[12] ^ d2 + bc4 = t<<61 | t>>(64-61) + t = a[23] ^ d3 + bc0 = t<<28 | t>>(64-28) + t = a[9] ^ d4 + bc1 = t<<20 | t>>(64-20) + a[15] = bc0 ^ (bc2 &^ bc1) + a[1] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc4 = t<<18 | t>>(64-18) + t = a[16] ^ d1 + bc0 = t<<1 | t>>(64-1) + t = a[2] ^ d2 + bc1 = t<<6 | t>>(64-6) + t = a[13] ^ d3 + bc2 = t<<25 | t>>(64-25) + t = a[24] ^ d4 + bc3 = t<<8 | t>>(64-8) + a[5] = bc0 ^ (bc2 &^ bc1) + a[16] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc1 = t<<36 | t>>(64-36) + t = a[6] ^ d1 + bc2 = t<<10 | t>>(64-10) + t = a[17] ^ d2 + bc3 = t<<15 | t>>(64-15) + t = a[3] ^ d3 + bc4 = t<<56 | t>>(64-56) + t = a[14] ^ d4 + bc0 = t<<27 | t>>(64-27) + a[20] = bc0 ^ (bc2 &^ bc1) + a[6] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc3 = t<<41 | t>>(64-41) + t = a[21] ^ d1 + bc4 = t<<2 | t>>(64-2) + t = a[7] ^ d2 + bc0 = t<<62 | t>>(64-62) + t = a[18] ^ d3 + bc1 = t<<55 | t>>(64-55) + t = a[4] ^ d4 + bc2 = t<<39 | t>>(64-39) + a[10] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + // Round 4 + bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] + bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] + bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] + bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] + bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] + d0 = bc4 ^ (bc1<<1 | bc1>>63) + d1 = bc0 ^ (bc2<<1 | bc2>>63) + d2 = bc1 ^ (bc3<<1 | bc3>>63) + d3 = bc2 ^ (bc4<<1 | bc4>>63) + d4 = bc3 ^ (bc0<<1 | bc0>>63) + + bc0 = a[0] ^ d0 + t = a[1] ^ d1 + bc1 = t<<44 | t>>(64-44) + t = a[2] ^ d2 + bc2 = t<<43 | t>>(64-43) + t = a[3] ^ d3 + bc3 = t<<21 | t>>(64-21) + t = a[4] ^ d4 + bc4 = t<<14 | t>>(64-14) + a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3] + a[1] = bc1 ^ (bc3 &^ bc2) + a[2] = bc2 ^ (bc4 &^ bc3) + a[3] = bc3 ^ (bc0 &^ bc4) + a[4] = bc4 ^ (bc1 &^ bc0) + + t = a[5] ^ d0 + bc2 = t<<3 | t>>(64-3) + t = a[6] ^ d1 + bc3 = t<<45 | t>>(64-45) + t = a[7] ^ d2 + bc4 = t<<61 | t>>(64-61) + t = a[8] ^ d3 + bc0 = t<<28 | t>>(64-28) + t = a[9] ^ d4 + bc1 = t<<20 | t>>(64-20) + a[5] = bc0 ^ (bc2 &^ bc1) + a[6] = bc1 ^ (bc3 &^ bc2) + a[7] = bc2 ^ (bc4 &^ bc3) + a[8] = bc3 ^ (bc0 &^ bc4) + a[9] = bc4 ^ (bc1 &^ bc0) + + t = a[10] ^ d0 + bc4 = t<<18 | t>>(64-18) + t = a[11] ^ d1 + bc0 = t<<1 | t>>(64-1) + t = a[12] ^ d2 + bc1 = t<<6 | t>>(64-6) + t = a[13] ^ d3 + bc2 = t<<25 | t>>(64-25) + t = a[14] ^ d4 + bc3 = t<<8 | t>>(64-8) + a[10] = bc0 ^ (bc2 &^ bc1) + a[11] = bc1 ^ (bc3 &^ bc2) + a[12] = bc2 ^ (bc4 &^ bc3) + a[13] = bc3 ^ (bc0 &^ bc4) + a[14] = bc4 ^ (bc1 &^ bc0) + + t = a[15] ^ d0 + bc1 = t<<36 | t>>(64-36) + t = a[16] ^ d1 + bc2 = t<<10 | t>>(64-10) + t = a[17] ^ d2 + bc3 = t<<15 | t>>(64-15) + t = a[18] ^ d3 + bc4 = t<<56 | t>>(64-56) + t = a[19] ^ d4 + bc0 = t<<27 | t>>(64-27) + a[15] = bc0 ^ (bc2 &^ bc1) + a[16] = bc1 ^ (bc3 &^ bc2) + a[17] = bc2 ^ (bc4 &^ bc3) + a[18] = bc3 ^ (bc0 &^ bc4) + a[19] = bc4 ^ (bc1 &^ bc0) + + t = a[20] ^ d0 + bc3 = t<<41 | t>>(64-41) + t = a[21] ^ d1 + bc4 = t<<2 | t>>(64-2) + t = a[22] ^ d2 + bc0 = t<<62 | t>>(64-62) + t = a[23] ^ d3 + bc1 = t<<55 | t>>(64-55) + t = a[24] ^ d4 + bc2 = t<<39 | t>>(64-39) + a[20] = bc0 ^ (bc2 &^ bc1) + a[21] = bc1 ^ (bc3 &^ bc2) + a[22] = bc2 ^ (bc4 &^ bc3) + a[23] = bc3 ^ (bc0 &^ bc4) + a[24] = bc4 ^ (bc1 &^ bc0) } } diff --git a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/register.go b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/register.go new file mode 100644 index 000000000..3cf6a22e0 --- /dev/null +++ b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/register.go @@ -0,0 +1,18 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.4 + +package sha3 + +import ( + "crypto" +) + +func init() { + crypto.RegisterHash(crypto.SHA3_224, New224) + crypto.RegisterHash(crypto.SHA3_256, New256) + crypto.RegisterHash(crypto.SHA3_384, New384) + crypto.RegisterHash(crypto.SHA3_512, New512) +} diff --git a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/sha3.go b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/sha3.go index e1f9aa85c..8d775684c 100644 --- a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/sha3.go +++ b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/sha3.go @@ -1,213 +1,226 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package sha3 implements the SHA3 hash algorithm (formerly called Keccak) chosen by NIST in 2012. -// This file provides a SHA3 implementation which implements the standard hash.Hash interface. -// Writing input data, including padding, and reading output data are computed in this file. -// Note that the current implementation can compute the hash of an integral number of bytes only. -// This is a consequence of the hash interface in which a buffer of bytes is passed in. -// The internals of the Keccak-f function are computed in keccakf.go. -// For the detailed specification, refer to the Keccak web site (http://keccak.noekeon.org/). package sha3 import ( "encoding/binary" - "hash" ) -// laneSize is the size in bytes of each "lane" of the internal state of SHA3 (5 * 5 * 8). -// Note that changing this size would requires using a type other than uint64 to store each lane. -const laneSize = 8 +// spongeDirection indicates the direction bytes are flowing through the sponge. +type spongeDirection int -// sliceSize represents the dimensions of the internal state, a square matrix of -// sliceSize ** 2 lanes. This is the size of both the "rows" and "columns" dimensions in the -// terminology of the SHA3 specification. -const sliceSize = 5 +const ( + // spongeAbsorbing indicates that the sponge is absorbing input. + spongeAbsorbing spongeDirection = iota + // spongeSqueezing indicates that the sponge is being squeezed. + spongeSqueezing +) -// numLanes represents the total number of lanes in the state. -const numLanes = sliceSize * sliceSize +const ( + // maxRate is the maximum size of the internal buffer. SHAKE-256 + // currently needs the largest buffer. + maxRate = 168 +) -// stateSize is the size in bytes of the internal state of SHA3 (5 * 5 * WSize). -const stateSize = laneSize * numLanes +type state struct { + // Generic sponge components. + a [25]uint64 // main state of the hash + buf []byte // points into storage + rate int // the number of bytes of state to use -// digest represents the partial evaluation of a checksum. -// Note that capacity, and not outputSize, is the critical security parameter, as SHA3 can output -// an arbitrary number of bytes for any given capacity. The Keccak proposal recommends that -// capacity = 2*outputSize to ensure that finding a collision of size outputSize requires -// O(2^{outputSize/2}) computations (the birthday lower bound). Future standards may modify the -// capacity/outputSize ratio to allow for more output with lower cryptographic security. -type digest struct { - a [numLanes]uint64 // main state of the hash - outputSize int // desired output size in bytes - capacity int // number of bytes to leave untouched during squeeze/absorb - absorbed int // number of bytes absorbed thus far + // dsbyte contains the "domain separation" value and the first bit of + // the padding. In sections 6.1 and 6.2 of [1], the SHA-3 and SHAKE + // functions are defined with bits appended to the message: SHA-3 + // functions have 01 and SHAKE functions have 1111. Because of the way + // that bits are numbered from the LSB upwards, that ends up as + // 00000010b and 00001111b, respectively. Then the padding rule from + // section 5.1 is applied to pad to a multiple of the rate, which + // involves adding a 1 bit, zero or more zero bits and then a final one + // bit. The first one bit from the padding is merged into the dsbyte + // value giving 00000110b (0x06) and 00011111b (0x1f), respectively. + // + // [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf, + dsbyte byte + storage [maxRate]byte + + // Specific to SHA-3 and SHAKE. + fixedOutput bool // whether this is a fixed-ouput-length instance + outputLen int // the default output size in bytes + state spongeDirection // current direction of the sponge } -// minInt returns the lesser of two integer arguments, to simplify the absorption routine. -func minInt(v1, v2 int) int { - if v1 <= v2 { - return v1 - } - return v2 -} +// BlockSize returns the rate of sponge underlying this hash function. +func (d *state) BlockSize() int { return d.rate } -// rate returns the number of bytes of the internal state which can be absorbed or squeezed -// in between calls to the permutation function. -func (d *digest) rate() int { - return stateSize - d.capacity -} +// Size returns the output size of the hash function in bytes. +func (d *state) Size() int { return d.outputLen } -// Reset clears the internal state by zeroing bytes in the state buffer. -// This can be skipped for a newly-created hash state; the default zero-allocated state is correct. -func (d *digest) Reset() { - d.absorbed = 0 +// Reset clears the internal state by zeroing the sponge state and +// the byte buffer, and setting Sponge.state to absorbing. +func (d *state) Reset() { + // Zero the permutation's state. for i := range d.a { d.a[i] = 0 } + d.state = spongeAbsorbing + d.buf = d.storage[:0] } -// BlockSize, required by the hash.Hash interface, does not have a standard intepretation -// for a sponge-based construction like SHA3. We return the data rate: the number of bytes which -// can be absorbed per invocation of the permutation function. For Merkle-Damgård based hashes -// (ie SHA1, SHA2, MD5) the output size of the internal compression function is returned. -// We consider this to be roughly equivalent because it represents the number of bytes of output -// produced per cryptographic operation. -func (d *digest) BlockSize() int { return d.rate() } - -// Size returns the output size of the hash function in bytes. -func (d *digest) Size() int { - return d.outputSize -} - -// unalignedAbsorb is a helper function for Write, which absorbs data that isn't aligned with an -// 8-byte lane. This requires shifting the individual bytes into position in a uint64. -func (d *digest) unalignedAbsorb(p []byte) { - var t uint64 - for i := len(p) - 1; i >= 0; i-- { - t <<= 8 - t |= uint64(p[i]) +func (d *state) clone() *state { + ret := *d + if ret.state == spongeAbsorbing { + ret.buf = ret.storage[:len(ret.buf)] + } else { + ret.buf = ret.storage[d.rate-cap(d.buf) : d.rate] } - offset := (d.absorbed) % d.rate() - t <<= 8 * uint(offset%laneSize) - d.a[offset/laneSize] ^= t - d.absorbed += len(p) + + return &ret } -// Write "absorbs" bytes into the state of the SHA3 hash, updating as needed when the sponge -// "fills up" with rate() bytes. Since lanes are stored internally as type uint64, this requires -// converting the incoming bytes into uint64s using a little endian interpretation. This -// implementation is optimized for large, aligned writes of multiples of 8 bytes (laneSize). -// Non-aligned or uneven numbers of bytes require shifting and are slower. -func (d *digest) Write(p []byte) (int, error) { - // An initial offset is needed if the we aren't absorbing to the first lane initially. - offset := d.absorbed % d.rate() - toWrite := len(p) +// xorIn xors a buffer into the state, byte-swapping to +// little-endian as necessary; it returns the number of bytes +// copied, including any zeros appended to the bytestring. +func (d *state) xorIn(buf []byte) { + n := len(buf) / 8 - // The first lane may need to absorb unaligned and/or incomplete data. - if (offset%laneSize != 0 || len(p) < 8) && len(p) > 0 { - toAbsorb := minInt(laneSize-(offset%laneSize), len(p)) - d.unalignedAbsorb(p[:toAbsorb]) - p = p[toAbsorb:] - offset = (d.absorbed) % d.rate() + for i := 0; i < n; i++ { + a := binary.LittleEndian.Uint64(buf) + d.a[i] ^= a + buf = buf[8:] + } + if len(buf) != 0 { + // XOR in the last partial ulint64. + a := uint64(0) + for i, v := range buf { + a |= uint64(v) << uint64(8*i) + } + d.a[n] ^= a + } +} - // For every rate() bytes absorbed, the state must be permuted via the F Function. - if (d.absorbed)%d.rate() == 0 { - keccakF(&d.a) +// copyOut copies ulint64s to a byte buffer. +func (d *state) copyOut(b []byte) { + for i := 0; len(b) >= 8; i++ { + binary.LittleEndian.PutUint64(b, d.a[i]) + b = b[8:] + } +} + +// permute applies the KeccakF-1600 permutation. It handles +// any input-output buffering. +func (d *state) permute() { + switch d.state { + case spongeAbsorbing: + // If we're absorbing, we need to xor the input into the state + // before applying the permutation. + d.xorIn(d.buf) + d.buf = d.storage[:0] + keccakF1600(&d.a) + case spongeSqueezing: + // If we're squeezing, we need to apply the permutatin before + // copying more output. + keccakF1600(&d.a) + d.buf = d.storage[:d.rate] + d.copyOut(d.buf) + } +} + +// pads appends the domain separation bits in dsbyte, applies +// the multi-bitrate 10..1 padding rule, and permutes the state. +func (d *state) padAndPermute(dsbyte byte) { + if d.buf == nil { + d.buf = d.storage[:0] + } + // Pad with this instance's domain-separator bits. We know that there's + // at least one byte of space in d.buf because, if it were full, + // permute would have been called to empty it. dsbyte also contains the + // first one bit for the padding. See the comment in the state struct. + d.buf = append(d.buf, dsbyte) + zerosStart := len(d.buf) + d.buf = d.storage[:d.rate] + for i := zerosStart; i < d.rate; i++ { + d.buf[i] = 0 + } + // This adds the final one bit for the padding. Because of the way that + // bits are numbered from the LSB upwards, the final bit is the MSB of + // the last byte. + d.buf[d.rate-1] ^= 0x80 + // Apply the permutation + d.permute() + d.state = spongeSqueezing + d.buf = d.storage[:d.rate] + d.copyOut(d.buf) +} + +// Write absorbs more data into the hash's state. It produces an error +// if more data is written to the ShakeHash after writing +func (d *state) Write(p []byte) (written int, err error) { + if d.state != spongeAbsorbing { + panic("sha3: write to sponge after read") + } + if d.buf == nil { + d.buf = d.storage[:0] + } + written = len(p) + + for len(p) > 0 { + if len(d.buf) == 0 && len(p) >= d.rate { + // The fast path; absorb a full "rate" bytes of input and apply the permutation. + d.xorIn(p[:d.rate]) + p = p[d.rate:] + keccakF1600(&d.a) + } else { + // The slow path; buffer the input until we can fill the sponge, and then xor it in. + todo := d.rate - len(d.buf) + if todo > len(p) { + todo = len(p) + } + d.buf = append(d.buf, p[:todo]...) + p = p[todo:] + + // If the sponge is full, apply the permutation. + if len(d.buf) == d.rate { + d.permute() + } } } - // This loop should absorb the bulk of the data into full, aligned lanes. - // It will call the update function as necessary. - for len(p) > 7 { - firstLane := offset / laneSize - lastLane := minInt(d.rate()/laneSize, firstLane+len(p)/laneSize) - - // This inner loop absorbs input bytes into the state in groups of 8, converted to uint64s. - for lane := firstLane; lane < lastLane; lane++ { - d.a[lane] ^= binary.LittleEndian.Uint64(p[:laneSize]) - p = p[laneSize:] - } - d.absorbed += (lastLane - firstLane) * laneSize - // For every rate() bytes absorbed, the state must be permuted via the F Function. - if (d.absorbed)%d.rate() == 0 { - keccakF(&d.a) - } - - offset = 0 - } - - // If there are insufficient bytes to fill the final lane, an unaligned absorption. - // This should always start at a correct lane boundary though, or else it would be caught - // by the uneven opening lane case above. - if len(p) > 0 { - d.unalignedAbsorb(p) - } - - return toWrite, nil + return } -// pad computes the SHA3 padding scheme based on the number of bytes absorbed. -// The padding is a 1 bit, followed by an arbitrary number of 0s and then a final 1 bit, such that -// the input bits plus padding bits are a multiple of rate(). Adding the padding simply requires -// xoring an opening and closing bit into the appropriate lanes. -func (d *digest) pad() { - offset := d.absorbed % d.rate() - // The opening pad bit must be shifted into position based on the number of bytes absorbed - padOpenLane := offset / laneSize - d.a[padOpenLane] ^= 0x0000000000000001 << uint(8*(offset%laneSize)) - // The closing padding bit is always in the last position - padCloseLane := (d.rate() / laneSize) - 1 - d.a[padCloseLane] ^= 0x8000000000000000 -} - -// finalize prepares the hash to output data by padding and one final permutation of the state. -func (d *digest) finalize() { - d.pad() - keccakF(&d.a) -} - -// squeeze outputs an arbitrary number of bytes from the hash state. -// Squeezing can require multiple calls to the F function (one per rate() bytes squeezed), -// although this is not the case for standard SHA3 parameters. This implementation only supports -// squeezing a single time, subsequent squeezes may lose alignment. Future implementations -// may wish to support multiple squeeze calls, for example to support use as a PRNG. -func (d *digest) squeeze(in []byte, toSqueeze int) []byte { - // Because we read in blocks of laneSize, we need enough room to read - // an integral number of lanes - needed := toSqueeze + (laneSize-toSqueeze%laneSize)%laneSize - if cap(in)-len(in) < needed { - newIn := make([]byte, len(in), len(in)+needed) - copy(newIn, in) - in = newIn +// Read squeezes an arbitrary number of bytes from the sponge. +func (d *state) Read(out []byte) (n int, err error) { + // If we're still absorbing, pad and apply the permutation. + if d.state == spongeAbsorbing { + d.padAndPermute(d.dsbyte) } - out := in[len(in) : len(in)+needed] + n = len(out) + + // Now, do the squeezing. for len(out) > 0 { - for i := 0; i < d.rate() && len(out) > 0; i += laneSize { - binary.LittleEndian.PutUint64(out[:], d.a[i/laneSize]) - out = out[laneSize:] - } - if len(out) > 0 { - keccakF(&d.a) + n := copy(out, d.buf) + d.buf = d.buf[n:] + out = out[n:] + + // Apply the permutation if we've squeezed the sponge dry. + if len(d.buf) == 0 { + d.permute() } } - return in[:len(in)+toSqueeze] // Re-slice in case we wrote extra data. + + return } -// Sum applies padding to the hash state and then squeezes out the desired nubmer of output bytes. -func (d *digest) Sum(in []byte) []byte { - // Make a copy of the original hash so that caller can keep writing and summing. - dup := *d - dup.finalize() - return dup.squeeze(in, dup.outputSize) +// Sum applies padding to the hash state and then squeezes out the desired +// number of output bytes. +func (d *state) Sum(in []byte) []byte { + // Make a copy of the original hash so that caller can keep writing + // and summing. + dup := d.clone() + hash := make([]byte, dup.outputLen) + dup.Read(hash) + return append(in, hash...) } - -// The NewKeccakX constructors enable initializing a hash in any of the four recommend sizes -// from the Keccak specification, all of which set capacity=2*outputSize. Note that the final -// NIST standard for SHA3 may specify different input/output lengths. -// The output size is indicated in bits but converted into bytes internally. -func NewKeccak224() hash.Hash { return &digest{outputSize: 224 / 8, capacity: 2 * 224 / 8} } -func NewKeccak256() hash.Hash { return &digest{outputSize: 256 / 8, capacity: 2 * 256 / 8} } -func NewKeccak384() hash.Hash { return &digest{outputSize: 384 / 8, capacity: 2 * 384 / 8} } -func NewKeccak512() hash.Hash { return &digest{outputSize: 512 / 8, capacity: 2 * 512 / 8} } diff --git a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/sha3_test.go b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/sha3_test.go index 05e7c9589..6f84863ac 100644 --- a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/sha3_test.go +++ b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/sha3_test.go @@ -1,34 +1,56 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sha3 -// These tests are a subset of those provided by the Keccak web site(http://keccak.noekeon.org/). +// Tests include all the ShortMsgKATs provided by the Keccak team at +// https://github.com/gvanas/KeccakCodePackage +// +// They only include the zero-bit case of the utterly useless bitwise +// testvectors published by NIST in the draft of FIPS-202. import ( "bytes" + "compress/flate" "encoding/hex" - "fmt" + "encoding/json" "hash" + "os" "strings" "testing" ) -// testDigests maintains a digest state of each standard type. -var testDigests = map[string]*digest{ - "Keccak224": {outputSize: 224 / 8, capacity: 2 * 224 / 8}, - "Keccak256": {outputSize: 256 / 8, capacity: 2 * 256 / 8}, - "Keccak384": {outputSize: 384 / 8, capacity: 2 * 384 / 8}, - "Keccak512": {outputSize: 512 / 8, capacity: 2 * 512 / 8}, +const ( + testString = "brekeccakkeccak koax koax" + katFilename = "keccakKats.json.deflate" +) + +// Internal-use instances of SHAKE used to test against KATs. +func newHashShake128() hash.Hash { + return &state{rate: 168, dsbyte: 0x1f, outputLen: 512} +} +func newHashShake256() hash.Hash { + return &state{rate: 136, dsbyte: 0x1f, outputLen: 512} } -// testVector represents a test input and expected outputs from multiple algorithm variants. -type testVector struct { - desc string - input []byte - repeat int // input will be concatenated the input this many times. - want map[string]string +// testDigests contains functions returning hash.Hash instances +// with output-length equal to the KAT length for both SHA-3 and +// SHAKE instances. +var testDigests = map[string]func() hash.Hash{ + "SHA3-224": New224, + "SHA3-256": New256, + "SHA3-384": New384, + "SHA3-512": New512, + "SHAKE128": newHashShake128, + "SHAKE256": newHashShake256, +} + +// testShakes contains functions returning ShakeHash instances for +// testing the ShakeHash-specific interface. +var testShakes = map[string]func() ShakeHash{ + "SHAKE128": NewShake128, + "SHAKE256": NewShake256, } // decodeHex converts an hex-encoded string into a raw byte string. @@ -40,102 +62,61 @@ func decodeHex(s string) []byte { return b } -// shortTestVectors stores a series of short testVectors. -// Inputs of 8, 248, and 264 bits from http://keccak.noekeon.org/ are included below. -// The standard defines additional test inputs of all sizes between 0 and 2047 bits. -// Because the current implementation can only handle an integral number of bytes, -// most of the standard test inputs can't be used. -var shortKeccakTestVectors = []testVector{ - { - desc: "short-8b", - input: decodeHex("CC"), - repeat: 1, - want: map[string]string{ - "Keccak224": "A9CAB59EB40A10B246290F2D6086E32E3689FAF1D26B470C899F2802", - "Keccak256": "EEAD6DBFC7340A56CAEDC044696A168870549A6A7F6F56961E84A54BD9970B8A", - "Keccak384": "1B84E62A46E5A201861754AF5DC95C4A1A69CAF4A796AE405680161E29572641F5FA1E8641D7958336EE7B11C58F73E9", - "Keccak512": "8630C13CBD066EA74BBE7FE468FEC1DEE10EDC1254FB4C1B7C5FD69B646E44160B8CE01D05A0908CA790DFB080F4B513BC3B6225ECE7A810371441A5AC666EB9", - }, - }, - { - desc: "short-248b", - input: decodeHex("84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29"), - repeat: 1, - want: map[string]string{ - "Keccak224": "81AF3A7A5BD4C1F948D6AF4B96F93C3B0CF9C0E7A6DA6FCD71EEC7F6", - "Keccak256": "D477FB02CAAA95B3280EC8EE882C29D9E8A654B21EF178E0F97571BF9D4D3C1C", - "Keccak384": "503DCAA4ADDA5A9420B2E436DD62D9AB2E0254295C2982EF67FCE40F117A2400AB492F7BD5D133C6EC2232268BC27B42", - "Keccak512": "9D8098D8D6EDBBAA2BCFC6FB2F89C3EAC67FEC25CDFE75AA7BD570A648E8C8945FF2EC280F6DCF73386109155C5BBC444C707BB42EAB873F5F7476657B1BC1A8", - }, - }, - { - desc: "short-264b", - input: decodeHex("DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046"), - repeat: 1, - want: map[string]string{ - "Keccak224": "F217812E362EC64D4DC5EACFABC165184BFA456E5C32C2C7900253D0", - "Keccak256": "E78C421E6213AFF8DE1F025759A4F2C943DB62BBDE359C8737E19B3776ED2DD2", - "Keccak384": "CF38764973F1EC1C34B5433AE75A3AAD1AAEF6AB197850C56C8617BCD6A882F6666883AC17B2DCCDBAA647075D0972B5", - "Keccak512": "9A7688E31AAF40C15575FC58C6B39267AAD3722E696E518A9945CF7F7C0FEA84CB3CB2E9F0384A6B5DC671ADE7FB4D2B27011173F3EEEAF17CB451CF26542031", - }, - }, -} - -// longTestVectors stores longer testVectors (currently only one). -// The computed test vector is 64 MiB long and is a truncated version of the -// ExtremelyLongMsgKAT taken from http://keccak.noekeon.org/. -var longKeccakTestVectors = []testVector{ - { - desc: "long-64MiB", - input: []byte("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno"), - repeat: 1024 * 1024, - want: map[string]string{ - "Keccak224": "50E35E40980FEEFF1EA490957B0E970257F75EA0D410EE0F0B8A7A58", - "Keccak256": "5015A4935F0B51E091C6550A94DCD262C08998232CCAA22E7F0756DEAC0DC0D0", - "Keccak384": "7907A8D0FAA7BC6A90FE14C6C958C956A0877E751455D8F13ACDB96F144B5896E716C06EC0CB56557A94EF5C3355F6F3", - "Keccak512": "3EC327D6759F769DEB74E80CA70C831BC29CAB048A4BF4190E4A1DD5C6507CF2B4B58937FDE81D36014E7DFE1B1DD8B0F27CB7614F9A645FEC114F1DAAEFC056", - }, - }, -} - -// TestKeccakVectors checks that correct output is produced for a set of known testVectors. -func TestKeccakVectors(t *testing.T) { - testCases := append([]testVector{}, shortKeccakTestVectors...) - if !testing.Short() { - testCases = append(testCases, longKeccakTestVectors...) +// structs used to marshal JSON test-cases. +type KeccakKats struct { + Kats map[string][]struct { + Digest string `json:"digest"` + Length int64 `json:"length"` + Message string `json:"message"` } - for _, tc := range testCases { - for alg, want := range tc.want { - d := testDigests[alg] +} + +// TestKeccakKats tests the SHA-3 and Shake implementations against all the +// ShortMsgKATs from https://github.com/gvanas/KeccakCodePackage +// (The testvectors are stored in keccakKats.json.deflate due to their length.) +func TestKeccakKats(t *testing.T) { + // Read the KATs. + deflated, err := os.Open(katFilename) + if err != nil { + t.Errorf("Error opening %s: %s", katFilename, err) + } + file := flate.NewReader(deflated) + dec := json.NewDecoder(file) + var katSet KeccakKats + err = dec.Decode(&katSet) + if err != nil { + t.Errorf("%s", err) + } + + // Do the KATs. + for functionName, kats := range katSet.Kats { + d := testDigests[functionName]() + t.Logf("%s", functionName) + for _, kat := range kats { d.Reset() - for i := 0; i < tc.repeat; i++ { - d.Write(tc.input) + in, err := hex.DecodeString(kat.Message) + if err != nil { + t.Errorf("%s", err) } + d.Write(in[:kat.Length/8]) got := strings.ToUpper(hex.EncodeToString(d.Sum(nil))) + want := kat.Digest if got != want { - t.Errorf("%s, alg=%s\ngot %q, want %q", tc.desc, alg, got, want) + t.Errorf("function=%s, length=%d\nmessage:\n %s\ngot:\n %s\nwanted:\n %s", + functionName, kat.Length, kat.Message, got, want) + t.Logf("wanted %+v", kat) + t.FailNow() } } } } -// dumpState is a debugging function to pretty-print the internal state of the hash. -func (d *digest) dumpState() { - fmt.Printf("SHA3 hash, %d B output, %d B capacity (%d B rate)\n", d.outputSize, d.capacity, d.rate()) - fmt.Printf("Internal state after absorbing %d B:\n", d.absorbed) - - for x := 0; x < sliceSize; x++ { - for y := 0; y < sliceSize; y++ { - fmt.Printf("%v, ", d.a[x*sliceSize+y]) - } - fmt.Println("") - } -} - -// TestUnalignedWrite tests that writing data in an arbitrary pattern with small input buffers. +// TestUnalignedWrite tests that writing data in an arbitrary pattern with +// small input buffers. func TestUnalignedWrite(t *testing.T) { buf := sequentialBytes(0x10000) - for alg, d := range testDigests { + for alg, df := range testDigests { + d := df() d.Reset() d.Write(buf) want := d.Sum(nil) @@ -145,7 +126,9 @@ func TestUnalignedWrite(t *testing.T) { // Because 137 is prime this sequence should exercise all corner cases. offsets := [17]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1} for _, j := range offsets { - j = minInt(j, len(buf)-i) + if v := len(buf) - i; v < j { + j = v + } d.Write(buf[i : i+j]) i += j } @@ -157,8 +140,9 @@ func TestUnalignedWrite(t *testing.T) { } } +// Test that appending works when reallocation is necessary. func TestAppend(t *testing.T) { - d := NewKeccak224() + d := New224() for capacity := 2; capacity < 64; capacity += 64 { // The first time around the loop, Sum will have to reallocate. @@ -167,24 +151,57 @@ func TestAppend(t *testing.T) { d.Reset() d.Write([]byte{0xcc}) buf = d.Sum(buf) - expected := "0000A9CAB59EB40A10B246290F2D6086E32E3689FAF1D26B470C899F2802" + expected := "0000DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { t.Errorf("got %s, want %s", got, expected) } } } +// Test that appending works when no reallocation is necessary. func TestAppendNoRealloc(t *testing.T) { buf := make([]byte, 1, 200) - d := NewKeccak224() + d := New224() d.Write([]byte{0xcc}) buf = d.Sum(buf) - expected := "00A9CAB59EB40A10B246290F2D6086E32E3689FAF1D26B470C899F2802" + expected := "00DF70ADC49B2E76EEE3A6931B93FA41841C3AF2CDF5B32A18B5478C39" if got := strings.ToUpper(hex.EncodeToString(buf)); got != expected { t.Errorf("got %s, want %s", got, expected) } } +// TestSqueezing checks that squeezing the full output a single time produces +// the same output as repeatedly squeezing the instance. +func TestSqueezing(t *testing.T) { + for functionName, newShakeHash := range testShakes { + t.Logf("%s", functionName) + d0 := newShakeHash() + d0.Write([]byte(testString)) + ref := make([]byte, 32) + d0.Read(ref) + + d1 := newShakeHash() + d1.Write([]byte(testString)) + var multiple []byte + for _ = range ref { + one := make([]byte, 1) + d1.Read(one) + multiple = append(multiple, one...) + } + if !bytes.Equal(ref, multiple) { + t.Errorf("squeezing %d bytes one at a time failed", len(ref)) + } + } +} + +func TestReadSimulation(t *testing.T) { + d := NewShake256() + d.Write(nil) + dwr := make([]byte, 32) + d.Read(dwr) + +} + // sequentialBytes produces a buffer of size consecutive bytes 0x00, 0x01, ..., used for testing. func sequentialBytes(size int) []byte { result := make([]byte, size) @@ -194,77 +211,39 @@ func sequentialBytes(size int) []byte { return result } -// benchmarkBlockWrite tests the speed of writing data and never calling the permutation function. -func benchmarkBlockWrite(b *testing.B, d *digest) { - b.StopTimer() - d.Reset() - // Write all but the last byte of a block, to ensure that the permutation is not called. - data := sequentialBytes(d.rate() - 1) - b.SetBytes(int64(len(data))) - b.StartTimer() - for i := 0; i < b.N; i++ { - d.absorbed = 0 // Reset absorbed to avoid ever calling the permutation function - d.Write(data) - } - b.StopTimer() - d.Reset() -} - -// BenchmarkPermutationFunction measures the speed of the permutation function with no input data. +// BenchmarkPermutationFunction measures the speed of the permutation function +// with no input data. func BenchmarkPermutationFunction(b *testing.B) { - b.SetBytes(int64(stateSize)) - var lanes [numLanes]uint64 + b.SetBytes(int64(200)) + var lanes [25]uint64 for i := 0; i < b.N; i++ { - keccakF(&lanes) + keccakF1600(&lanes) } } -// BenchmarkSingleByteWrite tests the latency from writing a single byte -func BenchmarkSingleByteWrite(b *testing.B) { - b.StopTimer() - d := testDigests["Keccak512"] - d.Reset() - data := sequentialBytes(1) //1 byte buffer - b.SetBytes(int64(d.rate()) - 1) - b.StartTimer() - for i := 0; i < b.N; i++ { - d.absorbed = 0 // Reset absorbed to avoid ever calling the permutation function - - // Write all but the last byte of a block, one byte at a time. - for j := 0; j < d.rate()-1; j++ { - d.Write(data) - } - } - b.StopTimer() - d.Reset() -} - -// BenchmarkSingleByteX measures the block write speed for each size of the digest. -func BenchmarkBlockWrite512(b *testing.B) { benchmarkBlockWrite(b, testDigests["Keccak512"]) } -func BenchmarkBlockWrite384(b *testing.B) { benchmarkBlockWrite(b, testDigests["Keccak384"]) } -func BenchmarkBlockWrite256(b *testing.B) { benchmarkBlockWrite(b, testDigests["Keccak256"]) } -func BenchmarkBlockWrite224(b *testing.B) { benchmarkBlockWrite(b, testDigests["Keccak224"]) } - -// benchmarkBulkHash tests the speed to hash a 16 KiB buffer. -func benchmarkBulkHash(b *testing.B, h hash.Hash) { +// benchmarkBulkHash tests the speed to hash a buffer of buflen. +func benchmarkBulkHash(b *testing.B, h hash.Hash, size int) { b.StopTimer() h.Reset() - size := 1 << 14 data := sequentialBytes(size) b.SetBytes(int64(size)) b.StartTimer() - var digest []byte + var state []byte for i := 0; i < b.N; i++ { h.Write(data) - digest = h.Sum(digest[:0]) + state = h.Sum(state[:0]) } b.StopTimer() h.Reset() } -// benchmarkBulkKeccakX test the speed to hash a 16 KiB buffer by calling benchmarkBulkHash. -func BenchmarkBulkKeccak512(b *testing.B) { benchmarkBulkHash(b, NewKeccak512()) } -func BenchmarkBulkKeccak384(b *testing.B) { benchmarkBulkHash(b, NewKeccak384()) } -func BenchmarkBulkKeccak256(b *testing.B) { benchmarkBulkHash(b, NewKeccak256()) } -func BenchmarkBulkKeccak224(b *testing.B) { benchmarkBulkHash(b, NewKeccak224()) } +func BenchmarkSha3_512_MTU(b *testing.B) { benchmarkBulkHash(b, New512(), 1350) } +func BenchmarkSha3_384_MTU(b *testing.B) { benchmarkBulkHash(b, New384(), 1350) } +func BenchmarkSha3_256_MTU(b *testing.B) { benchmarkBulkHash(b, New256(), 1350) } +func BenchmarkSha3_224_MTU(b *testing.B) { benchmarkBulkHash(b, New224(), 1350) } +func BenchmarkShake256_MTU(b *testing.B) { benchmarkBulkHash(b, newHashShake256(), 1350) } +func BenchmarkShake128_MTU(b *testing.B) { benchmarkBulkHash(b, newHashShake128(), 1350) } + +func BenchmarkSha3_512_1MiB(b *testing.B) { benchmarkBulkHash(b, New512(), 1<<20) } +func BenchmarkShake256_1MiB(b *testing.B) { benchmarkBulkHash(b, newHashShake256(), 1<<20) } diff --git a/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/shake.go b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/shake.go new file mode 100644 index 000000000..841f9860f --- /dev/null +++ b/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3/shake.go @@ -0,0 +1,60 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package sha3 + +// This file defines the ShakeHash interface, and provides +// functions for creating SHAKE instances, as well as utility +// functions for hashing bytes to arbitrary-length output. + +import ( + "io" +) + +// ShakeHash defines the interface to hash functions that +// support arbitrary-length output. +type ShakeHash interface { + // Write absorbs more data into the hash's state. It panics if input is + // written to it after output has been read from it. + io.Writer + + // Read reads more output from the hash; reading affects the hash's + // state. (ShakeHash.Read is thus very different from Hash.Sum) + // It never returns an error. + io.Reader + + // Clone returns a copy of the ShakeHash in its current state. + Clone() ShakeHash + + // Reset resets the ShakeHash to its initial state. + Reset() +} + +func (d *state) Clone() ShakeHash { + return d.clone() +} + +// NewShake128 creates a new SHAKE128 variable-output-length ShakeHash. +// Its generic security strength is 128 bits against all attacks if at +// least 32 bytes of its output are used. +func NewShake128() ShakeHash { return &state{rate: 168, dsbyte: 0x1f} } + +// NewShake256 creates a new SHAKE128 variable-output-length ShakeHash. +// Its generic security strength is 256 bits against all attacks if +// at least 64 bytes of its output are used. +func NewShake256() ShakeHash { return &state{rate: 136, dsbyte: 0x1f} } + +// ShakeSum128 writes an arbitrary-length digest of data into hash. +func ShakeSum128(hash, data []byte) { + h := NewShake128() + h.Write(data) + h.Read(hash) +} + +// ShakeSum256 writes an arbitrary-length digest of data into hash. +func ShakeSum256(hash, data []byte) { + h := NewShake256() + h.Write(data) + h.Read(hash) +} From 4d08eb0140c5d6536742adfffb0b8724aee6ad51 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 24 Dec 2014 10:20:25 -0800 Subject: [PATCH 03/21] updated multihash (io) --- Godeps/Godeps.json | 4 +- .../src/github.com/jbenet/go-multihash/io.go | 79 ++++++++++++++ .../github.com/jbenet/go-multihash/io_test.go | 69 ++++++++++++ .../jbenet/go-multihash/multihash.go | 101 +++++++++++------- .../jbenet/go-multihash/multihash_test.go | 80 +++++++++++++- .../src/github.com/jbenet/go-multihash/sum.go | 8 +- .../jbenet/go-multihash/sum_test.go | 7 ++ .../jbenet/go-multihash/test/foo.go | 21 ---- .../github.com/jbenet/go-multihash/test/test | Bin 0 -> 2451120 bytes 9 files changed, 306 insertions(+), 63 deletions(-) create mode 100644 Godeps/_workspace/src/github.com/jbenet/go-multihash/io.go create mode 100644 Godeps/_workspace/src/github.com/jbenet/go-multihash/io_test.go delete mode 100644 Godeps/_workspace/src/github.com/jbenet/go-multihash/test/foo.go create mode 100644 Godeps/_workspace/src/github.com/jbenet/go-multihash/test/test diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 9803360f6..b473d6b72 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -131,8 +131,8 @@ }, { "ImportPath": "github.com/jbenet/go-multihash", - "Comment": "0.1.0-5-g1976046", - "Rev": "1976046c2b0db0b668791b3e541d76a38b7c1af7" + "Comment": "0.1.0-19-g8ce5cb1", + "Rev": "8ce5cb1b82e1b4c1bea1fdf3cd467ef49301734e" }, { "ImportPath": "github.com/jbenet/go-peerstream", diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/io.go b/Godeps/_workspace/src/github.com/jbenet/go-multihash/io.go new file mode 100644 index 000000000..cdd234c4b --- /dev/null +++ b/Godeps/_workspace/src/github.com/jbenet/go-multihash/io.go @@ -0,0 +1,79 @@ +package multihash + +import ( + "fmt" + "io" +) + +// Reader is an io.Reader wrapper that exposes a function +// to read a whole multihash, parse it, and return it. +type Reader interface { + io.Reader + + ReadMultihash() (Multihash, error) +} + +// Writer is an io.Writer wrapper that exposes a function +// to write a whole multihash. +type Writer interface { + io.Writer + + WriteMultihash(Multihash) error +} + +// NewReader wraps an io.Reader with a multihash.Reader +func NewReader(r io.Reader) Reader { + return &mhReader{r} +} + +// NewWriter wraps an io.Writer with a multihash.Writer +func NewWriter(w io.Writer) Writer { + return &mhWriter{w} +} + +type mhReader struct { + r io.Reader +} + +func (r *mhReader) Read(buf []byte) (n int, err error) { + return r.r.Read(buf) +} + +func (r *mhReader) ReadMultihash() (Multihash, error) { + mhhdr := make([]byte, 2) + if _, err := io.ReadFull(r.r, mhhdr); err != nil { + return nil, err + } + + // first byte is the algo, the second is the length. + + // (varints someday...) + length := uint(mhhdr[1]) + + if length > 127 { + return nil, fmt.Errorf("varints not yet supported (length is %d)", length) + } + + buf := make([]byte, length+2) + buf[0] = mhhdr[0] + buf[1] = mhhdr[1] + + if _, err := io.ReadFull(r.r, buf[2:]); err != nil { + return nil, err + } + + return Cast(buf) +} + +type mhWriter struct { + w io.Writer +} + +func (w *mhWriter) Write(buf []byte) (n int, err error) { + return w.w.Write(buf) +} + +func (w *mhWriter) WriteMultihash(m Multihash) error { + _, err := w.w.Write([]byte(m)) + return err +} diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/io_test.go b/Godeps/_workspace/src/github.com/jbenet/go-multihash/io_test.go new file mode 100644 index 000000000..44da78e1f --- /dev/null +++ b/Godeps/_workspace/src/github.com/jbenet/go-multihash/io_test.go @@ -0,0 +1,69 @@ +package multihash + +import ( + "bytes" + "io" + "testing" +) + +func TestReader(t *testing.T) { + + var buf bytes.Buffer + + for _, tc := range testCases { + m, err := tc.Multihash() + if err != nil { + t.Fatal(err) + } + + buf.Write([]byte(m)) + } + + r := NewReader(&buf) + + for _, tc := range testCases { + h, err := tc.Multihash() + if err != nil { + t.Fatal(err) + } + + h2, err := r.ReadMultihash() + if err != nil { + t.Error(err) + continue + } + + if !bytes.Equal(h, h2) { + t.Error("h and h2 should be equal") + } + } +} + +func TestWriter(t *testing.T) { + + var buf bytes.Buffer + w := NewWriter(&buf) + + for _, tc := range testCases { + m, err := tc.Multihash() + if err != nil { + t.Error(err) + continue + } + + if err := w.WriteMultihash(m); err != nil { + t.Error(err) + continue + } + + buf2 := make([]byte, len(m)) + if _, err := io.ReadFull(&buf, buf2); err != nil { + t.Error(err) + continue + } + + if !bytes.Equal(m, buf2) { + t.Error("m and buf2 should be equal") + } + } +} diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash.go b/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash.go index a56bc162b..9dbe7fd7f 100644 --- a/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash.go +++ b/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash.go @@ -2,43 +2,67 @@ package multihash import ( "encoding/hex" + "errors" "fmt" + b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" ) +// errors +var ( + ErrUnknownCode = errors.New("unknown multihash code") + ErrTooShort = errors.New("multihash too short. must be > 3 bytes") + ErrTooLong = errors.New("multihash too long. must be < 129 bytes") + ErrLenNotSupported = errors.New("multihash does not yet support digests longer than 127 bytes") +) + +// ErrInconsistentLen is returned when a decoded multihash has an inconsistent length +type ErrInconsistentLen struct { + dm *DecodedMultihash +} + +func (e ErrInconsistentLen) Error() string { + return fmt.Sprintf("multihash length inconsistent: %v", e.dm) +} + // constants -const SHA1 = 0x11 -const SHA2_256 = 0x12 -const SHA2_512 = 0x13 -const SHA3 = 0x14 -const BLAKE2B = 0x40 -const BLAKE2S = 0x41 +const ( + SHA1 = 0x11 + SHA2_256 = 0x12 + SHA2_512 = 0x13 + SHA3 = 0x14 + BLAKE2B = 0x40 + BLAKE2S = 0x41 +) +// Names maps the name of a hash to the code var Names = map[string]int{ - "sha1": 0x11, - "sha2-256": 0x12, - "sha2-512": 0x13, - "sha3": 0x14, - "blake2b": 0x40, - "blake2s": 0x41, + "sha1": SHA1, + "sha2-256": SHA2_256, + "sha2-512": SHA2_512, + "sha3": SHA3, + "blake2b": BLAKE2B, + "blake2s": BLAKE2S, } +// Codes maps a hash code to it's name var Codes = map[int]string{ - 0x11: "sha1", - 0x12: "sha2-256", - 0x13: "sha2-512", - 0x14: "sha3", - 0x40: "blake2b", - 0x41: "blake2s", + SHA1: "sha1", + SHA2_256: "sha2-256", + SHA2_512: "sha2-512", + SHA3: "sha3", + BLAKE2B: "blake2b", + BLAKE2S: "blake2s", } +// DefaultLengths maps a hash code to it's default length var DefaultLengths = map[int]int{ - 0x11: 20, - 0x12: 32, - 0x13: 64, - 0x14: 64, - 0x40: 64, - 0x41: 32, + SHA1: 20, + SHA2_256: 32, + SHA2_512: 64, + SHA3: 64, + BLAKE2B: 64, + BLAKE2S: 32, } type DecodedMultihash struct { @@ -50,8 +74,12 @@ type DecodedMultihash struct { type Multihash []byte -func (m Multihash) HexString() string { - return hex.EncodeToString([]byte(m)) +func (m *Multihash) HexString() string { + return hex.EncodeToString([]byte(*m)) +} + +func (m *Multihash) String() string { + return m.HexString() } func FromHexString(s string) (Multihash, error) { @@ -88,21 +116,21 @@ func Cast(buf []byte) (Multihash, error) { } if !ValidCode(dm.Code) { - return Multihash{}, fmt.Errorf("unknown multihash code") + return Multihash{}, ErrUnknownCode } return Multihash(buf), nil } -// Decodes a hash from the given Multihash. +// Decode a hash from the given Multihash. func Decode(buf []byte) (*DecodedMultihash, error) { if len(buf) < 3 { - return nil, fmt.Errorf("multihash too short. must be > 3 bytes.") + return nil, ErrTooShort } if len(buf) > 129 { - return nil, fmt.Errorf("multihash too long. must be < 129 bytes.") + return nil, ErrTooLong } dm := &DecodedMultihash{ @@ -113,23 +141,22 @@ func Decode(buf []byte) (*DecodedMultihash, error) { } if len(dm.Digest) != dm.Length { - return nil, fmt.Errorf("multihash length inconsistent: %v", dm) + return nil, ErrInconsistentLen{dm} } return dm, nil } -// Encodes a hash digest along with the specified function code. +// Encode a hash digest along with the specified function code. // Note: the length is derived from the length of the digest itself. func Encode(buf []byte, code int) ([]byte, error) { if !ValidCode(code) { - return nil, fmt.Errorf("unknown multihash code") + return nil, ErrUnknownCode } if len(buf) > 127 { - m := "multihash does not yet support digests longer than 127 bytes." - return nil, fmt.Errorf(m) + return nil, ErrLenNotSupported } pre := make([]byte, 2) @@ -142,7 +169,7 @@ func EncodeName(buf []byte, name string) ([]byte, error) { return Encode(buf, Names[name]) } -// Checks whether a multihash code is valid. +// ValidCode checks whether a multihash code is valid. func ValidCode(code int) bool { if AppCode(code) { return true @@ -155,7 +182,7 @@ func ValidCode(code int) bool { return false } -// Checks whether a multihash code is part of the App range. +// AppCode checks whether a multihash code is part of the App range. func AppCode(code int) bool { return code >= 0 && code < 0x10 } diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash_test.go b/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash_test.go index fac9f721b..dfa858e4f 100644 --- a/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash_test.go +++ b/Godeps/_workspace/src/github.com/jbenet/go-multihash/multihash_test.go @@ -3,6 +3,7 @@ package multihash import ( "bytes" "encoding/hex" + "fmt" "testing" ) @@ -31,6 +32,19 @@ var testCases = []TestCase{ TestCase{"0beec7b5ea3f0fdbc9", 0x40, "blake2b"}, } +func (tc TestCase) Multihash() (Multihash, error) { + ob, err := hex.DecodeString(tc.hex) + if err != nil { + return nil, err + } + + b := make([]byte, 2+len(ob)) + b[0] = byte(uint8(tc.code)) + b[1] = byte(uint8(len(ob))) + copy(b[2:], ob) + return Cast(b) +} + func TestEncode(t *testing.T) { for _, tc := range testCases { ob, err := hex.DecodeString(tc.hex) @@ -63,9 +77,28 @@ func TestEncode(t *testing.T) { if !bytes.Equal(encN, nb) { t.Error("encoded byte mismatch: ", encN, nb) } + + h, err := tc.Multihash() + if err != nil { + t.Error(err) + } + if !bytes.Equal(h, nb) { + t.Error("Multihash func mismatch.") + } } } +func ExampleEncodeName() { + // ignores errors for simplicity - don't do that at home. + buf, _ := hex.DecodeString("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33") + mhbuf, _ := EncodeName(buf, "sha1") + mhhex := hex.EncodeToString(mhbuf) + fmt.Printf("hex: %v\n", mhhex) + + // Output: + // hex: 11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33 +} + func TestDecode(t *testing.T) { for _, tc := range testCases { ob, err := hex.DecodeString(tc.hex) @@ -114,6 +147,18 @@ func TestTable(t *testing.T) { } } +func ExampleDecode() { + // ignores errors for simplicity - don't do that at home. + buf, _ := hex.DecodeString("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33") + mhbuf, _ := EncodeName(buf, "sha1") + o, _ := Decode(mhbuf) + mhhex := hex.EncodeToString(o.Digest) + fmt.Printf("obj: %v 0x%x %d %s\n", o.Name, o.Code, o.Length, mhhex) + + // Output: + // obj: sha1 0x11 20 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33 +} + func TestValidCode(t *testing.T) { for i := 0; i < 0xff; i++ { _, ok := tCodes[i] @@ -127,7 +172,7 @@ func TestValidCode(t *testing.T) { func TestAppCode(t *testing.T) { for i := 0; i < 0xff; i++ { - b := i > 0 && i < 0x10 + b := i >= 0 && i < 0x10 if AppCode(i) != b { t.Error("AppCode incorrect for: ", i) } @@ -190,3 +235,36 @@ func TestHex(t *testing.T) { } } } + +func BenchmarkEncode(b *testing.B) { + tc := testCases[0] + ob, err := hex.DecodeString(tc.hex) + if err != nil { + b.Error(err) + return + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + Encode(ob, tc.code) + } +} + +func BenchmarkDecode(b *testing.B) { + tc := testCases[0] + ob, err := hex.DecodeString(tc.hex) + if err != nil { + b.Error(err) + return + } + + pre := make([]byte, 2) + pre[0] = byte(uint8(tc.code)) + pre[1] = byte(uint8(len(ob))) + nb := append(pre, ob...) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + Decode(nb) + } +} diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/sum.go b/Godeps/_workspace/src/github.com/jbenet/go-multihash/sum.go index 767be814e..4dc29ee3c 100644 --- a/Godeps/_workspace/src/github.com/jbenet/go-multihash/sum.go +++ b/Godeps/_workspace/src/github.com/jbenet/go-multihash/sum.go @@ -4,10 +4,14 @@ import ( "crypto/sha1" "crypto/sha256" "crypto/sha512" + "errors" "fmt" + sha3 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.crypto/sha3" ) +var ErrSumNotSupported = errors.New("Function not implemented. Complain to lib maintainer.") + func Sum(data []byte, code int, length int) (Multihash, error) { m := Multihash{} err := error(nil) @@ -26,7 +30,7 @@ func Sum(data []byte, code int, length int) (Multihash, error) { case SHA3: d, err = sumSHA3(data) default: - return m, fmt.Errorf("Function not implemented. Complain to lib maintainer.") + return m, ErrSumNotSupported } if err != nil { @@ -60,7 +64,7 @@ func sumSHA512(data []byte) []byte { } func sumSHA3(data []byte) ([]byte, error) { - h := sha3.NewKeccak512() + h := sha3.New512() if _, err := h.Write(data); err != nil { return nil, err } diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/sum_test.go b/Godeps/_workspace/src/github.com/jbenet/go-multihash/sum_test.go index 3431d6f67..1e5891bbb 100644 --- a/Godeps/_workspace/src/github.com/jbenet/go-multihash/sum_test.go +++ b/Godeps/_workspace/src/github.com/jbenet/go-multihash/sum_test.go @@ -57,3 +57,10 @@ func TestSum(t *testing.T) { } } } + +func BenchmarkSum(b *testing.B) { + tc := sumTestCases[0] + for i := 0; i < b.N; i++ { + Sum([]byte(tc.input), tc.code, tc.length) + } +} diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/test/foo.go b/Godeps/_workspace/src/github.com/jbenet/go-multihash/test/foo.go deleted file mode 100644 index 21d33d658..000000000 --- a/Godeps/_workspace/src/github.com/jbenet/go-multihash/test/foo.go +++ /dev/null @@ -1,21 +0,0 @@ -package main - -import ( - "encoding/hex" - "fmt" - "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" -) - -func main() { - // ignores errors for simplicity. - // don't do that at home. - - buf, _ := hex.DecodeString("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33") - mhbuf, _ := multihash.EncodeName(buf, "sha1") - mhhex := hex.EncodeToString(mhbuf) - fmt.Printf("hex: %v\n", mhhex) - - o, _ := multihash.Decode(mhbuf) - mhhex = hex.EncodeToString(o.Digest) - fmt.Printf("obj: %v 0x%x %d %s\n", o.Name, o.Code, o.Length, mhhex) -} diff --git a/Godeps/_workspace/src/github.com/jbenet/go-multihash/test/test b/Godeps/_workspace/src/github.com/jbenet/go-multihash/test/test new file mode 100644 index 0000000000000000000000000000000000000000..9e51995317ae4918838aacfde1eab29077a0b231 GIT binary patch literal 2451120 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.*B*aEH1i9AjSO&uKc!s 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𝔎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

  • oDK!o!l`{^R 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 tWi{=M!Q6>2O|m3gGSCsSR})W9{?m~B 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
    @%Z@yIbCH1TRv_G_dZk%a6&PwHU-aK16 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

    =(IF! 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 z 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 literal 0 HcmV?d00001 From 735c3de7faab7b1b7f347850dfb74300655a560d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 24 Dec 2014 11:16:17 -0800 Subject: [PATCH 04/21] relay service -- streams across peers this is the leadup into NAT traversal. note: doesn't work yet. hangs the test. --- net/ipfsnet/net.go | 11 ++- net/services/mux/mux.go | 11 ++- net/services/relay/relay.go | 159 +++++++++++++++++++++++++++++++ net/services/relay/relay_test.go | 101 ++++++++++++++++++++ 4 files changed, 277 insertions(+), 5 deletions(-) create mode 100644 net/services/relay/relay.go create mode 100644 net/services/relay/relay_test.go diff --git a/net/ipfsnet/net.go b/net/ipfsnet/net.go index bbd356ff9..cffe2c984 100644 --- a/net/ipfsnet/net.go +++ b/net/ipfsnet/net.go @@ -5,11 +5,13 @@ import ( "fmt" ic "github.com/jbenet/go-ipfs/crypto" + peer "github.com/jbenet/go-ipfs/peer" + inet "github.com/jbenet/go-ipfs/net" ids "github.com/jbenet/go-ipfs/net/services/identify" mux "github.com/jbenet/go-ipfs/net/services/mux" + relay "github.com/jbenet/go-ipfs/net/services/relay" swarm "github.com/jbenet/go-ipfs/net/swarm" - peer "github.com/jbenet/go-ipfs/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" @@ -105,6 +107,7 @@ type Network struct { swarm *swarm.Swarm // peer connection multiplexing mux mux.Mux // protocol multiplexing ids *ids.IDService + relay *relay.RelayService cg ctxgroup.ContextGroup // for Context closing } @@ -133,11 +136,13 @@ func NewNetwork(ctx context.Context, listen []ma.Multiaddr, local peer.ID, n.mux.Handle((*stream)(s)) }) - // setup a conn handler that immediately "asks the other side about them" - // this is ProtocolIdentify. + // setup ProtocolIdentify to immediately "asks the other side about them" n.ids = ids.NewIDService(n) s.SetConnHandler(n.newConnHandler) + // setup ProtocolRelay to allow traffic relaying. + // Feed things we get for ourselves into the muxer. + n.relay = relay.NewRelayService(n.cg.Context(), n, n.mux.HandleSync) return n, nil } diff --git a/net/services/mux/mux.go b/net/services/mux/mux.go index a89c32678..52913a56e 100644 --- a/net/services/mux/mux.go +++ b/net/services/mux/mux.go @@ -89,9 +89,16 @@ func (m *Mux) SetHandler(p inet.ProtocolID, h inet.StreamHandler) { m.Unlock() } -// Handle reads the next name off the Stream, and calls a function +// Handle reads the next name off the Stream, and calls a handler function +// This is done in its own goroutine, to avoid blocking the caller. func (m *Mux) Handle(s inet.Stream) { + go m.HandleSync(s) +} +// HandleSync reads the next name off the Stream, and calls a handler function +// This is done synchronously. The handler function will return before +// HandleSync returns. +func (m *Mux) HandleSync(s inet.Stream) { ctx := context.Background() name, handler, err := m.ReadProtocolHeader(s) @@ -102,7 +109,7 @@ func (m *Mux) Handle(s inet.Stream) { return } - log.Info("muxer handle protocol: %s", name) + log.Infof("muxer handle protocol: %s", name) log.Event(ctx, "muxHandle", eventlog.Metadata{"protocol": name}) handler(s) } diff --git a/net/services/relay/relay.go b/net/services/relay/relay.go new file mode 100644 index 000000000..c23647832 --- /dev/null +++ b/net/services/relay/relay.go @@ -0,0 +1,159 @@ +package relay + +import ( + "fmt" + "io" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + + inet "github.com/jbenet/go-ipfs/net" + peer "github.com/jbenet/go-ipfs/peer" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" +) + +var log = eventlog.Logger("relay") + +// ProtocolRelay is the ProtocolID of the Relay Service. +const ProtocolRelay inet.ProtocolID = "/ipfs/relay" + +// Relay is a structure that implements ProtocolRelay. +// It is a simple relay service which forwards traffic +// between two directly connected peers. +// +// the protocol is very simple: +// +// /ipfs/relay\n +// +// +// +// +type RelayService struct { + Network inet.Network + handler inet.StreamHandler // for streams sent to us locally. + + cg ctxgroup.ContextGroup +} + +func NewRelayService(ctx context.Context, n inet.Network, sh inet.StreamHandler) *RelayService { + s := &RelayService{ + Network: n, + handler: sh, + cg: ctxgroup.WithContext(ctx), + } + n.SetHandler(inet.ProtocolRelay, s.requestHandler) + return s +} + +// requestHandler is the function called by clients +func (rs *RelayService) requestHandler(s inet.Stream) { + if err := rs.handleStream(s); err != nil { + log.Error("RelayService error:", err) + } +} + +// handleStream is our own handler, which returns an error for simplicity. +func (rs *RelayService) handleStream(s inet.Stream) error { + defer s.Close() + + // read the header (src and dst peer.IDs) + src, dst, err := ReadHeader(s) + if err != nil { + return fmt.Errorf("stream with bad header: %s", err) + } + + local := rs.Network.LocalPeer() + + switch { + case src == local: + return fmt.Errorf("relaying from self") + case dst == local: // it's for us! yaaay. + log.Debugf("%s consuming stream from %s", rs.Network.LocalPeer(), src) + return rs.consumeStream(s) + default: // src and dst are not local. relay it. + log.Debugf("%s relaying stream %s <--> %s", rs.Network.LocalPeer(), src, dst) + return rs.pipeStream(src, dst, s) + } +} + +// consumeStream connects streams directed to the local peer +// to our handler, with the header now stripped (read). +func (rs *RelayService) consumeStream(s inet.Stream) error { + rs.handler(s) // boom. + return nil +} + +// pipeStream relays over a stream to a remote peer. It's like `cat` +func (rs *RelayService) pipeStream(src, dst peer.ID, s inet.Stream) error { + s2, err := rs.openStreamToPeer(dst) + if err != nil { + return fmt.Errorf("failed to open stream to peer: %s -- %s", dst, err) + } + + if err := WriteHeader(s2, src, dst); err != nil { + return err + } + + // connect the series of tubes. + done := make(chan retio, 2) + go func() { + n, err := io.Copy(s2, s) + done <- retio{n, err} + }() + go func() { + n, err := io.Copy(s, s2) + done <- retio{n, err} + }() + + r1 := <-done + r2 := <-done + log.Infof("relayed %d/%d bytes between %s and %s", r1.n, r2.n, src, dst) + + if r1.err != nil { + return r1.err + } + return r2.err +} + +// openStreamToPeer opens a pipe to a remote endpoint +// for now, can only open streams to directly connected peers. +// maybe we can do some routing later on. +func (rs *RelayService) openStreamToPeer(p peer.ID) (inet.Stream, error) { + return rs.Network.NewStream(ProtocolRelay, p) +} + +func ReadHeader(r io.Reader) (src, dst peer.ID, err error) { + + mhr := mh.NewReader(r) + + s, err := mhr.ReadMultihash() + if err != nil { + return "", "", err + } + + d, err := mhr.ReadMultihash() + if err != nil { + return "", "", err + } + + return peer.ID(s), peer.ID(d), nil +} + +func WriteHeader(w io.Writer, src, dst peer.ID) error { + // write header to w. + mhw := mh.NewWriter(w) + if err := mhw.WriteMultihash(mh.Multihash(src)); err != nil { + return fmt.Errorf("failed to write relay header: %s -- %s", dst, err) + } + if err := mhw.WriteMultihash(mh.Multihash(dst)); err != nil { + return fmt.Errorf("failed to write relay header: %s -- %s", dst, err) + } + + return nil +} + +type retio struct { + n int64 + err error +} diff --git a/net/services/relay/relay_test.go b/net/services/relay/relay_test.go new file mode 100644 index 000000000..57eee6db1 --- /dev/null +++ b/net/services/relay/relay_test.go @@ -0,0 +1,101 @@ +package relay_test + +import ( + "io" + "testing" + + inet "github.com/jbenet/go-ipfs/net" + netutil "github.com/jbenet/go-ipfs/net/ipfsnet/util" + mux "github.com/jbenet/go-ipfs/net/services/mux" + relay "github.com/jbenet/go-ipfs/net/services/relay" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +var log = eventlog.Logger("relay_test") + +func TestRelaySimple(t *testing.T) { + + ctx := context.Background() + + // these networks have the relay service wired in already. + n1 := netutil.GenNetwork(t, ctx) + n2 := netutil.GenNetwork(t, ctx) + n3 := netutil.GenNetwork(t, ctx) + + n1p := n1.LocalPeer() + n2p := n2.LocalPeer() + n3p := n3.LocalPeer() + + netutil.DivulgeAddresses(n2, n1) + netutil.DivulgeAddresses(n2, n3) + + if err := n1.DialPeer(ctx, n2p); err != nil { + t.Fatalf("Failed to dial:", err) + } + if err := n3.DialPeer(ctx, n2p); err != nil { + t.Fatalf("Failed to dial:", err) + } + + // setup handler on n3 to copy everything over to the pipe. + piper, pipew := io.Pipe() + n3.SetHandler(inet.ProtocolTesting, func(s inet.Stream) { + log.Debug("relay stream opened to n3!") + log.Debug("piping and echoing everything") + w := io.MultiWriter(s, pipew) + io.Copy(w, s) + log.Debug("closing stream") + s.Close() + }) + + // ok, now we can try to relay n1--->n2--->n3. + log.Debug("open relay stream") + s, err := n1.NewStream(relay.ProtocolRelay, n2p) + if err != nil { + t.Fatal(err) + } + + // ok first thing we write the relay header n1->n3 + log.Debug("write relay header") + if err := relay.WriteHeader(s, n1p, n3p); err != nil { + t.Fatal(err) + } + + // ok now the header's there, we can write the next protocol header. + log.Debug("write testing header") + if err := mux.WriteProtocolHeader(inet.ProtocolTesting, s); err != nil { + t.Fatal(err) + } + + // okay, now we should be able to write text, and read it out. + buf1 := []byte("abcdefghij") + buf2 := make([]byte, 10) + buf3 := make([]byte, 10) + log.Debug("write in some text.") + if _, err := s.Write(buf1); err != nil { + t.Fatal(err) + } + + // read it out from the pipe. + log.Debug("read it out from the pipe.") + if _, err := io.ReadFull(piper, buf2); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf2) { + t.Fatal("should've gotten that text out of the pipe") + } + + // read it out from the stream (echoed) + log.Debug("read it out from the stream (echoed).") + if _, err := io.ReadFull(s, buf3); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf3) { + t.Fatal("should've gotten that text out of the stream") + } + + // sweet. relay works. + log.Debug("sweet, relay works.") + s.Close() +} From 49cb135ca2906d101449f16577dfce80dc06cf29 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 28 Dec 2014 06:25:45 -0800 Subject: [PATCH 05/21] ipfsnet -> swarmnet swarmnet is a better name for the package, because it's just a Network implemented with a Swarm. (ipfsnet will be something slightly different). --- core/core.go | 4 ++-- net/backpressure/backpressure_test.go | 2 +- net/services/identify/id_test.go | 2 +- net/services/relay/relay_test.go | 2 +- net/{ipfsnet => swarmnet}/net.go | 0 net/{ipfsnet => swarmnet}/net_test.go | 2 +- net/{ipfsnet => swarmnet}/util/util.go | 6 +++--- routing/dht/dht_test.go | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) rename net/{ipfsnet => swarmnet}/net.go (100%) rename net/{ipfsnet => swarmnet}/net_test.go (97%) rename net/{ipfsnet => swarmnet}/util/util.go (78%) diff --git a/core/core.go b/core/core.go index 41e974c30..3c581dc51 100644 --- a/core/core.go +++ b/core/core.go @@ -21,7 +21,7 @@ import ( merkledag "github.com/jbenet/go-ipfs/merkledag" namesys "github.com/jbenet/go-ipfs/namesys" inet "github.com/jbenet/go-ipfs/net" - ipfsnet "github.com/jbenet/go-ipfs/net/ipfsnet" + swarmnet "github.com/jbenet/go-ipfs/net/swarmnet" path "github.com/jbenet/go-ipfs/path" peer "github.com/jbenet/go-ipfs/peer" pin "github.com/jbenet/go-ipfs/pin" @@ -122,7 +122,7 @@ func NewIpfsNode(ctx context.Context, cfg *config.Config, online bool) (n *IpfsN return nil, debugerror.Wrap(err) } - n.Network, err = ipfsnet.NewNetwork(ctx, listenAddrs, n.Identity, n.Peerstore) + n.Network, err = swarmnet.NewNetwork(ctx, listenAddrs, n.Identity, n.Peerstore) if err != nil { return nil, debugerror.Wrap(err) } diff --git a/net/backpressure/backpressure_test.go b/net/backpressure/backpressure_test.go index 72e0b2634..3c988dd55 100644 --- a/net/backpressure/backpressure_test.go +++ b/net/backpressure/backpressure_test.go @@ -8,7 +8,7 @@ import ( "time" inet "github.com/jbenet/go-ipfs/net" - netutil "github.com/jbenet/go-ipfs/net/ipfsnet/util" + netutil "github.com/jbenet/go-ipfs/net/swarmnet/util" peer "github.com/jbenet/go-ipfs/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" diff --git a/net/services/identify/id_test.go b/net/services/identify/id_test.go index 6583683a4..4d95407de 100644 --- a/net/services/identify/id_test.go +++ b/net/services/identify/id_test.go @@ -6,7 +6,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" handshake "github.com/jbenet/go-ipfs/net/handshake" - netutil "github.com/jbenet/go-ipfs/net/ipfsnet/util" + netutil "github.com/jbenet/go-ipfs/net/swarmnet/util" peer "github.com/jbenet/go-ipfs/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/services/relay/relay_test.go b/net/services/relay/relay_test.go index 57eee6db1..85b605534 100644 --- a/net/services/relay/relay_test.go +++ b/net/services/relay/relay_test.go @@ -5,9 +5,9 @@ import ( "testing" inet "github.com/jbenet/go-ipfs/net" - netutil "github.com/jbenet/go-ipfs/net/ipfsnet/util" mux "github.com/jbenet/go-ipfs/net/services/mux" relay "github.com/jbenet/go-ipfs/net/services/relay" + netutil "github.com/jbenet/go-ipfs/net/swarmnet/util" eventlog "github.com/jbenet/go-ipfs/util/eventlog" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/ipfsnet/net.go b/net/swarmnet/net.go similarity index 100% rename from net/ipfsnet/net.go rename to net/swarmnet/net.go diff --git a/net/ipfsnet/net_test.go b/net/swarmnet/net_test.go similarity index 97% rename from net/ipfsnet/net_test.go rename to net/swarmnet/net_test.go index 8cdd30f84..24f4c497c 100644 --- a/net/ipfsnet/net_test.go +++ b/net/swarmnet/net_test.go @@ -8,7 +8,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" inet "github.com/jbenet/go-ipfs/net" - netutil "github.com/jbenet/go-ipfs/net/ipfsnet/util" + netutil "github.com/jbenet/go-ipfs/net/swarmnet/util" ) // TestConnectednessCorrect starts a few networks, connects a few diff --git a/net/ipfsnet/util/util.go b/net/swarmnet/util/util.go similarity index 78% rename from net/ipfsnet/util/util.go rename to net/swarmnet/util/util.go index 6260cfc3f..a69e35499 100644 --- a/net/ipfsnet/util/util.go +++ b/net/swarmnet/util/util.go @@ -4,20 +4,20 @@ import ( "testing" inet "github.com/jbenet/go-ipfs/net" - in "github.com/jbenet/go-ipfs/net/ipfsnet" + sn "github.com/jbenet/go-ipfs/net/swarmnet" peer "github.com/jbenet/go-ipfs/peer" tu "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) -func GenNetwork(t *testing.T, ctx context.Context) *in.Network { +func GenNetwork(t *testing.T, ctx context.Context) *sn.Network { p := tu.RandPeerNetParamsOrFatal(t) ps := peer.NewPeerstore() ps.AddAddress(p.ID, p.Addr) ps.AddPubKey(p.ID, p.PubKey) ps.AddPrivKey(p.ID, p.PrivKey) - n, err := in.NewNetwork(ctx, ps.Addresses(p.ID), p.ID, ps) + n, err := sn.NewNetwork(ctx, ps.Addresses(p.ID), p.ID, ps) if err != nil { t.Fatal(err) } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 4e49b8f96..088dff217 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,7 +14,7 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - ipfsnet "github.com/jbenet/go-ipfs/net/ipfsnet" + swarmnet "github.com/jbenet/go-ipfs/net/swarmnet" peer "github.com/jbenet/go-ipfs/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" @@ -49,7 +49,7 @@ func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT { peerstore.AddPubKey(p, pk) peerstore.AddAddress(p, addr) - n, err := ipfsnet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) + n, err := swarmnet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) if err != nil { t.Fatal(err) } From 2984fb72d6c612187326d4c9d275b4909d571ae9 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 28 Dec 2014 07:03:24 -0800 Subject: [PATCH 06/21] add relaying to mocknet These services should all be added separately, in a function that is Network impl independent. The interfaces need to be massaged a bit (split inet.Network in two), so will do when needed. For now this is fine. --- net/mock/mock_peernet.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/net/mock/mock_peernet.go b/net/mock/mock_peernet.go index 675c73442..3e94919b7 100644 --- a/net/mock/mock_peernet.go +++ b/net/mock/mock_peernet.go @@ -9,6 +9,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" ids "github.com/jbenet/go-ipfs/net/services/identify" mux "github.com/jbenet/go-ipfs/net/services/mux" + relay "github.com/jbenet/go-ipfs/net/services/relay" peer "github.com/jbenet/go-ipfs/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -30,8 +31,9 @@ type peernet struct { connsByLink map[*link]map[*conn]struct{} // needed to implement inet.Network - mux mux.Mux - ids *ids.IDService + mux mux.Mux + ids *ids.IDService + relay *relay.RelayService cg ctxgroup.ContextGroup sync.RWMutex @@ -69,6 +71,9 @@ func newPeernet(ctx context.Context, m *mocknet, k ic.PrivKey, // this is ProtocolIdentify. n.ids = ids.NewIDService(n) + // setup ProtocolRelay to allow traffic relaying. + // Feed things we get for ourselves into the muxer. + n.relay = relay.NewRelayService(n.cg.Context(), n, n.mux.HandleSync) return n, nil } From 35c22781ff3e7a719075fdde9c5bd4ed7dc17d08 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sun, 28 Dec 2014 16:38:13 -0800 Subject: [PATCH 07/21] relay: test across 4 + stress --- net/services/relay/relay_test.go | 208 +++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) diff --git a/net/services/relay/relay_test.go b/net/services/relay/relay_test.go index 85b605534..01192bfa9 100644 --- a/net/services/relay/relay_test.go +++ b/net/services/relay/relay_test.go @@ -99,3 +99,211 @@ func TestRelaySimple(t *testing.T) { log.Debug("sweet, relay works.") s.Close() } + +func TestRelayAcrossFour(t *testing.T) { + + ctx := context.Background() + + // these networks have the relay service wired in already. + n1 := netutil.GenNetwork(t, ctx) + n2 := netutil.GenNetwork(t, ctx) + n3 := netutil.GenNetwork(t, ctx) + n4 := netutil.GenNetwork(t, ctx) + n5 := netutil.GenNetwork(t, ctx) + + n1p := n1.LocalPeer() + n2p := n2.LocalPeer() + n3p := n3.LocalPeer() + n4p := n4.LocalPeer() + n5p := n5.LocalPeer() + + netutil.DivulgeAddresses(n2, n1) + netutil.DivulgeAddresses(n2, n3) + netutil.DivulgeAddresses(n4, n3) + netutil.DivulgeAddresses(n4, n5) + + if err := n1.DialPeer(ctx, n2p); err != nil { + t.Fatalf("Failed to dial:", err) + } + if err := n3.DialPeer(ctx, n2p); err != nil { + t.Fatalf("Failed to dial:", err) + } + if err := n3.DialPeer(ctx, n4p); err != nil { + t.Fatalf("Failed to dial:", err) + } + if err := n5.DialPeer(ctx, n4p); err != nil { + t.Fatalf("Failed to dial:", err) + } + + // setup handler on n5 to copy everything over to the pipe. + piper, pipew := io.Pipe() + n5.SetHandler(inet.ProtocolTesting, func(s inet.Stream) { + log.Debug("relay stream opened to n5!") + log.Debug("piping and echoing everything") + w := io.MultiWriter(s, pipew) + io.Copy(w, s) + log.Debug("closing stream") + s.Close() + }) + + // ok, now we can try to relay n1--->n2--->n3--->n4--->n5 + log.Debug("open relay stream") + s, err := n1.NewStream(relay.ProtocolRelay, n2p) + if err != nil { + t.Fatal(err) + } + + log.Debugf("write relay header n1->n3 (%s -> %s)", n1p, n3p) + if err := relay.WriteHeader(s, n1p, n3p); err != nil { + t.Fatal(err) + } + + log.Debugf("write relay header n1->n4 (%s -> %s)", n1p, n4p) + if err := mux.WriteProtocolHeader(relay.ProtocolRelay, s); err != nil { + t.Fatal(err) + } + if err := relay.WriteHeader(s, n1p, n4p); err != nil { + t.Fatal(err) + } + + log.Debugf("write relay header n1->n5 (%s -> %s)", n1p, n5p) + if err := mux.WriteProtocolHeader(relay.ProtocolRelay, s); err != nil { + t.Fatal(err) + } + if err := relay.WriteHeader(s, n1p, n5p); err != nil { + t.Fatal(err) + } + + // ok now the header's there, we can write the next protocol header. + log.Debug("write testing header") + if err := mux.WriteProtocolHeader(inet.ProtocolTesting, s); err != nil { + t.Fatal(err) + } + + // okay, now we should be able to write text, and read it out. + buf1 := []byte("abcdefghij") + buf2 := make([]byte, 10) + buf3 := make([]byte, 10) + log.Debug("write in some text.") + if _, err := s.Write(buf1); err != nil { + t.Fatal(err) + } + + // read it out from the pipe. + log.Debug("read it out from the pipe.") + if _, err := io.ReadFull(piper, buf2); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf2) { + t.Fatal("should've gotten that text out of the pipe") + } + + // read it out from the stream (echoed) + log.Debug("read it out from the stream (echoed).") + if _, err := io.ReadFull(s, buf3); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf3) { + t.Fatal("should've gotten that text out of the stream") + } + + // sweet. relay works. + log.Debug("sweet, relaying across 4 works.") + s.Close() +} + +func TestRelayStress(t *testing.T) { + buflen := 1 << 18 + iterations := 10 + + ctx := context.Background() + + // these networks have the relay service wired in already. + n1 := netutil.GenNetwork(t, ctx) + n2 := netutil.GenNetwork(t, ctx) + n3 := netutil.GenNetwork(t, ctx) + + n1p := n1.LocalPeer() + n2p := n2.LocalPeer() + n3p := n3.LocalPeer() + + netutil.DivulgeAddresses(n2, n1) + netutil.DivulgeAddresses(n2, n3) + + if err := n1.DialPeer(ctx, n2p); err != nil { + t.Fatalf("Failed to dial:", err) + } + if err := n3.DialPeer(ctx, n2p); err != nil { + t.Fatalf("Failed to dial:", err) + } + + // setup handler on n3 to copy everything over to the pipe. + piper, pipew := io.Pipe() + n3.SetHandler(inet.ProtocolTesting, func(s inet.Stream) { + log.Debug("relay stream opened to n3!") + log.Debug("piping and echoing everything") + w := io.MultiWriter(s, pipew) + io.Copy(w, s) + log.Debug("closing stream") + s.Close() + }) + + // ok, now we can try to relay n1--->n2--->n3. + log.Debug("open relay stream") + s, err := n1.NewStream(relay.ProtocolRelay, n2p) + if err != nil { + t.Fatal(err) + } + + // ok first thing we write the relay header n1->n3 + log.Debug("write relay header") + if err := relay.WriteHeader(s, n1p, n3p); err != nil { + t.Fatal(err) + } + + // ok now the header's there, we can write the next protocol header. + log.Debug("write testing header") + if err := mux.WriteProtocolHeader(inet.ProtocolTesting, s); err != nil { + t.Fatal(err) + } + + // okay, now write lots of text and read it back out from both + // the pipe and the stream. + buf1 := make([]byte, buflen) + buf2 := make([]byte, len(buf1)) + buf3 := make([]byte, len(buf1)) + + fillbuf := func(buf []byte, b byte) { + for i := range buf { + buf[i] = b + } + } + + for i := 0; i < iterations; i++ { + fillbuf(buf1, byte(int('a')+i)) + log.Debugf("writing %d bytes (%d/%d)", len(buf1), i, iterations) + if _, err := s.Write(buf1); err != nil { + t.Fatal(err) + } + + log.Debug("read it out from the pipe.") + if _, err := io.ReadFull(piper, buf2); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf2) { + t.Fatal("should've gotten that text out of the pipe") + } + + // read it out from the stream (echoed) + log.Debug("read it out from the stream (echoed).") + if _, err := io.ReadFull(s, buf3); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf3) { + t.Fatal("should've gotten that text out of the stream") + } + } + + log.Debug("sweet, relay works under stress.") + s.Close() +} From 89f5cd4c94d900f3b1ebbb94212c49376b38b227 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 05:43:56 -0800 Subject: [PATCH 08/21] introducing p2p pkg I think it's time to move a lot of the peer-to-peer networking but-not-ipfs-specific things into its own package: p2p. This could in the future be split off into its own library. The first thing to go is the peer. --- cmd/ipfs/init.go | 2 +- cmd/seccat/seccat.go | 2 +- core/bootstrap.go | 2 +- core/bootstrap_test.go | 2 +- core/commands/id.go | 2 +- core/commands/swarm.go | 2 +- core/core.go | 2 +- core/mock.go | 2 +- crypto/secio/interface.go | 2 +- crypto/secio/protocol.go | 2 +- diagnostics/diag.go | 2 +- epictest/core.go | 2 +- exchange/bitswap/bitswap.go | 2 +- exchange/bitswap/decision/engine.go | 2 +- exchange/bitswap/decision/engine_test.go | 2 +- exchange/bitswap/decision/ledger.go | 2 +- exchange/bitswap/decision/taskqueue.go | 2 +- exchange/bitswap/network/interface.go | 2 +- exchange/bitswap/network/ipfs_impl.go | 2 +- exchange/bitswap/testnet/interface.go | 2 +- exchange/bitswap/testnet/network_test.go | 2 +- exchange/bitswap/testnet/peernet.go | 2 +- exchange/bitswap/testnet/virtual.go | 2 +- exchange/bitswap/testutils.go | 2 +- net/backpressure/backpressure_test.go | 2 +- net/conn/conn.go | 2 +- net/conn/dial.go | 2 +- net/conn/interface.go | 2 +- net/conn/listen.go | 2 +- net/conn/secure_conn.go | 2 +- net/interface.go | 2 +- net/mock/interface.go | 2 +- net/mock/mock_conn.go | 2 +- net/mock/mock_link.go | 2 +- net/mock/mock_net.go | 2 +- net/mock/mock_peernet.go | 2 +- net/mock/mock_printer.go | 2 +- net/mock/mock_test.go | 2 +- net/services/identify/id_test.go | 2 +- net/services/relay/relay.go | 2 +- net/swarm/simul_test.go | 2 +- net/swarm/swarm.go | 2 +- net/swarm/swarm_conn.go | 2 +- net/swarm/swarm_dial.go | 2 +- net/swarm/swarm_test.go | 2 +- net/swarmnet/net.go | 2 +- net/swarmnet/util/util.go | 2 +- {peer => p2p/peer}/metrics.go | 0 {peer => p2p/peer}/metrics_test.go | 2 +- {peer => p2p/peer}/peer.go | 0 {peer => p2p/peer}/peer_test.go | 0 {peer => p2p/peer}/peerstore.go | 0 {peer => p2p/peer}/peerstore_test.go | 0 {peer => p2p/peer}/queue/distance.go | 2 +- {peer => p2p/peer}/queue/interface.go | 2 +- {peer => p2p/peer}/queue/queue_test.go | 2 +- {peer => p2p/peer}/queue/sync.go | 2 +- routing/dht/dht.go | 2 +- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/diag.go | 2 +- routing/dht/ext_test.go | 2 +- routing/dht/handlers.go | 2 +- routing/dht/pb/message.go | 2 +- routing/dht/providers.go | 2 +- routing/dht/providers_test.go | 2 +- routing/dht/query.go | 4 ++-- routing/dht/records.go | 2 +- routing/dht/routing.go | 2 +- routing/kbucket/bucket.go | 2 +- routing/kbucket/table.go | 2 +- routing/kbucket/table_test.go | 2 +- routing/kbucket/util.go | 2 +- routing/mock/centralized_client.go | 2 +- routing/mock/centralized_server.go | 2 +- routing/mock/centralized_test.go | 2 +- routing/mock/interface.go | 2 +- routing/routing.go | 2 +- util/peerset/peerset.go | 2 +- util/testutil/gen.go | 2 +- util/testutil/identity.go | 2 +- 81 files changed, 77 insertions(+), 77 deletions(-) rename {peer => p2p/peer}/metrics.go (100%) rename {peer => p2p/peer}/metrics_test.go (93%) rename {peer => p2p/peer}/peer.go (100%) rename {peer => p2p/peer}/peer_test.go (100%) rename {peer => p2p/peer}/peerstore.go (100%) rename {peer => p2p/peer}/peerstore_test.go (100%) rename {peer => p2p/peer}/queue/distance.go (97%) rename {peer => p2p/peer}/queue/interface.go (90%) rename {peer => p2p/peer}/queue/queue_test.go (98%) rename {peer => p2p/peer}/queue/sync.go (96%) diff --git a/cmd/ipfs/init.go b/cmd/ipfs/init.go index bc609659f..89080a5d8 100644 --- a/cmd/ipfs/init.go +++ b/cmd/ipfs/init.go @@ -15,7 +15,7 @@ import ( ci "github.com/jbenet/go-ipfs/crypto" imp "github.com/jbenet/go-ipfs/importer" chunk "github.com/jbenet/go-ipfs/importer/chunk" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" repo "github.com/jbenet/go-ipfs/repo" u "github.com/jbenet/go-ipfs/util" debugerror "github.com/jbenet/go-ipfs/util/debugerror" diff --git a/cmd/seccat/seccat.go b/cmd/seccat/seccat.go index 625f64ec0..b70d977e5 100644 --- a/cmd/seccat/seccat.go +++ b/cmd/seccat/seccat.go @@ -20,7 +20,7 @@ import ( ci "github.com/jbenet/go-ipfs/crypto" secio "github.com/jbenet/go-ipfs/crypto/secio" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/core/bootstrap.go b/core/bootstrap.go index 1539a761f..fa46dcf4f 100644 --- a/core/bootstrap.go +++ b/core/bootstrap.go @@ -9,7 +9,7 @@ import ( config "github.com/jbenet/go-ipfs/config" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" dht "github.com/jbenet/go-ipfs/routing/dht" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" math2 "github.com/jbenet/go-ipfs/util/math2" diff --git a/core/bootstrap_test.go b/core/bootstrap_test.go index 636a8f808..385c77fdf 100644 --- a/core/bootstrap_test.go +++ b/core/bootstrap_test.go @@ -3,7 +3,7 @@ package core import ( "testing" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" testutil "github.com/jbenet/go-ipfs/util/testutil" ) diff --git a/core/commands/id.go b/core/commands/id.go index 96e462a09..60a4e7308 100644 --- a/core/commands/id.go +++ b/core/commands/id.go @@ -12,7 +12,7 @@ import ( cmds "github.com/jbenet/go-ipfs/commands" ic "github.com/jbenet/go-ipfs/crypto" - "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/p2p/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" ) diff --git a/core/commands/swarm.go b/core/commands/swarm.go index 9b583f3ae..2d354f046 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -6,7 +6,7 @@ import ( "path" cmds "github.com/jbenet/go-ipfs/commands" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" errors "github.com/jbenet/go-ipfs/util/debugerror" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/core/core.go b/core/core.go index 3c581dc51..f707af311 100644 --- a/core/core.go +++ b/core/core.go @@ -22,8 +22,8 @@ import ( namesys "github.com/jbenet/go-ipfs/namesys" inet "github.com/jbenet/go-ipfs/net" swarmnet "github.com/jbenet/go-ipfs/net/swarmnet" + peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" - peer "github.com/jbenet/go-ipfs/peer" pin "github.com/jbenet/go-ipfs/pin" routing "github.com/jbenet/go-ipfs/routing" dht "github.com/jbenet/go-ipfs/routing/dht" diff --git a/core/mock.go b/core/mock.go index 758b30588..a3d85fedb 100644 --- a/core/mock.go +++ b/core/mock.go @@ -12,8 +12,8 @@ import ( mdag "github.com/jbenet/go-ipfs/merkledag" nsys "github.com/jbenet/go-ipfs/namesys" "github.com/jbenet/go-ipfs/net/mock" + peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" - peer "github.com/jbenet/go-ipfs/peer" dht "github.com/jbenet/go-ipfs/routing/dht" ds2 "github.com/jbenet/go-ipfs/util/datastore2" "github.com/jbenet/go-ipfs/util/testutil" diff --git a/crypto/secio/interface.go b/crypto/secio/interface.go index 2ae52d740..62e3c45ee 100644 --- a/crypto/secio/interface.go +++ b/crypto/secio/interface.go @@ -9,7 +9,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // SessionGenerator constructs secure communication sessions for a peer. diff --git a/crypto/secio/protocol.go b/crypto/secio/protocol.go index 9dc492ff2..609320b3d 100644 --- a/crypto/secio/protocol.go +++ b/crypto/secio/protocol.go @@ -12,7 +12,7 @@ import ( ci "github.com/jbenet/go-ipfs/crypto" pb "github.com/jbenet/go-ipfs/crypto/secio/internal/pb" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) diff --git a/diagnostics/diag.go b/diagnostics/diag.go index 80a598f51..3bb0b92f0 100644 --- a/diagnostics/diag.go +++ b/diagnostics/diag.go @@ -19,7 +19,7 @@ import ( pb "github.com/jbenet/go-ipfs/diagnostics/internal/pb" net "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" util "github.com/jbenet/go-ipfs/util" ) diff --git a/epictest/core.go b/epictest/core.go index bb2f00756..5937e4889 100644 --- a/epictest/core.go +++ b/epictest/core.go @@ -16,8 +16,8 @@ import ( chunk "github.com/jbenet/go-ipfs/importer/chunk" merkledag "github.com/jbenet/go-ipfs/merkledag" net "github.com/jbenet/go-ipfs/net" + peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" - peer "github.com/jbenet/go-ipfs/peer" dht "github.com/jbenet/go-ipfs/routing/dht" uio "github.com/jbenet/go-ipfs/unixfs/io" util "github.com/jbenet/go-ipfs/util" diff --git a/exchange/bitswap/bitswap.go b/exchange/bitswap/bitswap.go index 4ff23aee2..fe20a406a 100644 --- a/exchange/bitswap/bitswap.go +++ b/exchange/bitswap/bitswap.go @@ -17,7 +17,7 @@ import ( bsnet "github.com/jbenet/go-ipfs/exchange/bitswap/network" notifications "github.com/jbenet/go-ipfs/exchange/bitswap/notifications" wantlist "github.com/jbenet/go-ipfs/exchange/bitswap/wantlist" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" errors "github.com/jbenet/go-ipfs/util/debugerror" "github.com/jbenet/go-ipfs/util/delay" diff --git a/exchange/bitswap/decision/engine.go b/exchange/bitswap/decision/engine.go index da5ccfe6d..582d96e08 100644 --- a/exchange/bitswap/decision/engine.go +++ b/exchange/bitswap/decision/engine.go @@ -7,7 +7,7 @@ import ( bstore "github.com/jbenet/go-ipfs/blocks/blockstore" bsmsg "github.com/jbenet/go-ipfs/exchange/bitswap/message" wl "github.com/jbenet/go-ipfs/exchange/bitswap/wantlist" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/exchange/bitswap/decision/engine_test.go b/exchange/bitswap/decision/engine_test.go index 0196863b3..08e729dc8 100644 --- a/exchange/bitswap/decision/engine_test.go +++ b/exchange/bitswap/decision/engine_test.go @@ -11,7 +11,7 @@ import ( blocks "github.com/jbenet/go-ipfs/blocks" blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" message "github.com/jbenet/go-ipfs/exchange/bitswap/message" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) type peerAndEngine struct { diff --git a/exchange/bitswap/decision/ledger.go b/exchange/bitswap/decision/ledger.go index f2b824603..273c3e706 100644 --- a/exchange/bitswap/decision/ledger.go +++ b/exchange/bitswap/decision/ledger.go @@ -4,7 +4,7 @@ import ( "time" wl "github.com/jbenet/go-ipfs/exchange/bitswap/wantlist" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/exchange/bitswap/decision/taskqueue.go b/exchange/bitswap/decision/taskqueue.go index c86a73371..11af3db35 100644 --- a/exchange/bitswap/decision/taskqueue.go +++ b/exchange/bitswap/decision/taskqueue.go @@ -4,7 +4,7 @@ import ( "sync" wantlist "github.com/jbenet/go-ipfs/exchange/bitswap/wantlist" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/exchange/bitswap/network/interface.go b/exchange/bitswap/network/interface.go index 1bc14ca88..8598898fa 100644 --- a/exchange/bitswap/network/interface.go +++ b/exchange/bitswap/network/interface.go @@ -4,7 +4,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" bsmsg "github.com/jbenet/go-ipfs/exchange/bitswap/message" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/exchange/bitswap/network/ipfs_impl.go b/exchange/bitswap/network/ipfs_impl.go index 5388c8e6d..73114642f 100644 --- a/exchange/bitswap/network/ipfs_impl.go +++ b/exchange/bitswap/network/ipfs_impl.go @@ -4,7 +4,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" bsmsg "github.com/jbenet/go-ipfs/exchange/bitswap/message" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" util "github.com/jbenet/go-ipfs/util" ) diff --git a/exchange/bitswap/testnet/interface.go b/exchange/bitswap/testnet/interface.go index 029ea704e..4b6f46aaf 100644 --- a/exchange/bitswap/testnet/interface.go +++ b/exchange/bitswap/testnet/interface.go @@ -2,7 +2,7 @@ package bitswap import ( bsnet "github.com/jbenet/go-ipfs/exchange/bitswap/network" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" "github.com/jbenet/go-ipfs/util/testutil" ) diff --git a/exchange/bitswap/testnet/network_test.go b/exchange/bitswap/testnet/network_test.go index 6f6275896..bbf84995c 100644 --- a/exchange/bitswap/testnet/network_test.go +++ b/exchange/bitswap/testnet/network_test.go @@ -8,7 +8,7 @@ import ( blocks "github.com/jbenet/go-ipfs/blocks" bsmsg "github.com/jbenet/go-ipfs/exchange/bitswap/message" bsnet "github.com/jbenet/go-ipfs/exchange/bitswap/network" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" mockrouting "github.com/jbenet/go-ipfs/routing/mock" delay "github.com/jbenet/go-ipfs/util/delay" testutil "github.com/jbenet/go-ipfs/util/testutil" diff --git a/exchange/bitswap/testnet/peernet.go b/exchange/bitswap/testnet/peernet.go index 905d78a6a..e16242ce0 100644 --- a/exchange/bitswap/testnet/peernet.go +++ b/exchange/bitswap/testnet/peernet.go @@ -5,7 +5,7 @@ import ( ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" bsnet "github.com/jbenet/go-ipfs/exchange/bitswap/network" mockpeernet "github.com/jbenet/go-ipfs/net/mock" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" mockrouting "github.com/jbenet/go-ipfs/routing/mock" testutil "github.com/jbenet/go-ipfs/util/testutil" ) diff --git a/exchange/bitswap/testnet/virtual.go b/exchange/bitswap/testnet/virtual.go index 887d29bee..9426176a2 100644 --- a/exchange/bitswap/testnet/virtual.go +++ b/exchange/bitswap/testnet/virtual.go @@ -7,7 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" bsmsg "github.com/jbenet/go-ipfs/exchange/bitswap/message" bsnet "github.com/jbenet/go-ipfs/exchange/bitswap/network" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" mockrouting "github.com/jbenet/go-ipfs/routing/mock" util "github.com/jbenet/go-ipfs/util" diff --git a/exchange/bitswap/testutils.go b/exchange/bitswap/testutils.go index 0d1aa4fec..dd96e5f46 100644 --- a/exchange/bitswap/testutils.go +++ b/exchange/bitswap/testutils.go @@ -9,7 +9,7 @@ import ( blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" exchange "github.com/jbenet/go-ipfs/exchange" tn "github.com/jbenet/go-ipfs/exchange/bitswap/testnet" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" datastore2 "github.com/jbenet/go-ipfs/util/datastore2" delay "github.com/jbenet/go-ipfs/util/delay" testutil "github.com/jbenet/go-ipfs/util/testutil" diff --git a/net/backpressure/backpressure_test.go b/net/backpressure/backpressure_test.go index 3c988dd55..968f1fc68 100644 --- a/net/backpressure/backpressure_test.go +++ b/net/backpressure/backpressure_test.go @@ -9,7 +9,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" netutil "github.com/jbenet/go-ipfs/net/swarmnet/util" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/conn/conn.go b/net/conn/conn.go index 7ee303dee..e6c82f1de 100644 --- a/net/conn/conn.go +++ b/net/conn/conn.go @@ -12,7 +12,7 @@ import ( manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" ic "github.com/jbenet/go-ipfs/crypto" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) diff --git a/net/conn/dial.go b/net/conn/dial.go index 8ffb441d3..1294f2241 100644 --- a/net/conn/dial.go +++ b/net/conn/dial.go @@ -8,7 +8,7 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" debugerror "github.com/jbenet/go-ipfs/util/debugerror" ) diff --git a/net/conn/interface.go b/net/conn/interface.go index d42a9a97a..68187e362 100644 --- a/net/conn/interface.go +++ b/net/conn/interface.go @@ -6,7 +6,7 @@ import ( "time" ic "github.com/jbenet/go-ipfs/crypto" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" diff --git a/net/conn/listen.go b/net/conn/listen.go index e8eddb997..cfced7ae2 100644 --- a/net/conn/listen.go +++ b/net/conn/listen.go @@ -10,7 +10,7 @@ import ( manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" ic "github.com/jbenet/go-ipfs/crypto" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // listener is an object that can accept connections. It implements Listener diff --git a/net/conn/secure_conn.go b/net/conn/secure_conn.go index dda1f5b55..970560ddd 100644 --- a/net/conn/secure_conn.go +++ b/net/conn/secure_conn.go @@ -10,7 +10,7 @@ import ( ic "github.com/jbenet/go-ipfs/crypto" secio "github.com/jbenet/go-ipfs/crypto/secio" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" errors "github.com/jbenet/go-ipfs/util/debugerror" ) diff --git a/net/interface.go b/net/interface.go index 5f16ec84e..29d703bb2 100644 --- a/net/interface.go +++ b/net/interface.go @@ -5,7 +5,7 @@ import ( conn "github.com/jbenet/go-ipfs/net/conn" // swarm "github.com/jbenet/go-ipfs/net/swarm2" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" diff --git a/net/mock/interface.go b/net/mock/interface.go index be6bd4bb2..48b777624 100644 --- a/net/mock/interface.go +++ b/net/mock/interface.go @@ -12,7 +12,7 @@ import ( ic "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ) diff --git a/net/mock/mock_conn.go b/net/mock/mock_conn.go index 89af0a4a4..5a52957eb 100644 --- a/net/mock/mock_conn.go +++ b/net/mock/mock_conn.go @@ -7,7 +7,7 @@ import ( ic "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" mux "github.com/jbenet/go-ipfs/net/services/mux" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ) diff --git a/net/mock/mock_link.go b/net/mock/mock_link.go index 38d99886c..0753d96d9 100644 --- a/net/mock/mock_link.go +++ b/net/mock/mock_link.go @@ -5,7 +5,7 @@ import ( "sync" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // link implements mocknet.Link diff --git a/net/mock/mock_net.go b/net/mock/mock_net.go index 2be03f836..27919ebb5 100644 --- a/net/mock/mock_net.go +++ b/net/mock/mock_net.go @@ -6,7 +6,7 @@ import ( ic "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" testutil "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/mock/mock_peernet.go b/net/mock/mock_peernet.go index 3e94919b7..b5055127d 100644 --- a/net/mock/mock_peernet.go +++ b/net/mock/mock_peernet.go @@ -10,7 +10,7 @@ import ( ids "github.com/jbenet/go-ipfs/net/services/identify" mux "github.com/jbenet/go-ipfs/net/services/mux" relay "github.com/jbenet/go-ipfs/net/services/relay" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" diff --git a/net/mock/mock_printer.go b/net/mock/mock_printer.go index 4adb7b544..df3cbf15d 100644 --- a/net/mock/mock_printer.go +++ b/net/mock/mock_printer.go @@ -5,7 +5,7 @@ import ( "io" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // separate object so our interfaces are separate :) diff --git a/net/mock/mock_test.go b/net/mock/mock_test.go index be10cabea..3ae01aade 100644 --- a/net/mock/mock_test.go +++ b/net/mock/mock_test.go @@ -8,7 +8,7 @@ import ( "testing" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" testutil "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/services/identify/id_test.go b/net/services/identify/id_test.go index 4d95407de..82f841de3 100644 --- a/net/services/identify/id_test.go +++ b/net/services/identify/id_test.go @@ -7,7 +7,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" handshake "github.com/jbenet/go-ipfs/net/handshake" netutil "github.com/jbenet/go-ipfs/net/swarmnet/util" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" diff --git a/net/services/relay/relay.go b/net/services/relay/relay.go index c23647832..21d1f434f 100644 --- a/net/services/relay/relay.go +++ b/net/services/relay/relay.go @@ -9,7 +9,7 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) diff --git a/net/swarm/simul_test.go b/net/swarm/simul_test.go index 4e2c3feaa..b61f3f03c 100644 --- a/net/swarm/simul_test.go +++ b/net/swarm/simul_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" diff --git a/net/swarm/swarm.go b/net/swarm/swarm.go index 25c27adbf..2aa5a2bf9 100644 --- a/net/swarm/swarm.go +++ b/net/swarm/swarm.go @@ -3,7 +3,7 @@ package swarm import ( - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/swarm/swarm_conn.go b/net/swarm/swarm_conn.go index 36be0bc50..50563d147 100644 --- a/net/swarm/swarm_conn.go +++ b/net/swarm/swarm_conn.go @@ -5,7 +5,7 @@ import ( ic "github.com/jbenet/go-ipfs/crypto" conn "github.com/jbenet/go-ipfs/net/conn" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" diff --git a/net/swarm/swarm_dial.go b/net/swarm/swarm_dial.go index 03e596e9e..67c94ac76 100644 --- a/net/swarm/swarm_dial.go +++ b/net/swarm/swarm_dial.go @@ -5,7 +5,7 @@ import ( "fmt" conn "github.com/jbenet/go-ipfs/net/conn" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/swarm/swarm_test.go b/net/swarm/swarm_test.go index b532566b8..510ee3619 100644 --- a/net/swarm/swarm_test.go +++ b/net/swarm/swarm_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" errors "github.com/jbenet/go-ipfs/util/debugerror" testutil "github.com/jbenet/go-ipfs/util/testutil" diff --git a/net/swarmnet/net.go b/net/swarmnet/net.go index cffe2c984..1766318ab 100644 --- a/net/swarmnet/net.go +++ b/net/swarmnet/net.go @@ -5,7 +5,7 @@ import ( "fmt" ic "github.com/jbenet/go-ipfs/crypto" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" inet "github.com/jbenet/go-ipfs/net" ids "github.com/jbenet/go-ipfs/net/services/identify" diff --git a/net/swarmnet/util/util.go b/net/swarmnet/util/util.go index a69e35499..2f0f1f146 100644 --- a/net/swarmnet/util/util.go +++ b/net/swarmnet/util/util.go @@ -5,7 +5,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" sn "github.com/jbenet/go-ipfs/net/swarmnet" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" tu "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/peer/metrics.go b/p2p/peer/metrics.go similarity index 100% rename from peer/metrics.go rename to p2p/peer/metrics.go diff --git a/peer/metrics_test.go b/p2p/peer/metrics_test.go similarity index 93% rename from peer/metrics_test.go rename to p2p/peer/metrics_test.go index 0301792c3..7b07cb139 100644 --- a/peer/metrics_test.go +++ b/p2p/peer/metrics_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" testutil "github.com/jbenet/go-ipfs/util/testutil" ) diff --git a/peer/peer.go b/p2p/peer/peer.go similarity index 100% rename from peer/peer.go rename to p2p/peer/peer.go diff --git a/peer/peer_test.go b/p2p/peer/peer_test.go similarity index 100% rename from peer/peer_test.go rename to p2p/peer/peer_test.go diff --git a/peer/peerstore.go b/p2p/peer/peerstore.go similarity index 100% rename from peer/peerstore.go rename to p2p/peer/peerstore.go diff --git a/peer/peerstore_test.go b/p2p/peer/peerstore_test.go similarity index 100% rename from peer/peerstore_test.go rename to p2p/peer/peerstore_test.go diff --git a/peer/queue/distance.go b/p2p/peer/queue/distance.go similarity index 97% rename from peer/queue/distance.go rename to p2p/peer/queue/distance.go index ebe876bb1..a0e376fab 100644 --- a/peer/queue/distance.go +++ b/p2p/peer/queue/distance.go @@ -5,7 +5,7 @@ import ( "math/big" "sync" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ks "github.com/jbenet/go-ipfs/routing/keyspace" u "github.com/jbenet/go-ipfs/util" ) diff --git a/peer/queue/interface.go b/p2p/peer/queue/interface.go similarity index 90% rename from peer/queue/interface.go rename to p2p/peer/queue/interface.go index c2106164e..b611422c4 100644 --- a/peer/queue/interface.go +++ b/p2p/peer/queue/interface.go @@ -1,6 +1,6 @@ package queue -import peer "github.com/jbenet/go-ipfs/peer" +import peer "github.com/jbenet/go-ipfs/p2p/peer" // PeerQueue maintains a set of peers ordered according to a metric. // Implementations of PeerQueue could order peers based on distances along diff --git a/peer/queue/queue_test.go b/p2p/peer/queue/queue_test.go similarity index 98% rename from peer/queue/queue_test.go rename to p2p/peer/queue/queue_test.go index d3e661400..957564fca 100644 --- a/peer/queue/queue_test.go +++ b/p2p/peer/queue/queue_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/peer/queue/sync.go b/p2p/peer/queue/sync.go similarity index 96% rename from peer/queue/sync.go rename to p2p/peer/queue/sync.go index 7a00eeb43..3f75cd0cf 100644 --- a/peer/queue/sync.go +++ b/p2p/peer/queue/sync.go @@ -3,7 +3,7 @@ package queue import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // ChanQueue makes any PeerQueue synchronizable through channels. diff --git a/routing/dht/dht.go b/routing/dht/dht.go index fb7c5a49b..ed9858c7a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -11,7 +11,7 @@ import ( "time" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index d247cf3af..3eea25d9e 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -5,7 +5,7 @@ import ( "time" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" ctxutil "github.com/jbenet/go-ipfs/util/ctx" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 088dff217..f4f2a5414 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -15,7 +15,7 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" swarmnet "github.com/jbenet/go-ipfs/net/swarmnet" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" testutil "github.com/jbenet/go-ipfs/util/testutil" diff --git a/routing/dht/diag.go b/routing/dht/diag.go index 96d2b1a01..79b4709e9 100644 --- a/routing/dht/diag.go +++ b/routing/dht/diag.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) type connDiagInfo struct { diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 8441c1f72..168a2d8ed 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -6,7 +6,7 @@ import ( inet "github.com/jbenet/go-ipfs/net" mocknet "github.com/jbenet/go-ipfs/net/mock" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index acb052248..a02eb024d 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -8,7 +8,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" ) diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 570c7cf18..87b0b1f4c 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -4,7 +4,7 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) diff --git a/routing/dht/providers.go b/routing/dht/providers.go index 861c25f0c..9e96eff36 100644 --- a/routing/dht/providers.go +++ b/routing/dht/providers.go @@ -4,7 +4,7 @@ import ( "time" ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/routing/dht/providers_test.go b/routing/dht/providers_test.go index 35ff92dfe..2781a3c59 100644 --- a/routing/dht/providers_test.go +++ b/routing/dht/providers_test.go @@ -3,7 +3,7 @@ package dht import ( "testing" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/routing/dht/query.go b/routing/dht/query.go index 4790e814c..95e3c3c90 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -4,8 +4,8 @@ import ( "sync" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" - queue "github.com/jbenet/go-ipfs/peer/queue" + peer "github.com/jbenet/go-ipfs/p2p/peer" + queue "github.com/jbenet/go-ipfs/p2p/peer/queue" "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" pset "github.com/jbenet/go-ipfs/util/peerset" diff --git a/routing/dht/records.go b/routing/dht/records.go index cf383916b..0d7e91c6f 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -10,7 +10,7 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ci "github.com/jbenet/go-ipfs/crypto" - "github.com/jbenet/go-ipfs/peer" + "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" ctxutil "github.com/jbenet/go-ipfs/util/ctx" diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 2a948f4be..ee71f7156 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -7,7 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" inet "github.com/jbenet/go-ipfs/net" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" diff --git a/routing/kbucket/bucket.go b/routing/kbucket/bucket.go index 2fa5586db..e158f70f9 100644 --- a/routing/kbucket/bucket.go +++ b/routing/kbucket/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // Bucket holds a list of peers. diff --git a/routing/kbucket/table.go b/routing/kbucket/table.go index 90ba65530..62bfa0646 100644 --- a/routing/kbucket/table.go +++ b/routing/kbucket/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/routing/kbucket/table_test.go b/routing/kbucket/table_test.go index db93ddf86..3e44cf66a 100644 --- a/routing/kbucket/table_test.go +++ b/routing/kbucket/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/jbenet/go-ipfs/util/testutil" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // Test basic features of the bucket struct diff --git a/routing/kbucket/util.go b/routing/kbucket/util.go index 2d06b5f08..80c08de9e 100644 --- a/routing/kbucket/util.go +++ b/routing/kbucket/util.go @@ -5,7 +5,7 @@ import ( "crypto/sha256" "errors" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ks "github.com/jbenet/go-ipfs/routing/keyspace" u "github.com/jbenet/go-ipfs/util" ) diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go index 6b5a455a7..2aeafe026 100644 --- a/routing/mock/centralized_client.go +++ b/routing/mock/centralized_client.go @@ -6,7 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" "github.com/jbenet/go-ipfs/util/testutil" diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go index 030227b1b..dc462797a 100644 --- a/routing/mock/centralized_server.go +++ b/routing/mock/centralized_server.go @@ -7,7 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" "github.com/jbenet/go-ipfs/util/testutil" ) diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go index dcaf165b1..526d63c68 100644 --- a/routing/mock/centralized_test.go +++ b/routing/mock/centralized_test.go @@ -5,7 +5,7 @@ import ( "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" delay "github.com/jbenet/go-ipfs/util/delay" "github.com/jbenet/go-ipfs/util/testutil" diff --git a/routing/mock/interface.go b/routing/mock/interface.go index 0bb54f365..d7dca8348 100644 --- a/routing/mock/interface.go +++ b/routing/mock/interface.go @@ -7,7 +7,7 @@ package mockrouting import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" delay "github.com/jbenet/go-ipfs/util/delay" diff --git a/routing/routing.go b/routing/routing.go index ae9acad44..1fbd79d25 100644 --- a/routing/routing.go +++ b/routing/routing.go @@ -6,7 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/util/peerset/peerset.go b/util/peerset/peerset.go index 35a80a12d..b45758ec3 100644 --- a/util/peerset/peerset.go +++ b/util/peerset/peerset.go @@ -1,7 +1,7 @@ package peerset import ( - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" "sync" ) diff --git a/util/testutil/gen.go b/util/testutil/gen.go index bcf1f283e..1f70cb39a 100644 --- a/util/testutil/gen.go +++ b/util/testutil/gen.go @@ -10,7 +10,7 @@ import ( "testing" ci "github.com/jbenet/go-ipfs/crypto" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" diff --git a/util/testutil/identity.go b/util/testutil/identity.go index 34a536859..b2f50d878 100644 --- a/util/testutil/identity.go +++ b/util/testutil/identity.go @@ -5,7 +5,7 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ci "github.com/jbenet/go-ipfs/crypto" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) type Identity interface { From cc0d7c9b579085d14f207ac6aed6e81d19f44707 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 05:45:55 -0800 Subject: [PATCH 09/21] crypto -> p2p/crypto The crypto package moves into p2p. Nothing in it so far is ipfs specific; everything is p2p-general. --- cmd/ipfs/init.go | 2 +- cmd/seccat/seccat.go | 4 ++-- config/config.go | 2 +- core/commands/id.go | 2 +- core/commands/publish.go | 2 +- core/core.go | 2 +- core/mock.go | 2 +- fuse/ipns/ipns_unix.go | 2 +- namesys/interface.go | 2 +- namesys/namesys.go | 2 +- namesys/publisher.go | 2 +- namesys/routing.go | 2 +- net/conn/conn.go | 2 +- net/conn/interface.go | 2 +- net/conn/listen.go | 2 +- net/conn/secure_conn.go | 4 ++-- net/conn/secure_conn_test.go | 2 +- net/mock/interface.go | 2 +- net/mock/mock_conn.go | 2 +- net/mock/mock_net.go | 2 +- net/mock/mock_peernet.go | 2 +- net/swarm/swarm_conn.go | 2 +- net/swarmnet/net.go | 2 +- {crypto => p2p/crypto}/internal/pb/Makefile | 0 {crypto => p2p/crypto}/internal/pb/crypto.pb.go | 0 {crypto => p2p/crypto}/internal/pb/crypto.proto | 0 {crypto => p2p/crypto}/key.go | 2 +- {crypto => p2p/crypto}/key_test.go | 2 +- {crypto => p2p/crypto}/rsa.go | 2 +- {crypto => p2p/crypto}/secio/al.go | 2 +- {crypto => p2p/crypto}/secio/interface.go | 2 +- {crypto => p2p/crypto}/secio/internal/pb/Makefile | 0 {crypto => p2p/crypto}/secio/internal/pb/spipe.pb.go | 0 {crypto => p2p/crypto}/secio/internal/pb/spipe.proto | 0 {crypto => p2p/crypto}/secio/io_test.go | 0 {crypto => p2p/crypto}/secio/pb/Makefile | 0 {crypto => p2p/crypto}/secio/pb/spipe.pb.go | 0 {crypto => p2p/crypto}/secio/pb/spipe.proto | 0 {crypto => p2p/crypto}/secio/protocol.go | 4 ++-- {crypto => p2p/crypto}/secio/rw.go | 0 p2p/peer/peer.go | 2 +- p2p/peer/peer_test.go | 4 ++-- p2p/peer/peerstore.go | 2 +- routing/dht/records.go | 2 +- routing/kbucket/sorting.go | 2 +- util/testutil/gen.go | 2 +- util/testutil/identity.go | 2 +- 47 files changed, 40 insertions(+), 40 deletions(-) rename {crypto => p2p/crypto}/internal/pb/Makefile (100%) rename {crypto => p2p/crypto}/internal/pb/crypto.pb.go (100%) rename {crypto => p2p/crypto}/internal/pb/crypto.proto (100%) rename {crypto => p2p/crypto}/key.go (99%) rename {crypto => p2p/crypto}/key_test.go (97%) rename {crypto => p2p/crypto}/rsa.go (97%) rename {crypto => p2p/crypto}/secio/al.go (98%) rename {crypto => p2p/crypto}/secio/interface.go (98%) rename {crypto => p2p/crypto}/secio/internal/pb/Makefile (100%) rename {crypto => p2p/crypto}/secio/internal/pb/spipe.pb.go (100%) rename {crypto => p2p/crypto}/secio/internal/pb/spipe.proto (100%) rename {crypto => p2p/crypto}/secio/io_test.go (100%) rename {crypto => p2p/crypto}/secio/pb/Makefile (100%) rename {crypto => p2p/crypto}/secio/pb/spipe.pb.go (100%) rename {crypto => p2p/crypto}/secio/pb/spipe.proto (100%) rename {crypto => p2p/crypto}/secio/protocol.go (98%) rename {crypto => p2p/crypto}/secio/rw.go (100%) diff --git a/cmd/ipfs/init.go b/cmd/ipfs/init.go index 89080a5d8..5d2c3e773 100644 --- a/cmd/ipfs/init.go +++ b/cmd/ipfs/init.go @@ -12,9 +12,9 @@ import ( cmds "github.com/jbenet/go-ipfs/commands" config "github.com/jbenet/go-ipfs/config" core "github.com/jbenet/go-ipfs/core" - ci "github.com/jbenet/go-ipfs/crypto" imp "github.com/jbenet/go-ipfs/importer" chunk "github.com/jbenet/go-ipfs/importer/chunk" + ci "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" repo "github.com/jbenet/go-ipfs/repo" u "github.com/jbenet/go-ipfs/util" diff --git a/cmd/seccat/seccat.go b/cmd/seccat/seccat.go index b70d977e5..62fd1d024 100644 --- a/cmd/seccat/seccat.go +++ b/cmd/seccat/seccat.go @@ -18,8 +18,8 @@ import ( "os/signal" "syscall" - ci "github.com/jbenet/go-ipfs/crypto" - secio "github.com/jbenet/go-ipfs/crypto/secio" + ci "github.com/jbenet/go-ipfs/p2p/crypto" + secio "github.com/jbenet/go-ipfs/p2p/crypto/secio" peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/config/config.go b/config/config.go index d165f9886..ed8e66b21 100644 --- a/config/config.go +++ b/config/config.go @@ -6,7 +6,7 @@ import ( "os" "path/filepath" - ic "github.com/jbenet/go-ipfs/crypto" + ic "github.com/jbenet/go-ipfs/p2p/crypto" u "github.com/jbenet/go-ipfs/util" "github.com/jbenet/go-ipfs/util/debugerror" ) diff --git a/core/commands/id.go b/core/commands/id.go index 60a4e7308..c71b0cddb 100644 --- a/core/commands/id.go +++ b/core/commands/id.go @@ -11,7 +11,7 @@ import ( b58 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-base58" cmds "github.com/jbenet/go-ipfs/commands" - ic "github.com/jbenet/go-ipfs/crypto" + ic "github.com/jbenet/go-ipfs/p2p/crypto" "github.com/jbenet/go-ipfs/p2p/peer" kb "github.com/jbenet/go-ipfs/routing/kbucket" u "github.com/jbenet/go-ipfs/util" diff --git a/core/commands/publish.go b/core/commands/publish.go index 97455b9c7..5501ea752 100644 --- a/core/commands/publish.go +++ b/core/commands/publish.go @@ -6,8 +6,8 @@ import ( cmds "github.com/jbenet/go-ipfs/commands" core "github.com/jbenet/go-ipfs/core" - crypto "github.com/jbenet/go-ipfs/crypto" nsys "github.com/jbenet/go-ipfs/namesys" + crypto "github.com/jbenet/go-ipfs/p2p/crypto" u "github.com/jbenet/go-ipfs/util" ) diff --git a/core/core.go b/core/core.go index f707af311..49140b4de 100644 --- a/core/core.go +++ b/core/core.go @@ -11,7 +11,6 @@ import ( bstore "github.com/jbenet/go-ipfs/blocks/blockstore" bserv "github.com/jbenet/go-ipfs/blockservice" config "github.com/jbenet/go-ipfs/config" - ic "github.com/jbenet/go-ipfs/crypto" diag "github.com/jbenet/go-ipfs/diagnostics" exchange "github.com/jbenet/go-ipfs/exchange" bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" @@ -22,6 +21,7 @@ import ( namesys "github.com/jbenet/go-ipfs/namesys" inet "github.com/jbenet/go-ipfs/net" swarmnet "github.com/jbenet/go-ipfs/net/swarmnet" + ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" pin "github.com/jbenet/go-ipfs/pin" diff --git a/core/mock.go b/core/mock.go index a3d85fedb..069ea157a 100644 --- a/core/mock.go +++ b/core/mock.go @@ -7,11 +7,11 @@ import ( syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "github.com/jbenet/go-ipfs/blocks/blockstore" blockservice "github.com/jbenet/go-ipfs/blockservice" - ci "github.com/jbenet/go-ipfs/crypto" "github.com/jbenet/go-ipfs/exchange/offline" mdag "github.com/jbenet/go-ipfs/merkledag" nsys "github.com/jbenet/go-ipfs/namesys" "github.com/jbenet/go-ipfs/net/mock" + ci "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" dht "github.com/jbenet/go-ipfs/routing/dht" diff --git a/fuse/ipns/ipns_unix.go b/fuse/ipns/ipns_unix.go index 7eabe74c3..3172dd57e 100644 --- a/fuse/ipns/ipns_unix.go +++ b/fuse/ipns/ipns_unix.go @@ -14,9 +14,9 @@ import ( proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" core "github.com/jbenet/go-ipfs/core" - ci "github.com/jbenet/go-ipfs/crypto" chunk "github.com/jbenet/go-ipfs/importer/chunk" mdag "github.com/jbenet/go-ipfs/merkledag" + ci "github.com/jbenet/go-ipfs/p2p/crypto" ft "github.com/jbenet/go-ipfs/unixfs" uio "github.com/jbenet/go-ipfs/unixfs/io" ftpb "github.com/jbenet/go-ipfs/unixfs/pb" diff --git a/namesys/interface.go b/namesys/interface.go index eef1fc32b..c2e39afec 100644 --- a/namesys/interface.go +++ b/namesys/interface.go @@ -3,7 +3,7 @@ package namesys import ( "errors" - ci "github.com/jbenet/go-ipfs/crypto" + ci "github.com/jbenet/go-ipfs/p2p/crypto" ) // ErrResolveFailed signals an error when attempting to resolve. diff --git a/namesys/namesys.go b/namesys/namesys.go index 2ea9a30bd..cc11d9ddc 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -1,7 +1,7 @@ package namesys import ( - ci "github.com/jbenet/go-ipfs/crypto" + ci "github.com/jbenet/go-ipfs/p2p/crypto" routing "github.com/jbenet/go-ipfs/routing" ) diff --git a/namesys/publisher.go b/namesys/publisher.go index be838b2f0..75cccf9e4 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -10,8 +10,8 @@ import ( proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - ci "github.com/jbenet/go-ipfs/crypto" pb "github.com/jbenet/go-ipfs/namesys/internal/pb" + ci "github.com/jbenet/go-ipfs/p2p/crypto" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" ) diff --git a/namesys/routing.go b/namesys/routing.go index c990b492b..709f9424c 100644 --- a/namesys/routing.go +++ b/namesys/routing.go @@ -7,8 +7,8 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - ci "github.com/jbenet/go-ipfs/crypto" pb "github.com/jbenet/go-ipfs/namesys/internal/pb" + ci "github.com/jbenet/go-ipfs/p2p/crypto" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" ) diff --git a/net/conn/conn.go b/net/conn/conn.go index e6c82f1de..822d6bbb7 100644 --- a/net/conn/conn.go +++ b/net/conn/conn.go @@ -11,7 +11,7 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" - ic "github.com/jbenet/go-ipfs/crypto" + ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" eventlog "github.com/jbenet/go-ipfs/util/eventlog" diff --git a/net/conn/interface.go b/net/conn/interface.go index 68187e362..1601da1aa 100644 --- a/net/conn/interface.go +++ b/net/conn/interface.go @@ -5,7 +5,7 @@ import ( "net" "time" - ic "github.com/jbenet/go-ipfs/crypto" + ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" diff --git a/net/conn/listen.go b/net/conn/listen.go index cfced7ae2..dd6af24ba 100644 --- a/net/conn/listen.go +++ b/net/conn/listen.go @@ -9,7 +9,7 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" - ic "github.com/jbenet/go-ipfs/crypto" + ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" ) diff --git a/net/conn/secure_conn.go b/net/conn/secure_conn.go index 970560ddd..6d8cca6d5 100644 --- a/net/conn/secure_conn.go +++ b/net/conn/secure_conn.go @@ -8,8 +8,8 @@ import ( msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - ic "github.com/jbenet/go-ipfs/crypto" - secio "github.com/jbenet/go-ipfs/crypto/secio" + ic "github.com/jbenet/go-ipfs/p2p/crypto" + secio "github.com/jbenet/go-ipfs/p2p/crypto/secio" peer "github.com/jbenet/go-ipfs/p2p/peer" errors "github.com/jbenet/go-ipfs/util/debugerror" ) diff --git a/net/conn/secure_conn_test.go b/net/conn/secure_conn_test.go index 7b400da06..7e364d12b 100644 --- a/net/conn/secure_conn_test.go +++ b/net/conn/secure_conn_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - ic "github.com/jbenet/go-ipfs/crypto" + ic "github.com/jbenet/go-ipfs/p2p/crypto" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ) diff --git a/net/mock/interface.go b/net/mock/interface.go index 48b777624..658ac8c65 100644 --- a/net/mock/interface.go +++ b/net/mock/interface.go @@ -10,8 +10,8 @@ import ( "io" "time" - ic "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" + ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" diff --git a/net/mock/mock_conn.go b/net/mock/mock_conn.go index 5a52957eb..549d9e444 100644 --- a/net/mock/mock_conn.go +++ b/net/mock/mock_conn.go @@ -4,9 +4,9 @@ import ( "container/list" "sync" - ic "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" mux "github.com/jbenet/go-ipfs/net/services/mux" + ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" diff --git a/net/mock/mock_net.go b/net/mock/mock_net.go index 27919ebb5..3c8a59634 100644 --- a/net/mock/mock_net.go +++ b/net/mock/mock_net.go @@ -4,8 +4,8 @@ import ( "fmt" "sync" - ic "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" + ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" testutil "github.com/jbenet/go-ipfs/util/testutil" diff --git a/net/mock/mock_peernet.go b/net/mock/mock_peernet.go index b5055127d..13745d143 100644 --- a/net/mock/mock_peernet.go +++ b/net/mock/mock_peernet.go @@ -5,11 +5,11 @@ import ( "math/rand" "sync" - ic "github.com/jbenet/go-ipfs/crypto" inet "github.com/jbenet/go-ipfs/net" ids "github.com/jbenet/go-ipfs/net/services/identify" mux "github.com/jbenet/go-ipfs/net/services/mux" relay "github.com/jbenet/go-ipfs/net/services/relay" + ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/swarm/swarm_conn.go b/net/swarm/swarm_conn.go index 50563d147..3ce6acdd3 100644 --- a/net/swarm/swarm_conn.go +++ b/net/swarm/swarm_conn.go @@ -3,8 +3,8 @@ package swarm import ( "fmt" - ic "github.com/jbenet/go-ipfs/crypto" conn "github.com/jbenet/go-ipfs/net/conn" + ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/swarmnet/net.go b/net/swarmnet/net.go index 1766318ab..73190dad3 100644 --- a/net/swarmnet/net.go +++ b/net/swarmnet/net.go @@ -4,7 +4,7 @@ package net import ( "fmt" - ic "github.com/jbenet/go-ipfs/crypto" + ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" inet "github.com/jbenet/go-ipfs/net" diff --git a/crypto/internal/pb/Makefile b/p2p/crypto/internal/pb/Makefile similarity index 100% rename from crypto/internal/pb/Makefile rename to p2p/crypto/internal/pb/Makefile diff --git a/crypto/internal/pb/crypto.pb.go b/p2p/crypto/internal/pb/crypto.pb.go similarity index 100% rename from crypto/internal/pb/crypto.pb.go rename to p2p/crypto/internal/pb/crypto.pb.go diff --git a/crypto/internal/pb/crypto.proto b/p2p/crypto/internal/pb/crypto.proto similarity index 100% rename from crypto/internal/pb/crypto.proto rename to p2p/crypto/internal/pb/crypto.proto diff --git a/crypto/key.go b/p2p/crypto/key.go similarity index 99% rename from crypto/key.go rename to p2p/crypto/key.go index df9a8b512..78c50dce1 100644 --- a/crypto/key.go +++ b/p2p/crypto/key.go @@ -21,7 +21,7 @@ import ( proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - pb "github.com/jbenet/go-ipfs/crypto/internal/pb" + pb "github.com/jbenet/go-ipfs/p2p/crypto/internal/pb" u "github.com/jbenet/go-ipfs/util" ) diff --git a/crypto/key_test.go b/p2p/crypto/key_test.go similarity index 97% rename from crypto/key_test.go rename to p2p/crypto/key_test.go index 16b13a2f8..fa2ad7799 100644 --- a/crypto/key_test.go +++ b/p2p/crypto/key_test.go @@ -1,7 +1,7 @@ package crypto_test import ( - . "github.com/jbenet/go-ipfs/crypto" + . "github.com/jbenet/go-ipfs/p2p/crypto" "bytes" tu "github.com/jbenet/go-ipfs/util/testutil" diff --git a/crypto/rsa.go b/p2p/crypto/rsa.go similarity index 97% rename from crypto/rsa.go rename to p2p/crypto/rsa.go index 9f939807d..b308f6856 100644 --- a/crypto/rsa.go +++ b/p2p/crypto/rsa.go @@ -10,7 +10,7 @@ import ( proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - pb "github.com/jbenet/go-ipfs/crypto/internal/pb" + pb "github.com/jbenet/go-ipfs/p2p/crypto/internal/pb" ) type RsaPrivateKey struct { diff --git a/crypto/secio/al.go b/p2p/crypto/secio/al.go similarity index 98% rename from crypto/secio/al.go rename to p2p/crypto/secio/al.go index e9db3ad60..2ca7d2619 100644 --- a/crypto/secio/al.go +++ b/p2p/crypto/secio/al.go @@ -15,7 +15,7 @@ import ( bfish "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.crypto/blowfish" - ci "github.com/jbenet/go-ipfs/crypto" + ci "github.com/jbenet/go-ipfs/p2p/crypto" ) // List of supported ECDH curves diff --git a/crypto/secio/interface.go b/p2p/crypto/secio/interface.go similarity index 98% rename from crypto/secio/interface.go rename to p2p/crypto/secio/interface.go index 62e3c45ee..934a5fad8 100644 --- a/crypto/secio/interface.go +++ b/p2p/crypto/secio/interface.go @@ -4,7 +4,7 @@ package secio import ( "io" - ci "github.com/jbenet/go-ipfs/crypto" + ci "github.com/jbenet/go-ipfs/p2p/crypto" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" diff --git a/crypto/secio/internal/pb/Makefile b/p2p/crypto/secio/internal/pb/Makefile similarity index 100% rename from crypto/secio/internal/pb/Makefile rename to p2p/crypto/secio/internal/pb/Makefile diff --git a/crypto/secio/internal/pb/spipe.pb.go b/p2p/crypto/secio/internal/pb/spipe.pb.go similarity index 100% rename from crypto/secio/internal/pb/spipe.pb.go rename to p2p/crypto/secio/internal/pb/spipe.pb.go diff --git a/crypto/secio/internal/pb/spipe.proto b/p2p/crypto/secio/internal/pb/spipe.proto similarity index 100% rename from crypto/secio/internal/pb/spipe.proto rename to p2p/crypto/secio/internal/pb/spipe.proto diff --git a/crypto/secio/io_test.go b/p2p/crypto/secio/io_test.go similarity index 100% rename from crypto/secio/io_test.go rename to p2p/crypto/secio/io_test.go diff --git a/crypto/secio/pb/Makefile b/p2p/crypto/secio/pb/Makefile similarity index 100% rename from crypto/secio/pb/Makefile rename to p2p/crypto/secio/pb/Makefile diff --git a/crypto/secio/pb/spipe.pb.go b/p2p/crypto/secio/pb/spipe.pb.go similarity index 100% rename from crypto/secio/pb/spipe.pb.go rename to p2p/crypto/secio/pb/spipe.pb.go diff --git a/crypto/secio/pb/spipe.proto b/p2p/crypto/secio/pb/spipe.proto similarity index 100% rename from crypto/secio/pb/spipe.proto rename to p2p/crypto/secio/pb/spipe.proto diff --git a/crypto/secio/protocol.go b/p2p/crypto/secio/protocol.go similarity index 98% rename from crypto/secio/protocol.go rename to p2p/crypto/secio/protocol.go index 609320b3d..503c09149 100644 --- a/crypto/secio/protocol.go +++ b/p2p/crypto/secio/protocol.go @@ -10,8 +10,8 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" - ci "github.com/jbenet/go-ipfs/crypto" - pb "github.com/jbenet/go-ipfs/crypto/secio/internal/pb" + ci "github.com/jbenet/go-ipfs/p2p/crypto" + pb "github.com/jbenet/go-ipfs/p2p/crypto/secio/internal/pb" peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" eventlog "github.com/jbenet/go-ipfs/util/eventlog" diff --git a/crypto/secio/rw.go b/p2p/crypto/secio/rw.go similarity index 100% rename from crypto/secio/rw.go rename to p2p/crypto/secio/rw.go diff --git a/p2p/peer/peer.go b/p2p/peer/peer.go index 9d57f9811..fa4e448d6 100644 --- a/p2p/peer/peer.go +++ b/p2p/peer/peer.go @@ -9,7 +9,7 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - ic "github.com/jbenet/go-ipfs/crypto" + ic "github.com/jbenet/go-ipfs/p2p/crypto" u "github.com/jbenet/go-ipfs/util" ) diff --git a/p2p/peer/peer_test.go b/p2p/peer/peer_test.go index e8d1d29f3..b19d0faef 100644 --- a/p2p/peer/peer_test.go +++ b/p2p/peer/peer_test.go @@ -6,8 +6,8 @@ import ( "strings" "testing" - ic "github.com/jbenet/go-ipfs/crypto" - . "github.com/jbenet/go-ipfs/peer" + ic "github.com/jbenet/go-ipfs/p2p/crypto" + . "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" tu "github.com/jbenet/go-ipfs/util/testutil" diff --git a/p2p/peer/peerstore.go b/p2p/peer/peerstore.go index 46de50f0d..1a75a6843 100644 --- a/p2p/peer/peerstore.go +++ b/p2p/peer/peerstore.go @@ -4,7 +4,7 @@ import ( "errors" "sync" - ic "github.com/jbenet/go-ipfs/crypto" + ic "github.com/jbenet/go-ipfs/p2p/crypto" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" diff --git a/routing/dht/records.go b/routing/dht/records.go index 0d7e91c6f..0791f80a3 100644 --- a/routing/dht/records.go +++ b/routing/dht/records.go @@ -9,7 +9,7 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - ci "github.com/jbenet/go-ipfs/crypto" + ci "github.com/jbenet/go-ipfs/p2p/crypto" "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" u "github.com/jbenet/go-ipfs/util" diff --git a/routing/kbucket/sorting.go b/routing/kbucket/sorting.go index a3a68767b..7995b39ed 100644 --- a/routing/kbucket/sorting.go +++ b/routing/kbucket/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" "sort" ) diff --git a/util/testutil/gen.go b/util/testutil/gen.go index 1f70cb39a..ddd76523e 100644 --- a/util/testutil/gen.go +++ b/util/testutil/gen.go @@ -9,7 +9,7 @@ import ( "sync" "testing" - ci "github.com/jbenet/go-ipfs/crypto" + ci "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" diff --git a/util/testutil/identity.go b/util/testutil/identity.go index b2f50d878..f1ab232cf 100644 --- a/util/testutil/identity.go +++ b/util/testutil/identity.go @@ -4,7 +4,7 @@ import ( "testing" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - ci "github.com/jbenet/go-ipfs/crypto" + ci "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" ) From e2698a87336660cc52f7abcddc2130095306e3c0 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 05:48:21 -0800 Subject: [PATCH 10/21] net -> p2p/net The net package is the next to move. It will be massaged a bit still to fix the Network / "NetworkBackend" conflict. --- core/bootstrap.go | 2 +- core/core.go | 4 ++-- core/mock.go | 2 +- diagnostics/diag.go | 2 +- epictest/addcat_test.go | 2 +- epictest/core.go | 2 +- epictest/three_legged_cat_test.go | 2 +- exchange/bitswap/message/message.go | 2 +- exchange/bitswap/network/ipfs_impl.go | 2 +- exchange/bitswap/testnet/peernet.go | 2 +- {net => p2p/net}/README.md | 0 {net => p2p/net}/backpressure/backpressure.go | 0 {net => p2p/net}/backpressure/backpressure_test.go | 4 ++-- {net => p2p/net}/conn/conn.go | 0 {net => p2p/net}/conn/conn_test.go | 0 {net => p2p/net}/conn/dial.go | 0 {net => p2p/net}/conn/dial_test.go | 0 {net => p2p/net}/conn/handshake.go | 4 ++-- {net => p2p/net}/conn/interface.go | 0 {net => p2p/net}/conn/listen.go | 0 {net => p2p/net}/conn/secure_conn.go | 0 {net => p2p/net}/conn/secure_conn_test.go | 0 {net => p2p/net}/handshake/README.md | 0 {net => p2p/net}/handshake/doc.go | 0 {net => p2p/net}/handshake/handshake1.go | 2 +- {net => p2p/net}/handshake/handshake1_test.go | 0 {net => p2p/net}/handshake/pb/Makefile | 0 {net => p2p/net}/handshake/pb/handshake.pb.go | 0 {net => p2p/net}/handshake/pb/handshake.proto | 0 {net => p2p/net}/interface.go | 4 ++-- {net => p2p/net}/mock/interface.go | 2 +- {net => p2p/net}/mock/mock.go | 0 {net => p2p/net}/mock/mock_conn.go | 4 ++-- {net => p2p/net}/mock/mock_link.go | 2 +- {net => p2p/net}/mock/mock_net.go | 2 +- {net => p2p/net}/mock/mock_peernet.go | 8 ++++---- {net => p2p/net}/mock/mock_printer.go | 2 +- {net => p2p/net}/mock/mock_stream.go | 2 +- {net => p2p/net}/mock/mock_test.go | 2 +- {net => p2p/net}/services/identify/id.go | 6 +++--- {net => p2p/net}/services/identify/id_test.go | 6 +++--- {net => p2p/net}/services/mux/mux.go | 2 +- {net => p2p/net}/services/mux/mux_test.go | 2 +- {net => p2p/net}/services/relay/relay.go | 2 +- {net => p2p/net}/services/relay/relay_test.go | 8 ++++---- {net => p2p/net}/swarm/addr.go | 2 +- {net => p2p/net}/swarm/simul_test.go | 0 {net => p2p/net}/swarm/swarm.go | 0 {net => p2p/net}/swarm/swarm_conn.go | 2 +- {net => p2p/net}/swarm/swarm_dial.go | 2 +- {net => p2p/net}/swarm/swarm_listen.go | 2 +- {net => p2p/net}/swarm/swarm_stream.go | 0 {net => p2p/net}/swarm/swarm_test.go | 0 {net => p2p/net}/swarmnet/net.go | 10 +++++----- {net => p2p/net}/swarmnet/net_test.go | 4 ++-- {net => p2p/net}/swarmnet/util/util.go | 4 ++-- routing/dht/dht.go | 2 +- routing/dht/dht_net.go | 2 +- routing/dht/dht_test.go | 2 +- routing/dht/ext_test.go | 4 ++-- routing/dht/pb/message.go | 2 +- routing/dht/query.go | 2 +- routing/dht/routing.go | 2 +- routing/mock/dht.go | 2 +- 64 files changed, 65 insertions(+), 65 deletions(-) rename {net => p2p/net}/README.md (100%) rename {net => p2p/net}/backpressure/backpressure.go (100%) rename {net => p2p/net}/backpressure/backpressure_test.go (98%) rename {net => p2p/net}/conn/conn.go (100%) rename {net => p2p/net}/conn/conn_test.go (100%) rename {net => p2p/net}/conn/dial.go (100%) rename {net => p2p/net}/conn/dial_test.go (100%) rename {net => p2p/net}/conn/handshake.go (92%) rename {net => p2p/net}/conn/interface.go (100%) rename {net => p2p/net}/conn/listen.go (100%) rename {net => p2p/net}/conn/secure_conn.go (100%) rename {net => p2p/net}/conn/secure_conn_test.go (100%) rename {net => p2p/net}/handshake/README.md (100%) rename {net => p2p/net}/handshake/doc.go (100%) rename {net => p2p/net}/handshake/handshake1.go (96%) rename {net => p2p/net}/handshake/handshake1_test.go (100%) rename {net => p2p/net}/handshake/pb/Makefile (100%) rename {net => p2p/net}/handshake/pb/handshake.pb.go (100%) rename {net => p2p/net}/handshake/pb/handshake.proto (100%) rename {net => p2p/net}/interface.go (98%) rename {net => p2p/net}/mock/interface.go (98%) rename {net => p2p/net}/mock/mock.go (100%) rename {net => p2p/net}/mock/mock_conn.go (96%) rename {net => p2p/net}/mock/mock_link.go (97%) rename {net => p2p/net}/mock/mock_net.go (99%) rename {net => p2p/net}/mock/mock_peernet.go (97%) rename {net => p2p/net}/mock/mock_printer.go (94%) rename {net => p2p/net}/mock/mock_stream.go (89%) rename {net => p2p/net}/mock/mock_test.go (99%) rename {net => p2p/net}/services/identify/id.go (97%) rename {net => p2p/net}/services/identify/id_test.go (95%) rename {net => p2p/net}/services/mux/mux.go (99%) rename {net => p2p/net}/services/mux/mux_test.go (96%) rename {net => p2p/net}/services/relay/relay.go (98%) rename {net => p2p/net}/services/relay/relay_test.go (97%) rename {net => p2p/net}/swarm/addr.go (98%) rename {net => p2p/net}/swarm/simul_test.go (100%) rename {net => p2p/net}/swarm/swarm.go (100%) rename {net => p2p/net}/swarm/swarm_conn.go (98%) rename {net => p2p/net}/swarm/swarm_dial.go (98%) rename {net => p2p/net}/swarm/swarm_listen.go (98%) rename {net => p2p/net}/swarm/swarm_stream.go (100%) rename {net => p2p/net}/swarm/swarm_test.go (100%) rename {net => p2p/net}/swarmnet/net.go (96%) rename {net => p2p/net}/swarmnet/net_test.go (95%) rename {net => p2p/net}/swarmnet/util/util.go (88%) diff --git a/core/bootstrap.go b/core/bootstrap.go index fa46dcf4f..8faeaecaf 100644 --- a/core/bootstrap.go +++ b/core/bootstrap.go @@ -8,7 +8,7 @@ import ( "time" config "github.com/jbenet/go-ipfs/config" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" dht "github.com/jbenet/go-ipfs/routing/dht" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" diff --git a/core/core.go b/core/core.go index 49140b4de..ec7d20fd1 100644 --- a/core/core.go +++ b/core/core.go @@ -19,9 +19,9 @@ import ( mount "github.com/jbenet/go-ipfs/fuse/mount" merkledag "github.com/jbenet/go-ipfs/merkledag" namesys "github.com/jbenet/go-ipfs/namesys" - inet "github.com/jbenet/go-ipfs/net" - swarmnet "github.com/jbenet/go-ipfs/net/swarmnet" ic "github.com/jbenet/go-ipfs/p2p/crypto" + inet "github.com/jbenet/go-ipfs/p2p/net" + swarmnet "github.com/jbenet/go-ipfs/p2p/net/swarmnet" peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" pin "github.com/jbenet/go-ipfs/pin" diff --git a/core/mock.go b/core/mock.go index 069ea157a..aba5e4b53 100644 --- a/core/mock.go +++ b/core/mock.go @@ -10,8 +10,8 @@ import ( "github.com/jbenet/go-ipfs/exchange/offline" mdag "github.com/jbenet/go-ipfs/merkledag" nsys "github.com/jbenet/go-ipfs/namesys" - "github.com/jbenet/go-ipfs/net/mock" ci "github.com/jbenet/go-ipfs/p2p/crypto" + "github.com/jbenet/go-ipfs/p2p/net/mock" peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" dht "github.com/jbenet/go-ipfs/routing/dht" diff --git a/diagnostics/diag.go b/diagnostics/diag.go index 3bb0b92f0..de24ab6f5 100644 --- a/diagnostics/diag.go +++ b/diagnostics/diag.go @@ -18,7 +18,7 @@ import ( "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" pb "github.com/jbenet/go-ipfs/diagnostics/internal/pb" - net "github.com/jbenet/go-ipfs/net" + net "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" util "github.com/jbenet/go-ipfs/util" ) diff --git a/epictest/addcat_test.go b/epictest/addcat_test.go index c9ccb931a..19f5023e3 100644 --- a/epictest/addcat_test.go +++ b/epictest/addcat_test.go @@ -11,7 +11,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" random "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-random" - mocknet "github.com/jbenet/go-ipfs/net/mock" + mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" errors "github.com/jbenet/go-ipfs/util/debugerror" ) diff --git a/epictest/core.go b/epictest/core.go index 5937e4889..a46b2e616 100644 --- a/epictest/core.go +++ b/epictest/core.go @@ -15,7 +15,7 @@ import ( importer "github.com/jbenet/go-ipfs/importer" chunk "github.com/jbenet/go-ipfs/importer/chunk" merkledag "github.com/jbenet/go-ipfs/merkledag" - net "github.com/jbenet/go-ipfs/net" + net "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" dht "github.com/jbenet/go-ipfs/routing/dht" diff --git a/epictest/three_legged_cat_test.go b/epictest/three_legged_cat_test.go index d66578305..f41b850ca 100644 --- a/epictest/three_legged_cat_test.go +++ b/epictest/three_legged_cat_test.go @@ -7,7 +7,7 @@ import ( "testing" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - mocknet "github.com/jbenet/go-ipfs/net/mock" + mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" errors "github.com/jbenet/go-ipfs/util/debugerror" ) diff --git a/exchange/bitswap/message/message.go b/exchange/bitswap/message/message.go index 7f7f1d08e..117758d9e 100644 --- a/exchange/bitswap/message/message.go +++ b/exchange/bitswap/message/message.go @@ -6,7 +6,7 @@ import ( blocks "github.com/jbenet/go-ipfs/blocks" pb "github.com/jbenet/go-ipfs/exchange/bitswap/message/internal/pb" wantlist "github.com/jbenet/go-ipfs/exchange/bitswap/wantlist" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" u "github.com/jbenet/go-ipfs/util" ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" diff --git a/exchange/bitswap/network/ipfs_impl.go b/exchange/bitswap/network/ipfs_impl.go index 73114642f..7c975acf2 100644 --- a/exchange/bitswap/network/ipfs_impl.go +++ b/exchange/bitswap/network/ipfs_impl.go @@ -3,7 +3,7 @@ package network import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" bsmsg "github.com/jbenet/go-ipfs/exchange/bitswap/message" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" util "github.com/jbenet/go-ipfs/util" diff --git a/exchange/bitswap/testnet/peernet.go b/exchange/bitswap/testnet/peernet.go index e16242ce0..7caa64efd 100644 --- a/exchange/bitswap/testnet/peernet.go +++ b/exchange/bitswap/testnet/peernet.go @@ -4,7 +4,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" bsnet "github.com/jbenet/go-ipfs/exchange/bitswap/network" - mockpeernet "github.com/jbenet/go-ipfs/net/mock" + mockpeernet "github.com/jbenet/go-ipfs/p2p/net/mock" peer "github.com/jbenet/go-ipfs/p2p/peer" mockrouting "github.com/jbenet/go-ipfs/routing/mock" testutil "github.com/jbenet/go-ipfs/util/testutil" diff --git a/net/README.md b/p2p/net/README.md similarity index 100% rename from net/README.md rename to p2p/net/README.md diff --git a/net/backpressure/backpressure.go b/p2p/net/backpressure/backpressure.go similarity index 100% rename from net/backpressure/backpressure.go rename to p2p/net/backpressure/backpressure.go diff --git a/net/backpressure/backpressure_test.go b/p2p/net/backpressure/backpressure_test.go similarity index 98% rename from net/backpressure/backpressure_test.go rename to p2p/net/backpressure/backpressure_test.go index 968f1fc68..510f92844 100644 --- a/net/backpressure/backpressure_test.go +++ b/p2p/net/backpressure/backpressure_test.go @@ -7,8 +7,8 @@ import ( "testing" "time" - inet "github.com/jbenet/go-ipfs/net" - netutil "github.com/jbenet/go-ipfs/net/swarmnet/util" + inet "github.com/jbenet/go-ipfs/p2p/net" + netutil "github.com/jbenet/go-ipfs/p2p/net/swarmnet/util" peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" diff --git a/net/conn/conn.go b/p2p/net/conn/conn.go similarity index 100% rename from net/conn/conn.go rename to p2p/net/conn/conn.go diff --git a/net/conn/conn_test.go b/p2p/net/conn/conn_test.go similarity index 100% rename from net/conn/conn_test.go rename to p2p/net/conn/conn_test.go diff --git a/net/conn/dial.go b/p2p/net/conn/dial.go similarity index 100% rename from net/conn/dial.go rename to p2p/net/conn/dial.go diff --git a/net/conn/dial_test.go b/p2p/net/conn/dial_test.go similarity index 100% rename from net/conn/dial_test.go rename to p2p/net/conn/dial_test.go diff --git a/net/conn/handshake.go b/p2p/net/conn/handshake.go similarity index 92% rename from net/conn/handshake.go rename to p2p/net/conn/handshake.go index 3a995bc9a..16f45d24c 100644 --- a/net/conn/handshake.go +++ b/p2p/net/conn/handshake.go @@ -3,8 +3,8 @@ package conn import ( "fmt" - handshake "github.com/jbenet/go-ipfs/net/handshake" - hspb "github.com/jbenet/go-ipfs/net/handshake/pb" + handshake "github.com/jbenet/go-ipfs/p2p/net/handshake" + hspb "github.com/jbenet/go-ipfs/p2p/net/handshake/pb" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ggprotoio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" diff --git a/net/conn/interface.go b/p2p/net/conn/interface.go similarity index 100% rename from net/conn/interface.go rename to p2p/net/conn/interface.go diff --git a/net/conn/listen.go b/p2p/net/conn/listen.go similarity index 100% rename from net/conn/listen.go rename to p2p/net/conn/listen.go diff --git a/net/conn/secure_conn.go b/p2p/net/conn/secure_conn.go similarity index 100% rename from net/conn/secure_conn.go rename to p2p/net/conn/secure_conn.go diff --git a/net/conn/secure_conn_test.go b/p2p/net/conn/secure_conn_test.go similarity index 100% rename from net/conn/secure_conn_test.go rename to p2p/net/conn/secure_conn_test.go diff --git a/net/handshake/README.md b/p2p/net/handshake/README.md similarity index 100% rename from net/handshake/README.md rename to p2p/net/handshake/README.md diff --git a/net/handshake/doc.go b/p2p/net/handshake/doc.go similarity index 100% rename from net/handshake/doc.go rename to p2p/net/handshake/doc.go diff --git a/net/handshake/handshake1.go b/p2p/net/handshake/handshake1.go similarity index 96% rename from net/handshake/handshake1.go rename to p2p/net/handshake/handshake1.go index 17ca44f09..66302e16a 100644 --- a/net/handshake/handshake1.go +++ b/p2p/net/handshake/handshake1.go @@ -5,7 +5,7 @@ import ( "fmt" config "github.com/jbenet/go-ipfs/config" - pb "github.com/jbenet/go-ipfs/net/handshake/pb" + pb "github.com/jbenet/go-ipfs/p2p/net/handshake/pb" u "github.com/jbenet/go-ipfs/util" semver "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/coreos/go-semver/semver" diff --git a/net/handshake/handshake1_test.go b/p2p/net/handshake/handshake1_test.go similarity index 100% rename from net/handshake/handshake1_test.go rename to p2p/net/handshake/handshake1_test.go diff --git a/net/handshake/pb/Makefile b/p2p/net/handshake/pb/Makefile similarity index 100% rename from net/handshake/pb/Makefile rename to p2p/net/handshake/pb/Makefile diff --git a/net/handshake/pb/handshake.pb.go b/p2p/net/handshake/pb/handshake.pb.go similarity index 100% rename from net/handshake/pb/handshake.pb.go rename to p2p/net/handshake/pb/handshake.pb.go diff --git a/net/handshake/pb/handshake.proto b/p2p/net/handshake/pb/handshake.proto similarity index 100% rename from net/handshake/pb/handshake.proto rename to p2p/net/handshake/pb/handshake.proto diff --git a/net/interface.go b/p2p/net/interface.go similarity index 98% rename from net/interface.go rename to p2p/net/interface.go index 29d703bb2..2da7e49b5 100644 --- a/net/interface.go +++ b/p2p/net/interface.go @@ -3,8 +3,8 @@ package net import ( "io" - conn "github.com/jbenet/go-ipfs/net/conn" - // swarm "github.com/jbenet/go-ipfs/net/swarm2" + conn "github.com/jbenet/go-ipfs/p2p/net/conn" + // swarm "github.com/jbenet/go-ipfs/p2p/net/swarm2" peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/mock/interface.go b/p2p/net/mock/interface.go similarity index 98% rename from net/mock/interface.go rename to p2p/net/mock/interface.go index 658ac8c65..a0c0fb4b3 100644 --- a/net/mock/interface.go +++ b/p2p/net/mock/interface.go @@ -10,8 +10,8 @@ import ( "io" "time" - inet "github.com/jbenet/go-ipfs/net" ic "github.com/jbenet/go-ipfs/p2p/crypto" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" diff --git a/net/mock/mock.go b/p2p/net/mock/mock.go similarity index 100% rename from net/mock/mock.go rename to p2p/net/mock/mock.go diff --git a/net/mock/mock_conn.go b/p2p/net/mock/mock_conn.go similarity index 96% rename from net/mock/mock_conn.go rename to p2p/net/mock/mock_conn.go index 549d9e444..5b4d250dd 100644 --- a/net/mock/mock_conn.go +++ b/p2p/net/mock/mock_conn.go @@ -4,9 +4,9 @@ import ( "container/list" "sync" - inet "github.com/jbenet/go-ipfs/net" - mux "github.com/jbenet/go-ipfs/net/services/mux" ic "github.com/jbenet/go-ipfs/p2p/crypto" + inet "github.com/jbenet/go-ipfs/p2p/net" + mux "github.com/jbenet/go-ipfs/p2p/net/services/mux" peer "github.com/jbenet/go-ipfs/p2p/peer" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" diff --git a/net/mock/mock_link.go b/p2p/net/mock/mock_link.go similarity index 97% rename from net/mock/mock_link.go rename to p2p/net/mock/mock_link.go index 0753d96d9..cfd4be142 100644 --- a/net/mock/mock_link.go +++ b/p2p/net/mock/mock_link.go @@ -4,7 +4,7 @@ import ( "io" "sync" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" ) diff --git a/net/mock/mock_net.go b/p2p/net/mock/mock_net.go similarity index 99% rename from net/mock/mock_net.go rename to p2p/net/mock/mock_net.go index 3c8a59634..29520a9d1 100644 --- a/net/mock/mock_net.go +++ b/p2p/net/mock/mock_net.go @@ -4,8 +4,8 @@ import ( "fmt" "sync" - inet "github.com/jbenet/go-ipfs/net" ic "github.com/jbenet/go-ipfs/p2p/crypto" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" testutil "github.com/jbenet/go-ipfs/util/testutil" diff --git a/net/mock/mock_peernet.go b/p2p/net/mock/mock_peernet.go similarity index 97% rename from net/mock/mock_peernet.go rename to p2p/net/mock/mock_peernet.go index 13745d143..b3b7cccb3 100644 --- a/net/mock/mock_peernet.go +++ b/p2p/net/mock/mock_peernet.go @@ -5,11 +5,11 @@ import ( "math/rand" "sync" - inet "github.com/jbenet/go-ipfs/net" - ids "github.com/jbenet/go-ipfs/net/services/identify" - mux "github.com/jbenet/go-ipfs/net/services/mux" - relay "github.com/jbenet/go-ipfs/net/services/relay" ic "github.com/jbenet/go-ipfs/p2p/crypto" + inet "github.com/jbenet/go-ipfs/p2p/net" + ids "github.com/jbenet/go-ipfs/p2p/net/services/identify" + mux "github.com/jbenet/go-ipfs/p2p/net/services/mux" + relay "github.com/jbenet/go-ipfs/p2p/net/services/relay" peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/mock/mock_printer.go b/p2p/net/mock/mock_printer.go similarity index 94% rename from net/mock/mock_printer.go rename to p2p/net/mock/mock_printer.go index df3cbf15d..47b6e8178 100644 --- a/net/mock/mock_printer.go +++ b/p2p/net/mock/mock_printer.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" ) diff --git a/net/mock/mock_stream.go b/p2p/net/mock/mock_stream.go similarity index 89% rename from net/mock/mock_stream.go rename to p2p/net/mock/mock_stream.go index 9bf3f7d46..71a0ba66d 100644 --- a/net/mock/mock_stream.go +++ b/p2p/net/mock/mock_stream.go @@ -3,7 +3,7 @@ package mocknet import ( "io" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" ) // stream implements inet.Stream diff --git a/net/mock/mock_test.go b/p2p/net/mock/mock_test.go similarity index 99% rename from net/mock/mock_test.go rename to p2p/net/mock/mock_test.go index 3ae01aade..ef61bd1bd 100644 --- a/net/mock/mock_test.go +++ b/p2p/net/mock/mock_test.go @@ -7,7 +7,7 @@ import ( "sync" "testing" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" testutil "github.com/jbenet/go-ipfs/util/testutil" diff --git a/net/services/identify/id.go b/p2p/net/services/identify/id.go similarity index 97% rename from net/services/identify/id.go rename to p2p/net/services/identify/id.go index df624187d..ecdb9b0d8 100644 --- a/net/services/identify/id.go +++ b/p2p/net/services/identify/id.go @@ -6,9 +6,9 @@ import ( ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - inet "github.com/jbenet/go-ipfs/net" - handshake "github.com/jbenet/go-ipfs/net/handshake" - pb "github.com/jbenet/go-ipfs/net/handshake/pb" + inet "github.com/jbenet/go-ipfs/p2p/net" + handshake "github.com/jbenet/go-ipfs/p2p/net/handshake" + pb "github.com/jbenet/go-ipfs/p2p/net/handshake/pb" eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) diff --git a/net/services/identify/id_test.go b/p2p/net/services/identify/id_test.go similarity index 95% rename from net/services/identify/id_test.go rename to p2p/net/services/identify/id_test.go index 82f841de3..266257020 100644 --- a/net/services/identify/id_test.go +++ b/p2p/net/services/identify/id_test.go @@ -4,9 +4,9 @@ import ( "testing" "time" - inet "github.com/jbenet/go-ipfs/net" - handshake "github.com/jbenet/go-ipfs/net/handshake" - netutil "github.com/jbenet/go-ipfs/net/swarmnet/util" + inet "github.com/jbenet/go-ipfs/p2p/net" + handshake "github.com/jbenet/go-ipfs/p2p/net/handshake" + netutil "github.com/jbenet/go-ipfs/p2p/net/swarmnet/util" peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/services/mux/mux.go b/p2p/net/services/mux/mux.go similarity index 99% rename from net/services/mux/mux.go rename to p2p/net/services/mux/mux.go index 52913a56e..f47340bcc 100644 --- a/net/services/mux/mux.go +++ b/p2p/net/services/mux/mux.go @@ -7,7 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" eventlog "github.com/jbenet/go-ipfs/util/eventlog" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" ) diff --git a/net/services/mux/mux_test.go b/p2p/net/services/mux/mux_test.go similarity index 96% rename from net/services/mux/mux_test.go rename to p2p/net/services/mux/mux_test.go index ac6e54843..642226b34 100644 --- a/net/services/mux/mux_test.go +++ b/p2p/net/services/mux/mux_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" ) var testCases = map[string]string{ diff --git a/net/services/relay/relay.go b/p2p/net/services/relay/relay.go similarity index 98% rename from net/services/relay/relay.go rename to p2p/net/services/relay/relay.go index 21d1f434f..ec7204ba7 100644 --- a/net/services/relay/relay.go +++ b/p2p/net/services/relay/relay.go @@ -8,7 +8,7 @@ import ( ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) diff --git a/net/services/relay/relay_test.go b/p2p/net/services/relay/relay_test.go similarity index 97% rename from net/services/relay/relay_test.go rename to p2p/net/services/relay/relay_test.go index 01192bfa9..f82e15677 100644 --- a/net/services/relay/relay_test.go +++ b/p2p/net/services/relay/relay_test.go @@ -4,10 +4,10 @@ import ( "io" "testing" - inet "github.com/jbenet/go-ipfs/net" - mux "github.com/jbenet/go-ipfs/net/services/mux" - relay "github.com/jbenet/go-ipfs/net/services/relay" - netutil "github.com/jbenet/go-ipfs/net/swarmnet/util" + inet "github.com/jbenet/go-ipfs/p2p/net" + mux "github.com/jbenet/go-ipfs/p2p/net/services/mux" + relay "github.com/jbenet/go-ipfs/p2p/net/services/relay" + netutil "github.com/jbenet/go-ipfs/p2p/net/swarmnet/util" eventlog "github.com/jbenet/go-ipfs/util/eventlog" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/swarm/addr.go b/p2p/net/swarm/addr.go similarity index 98% rename from net/swarm/addr.go rename to p2p/net/swarm/addr.go index 5f074df94..01cb39717 100644 --- a/net/swarm/addr.go +++ b/p2p/net/swarm/addr.go @@ -1,7 +1,7 @@ package swarm import ( - conn "github.com/jbenet/go-ipfs/net/conn" + conn "github.com/jbenet/go-ipfs/p2p/net/conn" eventlog "github.com/jbenet/go-ipfs/util/eventlog" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/swarm/simul_test.go b/p2p/net/swarm/simul_test.go similarity index 100% rename from net/swarm/simul_test.go rename to p2p/net/swarm/simul_test.go diff --git a/net/swarm/swarm.go b/p2p/net/swarm/swarm.go similarity index 100% rename from net/swarm/swarm.go rename to p2p/net/swarm/swarm.go diff --git a/net/swarm/swarm_conn.go b/p2p/net/swarm/swarm_conn.go similarity index 98% rename from net/swarm/swarm_conn.go rename to p2p/net/swarm/swarm_conn.go index 3ce6acdd3..f5993e704 100644 --- a/net/swarm/swarm_conn.go +++ b/p2p/net/swarm/swarm_conn.go @@ -3,8 +3,8 @@ package swarm import ( "fmt" - conn "github.com/jbenet/go-ipfs/net/conn" ic "github.com/jbenet/go-ipfs/p2p/crypto" + conn "github.com/jbenet/go-ipfs/p2p/net/conn" peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/swarm/swarm_dial.go b/p2p/net/swarm/swarm_dial.go similarity index 98% rename from net/swarm/swarm_dial.go rename to p2p/net/swarm/swarm_dial.go index 67c94ac76..dde967fbc 100644 --- a/net/swarm/swarm_dial.go +++ b/p2p/net/swarm/swarm_dial.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" - conn "github.com/jbenet/go-ipfs/net/conn" + conn "github.com/jbenet/go-ipfs/p2p/net/conn" peer "github.com/jbenet/go-ipfs/p2p/peer" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" diff --git a/net/swarm/swarm_listen.go b/p2p/net/swarm/swarm_listen.go similarity index 98% rename from net/swarm/swarm_listen.go rename to p2p/net/swarm/swarm_listen.go index bcc55cad6..ba0bee2e7 100644 --- a/net/swarm/swarm_listen.go +++ b/p2p/net/swarm/swarm_listen.go @@ -1,7 +1,7 @@ package swarm import ( - conn "github.com/jbenet/go-ipfs/net/conn" + conn "github.com/jbenet/go-ipfs/p2p/net/conn" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" diff --git a/net/swarm/swarm_stream.go b/p2p/net/swarm/swarm_stream.go similarity index 100% rename from net/swarm/swarm_stream.go rename to p2p/net/swarm/swarm_stream.go diff --git a/net/swarm/swarm_test.go b/p2p/net/swarm/swarm_test.go similarity index 100% rename from net/swarm/swarm_test.go rename to p2p/net/swarm/swarm_test.go diff --git a/net/swarmnet/net.go b/p2p/net/swarmnet/net.go similarity index 96% rename from net/swarmnet/net.go rename to p2p/net/swarmnet/net.go index 73190dad3..ff5e60ec1 100644 --- a/net/swarmnet/net.go +++ b/p2p/net/swarmnet/net.go @@ -7,11 +7,11 @@ import ( ic "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" - inet "github.com/jbenet/go-ipfs/net" - ids "github.com/jbenet/go-ipfs/net/services/identify" - mux "github.com/jbenet/go-ipfs/net/services/mux" - relay "github.com/jbenet/go-ipfs/net/services/relay" - swarm "github.com/jbenet/go-ipfs/net/swarm" + inet "github.com/jbenet/go-ipfs/p2p/net" + ids "github.com/jbenet/go-ipfs/p2p/net/services/identify" + mux "github.com/jbenet/go-ipfs/p2p/net/services/mux" + relay "github.com/jbenet/go-ipfs/p2p/net/services/relay" + swarm "github.com/jbenet/go-ipfs/p2p/net/swarm" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" diff --git a/net/swarmnet/net_test.go b/p2p/net/swarmnet/net_test.go similarity index 95% rename from net/swarmnet/net_test.go rename to p2p/net/swarmnet/net_test.go index 24f4c497c..90067e0fb 100644 --- a/net/swarmnet/net_test.go +++ b/p2p/net/swarmnet/net_test.go @@ -7,8 +7,8 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - inet "github.com/jbenet/go-ipfs/net" - netutil "github.com/jbenet/go-ipfs/net/swarmnet/util" + inet "github.com/jbenet/go-ipfs/p2p/net" + netutil "github.com/jbenet/go-ipfs/p2p/net/swarmnet/util" ) // TestConnectednessCorrect starts a few networks, connects a few diff --git a/net/swarmnet/util/util.go b/p2p/net/swarmnet/util/util.go similarity index 88% rename from net/swarmnet/util/util.go rename to p2p/net/swarmnet/util/util.go index 2f0f1f146..f82f11789 100644 --- a/net/swarmnet/util/util.go +++ b/p2p/net/swarmnet/util/util.go @@ -3,8 +3,8 @@ package testutil import ( "testing" - inet "github.com/jbenet/go-ipfs/net" - sn "github.com/jbenet/go-ipfs/net/swarmnet" + inet "github.com/jbenet/go-ipfs/p2p/net" + sn "github.com/jbenet/go-ipfs/p2p/net/swarmnet" peer "github.com/jbenet/go-ipfs/p2p/peer" tu "github.com/jbenet/go-ipfs/util/testutil" diff --git a/routing/dht/dht.go b/routing/dht/dht.go index ed9858c7a..4e9e670d8 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -10,7 +10,7 @@ import ( "sync" "time" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 3eea25d9e..3d9bbd93f 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -4,7 +4,7 @@ import ( "errors" "time" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" pb "github.com/jbenet/go-ipfs/routing/dht/pb" ctxutil "github.com/jbenet/go-ipfs/util/ctx" diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index f4f2a5414..18fd74274 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,7 +14,7 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - swarmnet "github.com/jbenet/go-ipfs/net/swarmnet" + swarmnet "github.com/jbenet/go-ipfs/p2p/net/swarmnet" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index 168a2d8ed..f76f5bddc 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -4,8 +4,8 @@ import ( "math/rand" "testing" - inet "github.com/jbenet/go-ipfs/net" - mocknet "github.com/jbenet/go-ipfs/net/mock" + inet "github.com/jbenet/go-ipfs/p2p/net" + mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" diff --git a/routing/dht/pb/message.go b/routing/dht/pb/message.go index 87b0b1f4c..61bf41ebb 100644 --- a/routing/dht/pb/message.go +++ b/routing/dht/pb/message.go @@ -3,7 +3,7 @@ package dht_pb import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) diff --git a/routing/dht/query.go b/routing/dht/query.go index 95e3c3c90..5b62a8f4c 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -3,7 +3,7 @@ package dht import ( "sync" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" queue "github.com/jbenet/go-ipfs/p2p/peer/queue" "github.com/jbenet/go-ipfs/routing" diff --git a/routing/dht/routing.go b/routing/dht/routing.go index ee71f7156..4c3cf160b 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -6,7 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - inet "github.com/jbenet/go-ipfs/net" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 1dfa415e0..1f0340ebb 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -4,7 +4,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" - mocknet "github.com/jbenet/go-ipfs/net/mock" + mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" dht "github.com/jbenet/go-ipfs/routing/dht" "github.com/jbenet/go-ipfs/util/testutil" ) From 4309d15edb29b0f524a0d58bc1335fb73c66116d Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 07:40:11 -0800 Subject: [PATCH 11/21] updated msgio (varints) --- Godeps/Godeps.json | 2 +- .../github.com/jbenet/go-msgio/msgio_test.go | 28 ++- .../src/github.com/jbenet/go-msgio/varint.go | 182 ++++++++++++++++++ .../github.com/jbenet/go-msgio/varint_test.go | 66 +++++++ 4 files changed, 269 insertions(+), 9 deletions(-) create mode 100644 Godeps/_workspace/src/github.com/jbenet/go-msgio/varint.go create mode 100644 Godeps/_workspace/src/github.com/jbenet/go-msgio/varint_test.go diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index b473d6b72..61c05dd9a 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -118,7 +118,7 @@ }, { "ImportPath": "github.com/jbenet/go-msgio", - "Rev": "5e7289d3a0cd046a5bee30b187cc844c31f54dce" + "Rev": "dbae89193876910c736b2ce1291fa8bbcf299d77" }, { "ImportPath": "github.com/jbenet/go-multiaddr", diff --git a/Godeps/_workspace/src/github.com/jbenet/go-msgio/msgio_test.go b/Godeps/_workspace/src/github.com/jbenet/go-msgio/msgio_test.go index cef3e9cd0..05eca7b24 100644 --- a/Godeps/_workspace/src/github.com/jbenet/go-msgio/msgio_test.go +++ b/Godeps/_workspace/src/github.com/jbenet/go-msgio/msgio_test.go @@ -15,6 +15,24 @@ func TestReadWrite(t *testing.T) { buf := bytes.NewBuffer(nil) writer := NewWriter(buf) reader := NewReader(buf) + SubtestReadWrite(t, writer, reader) +} + +func TestReadWriteMsg(t *testing.T) { + buf := bytes.NewBuffer(nil) + writer := NewWriter(buf) + reader := NewReader(buf) + SubtestReadWriteMsg(t, writer, reader) +} + +func TestReadWriteMsgSync(t *testing.T) { + buf := bytes.NewBuffer(nil) + writer := NewWriter(buf) + reader := NewReader(buf) + SubtestReadWriteMsgSync(t, writer, reader) +} + +func SubtestReadWrite(t *testing.T, writer WriteCloser, reader ReadCloser) { msgs := [1000][]byte{} r := rand.New(rand.NewSource(time.Now().UnixNano())) @@ -58,10 +76,7 @@ func TestReadWrite(t *testing.T) { } } -func TestReadWriteMsg(t *testing.T) { - buf := bytes.NewBuffer(nil) - writer := NewWriter(buf) - reader := NewReader(buf) +func SubtestReadWriteMsg(t *testing.T, writer WriteCloser, reader ReadCloser) { msgs := [1000][]byte{} r := rand.New(rand.NewSource(time.Now().UnixNano())) @@ -100,10 +115,7 @@ func TestReadWriteMsg(t *testing.T) { } } -func TestReadWriteMsgSync(t *testing.T) { - buf := bytes.NewBuffer(nil) - writer := NewWriter(buf) - reader := NewReader(buf) +func SubtestReadWriteMsgSync(t *testing.T, writer WriteCloser, reader ReadCloser) { msgs := [1000][]byte{} r := rand.New(rand.NewSource(time.Now().UnixNano())) diff --git a/Godeps/_workspace/src/github.com/jbenet/go-msgio/varint.go b/Godeps/_workspace/src/github.com/jbenet/go-msgio/varint.go new file mode 100644 index 000000000..613470503 --- /dev/null +++ b/Godeps/_workspace/src/github.com/jbenet/go-msgio/varint.go @@ -0,0 +1,182 @@ +package msgio + +import ( + "encoding/binary" + "io" + "sync" + + mpool "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio/mpool" +) + +// varintWriter is the underlying type that implements the Writer interface. +type varintWriter struct { + W io.Writer + + lbuf []byte // for encoding varints + lock sync.Locker // for threadsafe writes +} + +// NewVarintWriter wraps an io.Writer with a varint msgio framed writer. +// The msgio.Writer will write the length prefix of every message written +// as a varint, using https://golang.org/pkg/encoding/binary/#PutUvarint +func NewVarintWriter(w io.Writer) WriteCloser { + return &varintWriter{ + W: w, + lbuf: make([]byte, binary.MaxVarintLen64), + lock: new(sync.Mutex), + } +} + +func (s *varintWriter) Write(msg []byte) (int, error) { + err := s.WriteMsg(msg) + if err != nil { + return 0, err + } + return len(msg), nil +} + +func (s *varintWriter) WriteMsg(msg []byte) error { + s.lock.Lock() + defer s.lock.Unlock() + + length := uint64(len(msg)) + n := binary.PutUvarint(s.lbuf, length) + if _, err := s.W.Write(s.lbuf[:n]); err != nil { + return err + } + _, err := s.W.Write(msg) + return err +} + +func (s *varintWriter) Close() error { + s.lock.Lock() + defer s.lock.Unlock() + + if c, ok := s.W.(io.Closer); ok { + return c.Close() + } + return nil +} + +// varintReader is the underlying type that implements the Reader interface. +type varintReader struct { + R io.Reader + br io.ByteReader // for reading varints. + + lbuf []byte + next int + pool *mpool.Pool + lock sync.Locker +} + +// NewVarintReader wraps an io.Reader with a varint msgio framed reader. +// The msgio.Reader will read whole messages at a time (using the length). +// Varints read according to https://golang.org/pkg/encoding/binary/#ReadUvarint +// Assumes an equivalent writer on the other side. +func NewVarintReader(r io.Reader) ReadCloser { + return NewVarintReaderWithPool(r, &mpool.ByteSlicePool) +} + +// NewVarintReaderWithPool wraps an io.Reader with a varint msgio framed reader. +// The msgio.Reader will read whole messages at a time (using the length). +// Varints read according to https://golang.org/pkg/encoding/binary/#ReadUvarint +// Assumes an equivalent writer on the other side. It uses a given mpool.Pool +func NewVarintReaderWithPool(r io.Reader, p *mpool.Pool) ReadCloser { + if p == nil { + panic("nil pool") + } + return &varintReader{ + R: r, + br: &simpleByteReader{R: r}, + lbuf: make([]byte, binary.MaxVarintLen64), + next: -1, + pool: p, + lock: new(sync.Mutex), + } +} + +// NextMsgLen reads the length of the next msg into s.lbuf, and returns it. +// WARNING: like Read, NextMsgLen is destructive. It reads from the internal +// reader. +func (s *varintReader) NextMsgLen() (int, error) { + s.lock.Lock() + defer s.lock.Unlock() + return s.nextMsgLen() +} + +func (s *varintReader) nextMsgLen() (int, error) { + if s.next == -1 { + length, err := binary.ReadUvarint(s.br) + if err != nil { + return 0, err + } + s.next = int(length) + } + return s.next, nil +} + +func (s *varintReader) Read(msg []byte) (int, error) { + s.lock.Lock() + defer s.lock.Unlock() + + length, err := s.nextMsgLen() + if err != nil { + return 0, err + } + + if length > len(msg) { + return 0, io.ErrShortBuffer + } + _, err = io.ReadFull(s.R, msg[:length]) + s.next = -1 // signal we've consumed this msg + return length, err +} + +func (s *varintReader) ReadMsg() ([]byte, error) { + s.lock.Lock() + defer s.lock.Unlock() + + length, err := s.nextMsgLen() + if err != nil { + return nil, err + } + + msgb := s.pool.Get(uint32(length)) + if msgb == nil { + return nil, io.ErrShortBuffer + } + msg := msgb.([]byte)[:length] + _, err = io.ReadFull(s.R, msg) + s.next = -1 // signal we've consumed this msg + return msg, err +} + +func (s *varintReader) ReleaseMsg(msg []byte) { + s.pool.Put(uint32(cap(msg)), msg) +} + +func (s *varintReader) Close() error { + s.lock.Lock() + defer s.lock.Unlock() + + if c, ok := s.R.(io.Closer); ok { + return c.Close() + } + return nil +} + +type simpleByteReader struct { + R io.Reader + buf []byte +} + +func (r *simpleByteReader) ReadByte() (c byte, err error) { + if r.buf == nil { + r.buf = make([]byte, 1) + } + + if _, err := io.ReadFull(r.R, r.buf); err != nil { + return 0, err + } + return r.buf[0], nil +} diff --git a/Godeps/_workspace/src/github.com/jbenet/go-msgio/varint_test.go b/Godeps/_workspace/src/github.com/jbenet/go-msgio/varint_test.go new file mode 100644 index 000000000..c63415089 --- /dev/null +++ b/Godeps/_workspace/src/github.com/jbenet/go-msgio/varint_test.go @@ -0,0 +1,66 @@ +package msgio + +import ( + "bytes" + "encoding/binary" + "testing" +) + +func TestVarintReadWrite(t *testing.T) { + buf := bytes.NewBuffer(nil) + writer := NewVarintWriter(buf) + reader := NewVarintReader(buf) + SubtestReadWrite(t, writer, reader) +} + +func TestVarintReadWriteMsg(t *testing.T) { + buf := bytes.NewBuffer(nil) + writer := NewVarintWriter(buf) + reader := NewVarintReader(buf) + SubtestReadWriteMsg(t, writer, reader) +} + +func TestVarintReadWriteMsgSync(t *testing.T) { + buf := bytes.NewBuffer(nil) + writer := NewVarintWriter(buf) + reader := NewVarintReader(buf) + SubtestReadWriteMsgSync(t, writer, reader) +} + +func TestVarintWrite(t *testing.T) { + SubtestVarintWrite(t, []byte("hello world")) + SubtestVarintWrite(t, []byte("hello world hello world hello world")) + SubtestVarintWrite(t, make([]byte, 1<<20)) + SubtestVarintWrite(t, []byte("")) +} + +func SubtestVarintWrite(t *testing.T, msg []byte) { + buf := bytes.NewBuffer(nil) + writer := NewVarintWriter(buf) + + if err := writer.WriteMsg(msg); err != nil { + t.Fatal(err) + } + + bb := buf.Bytes() + + sbr := simpleByteReader{R: buf} + length, err := binary.ReadUvarint(&sbr) + if err != nil { + t.Fatal(err) + } + + t.Logf("checking varint is %d", len(msg)) + if int(length) != len(msg) { + t.Fatalf("incorrect varint: %d != %d", length, len(msg)) + } + + lbuf := make([]byte, binary.MaxVarintLen64) + n := binary.PutUvarint(lbuf, length) + + bblen := int(length) + n + t.Logf("checking wrote (%d + %d) bytes", length, n) + if len(bb) != bblen { + t.Fatalf("wrote incorrect number of bytes: %d != %d", len(bb), bblen) + } +} From e0b9a368b8d1de8689127b2988143cff8d767364 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 19:34:34 -0800 Subject: [PATCH 12/21] protocol and muxer pkg --- p2p/protocol/mux/mux.go | 143 +++++++++++++++++++++++++++++++++++ p2p/protocol/mux/mux_test.go | 68 +++++++++++++++++ p2p/protocol/protocol.go | 40 ++++++++++ 3 files changed, 251 insertions(+) create mode 100644 p2p/protocol/mux/mux.go create mode 100644 p2p/protocol/mux/mux_test.go create mode 100644 p2p/protocol/protocol.go diff --git a/p2p/protocol/mux/mux.go b/p2p/protocol/mux/mux.go new file mode 100644 index 000000000..c0455396e --- /dev/null +++ b/p2p/protocol/mux/mux.go @@ -0,0 +1,143 @@ +package mux + +import ( + "fmt" + "io" + "sync" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + + inet "github.com/jbenet/go-ipfs/p2p/net" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" + lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" +) + +var log = eventlog.Logger("net/mux") + +type StreamHandlerMap map[protocol.ID]inet.StreamHandler + +// Mux provides simple stream multixplexing. +// It helps you precisely when: +// * You have many streams +// * You have function handlers +// +// It contains the handlers for each protocol accepted. +// It dispatches handlers for streams opened by remote peers. +// +// WARNING: this datastructure IS NOT threadsafe. +// do not modify it once the network is using it. +type Mux struct { + Default inet.StreamHandler // handles unknown protocols. + Handlers StreamHandlerMap + + sync.RWMutex +} + +// Protocols returns the list of protocols this muxer has handlers for +func (m *Mux) Protocols() []protocol.ID { + m.RLock() + l := make([]protocol.ID, 0, len(m.Handlers)) + for p := range m.Handlers { + l = append(l, p) + } + m.RUnlock() + return l +} + +// readHeader reads the stream and returns the next Handler function +// according to the muxer encoding. +func (m *Mux) readHeader(s io.Reader) (protocol.ID, inet.StreamHandler, error) { + // log.Error("ReadProtocolHeader") + p, err := protocol.ReadHeader(s) + if err != nil { + return "", nil, err + } + + // log.Debug("readHeader got:", p) + m.RLock() + h, found := m.Handlers[p] + m.RUnlock() + + switch { + case !found && m.Default != nil: + return p, m.Default, nil + case !found && m.Default == nil: + return p, nil, fmt.Errorf("%s no handler with name: %s (%d)", m, p, len(p)) + default: + return p, h, nil + } +} + +// String returns the muxer's printing representation +func (m *Mux) String() string { + m.RLock() + defer m.RUnlock() + return fmt.Sprintf("", m, len(m.Handlers)) +} + +// SetHandler sets the protocol handler on the Network's Muxer. +// This operation is threadsafe. +func (m *Mux) SetHandler(p protocol.ID, h inet.StreamHandler) { + log.Debugf("%s setting handler for protocol: %s (%d)", m, p, len(p)) + m.Lock() + m.Handlers[p] = h + m.Unlock() +} + +// Handle reads the next name off the Stream, and calls a handler function +// This is done in its own goroutine, to avoid blocking the caller. +func (m *Mux) Handle(s inet.Stream) { + + // Flow control and backpressure of Opening streams is broken. + // I believe that spdystream has one set of workers that both send + // data AND accept new streams (as it's just more data). there + // is a problem where if the new stream handlers want to throttle, + // they also eliminate the ability to read/write data, which makes + // forward-progress impossible. Thus, throttling this function is + // -- at this moment -- not the solution. Either spdystream must + // change, or we must throttle another way. + // + // In light of this, we use a goroutine for now (otherwise the + // spdy worker totally blocks, and we can't even read the protocol + // header). The better route in the future is to use a worker pool. + go m.HandleSync(s) +} + +// HandleSync reads the next name off the Stream, and calls a handler function +// This is done synchronously. The handler function will return before +// HandleSync returns. +func (m *Mux) HandleSync(s inet.Stream) { + ctx := context.Background() + + name, handler, err := m.readHeader(s) + if err != nil { + err = fmt.Errorf("protocol mux error: %s", err) + log.Error(err) + log.Event(ctx, "muxError", lgbl.Error(err)) + return + } + + log.Infof("muxer handle protocol: %s", name) + log.Event(ctx, "muxHandle", eventlog.Metadata{"protocol": name}) + handler(s) +} + +// ReadLengthPrefix reads the name from Reader with a length-byte-prefix. +func ReadLengthPrefix(r io.Reader) (string, error) { + // c-string identifier + // the first byte is our length + l := make([]byte, 1) + if _, err := io.ReadFull(r, l); err != nil { + return "", err + } + length := int(l[0]) + + // the next are our identifier + name := make([]byte, length) + if _, err := io.ReadFull(r, name); err != nil { + return "", err + } + + return string(name), nil +} diff --git a/p2p/protocol/mux/mux_test.go b/p2p/protocol/mux/mux_test.go new file mode 100644 index 000000000..ff98b817c --- /dev/null +++ b/p2p/protocol/mux/mux_test.go @@ -0,0 +1,68 @@ +package mux + +import ( + "bytes" + "testing" + + inet "github.com/jbenet/go-ipfs/p2p/net" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" +) + +var testCases = map[string]string{ + "/bitswap": "\u0009/bitswap\n", + "/dht": "\u0005/dht\n", + "/ipfs": "\u0006/ipfs\n", + "/ipfs/dksnafkasnfkdajfkdajfdsjadosiaaodj": ")/ipfs/dksnafkasnfkdajfkdajfdsjadosiaaodj\n", +} + +func TestWrite(t *testing.T) { + for k, v := range testCases { + var buf bytes.Buffer + if err := protocol.WriteHeader(&buf, protocol.ID(k)); err != nil { + t.Fatal(err) + } + + v2 := buf.Bytes() + if !bytes.Equal(v2, []byte(v)) { + t.Errorf("failed: %s - %v != %v", k, []byte(v), v2) + } + } +} + +func TestHandler(t *testing.T) { + + outs := make(chan string, 10) + + h := func(n string) func(s inet.Stream) { + return func(s inet.Stream) { + outs <- n + } + } + + m := Mux{Handlers: StreamHandlerMap{}} + m.Default = h("default") + m.Handlers["/dht"] = h("bitswap") + // m.Handlers["/ipfs"] = h("bitswap") // default! + m.Handlers["/bitswap"] = h("bitswap") + m.Handlers["/ipfs/dksnafkasnfkdajfkdajfdsjadosiaaodj"] = h("bitswap") + + for k, v := range testCases { + var buf bytes.Buffer + if _, err := buf.Write([]byte(v)); err != nil { + t.Error(err) + continue + } + + name, err := protocol.ReadHeader(&buf) + if err != nil { + t.Error(err) + continue + } + + if name != protocol.ID(k) { + t.Errorf("name mismatch: %s != %s", k, name) + continue + } + } + +} diff --git a/p2p/protocol/protocol.go b/p2p/protocol/protocol.go new file mode 100644 index 000000000..e192fb6a3 --- /dev/null +++ b/p2p/protocol/protocol.go @@ -0,0 +1,40 @@ +package protocol + +import ( + "io" + + msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" +) + +// ID is an identifier used to write protocol headers in streams. +type ID string + +// These are reserved protocol.IDs. +const ( + TestingID ID = "/p2p/_testing" +) + +// WriteHeader writes a protocol.ID header to an io.Writer. This is so +// multiple protocols can be multiplexed on top of the same transport. +// +// We use go-msgio varint encoding: +// \n +// (the varint includes the \n) +func WriteHeader(w io.Writer, id ID) error { + vw := msgio.NewVarintWriter(w) + s := string(id) + "\n" // add \n + return vw.WriteMsg([]byte(s)) +} + +// ReadHeader reads a protocol.ID header from an io.Reader. This is so +// multiple protocols can be multiplexed on top of the same transport. +// See WriteHeader. +func ReadHeader(r io.Reader) (ID, error) { + vr := msgio.NewVarintReader(r) + msg, err := vr.ReadMsg() + if err != nil { + return ID(""), err + } + msg = msg[:len(msg)-1] // remove \n + return ID(msg), nil +} From 0ef035ef08f15360db0950a6ee4a595b555e13e1 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 19:38:13 -0800 Subject: [PATCH 13/21] combined protocol and mux --- p2p/protocol/{mux => }/mux.go | 15 +++++++-------- p2p/protocol/{mux => }/mux_test.go | 9 ++++----- 2 files changed, 11 insertions(+), 13 deletions(-) rename p2p/protocol/{mux => }/mux.go (90%) rename p2p/protocol/{mux => }/mux_test.go (85%) diff --git a/p2p/protocol/mux/mux.go b/p2p/protocol/mux.go similarity index 90% rename from p2p/protocol/mux/mux.go rename to p2p/protocol/mux.go index c0455396e..3eaa8cd11 100644 --- a/p2p/protocol/mux/mux.go +++ b/p2p/protocol/mux.go @@ -1,4 +1,4 @@ -package mux +package protocol import ( "fmt" @@ -8,14 +8,13 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" inet "github.com/jbenet/go-ipfs/p2p/net" - protocol "github.com/jbenet/go-ipfs/p2p/protocol" eventlog "github.com/jbenet/go-ipfs/util/eventlog" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" ) var log = eventlog.Logger("net/mux") -type StreamHandlerMap map[protocol.ID]inet.StreamHandler +type StreamHandlerMap map[ID]inet.StreamHandler // Mux provides simple stream multixplexing. // It helps you precisely when: @@ -35,9 +34,9 @@ type Mux struct { } // Protocols returns the list of protocols this muxer has handlers for -func (m *Mux) Protocols() []protocol.ID { +func (m *Mux) Protocols() []ID { m.RLock() - l := make([]protocol.ID, 0, len(m.Handlers)) + l := make([]ID, 0, len(m.Handlers)) for p := range m.Handlers { l = append(l, p) } @@ -47,9 +46,9 @@ func (m *Mux) Protocols() []protocol.ID { // readHeader reads the stream and returns the next Handler function // according to the muxer encoding. -func (m *Mux) readHeader(s io.Reader) (protocol.ID, inet.StreamHandler, error) { +func (m *Mux) readHeader(s io.Reader) (ID, inet.StreamHandler, error) { // log.Error("ReadProtocolHeader") - p, err := protocol.ReadHeader(s) + p, err := ReadHeader(s) if err != nil { return "", nil, err } @@ -78,7 +77,7 @@ func (m *Mux) String() string { // SetHandler sets the protocol handler on the Network's Muxer. // This operation is threadsafe. -func (m *Mux) SetHandler(p protocol.ID, h inet.StreamHandler) { +func (m *Mux) SetHandler(p ID, h inet.StreamHandler) { log.Debugf("%s setting handler for protocol: %s (%d)", m, p, len(p)) m.Lock() m.Handlers[p] = h diff --git a/p2p/protocol/mux/mux_test.go b/p2p/protocol/mux_test.go similarity index 85% rename from p2p/protocol/mux/mux_test.go rename to p2p/protocol/mux_test.go index ff98b817c..dfac205da 100644 --- a/p2p/protocol/mux/mux_test.go +++ b/p2p/protocol/mux_test.go @@ -1,11 +1,10 @@ -package mux +package protocol import ( "bytes" "testing" inet "github.com/jbenet/go-ipfs/p2p/net" - protocol "github.com/jbenet/go-ipfs/p2p/protocol" ) var testCases = map[string]string{ @@ -18,7 +17,7 @@ var testCases = map[string]string{ func TestWrite(t *testing.T) { for k, v := range testCases { var buf bytes.Buffer - if err := protocol.WriteHeader(&buf, protocol.ID(k)); err != nil { + if err := WriteHeader(&buf, ID(k)); err != nil { t.Fatal(err) } @@ -53,13 +52,13 @@ func TestHandler(t *testing.T) { continue } - name, err := protocol.ReadHeader(&buf) + name, err := ReadHeader(&buf) if err != nil { t.Error(err) continue } - if name != protocol.ID(k) { + if name != ID(k) { t.Errorf("name mismatch: %s != %s", k, name) continue } From 53d190da2c965311991535c9fc56ab267b39c8a7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 31 Dec 2014 20:33:04 -0800 Subject: [PATCH 14/21] peerstore: AddPeerInfo --- p2p/peer/peerstore.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/p2p/peer/peerstore.go b/p2p/peer/peerstore.go index 1a75a6843..32d6207ea 100644 --- a/p2p/peer/peerstore.go +++ b/p2p/peer/peerstore.go @@ -26,6 +26,9 @@ type Peerstore interface { // that peer, useful to other services. PeerInfo(ID) PeerInfo + // AddPeerInfo absorbs the information listed in given PeerInfo. + AddPeerInfo(PeerInfo) + // Get/Put is a simple registry for other peer-related key/value pairs. // if we find something we use often, it should become its own set of // methods. this is a last resort. @@ -235,6 +238,10 @@ func (ps *peerstore) PeerInfo(p ID) PeerInfo { } } +func (ps *peerstore) AddPeerInfo(pi PeerInfo) { + ps.AddAddresses(pi.ID, pi.Addrs) +} + func PeerInfos(ps Peerstore, peers []ID) []PeerInfo { pi := make([]PeerInfo, len(peers)) for i, p := range peers { From ba094472515888c52a521b6fc876c02121d5bad8 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 31 Dec 2014 20:33:28 -0800 Subject: [PATCH 15/21] mux: close stream on error remove comment about spdystream. this is now superceded by go-peerstream interface. --- p2p/protocol/mux.go | 16 ++-------------- p2p/protocol/mux_test.go | 2 +- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/p2p/protocol/mux.go b/p2p/protocol/mux.go index 3eaa8cd11..d3234f401 100644 --- a/p2p/protocol/mux.go +++ b/p2p/protocol/mux.go @@ -7,7 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - inet "github.com/jbenet/go-ipfs/p2p/net" + inet "github.com/jbenet/go-ipfs/p2p/net2" eventlog "github.com/jbenet/go-ipfs/util/eventlog" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" ) @@ -87,19 +87,6 @@ func (m *Mux) SetHandler(p ID, h inet.StreamHandler) { // Handle reads the next name off the Stream, and calls a handler function // This is done in its own goroutine, to avoid blocking the caller. func (m *Mux) Handle(s inet.Stream) { - - // Flow control and backpressure of Opening streams is broken. - // I believe that spdystream has one set of workers that both send - // data AND accept new streams (as it's just more data). there - // is a problem where if the new stream handlers want to throttle, - // they also eliminate the ability to read/write data, which makes - // forward-progress impossible. Thus, throttling this function is - // -- at this moment -- not the solution. Either spdystream must - // change, or we must throttle another way. - // - // In light of this, we use a goroutine for now (otherwise the - // spdy worker totally blocks, and we can't even read the protocol - // header). The better route in the future is to use a worker pool. go m.HandleSync(s) } @@ -114,6 +101,7 @@ func (m *Mux) HandleSync(s inet.Stream) { err = fmt.Errorf("protocol mux error: %s", err) log.Error(err) log.Event(ctx, "muxError", lgbl.Error(err)) + s.Close() return } diff --git a/p2p/protocol/mux_test.go b/p2p/protocol/mux_test.go index dfac205da..96e8c60ff 100644 --- a/p2p/protocol/mux_test.go +++ b/p2p/protocol/mux_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - inet "github.com/jbenet/go-ipfs/p2p/net" + inet "github.com/jbenet/go-ipfs/p2p/net2" ) var testCases = map[string]string{ From d322824874c663c582afdf606ded5dbfdfa436e7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 1 Jan 2015 10:40:53 -0800 Subject: [PATCH 16/21] net2: separate protocols/services out. using a placeholder net2 package so tests continue to pass. Will be swapped atomically into main code. --- p2p/net2/README.md | 17 ++ p2p/net2/conn/conn.go | 157 ++++++++++ p2p/net2/conn/conn_test.go | 122 ++++++++ p2p/net2/conn/dial.go | 131 +++++++++ p2p/net2/conn/dial_test.go | 165 +++++++++++ p2p/net2/conn/interface.go | 84 ++++++ p2p/net2/conn/listen.go | 115 ++++++++ p2p/net2/conn/secure_conn.go | 154 ++++++++++ p2p/net2/conn/secure_conn_test.go | 199 +++++++++++++ p2p/net2/interface.go | 133 +++++++++ p2p/net2/mock/interface.go | 98 +++++++ p2p/net2/mock/mock.go | 63 ++++ p2p/net2/mock/mock_conn.go | 120 ++++++++ p2p/net2/mock/mock_link.go | 93 ++++++ p2p/net2/mock/mock_net.go | 322 +++++++++++++++++++++ p2p/net2/mock/mock_peernet.go | 353 +++++++++++++++++++++++ p2p/net2/mock/mock_printer.go | 36 +++ p2p/net2/mock/mock_stream.go | 29 ++ p2p/net2/mock/mock_test.go | 460 ++++++++++++++++++++++++++++++ p2p/net2/swarm/addr.go | 124 ++++++++ p2p/net2/swarm/simul_test.go | 66 +++++ p2p/net2/swarm/swarm.go | 158 ++++++++++ p2p/net2/swarm/swarm_conn.go | 141 +++++++++ p2p/net2/swarm/swarm_dial.go | 104 +++++++ p2p/net2/swarm/swarm_listen.go | 86 ++++++ p2p/net2/swarm/swarm_net.go | 156 ++++++++++ p2p/net2/swarm/swarm_net_test.go | 78 +++++ p2p/net2/swarm/swarm_stream.go | 59 ++++ p2p/net2/swarm/swarm_test.go | 269 +++++++++++++++++ 29 files changed, 4092 insertions(+) create mode 100644 p2p/net2/README.md create mode 100644 p2p/net2/conn/conn.go create mode 100644 p2p/net2/conn/conn_test.go create mode 100644 p2p/net2/conn/dial.go create mode 100644 p2p/net2/conn/dial_test.go create mode 100644 p2p/net2/conn/interface.go create mode 100644 p2p/net2/conn/listen.go create mode 100644 p2p/net2/conn/secure_conn.go create mode 100644 p2p/net2/conn/secure_conn_test.go create mode 100644 p2p/net2/interface.go create mode 100644 p2p/net2/mock/interface.go create mode 100644 p2p/net2/mock/mock.go create mode 100644 p2p/net2/mock/mock_conn.go create mode 100644 p2p/net2/mock/mock_link.go create mode 100644 p2p/net2/mock/mock_net.go create mode 100644 p2p/net2/mock/mock_peernet.go create mode 100644 p2p/net2/mock/mock_printer.go create mode 100644 p2p/net2/mock/mock_stream.go create mode 100644 p2p/net2/mock/mock_test.go create mode 100644 p2p/net2/swarm/addr.go create mode 100644 p2p/net2/swarm/simul_test.go create mode 100644 p2p/net2/swarm/swarm.go create mode 100644 p2p/net2/swarm/swarm_conn.go create mode 100644 p2p/net2/swarm/swarm_dial.go create mode 100644 p2p/net2/swarm/swarm_listen.go create mode 100644 p2p/net2/swarm/swarm_net.go create mode 100644 p2p/net2/swarm/swarm_net_test.go create mode 100644 p2p/net2/swarm/swarm_stream.go create mode 100644 p2p/net2/swarm/swarm_test.go diff --git a/p2p/net2/README.md b/p2p/net2/README.md new file mode 100644 index 000000000..a1cf6aacf --- /dev/null +++ b/p2p/net2/README.md @@ -0,0 +1,17 @@ +# Network + +The IPFS Network package handles all of the peer-to-peer networking. It connects to other hosts, it encrypts communications, it muxes messages between the network's client services and target hosts. It has multiple subcomponents: + +- `Conn` - a connection to a single Peer + - `MultiConn` - a set of connections to a single Peer + - `SecureConn` - an encrypted (tls-like) connection +- `Swarm` - holds connections to Peers, multiplexes from/to each `MultiConn` +- `Muxer` - multiplexes between `Services` and `Swarm`. Handles `Requet/Reply`. + - `Service` - connects between an outside client service and Network. + - `Handler` - the client service part that handles requests + +It looks a bit like this: + +

    +![](https://docs.google.com/drawings/d/1FvU7GImRsb9GvAWDDo1le85jIrnFJNVB_OTPXC15WwM/pub?h=480) +
    diff --git a/p2p/net2/conn/conn.go b/p2p/net2/conn/conn.go new file mode 100644 index 000000000..65b12f23e --- /dev/null +++ b/p2p/net2/conn/conn.go @@ -0,0 +1,157 @@ +package conn + +import ( + "fmt" + "net" + "time" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" + mpool "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio/mpool" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" + + ic "github.com/jbenet/go-ipfs/p2p/crypto" + peer "github.com/jbenet/go-ipfs/p2p/peer" + u "github.com/jbenet/go-ipfs/util" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" +) + +var log = eventlog.Logger("conn") + +// ReleaseBuffer puts the given byte array back into the buffer pool, +// first verifying that it is the correct size +func ReleaseBuffer(b []byte) { + log.Debugf("Releasing buffer! (cap,size = %d, %d)", cap(b), len(b)) + mpool.ByteSlicePool.Put(uint32(cap(b)), b) +} + +// singleConn represents a single connection to another Peer (IPFS Node). +type singleConn struct { + local peer.ID + remote peer.ID + maconn manet.Conn + msgrw msgio.ReadWriteCloser +} + +// newConn constructs a new connection +func newSingleConn(ctx context.Context, local, remote peer.ID, maconn manet.Conn) (Conn, error) { + + conn := &singleConn{ + local: local, + remote: remote, + maconn: maconn, + msgrw: msgio.NewReadWriter(maconn), + } + + log.Debugf("newSingleConn %p: %v to %v", conn, local, remote) + return conn, nil +} + +// close is the internal close function, called by ContextCloser.Close +func (c *singleConn) Close() error { + log.Debugf("%s closing Conn with %s", c.local, c.remote) + // close underlying connection + return c.msgrw.Close() +} + +// ID is an identifier unique to this connection. +func (c *singleConn) ID() string { + return ID(c) +} + +func (c *singleConn) String() string { + return String(c, "singleConn") +} + +func (c *singleConn) LocalAddr() net.Addr { + return c.maconn.LocalAddr() +} + +func (c *singleConn) RemoteAddr() net.Addr { + return c.maconn.RemoteAddr() +} + +func (c *singleConn) LocalPrivateKey() ic.PrivKey { + return nil +} + +func (c *singleConn) RemotePublicKey() ic.PubKey { + return nil +} + +func (c *singleConn) SetDeadline(t time.Time) error { + return c.maconn.SetDeadline(t) +} +func (c *singleConn) SetReadDeadline(t time.Time) error { + return c.maconn.SetReadDeadline(t) +} + +func (c *singleConn) SetWriteDeadline(t time.Time) error { + return c.maconn.SetWriteDeadline(t) +} + +// LocalMultiaddr is the Multiaddr on this side +func (c *singleConn) LocalMultiaddr() ma.Multiaddr { + return c.maconn.LocalMultiaddr() +} + +// RemoteMultiaddr is the Multiaddr on the remote side +func (c *singleConn) RemoteMultiaddr() ma.Multiaddr { + return c.maconn.RemoteMultiaddr() +} + +// LocalPeer is the Peer on this side +func (c *singleConn) LocalPeer() peer.ID { + return c.local +} + +// RemotePeer is the Peer on the remote side +func (c *singleConn) RemotePeer() peer.ID { + return c.remote +} + +// Read reads data, net.Conn style +func (c *singleConn) Read(buf []byte) (int, error) { + return c.msgrw.Read(buf) +} + +// Write writes data, net.Conn style +func (c *singleConn) Write(buf []byte) (int, error) { + return c.msgrw.Write(buf) +} + +func (c *singleConn) NextMsgLen() (int, error) { + return c.msgrw.NextMsgLen() +} + +// ReadMsg reads data, net.Conn style +func (c *singleConn) ReadMsg() ([]byte, error) { + return c.msgrw.ReadMsg() +} + +// WriteMsg writes data, net.Conn style +func (c *singleConn) WriteMsg(buf []byte) error { + return c.msgrw.WriteMsg(buf) +} + +// ReleaseMsg releases a buffer +func (c *singleConn) ReleaseMsg(m []byte) { + c.msgrw.ReleaseMsg(m) +} + +// ID returns the ID of a given Conn. +func ID(c Conn) string { + l := fmt.Sprintf("%s/%s", c.LocalMultiaddr(), c.LocalPeer().Pretty()) + r := fmt.Sprintf("%s/%s", c.RemoteMultiaddr(), c.RemotePeer().Pretty()) + lh := u.Hash([]byte(l)) + rh := u.Hash([]byte(r)) + ch := u.XOR(lh, rh) + return u.Key(ch).Pretty() +} + +// String returns the user-friendly String representation of a conn +func String(c Conn, typ string) string { + return fmt.Sprintf("%s (%s) <-- %s %p --> (%s) %s", + c.LocalPeer(), c.LocalMultiaddr(), typ, c, c.RemoteMultiaddr(), c.RemotePeer()) +} diff --git a/p2p/net2/conn/conn_test.go b/p2p/net2/conn/conn_test.go new file mode 100644 index 000000000..ccbbade6a --- /dev/null +++ b/p2p/net2/conn/conn_test.go @@ -0,0 +1,122 @@ +package conn + +import ( + "bytes" + "fmt" + "os" + "runtime" + "sync" + "testing" + "time" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +func testOneSendRecv(t *testing.T, c1, c2 Conn) { + log.Debugf("testOneSendRecv from %s to %s", c1.LocalPeer(), c2.LocalPeer()) + m1 := []byte("hello") + if err := c1.WriteMsg(m1); err != nil { + t.Fatal(err) + } + m2, err := c2.ReadMsg() + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(m1, m2) { + t.Fatal("failed to send: %s %s", m1, m2) + } +} + +func testNotOneSendRecv(t *testing.T, c1, c2 Conn) { + m1 := []byte("hello") + if err := c1.WriteMsg(m1); err == nil { + t.Fatal("write should have failed", err) + } + _, err := c2.ReadMsg() + if err == nil { + t.Fatal("read should have failed", err) + } +} + +func TestClose(t *testing.T) { + // t.Skip("Skipping in favor of another test") + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + c1, c2, _, _ := setupSingleConn(t, ctx) + + testOneSendRecv(t, c1, c2) + testOneSendRecv(t, c2, c1) + + c1.Close() + testNotOneSendRecv(t, c1, c2) + + c2.Close() + testNotOneSendRecv(t, c2, c1) + testNotOneSendRecv(t, c1, c2) +} + +func TestCloseLeak(t *testing.T) { + // t.Skip("Skipping in favor of another test") + if testing.Short() { + t.SkipNow() + } + + if os.Getenv("TRAVIS") == "true" { + t.Skip("this doesn't work well on travis") + } + + var wg sync.WaitGroup + + runPair := func(num int) { + ctx, cancel := context.WithCancel(context.Background()) + c1, c2, _, _ := setupSingleConn(t, ctx) + + for i := 0; i < num; i++ { + b1 := []byte(fmt.Sprintf("beep%d", i)) + c1.WriteMsg(b1) + b2, err := c2.ReadMsg() + if err != nil { + panic(err) + } + if !bytes.Equal(b1, b2) { + panic(fmt.Errorf("bytes not equal: %s != %s", b1, b2)) + } + + b2 = []byte(fmt.Sprintf("boop%d", i)) + c2.WriteMsg(b2) + b1, err = c1.ReadMsg() + if err != nil { + panic(err) + } + if !bytes.Equal(b1, b2) { + panic(fmt.Errorf("bytes not equal: %s != %s", b1, b2)) + } + + <-time.After(time.Microsecond * 5) + } + + c1.Close() + c2.Close() + cancel() // close the listener + wg.Done() + } + + var cons = 5 + var msgs = 50 + log.Debugf("Running %d connections * %d msgs.\n", cons, msgs) + for i := 0; i < cons; i++ { + wg.Add(1) + go runPair(msgs) + } + + log.Debugf("Waiting...\n") + wg.Wait() + // done! + + <-time.After(time.Millisecond * 150) + if runtime.NumGoroutine() > 20 { + // panic("uncomment me to debug") + t.Fatal("leaking goroutines:", runtime.NumGoroutine()) + } +} diff --git a/p2p/net2/conn/dial.go b/p2p/net2/conn/dial.go new file mode 100644 index 000000000..1294f2241 --- /dev/null +++ b/p2p/net2/conn/dial.go @@ -0,0 +1,131 @@ +package conn + +import ( + "fmt" + "strings" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" + + peer "github.com/jbenet/go-ipfs/p2p/peer" + debugerror "github.com/jbenet/go-ipfs/util/debugerror" +) + +// String returns the string rep of d. +func (d *Dialer) String() string { + return fmt.Sprintf("", d.LocalPeer, d.LocalAddrs[0]) +} + +// Dial connects to a peer over a particular address +// Ensures raddr is part of peer.Addresses() +// Example: d.DialAddr(ctx, peer.Addresses()[0], peer) +func (d *Dialer) Dial(ctx context.Context, raddr ma.Multiaddr, remote peer.ID) (Conn, error) { + + network, _, err := manet.DialArgs(raddr) + if err != nil { + return nil, err + } + + if strings.HasPrefix(raddr.String(), "/ip4/0.0.0.0") { + return nil, debugerror.Errorf("Attempted to connect to zero address: %s", raddr) + } + + var laddr ma.Multiaddr + if len(d.LocalAddrs) > 0 { + // laddr := MultiaddrNetMatch(raddr, d.LocalAddrs) + laddr = NetAddress(network, d.LocalAddrs) + if laddr == nil { + return nil, debugerror.Errorf("No local address for network %s", network) + } + } + + // TODO: try to get reusing addr/ports to work. + // madialer := manet.Dialer{LocalAddr: laddr} + madialer := manet.Dialer{} + + log.Debugf("%s dialing %s %s", d.LocalPeer, remote, raddr) + maconn, err := madialer.Dial(raddr) + if err != nil { + return nil, err + } + + var connOut Conn + var errOut error + done := make(chan struct{}) + + // do it async to ensure we respect don contexteone + go func() { + defer func() { done <- struct{}{} }() + + c, err := newSingleConn(ctx, d.LocalPeer, remote, maconn) + if err != nil { + errOut = err + return + } + + if d.PrivateKey == nil { + log.Warning("dialer %s dialing INSECURELY %s at %s!", d, remote, raddr) + connOut = c + return + } + c2, err := newSecureConn(ctx, d.PrivateKey, c) + if err != nil { + errOut = err + c.Close() + return + } + + connOut = c2 + }() + + select { + case <-ctx.Done(): + maconn.Close() + return nil, ctx.Err() + case <-done: + // whew, finished. + } + + return connOut, errOut +} + +// MultiaddrProtocolsMatch returns whether two multiaddrs match in protocol stacks. +func MultiaddrProtocolsMatch(a, b ma.Multiaddr) bool { + ap := a.Protocols() + bp := b.Protocols() + + if len(ap) != len(bp) { + return false + } + + for i, api := range ap { + if api != bp[i] { + return false + } + } + + return true +} + +// MultiaddrNetMatch returns the first Multiaddr found to match network. +func MultiaddrNetMatch(tgt ma.Multiaddr, srcs []ma.Multiaddr) ma.Multiaddr { + for _, a := range srcs { + if MultiaddrProtocolsMatch(tgt, a) { + return a + } + } + return nil +} + +// NetAddress returns the first Multiaddr found for a given network. +func NetAddress(n string, addrs []ma.Multiaddr) ma.Multiaddr { + for _, a := range addrs { + for _, p := range a.Protocols() { + if p.Name == n { + return a + } + } + } + return nil +} diff --git a/p2p/net2/conn/dial_test.go b/p2p/net2/conn/dial_test.go new file mode 100644 index 000000000..bf24ab09a --- /dev/null +++ b/p2p/net2/conn/dial_test.go @@ -0,0 +1,165 @@ +package conn + +import ( + "io" + "net" + "testing" + "time" + + tu "github.com/jbenet/go-ipfs/util/testutil" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +func echoListen(ctx context.Context, listener Listener) { + for { + c, err := listener.Accept() + if err != nil { + + select { + case <-ctx.Done(): + return + default: + } + + if ne, ok := err.(net.Error); ok && ne.Temporary() { + <-time.After(time.Microsecond * 10) + continue + } + + log.Debugf("echoListen: listener appears to be closing") + return + } + + go echo(c.(Conn)) + } +} + +func echo(c Conn) { + io.Copy(c, c) +} + +func setupSecureConn(t *testing.T, ctx context.Context) (a, b Conn, p1, p2 tu.PeerNetParams) { + return setupConn(t, ctx, true) +} + +func setupSingleConn(t *testing.T, ctx context.Context) (a, b Conn, p1, p2 tu.PeerNetParams) { + return setupConn(t, ctx, false) +} + +func setupConn(t *testing.T, ctx context.Context, secure bool) (a, b Conn, p1, p2 tu.PeerNetParams) { + + p1 = tu.RandPeerNetParamsOrFatal(t) + p2 = tu.RandPeerNetParamsOrFatal(t) + laddr := p1.Addr + + key1 := p1.PrivKey + key2 := p2.PrivKey + if !secure { + key1 = nil + key2 = nil + } + l1, err := Listen(ctx, laddr, p1.ID, key1) + if err != nil { + t.Fatal(err) + } + + d2 := &Dialer{ + LocalPeer: p2.ID, + PrivateKey: key2, + } + + var c2 Conn + + done := make(chan error) + go func() { + var err error + c2, err = d2.Dial(ctx, p1.Addr, p1.ID) + if err != nil { + done <- err + } + close(done) + }() + + c1, err := l1.Accept() + if err != nil { + t.Fatal("failed to accept", err) + } + if err := <-done; err != nil { + t.Fatal(err) + } + + return c1.(Conn), c2, p1, p2 +} + +func testDialer(t *testing.T, secure bool) { + // t.Skip("Skipping in favor of another test") + + p1 := tu.RandPeerNetParamsOrFatal(t) + p2 := tu.RandPeerNetParamsOrFatal(t) + + key1 := p1.PrivKey + key2 := p2.PrivKey + if !secure { + key1 = nil + key2 = nil + } + + ctx, cancel := context.WithCancel(context.Background()) + l1, err := Listen(ctx, p1.Addr, p1.ID, key1) + if err != nil { + t.Fatal(err) + } + + d2 := &Dialer{ + LocalPeer: p2.ID, + PrivateKey: key2, + } + + go echoListen(ctx, l1) + + c, err := d2.Dial(ctx, p1.Addr, p1.ID) + if err != nil { + t.Fatal("error dialing peer", err) + } + + // fmt.Println("sending") + c.WriteMsg([]byte("beep")) + c.WriteMsg([]byte("boop")) + + out, err := c.ReadMsg() + if err != nil { + t.Fatal(err) + } + + // fmt.Println("recving", string(out)) + data := string(out) + if data != "beep" { + t.Error("unexpected conn output", data) + } + + out, err = c.ReadMsg() + if err != nil { + t.Fatal(err) + } + + data = string(out) + if string(out) != "boop" { + t.Error("unexpected conn output", data) + } + + // fmt.Println("closing") + c.Close() + l1.Close() + cancel() +} + +func TestDialerInsecure(t *testing.T) { + // t.Skip("Skipping in favor of another test") + testDialer(t, false) +} + +func TestDialerSecure(t *testing.T) { + // t.Skip("Skipping in favor of another test") + testDialer(t, true) +} diff --git a/p2p/net2/conn/interface.go b/p2p/net2/conn/interface.go new file mode 100644 index 000000000..1601da1aa --- /dev/null +++ b/p2p/net2/conn/interface.go @@ -0,0 +1,84 @@ +package conn + +import ( + "io" + "net" + "time" + + ic "github.com/jbenet/go-ipfs/p2p/crypto" + peer "github.com/jbenet/go-ipfs/p2p/peer" + u "github.com/jbenet/go-ipfs/util" + + msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +) + +// Map maps Keys (Peer.IDs) to Connections. +type Map map[u.Key]Conn + +type PeerConn interface { + // LocalPeer (this side) ID, PrivateKey, and Address + LocalPeer() peer.ID + LocalPrivateKey() ic.PrivKey + LocalMultiaddr() ma.Multiaddr + + // RemotePeer ID, PublicKey, and Address + RemotePeer() peer.ID + RemotePublicKey() ic.PubKey + RemoteMultiaddr() ma.Multiaddr +} + +// Conn is a generic message-based Peer-to-Peer connection. +type Conn interface { + PeerConn + + // ID is an identifier unique to this connection. + ID() string + + // can't just say "net.Conn" cause we have duplicate methods. + LocalAddr() net.Addr + RemoteAddr() net.Addr + SetDeadline(t time.Time) error + SetReadDeadline(t time.Time) error + SetWriteDeadline(t time.Time) error + + msgio.Reader + msgio.Writer + io.Closer +} + +// Dialer is an object that can open connections. We could have a "convenience" +// Dial function as before, but it would have many arguments, as dialing is +// no longer simple (need a peerstore, a local peer, a context, a network, etc) +type Dialer struct { + + // LocalPeer is the identity of the local Peer. + LocalPeer peer.ID + + // LocalAddrs is a set of local addresses to use. + LocalAddrs []ma.Multiaddr + + // PrivateKey used to initialize a secure connection. + // Warning: if PrivateKey is nil, connection will not be secured. + PrivateKey ic.PrivKey +} + +// Listener is an object that can accept connections. It matches net.Listener +type Listener interface { + + // Accept waits for and returns the next connection to the listener. + Accept() (net.Conn, error) + + // Addr is the local address + Addr() net.Addr + + // Multiaddr is the local multiaddr address + Multiaddr() ma.Multiaddr + + // LocalPeer is the identity of the local Peer. + LocalPeer() peer.ID + + // Close closes the listener. + // Any blocked Accept operations will be unblocked and return errors. + Close() error +} diff --git a/p2p/net2/conn/listen.go b/p2p/net2/conn/listen.go new file mode 100644 index 000000000..dd6af24ba --- /dev/null +++ b/p2p/net2/conn/listen.go @@ -0,0 +1,115 @@ +package conn + +import ( + "fmt" + "net" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" + + ic "github.com/jbenet/go-ipfs/p2p/crypto" + peer "github.com/jbenet/go-ipfs/p2p/peer" +) + +// listener is an object that can accept connections. It implements Listener +type listener struct { + manet.Listener + + maddr ma.Multiaddr // Local multiaddr to listen on + local peer.ID // LocalPeer is the identity of the local Peer + privk ic.PrivKey // private key to use to initialize secure conns + + cg ctxgroup.ContextGroup +} + +func (l *listener) teardown() error { + defer log.Debugf("listener closed: %s %s", l.local, l.maddr) + return l.Listener.Close() +} + +func (l *listener) Close() error { + log.Debugf("listener closing: %s %s", l.local, l.maddr) + return l.cg.Close() +} + +func (l *listener) String() string { + return fmt.Sprintf("", l.local, l.maddr) +} + +// Accept waits for and returns the next connection to the listener. +// Note that unfortunately this +func (l *listener) Accept() (net.Conn, error) { + + // listeners dont have contexts. given changes dont make sense here anymore + // note that the parent of listener will Close, which will interrupt all io. + // Contexts and io don't mix. + ctx := context.Background() + + maconn, err := l.Listener.Accept() + if err != nil { + return nil, err + } + + c, err := newSingleConn(ctx, l.local, "", maconn) + if err != nil { + return nil, fmt.Errorf("Error accepting connection: %v", err) + } + + if l.privk == nil { + log.Warning("listener %s listening INSECURELY!", l) + return c, nil + } + sc, err := newSecureConn(ctx, l.privk, c) + if err != nil { + return nil, fmt.Errorf("Error securing connection: %v", err) + } + return sc, nil +} + +func (l *listener) Addr() net.Addr { + return l.Listener.Addr() +} + +// Multiaddr is the identity of the local Peer. +func (l *listener) Multiaddr() ma.Multiaddr { + return l.maddr +} + +// LocalPeer is the identity of the local Peer. +func (l *listener) LocalPeer() peer.ID { + return l.local +} + +func (l *listener) Loggable() map[string]interface{} { + return map[string]interface{}{ + "listener": map[string]interface{}{ + "peer": l.LocalPeer(), + "address": l.Multiaddr(), + "secure": (l.privk != nil), + }, + } +} + +// Listen listens on the particular multiaddr, with given peer and peerstore. +func Listen(ctx context.Context, addr ma.Multiaddr, local peer.ID, sk ic.PrivKey) (Listener, error) { + + ml, err := manet.Listen(addr) + if err != nil { + return nil, fmt.Errorf("Failed to listen on %s: %s", addr, err) + } + + l := &listener{ + Listener: ml, + maddr: addr, + local: local, + privk: sk, + cg: ctxgroup.WithContext(ctx), + } + l.cg.SetTeardown(l.teardown) + + log.Infof("swarm listening on %s", l.Multiaddr()) + log.Event(ctx, "swarmListen", l) + return l, nil +} diff --git a/p2p/net2/conn/secure_conn.go b/p2p/net2/conn/secure_conn.go new file mode 100644 index 000000000..6d8cca6d5 --- /dev/null +++ b/p2p/net2/conn/secure_conn.go @@ -0,0 +1,154 @@ +package conn + +import ( + "net" + "time" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + + ic "github.com/jbenet/go-ipfs/p2p/crypto" + secio "github.com/jbenet/go-ipfs/p2p/crypto/secio" + peer "github.com/jbenet/go-ipfs/p2p/peer" + errors "github.com/jbenet/go-ipfs/util/debugerror" +) + +// secureConn wraps another Conn object with an encrypted channel. +type secureConn struct { + + // the wrapped conn + insecure Conn + + // secure io (wrapping insecure) + secure msgio.ReadWriteCloser + + // secure Session + session secio.Session +} + +// newConn constructs a new connection +func newSecureConn(ctx context.Context, sk ic.PrivKey, insecure Conn) (Conn, error) { + + if insecure == nil { + return nil, errors.New("insecure is nil") + } + if insecure.LocalPeer() == "" { + return nil, errors.New("insecure.LocalPeer() is nil") + } + if sk == nil { + panic("way") + return nil, errors.New("private key is nil") + } + + // NewSession performs the secure handshake, which takes multiple RTT + sessgen := secio.SessionGenerator{LocalID: insecure.LocalPeer(), PrivateKey: sk} + session, err := sessgen.NewSession(ctx, insecure) + if err != nil { + return nil, err + } + + conn := &secureConn{ + insecure: insecure, + session: session, + secure: session.ReadWriter(), + } + log.Debugf("newSecureConn: %v to %v handshake success!", conn.LocalPeer(), conn.RemotePeer()) + return conn, nil +} + +func (c *secureConn) Close() error { + if err := c.secure.Close(); err != nil { + c.insecure.Close() + return err + } + return c.insecure.Close() +} + +// ID is an identifier unique to this connection. +func (c *secureConn) ID() string { + return ID(c) +} + +func (c *secureConn) String() string { + return String(c, "secureConn") +} + +func (c *secureConn) LocalAddr() net.Addr { + return c.insecure.LocalAddr() +} + +func (c *secureConn) RemoteAddr() net.Addr { + return c.insecure.RemoteAddr() +} + +func (c *secureConn) SetDeadline(t time.Time) error { + return c.insecure.SetDeadline(t) +} + +func (c *secureConn) SetReadDeadline(t time.Time) error { + return c.insecure.SetReadDeadline(t) +} + +func (c *secureConn) SetWriteDeadline(t time.Time) error { + return c.insecure.SetWriteDeadline(t) +} + +// LocalMultiaddr is the Multiaddr on this side +func (c *secureConn) LocalMultiaddr() ma.Multiaddr { + return c.insecure.LocalMultiaddr() +} + +// RemoteMultiaddr is the Multiaddr on the remote side +func (c *secureConn) RemoteMultiaddr() ma.Multiaddr { + return c.insecure.RemoteMultiaddr() +} + +// LocalPeer is the Peer on this side +func (c *secureConn) LocalPeer() peer.ID { + return c.session.LocalPeer() +} + +// RemotePeer is the Peer on the remote side +func (c *secureConn) RemotePeer() peer.ID { + return c.session.RemotePeer() +} + +// LocalPrivateKey is the public key of the peer on this side +func (c *secureConn) LocalPrivateKey() ic.PrivKey { + return c.session.LocalPrivateKey() +} + +// RemotePubKey is the public key of the peer on the remote side +func (c *secureConn) RemotePublicKey() ic.PubKey { + return c.session.RemotePublicKey() +} + +// Read reads data, net.Conn style +func (c *secureConn) Read(buf []byte) (int, error) { + return c.secure.Read(buf) +} + +// Write writes data, net.Conn style +func (c *secureConn) Write(buf []byte) (int, error) { + return c.secure.Write(buf) +} + +func (c *secureConn) NextMsgLen() (int, error) { + return c.secure.NextMsgLen() +} + +// ReadMsg reads data, net.Conn style +func (c *secureConn) ReadMsg() ([]byte, error) { + return c.secure.ReadMsg() +} + +// WriteMsg writes data, net.Conn style +func (c *secureConn) WriteMsg(buf []byte) error { + return c.secure.WriteMsg(buf) +} + +// ReleaseMsg releases a buffer +func (c *secureConn) ReleaseMsg(m []byte) { + c.secure.ReleaseMsg(m) +} diff --git a/p2p/net2/conn/secure_conn_test.go b/p2p/net2/conn/secure_conn_test.go new file mode 100644 index 000000000..7e364d12b --- /dev/null +++ b/p2p/net2/conn/secure_conn_test.go @@ -0,0 +1,199 @@ +package conn + +import ( + "bytes" + "os" + "runtime" + "sync" + "testing" + "time" + + ic "github.com/jbenet/go-ipfs/p2p/crypto" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +func upgradeToSecureConn(t *testing.T, ctx context.Context, sk ic.PrivKey, c Conn) (Conn, error) { + if c, ok := c.(*secureConn); ok { + return c, nil + } + + // shouldn't happen, because dial + listen already return secure conns. + s, err := newSecureConn(ctx, sk, c) + if err != nil { + return nil, err + } + return s, nil +} + +func secureHandshake(t *testing.T, ctx context.Context, sk ic.PrivKey, c Conn, done chan error) { + _, err := upgradeToSecureConn(t, ctx, sk, c) + done <- err +} + +func TestSecureSimple(t *testing.T) { + // t.Skip("Skipping in favor of another test") + + numMsgs := 100 + if testing.Short() { + numMsgs = 10 + } + + ctx := context.Background() + c1, c2, p1, p2 := setupSingleConn(t, ctx) + + done := make(chan error) + go secureHandshake(t, ctx, p1.PrivKey, c1, done) + go secureHandshake(t, ctx, p2.PrivKey, c2, done) + + for i := 0; i < 2; i++ { + if err := <-done; err != nil { + t.Fatal(err) + } + } + + for i := 0; i < numMsgs; i++ { + testOneSendRecv(t, c1, c2) + testOneSendRecv(t, c2, c1) + } + + c1.Close() + c2.Close() +} + +func TestSecureClose(t *testing.T) { + // t.Skip("Skipping in favor of another test") + + ctx := context.Background() + c1, c2, p1, p2 := setupSingleConn(t, ctx) + + done := make(chan error) + go secureHandshake(t, ctx, p1.PrivKey, c1, done) + go secureHandshake(t, ctx, p2.PrivKey, c2, done) + + for i := 0; i < 2; i++ { + if err := <-done; err != nil { + t.Fatal(err) + } + } + + testOneSendRecv(t, c1, c2) + + c1.Close() + testNotOneSendRecv(t, c1, c2) + + c2.Close() + testNotOneSendRecv(t, c1, c2) + testNotOneSendRecv(t, c2, c1) + +} + +func TestSecureCancelHandshake(t *testing.T) { + // t.Skip("Skipping in favor of another test") + + ctx, cancel := context.WithCancel(context.Background()) + c1, c2, p1, p2 := setupSingleConn(t, ctx) + + done := make(chan error) + go secureHandshake(t, ctx, p1.PrivKey, c1, done) + <-time.After(time.Millisecond) + cancel() // cancel ctx + go secureHandshake(t, ctx, p2.PrivKey, c2, done) + + for i := 0; i < 2; i++ { + if err := <-done; err == nil { + t.Error("cancel should've errored out") + } + } +} + +func TestSecureHandshakeFailsWithWrongKeys(t *testing.T) { + // t.Skip("Skipping in favor of another test") + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + c1, c2, p1, p2 := setupSingleConn(t, ctx) + + done := make(chan error) + go secureHandshake(t, ctx, p2.PrivKey, c1, done) + go secureHandshake(t, ctx, p1.PrivKey, c2, done) + + for i := 0; i < 2; i++ { + if err := <-done; err == nil { + t.Fatal("wrong keys should've errored out.") + } + } +} + +func TestSecureCloseLeak(t *testing.T) { + // t.Skip("Skipping in favor of another test") + + if testing.Short() { + t.SkipNow() + } + if os.Getenv("TRAVIS") == "true" { + t.Skip("this doesn't work well on travis") + } + + runPair := func(c1, c2 Conn, num int) { + log.Debugf("runPair %d", num) + + for i := 0; i < num; i++ { + log.Debugf("runPair iteration %d", i) + b1 := []byte("beep") + c1.WriteMsg(b1) + b2, err := c2.ReadMsg() + if err != nil { + panic(err) + } + if !bytes.Equal(b1, b2) { + panic("bytes not equal") + } + + b2 = []byte("beep") + c2.WriteMsg(b2) + b1, err = c1.ReadMsg() + if err != nil { + panic(err) + } + if !bytes.Equal(b1, b2) { + panic("bytes not equal") + } + + <-time.After(time.Microsecond * 5) + } + } + + var cons = 5 + var msgs = 50 + log.Debugf("Running %d connections * %d msgs.\n", cons, msgs) + + var wg sync.WaitGroup + for i := 0; i < cons; i++ { + wg.Add(1) + + ctx, cancel := context.WithCancel(context.Background()) + c1, c2, _, _ := setupSecureConn(t, ctx) + go func(c1, c2 Conn) { + + defer func() { + c1.Close() + c2.Close() + cancel() + wg.Done() + }() + + runPair(c1, c2, msgs) + }(c1, c2) + } + + log.Debugf("Waiting...\n") + wg.Wait() + // done! + + <-time.After(time.Millisecond * 150) + if runtime.NumGoroutine() > 20 { + // panic("uncomment me to debug") + t.Fatal("leaking goroutines:", runtime.NumGoroutine()) + } +} diff --git a/p2p/net2/interface.go b/p2p/net2/interface.go new file mode 100644 index 000000000..b7f557ec0 --- /dev/null +++ b/p2p/net2/interface.go @@ -0,0 +1,133 @@ +package net + +import ( + "io" + + conn "github.com/jbenet/go-ipfs/p2p/net2/conn" + peer "github.com/jbenet/go-ipfs/p2p/peer" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +) + +// MessageSizeMax is a soft (recommended) maximum for network messages. +// One can write more, as the interface is a stream. But it is useful +// to bunch it up into multiple read/writes when the whole message is +// a single, large serialized object. +const MessageSizeMax = 2 << 22 // 4MB + +// Stream represents a bidirectional channel between two agents in +// the IPFS network. "agent" is as granular as desired, potentially +// being a "request -> reply" pair, or whole protocols. +// Streams are backed by SPDY streams underneath the hood. +type Stream interface { + io.Reader + io.Writer + io.Closer + + // Conn returns the connection this stream is part of. + Conn() Conn +} + +// StreamHandler is the type of function used to listen for +// streams opened by the remote side. +type StreamHandler func(Stream) + +// Conn is a connection to a remote peer. It multiplexes streams. +// Usually there is no need to use a Conn directly, but it may +// be useful to get information about the peer on the other side: +// stream.Conn().RemotePeer() +type Conn interface { + conn.PeerConn + + // NewStream constructs a new Stream over this conn. + NewStream() (Stream, error) +} + +// ConnHandler is the type of function used to listen for +// connections opened by the remote side. +type ConnHandler func(Conn) + +// Network is the interface used to connect to the outside world. +// It dials and listens for connections. it uses a Swarm to pool +// connnections (see swarm pkg, and peerstream.Swarm). Connections +// are encrypted with a TLS-like protocol. +type Network interface { + Dialer + io.Closer + + // SetStreamHandler sets the handler for new streams opened by the + // remote side. This operation is threadsafe. + SetStreamHandler(StreamHandler) + + // SetConnHandler sets the handler for new connections opened by the + // remote side. This operation is threadsafe. + SetConnHandler(ConnHandler) + + // NewStream returns a new stream to given peer p. + // If there is no connection to p, attempts to create one. + NewStream(peer.ID) (Stream, error) + + // ListenAddresses returns a list of addresses at which this network listens. + ListenAddresses() []ma.Multiaddr + + // InterfaceListenAddresses returns a list of addresses at which this network + // listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to + // use the known local interfaces. + InterfaceListenAddresses() ([]ma.Multiaddr, error) + + // CtxGroup returns the network's contextGroup + CtxGroup() ctxgroup.ContextGroup +} + +// Dialer represents a service that can dial out to peers +// (this is usually just a Network, but other services may not need the whole +// stack, and thus it becomes easier to mock) +type Dialer interface { + + // Peerstore returns the internal peerstore + // This is useful to tell the dialer about a new address for a peer. + // Or use one of the public keys found out over the network. + Peerstore() peer.Peerstore + + // LocalPeer returns the local peer associated with this network + LocalPeer() peer.ID + + // DialPeer establishes a connection to a given peer + DialPeer(context.Context, peer.ID) (Conn, error) + + // ClosePeer closes the connection to a given peer + ClosePeer(peer.ID) error + + // Connectedness returns a state signaling connection capabilities + Connectedness(peer.ID) Connectedness + + // Peers returns the peers connected + Peers() []peer.ID + + // Conns returns the connections in this Netowrk + Conns() []Conn + + // ConnsToPeer returns the connections in this Netowrk for given peer. + ConnsToPeer(p peer.ID) []Conn +} + +// Connectedness signals the capacity for a connection with a given node. +// It is used to signal to services and other peers whether a node is reachable. +type Connectedness int + +const ( + // NotConnected means no connection to peer, and no extra information (default) + NotConnected Connectedness = iota + + // Connected means has an open, live connection to peer + Connected + + // CanConnect means recently connected to peer, terminated gracefully + CanConnect + + // CannotConnect means recently attempted connecting but failed to connect. + // (should signal "made effort, failed") + CannotConnect +) diff --git a/p2p/net2/mock/interface.go b/p2p/net2/mock/interface.go new file mode 100644 index 000000000..64aa4b14f --- /dev/null +++ b/p2p/net2/mock/interface.go @@ -0,0 +1,98 @@ +// Package mocknet provides a mock net.Network to test with. +// +// - a Mocknet has many inet.Networks +// - a Mocknet has many Links +// - a Link joins two inet.Networks +// - inet.Conns and inet.Streams are created by inet.Networks +package mocknet + +import ( + "io" + "time" + + ic "github.com/jbenet/go-ipfs/p2p/crypto" + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +) + +type Mocknet interface { + + // GenPeer generates a peer and its inet.Network in the Mocknet + GenPeer() (inet.Network, error) + + // AddPeer adds an existing peer. we need both a privkey and addr. + // ID is derived from PrivKey + AddPeer(ic.PrivKey, ma.Multiaddr) (inet.Network, error) + + // retrieve things (with randomized iteration order) + Peers() []peer.ID + Net(peer.ID) inet.Network + Nets() []inet.Network + Links() LinkMap + LinksBetweenPeers(a, b peer.ID) []Link + LinksBetweenNets(a, b inet.Network) []Link + + // Links are the **ability to connect**. + // think of Links as the physical medium. + // For p1 and p2 to connect, a link must exist between them. + // (this makes it possible to test dial failures, and + // things like relaying traffic) + LinkPeers(peer.ID, peer.ID) (Link, error) + LinkNets(inet.Network, inet.Network) (Link, error) + Unlink(Link) error + UnlinkPeers(peer.ID, peer.ID) error + UnlinkNets(inet.Network, inet.Network) error + + // LinkDefaults are the default options that govern links + // if they do not have thier own option set. + SetLinkDefaults(LinkOptions) + LinkDefaults() LinkOptions + + // Connections are the usual. Connecting means Dialing. + // **to succeed, peers must be linked beforehand** + ConnectPeers(peer.ID, peer.ID) (inet.Conn, error) + ConnectNets(inet.Network, inet.Network) (inet.Conn, error) + DisconnectPeers(peer.ID, peer.ID) error + DisconnectNets(inet.Network, inet.Network) error +} + +// LinkOptions are used to change aspects of the links. +// Sorry but they dont work yet :( +type LinkOptions struct { + Latency time.Duration + Bandwidth int // in bytes-per-second + // we can make these values distributions down the road. +} + +// Link represents the **possibility** of a connection between +// two peers. Think of it like physical network links. Without +// them, the peers can try and try but they won't be able to +// connect. This allows constructing topologies where specific +// nodes cannot talk to each other directly. :) +type Link interface { + Networks() []inet.Network + Peers() []peer.ID + + SetOptions(LinkOptions) + Options() LinkOptions + + // Metrics() Metrics +} + +// LinkMap is a 3D map to give us an easy way to track links. +// (wow, much map. so data structure. how compose. ahhh pointer) +type LinkMap map[string]map[string]map[Link]struct{} + +// Printer lets you inspect things :) +type Printer interface { + // MocknetLinks shows the entire Mocknet's link table :) + MocknetLinks(mn Mocknet) + NetworkConns(ni inet.Network) +} + +// PrinterTo returns a Printer ready to write to w. +func PrinterTo(w io.Writer) Printer { + return &printer{w} +} diff --git a/p2p/net2/mock/mock.go b/p2p/net2/mock/mock.go new file mode 100644 index 000000000..5403358cb --- /dev/null +++ b/p2p/net2/mock/mock.go @@ -0,0 +1,63 @@ +package mocknet + +import ( + eventlog "github.com/jbenet/go-ipfs/util/eventlog" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +var log = eventlog.Logger("mocknet") + +// WithNPeers constructs a Mocknet with N peers. +func WithNPeers(ctx context.Context, n int) (Mocknet, error) { + m := New(ctx) + for i := 0; i < n; i++ { + if _, err := m.GenPeer(); err != nil { + return nil, err + } + } + return m, nil +} + +// FullMeshLinked constructs a Mocknet with full mesh of Links. +// This means that all the peers **can** connect to each other +// (not that they already are connected. you can use m.ConnectAll()) +func FullMeshLinked(ctx context.Context, n int) (Mocknet, error) { + m, err := WithNPeers(ctx, n) + if err != nil { + return nil, err + } + + nets := m.Nets() + for _, n1 := range nets { + for _, n2 := range nets { + // yes, even self. + if _, err := m.LinkNets(n1, n2); err != nil { + return nil, err + } + } + } + + return m, nil +} + +// FullMeshConnected constructs a Mocknet with full mesh of Connections. +// This means that all the peers have dialed and are ready to talk to +// each other. +func FullMeshConnected(ctx context.Context, n int) (Mocknet, error) { + m, err := FullMeshLinked(ctx, n) + if err != nil { + return nil, err + } + + nets := m.Nets() + for _, n1 := range nets { + for _, n2 := range nets { + if _, err := m.ConnectNets(n1, n2); err != nil { + return nil, err + } + } + } + + return m, nil +} diff --git a/p2p/net2/mock/mock_conn.go b/p2p/net2/mock/mock_conn.go new file mode 100644 index 000000000..f1535ff91 --- /dev/null +++ b/p2p/net2/mock/mock_conn.go @@ -0,0 +1,120 @@ +package mocknet + +import ( + "container/list" + "sync" + + ic "github.com/jbenet/go-ipfs/p2p/crypto" + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +) + +// conn represents one side's perspective of a +// live connection between two peers. +// it goes over a particular link. +type conn struct { + local peer.ID + remote peer.ID + + localAddr ma.Multiaddr + remoteAddr ma.Multiaddr + + localPrivKey ic.PrivKey + remotePubKey ic.PubKey + + net *peernet + link *link + rconn *conn // counterpart + streams list.List + + sync.RWMutex +} + +func (c *conn) Close() error { + for _, s := range c.allStreams() { + s.Close() + } + c.net.removeConn(c) + return nil +} + +func (c *conn) addStream(s *stream) { + c.Lock() + s.conn = c + c.streams.PushBack(s) + c.Unlock() +} + +func (c *conn) removeStream(s *stream) { + c.Lock() + defer c.Unlock() + for e := c.streams.Front(); e != nil; e = e.Next() { + if s == e.Value { + c.streams.Remove(e) + return + } + } +} + +func (c *conn) allStreams() []inet.Stream { + c.RLock() + defer c.RUnlock() + + strs := make([]inet.Stream, 0, c.streams.Len()) + for e := c.streams.Front(); e != nil; e = e.Next() { + s := e.Value.(*stream) + strs = append(strs, s) + } + return strs +} + +func (c *conn) remoteOpenedStream(s *stream) { + c.addStream(s) + c.net.handleNewStream(s) +} + +func (c *conn) openStream() *stream { + sl, sr := c.link.newStreamPair() + c.addStream(sl) + c.rconn.remoteOpenedStream(sr) + return sl +} + +func (c *conn) NewStream() (inet.Stream, error) { + log.Debugf("Conn.NewStreamWithProtocol: %s --> %s", c.local, c.remote) + + s := c.openStream() + return s, nil +} + +// LocalMultiaddr is the Multiaddr on this side +func (c *conn) LocalMultiaddr() ma.Multiaddr { + return c.localAddr +} + +// LocalPeer is the Peer on our side of the connection +func (c *conn) LocalPeer() peer.ID { + return c.local +} + +// LocalPrivateKey is the private key of the peer on our side. +func (c *conn) LocalPrivateKey() ic.PrivKey { + return c.localPrivKey +} + +// RemoteMultiaddr is the Multiaddr on the remote side +func (c *conn) RemoteMultiaddr() ma.Multiaddr { + return c.remoteAddr +} + +// RemotePeer is the Peer on the remote side +func (c *conn) RemotePeer() peer.ID { + return c.remote +} + +// RemotePublicKey is the private key of the peer on our side. +func (c *conn) RemotePublicKey() ic.PubKey { + return c.remotePubKey +} diff --git a/p2p/net2/mock/mock_link.go b/p2p/net2/mock/mock_link.go new file mode 100644 index 000000000..352c35601 --- /dev/null +++ b/p2p/net2/mock/mock_link.go @@ -0,0 +1,93 @@ +package mocknet + +import ( + "io" + "sync" + + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" +) + +// link implements mocknet.Link +// and, for simplicity, inet.Conn +type link struct { + mock *mocknet + nets []*peernet + opts LinkOptions + + // this could have addresses on both sides. + + sync.RWMutex +} + +func newLink(mn *mocknet, opts LinkOptions) *link { + return &link{mock: mn, opts: opts} +} + +func (l *link) newConnPair(dialer *peernet) (*conn, *conn) { + l.RLock() + defer l.RUnlock() + + mkconn := func(ln, rn *peernet) *conn { + c := &conn{net: ln, link: l} + c.local = ln.peer + c.remote = rn.peer + + c.localAddr = ln.ps.Addresses(ln.peer)[0] + c.remoteAddr = rn.ps.Addresses(rn.peer)[0] + + c.localPrivKey = ln.ps.PrivKey(ln.peer) + c.remotePubKey = rn.ps.PubKey(rn.peer) + + return c + } + + c1 := mkconn(l.nets[0], l.nets[1]) + c2 := mkconn(l.nets[1], l.nets[0]) + c1.rconn = c2 + c2.rconn = c1 + + if dialer == c1.net { + return c1, c2 + } + return c2, c1 +} + +func (l *link) newStreamPair() (*stream, *stream) { + r1, w1 := io.Pipe() + r2, w2 := io.Pipe() + + s1 := &stream{Reader: r1, Writer: w2} + s2 := &stream{Reader: r2, Writer: w1} + return s1, s2 +} + +func (l *link) Networks() []inet.Network { + l.RLock() + defer l.RUnlock() + + cp := make([]inet.Network, len(l.nets)) + for i, n := range l.nets { + cp[i] = n + } + return cp +} + +func (l *link) Peers() []peer.ID { + l.RLock() + defer l.RUnlock() + + cp := make([]peer.ID, len(l.nets)) + for i, n := range l.nets { + cp[i] = n.peer + } + return cp +} + +func (l *link) SetOptions(o LinkOptions) { + l.opts = o +} + +func (l *link) Options() LinkOptions { + return l.opts +} diff --git a/p2p/net2/mock/mock_net.go b/p2p/net2/mock/mock_net.go new file mode 100644 index 000000000..9e6208ca3 --- /dev/null +++ b/p2p/net2/mock/mock_net.go @@ -0,0 +1,322 @@ +package mocknet + +import ( + "fmt" + "sync" + + ic "github.com/jbenet/go-ipfs/p2p/crypto" + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + testutil "github.com/jbenet/go-ipfs/util/testutil" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +) + +// mocknet implements mocknet.Mocknet +type mocknet struct { + // must map on peer.ID (instead of peer.ID) because + // each inet.Network has different peerstore + nets map[peer.ID]*peernet + + // links make it possible to connect two peers. + // think of links as the physical medium. + // usually only one, but there could be multiple + // **links are shared between peers** + links map[peer.ID]map[peer.ID]map[*link]struct{} + + linkDefaults LinkOptions + + cg ctxgroup.ContextGroup // for Context closing + sync.RWMutex +} + +func New(ctx context.Context) Mocknet { + return &mocknet{ + nets: map[peer.ID]*peernet{}, + links: map[peer.ID]map[peer.ID]map[*link]struct{}{}, + cg: ctxgroup.WithContext(ctx), + } +} + +func (mn *mocknet) GenPeer() (inet.Network, error) { + sk, _, err := testutil.RandKeyPair(512) + if err != nil { + return nil, err + } + + a := testutil.RandLocalTCPAddress() + + n, err := mn.AddPeer(sk, a) + if err != nil { + return nil, err + } + + return n, nil +} + +func (mn *mocknet) AddPeer(k ic.PrivKey, a ma.Multiaddr) (inet.Network, error) { + n, err := newPeernet(mn.cg.Context(), mn, k, a) + if err != nil { + return nil, err + } + + // make sure to add listening address! + // this makes debugging things simpler as remembering to register + // an address may cause unexpected failure. + n.Peerstore().AddAddress(n.LocalPeer(), a) + log.Debugf("mocknet added listen addr for peer: %s -- %s", n.LocalPeer(), a) + + mn.cg.AddChildGroup(n.cg) + + mn.Lock() + mn.nets[n.peer] = n + mn.Unlock() + return n, nil +} + +func (mn *mocknet) Peers() []peer.ID { + mn.RLock() + defer mn.RUnlock() + + cp := make([]peer.ID, 0, len(mn.nets)) + for _, n := range mn.nets { + cp = append(cp, n.peer) + } + return cp +} + +func (mn *mocknet) Net(pid peer.ID) inet.Network { + mn.RLock() + defer mn.RUnlock() + + for _, n := range mn.nets { + if n.peer == pid { + return n + } + } + return nil +} + +func (mn *mocknet) Nets() []inet.Network { + mn.RLock() + defer mn.RUnlock() + + cp := make([]inet.Network, 0, len(mn.nets)) + for _, n := range mn.nets { + cp = append(cp, n) + } + return cp +} + +// Links returns a copy of the internal link state map. +// (wow, much map. so data structure. how compose. ahhh pointer) +func (mn *mocknet) Links() LinkMap { + mn.RLock() + defer mn.RUnlock() + + links := map[string]map[string]map[Link]struct{}{} + for p1, lm := range mn.links { + sp1 := string(p1) + links[sp1] = map[string]map[Link]struct{}{} + for p2, ls := range lm { + sp2 := string(p2) + links[sp1][sp2] = map[Link]struct{}{} + for l := range ls { + links[sp1][sp2][l] = struct{}{} + } + } + } + return links +} + +func (mn *mocknet) LinkAll() error { + nets := mn.Nets() + for _, n1 := range nets { + for _, n2 := range nets { + if _, err := mn.LinkNets(n1, n2); err != nil { + return err + } + } + } + return nil +} + +func (mn *mocknet) LinkPeers(p1, p2 peer.ID) (Link, error) { + mn.RLock() + n1 := mn.nets[p1] + n2 := mn.nets[p2] + mn.RUnlock() + + if n1 == nil { + return nil, fmt.Errorf("network for p1 not in mocknet") + } + + if n2 == nil { + return nil, fmt.Errorf("network for p2 not in mocknet") + } + + return mn.LinkNets(n1, n2) +} + +func (mn *mocknet) validate(n inet.Network) (*peernet, error) { + // WARNING: assumes locks acquired + + nr, ok := n.(*peernet) + if !ok { + return nil, fmt.Errorf("Network not supported (use mock package nets only)") + } + + if _, found := mn.nets[nr.peer]; !found { + return nil, fmt.Errorf("Network not on mocknet. is it from another mocknet?") + } + + return nr, nil +} + +func (mn *mocknet) LinkNets(n1, n2 inet.Network) (Link, error) { + mn.RLock() + n1r, err1 := mn.validate(n1) + n2r, err2 := mn.validate(n2) + ld := mn.linkDefaults + mn.RUnlock() + + if err1 != nil { + return nil, err1 + } + if err2 != nil { + return nil, err2 + } + + l := newLink(mn, ld) + l.nets = append(l.nets, n1r, n2r) + mn.addLink(l) + return l, nil +} + +func (mn *mocknet) Unlink(l2 Link) error { + + l, ok := l2.(*link) + if !ok { + return fmt.Errorf("only links from mocknet are supported") + } + + mn.removeLink(l) + return nil +} + +func (mn *mocknet) UnlinkPeers(p1, p2 peer.ID) error { + ls := mn.LinksBetweenPeers(p1, p2) + if ls == nil { + return fmt.Errorf("no link between p1 and p2") + } + + for _, l := range ls { + if err := mn.Unlink(l); err != nil { + return err + } + } + return nil +} + +func (mn *mocknet) UnlinkNets(n1, n2 inet.Network) error { + return mn.UnlinkPeers(n1.LocalPeer(), n2.LocalPeer()) +} + +// get from the links map. and lazily contruct. +func (mn *mocknet) linksMapGet(p1, p2 peer.ID) *map[*link]struct{} { + + l1, found := mn.links[p1] + if !found { + mn.links[p1] = map[peer.ID]map[*link]struct{}{} + l1 = mn.links[p1] // so we make sure it's there. + } + + l2, found := l1[p2] + if !found { + m := map[*link]struct{}{} + l1[p2] = m + l2 = l1[p2] + } + + return &l2 +} + +func (mn *mocknet) addLink(l *link) { + mn.Lock() + defer mn.Unlock() + + n1, n2 := l.nets[0], l.nets[1] + (*mn.linksMapGet(n1.peer, n2.peer))[l] = struct{}{} + (*mn.linksMapGet(n2.peer, n1.peer))[l] = struct{}{} +} + +func (mn *mocknet) removeLink(l *link) { + mn.Lock() + defer mn.Unlock() + + n1, n2 := l.nets[0], l.nets[1] + delete(*mn.linksMapGet(n1.peer, n2.peer), l) + delete(*mn.linksMapGet(n2.peer, n1.peer), l) +} + +func (mn *mocknet) ConnectAll() error { + nets := mn.Nets() + for _, n1 := range nets { + for _, n2 := range nets { + if n1 == n2 { + continue + } + + if _, err := mn.ConnectNets(n1, n2); err != nil { + return err + } + } + } + return nil +} + +func (mn *mocknet) ConnectPeers(a, b peer.ID) (inet.Conn, error) { + return mn.Net(a).DialPeer(mn.cg.Context(), b) +} + +func (mn *mocknet) ConnectNets(a, b inet.Network) (inet.Conn, error) { + return a.DialPeer(mn.cg.Context(), b.LocalPeer()) +} + +func (mn *mocknet) DisconnectPeers(p1, p2 peer.ID) error { + return mn.Net(p1).ClosePeer(p2) +} + +func (mn *mocknet) DisconnectNets(n1, n2 inet.Network) error { + return n1.ClosePeer(n2.LocalPeer()) +} + +func (mn *mocknet) LinksBetweenPeers(p1, p2 peer.ID) []Link { + mn.RLock() + defer mn.RUnlock() + + ls2 := *mn.linksMapGet(p1, p2) + cp := make([]Link, 0, len(ls2)) + for l := range ls2 { + cp = append(cp, l) + } + return cp +} + +func (mn *mocknet) LinksBetweenNets(n1, n2 inet.Network) []Link { + return mn.LinksBetweenPeers(n1.LocalPeer(), n2.LocalPeer()) +} + +func (mn *mocknet) SetLinkDefaults(o LinkOptions) { + mn.Lock() + mn.linkDefaults = o + mn.Unlock() +} + +func (mn *mocknet) LinkDefaults() LinkOptions { + mn.RLock() + defer mn.RUnlock() + return mn.linkDefaults +} diff --git a/p2p/net2/mock/mock_peernet.go b/p2p/net2/mock/mock_peernet.go new file mode 100644 index 000000000..948b83ea0 --- /dev/null +++ b/p2p/net2/mock/mock_peernet.go @@ -0,0 +1,353 @@ +package mocknet + +import ( + "fmt" + "math/rand" + "sync" + + ic "github.com/jbenet/go-ipfs/p2p/crypto" + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +) + +// peernet implements inet.Network +type peernet struct { + mocknet *mocknet // parent + + peer peer.ID + ps peer.Peerstore + + // conns are actual live connections between peers. + // many conns could run over each link. + // **conns are NOT shared between peers** + connsByPeer map[peer.ID]map[*conn]struct{} + connsByLink map[*link]map[*conn]struct{} + + // implement inet.Network + streamHandler inet.StreamHandler + connHandler inet.ConnHandler + + cg ctxgroup.ContextGroup + sync.RWMutex +} + +// newPeernet constructs a new peernet +func newPeernet(ctx context.Context, m *mocknet, k ic.PrivKey, + a ma.Multiaddr) (*peernet, error) { + + p, err := peer.IDFromPublicKey(k.GetPublic()) + if err != nil { + return nil, err + } + + // create our own entirely, so that peers knowledge doesn't get shared + ps := peer.NewPeerstore() + ps.AddAddress(p, a) + ps.AddPrivKey(p, k) + ps.AddPubKey(p, k.GetPublic()) + + n := &peernet{ + mocknet: m, + peer: p, + ps: ps, + cg: ctxgroup.WithContext(ctx), + + connsByPeer: map[peer.ID]map[*conn]struct{}{}, + connsByLink: map[*link]map[*conn]struct{}{}, + } + + n.cg.SetTeardown(n.teardown) + return n, nil +} + +func (pn *peernet) teardown() error { + + // close the connections + for _, c := range pn.allConns() { + c.Close() + } + return nil +} + +// allConns returns all the connections between this peer and others +func (pn *peernet) allConns() []*conn { + pn.RLock() + var cs []*conn + for _, csl := range pn.connsByPeer { + for c := range csl { + cs = append(cs, c) + } + } + pn.RUnlock() + return cs +} + +// Close calls the ContextCloser func +func (pn *peernet) Close() error { + return pn.cg.Close() +} + +func (pn *peernet) Peerstore() peer.Peerstore { + return pn.ps +} + +func (pn *peernet) String() string { + return fmt.Sprintf("", pn.peer, len(pn.allConns())) +} + +// handleNewStream is an internal function to trigger the client's handler +func (pn *peernet) handleNewStream(s inet.Stream) { + pn.RLock() + handler := pn.streamHandler + pn.RUnlock() + if handler != nil { + go handler(s) + } +} + +// handleNewConn is an internal function to trigger the client's handler +func (pn *peernet) handleNewConn(c inet.Conn) { + pn.RLock() + handler := pn.connHandler + pn.RUnlock() + if handler != nil { + go handler(c) + } +} + +// DialPeer attempts to establish a connection to a given peer. +// Respects the context. +func (pn *peernet) DialPeer(ctx context.Context, p peer.ID) (inet.Conn, error) { + return pn.connect(p) +} + +func (pn *peernet) connect(p peer.ID) (*conn, error) { + // first, check if we already have live connections + pn.RLock() + cs, found := pn.connsByPeer[p] + pn.RUnlock() + if found && len(cs) > 0 { + for c := range cs { + return c, nil + } + } + + log.Debugf("%s (newly) dialing %s", pn.peer, p) + + // ok, must create a new connection. we need a link + links := pn.mocknet.LinksBetweenPeers(pn.peer, p) + if len(links) < 1 { + return nil, fmt.Errorf("%s cannot connect to %s", pn.peer, p) + } + + // if many links found, how do we select? for now, randomly... + // this would be an interesting place to test logic that can measure + // links (network interfaces) and select properly + l := links[rand.Intn(len(links))] + + log.Debugf("%s dialing %s openingConn", pn.peer, p) + // create a new connection with link + c := pn.openConn(p, l.(*link)) + return c, nil +} + +func (pn *peernet) openConn(r peer.ID, l *link) *conn { + lc, rc := l.newConnPair(pn) + log.Debugf("%s opening connection to %s", pn.LocalPeer(), lc.RemotePeer()) + pn.addConn(lc) + rc.net.remoteOpenedConn(rc) + return lc +} + +func (pn *peernet) remoteOpenedConn(c *conn) { + log.Debugf("%s accepting connection from %s", pn.LocalPeer(), c.RemotePeer()) + pn.addConn(c) + pn.handleNewConn(c) +} + +// addConn constructs and adds a connection +// to given remote peer over given link +func (pn *peernet) addConn(c *conn) { + pn.Lock() + defer pn.Unlock() + + cs, found := pn.connsByPeer[c.RemotePeer()] + if !found { + cs = map[*conn]struct{}{} + pn.connsByPeer[c.RemotePeer()] = cs + } + pn.connsByPeer[c.RemotePeer()][c] = struct{}{} + + cs, found = pn.connsByLink[c.link] + if !found { + cs = map[*conn]struct{}{} + pn.connsByLink[c.link] = cs + } + pn.connsByLink[c.link][c] = struct{}{} +} + +// removeConn removes a given conn +func (pn *peernet) removeConn(c *conn) { + pn.Lock() + defer pn.Unlock() + + cs, found := pn.connsByLink[c.link] + if !found || len(cs) < 1 { + panic("attempting to remove a conn that doesnt exist") + } + delete(cs, c) + + cs, found = pn.connsByPeer[c.remote] + if !found { + panic("attempting to remove a conn that doesnt exist") + } + delete(cs, c) +} + +// CtxGroup returns the network's ContextGroup +func (pn *peernet) CtxGroup() ctxgroup.ContextGroup { + return pn.cg +} + +// LocalPeer the network's LocalPeer +func (pn *peernet) LocalPeer() peer.ID { + return pn.peer +} + +// Peers returns the connected peers +func (pn *peernet) Peers() []peer.ID { + pn.RLock() + defer pn.RUnlock() + + peers := make([]peer.ID, 0, len(pn.connsByPeer)) + for _, cs := range pn.connsByPeer { + for c := range cs { + peers = append(peers, c.remote) + break + } + } + return peers +} + +// Conns returns all the connections of this peer +func (pn *peernet) Conns() []inet.Conn { + pn.RLock() + defer pn.RUnlock() + + out := make([]inet.Conn, 0, len(pn.connsByPeer)) + for _, cs := range pn.connsByPeer { + for c := range cs { + out = append(out, c) + } + } + return out +} + +func (pn *peernet) ConnsToPeer(p peer.ID) []inet.Conn { + pn.RLock() + defer pn.RUnlock() + + cs, found := pn.connsByPeer[p] + if !found || len(cs) == 0 { + return nil + } + + var cs2 []inet.Conn + for c := range cs { + cs2 = append(cs2, c) + } + return cs2 +} + +// ClosePeer connections to peer +func (pn *peernet) ClosePeer(p peer.ID) error { + pn.RLock() + cs, found := pn.connsByPeer[p] + pn.RUnlock() + if !found { + return nil + } + + for c := range cs { + c.Close() + } + return nil +} + +// BandwidthTotals returns the total amount of bandwidth transferred +func (pn *peernet) BandwidthTotals() (in uint64, out uint64) { + // need to implement this. probably best to do it in swarm this time. + // need a "metrics" object + return 0, 0 +} + +// ListenAddresses returns a list of addresses at which this network listens. +func (pn *peernet) ListenAddresses() []ma.Multiaddr { + return pn.Peerstore().Addresses(pn.LocalPeer()) +} + +// InterfaceListenAddresses returns a list of addresses at which this network +// listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to +// use the known local interfaces. +func (pn *peernet) InterfaceListenAddresses() ([]ma.Multiaddr, error) { + return pn.ListenAddresses(), nil +} + +// Connectedness returns a state signaling connection capabilities +// For now only returns Connecter || NotConnected. Expand into more later. +func (pn *peernet) Connectedness(p peer.ID) inet.Connectedness { + pn.Lock() + defer pn.Unlock() + + cs, found := pn.connsByPeer[p] + if found && len(cs) > 0 { + return inet.Connected + } + return inet.NotConnected +} + +// NewStream returns a new stream to given peer p. +// If there is no connection to p, attempts to create one. +func (pn *peernet) NewStream(p peer.ID) (inet.Stream, error) { + pn.Lock() + cs, found := pn.connsByPeer[p] + if !found || len(cs) < 1 { + pn.Unlock() + return nil, fmt.Errorf("no connection to peer") + } + pn.Unlock() + + // if many conns are found, how do we select? for now, randomly... + // this would be an interesting place to test logic that can measure + // links (network interfaces) and select properly + n := rand.Intn(len(cs)) + var c *conn + for c = range cs { + if n == 0 { + break + } + n-- + } + + return c.NewStream() +} + +// SetStreamHandler sets the new stream handler on the Network. +// This operation is threadsafe. +func (pn *peernet) SetStreamHandler(h inet.StreamHandler) { + pn.Lock() + pn.streamHandler = h + pn.Unlock() +} + +// SetConnHandler sets the new conn handler on the Network. +// This operation is threadsafe. +func (pn *peernet) SetConnHandler(h inet.ConnHandler) { + pn.Lock() + pn.connHandler = h + pn.Unlock() +} diff --git a/p2p/net2/mock/mock_printer.go b/p2p/net2/mock/mock_printer.go new file mode 100644 index 000000000..151b8d3d4 --- /dev/null +++ b/p2p/net2/mock/mock_printer.go @@ -0,0 +1,36 @@ +package mocknet + +import ( + "fmt" + "io" + + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" +) + +// separate object so our interfaces are separate :) +type printer struct { + w io.Writer +} + +func (p *printer) MocknetLinks(mn Mocknet) { + links := mn.Links() + + fmt.Fprintf(p.w, "Mocknet link map:\n") + for p1, lm := range links { + fmt.Fprintf(p.w, "\t%s linked to:\n", peer.ID(p1)) + for p2, l := range lm { + fmt.Fprintf(p.w, "\t\t%s (%d links)\n", peer.ID(p2), len(l)) + } + } + fmt.Fprintf(p.w, "\n") +} + +func (p *printer) NetworkConns(ni inet.Network) { + + fmt.Fprintf(p.w, "%s connected to:\n", ni.LocalPeer()) + for _, c := range ni.Conns() { + fmt.Fprintf(p.w, "\t%s (addr: %s)\n", c.RemotePeer(), c.RemoteMultiaddr()) + } + fmt.Fprintf(p.w, "\n") +} diff --git a/p2p/net2/mock/mock_stream.go b/p2p/net2/mock/mock_stream.go new file mode 100644 index 000000000..317abbafd --- /dev/null +++ b/p2p/net2/mock/mock_stream.go @@ -0,0 +1,29 @@ +package mocknet + +import ( + "io" + + inet "github.com/jbenet/go-ipfs/p2p/net2" +) + +// stream implements inet.Stream +type stream struct { + io.Reader + io.Writer + conn *conn +} + +func (s *stream) Close() error { + s.conn.removeStream(s) + if r, ok := (s.Reader).(io.Closer); ok { + r.Close() + } + if w, ok := (s.Writer).(io.Closer); ok { + return w.Close() + } + return nil +} + +func (s *stream) Conn() inet.Conn { + return s.conn +} diff --git a/p2p/net2/mock/mock_test.go b/p2p/net2/mock/mock_test.go new file mode 100644 index 000000000..e492a9124 --- /dev/null +++ b/p2p/net2/mock/mock_test.go @@ -0,0 +1,460 @@ +package mocknet + +import ( + "bytes" + "io" + "math/rand" + "sync" + "testing" + + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + testutil "github.com/jbenet/go-ipfs/util/testutil" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +func randPeer(t *testing.T) peer.ID { + p, err := testutil.RandPeerID() + if err != nil { + t.Fatal(err) + } + return p +} + +func TestNetworkSetup(t *testing.T) { + + ctx := context.Background() + sk1, _, err := testutil.RandKeyPair(512) + if err != nil { + t.Fatal(t) + } + sk2, _, err := testutil.RandKeyPair(512) + if err != nil { + t.Fatal(t) + } + sk3, _, err := testutil.RandKeyPair(512) + if err != nil { + t.Fatal(t) + } + mn := New(ctx) + // peers := []peer.ID{p1, p2, p3} + + // add peers to mock net + + a1 := testutil.RandLocalTCPAddress() + a2 := testutil.RandLocalTCPAddress() + a3 := testutil.RandLocalTCPAddress() + + n1, err := mn.AddPeer(sk1, a1) + if err != nil { + t.Fatal(err) + } + p1 := n1.LocalPeer() + + n2, err := mn.AddPeer(sk2, a2) + if err != nil { + t.Fatal(err) + } + p2 := n2.LocalPeer() + + n3, err := mn.AddPeer(sk3, a3) + if err != nil { + t.Fatal(err) + } + p3 := n3.LocalPeer() + + // check peers and net + if mn.Net(p1) != n1 { + t.Error("net for p1.ID != n1") + } + if mn.Net(p2) != n2 { + t.Error("net for p2.ID != n1") + } + if mn.Net(p3) != n3 { + t.Error("net for p3.ID != n1") + } + + // link p1<-->p2, p1<-->p1, p2<-->p3, p3<-->p2 + + l12, err := mn.LinkPeers(p1, p2) + if err != nil { + t.Fatal(err) + } + if !(l12.Networks()[0] == n1 && l12.Networks()[1] == n2) && + !(l12.Networks()[0] == n2 && l12.Networks()[1] == n1) { + t.Error("l12 networks incorrect") + } + + l11, err := mn.LinkPeers(p1, p1) + if err != nil { + t.Fatal(err) + } + if !(l11.Networks()[0] == n1 && l11.Networks()[1] == n1) { + t.Error("l11 networks incorrect") + } + + l23, err := mn.LinkPeers(p2, p3) + if err != nil { + t.Fatal(err) + } + if !(l23.Networks()[0] == n2 && l23.Networks()[1] == n3) && + !(l23.Networks()[0] == n3 && l23.Networks()[1] == n2) { + t.Error("l23 networks incorrect") + } + + l32, err := mn.LinkPeers(p3, p2) + if err != nil { + t.Fatal(err) + } + if !(l32.Networks()[0] == n2 && l32.Networks()[1] == n3) && + !(l32.Networks()[0] == n3 && l32.Networks()[1] == n2) { + t.Error("l32 networks incorrect") + } + + // check things + + links12 := mn.LinksBetweenPeers(p1, p2) + if len(links12) != 1 { + t.Errorf("should be 1 link bt. p1 and p2 (found %d)", len(links12)) + } + if links12[0] != l12 { + t.Error("links 1-2 should be l12.") + } + + links11 := mn.LinksBetweenPeers(p1, p1) + if len(links11) != 1 { + t.Errorf("should be 1 link bt. p1 and p1 (found %d)", len(links11)) + } + if links11[0] != l11 { + t.Error("links 1-1 should be l11.") + } + + links23 := mn.LinksBetweenPeers(p2, p3) + if len(links23) != 2 { + t.Errorf("should be 2 link bt. p2 and p3 (found %d)", len(links23)) + } + if !((links23[0] == l23 && links23[1] == l32) || + (links23[0] == l32 && links23[1] == l23)) { + t.Error("links 2-3 should be l23 and l32.") + } + + // unlinking + + if err := mn.UnlinkPeers(p2, p1); err != nil { + t.Error(err) + } + + // check only one link affected: + + links12 = mn.LinksBetweenPeers(p1, p2) + if len(links12) != 0 { + t.Errorf("should be 0 now...", len(links12)) + } + + links11 = mn.LinksBetweenPeers(p1, p1) + if len(links11) != 1 { + t.Errorf("should be 1 link bt. p1 and p1 (found %d)", len(links11)) + } + if links11[0] != l11 { + t.Error("links 1-1 should be l11.") + } + + links23 = mn.LinksBetweenPeers(p2, p3) + if len(links23) != 2 { + t.Errorf("should be 2 link bt. p2 and p3 (found %d)", len(links23)) + } + if !((links23[0] == l23 && links23[1] == l32) || + (links23[0] == l32 && links23[1] == l23)) { + t.Error("links 2-3 should be l23 and l32.") + } + + // check connecting + + // first, no conns + if len(n2.Conns()) > 0 || len(n3.Conns()) > 0 { + t.Error("should have 0 conn. Got: (%d, %d)", len(n2.Conns()), len(n3.Conns())) + } + + // connect p2->p3 + if _, err := n2.DialPeer(ctx, p3); err != nil { + t.Error(err) + } + + if len(n2.Conns()) != 1 || len(n3.Conns()) != 1 { + t.Errorf("should have (1,1) conn. Got: (%d, %d)", len(n2.Conns()), len(n3.Conns())) + } + + // p := PrinterTo(os.Stdout) + // p.NetworkConns(n1) + // p.NetworkConns(n2) + // p.NetworkConns(n3) + + // can create a stream 2->3, 3->2, + if _, err := n2.NewStream(p3); err != nil { + t.Error(err) + } + if _, err := n3.NewStream(p2); err != nil { + t.Error(err) + } + + // but not 1->2 nor 2->2 (not linked), nor 1->1 (not connected) + if _, err := n1.NewStream(p2); err == nil { + t.Error("should not be able to connect") + } + if _, err := n2.NewStream(p2); err == nil { + t.Error("should not be able to connect") + } + if _, err := n1.NewStream(p1); err == nil { + t.Error("should not be able to connect") + } + + // connect p1->p1 (should work) + if _, err := n1.DialPeer(ctx, p1); err != nil { + t.Error("p1 should be able to dial self.", err) + } + + // and a stream too + if _, err := n1.NewStream(p1); err != nil { + t.Error(err) + } + + // connect p1->p2 + if _, err := n1.DialPeer(ctx, p2); err == nil { + t.Error("p1 should not be able to dial p2, not connected...") + } + + // connect p3->p1 + if _, err := n3.DialPeer(ctx, p1); err == nil { + t.Error("p3 should not be able to dial p1, not connected...") + } + + // relink p1->p2 + + l12, err = mn.LinkPeers(p1, p2) + if err != nil { + t.Fatal(err) + } + if !(l12.Networks()[0] == n1 && l12.Networks()[1] == n2) && + !(l12.Networks()[0] == n2 && l12.Networks()[1] == n1) { + t.Error("l12 networks incorrect") + } + + // should now be able to connect + + // connect p1->p2 + if _, err := n1.DialPeer(ctx, p2); err != nil { + t.Error(err) + } + + // and a stream should work now too :) + if _, err := n2.NewStream(p3); err != nil { + t.Error(err) + } + +} + +func TestStreams(t *testing.T) { + + mn, err := FullMeshConnected(context.Background(), 3) + if err != nil { + t.Fatal(err) + } + + handler := func(s inet.Stream) { + b := make([]byte, 4) + if _, err := io.ReadFull(s, b); err != nil { + panic(err) + } + if !bytes.Equal(b, []byte("beep")) { + panic("bytes mismatch") + } + if _, err := s.Write([]byte("boop")); err != nil { + panic(err) + } + s.Close() + } + + nets := mn.Nets() + for _, n := range nets { + n.SetStreamHandler(handler) + } + + s, err := nets[0].NewStream(nets[1].LocalPeer()) + if err != nil { + t.Fatal(err) + } + + if _, err := s.Write([]byte("beep")); err != nil { + panic(err) + } + b := make([]byte, 4) + if _, err := io.ReadFull(s, b); err != nil { + panic(err) + } + if !bytes.Equal(b, []byte("boop")) { + panic("bytes mismatch 2") + } + +} + +func makePinger(st string, n int) func(inet.Stream) { + return func(s inet.Stream) { + go func() { + defer s.Close() + + for i := 0; i < n; i++ { + b := make([]byte, 4+len(st)) + if _, err := s.Write([]byte("ping" + st)); err != nil { + panic(err) + } + if _, err := io.ReadFull(s, b); err != nil { + panic(err) + } + if !bytes.Equal(b, []byte("pong"+st)) { + panic("bytes mismatch") + } + } + }() + } +} + +func makePonger(st string) func(inet.Stream) { + return func(s inet.Stream) { + go func() { + defer s.Close() + + for { + b := make([]byte, 4+len(st)) + if _, err := io.ReadFull(s, b); err != nil { + if err == io.EOF { + return + } + panic(err) + } + if !bytes.Equal(b, []byte("ping"+st)) { + panic("bytes mismatch") + } + if _, err := s.Write([]byte("pong" + st)); err != nil { + panic(err) + } + } + }() + } +} + +func TestStreamsStress(t *testing.T) { + + mn, err := FullMeshConnected(context.Background(), 100) + if err != nil { + t.Fatal(err) + } + + nets := mn.Nets() + for _, n := range nets { + n.SetStreamHandler(makePonger("pingpong")) + } + + var wg sync.WaitGroup + for i := 0; i < 1000; i++ { + wg.Add(1) + go func(i int) { + defer wg.Done() + from := rand.Intn(len(nets)) + to := rand.Intn(len(nets)) + s, err := nets[from].NewStream(nets[to].LocalPeer()) + if err != nil { + log.Debugf("%d (%s) %d (%s)", from, nets[from], to, nets[to]) + panic(err) + } + + log.Infof("%d start pinging", i) + makePinger("pingpong", rand.Intn(100))(s) + log.Infof("%d done pinging", i) + }(i) + } + + wg.Wait() +} + +func TestAdding(t *testing.T) { + + mn := New(context.Background()) + + peers := []peer.ID{} + for i := 0; i < 3; i++ { + sk, _, err := testutil.RandKeyPair(512) + if err != nil { + t.Fatal(err) + } + + a := testutil.RandLocalTCPAddress() + n, err := mn.AddPeer(sk, a) + if err != nil { + t.Fatal(err) + } + + peers = append(peers, n.LocalPeer()) + } + + p1 := peers[0] + p2 := peers[1] + + // link them + for _, p1 := range peers { + for _, p2 := range peers { + if _, err := mn.LinkPeers(p1, p2); err != nil { + t.Error(err) + } + } + } + + // set the new stream handler on p2 + n2 := mn.Net(p2) + if n2 == nil { + t.Fatalf("no network for %s", p2) + } + n2.SetStreamHandler(func(s inet.Stream) { + defer s.Close() + + b := make([]byte, 4) + if _, err := io.ReadFull(s, b); err != nil { + panic(err) + } + if string(b) != "beep" { + panic("did not beep!") + } + + if _, err := s.Write([]byte("boop")); err != nil { + panic(err) + } + }) + + // connect p1 to p2 + if _, err := mn.ConnectPeers(p1, p2); err != nil { + t.Fatal(err) + } + + // talk to p2 + n1 := mn.Net(p1) + if n1 == nil { + t.Fatalf("no network for %s", p1) + } + + s, err := n1.NewStream(p2) + if err != nil { + t.Fatal(err) + } + + if _, err := s.Write([]byte("beep")); err != nil { + t.Error(err) + } + b := make([]byte, 4) + if _, err := io.ReadFull(s, b); err != nil { + t.Error(err) + } + if !bytes.Equal(b, []byte("boop")) { + t.Error("bytes mismatch 2") + } + +} diff --git a/p2p/net2/swarm/addr.go b/p2p/net2/swarm/addr.go new file mode 100644 index 000000000..01cb39717 --- /dev/null +++ b/p2p/net2/swarm/addr.go @@ -0,0 +1,124 @@ +package swarm + +import ( + conn "github.com/jbenet/go-ipfs/p2p/net/conn" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" +) + +// ListenAddresses returns a list of addresses at which this swarm listens. +func (s *Swarm) ListenAddresses() []ma.Multiaddr { + listeners := s.swarm.Listeners() + addrs := make([]ma.Multiaddr, 0, len(listeners)) + for _, l := range listeners { + if l2, ok := l.NetListener().(conn.Listener); ok { + addrs = append(addrs, l2.Multiaddr()) + } + } + return addrs +} + +// InterfaceListenAddresses returns a list of addresses at which this swarm +// listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to +// use the known local interfaces. +func InterfaceListenAddresses(s *Swarm) ([]ma.Multiaddr, error) { + return resolveUnspecifiedAddresses(s.ListenAddresses()) +} + +// resolveUnspecifiedAddresses expands unspecified ip addresses (/ip4/0.0.0.0, /ip6/::) to +// use the known local interfaces. +func resolveUnspecifiedAddresses(unspecifiedAddrs []ma.Multiaddr) ([]ma.Multiaddr, error) { + var outputAddrs []ma.Multiaddr + + // todo optimize: only fetch these if we have a "any" addr. + ifaceAddrs, err := interfaceAddresses() + if err != nil { + return nil, err + } + + for _, a := range unspecifiedAddrs { + + // split address into its components + split := ma.Split(a) + + // if first component (ip) is not unspecified, use it as is. + if !manet.IsIPUnspecified(split[0]) { + outputAddrs = append(outputAddrs, a) + continue + } + + // unspecified? add one address per interface. + for _, ia := range ifaceAddrs { + split[0] = ia + joined := ma.Join(split...) + outputAddrs = append(outputAddrs, joined) + } + } + + log.Event(context.TODO(), "interfaceListenAddresses", func() eventlog.Loggable { + var addrs []string + for _, addr := range outputAddrs { + addrs = append(addrs, addr.String()) + } + return eventlog.Metadata{"addresses": addrs} + }()) + log.Debug("InterfaceListenAddresses:", outputAddrs) + return outputAddrs, nil +} + +// interfaceAddresses returns a list of addresses associated with local machine +func interfaceAddresses() ([]ma.Multiaddr, error) { + maddrs, err := manet.InterfaceMultiaddrs() + if err != nil { + return nil, err + } + + var nonLoopback []ma.Multiaddr + for _, a := range maddrs { + if !manet.IsIPLoopback(a) { + nonLoopback = append(nonLoopback, a) + } + } + + return nonLoopback, nil +} + +// addrInList returns whether or not an address is part of a list. +// this is useful to check if NAT is happening (or other bugs?) +func addrInList(addr ma.Multiaddr, list []ma.Multiaddr) bool { + for _, addr2 := range list { + if addr.Equal(addr2) { + return true + } + } + return false +} + +// checkNATWarning checks if our observed addresses differ. if so, +// informs the user that certain things might not work yet +func checkNATWarning(s *Swarm, observed ma.Multiaddr, expected ma.Multiaddr) { + if observed.Equal(expected) { + return + } + + listen, err := InterfaceListenAddresses(s) + if err != nil { + log.Errorf("Error retrieving swarm.InterfaceListenAddresses: %s", err) + return + } + + if !addrInList(observed, listen) { // probably a nat + log.Warningf(natWarning, observed, listen) + } +} + +const natWarning = `Remote peer observed our address to be: %s +The local addresses are: %s +Thus, connection is going through NAT, and other connections may fail. + +IPFS NAT traversal is still under development. Please bug us on github or irc to fix this. +Baby steps: http://jbenet.static.s3.amazonaws.com/271dfcf/baby-steps.gif +` diff --git a/p2p/net2/swarm/simul_test.go b/p2p/net2/swarm/simul_test.go new file mode 100644 index 000000000..b61f3f03c --- /dev/null +++ b/p2p/net2/swarm/simul_test.go @@ -0,0 +1,66 @@ +package swarm + +import ( + "sync" + "testing" + "time" + + peer "github.com/jbenet/go-ipfs/p2p/peer" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +) + +func TestSimultOpen(t *testing.T) { + // t.Skip("skipping for another test") + + ctx := context.Background() + swarms, peers := makeSwarms(ctx, t, 2) + + // connect everyone + { + var wg sync.WaitGroup + connect := func(s *Swarm, dst peer.ID, addr ma.Multiaddr) { + // copy for other peer + s.peers.AddAddress(dst, addr) + if _, err := s.Dial(ctx, dst); err != nil { + t.Fatal("error swarm dialing to peer", err) + } + wg.Done() + } + + log.Info("Connecting swarms simultaneously.") + wg.Add(2) + go connect(swarms[0], swarms[1].local, peers[1].Addr) + go connect(swarms[1], swarms[0].local, peers[0].Addr) + wg.Wait() + } + + for _, s := range swarms { + s.Close() + } +} + +func TestSimultOpenMany(t *testing.T) { + // t.Skip("very very slow") + + addrs := 20 + SubtestSwarm(t, addrs, 10) +} + +func TestSimultOpenFewStress(t *testing.T) { + if testing.Short() { + t.SkipNow() + } + // t.Skip("skipping for another test") + + msgs := 40 + swarms := 2 + rounds := 10 + // rounds := 100 + + for i := 0; i < rounds; i++ { + SubtestSwarm(t, swarms, msgs) + <-time.After(10 * time.Millisecond) + } +} diff --git a/p2p/net2/swarm/swarm.go b/p2p/net2/swarm/swarm.go new file mode 100644 index 000000000..74201f4f0 --- /dev/null +++ b/p2p/net2/swarm/swarm.go @@ -0,0 +1,158 @@ +// package swarm implements a connection muxer with a pair of channels +// to synchronize all network communication. +package swarm + +import ( + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + ps "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-peerstream" +) + +var log = eventlog.Logger("swarm2") + +// Swarm is a connection muxer, allowing connections to other peers to +// be opened and closed, while still using the same Chan for all +// communication. The Chan sends/receives Messages, which note the +// destination or source Peer. +// +// Uses peerstream.Swarm +type Swarm struct { + swarm *ps.Swarm + local peer.ID + peers peer.Peerstore + connh ConnHandler + + cg ctxgroup.ContextGroup +} + +// NewSwarm constructs a Swarm, with a Chan. +func NewSwarm(ctx context.Context, listenAddrs []ma.Multiaddr, + local peer.ID, peers peer.Peerstore) (*Swarm, error) { + + s := &Swarm{ + swarm: ps.NewSwarm(), + local: local, + peers: peers, + cg: ctxgroup.WithContext(ctx), + } + + // configure Swarm + s.cg.SetTeardown(s.teardown) + s.SetConnHandler(nil) // make sure to setup our own conn handler. + + return s, s.listen(listenAddrs) +} + +func (s *Swarm) teardown() error { + return s.swarm.Close() +} + +// CtxGroup returns the Context Group of the swarm +func (s *Swarm) CtxGroup() ctxgroup.ContextGroup { + return s.cg +} + +// Close stops the Swarm. +func (s *Swarm) Close() error { + return s.cg.Close() +} + +// StreamSwarm returns the underlying peerstream.Swarm +func (s *Swarm) StreamSwarm() *ps.Swarm { + return s.swarm +} + +// SetConnHandler assigns the handler for new connections. +// See peerstream. You will rarely use this. See SetStreamHandler +func (s *Swarm) SetConnHandler(handler ConnHandler) { + + // handler is nil if user wants to clear the old handler. + if handler == nil { + s.swarm.SetConnHandler(func(psconn *ps.Conn) { + s.connHandler(psconn) + }) + return + } + + s.swarm.SetConnHandler(func(psconn *ps.Conn) { + // sc is nil if closed in our handler. + if sc := s.connHandler(psconn); sc != nil { + // call the user's handler. in a goroutine for sync safety. + go handler(sc) + } + }) +} + +// SetStreamHandler assigns the handler for new streams. +// See peerstream. +func (s *Swarm) SetStreamHandler(handler inet.StreamHandler) { + s.swarm.SetStreamHandler(func(s *ps.Stream) { + handler(wrapStream(s)) + }) +} + +// NewStreamWithPeer creates a new stream on any available connection to p +func (s *Swarm) NewStreamWithPeer(p peer.ID) (*Stream, error) { + // if we have no connections, try connecting. + if len(s.ConnectionsToPeer(p)) == 0 { + log.Debug("Swarm: NewStreamWithPeer no connections. Attempting to connect...") + if _, err := s.Dial(context.Background(), p); err != nil { + return nil, err + } + } + log.Debug("Swarm: NewStreamWithPeer...") + + st, err := s.swarm.NewStreamWithGroup(p) + return wrapStream(st), err +} + +// StreamsWithPeer returns all the live Streams to p +func (s *Swarm) StreamsWithPeer(p peer.ID) []*Stream { + return wrapStreams(ps.StreamsWithGroup(p, s.swarm.Streams())) +} + +// ConnectionsToPeer returns all the live connections to p +func (s *Swarm) ConnectionsToPeer(p peer.ID) []*Conn { + return wrapConns(ps.ConnsWithGroup(p, s.swarm.Conns())) +} + +// Connections returns a slice of all connections. +func (s *Swarm) Connections() []*Conn { + return wrapConns(s.swarm.Conns()) +} + +// CloseConnection removes a given peer from swarm + closes the connection +func (s *Swarm) CloseConnection(p peer.ID) error { + conns := s.swarm.ConnsWithGroup(p) // boom. + for _, c := range conns { + c.Close() + } + return nil +} + +// Peers returns a copy of the set of peers swarm is connected to. +func (s *Swarm) Peers() []peer.ID { + conns := s.Connections() + + seen := make(map[peer.ID]struct{}) + peers := make([]peer.ID, 0, len(conns)) + for _, c := range conns { + p := c.RemotePeer() + if _, found := seen[p]; found { + continue + } + + peers = append(peers, p) + } + return peers +} + +// LocalPeer returns the local peer swarm is associated to. +func (s *Swarm) LocalPeer() peer.ID { + return s.local +} diff --git a/p2p/net2/swarm/swarm_conn.go b/p2p/net2/swarm/swarm_conn.go new file mode 100644 index 000000000..dd00a89ba --- /dev/null +++ b/p2p/net2/swarm/swarm_conn.go @@ -0,0 +1,141 @@ +package swarm + +import ( + "fmt" + + ic "github.com/jbenet/go-ipfs/p2p/crypto" + conn "github.com/jbenet/go-ipfs/p2p/net/conn" + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + ps "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-peerstream" +) + +// a Conn is a simple wrapper around a ps.Conn that also exposes +// some of the methods from the underlying conn.Conn. +// There's **five** "layers" to each connection: +// * 0. the net.Conn - underlying net.Conn (TCP/UDP/UTP/etc) +// * 1. the manet.Conn - provides multiaddr friendly Conn +// * 2. the conn.Conn - provides Peer friendly Conn (inc Secure channel) +// * 3. the peerstream.Conn - provides peerstream / spdysptream happiness +// * 4. the Conn - abstracts everyting out, exposing only key parts of underlying layers +// (I know, this is kinda crazy. it's more historical than a good design. though the +// layers do build up pieces of functionality. and they're all just io.RW :) ) +type Conn ps.Conn + +// ConnHandler is called when new conns are opened from remote peers. +// See peerstream.ConnHandler +type ConnHandler func(*Conn) + +func (c *Conn) StreamConn() *ps.Conn { + return (*ps.Conn)(c) +} + +func (c *Conn) RawConn() conn.Conn { + // righly panic if these things aren't true. it is an expected + // invariant that these Conns are all of the typewe expect: + // ps.Conn wrapping a conn.Conn + // if we get something else it is programmer error. + return (*ps.Conn)(c).NetConn().(conn.Conn) +} + +func (c *Conn) String() string { + return fmt.Sprintf("", c.RawConn()) +} + +// LocalMultiaddr is the Multiaddr on this side +func (c *Conn) LocalMultiaddr() ma.Multiaddr { + return c.RawConn().LocalMultiaddr() +} + +// LocalPeer is the Peer on our side of the connection +func (c *Conn) LocalPeer() peer.ID { + return c.RawConn().LocalPeer() +} + +// RemoteMultiaddr is the Multiaddr on the remote side +func (c *Conn) RemoteMultiaddr() ma.Multiaddr { + return c.RawConn().RemoteMultiaddr() +} + +// RemotePeer is the Peer on the remote side +func (c *Conn) RemotePeer() peer.ID { + return c.RawConn().RemotePeer() +} + +// LocalPrivateKey is the public key of the peer on this side +func (c *Conn) LocalPrivateKey() ic.PrivKey { + return c.RawConn().LocalPrivateKey() +} + +// RemotePublicKey is the public key of the peer on the remote side +func (c *Conn) RemotePublicKey() ic.PubKey { + return c.RawConn().RemotePublicKey() +} + +// NewSwarmStream returns a new Stream from this connection +func (c *Conn) NewSwarmStream() (*Stream, error) { + s, err := c.StreamConn().NewStream() + return wrapStream(s), err +} + +// NewStream returns a new Stream from this connection +func (c *Conn) NewStream() (inet.Stream, error) { + s, err := c.NewSwarmStream() + return inet.Stream(s), err +} + +func (c *Conn) Close() error { + return c.StreamConn().Close() +} + +func wrapConn(psc *ps.Conn) (*Conn, error) { + // grab the underlying connection. + if _, ok := psc.NetConn().(conn.Conn); !ok { + // this should never happen. if we see it ocurring it means that we added + // a Listener to the ps.Swarm that is NOT one of our net/conn.Listener. + return nil, fmt.Errorf("swarm connHandler: invalid conn (not a conn.Conn): %s", psc) + } + return (*Conn)(psc), nil +} + +// wrapConns returns a *Conn for all these ps.Conns +func wrapConns(conns1 []*ps.Conn) []*Conn { + conns2 := make([]*Conn, len(conns1)) + for i, c1 := range conns1 { + if c2, err := wrapConn(c1); err == nil { + conns2[i] = c2 + } + } + return conns2 +} + +// newConnSetup does the swarm's "setup" for a connection. returns the underlying +// conn.Conn this method is used by both swarm.Dial and ps.Swarm connHandler +func (s *Swarm) newConnSetup(ctx context.Context, psConn *ps.Conn) (*Conn, error) { + + // wrap with a Conn + sc, err := wrapConn(psConn) + if err != nil { + return nil, err + } + + // if we have a public key, make sure we add it to our peerstore! + // This is an important detail. Otherwise we must fetch the public + // key from the DHT or some other system. + if pk := sc.RemotePublicKey(); pk != nil { + s.peers.AddPubKey(sc.RemotePeer(), pk) + } + + // ok great! we can use it. add it to our group. + + // set the RemotePeer as a group on the conn. this lets us group + // connections in the StreamSwarm by peer, and get a streams from + // any available connection in the group (better multiconn): + // swarm.StreamSwarm().NewStreamWithGroup(remotePeer) + psConn.AddGroup(sc.RemotePeer()) + + return sc, nil +} diff --git a/p2p/net2/swarm/swarm_dial.go b/p2p/net2/swarm/swarm_dial.go new file mode 100644 index 000000000..dde967fbc --- /dev/null +++ b/p2p/net2/swarm/swarm_dial.go @@ -0,0 +1,104 @@ +package swarm + +import ( + "errors" + "fmt" + + conn "github.com/jbenet/go-ipfs/p2p/net/conn" + peer "github.com/jbenet/go-ipfs/p2p/peer" + lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +// Dial connects to a peer. +// +// The idea is that the client of Swarm does not need to know what network +// the connection will happen over. Swarm can use whichever it choses. +// This allows us to use various transport protocols, do NAT traversal/relay, +// etc. to achive connection. +func (s *Swarm) Dial(ctx context.Context, p peer.ID) (*Conn, error) { + + if p == s.local { + return nil, errors.New("Attempted connection to self!") + } + + // check if we already have an open connection first + cs := s.ConnectionsToPeer(p) + for _, c := range cs { + if c != nil { // dump out the first one we find + return c, nil + } + } + + sk := s.peers.PrivKey(s.local) + if sk == nil { + // may be fine for sk to be nil, just log a warning. + log.Warning("Dial not given PrivateKey, so WILL NOT SECURE conn.") + } + + remoteAddrs := s.peers.Addresses(p) + if len(remoteAddrs) == 0 { + return nil, errors.New("peer has no addresses") + } + localAddrs := s.peers.Addresses(s.local) + if len(localAddrs) == 0 { + log.Debug("Dialing out with no local addresses.") + } + + // open connection to peer + d := &conn.Dialer{ + LocalPeer: s.local, + LocalAddrs: localAddrs, + PrivateKey: sk, + } + + // try to connect to one of the peer's known addresses. + // for simplicity, we do this sequentially. + // A future commit will do this asynchronously. + var connC conn.Conn + var err error + for _, addr := range remoteAddrs { + connC, err = d.Dial(ctx, addr, p) + if err == nil { + break + } + } + if err != nil { + return nil, err + } + + // ok try to setup the new connection. + swarmC, err := dialConnSetup(ctx, s, connC) + if err != nil { + log.Error("Dial newConnSetup failed. disconnecting.") + log.Event(ctx, "dialFailureDisconnect", lgbl.NetConn(connC), lgbl.Error(err)) + swarmC.Close() // close the connection. didn't work out :( + return nil, err + } + + log.Event(ctx, "dial", p) + return swarmC, nil +} + +// dialConnSetup is the setup logic for a connection from the dial side. it +// needs to add the Conn to the StreamSwarm, then run newConnSetup +func dialConnSetup(ctx context.Context, s *Swarm, connC conn.Conn) (*Conn, error) { + + psC, err := s.swarm.AddConn(connC) + if err != nil { + // connC is closed by caller if we fail. + return nil, fmt.Errorf("failed to add conn to ps.Swarm: %s", err) + } + + // ok try to setup the new connection. (newConnSetup will add to group) + swarmC, err := s.newConnSetup(ctx, psC) + if err != nil { + log.Error("Dial newConnSetup failed. disconnecting.") + log.Event(ctx, "dialFailureDisconnect", lgbl.NetConn(connC), lgbl.Error(err)) + swarmC.Close() // we need to call this to make sure psC is Closed. + return nil, err + } + + return swarmC, err +} diff --git a/p2p/net2/swarm/swarm_listen.go b/p2p/net2/swarm/swarm_listen.go new file mode 100644 index 000000000..ba0bee2e7 --- /dev/null +++ b/p2p/net2/swarm/swarm_listen.go @@ -0,0 +1,86 @@ +package swarm + +import ( + conn "github.com/jbenet/go-ipfs/p2p/net/conn" + lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + ps "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-peerstream" + multierr "github.com/jbenet/go-ipfs/util/multierr" +) + +// Open listeners for each network the swarm should listen on +func (s *Swarm) listen(addrs []ma.Multiaddr) error { + retErr := multierr.New() + + // listen on every address + for i, addr := range addrs { + err := s.setupListener(addr) + if err != nil { + if retErr.Errors == nil { + retErr.Errors = make([]error, len(addrs)) + } + retErr.Errors[i] = err + log.Errorf("Failed to listen on: %s - %s", addr, err) + } + } + + if retErr.Errors != nil { + return retErr + } + return nil +} + +// Listen for new connections on the given multiaddr +func (s *Swarm) setupListener(maddr ma.Multiaddr) error { + + // TODO rethink how this has to work. (jbenet) + // + // resolved, err := resolveUnspecifiedAddresses([]ma.Multiaddr{maddr}) + // if err != nil { + // return err + // } + // for _, a := range resolved { + // s.peers.AddAddress(s.local, a) + // } + + sk := s.peers.PrivKey(s.local) + if sk == nil { + // may be fine for sk to be nil, just log a warning. + log.Warning("Listener not given PrivateKey, so WILL NOT SECURE conns.") + } + list, err := conn.Listen(s.cg.Context(), maddr, s.local, sk) + if err != nil { + return err + } + + // AddListener to the peerstream Listener. this will begin accepting connections + // and streams! + _, err = s.swarm.AddListener(list) + return err +} + +// connHandler is called by the StreamSwarm whenever a new connection is added +// here we configure it slightly. Note that this is sequential, so if anything +// will take a while do it in a goroutine. +// See https://godoc.org/github.com/jbenet/go-peerstream for more information +func (s *Swarm) connHandler(c *ps.Conn) *Conn { + ctx := context.Background() + // this context is for running the handshake, which -- when receiveing connections + // -- we have no bound on beyond what the transport protocol bounds it at. + // note that setup + the handshake are bounded by underlying io. + // (i.e. if TCP or UDP disconnects (or the swarm closes), we're done. + // Q: why not have a shorter handshake? think about an HTTP server on really slow conns. + // as long as the conn is live (TCP says its online), it tries its best. we follow suit.) + + sc, err := s.newConnSetup(ctx, c) + if err != nil { + log.Error(err) + log.Event(ctx, "newConnHandlerDisconnect", lgbl.NetConn(c.NetConn()), lgbl.Error(err)) + c.Close() // boom. close it. + return nil + } + + return sc +} diff --git a/p2p/net2/swarm/swarm_net.go b/p2p/net2/swarm/swarm_net.go new file mode 100644 index 000000000..eab60a36f --- /dev/null +++ b/p2p/net2/swarm/swarm_net.go @@ -0,0 +1,156 @@ +package swarm + +import ( + "fmt" + + peer "github.com/jbenet/go-ipfs/p2p/peer" + + inet "github.com/jbenet/go-ipfs/p2p/net2" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +) + +// Network implements the inet.Network interface. +// It is simply a swarm, with a few different functions +// to implement inet.Network. +type Network Swarm + +// NewNetwork constructs a new network and starts listening on given addresses. +func NewNetwork(ctx context.Context, listen []ma.Multiaddr, local peer.ID, + peers peer.Peerstore) (*Network, error) { + + s, err := NewSwarm(ctx, listen, local, peers) + if err != nil { + return nil, err + } + + return (*Network)(s), nil +} + +// DialPeer attempts to establish a connection to a given peer. +// Respects the context. +func (n *Network) DialPeer(ctx context.Context, p peer.ID) (inet.Conn, error) { + log.Debugf("[%s] network dialing peer [%s]", n.local, p) + sc, err := n.Swarm().Dial(ctx, p) + if err != nil { + return nil, err + } + + log.Debugf("network for %s finished dialing %s", n.local, p) + return inet.Conn(sc), nil +} + +// CtxGroup returns the network's ContextGroup +func (n *Network) CtxGroup() ctxgroup.ContextGroup { + return n.cg +} + +// Swarm returns the network's peerstream.Swarm +func (n *Network) Swarm() *Swarm { + return (*Swarm)(n) +} + +// LocalPeer the network's LocalPeer +func (n *Network) LocalPeer() peer.ID { + return n.Swarm().LocalPeer() +} + +// Peers returns the connected peers +func (n *Network) Peers() []peer.ID { + return n.Swarm().Peers() +} + +// Peers returns the connected peers +func (n *Network) Peerstore() peer.Peerstore { + return n.Swarm().peers +} + +// Conns returns the connected peers +func (n *Network) Conns() []inet.Conn { + conns1 := n.Swarm().Connections() + out := make([]inet.Conn, len(conns1)) + for i, c := range conns1 { + out[i] = inet.Conn(c) + } + return out +} + +// ConnsToPeer returns the connections in this Netowrk for given peer. +func (n *Network) ConnsToPeer(p peer.ID) []inet.Conn { + conns1 := n.Swarm().ConnectionsToPeer(p) + out := make([]inet.Conn, len(conns1)) + for i, c := range conns1 { + out[i] = inet.Conn(c) + } + return out +} + +// ClosePeer connection to peer +func (n *Network) ClosePeer(p peer.ID) error { + return n.Swarm().CloseConnection(p) +} + +// close is the real teardown function +func (n *Network) close() error { + return n.Swarm().Close() +} + +// Close calls the ContextCloser func +func (n *Network) Close() error { + return n.Swarm().cg.Close() +} + +// ListenAddresses returns a list of addresses at which this network listens. +func (n *Network) ListenAddresses() []ma.Multiaddr { + return n.Swarm().ListenAddresses() +} + +// InterfaceListenAddresses returns a list of addresses at which this network +// listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to +// use the known local interfaces. +func (n *Network) InterfaceListenAddresses() ([]ma.Multiaddr, error) { + return InterfaceListenAddresses(n.Swarm()) +} + +// Connectedness returns a state signaling connection capabilities +// For now only returns Connected || NotConnected. Expand into more later. +func (n *Network) Connectedness(p peer.ID) inet.Connectedness { + c := n.Swarm().ConnectionsToPeer(p) + if c != nil && len(c) > 0 { + return inet.Connected + } + return inet.NotConnected +} + +// NewStream returns a new stream to given peer p. +// If there is no connection to p, attempts to create one. +func (n *Network) NewStream(p peer.ID) (inet.Stream, error) { + log.Debugf("[%s] network opening stream to peer [%s]", n.local, p) + s, err := n.Swarm().NewStreamWithPeer(p) + if err != nil { + return nil, err + } + + return inet.Stream(s), nil +} + +// SetHandler sets the protocol handler on the Network's Muxer. +// This operation is threadsafe. +func (n *Network) SetStreamHandler(h inet.StreamHandler) { + n.Swarm().SetStreamHandler(h) +} + +// SetConnHandler sets the conn handler on the Network. +// This operation is threadsafe. +func (n *Network) SetConnHandler(h inet.ConnHandler) { + n.Swarm().SetConnHandler(func(c *Conn) { + h(inet.Conn(c)) + }) +} + +// String returns a string representation of Network. +func (n *Network) String() string { + return fmt.Sprintf("", n.LocalPeer()) +} diff --git a/p2p/net2/swarm/swarm_net_test.go b/p2p/net2/swarm/swarm_net_test.go new file mode 100644 index 000000000..a0670b691 --- /dev/null +++ b/p2p/net2/swarm/swarm_net_test.go @@ -0,0 +1,78 @@ +package swarm_test + +import ( + "fmt" + "testing" + "time" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + + inet "github.com/jbenet/go-ipfs/p2p/net" + netutil "github.com/jbenet/go-ipfs/p2p/net/swarmnet/util" +) + +// TestConnectednessCorrect starts a few networks, connects a few +// and tests Connectedness value is correct. +func TestConnectednessCorrect(t *testing.T) { + + ctx := context.Background() + + nets := make([]inet.Network, 4) + for i := 0; i < 4; i++ { + nets[i] = netutil.GenNetwork(t, ctx) + } + + // connect 0-1, 0-2, 0-3, 1-2, 2-3 + + dial := func(a, b inet.Network) { + netutil.DivulgeAddresses(b, a) + if err := a.DialPeer(ctx, b.LocalPeer()); err != nil { + t.Fatalf("Failed to dial: %s", err) + } + } + + dial(nets[0], nets[1]) + dial(nets[0], nets[3]) + dial(nets[1], nets[2]) + dial(nets[3], nets[2]) + + // there's something wrong with dial, i think. it's not finishing + // completely. there must be some async stuff. + <-time.After(100 * time.Millisecond) + + // test those connected show up correctly + + // test connected + expectConnectedness(t, nets[0], nets[1], inet.Connected) + expectConnectedness(t, nets[0], nets[3], inet.Connected) + expectConnectedness(t, nets[1], nets[2], inet.Connected) + expectConnectedness(t, nets[3], nets[2], inet.Connected) + + // test not connected + expectConnectedness(t, nets[0], nets[2], inet.NotConnected) + expectConnectedness(t, nets[1], nets[3], inet.NotConnected) + + for _, n := range nets { + n.Close() + } +} + +func expectConnectedness(t *testing.T, a, b inet.Network, expected inet.Connectedness) { + es := "%s is connected to %s, but Connectedness incorrect. %s %s" + if a.Connectedness(b.LocalPeer()) != expected { + t.Errorf(es, a, b, printConns(a), printConns(b)) + } + + // test symmetric case + if b.Connectedness(a.LocalPeer()) != expected { + t.Errorf(es, b, a, printConns(b), printConns(a)) + } +} + +func printConns(n inet.Network) string { + s := fmt.Sprintf("Connections in %s:\n", n) + for _, c := range n.Conns() { + s = s + fmt.Sprintf("- %s\n", c) + } + return s +} diff --git a/p2p/net2/swarm/swarm_stream.go b/p2p/net2/swarm/swarm_stream.go new file mode 100644 index 000000000..82a66e020 --- /dev/null +++ b/p2p/net2/swarm/swarm_stream.go @@ -0,0 +1,59 @@ +package swarm + +import ( + inet "github.com/jbenet/go-ipfs/p2p/net2" + + ps "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-peerstream" +) + +// a Stream is a wrapper around a ps.Stream that exposes a way to get +// our Conn and Swarm (instead of just the ps.Conn and ps.Swarm) +type Stream ps.Stream + +// Stream returns the underlying peerstream.Stream +func (s *Stream) Stream() *ps.Stream { + return (*ps.Stream)(s) +} + +// Conn returns the Conn associated with this Stream, as an inet.Conn +func (s *Stream) Conn() inet.Conn { + return s.SwarmConn() +} + +// SwarmConn returns the Conn associated with this Stream, as a *Conn +func (s *Stream) SwarmConn() *Conn { + return (*Conn)(s.Stream().Conn()) +} + +// Wait waits for the stream to receive a reply. +func (s *Stream) Wait() error { + return s.Stream().Wait() +} + +// Read reads bytes from a stream. +func (s *Stream) Read(p []byte) (n int, err error) { + return s.Stream().Read(p) +} + +// Write writes bytes to a stream, flushing for each call. +func (s *Stream) Write(p []byte) (n int, err error) { + return s.Stream().Write(p) +} + +// Close closes the stream, indicating this side is finished +// with the stream. +func (s *Stream) Close() error { + return s.Stream().Close() +} + +func wrapStream(pss *ps.Stream) *Stream { + return (*Stream)(pss) +} + +func wrapStreams(st []*ps.Stream) []*Stream { + out := make([]*Stream, len(st)) + for i, s := range st { + out[i] = wrapStream(s) + } + return out +} diff --git a/p2p/net2/swarm/swarm_test.go b/p2p/net2/swarm/swarm_test.go new file mode 100644 index 000000000..dfc9ca2d3 --- /dev/null +++ b/p2p/net2/swarm/swarm_test.go @@ -0,0 +1,269 @@ +package swarm + +import ( + "bytes" + "io" + "sync" + "testing" + "time" + + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + errors "github.com/jbenet/go-ipfs/util/debugerror" + testutil "github.com/jbenet/go-ipfs/util/testutil" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +) + +func EchoStreamHandler(stream inet.Stream) { + go func() { + defer stream.Close() + + // pull out the ipfs conn + c := stream.Conn() + log.Debugf("%s ponging to %s", c.LocalPeer(), c.RemotePeer()) + + buf := make([]byte, 4) + + for { + if _, err := stream.Read(buf); err != nil { + if err != io.EOF { + log.Error("ping receive error:", err) + } + return + } + + if !bytes.Equal(buf, []byte("ping")) { + log.Errorf("ping receive error: ping != %s %v", buf, buf) + return + } + + if _, err := stream.Write([]byte("pong")); err != nil { + log.Error("pond send error:", err) + return + } + } + }() +} + +func makeSwarms(ctx context.Context, t *testing.T, num int) ([]*Swarm, []testutil.PeerNetParams) { + swarms := make([]*Swarm, 0, num) + peersnp := make([]testutil.PeerNetParams, 0, num) + + for i := 0; i < num; i++ { + localnp := testutil.RandPeerNetParamsOrFatal(t) + peersnp = append(peersnp, localnp) + + peerstore := peer.NewPeerstore() + peerstore.AddAddress(localnp.ID, localnp.Addr) + peerstore.AddPubKey(localnp.ID, localnp.PubKey) + peerstore.AddPrivKey(localnp.ID, localnp.PrivKey) + + addrs := peerstore.Addresses(localnp.ID) + swarm, err := NewSwarm(ctx, addrs, localnp.ID, peerstore) + if err != nil { + t.Fatal(err) + } + + swarm.SetStreamHandler(EchoStreamHandler) + swarms = append(swarms, swarm) + } + + return swarms, peersnp +} + +func connectSwarms(t *testing.T, ctx context.Context, swarms []*Swarm, peersnp []testutil.PeerNetParams) { + + var wg sync.WaitGroup + connect := func(s *Swarm, dst peer.ID, addr ma.Multiaddr) { + // TODO: make a DialAddr func. + s.peers.AddAddress(dst, addr) + if _, err := s.Dial(ctx, dst); err != nil { + t.Fatal("error swarm dialing to peer", err) + } + wg.Done() + } + + log.Info("Connecting swarms simultaneously.") + for _, s := range swarms { + for _, p := range peersnp { + if p.ID != s.local { // don't connect to self. + wg.Add(1) + connect(s, p.ID, p.Addr) + } + } + } + wg.Wait() + + for _, s := range swarms { + log.Infof("%s swarm routing table: %s", s.local, s.Peers()) + } +} + +func SubtestSwarm(t *testing.T, SwarmNum int, MsgNum int) { + // t.Skip("skipping for another test") + + ctx := context.Background() + swarms, peersnp := makeSwarms(ctx, t, SwarmNum) + + // connect everyone + connectSwarms(t, ctx, swarms, peersnp) + + // ping/pong + for _, s1 := range swarms { + log.Debugf("-------------------------------------------------------") + log.Debugf("%s ping pong round", s1.local) + log.Debugf("-------------------------------------------------------") + + _, cancel := context.WithCancel(ctx) + got := map[peer.ID]int{} + errChan := make(chan error, MsgNum*len(peersnp)) + streamChan := make(chan *Stream, MsgNum) + + // send out "ping" x MsgNum to every peer + go func() { + defer close(streamChan) + + var wg sync.WaitGroup + send := func(p peer.ID) { + defer wg.Done() + + // first, one stream per peer (nice) + stream, err := s1.NewStreamWithPeer(p) + if err != nil { + errChan <- errors.Wrap(err) + return + } + + // send out ping! + for k := 0; k < MsgNum; k++ { // with k messages + msg := "ping" + log.Debugf("%s %s %s (%d)", s1.local, msg, p, k) + stream.Write([]byte(msg)) + } + + // read it later + streamChan <- stream + } + + for _, p := range peersnp { + if p.ID == s1.local { + continue // dont send to self... + } + + wg.Add(1) + go send(p.ID) + } + wg.Wait() + }() + + // receive "pong" x MsgNum from every peer + go func() { + defer close(errChan) + count := 0 + countShouldBe := MsgNum * (len(peersnp) - 1) + for stream := range streamChan { // one per peer + defer stream.Close() + + // get peer on the other side + p := stream.Conn().RemotePeer() + + // receive pings + msgCount := 0 + msg := make([]byte, 4) + for k := 0; k < MsgNum; k++ { // with k messages + + // read from the stream + if _, err := stream.Read(msg); err != nil { + errChan <- errors.Wrap(err) + continue + } + + if string(msg) != "pong" { + errChan <- errors.Errorf("unexpected message: %s", msg) + continue + } + + log.Debugf("%s %s %s (%d)", s1.local, msg, p, k) + msgCount++ + } + + got[p] = msgCount + count += msgCount + } + + if count != countShouldBe { + errChan <- errors.Errorf("count mismatch: %d != %d", count, countShouldBe) + } + }() + + // check any errors (blocks till consumer is done) + for err := range errChan { + if err != nil { + t.Fatal(err.Error()) + } + } + + log.Debugf("%s got pongs", s1.local) + if (len(peersnp) - 1) != len(got) { + t.Errorf("got (%d) less messages than sent (%d).", len(got), len(peersnp)) + } + + for p, n := range got { + if n != MsgNum { + t.Error("peer did not get all msgs", p, n, "/", MsgNum) + } + } + + cancel() + <-time.After(10 * time.Millisecond) + } + + for _, s := range swarms { + s.Close() + } +} + +func TestSwarm(t *testing.T) { + // t.Skip("skipping for another test") + + // msgs := 1000 + msgs := 100 + swarms := 5 + SubtestSwarm(t, swarms, msgs) +} + +func TestConnHandler(t *testing.T) { + // t.Skip("skipping for another test") + + ctx := context.Background() + swarms, peersnp := makeSwarms(ctx, t, 5) + + gotconn := make(chan struct{}, 10) + swarms[0].SetConnHandler(func(conn *Conn) { + gotconn <- struct{}{} + }) + + connectSwarms(t, ctx, swarms, peersnp) + + <-time.After(time.Millisecond) + // should've gotten 5 by now. + + swarms[0].SetConnHandler(nil) + + expect := 4 + for i := 0; i < expect; i++ { + select { + case <-time.After(time.Second): + t.Fatal("failed to get connections") + case <-gotconn: + } + } + + select { + case <-gotconn: + t.Fatalf("should have connected to %d swarms", expect) + default: + } +} From dadb8b775b1fb9ce387e78620f497b214d73dd28 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 1 Jan 2015 10:42:35 -0800 Subject: [PATCH 17/21] host interface + services The separation of work in the p2p pkg is as follows: - net implements the Swarm and connectivity - protocol has muxer and header protocols - host implements protocol muxing + services - identify took over handshake completely! yay. - p2p package works as a whole --- p2p/host/basic/basic_host.go | 149 ++++++++ p2p/host/basic/basic_host_test.go | 63 ++++ p2p/host/host.go | 54 +++ p2p/protocol/identify/id.go | 212 ++++++++++++ p2p/protocol/identify/id_test.go | 106 ++++++ p2p/protocol/identify/pb/Makefile | 11 + p2p/protocol/identify/pb/identify.pb.go | 93 +++++ p2p/protocol/identify/pb/identify.proto | 27 ++ p2p/protocol/relay/relay.go | 156 +++++++++ p2p/protocol/relay/relay_test.go | 303 +++++++++++++++++ p2p/test/backpressure/backpressure.go | 1 + p2p/test/backpressure/backpressure_test.go | 374 +++++++++++++++++++++ p2p/test/util/util.go | 37 ++ 13 files changed, 1586 insertions(+) create mode 100644 p2p/host/basic/basic_host.go create mode 100644 p2p/host/basic/basic_host_test.go create mode 100644 p2p/host/host.go create mode 100644 p2p/protocol/identify/id.go create mode 100644 p2p/protocol/identify/id_test.go create mode 100644 p2p/protocol/identify/pb/Makefile create mode 100644 p2p/protocol/identify/pb/identify.pb.go create mode 100644 p2p/protocol/identify/pb/identify.proto create mode 100644 p2p/protocol/relay/relay.go create mode 100644 p2p/protocol/relay/relay_test.go create mode 100644 p2p/test/backpressure/backpressure.go create mode 100644 p2p/test/backpressure/backpressure_test.go create mode 100644 p2p/test/util/util.go diff --git a/p2p/host/basic/basic_host.go b/p2p/host/basic/basic_host.go new file mode 100644 index 000000000..2f08b157a --- /dev/null +++ b/p2p/host/basic/basic_host.go @@ -0,0 +1,149 @@ +package basichost + +import ( + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + + eventlog "github.com/jbenet/go-ipfs/util/eventlog" + + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" + identify "github.com/jbenet/go-ipfs/p2p/protocol/identify" + relay "github.com/jbenet/go-ipfs/p2p/protocol/relay" +) + +var log = eventlog.Logger("p2p/host/basic") + +type BasicHost struct { + network inet.Network + mux protocol.Mux + ids *identify.IDService + relay *relay.RelayService +} + +// New constructs and sets up a new *BasicHost with given Network +func New(net inet.Network) *BasicHost { + h := &BasicHost{ + network: net, + mux: protocol.Mux{Handlers: protocol.StreamHandlerMap{}}, + } + + // setup host services + h.ids = identify.NewIDService(h) + h.relay = relay.NewRelayService(h, h.Mux().HandleSync) + + net.SetConnHandler(h.newConnHandler) + net.SetStreamHandler(h.newStreamHandler) + + return h +} + +// newConnHandler is the remote-opened conn handler for inet.Network +func (h *BasicHost) newConnHandler(c inet.Conn) { + h.ids.IdentifyConn(c) +} + +// newStreamHandler is the remote-opened stream handler for inet.Network +func (h *BasicHost) newStreamHandler(s inet.Stream) { + h.Mux().Handle(s) +} + +// ID returns the (local) peer.ID associated with this Host +func (h *BasicHost) ID() peer.ID { + return h.Network().LocalPeer() +} + +// Peerstore returns the Host's repository of Peer Addresses and Keys. +func (h *BasicHost) Peerstore() peer.Peerstore { + return h.Network().Peerstore() +} + +// Networks returns the Network interface of the Host +func (h *BasicHost) Network() inet.Network { + return h.network +} + +// Mux returns the Mux multiplexing incoming streams to protocol handlers +func (h *BasicHost) Mux() *protocol.Mux { + return &h.mux +} + +func (h *BasicHost) IDService() *identify.IDService { + return h.ids +} + +// SetStreamHandler sets the protocol handler on the Host's Mux. +// This is equivalent to: +// host.Mux().SetHandler(proto, handler) +// (Threadsafe) +func (h *BasicHost) SetStreamHandler(pid protocol.ID, handler inet.StreamHandler) { + h.Mux().SetHandler(pid, handler) +} + +// NewStream opens a new stream to given peer p, and writes a p2p/protocol +// header with given protocol.ID. If there is no connection to p, attempts +// to create one. If ProtocolID is "", writes no header. +// (Threadsafe) +func (h *BasicHost) NewStream(pid protocol.ID, p peer.ID) (inet.Stream, error) { + s, err := h.Network().NewStream(p) + if err != nil { + return nil, err + } + + if err := protocol.WriteHeader(s, pid); err != nil { + s.Close() + return nil, err + } + + return s, nil +} + +// Connect ensures there is a connection between this host and the peer with +// given peer.ID. Connect will absorb the addresses in pi into its internal +// peerstore. If there is not an active connection, Connect will issue a +// h.Network.Dial, and block until a connection is open, or an error is +// returned. // TODO: Relay + NAT. +func (h *BasicHost) Connect(ctx context.Context, pi peer.PeerInfo) error { + + // absorb addresses into peerstore + h.Peerstore().AddPeerInfo(pi) + + cs := h.Network().ConnsToPeer(pi.ID) + if len(cs) > 0 { + return nil + } + + return h.dialPeer(ctx, pi.ID) +} + +// dialPeer opens a connection to peer, and makes sure to identify +// the connection once it has been opened. +func (h *BasicHost) dialPeer(ctx context.Context, p peer.ID) error { + log.Debugf("host %s dialing %s", h.ID, p) + c, err := h.Network().DialPeer(ctx, p) + if err != nil { + return err + } + + // identify the connection before returning. + done := make(chan struct{}) + go func() { + h.ids.IdentifyConn(c) + close(done) + }() + + // respect don contexteone + select { + case <-done: + case <-ctx.Done(): + return ctx.Err() + } + + log.Debugf("host %s finished dialing %s", h.ID, p) + return nil +} + +// Close shuts down the Host's services (network, etc). +func (h *BasicHost) Close() error { + return h.Network().Close() +} diff --git a/p2p/host/basic/basic_host_test.go b/p2p/host/basic/basic_host_test.go new file mode 100644 index 000000000..992991bec --- /dev/null +++ b/p2p/host/basic/basic_host_test.go @@ -0,0 +1,63 @@ +package basichost_test + +import ( + "bytes" + "io" + "testing" + + inet "github.com/jbenet/go-ipfs/p2p/net2" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" + testutil "github.com/jbenet/go-ipfs/p2p/test/util" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +func TestHostSimple(t *testing.T) { + + ctx := context.Background() + h1 := testutil.GenHostSwarm(t, ctx) + h2 := testutil.GenHostSwarm(t, ctx) + defer h1.Close() + defer h2.Close() + + h2pi := h2.Peerstore().PeerInfo(h2.ID()) + if err := h1.Connect(ctx, h2pi); err != nil { + t.Fatal(err) + } + + piper, pipew := io.Pipe() + h2.SetStreamHandler(protocol.TestingID, func(s inet.Stream) { + defer s.Close() + w := io.MultiWriter(s, pipew) + io.Copy(w, s) // mirror everything + }) + + s, err := h1.NewStream(protocol.TestingID, h2pi.ID) + if err != nil { + t.Fatal(err) + } + + // write to the stream + buf1 := []byte("abcdefghijkl") + if _, err := s.Write(buf1); err != nil { + t.Fatal(err) + } + + // get it from the stream (echoed) + buf2 := make([]byte, len(buf1)) + if _, err := io.ReadFull(s, buf2); err != nil { + t.Fatal(err) + } + if !bytes.Equal(buf1, buf2) { + t.Fatal("buf1 != buf2 -- %x != %x", buf1, buf2) + } + + // get it from the pipe (tee) + buf3 := make([]byte, len(buf1)) + if _, err := io.ReadFull(piper, buf3); err != nil { + t.Fatal(err) + } + if !bytes.Equal(buf1, buf3) { + t.Fatal("buf1 != buf3 -- %x != %x", buf1, buf3) + } +} diff --git a/p2p/host/host.go b/p2p/host/host.go new file mode 100644 index 000000000..944cb1b44 --- /dev/null +++ b/p2p/host/host.go @@ -0,0 +1,54 @@ +package host + +import ( + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + + eventlog "github.com/jbenet/go-ipfs/util/eventlog" + + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" +) + +var log = eventlog.Logger("p2p/host") + +// Host is an object participating in a p2p network, which +// implements protocols or provides services. It handles +// requests like a Server, and issues requests like a Client. +// It is called Host because it is both Server and Client (and Peer +// may be confusing). +type Host interface { + // ID returns the (local) peer.ID associated with this Host + ID() peer.ID + + // Peerstore returns the Host's repository of Peer Addresses and Keys. + Peerstore() peer.Peerstore + + // Networks returns the Network interface of the Host + Network() inet.Network + + // Mux returns the Mux multiplexing incoming streams to protocol handlers + Mux() *protocol.Mux + + // Connect ensures there is a connection between this host and the peer with + // given peer.ID. Connect will absorb the addresses in pi into its internal + // peerstore. If there is not an active connection, Connect will issue a + // h.Network.Dial, and block until a connection is open, or an error is + // returned. // TODO: Relay + NAT. + Connect(ctx context.Context, pi peer.PeerInfo) error + + // SetStreamHandler sets the protocol handler on the Host's Mux. + // This is equivalent to: + // host.Mux().SetHandler(proto, handler) + // (Threadsafe) + SetStreamHandler(pid protocol.ID, handler inet.StreamHandler) + + // NewStream opens a new stream to given peer p, and writes a p2p/protocol + // header with given protocol.ID. If there is no connection to p, attempts + // to create one. If ProtocolID is "", writes no header. + // (Threadsafe) + NewStream(pid protocol.ID, p peer.ID) (inet.Stream, error) + + // Close shuts down the host, its Network, and services. + Close() error +} diff --git a/p2p/protocol/identify/id.go b/p2p/protocol/identify/id.go new file mode 100644 index 000000000..266bcc347 --- /dev/null +++ b/p2p/protocol/identify/id.go @@ -0,0 +1,212 @@ +package identify + +import ( + "fmt" + "sync" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" + semver "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/coreos/go-semver/semver" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + + config "github.com/jbenet/go-ipfs/config" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" + + host "github.com/jbenet/go-ipfs/p2p/host" + inet "github.com/jbenet/go-ipfs/p2p/net2" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" + + pb "github.com/jbenet/go-ipfs/p2p/protocol/identify/pb" +) + +var log = eventlog.Logger("net/identify") + +// ID is the protocol.ID of the Identify Service. +const ID protocol.ID = "/ipfs/identify" + +// IpfsVersion holds the current protocol version for a client running this code +var IpfsVersion *semver.Version +var ClientVersion = "go-ipfs/" + config.CurrentVersionNumber + +func init() { + var err error + IpfsVersion, err = semver.NewVersion("0.0.1") + if err != nil { + panic(fmt.Errorf("invalid protocol version: %v", err)) + } +} + +// IDService is a structure that implements ProtocolIdentify. +// It is a trivial service that gives the other peer some +// useful information about the local peer. A sort of hello. +// +// The IDService sends: +// * Our IPFS Protocol Version +// * Our IPFS Agent Version +// * Our public Listen Addresses +type IDService struct { + Host host.Host + + // connections undergoing identification + // for wait purposes + currid map[inet.Conn]chan struct{} + currmu sync.RWMutex +} + +func NewIDService(h host.Host) *IDService { + s := &IDService{ + Host: h, + currid: make(map[inet.Conn]chan struct{}), + } + h.SetStreamHandler(ID, s.RequestHandler) + return s +} + +func (ids *IDService) IdentifyConn(c inet.Conn) { + ids.currmu.Lock() + if wait, found := ids.currid[c]; found { + ids.currmu.Unlock() + log.Debugf("IdentifyConn called twice on: %s", c) + <-wait // already identifying it. wait for it. + return + } + ids.currid[c] = make(chan struct{}) + ids.currmu.Unlock() + + s, err := c.NewStream() + if err != nil { + log.Error("error opening initial stream for %s", ID) + log.Event(context.TODO(), "IdentifyOpenFailed", c.RemotePeer()) + } else { + + // ok give the response to our handler. + if err := protocol.WriteHeader(s, ID); err != nil { + log.Error("error writing stream header for %s", ID) + log.Event(context.TODO(), "IdentifyOpenFailed", c.RemotePeer()) + } + ids.ResponseHandler(s) + } + + ids.currmu.Lock() + ch, found := ids.currid[c] + delete(ids.currid, c) + ids.currmu.Unlock() + + if !found { + log.Errorf("IdentifyConn failed to find channel (programmer error) for %s", c) + return + } + + close(ch) // release everyone waiting. +} + +func (ids *IDService) RequestHandler(s inet.Stream) { + defer s.Close() + c := s.Conn() + + w := ggio.NewDelimitedWriter(s) + mes := pb.Identify{} + ids.populateMessage(&mes, s.Conn()) + w.WriteMsg(&mes) + + log.Debugf("%s sent message to %s %s", ID, + c.RemotePeer(), c.RemoteMultiaddr()) +} + +func (ids *IDService) ResponseHandler(s inet.Stream) { + defer s.Close() + c := s.Conn() + + r := ggio.NewDelimitedReader(s, 2048) + mes := pb.Identify{} + if err := r.ReadMsg(&mes); err != nil { + log.Errorf("%s error receiving message from %s %s", ID, + c.RemotePeer(), c.RemoteMultiaddr()) + return + } + ids.consumeMessage(&mes, c) + + log.Debugf("%s received message from %s %s", ID, + c.RemotePeer(), c.RemoteMultiaddr()) +} + +func (ids *IDService) populateMessage(mes *pb.Identify, c inet.Conn) { + + // set protocols this node is currently handling + protos := ids.Host.Mux().Protocols() + mes.Protocols = make([]string, len(protos)) + for i, p := range protos { + mes.Protocols[i] = string(p) + } + + // observed address so other side is informed of their + // "public" address, at least in relation to us. + mes.ObservedAddr = c.RemoteMultiaddr().Bytes() + + // set listen addrs + laddrs, err := ids.Host.Network().InterfaceListenAddresses() + if err != nil { + log.Error(err) + } else { + mes.ListenAddrs = make([][]byte, len(laddrs)) + for i, addr := range laddrs { + mes.ListenAddrs[i] = addr.Bytes() + } + log.Debugf("%s sent listen addrs to %s: %s", c.LocalPeer(), c.RemotePeer(), laddrs) + } + + // set protocol versions + s := IpfsVersion.String() + mes.ProtocolVersion = &s + mes.AgentVersion = &ClientVersion +} + +func (ids *IDService) consumeMessage(mes *pb.Identify, c inet.Conn) { + p := c.RemotePeer() + + // mes.Protocols + // mes.ObservedAddr + + // mes.ListenAddrs + laddrs := mes.GetListenAddrs() + lmaddrs := make([]ma.Multiaddr, 0, len(laddrs)) + for _, addr := range laddrs { + maddr, err := ma.NewMultiaddrBytes(addr) + if err != nil { + log.Errorf("%s failed to parse multiaddr from %s %s", ID, + p, c.RemoteMultiaddr()) + continue + } + lmaddrs = append(lmaddrs, maddr) + } + + // update our peerstore with the addresses. + ids.Host.Peerstore().AddAddresses(p, lmaddrs) + log.Debugf("%s received listen addrs for %s: %s", c.LocalPeer(), c.RemotePeer(), lmaddrs) + + // get protocol versions + pv := *mes.ProtocolVersion + av := *mes.AgentVersion + ids.Host.Peerstore().Put(p, "ProtocolVersion", pv) + ids.Host.Peerstore().Put(p, "AgentVersion", av) +} + +// IdentifyWait returns a channel which will be closed once +// "ProtocolIdentify" (handshake3) finishes on given conn. +// This happens async so the connection can start to be used +// even if handshake3 knowledge is not necesary. +// Users **MUST** call IdentifyWait _after_ IdentifyConn +func (ids *IDService) IdentifyWait(c inet.Conn) <-chan struct{} { + ids.currmu.Lock() + ch, found := ids.currid[c] + ids.currmu.Unlock() + if found { + return ch + } + + // if not found, it means we are already done identifying it, or + // haven't even started. either way, return a new channel closed. + ch = make(chan struct{}) + close(ch) + return ch +} diff --git a/p2p/protocol/identify/id_test.go b/p2p/protocol/identify/id_test.go new file mode 100644 index 000000000..c6707b0ac --- /dev/null +++ b/p2p/protocol/identify/id_test.go @@ -0,0 +1,106 @@ +package identify_test + +import ( + "testing" + "time" + + host "github.com/jbenet/go-ipfs/p2p/host" + peer "github.com/jbenet/go-ipfs/p2p/peer" + identify "github.com/jbenet/go-ipfs/p2p/protocol/identify" + testutil "github.com/jbenet/go-ipfs/p2p/test/util" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" +) + +func subtestIDService(t *testing.T, postDialWait time.Duration) { + + // the generated networks should have the id service wired in. + ctx := context.Background() + h1 := testutil.GenHostSwarm(t, ctx) + h2 := testutil.GenHostSwarm(t, ctx) + + h1p := h1.ID() + h2p := h2.ID() + + testKnowsAddrs(t, h1, h2p, []ma.Multiaddr{}) // nothing + testKnowsAddrs(t, h2, h1p, []ma.Multiaddr{}) // nothing + + h2pi := h2.Peerstore().PeerInfo(h2p) + if err := h1.Connect(ctx, h2pi); err != nil { + t.Fatal(err) + } + + // we need to wait here if Dial returns before ID service is finished. + if postDialWait > 0 { + <-time.After(postDialWait) + } + + // the IDService should be opened automatically, by the network. + // what we should see now is that both peers know about each others listen addresses. + testKnowsAddrs(t, h1, h2p, h2.Peerstore().Addresses(h2p)) // has them + testHasProtocolVersions(t, h1, h2p) + + // now, this wait we do have to do. it's the wait for the Listening side + // to be done identifying the connection. + c := h2.Network().ConnsToPeer(h1.ID()) + if len(c) < 1 { + t.Fatal("should have connection by now at least.") + } + <-h2.IDService().IdentifyWait(c[0]) + + // and the protocol versions. + testKnowsAddrs(t, h2, h1p, h1.Peerstore().Addresses(h1p)) // has them + testHasProtocolVersions(t, h2, h1p) +} + +func testKnowsAddrs(t *testing.T, h host.Host, p peer.ID, expected []ma.Multiaddr) { + actual := h.Peerstore().Addresses(p) + + if len(actual) != len(expected) { + t.Error("dont have the same addresses") + } + + have := map[string]struct{}{} + for _, addr := range actual { + have[addr.String()] = struct{}{} + } + for _, addr := range expected { + if _, found := have[addr.String()]; !found { + t.Errorf("%s did not have addr for %s: %s", h.ID(), p, addr) + // panic("ahhhhhhh") + } + } +} + +func testHasProtocolVersions(t *testing.T, h host.Host, p peer.ID) { + v, err := h.Peerstore().Get(p, "ProtocolVersion") + if v == nil { + t.Error("no protocol version") + return + } + if v.(string) != identify.IpfsVersion.String() { + t.Error("protocol mismatch", err) + } + v, err = h.Peerstore().Get(p, "AgentVersion") + if v.(string) != identify.ClientVersion { + t.Error("agent version mismatch", err) + } +} + +// TestIDServiceWait gives the ID service 100ms to finish after dialing +// this is becasue it used to be concurrent. Now, Dial wait till the +// id service is done. +func TestIDServiceWait(t *testing.T) { + N := 3 + for i := 0; i < N; i++ { + subtestIDService(t, 100*time.Millisecond) + } +} + +func TestIDServiceNoWait(t *testing.T) { + N := 3 + for i := 0; i < N; i++ { + subtestIDService(t, 0) + } +} diff --git a/p2p/protocol/identify/pb/Makefile b/p2p/protocol/identify/pb/Makefile new file mode 100644 index 000000000..d08f1c3eb --- /dev/null +++ b/p2p/protocol/identify/pb/Makefile @@ -0,0 +1,11 @@ + +PB = $(wildcard *.proto) +GO = $(PB:.proto=.pb.go) + +all: $(GO) + +%.pb.go: %.proto + protoc --gogo_out=. --proto_path=../../../../../../:/usr/local/opt/protobuf/include:. $< + +clean: + rm *.pb.go diff --git a/p2p/protocol/identify/pb/identify.pb.go b/p2p/protocol/identify/pb/identify.pb.go new file mode 100644 index 000000000..1f0458648 --- /dev/null +++ b/p2p/protocol/identify/pb/identify.pb.go @@ -0,0 +1,93 @@ +// Code generated by protoc-gen-gogo. +// source: identify.proto +// DO NOT EDIT! + +/* +Package identify_pb is a generated protocol buffer package. + +It is generated from these files: + identify.proto + +It has these top-level messages: + Identify +*/ +package identify_pb + +import proto "code.google.com/p/gogoprotobuf/proto" +import json "encoding/json" +import math "math" + +// Reference proto, json, and math imports to suppress error if they are not otherwise used. +var _ = proto.Marshal +var _ = &json.SyntaxError{} +var _ = math.Inf + +type Identify struct { + // protocolVersion determines compatibility between peers + ProtocolVersion *string `protobuf:"bytes,5,opt,name=protocolVersion" json:"protocolVersion,omitempty"` + // agentVersion is like a UserAgent string in browsers, or client version in bittorrent + // includes the client name and client. + AgentVersion *string `protobuf:"bytes,6,opt,name=agentVersion" json:"agentVersion,omitempty"` + // publicKey is this node's public key (which also gives its node.ID) + // - may not need to be sent, as secure channel implies it has been sent. + // - then again, if we change / disable secure channel, may still want it. + PublicKey []byte `protobuf:"bytes,1,opt,name=publicKey" json:"publicKey,omitempty"` + // listenAddrs are the multiaddrs the sender node listens for open connections on + ListenAddrs [][]byte `protobuf:"bytes,2,rep,name=listenAddrs" json:"listenAddrs,omitempty"` + // oservedAddr is the multiaddr of the remote endpoint that the sender node perceives + // this is useful information to convey to the other side, as it helps the remote endpoint + // determine whether its connection to the local peer goes through NAT. + ObservedAddr []byte `protobuf:"bytes,4,opt,name=observedAddr" json:"observedAddr,omitempty"` + // protocols are the services this node is running + Protocols []string `protobuf:"bytes,3,rep,name=protocols" json:"protocols,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Identify) Reset() { *m = Identify{} } +func (m *Identify) String() string { return proto.CompactTextString(m) } +func (*Identify) ProtoMessage() {} + +func (m *Identify) GetProtocolVersion() string { + if m != nil && m.ProtocolVersion != nil { + return *m.ProtocolVersion + } + return "" +} + +func (m *Identify) GetAgentVersion() string { + if m != nil && m.AgentVersion != nil { + return *m.AgentVersion + } + return "" +} + +func (m *Identify) GetPublicKey() []byte { + if m != nil { + return m.PublicKey + } + return nil +} + +func (m *Identify) GetListenAddrs() [][]byte { + if m != nil { + return m.ListenAddrs + } + return nil +} + +func (m *Identify) GetObservedAddr() []byte { + if m != nil { + return m.ObservedAddr + } + return nil +} + +func (m *Identify) GetProtocols() []string { + if m != nil { + return m.Protocols + } + return nil +} + +func init() { +} diff --git a/p2p/protocol/identify/pb/identify.proto b/p2p/protocol/identify/pb/identify.proto new file mode 100644 index 000000000..7d31e0474 --- /dev/null +++ b/p2p/protocol/identify/pb/identify.proto @@ -0,0 +1,27 @@ +package identify.pb; + +message Identify { + + // protocolVersion determines compatibility between peers + optional string protocolVersion = 5; // e.g. ipfs/1.0.0 + + // agentVersion is like a UserAgent string in browsers, or client version in bittorrent + // includes the client name and client. + optional string agentVersion = 6; // e.g. go-ipfs/0.1.0 + + // publicKey is this node's public key (which also gives its node.ID) + // - may not need to be sent, as secure channel implies it has been sent. + // - then again, if we change / disable secure channel, may still want it. + optional bytes publicKey = 1; + + // listenAddrs are the multiaddrs the sender node listens for open connections on + repeated bytes listenAddrs = 2; + + // oservedAddr is the multiaddr of the remote endpoint that the sender node perceives + // this is useful information to convey to the other side, as it helps the remote endpoint + // determine whether its connection to the local peer goes through NAT. + optional bytes observedAddr = 4; + + // protocols are the services this node is running + repeated string protocols = 3; +} diff --git a/p2p/protocol/relay/relay.go b/p2p/protocol/relay/relay.go new file mode 100644 index 000000000..12e0d204a --- /dev/null +++ b/p2p/protocol/relay/relay.go @@ -0,0 +1,156 @@ +package relay + +import ( + "fmt" + "io" + + mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" + + host "github.com/jbenet/go-ipfs/p2p/host" + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" +) + +var log = eventlog.Logger("p2p/protocol/relay") + +// ID is the protocol.ID of the Relay Service. +const ID protocol.ID = "/ipfs/relay" + +// Relay is a structure that implements ProtocolRelay. +// It is a simple relay service which forwards traffic +// between two directly connected peers. +// +// the protocol is very simple: +// +// /ipfs/relay\n +// +// +// +// +type RelayService struct { + host host.Host + handler inet.StreamHandler // for streams sent to us locally. +} + +func NewRelayService(h host.Host, sh inet.StreamHandler) *RelayService { + s := &RelayService{ + host: h, + handler: sh, + } + h.SetStreamHandler(ID, s.requestHandler) + return s +} + +// requestHandler is the function called by clients +func (rs *RelayService) requestHandler(s inet.Stream) { + if err := rs.handleStream(s); err != nil { + log.Error("RelayService error:", err) + } +} + +// handleStream is our own handler, which returns an error for simplicity. +func (rs *RelayService) handleStream(s inet.Stream) error { + defer s.Close() + + // read the header (src and dst peer.IDs) + src, dst, err := ReadHeader(s) + if err != nil { + return fmt.Errorf("stream with bad header: %s", err) + } + + local := rs.host.ID() + + switch { + case src == local: + return fmt.Errorf("relaying from self") + case dst == local: // it's for us! yaaay. + log.Debugf("%s consuming stream from %s", local, src) + return rs.consumeStream(s) + default: // src and dst are not local. relay it. + log.Debugf("%s relaying stream %s <--> %s", local, src, dst) + return rs.pipeStream(src, dst, s) + } +} + +// consumeStream connects streams directed to the local peer +// to our handler, with the header now stripped (read). +func (rs *RelayService) consumeStream(s inet.Stream) error { + rs.handler(s) // boom. + return nil +} + +// pipeStream relays over a stream to a remote peer. It's like `cat` +func (rs *RelayService) pipeStream(src, dst peer.ID, s inet.Stream) error { + s2, err := rs.openStreamToPeer(dst) + if err != nil { + return fmt.Errorf("failed to open stream to peer: %s -- %s", dst, err) + } + + if err := WriteHeader(s2, src, dst); err != nil { + return err + } + + // connect the series of tubes. + done := make(chan retio, 2) + go func() { + n, err := io.Copy(s2, s) + done <- retio{n, err} + }() + go func() { + n, err := io.Copy(s, s2) + done <- retio{n, err} + }() + + r1 := <-done + r2 := <-done + log.Infof("%s relayed %d/%d bytes between %s and %s", rs.host.ID(), r1.n, r2.n, src, dst) + + if r1.err != nil { + return r1.err + } + return r2.err +} + +// openStreamToPeer opens a pipe to a remote endpoint +// for now, can only open streams to directly connected peers. +// maybe we can do some routing later on. +func (rs *RelayService) openStreamToPeer(p peer.ID) (inet.Stream, error) { + return rs.host.NewStream(ID, p) +} + +func ReadHeader(r io.Reader) (src, dst peer.ID, err error) { + + mhr := mh.NewReader(r) + + s, err := mhr.ReadMultihash() + if err != nil { + return "", "", err + } + + d, err := mhr.ReadMultihash() + if err != nil { + return "", "", err + } + + return peer.ID(s), peer.ID(d), nil +} + +func WriteHeader(w io.Writer, src, dst peer.ID) error { + // write header to w. + mhw := mh.NewWriter(w) + if err := mhw.WriteMultihash(mh.Multihash(src)); err != nil { + return fmt.Errorf("failed to write relay header: %s -- %s", dst, err) + } + if err := mhw.WriteMultihash(mh.Multihash(dst)); err != nil { + return fmt.Errorf("failed to write relay header: %s -- %s", dst, err) + } + + return nil +} + +type retio struct { + n int64 + err error +} diff --git a/p2p/protocol/relay/relay_test.go b/p2p/protocol/relay/relay_test.go new file mode 100644 index 000000000..9aaedfd3d --- /dev/null +++ b/p2p/protocol/relay/relay_test.go @@ -0,0 +1,303 @@ +package relay_test + +import ( + "io" + "testing" + + inet "github.com/jbenet/go-ipfs/p2p/net2" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" + relay "github.com/jbenet/go-ipfs/p2p/protocol/relay" + testutil "github.com/jbenet/go-ipfs/p2p/test/util" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +var log = eventlog.Logger("relay_test") + +func TestRelaySimple(t *testing.T) { + + ctx := context.Background() + + // these networks have the relay service wired in already. + n1 := testutil.GenHostSwarm(t, ctx) + n2 := testutil.GenHostSwarm(t, ctx) + n3 := testutil.GenHostSwarm(t, ctx) + + n1p := n1.ID() + n2p := n2.ID() + n3p := n3.ID() + + n2pi := n2.Peerstore().PeerInfo(n2p) + if err := n1.Connect(ctx, n2pi); err != nil { + t.Fatal("Failed to connect:", err) + } + if err := n3.Connect(ctx, n2pi); err != nil { + t.Fatal("Failed to connect:", err) + } + + // setup handler on n3 to copy everything over to the pipe. + piper, pipew := io.Pipe() + n3.SetStreamHandler(protocol.TestingID, func(s inet.Stream) { + log.Debug("relay stream opened to n3!") + log.Debug("piping and echoing everything") + w := io.MultiWriter(s, pipew) + io.Copy(w, s) + log.Debug("closing stream") + s.Close() + }) + + // ok, now we can try to relay n1--->n2--->n3. + log.Debug("open relay stream") + s, err := n1.NewStream(relay.ID, n2p) + if err != nil { + t.Fatal(err) + } + + // ok first thing we write the relay header n1->n3 + log.Debug("write relay header") + if err := relay.WriteHeader(s, n1p, n3p); err != nil { + t.Fatal(err) + } + + // ok now the header's there, we can write the next protocol header. + log.Debug("write testing header") + if err := protocol.WriteHeader(s, protocol.TestingID); err != nil { + t.Fatal(err) + } + + // okay, now we should be able to write text, and read it out. + buf1 := []byte("abcdefghij") + buf2 := make([]byte, 10) + buf3 := make([]byte, 10) + log.Debug("write in some text.") + if _, err := s.Write(buf1); err != nil { + t.Fatal(err) + } + + // read it out from the pipe. + log.Debug("read it out from the pipe.") + if _, err := io.ReadFull(piper, buf2); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf2) { + t.Fatal("should've gotten that text out of the pipe") + } + + // read it out from the stream (echoed) + log.Debug("read it out from the stream (echoed).") + if _, err := io.ReadFull(s, buf3); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf3) { + t.Fatal("should've gotten that text out of the stream") + } + + // sweet. relay works. + log.Debug("sweet, relay works.") + s.Close() +} + +func TestRelayAcrossFour(t *testing.T) { + + ctx := context.Background() + + // these networks have the relay service wired in already. + n1 := testutil.GenHostSwarm(t, ctx) + n2 := testutil.GenHostSwarm(t, ctx) + n3 := testutil.GenHostSwarm(t, ctx) + n4 := testutil.GenHostSwarm(t, ctx) + n5 := testutil.GenHostSwarm(t, ctx) + + n1p := n1.ID() + n2p := n2.ID() + n3p := n3.ID() + n4p := n4.ID() + n5p := n5.ID() + + n2pi := n2.Peerstore().PeerInfo(n2p) + n4pi := n4.Peerstore().PeerInfo(n4p) + + if err := n1.Connect(ctx, n2pi); err != nil { + t.Fatalf("Failed to dial:", err) + } + if err := n3.Connect(ctx, n2pi); err != nil { + t.Fatalf("Failed to dial:", err) + } + if err := n3.Connect(ctx, n4pi); err != nil { + t.Fatalf("Failed to dial:", err) + } + if err := n5.Connect(ctx, n4pi); err != nil { + t.Fatalf("Failed to dial:", err) + } + + // setup handler on n5 to copy everything over to the pipe. + piper, pipew := io.Pipe() + n5.SetStreamHandler(protocol.TestingID, func(s inet.Stream) { + log.Debug("relay stream opened to n5!") + log.Debug("piping and echoing everything") + w := io.MultiWriter(s, pipew) + io.Copy(w, s) + log.Debug("closing stream") + s.Close() + }) + + // ok, now we can try to relay n1--->n2--->n3--->n4--->n5 + log.Debug("open relay stream") + s, err := n1.NewStream(relay.ID, n2p) + if err != nil { + t.Fatal(err) + } + + log.Debugf("write relay header n1->n3 (%s -> %s)", n1p, n3p) + if err := relay.WriteHeader(s, n1p, n3p); err != nil { + t.Fatal(err) + } + + log.Debugf("write relay header n1->n4 (%s -> %s)", n1p, n4p) + if err := protocol.WriteHeader(s, relay.ID); err != nil { + t.Fatal(err) + } + if err := relay.WriteHeader(s, n1p, n4p); err != nil { + t.Fatal(err) + } + + log.Debugf("write relay header n1->n5 (%s -> %s)", n1p, n5p) + if err := protocol.WriteHeader(s, relay.ID); err != nil { + t.Fatal(err) + } + if err := relay.WriteHeader(s, n1p, n5p); err != nil { + t.Fatal(err) + } + + // ok now the header's there, we can write the next protocol header. + log.Debug("write testing header") + if err := protocol.WriteHeader(s, protocol.TestingID); err != nil { + t.Fatal(err) + } + + // okay, now we should be able to write text, and read it out. + buf1 := []byte("abcdefghij") + buf2 := make([]byte, 10) + buf3 := make([]byte, 10) + log.Debug("write in some text.") + if _, err := s.Write(buf1); err != nil { + t.Fatal(err) + } + + // read it out from the pipe. + log.Debug("read it out from the pipe.") + if _, err := io.ReadFull(piper, buf2); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf2) { + t.Fatal("should've gotten that text out of the pipe") + } + + // read it out from the stream (echoed) + log.Debug("read it out from the stream (echoed).") + if _, err := io.ReadFull(s, buf3); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf3) { + t.Fatal("should've gotten that text out of the stream") + } + + // sweet. relay works. + log.Debug("sweet, relaying across 4 works.") + s.Close() +} + +func TestRelayStress(t *testing.T) { + buflen := 1 << 18 + iterations := 10 + + ctx := context.Background() + + // these networks have the relay service wired in already. + n1 := testutil.GenHostSwarm(t, ctx) + n2 := testutil.GenHostSwarm(t, ctx) + n3 := testutil.GenHostSwarm(t, ctx) + + n1p := n1.ID() + n2p := n2.ID() + n3p := n3.ID() + + n2pi := n2.Peerstore().PeerInfo(n2p) + if err := n1.Connect(ctx, n2pi); err != nil { + t.Fatalf("Failed to dial:", err) + } + if err := n3.Connect(ctx, n2pi); err != nil { + t.Fatalf("Failed to dial:", err) + } + + // setup handler on n3 to copy everything over to the pipe. + piper, pipew := io.Pipe() + n3.SetStreamHandler(protocol.TestingID, func(s inet.Stream) { + log.Debug("relay stream opened to n3!") + log.Debug("piping and echoing everything") + w := io.MultiWriter(s, pipew) + io.Copy(w, s) + log.Debug("closing stream") + s.Close() + }) + + // ok, now we can try to relay n1--->n2--->n3. + log.Debug("open relay stream") + s, err := n1.NewStream(relay.ID, n2p) + if err != nil { + t.Fatal(err) + } + + // ok first thing we write the relay header n1->n3 + log.Debug("write relay header") + if err := relay.WriteHeader(s, n1p, n3p); err != nil { + t.Fatal(err) + } + + // ok now the header's there, we can write the next protocol header. + log.Debug("write testing header") + if err := protocol.WriteHeader(s, protocol.TestingID); err != nil { + t.Fatal(err) + } + + // okay, now write lots of text and read it back out from both + // the pipe and the stream. + buf1 := make([]byte, buflen) + buf2 := make([]byte, len(buf1)) + buf3 := make([]byte, len(buf1)) + + fillbuf := func(buf []byte, b byte) { + for i := range buf { + buf[i] = b + } + } + + for i := 0; i < iterations; i++ { + fillbuf(buf1, byte(int('a')+i)) + log.Debugf("writing %d bytes (%d/%d)", len(buf1), i, iterations) + if _, err := s.Write(buf1); err != nil { + t.Fatal(err) + } + + log.Debug("read it out from the pipe.") + if _, err := io.ReadFull(piper, buf2); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf2) { + t.Fatal("should've gotten that text out of the pipe") + } + + // read it out from the stream (echoed) + log.Debug("read it out from the stream (echoed).") + if _, err := io.ReadFull(s, buf3); err != nil { + t.Fatal(err) + } + if string(buf1) != string(buf3) { + t.Fatal("should've gotten that text out of the stream") + } + } + + log.Debug("sweet, relay works under stress.") + s.Close() +} diff --git a/p2p/test/backpressure/backpressure.go b/p2p/test/backpressure/backpressure.go new file mode 100644 index 000000000..19950a728 --- /dev/null +++ b/p2p/test/backpressure/backpressure.go @@ -0,0 +1 @@ +package backpressure_tests diff --git a/p2p/test/backpressure/backpressure_test.go b/p2p/test/backpressure/backpressure_test.go new file mode 100644 index 000000000..729856e4c --- /dev/null +++ b/p2p/test/backpressure/backpressure_test.go @@ -0,0 +1,374 @@ +package backpressure_tests + +import ( + crand "crypto/rand" + "io" + "math/rand" + "testing" + "time" + + host "github.com/jbenet/go-ipfs/p2p/host" + inet "github.com/jbenet/go-ipfs/p2p/net2" + peer "github.com/jbenet/go-ipfs/p2p/peer" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" + testutil "github.com/jbenet/go-ipfs/p2p/test/util" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +var log = eventlog.Logger("backpressure") + +// TestBackpressureStreamHandler tests whether mux handler +// ratelimiting works. Meaning, since the handler is sequential +// it should block senders. +// +// Important note: spdystream (which peerstream uses) has a set +// of n workers (n=spdsystream.FRAME_WORKERS) which handle new +// frames, including those starting new streams. So all of them +// can be in the handler at one time. Also, the sending side +// does not rate limit unless we call stream.Wait() +// +// +// Note: right now, this happens muxer-wide. the muxer should +// learn to flow control, so handlers cant block each other. +func TestBackpressureStreamHandler(t *testing.T) { + t.Skip(`Sadly, as cool as this test is, it doesn't work +Because spdystream doesnt handle stream open backpressure +well IMO. I'll see about rewriting that part when it becomes +a problem. +`) + + // a number of concurrent request handlers + limit := 10 + + // our way to signal that we're done with 1 request + requestHandled := make(chan struct{}) + + // handler rate limiting + receiverRatelimit := make(chan struct{}, limit) + for i := 0; i < limit; i++ { + receiverRatelimit <- struct{}{} + } + + // sender counter of successfully opened streams + senderOpened := make(chan struct{}, limit*100) + + // sender signals it's done (errored out) + senderDone := make(chan struct{}) + + // the receiver handles requests with some rate limiting + receiver := func(s inet.Stream) { + log.Debug("receiver received a stream") + + <-receiverRatelimit // acquire + go func() { + // our request handler. can do stuff here. we + // simulate something taking time by waiting + // on requestHandled + log.Error("request worker handling...") + <-requestHandled + log.Error("request worker done!") + receiverRatelimit <- struct{}{} // release + }() + } + + // the sender opens streams as fast as possible + sender := func(host host.Host, remote peer.ID) { + var s inet.Stream + var err error + defer func() { + t.Error(err) + log.Debug("sender error. exiting.") + senderDone <- struct{}{} + }() + + for { + s, err = host.NewStream(protocol.TestingID, remote) + if err != nil { + return + } + + _ = s + // if err = s.SwarmStream().Stream().Wait(); err != nil { + // return + // } + + // "count" another successfully opened stream + // (large buffer so shouldn't block in normal operation) + log.Debug("sender opened another stream!") + senderOpened <- struct{}{} + } + } + + // count our senderOpened events + countStreamsOpenedBySender := func(min int) int { + opened := 0 + for opened < min { + log.Debugf("countStreamsOpenedBySender got %d (min %d)", opened, min) + select { + case <-senderOpened: + opened++ + case <-time.After(10 * time.Millisecond): + } + } + return opened + } + + // count our received events + // waitForNReceivedStreams := func(n int) { + // for n > 0 { + // log.Debugf("waiting for %d received streams...", n) + // select { + // case <-receiverRatelimit: + // n-- + // } + // } + // } + + testStreamsOpened := func(expected int) { + log.Debugf("testing rate limited to %d streams", expected) + if n := countStreamsOpenedBySender(expected); n != expected { + t.Fatalf("rate limiting did not work :( -- %d != %d", expected, n) + } + } + + // ok that's enough setup. let's do it! + + ctx := context.Background() + h1 := testutil.GenHostSwarm(t, ctx) + h2 := testutil.GenHostSwarm(t, ctx) + + // setup receiver handler + h1.SetStreamHandler(protocol.TestingID, receiver) + + h2pi := h2.Peerstore().PeerInfo(h2.ID()) + log.Debugf("dialing %s", h2pi.Addrs) + if err := h1.Connect(ctx, h2pi); err != nil { + t.Fatalf("Failed to connect:", err) + } + + // launch sender! + go sender(h2, h1.ID()) + + // ok, what do we expect to happen? the receiver should + // receive 10 requests and stop receiving, blocking the sender. + // we can test this by counting 10x senderOpened requests + + <-senderOpened // wait for the sender to successfully open some. + testStreamsOpened(limit - 1) + + // let's "handle" 3 requests. + <-requestHandled + <-requestHandled + <-requestHandled + // the sender should've now been able to open exactly 3 more. + + testStreamsOpened(3) + + // shouldn't have opened anything more + testStreamsOpened(0) + + // let's "handle" 100 requests in batches of 5 + for i := 0; i < 20; i++ { + <-requestHandled + <-requestHandled + <-requestHandled + <-requestHandled + <-requestHandled + testStreamsOpened(5) + } + + // success! + + // now for the sugar on top: let's tear down the receiver. it should + // exit the sender. + h1.Close() + + // shouldn't have opened anything more + testStreamsOpened(0) + + select { + case <-time.After(100 * time.Millisecond): + t.Error("receiver shutdown failed to exit sender") + case <-senderDone: + log.Info("handler backpressure works!") + } +} + +// TestStBackpressureStreamWrite tests whether streams see proper +// backpressure when writing data over the network streams. +func TestStBackpressureStreamWrite(t *testing.T) { + + // senderWrote signals that the sender wrote bytes to remote. + // the value is the count of bytes written. + senderWrote := make(chan int, 10000) + + // sender signals it's done (errored out) + senderDone := make(chan struct{}) + + // writeStats lets us listen to all the writes and return + // how many happened and how much was written + writeStats := func() (int, int) { + writes := 0 + bytes := 0 + for { + select { + case n := <-senderWrote: + writes++ + bytes = bytes + n + default: + log.Debugf("stats: sender wrote %d bytes, %d writes", bytes, writes) + return bytes, writes + } + } + } + + // sender attempts to write as fast as possible, signaling on the + // completion of every write. This makes it possible to see how + // fast it's actually writing. We pair this with a receiver + // that waits for a signal to read. + sender := func(s inet.Stream) { + defer func() { + s.Close() + senderDone <- struct{}{} + }() + + // ready a buffer of random data + buf := make([]byte, 65536) + crand.Read(buf) + + for { + // send a randomly sized subchunk + from := rand.Intn(len(buf) / 2) + to := rand.Intn(len(buf) / 2) + sendbuf := buf[from : from+to] + + n, err := s.Write(sendbuf) + if err != nil { + log.Debug("sender error. exiting:", err) + return + } + + log.Debugf("sender wrote %d bytes", n) + senderWrote <- n + } + } + + // receive a number of bytes from a stream. + // returns the number of bytes written. + receive := func(s inet.Stream, expect int) { + log.Debugf("receiver to read %d bytes", expect) + rbuf := make([]byte, expect) + n, err := io.ReadFull(s, rbuf) + if err != nil { + t.Error("read failed:", err) + } + if expect != n { + t.Error("read len differs: %d != %d", expect, n) + } + } + + // ok let's do it! + + // setup the networks + ctx := context.Background() + h1 := testutil.GenHostSwarm(t, ctx) + h2 := testutil.GenHostSwarm(t, ctx) + + // setup sender handler on 1 + h1.SetStreamHandler(protocol.TestingID, sender) + + h2pi := h2.Peerstore().PeerInfo(h2.ID()) + log.Debugf("dialing %s", h2pi.Addrs) + if err := h1.Connect(ctx, h2pi); err != nil { + t.Fatalf("Failed to connect:", err) + } + + // open a stream, from 2->1, this is our reader + s, err := h2.NewStream(protocol.TestingID, h1.ID()) + if err != nil { + t.Fatal(err) + } + + // let's make sure r/w works. + testSenderWrote := func(bytesE int) { + bytesA, writesA := writeStats() + if bytesA != bytesE { + t.Errorf("numbers failed: %d =?= %d bytes, via %d writes", bytesA, bytesE, writesA) + } + } + + // 500ms rounds of lockstep write + drain + roundsStart := time.Now() + roundsTotal := 0 + for roundsTotal < (2 << 20) { + // let the sender fill its buffers, it will stop sending. + <-time.After(300 * time.Millisecond) + b, _ := writeStats() + testSenderWrote(0) + testSenderWrote(0) + + // drain it all, wait again + receive(s, b) + roundsTotal = roundsTotal + b + } + roundsTime := time.Now().Sub(roundsStart) + + // now read continously, while we measure stats. + stop := make(chan struct{}) + contStart := time.Now() + + go func() { + for { + select { + case <-stop: + return + default: + receive(s, 2<<15) + } + } + }() + + contTotal := 0 + for contTotal < (2 << 20) { + n := <-senderWrote + contTotal += n + } + stop <- struct{}{} + contTime := time.Now().Sub(contStart) + + // now compare! continuous should've been faster AND larger + if roundsTime < contTime { + t.Error("continuous should have been faster") + } + + if roundsTotal < contTotal { + t.Error("continuous should have been larger, too!") + } + + // and a couple rounds more for good measure ;) + for i := 0; i < 3; i++ { + // let the sender fill its buffers, it will stop sending. + <-time.After(300 * time.Millisecond) + b, _ := writeStats() + testSenderWrote(0) + testSenderWrote(0) + + // drain it all, wait again + receive(s, b) + } + + // this doesn't work :(: + // // now for the sugar on top: let's tear down the receiver. it should + // // exit the sender. + // n1.Close() + // testSenderWrote(0) + // testSenderWrote(0) + // select { + // case <-time.After(2 * time.Second): + // t.Error("receiver shutdown failed to exit sender") + // case <-senderDone: + // log.Info("handler backpressure works!") + // } +} diff --git a/p2p/test/util/util.go b/p2p/test/util/util.go new file mode 100644 index 000000000..3c831df67 --- /dev/null +++ b/p2p/test/util/util.go @@ -0,0 +1,37 @@ +package testutil + +import ( + "testing" + + bhost "github.com/jbenet/go-ipfs/p2p/host/basic" + inet "github.com/jbenet/go-ipfs/p2p/net2" + swarm "github.com/jbenet/go-ipfs/p2p/net2/swarm" + peer "github.com/jbenet/go-ipfs/p2p/peer" + tu "github.com/jbenet/go-ipfs/util/testutil" + + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" +) + +func GenSwarmNetwork(t *testing.T, ctx context.Context) *swarm.Network { + p := tu.RandPeerNetParamsOrFatal(t) + ps := peer.NewPeerstore() + ps.AddAddress(p.ID, p.Addr) + ps.AddPubKey(p.ID, p.PubKey) + ps.AddPrivKey(p.ID, p.PrivKey) + n, err := swarm.NewNetwork(ctx, ps.Addresses(p.ID), p.ID, ps) + if err != nil { + t.Fatal(err) + } + return n +} + +func DivulgeAddresses(a, b inet.Network) { + id := a.LocalPeer() + addrs := a.Peerstore().Addresses(id) + b.Peerstore().AddAddresses(id, addrs) +} + +func GenHostSwarm(t *testing.T, ctx context.Context) *bhost.BasicHost { + n := GenSwarmNetwork(t, ctx) + return bhost.New(n) +} From 128e820ccb8b2790455b7c96c1b6cfe8ce15ca24 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 1 Jan 2015 12:02:07 -0800 Subject: [PATCH 18/21] mocknet: use host --- p2p/net2/mock/interface.go | 7 ++-- p2p/net2/mock/mock_net.go | 44 +++++++++++++++++-------- p2p/net2/mock/mock_test.go | 67 +++++++++++++++++++++++--------------- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/p2p/net2/mock/interface.go b/p2p/net2/mock/interface.go index 64aa4b14f..1096fa197 100644 --- a/p2p/net2/mock/interface.go +++ b/p2p/net2/mock/interface.go @@ -11,6 +11,7 @@ import ( "time" ic "github.com/jbenet/go-ipfs/p2p/crypto" + host "github.com/jbenet/go-ipfs/p2p/host" inet "github.com/jbenet/go-ipfs/p2p/net2" peer "github.com/jbenet/go-ipfs/p2p/peer" @@ -20,16 +21,18 @@ import ( type Mocknet interface { // GenPeer generates a peer and its inet.Network in the Mocknet - GenPeer() (inet.Network, error) + GenPeer() (host.Host, error) // AddPeer adds an existing peer. we need both a privkey and addr. // ID is derived from PrivKey - AddPeer(ic.PrivKey, ma.Multiaddr) (inet.Network, error) + AddPeer(ic.PrivKey, ma.Multiaddr) (host.Host, error) // retrieve things (with randomized iteration order) Peers() []peer.ID Net(peer.ID) inet.Network Nets() []inet.Network + Host(peer.ID) host.Host + Hosts() []host.Host Links() LinkMap LinksBetweenPeers(a, b peer.ID) []Link LinksBetweenNets(a, b inet.Network) []Link diff --git a/p2p/net2/mock/mock_net.go b/p2p/net2/mock/mock_net.go index 9e6208ca3..8590f0187 100644 --- a/p2p/net2/mock/mock_net.go +++ b/p2p/net2/mock/mock_net.go @@ -5,6 +5,8 @@ import ( "sync" ic "github.com/jbenet/go-ipfs/p2p/crypto" + host "github.com/jbenet/go-ipfs/p2p/host" + bhost "github.com/jbenet/go-ipfs/p2p/host/basic" inet "github.com/jbenet/go-ipfs/p2p/net2" peer "github.com/jbenet/go-ipfs/p2p/peer" testutil "github.com/jbenet/go-ipfs/util/testutil" @@ -16,9 +18,8 @@ import ( // mocknet implements mocknet.Mocknet type mocknet struct { - // must map on peer.ID (instead of peer.ID) because - // each inet.Network has different peerstore - nets map[peer.ID]*peernet + nets map[peer.ID]*peernet + hosts map[peer.ID]*bhost.BasicHost // links make it possible to connect two peers. // think of links as the physical medium. @@ -35,12 +36,13 @@ type mocknet struct { func New(ctx context.Context) Mocknet { return &mocknet{ nets: map[peer.ID]*peernet{}, + hosts: map[peer.ID]*bhost.BasicHost{}, links: map[peer.ID]map[peer.ID]map[*link]struct{}{}, cg: ctxgroup.WithContext(ctx), } } -func (mn *mocknet) GenPeer() (inet.Network, error) { +func (mn *mocknet) GenPeer() (host.Host, error) { sk, _, err := testutil.RandKeyPair(512) if err != nil { return nil, err @@ -48,20 +50,22 @@ func (mn *mocknet) GenPeer() (inet.Network, error) { a := testutil.RandLocalTCPAddress() - n, err := mn.AddPeer(sk, a) + h, err := mn.AddPeer(sk, a) if err != nil { return nil, err } - return n, nil + return h, nil } -func (mn *mocknet) AddPeer(k ic.PrivKey, a ma.Multiaddr) (inet.Network, error) { +func (mn *mocknet) AddPeer(k ic.PrivKey, a ma.Multiaddr) (host.Host, error) { n, err := newPeernet(mn.cg.Context(), mn, k, a) if err != nil { return nil, err } + h := bhost.New(n) + // make sure to add listening address! // this makes debugging things simpler as remembering to register // an address may cause unexpected failure. @@ -72,8 +76,9 @@ func (mn *mocknet) AddPeer(k ic.PrivKey, a ma.Multiaddr) (inet.Network, error) { mn.Lock() mn.nets[n.peer] = n + mn.hosts[n.peer] = h mn.Unlock() - return n, nil + return h, nil } func (mn *mocknet) Peers() []peer.ID { @@ -87,16 +92,29 @@ func (mn *mocknet) Peers() []peer.ID { return cp } +func (mn *mocknet) Host(pid peer.ID) host.Host { + mn.RLock() + host := mn.hosts[pid] + mn.RUnlock() + return host +} + func (mn *mocknet) Net(pid peer.ID) inet.Network { + mn.RLock() + n := mn.nets[pid] + mn.RUnlock() + return n +} + +func (mn *mocknet) Hosts() []host.Host { mn.RLock() defer mn.RUnlock() - for _, n := range mn.nets { - if n.peer == pid { - return n - } + cp := make([]host.Host, 0, len(mn.hosts)) + for _, h := range mn.hosts { + cp = append(cp, h) } - return nil + return cp } func (mn *mocknet) Nets() []inet.Network { diff --git a/p2p/net2/mock/mock_test.go b/p2p/net2/mock/mock_test.go index e492a9124..6a27a047f 100644 --- a/p2p/net2/mock/mock_test.go +++ b/p2p/net2/mock/mock_test.go @@ -9,6 +9,7 @@ import ( inet "github.com/jbenet/go-ipfs/p2p/net2" peer "github.com/jbenet/go-ipfs/p2p/peer" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" testutil "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -46,31 +47,44 @@ func TestNetworkSetup(t *testing.T) { a2 := testutil.RandLocalTCPAddress() a3 := testutil.RandLocalTCPAddress() - n1, err := mn.AddPeer(sk1, a1) + h1, err := mn.AddPeer(sk1, a1) if err != nil { t.Fatal(err) } - p1 := n1.LocalPeer() + p1 := h1.ID() - n2, err := mn.AddPeer(sk2, a2) + h2, err := mn.AddPeer(sk2, a2) if err != nil { t.Fatal(err) } - p2 := n2.LocalPeer() + p2 := h2.ID() - n3, err := mn.AddPeer(sk3, a3) + h3, err := mn.AddPeer(sk3, a3) if err != nil { t.Fatal(err) } - p3 := n3.LocalPeer() + p3 := h3.ID() // check peers and net + if mn.Host(p1) != h1 { + t.Error("host for p1.ID != h1") + } + if mn.Host(p2) != h2 { + t.Error("host for p2.ID != h2") + } + if mn.Host(p3) != h3 { + t.Error("host for p3.ID != h3") + } + + n1 := h1.Network() if mn.Net(p1) != n1 { t.Error("net for p1.ID != n1") } + n2 := h2.Network() if mn.Net(p2) != n2 { t.Error("net for p2.ID != n1") } + n3 := h3.Network() if mn.Net(p3) != n3 { t.Error("net for p3.ID != n1") } @@ -275,12 +289,12 @@ func TestStreams(t *testing.T) { s.Close() } - nets := mn.Nets() - for _, n := range nets { - n.SetStreamHandler(handler) + hosts := mn.Hosts() + for _, h := range mn.Hosts() { + h.SetStreamHandler(protocol.TestingID, handler) } - s, err := nets[0].NewStream(nets[1].LocalPeer()) + s, err := hosts[0].NewStream(protocol.TestingID, hosts[1].ID()) if err != nil { t.Fatal(err) } @@ -350,9 +364,10 @@ func TestStreamsStress(t *testing.T) { t.Fatal(err) } - nets := mn.Nets() - for _, n := range nets { - n.SetStreamHandler(makePonger("pingpong")) + hosts := mn.Hosts() + for _, h := range hosts { + ponger := makePonger(string(protocol.TestingID)) + h.SetStreamHandler(protocol.TestingID, ponger) } var wg sync.WaitGroup @@ -360,11 +375,11 @@ func TestStreamsStress(t *testing.T) { wg.Add(1) go func(i int) { defer wg.Done() - from := rand.Intn(len(nets)) - to := rand.Intn(len(nets)) - s, err := nets[from].NewStream(nets[to].LocalPeer()) + from := rand.Intn(len(hosts)) + to := rand.Intn(len(hosts)) + s, err := hosts[from].NewStream(protocol.TestingID, hosts[to].ID()) if err != nil { - log.Debugf("%d (%s) %d (%s)", from, nets[from], to, nets[to]) + log.Debugf("%d (%s) %d (%s)", from, hosts[from], to, hosts[to]) panic(err) } @@ -389,12 +404,12 @@ func TestAdding(t *testing.T) { } a := testutil.RandLocalTCPAddress() - n, err := mn.AddPeer(sk, a) + h, err := mn.AddPeer(sk, a) if err != nil { t.Fatal(err) } - peers = append(peers, n.LocalPeer()) + peers = append(peers, h.ID()) } p1 := peers[0] @@ -410,11 +425,11 @@ func TestAdding(t *testing.T) { } // set the new stream handler on p2 - n2 := mn.Net(p2) - if n2 == nil { - t.Fatalf("no network for %s", p2) + h2 := mn.Host(p2) + if h2 == nil { + t.Fatalf("no host for %s", p2) } - n2.SetStreamHandler(func(s inet.Stream) { + h2.SetStreamHandler(protocol.TestingID, func(s inet.Stream) { defer s.Close() b := make([]byte, 4) @@ -436,12 +451,12 @@ func TestAdding(t *testing.T) { } // talk to p2 - n1 := mn.Net(p1) - if n1 == nil { + h1 := mn.Host(p1) + if h1 == nil { t.Fatalf("no network for %s", p1) } - s, err := n1.NewStream(p2) + s, err := h1.NewStream(protocol.TestingID, p2) if err != nil { t.Fatal(err) } From 8fb5cf95786304592d5aa994351af1211d2f3cb1 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 1 Jan 2015 12:45:39 -0800 Subject: [PATCH 19/21] swap net2 -> net --- core/bootstrap.go | 33 +- core/commands/publish.go | 2 +- core/commands/resolve.go | 2 +- core/commands/swarm.go | 8 +- core/core.go | 22 +- core/mock.go | 10 +- diagnostics/diag.go | 42 +- epictest/addcat_test.go | 4 +- epictest/core.go | 14 +- epictest/three_legged_cat_test.go | 6 +- exchange/bitswap/network/interface.go | 3 + exchange/bitswap/network/ipfs_impl.go | 20 +- exchange/bitswap/testnet/peernet.go | 2 +- p2p/host/basic/basic_host.go | 2 +- p2p/host/basic/basic_host_test.go | 2 +- p2p/host/host.go | 2 +- p2p/net/backpressure/backpressure.go | 1 - p2p/net/backpressure/backpressure_test.go | 373 ---------------- p2p/net/conn/conn.go | 14 +- p2p/net/conn/handshake.go | 52 --- p2p/net/handshake/README.md | 27 -- p2p/net/handshake/doc.go | 34 -- p2p/net/handshake/handshake1.go | 68 --- p2p/net/handshake/handshake1_test.go | 23 - p2p/net/handshake/pb/Makefile | 11 - p2p/net/handshake/pb/handshake.pb.go | 113 ----- p2p/net/handshake/pb/handshake.proto | 38 -- p2p/net/interface.go | 54 +-- p2p/net/mock/interface.go | 11 +- p2p/net/mock/mock.go | 2 +- p2p/net/mock/mock_conn.go | 7 +- p2p/net/mock/mock_net.go | 53 ++- p2p/net/mock/mock_peernet.go | 89 ++-- p2p/net/mock/mock_test.go | 153 +++---- p2p/net/services/identify/id.go | 187 -------- p2p/net/services/identify/id_test.go | 111 ----- p2p/net/services/mux/mux.go | 156 ------- p2p/net/services/mux/mux_test.go | 65 --- p2p/net/services/relay/relay.go | 159 ------- p2p/net/services/relay/relay_test.go | 309 -------------- p2p/net/swarm/swarm.go | 3 +- p2p/net/swarm/swarm_conn.go | 11 +- p2p/{net2 => net}/swarm/swarm_net.go | 2 +- p2p/{net2 => net}/swarm/swarm_net_test.go | 8 +- p2p/net/swarm/swarm_stream.go | 15 +- p2p/net/swarm/swarm_test.go | 5 +- p2p/net/swarmnet/net.go | 309 -------------- p2p/net/swarmnet/net_test.go | 78 ---- p2p/net/swarmnet/util/util.go | 31 -- p2p/net2/README.md | 17 - p2p/net2/conn/conn.go | 157 ------- p2p/net2/conn/conn_test.go | 122 ------ p2p/net2/conn/dial.go | 131 ------ p2p/net2/conn/dial_test.go | 165 ------- p2p/net2/conn/interface.go | 84 ---- p2p/net2/conn/listen.go | 115 ----- p2p/net2/conn/secure_conn.go | 154 ------- p2p/net2/conn/secure_conn_test.go | 199 --------- p2p/net2/interface.go | 133 ------ p2p/net2/mock/interface.go | 101 ----- p2p/net2/mock/mock.go | 63 --- p2p/net2/mock/mock_conn.go | 120 ------ p2p/net2/mock/mock_link.go | 93 ---- p2p/net2/mock/mock_net.go | 340 --------------- p2p/net2/mock/mock_peernet.go | 353 --------------- p2p/net2/mock/mock_printer.go | 36 -- p2p/net2/mock/mock_stream.go | 29 -- p2p/net2/mock/mock_test.go | 475 --------------------- p2p/net2/swarm/addr.go | 124 ------ p2p/net2/swarm/simul_test.go | 66 --- p2p/net2/swarm/swarm.go | 158 ------- p2p/net2/swarm/swarm_conn.go | 141 ------ p2p/net2/swarm/swarm_dial.go | 104 ----- p2p/net2/swarm/swarm_listen.go | 86 ---- p2p/net2/swarm/swarm_stream.go | 59 --- p2p/net2/swarm/swarm_test.go | 269 ------------ p2p/protocol/identify/id.go | 2 +- p2p/protocol/mux.go | 2 +- p2p/protocol/mux_test.go | 2 +- p2p/protocol/relay/relay.go | 2 +- p2p/protocol/relay/relay_test.go | 2 +- p2p/test/backpressure/backpressure_test.go | 2 +- p2p/test/util/util.go | 4 +- routing/dht/dht.go | 28 +- routing/dht/dht_net.go | 4 +- routing/dht/dht_test.go | 80 ++-- routing/dht/ext_test.go | 45 +- routing/dht/handlers.go | 10 +- routing/dht/query.go | 34 +- routing/dht/routing.go | 10 +- routing/mock/dht.go | 4 +- 91 files changed, 411 insertions(+), 6460 deletions(-) delete mode 100644 p2p/net/backpressure/backpressure.go delete mode 100644 p2p/net/backpressure/backpressure_test.go delete mode 100644 p2p/net/conn/handshake.go delete mode 100644 p2p/net/handshake/README.md delete mode 100644 p2p/net/handshake/doc.go delete mode 100644 p2p/net/handshake/handshake1.go delete mode 100644 p2p/net/handshake/handshake1_test.go delete mode 100644 p2p/net/handshake/pb/Makefile delete mode 100644 p2p/net/handshake/pb/handshake.pb.go delete mode 100644 p2p/net/handshake/pb/handshake.proto delete mode 100644 p2p/net/services/identify/id.go delete mode 100644 p2p/net/services/identify/id_test.go delete mode 100644 p2p/net/services/mux/mux.go delete mode 100644 p2p/net/services/mux/mux_test.go delete mode 100644 p2p/net/services/relay/relay.go delete mode 100644 p2p/net/services/relay/relay_test.go rename p2p/{net2 => net}/swarm/swarm_net.go (99%) rename p2p/{net2 => net}/swarm/swarm_net_test.go (90%) delete mode 100644 p2p/net/swarmnet/net.go delete mode 100644 p2p/net/swarmnet/net_test.go delete mode 100644 p2p/net/swarmnet/util/util.go delete mode 100644 p2p/net2/README.md delete mode 100644 p2p/net2/conn/conn.go delete mode 100644 p2p/net2/conn/conn_test.go delete mode 100644 p2p/net2/conn/dial.go delete mode 100644 p2p/net2/conn/dial_test.go delete mode 100644 p2p/net2/conn/interface.go delete mode 100644 p2p/net2/conn/listen.go delete mode 100644 p2p/net2/conn/secure_conn.go delete mode 100644 p2p/net2/conn/secure_conn_test.go delete mode 100644 p2p/net2/interface.go delete mode 100644 p2p/net2/mock/interface.go delete mode 100644 p2p/net2/mock/mock.go delete mode 100644 p2p/net2/mock/mock_conn.go delete mode 100644 p2p/net2/mock/mock_link.go delete mode 100644 p2p/net2/mock/mock_net.go delete mode 100644 p2p/net2/mock/mock_peernet.go delete mode 100644 p2p/net2/mock/mock_printer.go delete mode 100644 p2p/net2/mock/mock_stream.go delete mode 100644 p2p/net2/mock/mock_test.go delete mode 100644 p2p/net2/swarm/addr.go delete mode 100644 p2p/net2/swarm/simul_test.go delete mode 100644 p2p/net2/swarm/swarm.go delete mode 100644 p2p/net2/swarm/swarm_conn.go delete mode 100644 p2p/net2/swarm/swarm_dial.go delete mode 100644 p2p/net2/swarm/swarm_listen.go delete mode 100644 p2p/net2/swarm/swarm_stream.go delete mode 100644 p2p/net2/swarm/swarm_test.go diff --git a/core/bootstrap.go b/core/bootstrap.go index 8faeaecaf..8045b8f26 100644 --- a/core/bootstrap.go +++ b/core/bootstrap.go @@ -8,6 +8,7 @@ import ( "time" config "github.com/jbenet/go-ipfs/config" + host "github.com/jbenet/go-ipfs/p2p/host" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" dht "github.com/jbenet/go-ipfs/routing/dht" @@ -25,7 +26,7 @@ const ( ) func superviseConnections(parent context.Context, - n inet.Network, + h host.Host, route *dht.IpfsDHT, // TODO depend on abstract interface for testing purposes store peer.Peerstore, peers []*config.BootstrapPeer) error { @@ -34,7 +35,7 @@ func superviseConnections(parent context.Context, ctx, _ := context.WithTimeout(parent, connectiontimeout) // TODO get config from disk so |peers| always reflects the latest // information - if err := bootstrap(ctx, n, route, store, peers); err != nil { + if err := bootstrap(ctx, h, route, store, peers); err != nil { log.Error(err) } select { @@ -47,30 +48,30 @@ func superviseConnections(parent context.Context, } func bootstrap(ctx context.Context, - n inet.Network, + h host.Host, r *dht.IpfsDHT, ps peer.Peerstore, boots []*config.BootstrapPeer) error { - connectedPeers := n.Peers() + connectedPeers := h.Network().Peers() if len(connectedPeers) >= recoveryThreshold { - log.Event(ctx, "bootstrapSkip", n.LocalPeer()) + log.Event(ctx, "bootstrapSkip", h.ID()) log.Debugf("%s bootstrap skipped -- connected to %d (> %d) nodes", - n.LocalPeer(), len(connectedPeers), recoveryThreshold) + h.ID(), len(connectedPeers), recoveryThreshold) return nil } numCxnsToCreate := recoveryThreshold - len(connectedPeers) - log.Event(ctx, "bootstrapStart", n.LocalPeer()) - log.Debugf("%s bootstrapping to %d more nodes", n.LocalPeer(), numCxnsToCreate) + log.Event(ctx, "bootstrapStart", h.ID()) + log.Debugf("%s bootstrapping to %d more nodes", h.ID(), numCxnsToCreate) var bootstrapPeers []peer.PeerInfo for _, bootstrap := range boots { p, err := toPeer(bootstrap) if err != nil { - log.Event(ctx, "bootstrapError", n.LocalPeer(), lgbl.Error(err)) - log.Errorf("%s bootstrap error: %s", n.LocalPeer(), err) + log.Event(ctx, "bootstrapError", h.ID(), lgbl.Error(err)) + log.Errorf("%s bootstrap error: %s", h.ID(), err) return err } bootstrapPeers = append(bootstrapPeers, p) @@ -78,7 +79,7 @@ func bootstrap(ctx context.Context, var notConnected []peer.PeerInfo for _, p := range bootstrapPeers { - if n.Connectedness(p.ID) != inet.Connected { + if h.Network().Connectedness(p.ID) != inet.Connected { notConnected = append(notConnected, p) } } @@ -86,17 +87,17 @@ func bootstrap(ctx context.Context, if len(notConnected) < 1 { s := "must bootstrap to %d more nodes, but already connected to all candidates" err := fmt.Errorf(s, numCxnsToCreate) - log.Event(ctx, "bootstrapError", n.LocalPeer(), lgbl.Error(err)) - log.Errorf("%s bootstrap error: %s", n.LocalPeer(), err) + log.Event(ctx, "bootstrapError", h.ID(), lgbl.Error(err)) + log.Errorf("%s bootstrap error: %s", h.ID(), err) return err } var randomSubset = randomSubsetOfPeers(notConnected, numCxnsToCreate) - log.Debugf("%s bootstrapping to %d nodes: %s", n.LocalPeer(), numCxnsToCreate, randomSubset) + log.Debugf("%s bootstrapping to %d nodes: %s", h.ID(), numCxnsToCreate, randomSubset) if err := connect(ctx, ps, r, randomSubset); err != nil { - log.Event(ctx, "bootstrapError", n.LocalPeer(), lgbl.Error(err)) - log.Errorf("%s bootstrap error: %s", n.LocalPeer(), err) + log.Event(ctx, "bootstrapError", h.ID(), lgbl.Error(err)) + log.Errorf("%s bootstrap error: %s", h.ID(), err) return err } return nil diff --git a/core/commands/publish.go b/core/commands/publish.go index 5501ea752..9b6448a7a 100644 --- a/core/commands/publish.go +++ b/core/commands/publish.go @@ -53,7 +53,7 @@ Publish a to another public key: args := req.Arguments() - if n.Network == nil { + if n.PeerHost == nil { return nil, errNotOnline } diff --git a/core/commands/resolve.go b/core/commands/resolve.go index dad72d755..02de15177 100644 --- a/core/commands/resolve.go +++ b/core/commands/resolve.go @@ -47,7 +47,7 @@ Resolve te value of another name: var name string - if n.Network == nil { + if n.PeerHost == nil { return nil, errNotOnline } diff --git a/core/commands/swarm.go b/core/commands/swarm.go index 2d354f046..a27c672ea 100644 --- a/core/commands/swarm.go +++ b/core/commands/swarm.go @@ -51,11 +51,11 @@ ipfs swarm peers lists the set of peers this node is connected to. return nil, err } - if n.Network == nil { + if n.PeerHost == nil { return nil, errNotOnline } - conns := n.Network.Conns() + conns := n.PeerHost.Network().Conns() addrs := make([]string, len(conns)) for i, c := range conns { pid := c.RemotePeer() @@ -95,7 +95,7 @@ ipfs swarm connect /ip4/104.131.131.82/tcp/4001/QmaCpDMGvV2BGHeYERUEnRQAwe3N8Szb addrs := req.Arguments() - if n.Network == nil { + if n.PeerHost == nil { return nil, errNotOnline } @@ -108,7 +108,7 @@ ipfs swarm connect /ip4/104.131.131.82/tcp/4001/QmaCpDMGvV2BGHeYERUEnRQAwe3N8Szb for i, p := range peers { output[i] = "connect " + p.Pretty() - err := n.Network.DialPeer(ctx, p) + err := n.PeerHost.Connect(ctx, peer.PeerInfo{ID: p}) if err != nil { output[i] += " failure: " + err.Error() } else { diff --git a/core/core.go b/core/core.go index ec7d20fd1..b48e80f9c 100644 --- a/core/core.go +++ b/core/core.go @@ -20,8 +20,9 @@ import ( merkledag "github.com/jbenet/go-ipfs/merkledag" namesys "github.com/jbenet/go-ipfs/namesys" ic "github.com/jbenet/go-ipfs/p2p/crypto" - inet "github.com/jbenet/go-ipfs/p2p/net" - swarmnet "github.com/jbenet/go-ipfs/p2p/net/swarmnet" + p2phost "github.com/jbenet/go-ipfs/p2p/host" + p2pbhost "github.com/jbenet/go-ipfs/p2p/host/basic" + swarm "github.com/jbenet/go-ipfs/p2p/net/swarm" peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" pin "github.com/jbenet/go-ipfs/pin" @@ -53,7 +54,7 @@ type IpfsNode struct { // Services Peerstore peer.Peerstore // storage for other Peer instances - Network inet.Network // the network message stream + PeerHost p2phost.Host // the network host (server+client) Routing routing.IpfsRouting // the routing system. recommend ipfs-dht Exchange exchange.Interface // the block exchange + strategy (bitswap) Blocks *bserv.BlockService // the block service, get/add blocks. @@ -122,16 +123,17 @@ func NewIpfsNode(ctx context.Context, cfg *config.Config, online bool) (n *IpfsN return nil, debugerror.Wrap(err) } - n.Network, err = swarmnet.NewNetwork(ctx, listenAddrs, n.Identity, n.Peerstore) + network, err := swarm.NewNetwork(ctx, listenAddrs, n.Identity, n.Peerstore) if err != nil { return nil, debugerror.Wrap(err) } - n.AddChildGroup(n.Network.CtxGroup()) + n.AddChildGroup(network.CtxGroup()) + n.PeerHost = p2pbhost.New(network) // explicitly set these as our listen addrs. // (why not do it inside inet.NewNetwork? because this way we can // listen on addresses without necessarily advertising those publicly.) - addrs, err := n.Network.InterfaceListenAddresses() + addrs, err := n.PeerHost.Network().InterfaceListenAddresses() if err != nil { return nil, debugerror.Wrap(err) } @@ -139,10 +141,10 @@ func NewIpfsNode(ctx context.Context, cfg *config.Config, online bool) (n *IpfsN n.Peerstore.AddAddresses(n.Identity, addrs) // setup diagnostics service - n.Diagnostics = diag.NewDiagnostics(n.Identity, n.Network) + n.Diagnostics = diag.NewDiagnostics(n.Identity, n.PeerHost) // setup routing service - dhtRouting := dht.NewDHT(ctx, n.Identity, n.Network, n.Datastore) + dhtRouting := dht.NewDHT(ctx, n.PeerHost, n.Datastore) dhtRouting.Validators[IpnsValidatorTag] = namesys.ValidateIpnsRecord // TODO(brian): perform this inside NewDHT factory method @@ -151,7 +153,7 @@ func NewIpfsNode(ctx context.Context, cfg *config.Config, online bool) (n *IpfsN // setup exchange service const alwaysSendToPeer = true // use YesManStrategy - bitswapNetwork := bsnet.NewFromIpfsNetwork(n.Network, n.Routing) + bitswapNetwork := bsnet.NewFromIpfsHost(n.PeerHost, n.Routing) n.Exchange = bitswap.New(ctx, n.Identity, bitswapNetwork, blockstore, alwaysSendToPeer) @@ -161,7 +163,7 @@ func NewIpfsNode(ctx context.Context, cfg *config.Config, online bool) (n *IpfsN // an Exchange, Network, or Routing component and have the constructor // manage the wiring. In that scenario, this dangling function is a bit // awkward. - go superviseConnections(ctx, n.Network, dhtRouting, n.Peerstore, n.Config.Bootstrap) + go superviseConnections(ctx, n.PeerHost, dhtRouting, n.Peerstore, n.Config.Bootstrap) } // TODO(brian): when offline instantiate the BlockService with a bitswap diff --git a/core/mock.go b/core/mock.go index aba5e4b53..b448b2517 100644 --- a/core/mock.go +++ b/core/mock.go @@ -11,12 +11,12 @@ import ( mdag "github.com/jbenet/go-ipfs/merkledag" nsys "github.com/jbenet/go-ipfs/namesys" ci "github.com/jbenet/go-ipfs/p2p/crypto" - "github.com/jbenet/go-ipfs/p2p/net/mock" + mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" dht "github.com/jbenet/go-ipfs/routing/dht" ds2 "github.com/jbenet/go-ipfs/util/datastore2" - "github.com/jbenet/go-ipfs/util/testutil" + testutil "github.com/jbenet/go-ipfs/util/testutil" ) // TODO this is super sketch. Deprecate and initialize one that shares code @@ -44,16 +44,18 @@ func NewMockNode() (*IpfsNode, error) { nd.Peerstore = peer.NewPeerstore() nd.Peerstore.AddPrivKey(p, sk) nd.Peerstore.AddPubKey(p, pk) - nd.Network, err = mocknet.New(ctx).AddPeer(sk, testutil.RandLocalTCPAddress()) // effectively offline + + nd.PeerHost, err = mocknet.New(ctx).AddPeer(sk, testutil.RandLocalTCPAddress()) // effectively offline if err != nil { return nil, err } + // Temp Datastore dstore := ds.NewMapDatastore() nd.Datastore = ds2.CloserWrap(syncds.MutexWrap(dstore)) // Routing - dht := dht.NewDHT(ctx, nd.Identity, nd.Network, nd.Datastore) + dht := dht.NewDHT(ctx, nd.PeerHost, nd.Datastore) nd.Routing = dht // Bitswap diff --git a/diagnostics/diag.go b/diagnostics/diag.go index de24ab6f5..85625d3e0 100644 --- a/diagnostics/diag.go +++ b/diagnostics/diag.go @@ -17,21 +17,27 @@ import ( ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" - pb "github.com/jbenet/go-ipfs/diagnostics/internal/pb" - net "github.com/jbenet/go-ipfs/p2p/net" + host "github.com/jbenet/go-ipfs/p2p/host" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" + + pb "github.com/jbenet/go-ipfs/diagnostics/internal/pb" util "github.com/jbenet/go-ipfs/util" ) var log = util.Logger("diagnostics") +// ProtocolDiag is the diagnostics protocol.ID +var ProtocolDiag protocol.ID = "/ipfs/diagnostics" + const ResponseTimeout = time.Second * 10 // Diagnostics is a net service that manages requesting and responding to diagnostic // requests type Diagnostics struct { - network net.Network - self peer.ID + host host.Host + self peer.ID diagLock sync.Mutex diagMap map[string]time.Time @@ -39,15 +45,15 @@ type Diagnostics struct { } // NewDiagnostics instantiates a new diagnostics service running on the given network -func NewDiagnostics(self peer.ID, inet net.Network) *Diagnostics { +func NewDiagnostics(self peer.ID, h host.Host) *Diagnostics { d := &Diagnostics{ - network: inet, + host: h, self: self, birth: time.Now(), diagMap: make(map[string]time.Time), } - inet.SetHandler(net.ProtocolDiag, d.handleNewStream) + h.SetStreamHandler(ProtocolDiag, d.handleNewStream) return d } @@ -92,7 +98,7 @@ func (di *DiagInfo) Marshal() []byte { } func (d *Diagnostics) getPeers() []peer.ID { - return d.network.Peers() + return d.host.Network().Peers() } func (d *Diagnostics) getDiagInfo() *DiagInfo { @@ -101,10 +107,11 @@ func (d *Diagnostics) getDiagInfo() *DiagInfo { di.ID = d.self.Pretty() di.LifeSpan = time.Since(d.birth) di.Keys = nil // Currently no way to query datastore - di.BwIn, di.BwOut = d.network.BandwidthTotals() + + // di.BwIn, di.BwOut = d.host.BandwidthTotals() //TODO fix this. for _, p := range d.getPeers() { - d := connDiagInfo{d.network.Peerstore().LatencyEWMA(p), p.Pretty()} + d := connDiagInfo{d.host.Peerstore().LatencyEWMA(p), p.Pretty()} di.Connections = append(di.Connections, d) } return di @@ -197,13 +204,13 @@ func newMessage(diagID string) *pb.Message { func (d *Diagnostics) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { - s, err := d.network.NewStream(net.ProtocolDiag, p) + s, err := d.host.NewStream(ProtocolDiag, p) if err != nil { return nil, err } defer s.Close() - r := ggio.NewDelimitedReader(s, net.MessageSizeMax) + r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) w := ggio.NewDelimitedWriter(s) start := time.Now() @@ -274,7 +281,7 @@ func (d *Diagnostics) handleDiagnostic(p peer.ID, pmes *pb.Message) (*pb.Message return resp, nil } -func (d *Diagnostics) HandleMessage(ctx context.Context, s net.Stream) error { +func (d *Diagnostics) HandleMessage(ctx context.Context, s inet.Stream) error { r := ggio.NewDelimitedReader(s, 32768) // maxsize w := ggio.NewDelimitedWriter(s) @@ -312,10 +319,7 @@ func (d *Diagnostics) HandleMessage(ctx context.Context, s net.Stream) error { return nil } -func (d *Diagnostics) handleNewStream(s net.Stream) { - - go func() { - d.HandleMessage(context.Background(), s) - }() - +func (d *Diagnostics) handleNewStream(s inet.Stream) { + d.HandleMessage(context.Background(), s) + s.Close() } diff --git a/epictest/addcat_test.go b/epictest/addcat_test.go index 19f5023e3..ff6e899db 100644 --- a/epictest/addcat_test.go +++ b/epictest/addcat_test.go @@ -99,11 +99,11 @@ func DirectAddCat(data []byte, conf Config) error { return errors.New("test initialization error") } - adder, err := makeCore(ctx, MocknetTestRepo(peers[0], mn.Net(peers[0]), conf)) + adder, err := makeCore(ctx, MocknetTestRepo(peers[0], mn.Host(peers[0]), conf)) if err != nil { return err } - catter, err := makeCore(ctx, MocknetTestRepo(peers[1], mn.Net(peers[1]), conf)) + catter, err := makeCore(ctx, MocknetTestRepo(peers[1], mn.Host(peers[1]), conf)) if err != nil { return err } diff --git a/epictest/core.go b/epictest/core.go index a46b2e616..13c129ec5 100644 --- a/epictest/core.go +++ b/epictest/core.go @@ -15,7 +15,7 @@ import ( importer "github.com/jbenet/go-ipfs/importer" chunk "github.com/jbenet/go-ipfs/importer/chunk" merkledag "github.com/jbenet/go-ipfs/merkledag" - net "github.com/jbenet/go-ipfs/p2p/net" + host "github.com/jbenet/go-ipfs/p2p/host" peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" dht "github.com/jbenet/go-ipfs/routing/dht" @@ -101,7 +101,7 @@ type repo struct { blockstore blockstore.Blockstore exchange exchange.Interface datastore datastore.ThreadSafeDatastore - network net.Network + host host.Host dht *dht.IpfsDHT id peer.ID } @@ -126,16 +126,16 @@ func (r *repo) Exchange() exchange.Interface { return r.exchange } -func MocknetTestRepo(p peer.ID, n net.Network, conf Config) RepoFactory { +func MocknetTestRepo(p peer.ID, h host.Host, conf Config) RepoFactory { return func(ctx context.Context) (Repo, error) { const kWriteCacheElems = 100 const alwaysSendToPeer = true dsDelay := delay.Fixed(conf.BlockstoreLatency) ds := sync.MutexWrap(datastore2.WithDelay(datastore.NewMapDatastore(), dsDelay)) - log.Debugf("MocknetTestRepo: %s %s %s", p, n.LocalPeer(), n) - dhtt := dht.NewDHT(ctx, p, n, ds) - bsn := bsnet.NewFromIpfsNetwork(n, dhtt) + log.Debugf("MocknetTestRepo: %s %s %s", p, h.ID(), h) + dhtt := dht.NewDHT(ctx, h, ds) + bsn := bsnet.NewFromIpfsHost(h, dhtt) bstore, err := blockstore.WriteCached(blockstore.NewBlockstore(ds), kWriteCacheElems) if err != nil { return nil, err @@ -146,7 +146,7 @@ func MocknetTestRepo(p peer.ID, n net.Network, conf Config) RepoFactory { blockstore: bstore, exchange: exch, datastore: ds, - network: n, + host: h, dht: dhtt, id: p, }, nil diff --git a/epictest/three_legged_cat_test.go b/epictest/three_legged_cat_test.go index f41b850ca..38147e426 100644 --- a/epictest/three_legged_cat_test.go +++ b/epictest/three_legged_cat_test.go @@ -42,15 +42,15 @@ func RunThreeLeggedCat(data []byte, conf Config) error { if len(peers) < numPeers { return errors.New("test initialization error") } - adder, err := makeCore(ctx, MocknetTestRepo(peers[0], mn.Net(peers[0]), conf)) + adder, err := makeCore(ctx, MocknetTestRepo(peers[0], mn.Host(peers[0]), conf)) if err != nil { return err } - catter, err := makeCore(ctx, MocknetTestRepo(peers[1], mn.Net(peers[1]), conf)) + catter, err := makeCore(ctx, MocknetTestRepo(peers[1], mn.Host(peers[1]), conf)) if err != nil { return err } - bootstrap, err := makeCore(ctx, MocknetTestRepo(peers[2], mn.Net(peers[2]), conf)) + bootstrap, err := makeCore(ctx, MocknetTestRepo(peers[2], mn.Host(peers[2]), conf)) if err != nil { return err } diff --git a/exchange/bitswap/network/interface.go b/exchange/bitswap/network/interface.go index 8598898fa..7c34a352b 100644 --- a/exchange/bitswap/network/interface.go +++ b/exchange/bitswap/network/interface.go @@ -5,9 +5,12 @@ import ( bsmsg "github.com/jbenet/go-ipfs/exchange/bitswap/message" peer "github.com/jbenet/go-ipfs/p2p/peer" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" u "github.com/jbenet/go-ipfs/util" ) +var ProtocolBitswap protocol.ID = "/ipfs/bitswap" + // BitSwapNetwork provides network connectivity for BitSwap sessions type BitSwapNetwork interface { diff --git a/exchange/bitswap/network/ipfs_impl.go b/exchange/bitswap/network/ipfs_impl.go index 7c975acf2..4e349dbed 100644 --- a/exchange/bitswap/network/ipfs_impl.go +++ b/exchange/bitswap/network/ipfs_impl.go @@ -3,6 +3,7 @@ package network import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" bsmsg "github.com/jbenet/go-ipfs/exchange/bitswap/message" + host "github.com/jbenet/go-ipfs/p2p/host" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" routing "github.com/jbenet/go-ipfs/routing" @@ -11,21 +12,20 @@ import ( var log = util.Logger("bitswap_network") -// NewFromIpfsNetwork returns a BitSwapNetwork supported by underlying IPFS -// Dialer & Service -func NewFromIpfsNetwork(n inet.Network, r routing.IpfsRouting) BitSwapNetwork { +// NewFromIpfsHost returns a BitSwapNetwork supported by underlying IPFS host +func NewFromIpfsHost(host host.Host, r routing.IpfsRouting) BitSwapNetwork { bitswapNetwork := impl{ - network: n, + host: host, routing: r, } - n.SetHandler(inet.ProtocolBitswap, bitswapNetwork.handleNewStream) + host.SetStreamHandler(ProtocolBitswap, bitswapNetwork.handleNewStream) return &bitswapNetwork } // impl transforms the ipfs network interface, which sends and receives // NetMessage objects, into the bitswap network interface. type impl struct { - network inet.Network + host host.Host routing routing.IpfsRouting // inbound messages from the network are forwarded to the receiver @@ -33,7 +33,7 @@ type impl struct { } func (bsnet *impl) DialPeer(ctx context.Context, p peer.ID) error { - return bsnet.network.DialPeer(ctx, p) + return bsnet.host.Connect(ctx, peer.PeerInfo{ID: p}) } func (bsnet *impl) SendMessage( @@ -41,7 +41,7 @@ func (bsnet *impl) SendMessage( p peer.ID, outgoing bsmsg.BitSwapMessage) error { - s, err := bsnet.network.NewStream(inet.ProtocolBitswap, p) + s, err := bsnet.host.NewStream(ProtocolBitswap, p) if err != nil { return err } @@ -55,7 +55,7 @@ func (bsnet *impl) SendRequest( p peer.ID, outgoing bsmsg.BitSwapMessage) (bsmsg.BitSwapMessage, error) { - s, err := bsnet.network.NewStream(inet.ProtocolBitswap, p) + s, err := bsnet.host.NewStream(ProtocolBitswap, p) if err != nil { return nil, err } @@ -79,7 +79,7 @@ func (bsnet *impl) FindProvidersAsync(ctx context.Context, k util.Key, max int) defer close(out) providers := bsnet.routing.FindProvidersAsync(ctx, k, max) for info := range providers { - bsnet.network.Peerstore().AddAddresses(info.ID, info.Addrs) + bsnet.host.Peerstore().AddAddresses(info.ID, info.Addrs) select { case <-ctx.Done(): case out <- info.ID: diff --git a/exchange/bitswap/testnet/peernet.go b/exchange/bitswap/testnet/peernet.go index 7caa64efd..1d1d22408 100644 --- a/exchange/bitswap/testnet/peernet.go +++ b/exchange/bitswap/testnet/peernet.go @@ -25,7 +25,7 @@ func (pn *peernet) Adapter(p testutil.Identity) bsnet.BitSwapNetwork { panic(err.Error()) } routing := pn.routingserver.ClientWithDatastore(context.TODO(), p, ds.NewMapDatastore()) - return bsnet.NewFromIpfsNetwork(client, routing) + return bsnet.NewFromIpfsHost(client, routing) } func (pn *peernet) HasPeer(p peer.ID) bool { diff --git a/p2p/host/basic/basic_host.go b/p2p/host/basic/basic_host.go index 2f08b157a..5d11174e5 100644 --- a/p2p/host/basic/basic_host.go +++ b/p2p/host/basic/basic_host.go @@ -5,7 +5,7 @@ import ( eventlog "github.com/jbenet/go-ipfs/util/eventlog" - inet "github.com/jbenet/go-ipfs/p2p/net2" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" protocol "github.com/jbenet/go-ipfs/p2p/protocol" identify "github.com/jbenet/go-ipfs/p2p/protocol/identify" diff --git a/p2p/host/basic/basic_host_test.go b/p2p/host/basic/basic_host_test.go index 992991bec..0b79d3308 100644 --- a/p2p/host/basic/basic_host_test.go +++ b/p2p/host/basic/basic_host_test.go @@ -5,7 +5,7 @@ import ( "io" "testing" - inet "github.com/jbenet/go-ipfs/p2p/net2" + inet "github.com/jbenet/go-ipfs/p2p/net" protocol "github.com/jbenet/go-ipfs/p2p/protocol" testutil "github.com/jbenet/go-ipfs/p2p/test/util" diff --git a/p2p/host/host.go b/p2p/host/host.go index 944cb1b44..020322116 100644 --- a/p2p/host/host.go +++ b/p2p/host/host.go @@ -5,7 +5,7 @@ import ( eventlog "github.com/jbenet/go-ipfs/util/eventlog" - inet "github.com/jbenet/go-ipfs/p2p/net2" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" protocol "github.com/jbenet/go-ipfs/p2p/protocol" ) diff --git a/p2p/net/backpressure/backpressure.go b/p2p/net/backpressure/backpressure.go deleted file mode 100644 index 19950a728..000000000 --- a/p2p/net/backpressure/backpressure.go +++ /dev/null @@ -1 +0,0 @@ -package backpressure_tests diff --git a/p2p/net/backpressure/backpressure_test.go b/p2p/net/backpressure/backpressure_test.go deleted file mode 100644 index 510f92844..000000000 --- a/p2p/net/backpressure/backpressure_test.go +++ /dev/null @@ -1,373 +0,0 @@ -package backpressure_tests - -import ( - crand "crypto/rand" - "io" - "math/rand" - "testing" - "time" - - inet "github.com/jbenet/go-ipfs/p2p/net" - netutil "github.com/jbenet/go-ipfs/p2p/net/swarmnet/util" - peer "github.com/jbenet/go-ipfs/p2p/peer" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" -) - -var log = eventlog.Logger("backpressure") - -// TestBackpressureStreamHandler tests whether mux handler -// ratelimiting works. Meaning, since the handler is sequential -// it should block senders. -// -// Important note: spdystream (which peerstream uses) has a set -// of n workers (n=spdsystream.FRAME_WORKERS) which handle new -// frames, including those starting new streams. So all of them -// can be in the handler at one time. Also, the sending side -// does not rate limit unless we call stream.Wait() -// -// -// Note: right now, this happens muxer-wide. the muxer should -// learn to flow control, so handlers cant block each other. -func TestBackpressureStreamHandler(t *testing.T) { - t.Skip(`Sadly, as cool as this test is, it doesn't work -Because spdystream doesnt handle stream open backpressure -well IMO. I'll see about rewriting that part when it becomes -a problem. -`) - - // a number of concurrent request handlers - limit := 10 - - // our way to signal that we're done with 1 request - requestHandled := make(chan struct{}) - - // handler rate limiting - receiverRatelimit := make(chan struct{}, limit) - for i := 0; i < limit; i++ { - receiverRatelimit <- struct{}{} - } - - // sender counter of successfully opened streams - senderOpened := make(chan struct{}, limit*100) - - // sender signals it's done (errored out) - senderDone := make(chan struct{}) - - // the receiver handles requests with some rate limiting - receiver := func(s inet.Stream) { - log.Debug("receiver received a stream") - - <-receiverRatelimit // acquire - go func() { - // our request handler. can do stuff here. we - // simulate something taking time by waiting - // on requestHandled - log.Error("request worker handling...") - <-requestHandled - log.Error("request worker done!") - receiverRatelimit <- struct{}{} // release - }() - } - - // the sender opens streams as fast as possible - sender := func(net inet.Network, remote peer.ID) { - var s inet.Stream - var err error - defer func() { - t.Error(err) - log.Debug("sender error. exiting.") - senderDone <- struct{}{} - }() - - for { - s, err = net.NewStream(inet.ProtocolTesting, remote) - if err != nil { - return - } - - _ = s - // if err = s.SwarmStream().Stream().Wait(); err != nil { - // return - // } - - // "count" another successfully opened stream - // (large buffer so shouldn't block in normal operation) - log.Debug("sender opened another stream!") - senderOpened <- struct{}{} - } - } - - // count our senderOpened events - countStreamsOpenedBySender := func(min int) int { - opened := 0 - for opened < min { - log.Debugf("countStreamsOpenedBySender got %d (min %d)", opened, min) - select { - case <-senderOpened: - opened++ - case <-time.After(10 * time.Millisecond): - } - } - return opened - } - - // count our received events - // waitForNReceivedStreams := func(n int) { - // for n > 0 { - // log.Debugf("waiting for %d received streams...", n) - // select { - // case <-receiverRatelimit: - // n-- - // } - // } - // } - - testStreamsOpened := func(expected int) { - log.Debugf("testing rate limited to %d streams", expected) - if n := countStreamsOpenedBySender(expected); n != expected { - t.Fatalf("rate limiting did not work :( -- %d != %d", expected, n) - } - } - - // ok that's enough setup. let's do it! - - ctx := context.Background() - n1 := netutil.GenNetwork(t, ctx) - n2 := netutil.GenNetwork(t, ctx) - - // setup receiver handler - n1.SetHandler(inet.ProtocolTesting, receiver) - - log.Debugf("dialing %s", n2.ListenAddresses()) - if err := n1.DialPeer(ctx, n2.LocalPeer()); err != nil { - t.Fatalf("Failed to dial:", err) - } - - // launch sender! - go sender(n2, n1.LocalPeer()) - - // ok, what do we expect to happen? the receiver should - // receive 10 requests and stop receiving, blocking the sender. - // we can test this by counting 10x senderOpened requests - - <-senderOpened // wait for the sender to successfully open some. - testStreamsOpened(limit - 1) - - // let's "handle" 3 requests. - <-requestHandled - <-requestHandled - <-requestHandled - // the sender should've now been able to open exactly 3 more. - - testStreamsOpened(3) - - // shouldn't have opened anything more - testStreamsOpened(0) - - // let's "handle" 100 requests in batches of 5 - for i := 0; i < 20; i++ { - <-requestHandled - <-requestHandled - <-requestHandled - <-requestHandled - <-requestHandled - testStreamsOpened(5) - } - - // success! - - // now for the sugar on top: let's tear down the receiver. it should - // exit the sender. - n1.Close() - - // shouldn't have opened anything more - testStreamsOpened(0) - - select { - case <-time.After(100 * time.Millisecond): - t.Error("receiver shutdown failed to exit sender") - case <-senderDone: - log.Info("handler backpressure works!") - } -} - -// TestStBackpressureStreamWrite tests whether streams see proper -// backpressure when writing data over the network streams. -func TestStBackpressureStreamWrite(t *testing.T) { - - // senderWrote signals that the sender wrote bytes to remote. - // the value is the count of bytes written. - senderWrote := make(chan int, 10000) - - // sender signals it's done (errored out) - senderDone := make(chan struct{}) - - // writeStats lets us listen to all the writes and return - // how many happened and how much was written - writeStats := func() (int, int) { - writes := 0 - bytes := 0 - for { - select { - case n := <-senderWrote: - writes++ - bytes = bytes + n - default: - log.Debugf("stats: sender wrote %d bytes, %d writes", bytes, writes) - return bytes, writes - } - } - } - - // sender attempts to write as fast as possible, signaling on the - // completion of every write. This makes it possible to see how - // fast it's actually writing. We pair this with a receiver - // that waits for a signal to read. - sender := func(s inet.Stream) { - defer func() { - s.Close() - senderDone <- struct{}{} - }() - - // ready a buffer of random data - buf := make([]byte, 65536) - crand.Read(buf) - - for { - // send a randomly sized subchunk - from := rand.Intn(len(buf) / 2) - to := rand.Intn(len(buf) / 2) - sendbuf := buf[from : from+to] - - n, err := s.Write(sendbuf) - if err != nil { - log.Debug("sender error. exiting:", err) - return - } - - log.Debugf("sender wrote %d bytes", n) - senderWrote <- n - } - } - - // receive a number of bytes from a stream. - // returns the number of bytes written. - receive := func(s inet.Stream, expect int) { - log.Debugf("receiver to read %d bytes", expect) - rbuf := make([]byte, expect) - n, err := io.ReadFull(s, rbuf) - if err != nil { - t.Error("read failed:", err) - } - if expect != n { - t.Error("read len differs: %d != %d", expect, n) - } - } - - // ok let's do it! - - // setup the networks - ctx := context.Background() - n1 := netutil.GenNetwork(t, ctx) - n2 := netutil.GenNetwork(t, ctx) - - netutil.DivulgeAddresses(n1, n2) - netutil.DivulgeAddresses(n2, n1) - - // setup sender handler on 1 - n1.SetHandler(inet.ProtocolTesting, sender) - - log.Debugf("dialing %s", n2.ListenAddresses()) - if err := n1.DialPeer(ctx, n2.LocalPeer()); err != nil { - t.Fatalf("Failed to dial:", err) - } - - // open a stream, from 2->1, this is our reader - s, err := n2.NewStream(inet.ProtocolTesting, n1.LocalPeer()) - if err != nil { - t.Fatal(err) - } - - // let's make sure r/w works. - testSenderWrote := func(bytesE int) { - bytesA, writesA := writeStats() - if bytesA != bytesE { - t.Errorf("numbers failed: %d =?= %d bytes, via %d writes", bytesA, bytesE, writesA) - } - } - - // 500ms rounds of lockstep write + drain - roundsStart := time.Now() - roundsTotal := 0 - for roundsTotal < (2 << 20) { - // let the sender fill its buffers, it will stop sending. - <-time.After(300 * time.Millisecond) - b, _ := writeStats() - testSenderWrote(0) - testSenderWrote(0) - - // drain it all, wait again - receive(s, b) - roundsTotal = roundsTotal + b - } - roundsTime := time.Now().Sub(roundsStart) - - // now read continously, while we measure stats. - stop := make(chan struct{}) - contStart := time.Now() - - go func() { - for { - select { - case <-stop: - return - default: - receive(s, 2<<15) - } - } - }() - - contTotal := 0 - for contTotal < (2 << 20) { - n := <-senderWrote - contTotal += n - } - stop <- struct{}{} - contTime := time.Now().Sub(contStart) - - // now compare! continuous should've been faster AND larger - if roundsTime < contTime { - t.Error("continuous should have been faster") - } - - if roundsTotal < contTotal { - t.Error("continuous should have been larger, too!") - } - - // and a couple rounds more for good measure ;) - for i := 0; i < 3; i++ { - // let the sender fill its buffers, it will stop sending. - <-time.After(300 * time.Millisecond) - b, _ := writeStats() - testSenderWrote(0) - testSenderWrote(0) - - // drain it all, wait again - receive(s, b) - } - - // this doesn't work :(: - // // now for the sugar on top: let's tear down the receiver. it should - // // exit the sender. - // n1.Close() - // testSenderWrote(0) - // testSenderWrote(0) - // select { - // case <-time.After(2 * time.Second): - // t.Error("receiver shutdown failed to exit sender") - // case <-senderDone: - // log.Info("handler backpressure works!") - // } -} diff --git a/p2p/net/conn/conn.go b/p2p/net/conn/conn.go index 822d6bbb7..65b12f23e 100644 --- a/p2p/net/conn/conn.go +++ b/p2p/net/conn/conn.go @@ -19,11 +19,6 @@ import ( var log = eventlog.Logger("conn") -const ( - // MaxMessageSize is the size of the largest single message. (4MB) - MaxMessageSize = 1 << 22 -) - // ReleaseBuffer puts the given byte array back into the buffer pool, // first verifying that it is the correct size func ReleaseBuffer(b []byte) { @@ -48,15 +43,8 @@ func newSingleConn(ctx context.Context, local, remote peer.ID, maconn manet.Conn maconn: maconn, msgrw: msgio.NewReadWriter(maconn), } + log.Debugf("newSingleConn %p: %v to %v", conn, local, remote) - - // version handshake - if err := Handshake1(ctx, conn); err != nil { - conn.Close() - return nil, fmt.Errorf("Handshake1 failed: %s", err) - } - - log.Debugf("newSingleConn %p: %v to %v finished", conn, local, remote) return conn, nil } diff --git a/p2p/net/conn/handshake.go b/p2p/net/conn/handshake.go deleted file mode 100644 index 16f45d24c..000000000 --- a/p2p/net/conn/handshake.go +++ /dev/null @@ -1,52 +0,0 @@ -package conn - -import ( - "fmt" - - handshake "github.com/jbenet/go-ipfs/p2p/net/handshake" - hspb "github.com/jbenet/go-ipfs/p2p/net/handshake/pb" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ggprotoio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" -) - -// Handshake1 exchanges local and remote versions and compares them -// closes remote and returns an error in case of major difference -func Handshake1(ctx context.Context, c Conn) error { - rpeer := c.RemotePeer() - lpeer := c.LocalPeer() - - // setup up protobuf io - maxSize := 4096 - r := ggprotoio.NewDelimitedReader(c, maxSize) - w := ggprotoio.NewDelimitedWriter(c) - localH := handshake.Handshake1Msg() - remoteH := new(hspb.Handshake1) - - // send the outgoing handshake message - if err := w.WriteMsg(localH); err != nil { - return err - } - log.Debugf("%p sent my version (%s) to %s", c, localH, rpeer) - log.Event(ctx, "handshake1Sent", lpeer) - - select { - case <-ctx.Done(): - return ctx.Err() - default: - } - - if err := r.ReadMsg(remoteH); err != nil { - return fmt.Errorf("could not receive remote version: %q", err) - } - log.Debugf("%p received remote version (%s) from %s", c, remoteH, rpeer) - log.Event(ctx, "handshake1Received", lpeer) - - if err := handshake.Handshake1Compatible(localH, remoteH); err != nil { - log.Infof("%s (%s) incompatible version with %s (%s)", lpeer, localH, rpeer, remoteH) - return err - } - - log.Debugf("%s version handshake compatible %s", lpeer, rpeer) - return nil -} diff --git a/p2p/net/handshake/README.md b/p2p/net/handshake/README.md deleted file mode 100644 index 329112c45..000000000 --- a/p2p/net/handshake/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# IFPS Handshake - -The IPFS Protocol Handshake is divided into three sequential steps - -1. Version Handshake (`Hanshake1`) -2. Secure Channel (`NewSecureConn`) -3. Services (`Handshake3`) - -Currently these parts currently happen sequentially (costing an awful 5 RTT), -but can be optimized to 2 RTT. - -### Version Handshake - -The Version Handshake ensures that nodes speaking to each other can interoperate. -They send each other protocol versions and ensure there is a match on the major -version (semver). - -### Secure Channel - -The second part exchanges keys and establishes a secure comm channel. This -follows ECDHE TLS, but *isn't* TLS. (why will be written up elsewhere). - -### Services - -The Services portion sends any additional information on nodes needed -by the nodes, e.g. Listen Address (the received address could be a Dial addr), -and later on can include Service listing (dht, exchange, ipns, etc). diff --git a/p2p/net/handshake/doc.go b/p2p/net/handshake/doc.go deleted file mode 100644 index 3c4bff006..000000000 --- a/p2p/net/handshake/doc.go +++ /dev/null @@ -1,34 +0,0 @@ -/* -package handshake implements the ipfs handshake protocol - -IPFS Handshake - -The IPFS Protocol Handshake is divided into three sequential steps - -1. Version Handshake (`Hanshake1`) - -2. Secure Channel (`NewSecureConn`) - -3. Services (`Handshake3`) - -Currently these parts currently happen sequentially (costing an awful 5 RTT), -but can be optimized to 2 RTT. - -Version Handshake - -The Version Handshake ensures that nodes speaking to each other can interoperate. -They send each other protocol versions and ensure there is a match on the major -version (semver). - -Secure Channel - -The second part exchanges keys and establishes a secure comm channel. This -follows ECDHE TLS, but *isn't* TLS. (why will be written up elsewhere). - -Services - -The Services portion sends any additional information on nodes needed -by the nodes, e.g. Listen Address (the received address could be a Dial addr), -and later on can include Service listing (dht, exchange, ipns, etc). -*/ -package handshake diff --git a/p2p/net/handshake/handshake1.go b/p2p/net/handshake/handshake1.go deleted file mode 100644 index 66302e16a..000000000 --- a/p2p/net/handshake/handshake1.go +++ /dev/null @@ -1,68 +0,0 @@ -package handshake - -import ( - "errors" - "fmt" - - config "github.com/jbenet/go-ipfs/config" - pb "github.com/jbenet/go-ipfs/p2p/net/handshake/pb" - u "github.com/jbenet/go-ipfs/util" - - semver "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/coreos/go-semver/semver" -) - -var log = u.Logger("handshake") - -// IpfsVersion holds the current protocol version for a client running this code -var IpfsVersion *semver.Version -var ClientVersion = "go-ipfs/" + config.CurrentVersionNumber - -func init() { - var err error - IpfsVersion, err = semver.NewVersion("0.0.1") - if err != nil { - panic(fmt.Errorf("invalid protocol version: %v", err)) - } -} - -// Handshake1Msg returns the current protocol version as a protobuf message -func Handshake1Msg() *pb.Handshake1 { - return NewHandshake1(IpfsVersion.String(), ClientVersion) -} - -// ErrVersionMismatch is returned when two clients don't share a protocol version -var ErrVersionMismatch = errors.New("protocol missmatch") - -// Handshake1Compatible checks whether two versions are compatible -// returns nil if they are fine -func Handshake1Compatible(handshakeA, handshakeB *pb.Handshake1) error { - a, err := semver.NewVersion(*handshakeA.ProtocolVersion) - if err != nil { - return err - } - b, err := semver.NewVersion(*handshakeB.ProtocolVersion) - if err != nil { - return err - } - - if a.Major != b.Major { - return ErrVersionMismatch - } - - return nil -} - -// NewHandshake1 creates a new Handshake1 from the two strings -func NewHandshake1(protoVer, agentVer string) *pb.Handshake1 { - if protoVer == "" { - protoVer = IpfsVersion.String() - } - if agentVer == "" { - agentVer = ClientVersion - } - - return &pb.Handshake1{ - ProtocolVersion: &protoVer, - AgentVersion: &agentVer, - } -} diff --git a/p2p/net/handshake/handshake1_test.go b/p2p/net/handshake/handshake1_test.go deleted file mode 100644 index 78b3e6f0f..000000000 --- a/p2p/net/handshake/handshake1_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package handshake - -import "testing" - -func TestH1Compatible(t *testing.T) { - tcases := []struct { - a, b string - expected error - }{ - {"0.0.0", "0.0.0", nil}, - {"1.0.0", "1.1.0", nil}, - {"1.0.0", "1.0.1", nil}, - {"0.0.0", "1.0.0", ErrVersionMismatch}, - {"1.0.0", "0.0.0", ErrVersionMismatch}, - } - - for i, tcase := range tcases { - - if Handshake1Compatible(NewHandshake1(tcase.a, ""), NewHandshake1(tcase.b, "")) != tcase.expected { - t.Fatalf("case[%d] failed", i) - } - } -} diff --git a/p2p/net/handshake/pb/Makefile b/p2p/net/handshake/pb/Makefile deleted file mode 100644 index d08f1c3eb..000000000 --- a/p2p/net/handshake/pb/Makefile +++ /dev/null @@ -1,11 +0,0 @@ - -PB = $(wildcard *.proto) -GO = $(PB:.proto=.pb.go) - -all: $(GO) - -%.pb.go: %.proto - protoc --gogo_out=. --proto_path=../../../../../../:/usr/local/opt/protobuf/include:. $< - -clean: - rm *.pb.go diff --git a/p2p/net/handshake/pb/handshake.pb.go b/p2p/net/handshake/pb/handshake.pb.go deleted file mode 100644 index e4164788d..000000000 --- a/p2p/net/handshake/pb/handshake.pb.go +++ /dev/null @@ -1,113 +0,0 @@ -// Code generated by protoc-gen-gogo. -// source: handshake.proto -// DO NOT EDIT! - -/* -Package handshake_pb is a generated protocol buffer package. - -It is generated from these files: - handshake.proto - -It has these top-level messages: - Handshake1 - Handshake3 -*/ -package handshake_pb - -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" -import json "encoding/json" -import math "math" - -// Reference proto, json, and math imports to suppress error if they are not otherwise used. -var _ = proto.Marshal -var _ = &json.SyntaxError{} -var _ = math.Inf - -// Handshake1 is delivered _before_ the secure channel is initialized -type Handshake1 struct { - // protocolVersion determines compatibility between peers - ProtocolVersion *string `protobuf:"bytes,1,opt,name=protocolVersion" json:"protocolVersion,omitempty"` - // agentVersion is like a UserAgent string in browsers, or client version in bittorrent - // includes the client name and client. e.g. "go-ipfs/0.1.0" - AgentVersion *string `protobuf:"bytes,2,opt,name=agentVersion" json:"agentVersion,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Handshake1) Reset() { *m = Handshake1{} } -func (m *Handshake1) String() string { return proto.CompactTextString(m) } -func (*Handshake1) ProtoMessage() {} - -func (m *Handshake1) GetProtocolVersion() string { - if m != nil && m.ProtocolVersion != nil { - return *m.ProtocolVersion - } - return "" -} - -func (m *Handshake1) GetAgentVersion() string { - if m != nil && m.AgentVersion != nil { - return *m.AgentVersion - } - return "" -} - -// Handshake3 is delivered _after_ the secure channel is initialized -type Handshake3 struct { - // can include all the values in handshake1, for protocol version, etc. - H1 *Handshake1 `protobuf:"bytes,5,opt,name=h1" json:"h1,omitempty"` - // publicKey is this node's public key (which also gives its node.ID) - // - may not need to be sent, as secure channel implies it has been sent. - // - then again, if we change / disable secure channel, may still want it. - PublicKey []byte `protobuf:"bytes,1,opt,name=publicKey" json:"publicKey,omitempty"` - // listenAddrs are the multiaddrs the sender node listens for open connections on - ListenAddrs [][]byte `protobuf:"bytes,2,rep,name=listenAddrs" json:"listenAddrs,omitempty"` - // protocols are the services this node is running - Protocols []string `protobuf:"bytes,3,rep,name=protocols" json:"protocols,omitempty"` - // oservedAddr is the multiaddr of the remote endpoint that the sender node perceives - // this is useful information to convey to the other side, as it helps the remote endpoint - // determine whether its connection to the local peer goes through NAT. - ObservedAddr []byte `protobuf:"bytes,4,opt,name=observedAddr" json:"observedAddr,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Handshake3) Reset() { *m = Handshake3{} } -func (m *Handshake3) String() string { return proto.CompactTextString(m) } -func (*Handshake3) ProtoMessage() {} - -func (m *Handshake3) GetH1() *Handshake1 { - if m != nil { - return m.H1 - } - return nil -} - -func (m *Handshake3) GetPublicKey() []byte { - if m != nil { - return m.PublicKey - } - return nil -} - -func (m *Handshake3) GetListenAddrs() [][]byte { - if m != nil { - return m.ListenAddrs - } - return nil -} - -func (m *Handshake3) GetProtocols() []string { - if m != nil { - return m.Protocols - } - return nil -} - -func (m *Handshake3) GetObservedAddr() []byte { - if m != nil { - return m.ObservedAddr - } - return nil -} - -func init() { -} diff --git a/p2p/net/handshake/pb/handshake.proto b/p2p/net/handshake/pb/handshake.proto deleted file mode 100644 index 8eb699559..000000000 --- a/p2p/net/handshake/pb/handshake.proto +++ /dev/null @@ -1,38 +0,0 @@ -package handshake.pb; - -//import "github.com/jbenet/go-ipfs/net/mux/mux.proto"; - -// Handshake1 is delivered _before_ the secure channel is initialized -message Handshake1 { - // protocolVersion determines compatibility between peers - optional string protocolVersion = 1; // semver - - // agentVersion is like a UserAgent string in browsers, or client version in bittorrent - // includes the client name and client. e.g. "go-ipfs/0.1.0" - optional string agentVersion = 2; // semver - - // we'll have more fields here later. -} - -// Handshake3 is delivered _after_ the secure channel is initialized -message Handshake3 { - - // can include all the values in handshake1, for protocol version, etc. - optional Handshake1 h1 = 5; - - // publicKey is this node's public key (which also gives its node.ID) - // - may not need to be sent, as secure channel implies it has been sent. - // - then again, if we change / disable secure channel, may still want it. - optional bytes publicKey = 1; - - // listenAddrs are the multiaddrs the sender node listens for open connections on - repeated bytes listenAddrs = 2; - - // protocols are the services this node is running - repeated string protocols = 3; - - // oservedAddr is the multiaddr of the remote endpoint that the sender node perceives - // this is useful information to convey to the other side, as it helps the remote endpoint - // determine whether its connection to the local peer goes through NAT. - optional bytes observedAddr = 4; -} diff --git a/p2p/net/interface.go b/p2p/net/interface.go index 2da7e49b5..74add2bb6 100644 --- a/p2p/net/interface.go +++ b/p2p/net/interface.go @@ -4,7 +4,6 @@ import ( "io" conn "github.com/jbenet/go-ipfs/p2p/net/conn" - // swarm "github.com/jbenet/go-ipfs/p2p/net/swarm2" peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -12,20 +11,6 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ) -// ProtocolID is an identifier used to write protocol headers in streams. -type ProtocolID string - -// These are the ProtocolIDs of the protocols running. It is useful -// to keep them in one place. -const ( - ProtocolTesting ProtocolID = "/ipfs/testing" - ProtocolBitswap ProtocolID = "/ipfs/bitswap" - ProtocolDHT ProtocolID = "/ipfs/dht" - ProtocolIdentify ProtocolID = "/ipfs/id" - ProtocolDiag ProtocolID = "/ipfs/diagnostics" - ProtocolRelay ProtocolID = "/ipfs/relay" -) - // MessageSizeMax is a soft (recommended) maximum for network messages. // One can write more, as the interface is a stream. But it is useful // to bunch it up into multiple read/writes when the whole message is @@ -45,12 +30,10 @@ type Stream interface { Conn() Conn } -// StreamHandler is the function protocols who wish to listen to -// incoming streams must implement. +// StreamHandler is the type of function used to listen for +// streams opened by the remote side. type StreamHandler func(Stream) -type StreamHandlerMap map[ProtocolID]StreamHandler - // Conn is a connection to a remote peer. It multiplexes streams. // Usually there is no need to use a Conn directly, but it may // be useful to get information about the peer on the other side: @@ -58,11 +41,15 @@ type StreamHandlerMap map[ProtocolID]StreamHandler type Conn interface { conn.PeerConn - // NewStreamWithProtocol constructs a new Stream over this conn. - NewStreamWithProtocol(pr ProtocolID) (Stream, error) + // NewStream constructs a new Stream over this conn. + NewStream() (Stream, error) } -// Network is the interface IPFS uses for connecting to the world. +// ConnHandler is the type of function used to listen for +// connections opened by the remote side. +type ConnHandler func(Conn) + +// Network is the interface used to connect to the outside world. // It dials and listens for connections. it uses a Swarm to pool // connnections (see swarm pkg, and peerstream.Swarm). Connections // are encrypted with a TLS-like protocol. @@ -70,22 +57,17 @@ type Network interface { Dialer io.Closer - // SetHandler sets the protocol handler on the Network's Muxer. - // This operation is threadsafe. - SetHandler(ProtocolID, StreamHandler) + // SetStreamHandler sets the handler for new streams opened by the + // remote side. This operation is threadsafe. + SetStreamHandler(StreamHandler) - // Protocols returns the list of protocols this network currently - // has registered handlers for. - Protocols() []ProtocolID + // SetConnHandler sets the handler for new connections opened by the + // remote side. This operation is threadsafe. + SetConnHandler(ConnHandler) // NewStream returns a new stream to given peer p. // If there is no connection to p, attempts to create one. - // If ProtocolID is "", writes no header. - NewStream(ProtocolID, peer.ID) (Stream, error) - - // BandwidthTotals returns the total number of bytes passed through - // the network since it was instantiated - BandwidthTotals() (uint64, uint64) + NewStream(peer.ID) (Stream, error) // ListenAddresses returns a list of addresses at which this network listens. ListenAddresses() []ma.Multiaddr @@ -112,8 +94,8 @@ type Dialer interface { // LocalPeer returns the local peer associated with this network LocalPeer() peer.ID - // DialPeer attempts to establish a connection to a given peer - DialPeer(context.Context, peer.ID) error + // DialPeer establishes a connection to a given peer + DialPeer(context.Context, peer.ID) (Conn, error) // ClosePeer closes the connection to a given peer ClosePeer(peer.ID) error diff --git a/p2p/net/mock/interface.go b/p2p/net/mock/interface.go index a0c0fb4b3..fac6dd747 100644 --- a/p2p/net/mock/interface.go +++ b/p2p/net/mock/interface.go @@ -11,6 +11,7 @@ import ( "time" ic "github.com/jbenet/go-ipfs/p2p/crypto" + host "github.com/jbenet/go-ipfs/p2p/host" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" @@ -20,16 +21,18 @@ import ( type Mocknet interface { // GenPeer generates a peer and its inet.Network in the Mocknet - GenPeer() (inet.Network, error) + GenPeer() (host.Host, error) // AddPeer adds an existing peer. we need both a privkey and addr. // ID is derived from PrivKey - AddPeer(ic.PrivKey, ma.Multiaddr) (inet.Network, error) + AddPeer(ic.PrivKey, ma.Multiaddr) (host.Host, error) // retrieve things (with randomized iteration order) Peers() []peer.ID Net(peer.ID) inet.Network Nets() []inet.Network + Host(peer.ID) host.Host + Hosts() []host.Host Links() LinkMap LinksBetweenPeers(a, b peer.ID) []Link LinksBetweenNets(a, b inet.Network) []Link @@ -52,8 +55,8 @@ type Mocknet interface { // Connections are the usual. Connecting means Dialing. // **to succeed, peers must be linked beforehand** - ConnectPeers(peer.ID, peer.ID) error - ConnectNets(inet.Network, inet.Network) error + ConnectPeers(peer.ID, peer.ID) (inet.Conn, error) + ConnectNets(inet.Network, inet.Network) (inet.Conn, error) DisconnectPeers(peer.ID, peer.ID) error DisconnectNets(inet.Network, inet.Network) error } diff --git a/p2p/net/mock/mock.go b/p2p/net/mock/mock.go index b892a74ed..5403358cb 100644 --- a/p2p/net/mock/mock.go +++ b/p2p/net/mock/mock.go @@ -53,7 +53,7 @@ func FullMeshConnected(ctx context.Context, n int) (Mocknet, error) { nets := m.Nets() for _, n1 := range nets { for _, n2 := range nets { - if err := m.ConnectNets(n1, n2); err != nil { + if _, err := m.ConnectNets(n1, n2); err != nil { return nil, err } } diff --git a/p2p/net/mock/mock_conn.go b/p2p/net/mock/mock_conn.go index 5b4d250dd..7e58eaae5 100644 --- a/p2p/net/mock/mock_conn.go +++ b/p2p/net/mock/mock_conn.go @@ -6,7 +6,6 @@ import ( ic "github.com/jbenet/go-ipfs/p2p/crypto" inet "github.com/jbenet/go-ipfs/p2p/net" - mux "github.com/jbenet/go-ipfs/p2p/net/services/mux" peer "github.com/jbenet/go-ipfs/p2p/peer" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" @@ -83,14 +82,10 @@ func (c *conn) openStream() *stream { return sl } -func (c *conn) NewStreamWithProtocol(pr inet.ProtocolID) (inet.Stream, error) { +func (c *conn) NewStream() (inet.Stream, error) { log.Debugf("Conn.NewStreamWithProtocol: %s --> %s", c.local, c.remote) s := c.openStream() - if err := mux.WriteProtocolHeader(pr, s); err != nil { - s.Close() - return nil, err - } return s, nil } diff --git a/p2p/net/mock/mock_net.go b/p2p/net/mock/mock_net.go index 29520a9d1..d380e5173 100644 --- a/p2p/net/mock/mock_net.go +++ b/p2p/net/mock/mock_net.go @@ -3,8 +3,11 @@ package mocknet import ( "fmt" "sync" + "time" ic "github.com/jbenet/go-ipfs/p2p/crypto" + host "github.com/jbenet/go-ipfs/p2p/host" + bhost "github.com/jbenet/go-ipfs/p2p/host/basic" inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" testutil "github.com/jbenet/go-ipfs/util/testutil" @@ -16,9 +19,8 @@ import ( // mocknet implements mocknet.Mocknet type mocknet struct { - // must map on peer.ID (instead of peer.ID) because - // each inet.Network has different peerstore - nets map[peer.ID]*peernet + nets map[peer.ID]*peernet + hosts map[peer.ID]*bhost.BasicHost // links make it possible to connect two peers. // think of links as the physical medium. @@ -35,33 +37,36 @@ type mocknet struct { func New(ctx context.Context) Mocknet { return &mocknet{ nets: map[peer.ID]*peernet{}, + hosts: map[peer.ID]*bhost.BasicHost{}, links: map[peer.ID]map[peer.ID]map[*link]struct{}{}, cg: ctxgroup.WithContext(ctx), } } -func (mn *mocknet) GenPeer() (inet.Network, error) { - sk, _, err := testutil.SeededKeyPair(int64(len(mn.nets))) +func (mn *mocknet) GenPeer() (host.Host, error) { + sk, _, err := testutil.SeededKeyPair(time.Now().UnixNano()) if err != nil { return nil, err } a := testutil.RandLocalTCPAddress() - n, err := mn.AddPeer(sk, a) + h, err := mn.AddPeer(sk, a) if err != nil { return nil, err } - return n, nil + return h, nil } -func (mn *mocknet) AddPeer(k ic.PrivKey, a ma.Multiaddr) (inet.Network, error) { +func (mn *mocknet) AddPeer(k ic.PrivKey, a ma.Multiaddr) (host.Host, error) { n, err := newPeernet(mn.cg.Context(), mn, k, a) if err != nil { return nil, err } + h := bhost.New(n) + // make sure to add listening address! // this makes debugging things simpler as remembering to register // an address may cause unexpected failure. @@ -72,8 +77,9 @@ func (mn *mocknet) AddPeer(k ic.PrivKey, a ma.Multiaddr) (inet.Network, error) { mn.Lock() mn.nets[n.peer] = n + mn.hosts[n.peer] = h mn.Unlock() - return n, nil + return h, nil } func (mn *mocknet) Peers() []peer.ID { @@ -87,16 +93,29 @@ func (mn *mocknet) Peers() []peer.ID { return cp } +func (mn *mocknet) Host(pid peer.ID) host.Host { + mn.RLock() + host := mn.hosts[pid] + mn.RUnlock() + return host +} + func (mn *mocknet) Net(pid peer.ID) inet.Network { + mn.RLock() + n := mn.nets[pid] + mn.RUnlock() + return n +} + +func (mn *mocknet) Hosts() []host.Host { mn.RLock() defer mn.RUnlock() - for _, n := range mn.nets { - if n.peer == pid { - return n - } + cp := make([]host.Host, 0, len(mn.hosts)) + for _, h := range mn.hosts { + cp = append(cp, h) } - return nil + return cp } func (mn *mocknet) Nets() []inet.Network { @@ -269,7 +288,7 @@ func (mn *mocknet) ConnectAll() error { continue } - if err := mn.ConnectNets(n1, n2); err != nil { + if _, err := mn.ConnectNets(n1, n2); err != nil { return err } } @@ -277,11 +296,11 @@ func (mn *mocknet) ConnectAll() error { return nil } -func (mn *mocknet) ConnectPeers(a, b peer.ID) error { +func (mn *mocknet) ConnectPeers(a, b peer.ID) (inet.Conn, error) { return mn.Net(a).DialPeer(mn.cg.Context(), b) } -func (mn *mocknet) ConnectNets(a, b inet.Network) error { +func (mn *mocknet) ConnectNets(a, b inet.Network) (inet.Conn, error) { return a.DialPeer(mn.cg.Context(), b.LocalPeer()) } diff --git a/p2p/net/mock/mock_peernet.go b/p2p/net/mock/mock_peernet.go index b3b7cccb3..18f1ff451 100644 --- a/p2p/net/mock/mock_peernet.go +++ b/p2p/net/mock/mock_peernet.go @@ -7,9 +7,6 @@ import ( ic "github.com/jbenet/go-ipfs/p2p/crypto" inet "github.com/jbenet/go-ipfs/p2p/net" - ids "github.com/jbenet/go-ipfs/p2p/net/services/identify" - mux "github.com/jbenet/go-ipfs/p2p/net/services/mux" - relay "github.com/jbenet/go-ipfs/p2p/net/services/relay" peer "github.com/jbenet/go-ipfs/p2p/peer" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -30,10 +27,9 @@ type peernet struct { connsByPeer map[peer.ID]map[*conn]struct{} connsByLink map[*link]map[*conn]struct{} - // needed to implement inet.Network - mux mux.Mux - ids *ids.IDService - relay *relay.RelayService + // implement inet.Network + streamHandler inet.StreamHandler + connHandler inet.ConnHandler cg ctxgroup.ContextGroup sync.RWMutex @@ -58,7 +54,6 @@ func newPeernet(ctx context.Context, m *mocknet, k ic.PrivKey, mocknet: m, peer: p, ps: ps, - mux: mux.Mux{Handlers: inet.StreamHandlerMap{}}, cg: ctxgroup.WithContext(ctx), connsByPeer: map[peer.ID]map[*conn]struct{}{}, @@ -66,14 +61,6 @@ func newPeernet(ctx context.Context, m *mocknet, k ic.PrivKey, } n.cg.SetTeardown(n.teardown) - - // setup a conn handler that immediately "asks the other side about them" - // this is ProtocolIdentify. - n.ids = ids.NewIDService(n) - - // setup ProtocolRelay to allow traffic relaying. - // Feed things we get for ourselves into the muxer. - n.relay = relay.NewRelayService(n.cg.Context(), n, n.mux.HandleSync) return n, nil } @@ -104,10 +91,6 @@ func (pn *peernet) Close() error { return pn.cg.Close() } -func (pn *peernet) Protocols() []inet.ProtocolID { - return pn.mux.Protocols() -} - func (pn *peernet) Peerstore() peer.Peerstore { return pn.ps } @@ -116,24 +99,41 @@ func (pn *peernet) String() string { return fmt.Sprintf("", pn.peer, len(pn.allConns())) } -// handleNewStream is an internal function to trigger the muxer handler +// handleNewStream is an internal function to trigger the client's handler func (pn *peernet) handleNewStream(s inet.Stream) { - go pn.mux.Handle(s) + pn.RLock() + handler := pn.streamHandler + pn.RUnlock() + if handler != nil { + go handler(s) + } +} + +// handleNewConn is an internal function to trigger the client's handler +func (pn *peernet) handleNewConn(c inet.Conn) { + pn.RLock() + handler := pn.connHandler + pn.RUnlock() + if handler != nil { + go handler(c) + } } // DialPeer attempts to establish a connection to a given peer. // Respects the context. -func (pn *peernet) DialPeer(ctx context.Context, p peer.ID) error { +func (pn *peernet) DialPeer(ctx context.Context, p peer.ID) (inet.Conn, error) { return pn.connect(p) } -func (pn *peernet) connect(p peer.ID) error { +func (pn *peernet) connect(p peer.ID) (*conn, error) { // first, check if we already have live connections pn.RLock() cs, found := pn.connsByPeer[p] pn.RUnlock() if found && len(cs) > 0 { - return nil + for c := range cs { + return c, nil + } } log.Debugf("%s (newly) dialing %s", pn.peer, p) @@ -141,7 +141,7 @@ func (pn *peernet) connect(p peer.ID) error { // ok, must create a new connection. we need a link links := pn.mocknet.LinksBetweenPeers(pn.peer, p) if len(links) < 1 { - return fmt.Errorf("%s cannot connect to %s", pn.peer, p) + return nil, fmt.Errorf("%s cannot connect to %s", pn.peer, p) } // if many links found, how do we select? for now, randomly... @@ -151,8 +151,8 @@ func (pn *peernet) connect(p peer.ID) error { log.Debugf("%s dialing %s openingConn", pn.peer, p) // create a new connection with link - pn.openConn(p, l.(*link)) - return nil + c := pn.openConn(p, l.(*link)) + return c, nil } func (pn *peernet) openConn(r peer.ID, l *link) *conn { @@ -166,16 +166,15 @@ func (pn *peernet) openConn(r peer.ID, l *link) *conn { func (pn *peernet) remoteOpenedConn(c *conn) { log.Debugf("%s accepting connection from %s", pn.LocalPeer(), c.RemotePeer()) pn.addConn(c) + pn.handleNewConn(c) } // addConn constructs and adds a connection // to given remote peer over given link func (pn *peernet) addConn(c *conn) { - - // run the Identify protocol/handshake. - pn.ids.IdentifyConn(c) - pn.Lock() + defer pn.Unlock() + cs, found := pn.connsByPeer[c.RemotePeer()] if !found { cs = map[*conn]struct{}{} @@ -189,7 +188,6 @@ func (pn *peernet) addConn(c *conn) { pn.connsByLink[c.link] = cs } pn.connsByLink[c.link][c] = struct{}{} - pn.Unlock() } // removeConn removes a given conn @@ -314,15 +312,14 @@ func (pn *peernet) Connectedness(p peer.ID) inet.Connectedness { // NewStream returns a new stream to given peer p. // If there is no connection to p, attempts to create one. -// If ProtocolID is "", writes no header. -func (pn *peernet) NewStream(pr inet.ProtocolID, p peer.ID) (inet.Stream, error) { +func (pn *peernet) NewStream(p peer.ID) (inet.Stream, error) { pn.Lock() - defer pn.Unlock() - cs, found := pn.connsByPeer[p] if !found || len(cs) < 1 { + pn.Unlock() return nil, fmt.Errorf("no connection to peer") } + pn.Unlock() // if many conns are found, how do we select? for now, randomly... // this would be an interesting place to test logic that can measure @@ -336,15 +333,21 @@ func (pn *peernet) NewStream(pr inet.ProtocolID, p peer.ID) (inet.Stream, error) n-- } - return c.NewStreamWithProtocol(pr) + return c.NewStream() } -// SetHandler sets the protocol handler on the Network's Muxer. +// SetStreamHandler sets the new stream handler on the Network. // This operation is threadsafe. -func (pn *peernet) SetHandler(p inet.ProtocolID, h inet.StreamHandler) { - pn.mux.SetHandler(p, h) +func (pn *peernet) SetStreamHandler(h inet.StreamHandler) { + pn.Lock() + pn.streamHandler = h + pn.Unlock() } -func (pn *peernet) IdentifyProtocol() *ids.IDService { - return pn.ids +// SetConnHandler sets the new conn handler on the Network. +// This operation is threadsafe. +func (pn *peernet) SetConnHandler(h inet.ConnHandler) { + pn.Lock() + pn.connHandler = h + pn.Unlock() } diff --git a/p2p/net/mock/mock_test.go b/p2p/net/mock/mock_test.go index ef61bd1bd..268b35f4d 100644 --- a/p2p/net/mock/mock_test.go +++ b/p2p/net/mock/mock_test.go @@ -9,6 +9,7 @@ import ( inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" testutil "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -46,31 +47,44 @@ func TestNetworkSetup(t *testing.T) { a2 := testutil.RandLocalTCPAddress() a3 := testutil.RandLocalTCPAddress() - n1, err := mn.AddPeer(sk1, a1) + h1, err := mn.AddPeer(sk1, a1) if err != nil { t.Fatal(err) } - p1 := n1.LocalPeer() + p1 := h1.ID() - n2, err := mn.AddPeer(sk2, a2) + h2, err := mn.AddPeer(sk2, a2) if err != nil { t.Fatal(err) } - p2 := n2.LocalPeer() + p2 := h2.ID() - n3, err := mn.AddPeer(sk3, a3) + h3, err := mn.AddPeer(sk3, a3) if err != nil { t.Fatal(err) } - p3 := n3.LocalPeer() + p3 := h3.ID() // check peers and net + if mn.Host(p1) != h1 { + t.Error("host for p1.ID != h1") + } + if mn.Host(p2) != h2 { + t.Error("host for p2.ID != h2") + } + if mn.Host(p3) != h3 { + t.Error("host for p3.ID != h3") + } + + n1 := h1.Network() if mn.Net(p1) != n1 { t.Error("net for p1.ID != n1") } + n2 := h2.Network() if mn.Net(p2) != n2 { t.Error("net for p2.ID != n1") } + n3 := h3.Network() if mn.Net(p3) != n3 { t.Error("net for p3.ID != n1") } @@ -177,7 +191,7 @@ func TestNetworkSetup(t *testing.T) { } // connect p2->p3 - if err := n2.DialPeer(ctx, p3); err != nil { + if _, err := n2.DialPeer(ctx, p3); err != nil { t.Error(err) } @@ -191,41 +205,41 @@ func TestNetworkSetup(t *testing.T) { // p.NetworkConns(n3) // can create a stream 2->3, 3->2, - if _, err := n2.NewStream(inet.ProtocolDiag, p3); err != nil { + if _, err := n2.NewStream(p3); err != nil { t.Error(err) } - if _, err := n3.NewStream(inet.ProtocolDiag, p2); err != nil { + if _, err := n3.NewStream(p2); err != nil { t.Error(err) } // but not 1->2 nor 2->2 (not linked), nor 1->1 (not connected) - if _, err := n1.NewStream(inet.ProtocolDiag, p2); err == nil { + if _, err := n1.NewStream(p2); err == nil { t.Error("should not be able to connect") } - if _, err := n2.NewStream(inet.ProtocolDiag, p2); err == nil { + if _, err := n2.NewStream(p2); err == nil { t.Error("should not be able to connect") } - if _, err := n1.NewStream(inet.ProtocolDiag, p1); err == nil { + if _, err := n1.NewStream(p1); err == nil { t.Error("should not be able to connect") } // connect p1->p1 (should work) - if err := n1.DialPeer(ctx, p1); err != nil { + if _, err := n1.DialPeer(ctx, p1); err != nil { t.Error("p1 should be able to dial self.", err) } // and a stream too - if _, err := n1.NewStream(inet.ProtocolDiag, p1); err != nil { + if _, err := n1.NewStream(p1); err != nil { t.Error(err) } // connect p1->p2 - if err := n1.DialPeer(ctx, p2); err == nil { + if _, err := n1.DialPeer(ctx, p2); err == nil { t.Error("p1 should not be able to dial p2, not connected...") } // connect p3->p1 - if err := n3.DialPeer(ctx, p1); err == nil { + if _, err := n3.DialPeer(ctx, p1); err == nil { t.Error("p3 should not be able to dial p1, not connected...") } @@ -243,12 +257,12 @@ func TestNetworkSetup(t *testing.T) { // should now be able to connect // connect p1->p2 - if err := n1.DialPeer(ctx, p2); err != nil { + if _, err := n1.DialPeer(ctx, p2); err != nil { t.Error(err) } // and a stream should work now too :) - if _, err := n2.NewStream(inet.ProtocolDiag, p3); err != nil { + if _, err := n2.NewStream(p3); err != nil { t.Error(err) } @@ -262,27 +276,25 @@ func TestStreams(t *testing.T) { } handler := func(s inet.Stream) { - go func() { - b := make([]byte, 4) - if _, err := io.ReadFull(s, b); err != nil { - panic(err) - } - if !bytes.Equal(b, []byte("beep")) { - panic("bytes mismatch") - } - if _, err := s.Write([]byte("boop")); err != nil { - panic(err) - } - s.Close() - }() + b := make([]byte, 4) + if _, err := io.ReadFull(s, b); err != nil { + panic(err) + } + if !bytes.Equal(b, []byte("beep")) { + panic("bytes mismatch") + } + if _, err := s.Write([]byte("boop")); err != nil { + panic(err) + } + s.Close() } - nets := mn.Nets() - for _, n := range nets { - n.SetHandler(inet.ProtocolDHT, handler) + hosts := mn.Hosts() + for _, h := range mn.Hosts() { + h.SetStreamHandler(protocol.TestingID, handler) } - s, err := nets[0].NewStream(inet.ProtocolDHT, nets[1].LocalPeer()) + s, err := hosts[0].NewStream(protocol.TestingID, hosts[1].ID()) if err != nil { t.Fatal(err) } @@ -352,17 +364,10 @@ func TestStreamsStress(t *testing.T) { t.Fatal(err) } - protos := []inet.ProtocolID{ - inet.ProtocolDHT, - inet.ProtocolBitswap, - inet.ProtocolDiag, - } - - nets := mn.Nets() - for _, n := range nets { - for _, p := range protos { - n.SetHandler(p, makePonger(string(p))) - } + hosts := mn.Hosts() + for _, h := range hosts { + ponger := makePonger(string(protocol.TestingID)) + h.SetStreamHandler(protocol.TestingID, ponger) } var wg sync.WaitGroup @@ -370,18 +375,16 @@ func TestStreamsStress(t *testing.T) { wg.Add(1) go func(i int) { defer wg.Done() - from := rand.Intn(len(nets)) - to := rand.Intn(len(nets)) - p := rand.Intn(3) - proto := protos[p] - s, err := nets[from].NewStream(protos[p], nets[to].LocalPeer()) + from := rand.Intn(len(hosts)) + to := rand.Intn(len(hosts)) + s, err := hosts[from].NewStream(protocol.TestingID, hosts[to].ID()) if err != nil { - log.Debugf("%d (%s) %d (%s) %d (%s)", from, nets[from], to, nets[to], p, protos[p]) + log.Debugf("%d (%s) %d (%s)", from, hosts[from], to, hosts[to]) panic(err) } log.Infof("%d start pinging", i) - makePinger(string(proto), rand.Intn(100))(s) + makePinger("pingpong", rand.Intn(100))(s) log.Infof("%d done pinging", i) }(i) } @@ -401,12 +404,12 @@ func TestAdding(t *testing.T) { } a := testutil.RandLocalTCPAddress() - n, err := mn.AddPeer(sk, a) + h, err := mn.AddPeer(sk, a) if err != nil { t.Fatal(err) } - peers = append(peers, n.LocalPeer()) + peers = append(peers, h.ID()) } p1 := peers[0] @@ -422,40 +425,38 @@ func TestAdding(t *testing.T) { } // set the new stream handler on p2 - n2 := mn.Net(p2) - if n2 == nil { - t.Fatalf("no network for %s", p2) + h2 := mn.Host(p2) + if h2 == nil { + t.Fatalf("no host for %s", p2) } - n2.SetHandler(inet.ProtocolBitswap, func(s inet.Stream) { - go func() { - defer s.Close() + h2.SetStreamHandler(protocol.TestingID, func(s inet.Stream) { + defer s.Close() - b := make([]byte, 4) - if _, err := io.ReadFull(s, b); err != nil { - panic(err) - } - if string(b) != "beep" { - panic("did not beep!") - } + b := make([]byte, 4) + if _, err := io.ReadFull(s, b); err != nil { + panic(err) + } + if string(b) != "beep" { + panic("did not beep!") + } - if _, err := s.Write([]byte("boop")); err != nil { - panic(err) - } - }() + if _, err := s.Write([]byte("boop")); err != nil { + panic(err) + } }) // connect p1 to p2 - if err := mn.ConnectPeers(p1, p2); err != nil { + if _, err := mn.ConnectPeers(p1, p2); err != nil { t.Fatal(err) } // talk to p2 - n1 := mn.Net(p1) - if n1 == nil { + h1 := mn.Host(p1) + if h1 == nil { t.Fatalf("no network for %s", p1) } - s, err := n1.NewStream(inet.ProtocolBitswap, p2) + s, err := h1.NewStream(protocol.TestingID, p2) if err != nil { t.Fatal(err) } diff --git a/p2p/net/services/identify/id.go b/p2p/net/services/identify/id.go deleted file mode 100644 index ecdb9b0d8..000000000 --- a/p2p/net/services/identify/id.go +++ /dev/null @@ -1,187 +0,0 @@ -package identify - -import ( - "sync" - - ggio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/io" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - - inet "github.com/jbenet/go-ipfs/p2p/net" - handshake "github.com/jbenet/go-ipfs/p2p/net/handshake" - pb "github.com/jbenet/go-ipfs/p2p/net/handshake/pb" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" -) - -var log = eventlog.Logger("net/identify") - -// ProtocolIdentify is the ProtocolID of the Identify Service. -const ProtocolIdentify inet.ProtocolID = "/ipfs/identify" - -// IDService is a structure that implements ProtocolIdentify. -// It is a trivial service that gives the other peer some -// useful information about the local peer. A sort of hello. -// -// The IDService sends: -// * Our IPFS Protocol Version -// * Our IPFS Agent Version -// * Our public Listen Addresses -type IDService struct { - Network inet.Network - - // connections undergoing identification - // for wait purposes - currid map[inet.Conn]chan struct{} - currmu sync.RWMutex -} - -func NewIDService(n inet.Network) *IDService { - s := &IDService{ - Network: n, - currid: make(map[inet.Conn]chan struct{}), - } - n.SetHandler(ProtocolIdentify, s.RequestHandler) - return s -} - -func (ids *IDService) IdentifyConn(c inet.Conn) { - ids.currmu.Lock() - if wait, found := ids.currid[c]; found { - ids.currmu.Unlock() - log.Debugf("IdentifyConn called twice on: %s", c) - <-wait // already identifying it. wait for it. - return - } - ids.currid[c] = make(chan struct{}) - ids.currmu.Unlock() - - s, err := c.NewStreamWithProtocol(ProtocolIdentify) - if err != nil { - log.Error("network: unable to open initial stream for %s", ProtocolIdentify) - log.Event(ids.Network.CtxGroup().Context(), "IdentifyOpenFailed", c.RemotePeer()) - } else { - - // ok give the response to our handler. - ids.ResponseHandler(s) - } - - ids.currmu.Lock() - ch, found := ids.currid[c] - delete(ids.currid, c) - ids.currmu.Unlock() - - if !found { - log.Errorf("IdentifyConn failed to find channel (programmer error) for %s", c) - return - } - - close(ch) // release everyone waiting. -} - -func (ids *IDService) RequestHandler(s inet.Stream) { - defer s.Close() - c := s.Conn() - - w := ggio.NewDelimitedWriter(s) - mes := pb.Handshake3{} - ids.populateMessage(&mes, s.Conn()) - w.WriteMsg(&mes) - - log.Debugf("%s sent message to %s %s", ProtocolIdentify, - c.RemotePeer(), c.RemoteMultiaddr()) -} - -func (ids *IDService) ResponseHandler(s inet.Stream) { - defer s.Close() - c := s.Conn() - - r := ggio.NewDelimitedReader(s, 2048) - mes := pb.Handshake3{} - if err := r.ReadMsg(&mes); err != nil { - log.Errorf("%s error receiving message from %s %s", ProtocolIdentify, - c.RemotePeer(), c.RemoteMultiaddr()) - return - } - ids.consumeMessage(&mes, c) - - log.Debugf("%s received message from %s %s", ProtocolIdentify, - c.RemotePeer(), c.RemoteMultiaddr()) -} - -func (ids *IDService) populateMessage(mes *pb.Handshake3, c inet.Conn) { - - // set protocols this node is currently handling - protos := ids.Network.Protocols() - mes.Protocols = make([]string, len(protos)) - for i, p := range protos { - mes.Protocols[i] = string(p) - } - - // observed address so other side is informed of their - // "public" address, at least in relation to us. - mes.ObservedAddr = c.RemoteMultiaddr().Bytes() - - // set listen addrs - laddrs, err := ids.Network.InterfaceListenAddresses() - if err != nil { - log.Error(err) - } else { - mes.ListenAddrs = make([][]byte, len(laddrs)) - for i, addr := range laddrs { - mes.ListenAddrs[i] = addr.Bytes() - } - log.Debugf("%s sent listen addrs to %s: %s", c.LocalPeer(), c.RemotePeer(), laddrs) - } - - // set protocol versions - mes.H1 = handshake.NewHandshake1("", "") -} - -func (ids *IDService) consumeMessage(mes *pb.Handshake3, c inet.Conn) { - p := c.RemotePeer() - - // mes.Protocols - // mes.ObservedAddr - - // mes.ListenAddrs - laddrs := mes.GetListenAddrs() - lmaddrs := make([]ma.Multiaddr, 0, len(laddrs)) - for _, addr := range laddrs { - maddr, err := ma.NewMultiaddrBytes(addr) - if err != nil { - log.Errorf("%s failed to parse multiaddr from %s %s", ProtocolIdentify, p, - c.RemoteMultiaddr()) - continue - } - lmaddrs = append(lmaddrs, maddr) - } - - // update our peerstore with the addresses. - ids.Network.Peerstore().AddAddresses(p, lmaddrs) - log.Debugf("%s received listen addrs for %s: %s", c.LocalPeer(), c.RemotePeer(), lmaddrs) - - // get protocol versions - pv := *mes.H1.ProtocolVersion - av := *mes.H1.AgentVersion - ids.Network.Peerstore().Put(p, "ProtocolVersion", pv) - ids.Network.Peerstore().Put(p, "AgentVersion", av) -} - -// IdentifyWait returns a channel which will be closed once -// "ProtocolIdentify" (handshake3) finishes on given conn. -// This happens async so the connection can start to be used -// even if handshake3 knowledge is not necesary. -// Users **MUST** call IdentifyWait _after_ IdentifyConn -func (ids *IDService) IdentifyWait(c inet.Conn) <-chan struct{} { - ids.currmu.Lock() - ch, found := ids.currid[c] - ids.currmu.Unlock() - if found { - return ch - } - - // if not found, it means we are already done identifying it, or - // haven't even started. either way, return a new channel closed. - ch = make(chan struct{}) - close(ch) - return ch -} diff --git a/p2p/net/services/identify/id_test.go b/p2p/net/services/identify/id_test.go deleted file mode 100644 index 266257020..000000000 --- a/p2p/net/services/identify/id_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package identify_test - -import ( - "testing" - "time" - - inet "github.com/jbenet/go-ipfs/p2p/net" - handshake "github.com/jbenet/go-ipfs/p2p/net/handshake" - netutil "github.com/jbenet/go-ipfs/p2p/net/swarmnet/util" - peer "github.com/jbenet/go-ipfs/p2p/peer" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" -) - -func subtestIDService(t *testing.T, postDialWait time.Duration) { - - // the generated networks should have the id service wired in. - ctx := context.Background() - n1 := netutil.GenNetwork(t, ctx) - n2 := netutil.GenNetwork(t, ctx) - - n1p := n1.LocalPeer() - n2p := n2.LocalPeer() - - testKnowsAddrs(t, n1, n2p, []ma.Multiaddr{}) // nothing - testKnowsAddrs(t, n2, n1p, []ma.Multiaddr{}) // nothing - - // have n2 tell n1, so we can dial... - netutil.DivulgeAddresses(n2, n1) - - testKnowsAddrs(t, n1, n2p, n2.Peerstore().Addresses(n2p)) // has them - testKnowsAddrs(t, n2, n1p, []ma.Multiaddr{}) // nothing - - if err := n1.DialPeer(ctx, n2p); err != nil { - t.Fatalf("Failed to dial:", err) - } - - // we need to wait here if Dial returns before ID service is finished. - if postDialWait > 0 { - <-time.After(postDialWait) - } - - // the IDService should be opened automatically, by the network. - // what we should see now is that both peers know about each others listen addresses. - testKnowsAddrs(t, n1, n2p, n2.Peerstore().Addresses(n2p)) // has them - testHasProtocolVersions(t, n1, n2p) - - // now, this wait we do have to do. it's the wait for the Listening side - // to be done identifying the connection. - c := n2.ConnsToPeer(n1.LocalPeer()) - if len(c) < 1 { - t.Fatal("should have connection by now at least.") - } - <-n2.IdentifyProtocol().IdentifyWait(c[0]) - - // and the protocol versions. - testKnowsAddrs(t, n2, n1p, n1.Peerstore().Addresses(n1p)) // has them - testHasProtocolVersions(t, n2, n1p) -} - -func testKnowsAddrs(t *testing.T, n inet.Network, p peer.ID, expected []ma.Multiaddr) { - actual := n.Peerstore().Addresses(p) - - if len(actual) != len(expected) { - t.Error("dont have the same addresses") - } - - have := map[string]struct{}{} - for _, addr := range actual { - have[addr.String()] = struct{}{} - } - for _, addr := range expected { - if _, found := have[addr.String()]; !found { - t.Errorf("%s did not have addr for %s: %s", n.LocalPeer(), p, addr) - // panic("ahhhhhhh") - } - } -} - -func testHasProtocolVersions(t *testing.T, n inet.Network, p peer.ID) { - v, err := n.Peerstore().Get(p, "ProtocolVersion") - if v == nil { - t.Error("no protocol version") - return - } - if v.(string) != handshake.IpfsVersion.String() { - t.Error("protocol mismatch", err) - } - v, err = n.Peerstore().Get(p, "AgentVersion") - if v.(string) != handshake.ClientVersion { - t.Error("agent version mismatch", err) - } -} - -// TestIDServiceWait gives the ID service 100ms to finish after dialing -// this is becasue it used to be concurrent. Now, Dial wait till the -// id service is done. -func TestIDServiceWait(t *testing.T) { - N := 3 - for i := 0; i < N; i++ { - subtestIDService(t, 100*time.Millisecond) - } -} - -func TestIDServiceNoWait(t *testing.T) { - N := 3 - for i := 0; i < N; i++ { - subtestIDService(t, 0) - } -} diff --git a/p2p/net/services/mux/mux.go b/p2p/net/services/mux/mux.go deleted file mode 100644 index f47340bcc..000000000 --- a/p2p/net/services/mux/mux.go +++ /dev/null @@ -1,156 +0,0 @@ -package mux - -import ( - "fmt" - "io" - "sync" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - - inet "github.com/jbenet/go-ipfs/p2p/net" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" - lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" -) - -var log = eventlog.Logger("net/mux") - -// Mux provides simple stream multixplexing. -// It helps you precisely when: -// * You have many streams -// * You have function handlers -// -// It contains the handlers for each protocol accepted. -// It dispatches handlers for streams opened by remote peers. -// -// We use a totally ad-hoc encoding: -// <1 byte length in bytes> -// So "bitswap" is 0x0762697473776170 -// -// NOTE: only the dialer specifies this muxing line. -// This is because we're using Streams :) -// -// WARNING: this datastructure IS NOT threadsafe. -// do not modify it once the network is using it. -type Mux struct { - Default inet.StreamHandler // handles unknown protocols. - Handlers inet.StreamHandlerMap - - sync.RWMutex -} - -// Protocols returns the list of protocols this muxer has handlers for -func (m *Mux) Protocols() []inet.ProtocolID { - m.RLock() - l := make([]inet.ProtocolID, 0, len(m.Handlers)) - for p := range m.Handlers { - l = append(l, p) - } - m.RUnlock() - return l -} - -// ReadProtocolHeader reads the stream and returns the next Handler function -// according to the muxer encoding. -func (m *Mux) ReadProtocolHeader(s io.Reader) (string, inet.StreamHandler, error) { - // log.Error("ReadProtocolHeader") - name, err := ReadLengthPrefix(s) - if err != nil { - return "", nil, err - } - - // log.Debug("ReadProtocolHeader got:", name) - m.RLock() - h, found := m.Handlers[inet.ProtocolID(name)] - m.RUnlock() - - switch { - case !found && m.Default != nil: - return name, m.Default, nil - case !found && m.Default == nil: - return name, nil, fmt.Errorf("%s no handler with name: %s (%d)", m, name, len(name)) - default: - return name, h, nil - } -} - -// String returns the muxer's printing representation -func (m *Mux) String() string { - m.RLock() - defer m.RUnlock() - return fmt.Sprintf("", m, len(m.Handlers)) -} - -// SetHandler sets the protocol handler on the Network's Muxer. -// This operation is threadsafe. -func (m *Mux) SetHandler(p inet.ProtocolID, h inet.StreamHandler) { - log.Debugf("%s setting handler for protocol: %s (%d)", m, p, len(p)) - m.Lock() - m.Handlers[p] = h - m.Unlock() -} - -// Handle reads the next name off the Stream, and calls a handler function -// This is done in its own goroutine, to avoid blocking the caller. -func (m *Mux) Handle(s inet.Stream) { - go m.HandleSync(s) -} - -// HandleSync reads the next name off the Stream, and calls a handler function -// This is done synchronously. The handler function will return before -// HandleSync returns. -func (m *Mux) HandleSync(s inet.Stream) { - ctx := context.Background() - - name, handler, err := m.ReadProtocolHeader(s) - if err != nil { - err = fmt.Errorf("protocol mux error: %s", err) - log.Error(err) - log.Event(ctx, "muxError", lgbl.Error(err)) - return - } - - log.Infof("muxer handle protocol: %s", name) - log.Event(ctx, "muxHandle", eventlog.Metadata{"protocol": name}) - handler(s) -} - -// ReadLengthPrefix reads the name from Reader with a length-byte-prefix. -func ReadLengthPrefix(r io.Reader) (string, error) { - // c-string identifier - // the first byte is our length - l := make([]byte, 1) - if _, err := io.ReadFull(r, l); err != nil { - return "", err - } - length := int(l[0]) - - // the next are our identifier - name := make([]byte, length) - if _, err := io.ReadFull(r, name); err != nil { - return "", err - } - - return string(name), nil -} - -// WriteLengthPrefix writes the name into Writer with a length-byte-prefix. -func WriteLengthPrefix(w io.Writer, name string) error { - // log.Error("WriteLengthPrefix", name) - s := make([]byte, len(name)+1) - s[0] = byte(len(name)) - copy(s[1:], []byte(name)) - - _, err := w.Write(s) - return err -} - -// WriteProtocolHeader defines how a protocol is written into the header of -// a stream. This is so the muxer can multiplex between services. -func WriteProtocolHeader(pr inet.ProtocolID, s inet.Stream) error { - if pr != "" { // only write proper protocol headers - if err := WriteLengthPrefix(s, string(pr)); err != nil { - return err - } - } - return nil -} diff --git a/p2p/net/services/mux/mux_test.go b/p2p/net/services/mux/mux_test.go deleted file mode 100644 index 642226b34..000000000 --- a/p2p/net/services/mux/mux_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package mux - -import ( - "bytes" - "testing" - - inet "github.com/jbenet/go-ipfs/p2p/net" -) - -var testCases = map[string]string{ - "bitswap": "\u0007bitswap", - "dht": "\u0003dht", - "ipfs": "\u0004ipfs", - "ipfsdksnafkasnfkdajfkdajfdsjadosiaaodjasofdias": ".ipfsdksnafkasnfkdajfkdajfdsjadosiaaodjasofdias", -} - -func TestWrite(t *testing.T) { - for k, v := range testCases { - var buf bytes.Buffer - WriteLengthPrefix(&buf, k) - - v2 := buf.Bytes() - if !bytes.Equal(v2, []byte(v)) { - t.Errorf("failed: %s - %v != %v", k, []byte(v), v2) - } - } -} - -func TestHandler(t *testing.T) { - - outs := make(chan string, 10) - - h := func(n string) func(s inet.Stream) { - return func(s inet.Stream) { - outs <- n - } - } - - m := Mux{Handlers: inet.StreamHandlerMap{}} - m.Default = h("default") - m.Handlers["dht"] = h("bitswap") - // m.Handlers["ipfs"] = h("bitswap") // default! - m.Handlers["bitswap"] = h("bitswap") - m.Handlers["ipfsdksnafkasnfkdajfkdajfdsjadosiaaodjasofdias"] = h("bitswap") - - for k, v := range testCases { - var buf bytes.Buffer - if _, err := buf.Write([]byte(v)); err != nil { - t.Error(err) - continue - } - - name, _, err := m.ReadProtocolHeader(&buf) - if err != nil { - t.Error(err) - continue - } - - if name != k { - t.Errorf("name mismatch: %s != %s", k, name) - continue - } - } - -} diff --git a/p2p/net/services/relay/relay.go b/p2p/net/services/relay/relay.go deleted file mode 100644 index ec7204ba7..000000000 --- a/p2p/net/services/relay/relay.go +++ /dev/null @@ -1,159 +0,0 @@ -package relay - -import ( - "fmt" - "io" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" - - inet "github.com/jbenet/go-ipfs/p2p/net" - peer "github.com/jbenet/go-ipfs/p2p/peer" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" -) - -var log = eventlog.Logger("relay") - -// ProtocolRelay is the ProtocolID of the Relay Service. -const ProtocolRelay inet.ProtocolID = "/ipfs/relay" - -// Relay is a structure that implements ProtocolRelay. -// It is a simple relay service which forwards traffic -// between two directly connected peers. -// -// the protocol is very simple: -// -// /ipfs/relay\n -// -// -// -// -type RelayService struct { - Network inet.Network - handler inet.StreamHandler // for streams sent to us locally. - - cg ctxgroup.ContextGroup -} - -func NewRelayService(ctx context.Context, n inet.Network, sh inet.StreamHandler) *RelayService { - s := &RelayService{ - Network: n, - handler: sh, - cg: ctxgroup.WithContext(ctx), - } - n.SetHandler(inet.ProtocolRelay, s.requestHandler) - return s -} - -// requestHandler is the function called by clients -func (rs *RelayService) requestHandler(s inet.Stream) { - if err := rs.handleStream(s); err != nil { - log.Error("RelayService error:", err) - } -} - -// handleStream is our own handler, which returns an error for simplicity. -func (rs *RelayService) handleStream(s inet.Stream) error { - defer s.Close() - - // read the header (src and dst peer.IDs) - src, dst, err := ReadHeader(s) - if err != nil { - return fmt.Errorf("stream with bad header: %s", err) - } - - local := rs.Network.LocalPeer() - - switch { - case src == local: - return fmt.Errorf("relaying from self") - case dst == local: // it's for us! yaaay. - log.Debugf("%s consuming stream from %s", rs.Network.LocalPeer(), src) - return rs.consumeStream(s) - default: // src and dst are not local. relay it. - log.Debugf("%s relaying stream %s <--> %s", rs.Network.LocalPeer(), src, dst) - return rs.pipeStream(src, dst, s) - } -} - -// consumeStream connects streams directed to the local peer -// to our handler, with the header now stripped (read). -func (rs *RelayService) consumeStream(s inet.Stream) error { - rs.handler(s) // boom. - return nil -} - -// pipeStream relays over a stream to a remote peer. It's like `cat` -func (rs *RelayService) pipeStream(src, dst peer.ID, s inet.Stream) error { - s2, err := rs.openStreamToPeer(dst) - if err != nil { - return fmt.Errorf("failed to open stream to peer: %s -- %s", dst, err) - } - - if err := WriteHeader(s2, src, dst); err != nil { - return err - } - - // connect the series of tubes. - done := make(chan retio, 2) - go func() { - n, err := io.Copy(s2, s) - done <- retio{n, err} - }() - go func() { - n, err := io.Copy(s, s2) - done <- retio{n, err} - }() - - r1 := <-done - r2 := <-done - log.Infof("relayed %d/%d bytes between %s and %s", r1.n, r2.n, src, dst) - - if r1.err != nil { - return r1.err - } - return r2.err -} - -// openStreamToPeer opens a pipe to a remote endpoint -// for now, can only open streams to directly connected peers. -// maybe we can do some routing later on. -func (rs *RelayService) openStreamToPeer(p peer.ID) (inet.Stream, error) { - return rs.Network.NewStream(ProtocolRelay, p) -} - -func ReadHeader(r io.Reader) (src, dst peer.ID, err error) { - - mhr := mh.NewReader(r) - - s, err := mhr.ReadMultihash() - if err != nil { - return "", "", err - } - - d, err := mhr.ReadMultihash() - if err != nil { - return "", "", err - } - - return peer.ID(s), peer.ID(d), nil -} - -func WriteHeader(w io.Writer, src, dst peer.ID) error { - // write header to w. - mhw := mh.NewWriter(w) - if err := mhw.WriteMultihash(mh.Multihash(src)); err != nil { - return fmt.Errorf("failed to write relay header: %s -- %s", dst, err) - } - if err := mhw.WriteMultihash(mh.Multihash(dst)); err != nil { - return fmt.Errorf("failed to write relay header: %s -- %s", dst, err) - } - - return nil -} - -type retio struct { - n int64 - err error -} diff --git a/p2p/net/services/relay/relay_test.go b/p2p/net/services/relay/relay_test.go deleted file mode 100644 index f82e15677..000000000 --- a/p2p/net/services/relay/relay_test.go +++ /dev/null @@ -1,309 +0,0 @@ -package relay_test - -import ( - "io" - "testing" - - inet "github.com/jbenet/go-ipfs/p2p/net" - mux "github.com/jbenet/go-ipfs/p2p/net/services/mux" - relay "github.com/jbenet/go-ipfs/p2p/net/services/relay" - netutil "github.com/jbenet/go-ipfs/p2p/net/swarmnet/util" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" -) - -var log = eventlog.Logger("relay_test") - -func TestRelaySimple(t *testing.T) { - - ctx := context.Background() - - // these networks have the relay service wired in already. - n1 := netutil.GenNetwork(t, ctx) - n2 := netutil.GenNetwork(t, ctx) - n3 := netutil.GenNetwork(t, ctx) - - n1p := n1.LocalPeer() - n2p := n2.LocalPeer() - n3p := n3.LocalPeer() - - netutil.DivulgeAddresses(n2, n1) - netutil.DivulgeAddresses(n2, n3) - - if err := n1.DialPeer(ctx, n2p); err != nil { - t.Fatalf("Failed to dial:", err) - } - if err := n3.DialPeer(ctx, n2p); err != nil { - t.Fatalf("Failed to dial:", err) - } - - // setup handler on n3 to copy everything over to the pipe. - piper, pipew := io.Pipe() - n3.SetHandler(inet.ProtocolTesting, func(s inet.Stream) { - log.Debug("relay stream opened to n3!") - log.Debug("piping and echoing everything") - w := io.MultiWriter(s, pipew) - io.Copy(w, s) - log.Debug("closing stream") - s.Close() - }) - - // ok, now we can try to relay n1--->n2--->n3. - log.Debug("open relay stream") - s, err := n1.NewStream(relay.ProtocolRelay, n2p) - if err != nil { - t.Fatal(err) - } - - // ok first thing we write the relay header n1->n3 - log.Debug("write relay header") - if err := relay.WriteHeader(s, n1p, n3p); err != nil { - t.Fatal(err) - } - - // ok now the header's there, we can write the next protocol header. - log.Debug("write testing header") - if err := mux.WriteProtocolHeader(inet.ProtocolTesting, s); err != nil { - t.Fatal(err) - } - - // okay, now we should be able to write text, and read it out. - buf1 := []byte("abcdefghij") - buf2 := make([]byte, 10) - buf3 := make([]byte, 10) - log.Debug("write in some text.") - if _, err := s.Write(buf1); err != nil { - t.Fatal(err) - } - - // read it out from the pipe. - log.Debug("read it out from the pipe.") - if _, err := io.ReadFull(piper, buf2); err != nil { - t.Fatal(err) - } - if string(buf1) != string(buf2) { - t.Fatal("should've gotten that text out of the pipe") - } - - // read it out from the stream (echoed) - log.Debug("read it out from the stream (echoed).") - if _, err := io.ReadFull(s, buf3); err != nil { - t.Fatal(err) - } - if string(buf1) != string(buf3) { - t.Fatal("should've gotten that text out of the stream") - } - - // sweet. relay works. - log.Debug("sweet, relay works.") - s.Close() -} - -func TestRelayAcrossFour(t *testing.T) { - - ctx := context.Background() - - // these networks have the relay service wired in already. - n1 := netutil.GenNetwork(t, ctx) - n2 := netutil.GenNetwork(t, ctx) - n3 := netutil.GenNetwork(t, ctx) - n4 := netutil.GenNetwork(t, ctx) - n5 := netutil.GenNetwork(t, ctx) - - n1p := n1.LocalPeer() - n2p := n2.LocalPeer() - n3p := n3.LocalPeer() - n4p := n4.LocalPeer() - n5p := n5.LocalPeer() - - netutil.DivulgeAddresses(n2, n1) - netutil.DivulgeAddresses(n2, n3) - netutil.DivulgeAddresses(n4, n3) - netutil.DivulgeAddresses(n4, n5) - - if err := n1.DialPeer(ctx, n2p); err != nil { - t.Fatalf("Failed to dial:", err) - } - if err := n3.DialPeer(ctx, n2p); err != nil { - t.Fatalf("Failed to dial:", err) - } - if err := n3.DialPeer(ctx, n4p); err != nil { - t.Fatalf("Failed to dial:", err) - } - if err := n5.DialPeer(ctx, n4p); err != nil { - t.Fatalf("Failed to dial:", err) - } - - // setup handler on n5 to copy everything over to the pipe. - piper, pipew := io.Pipe() - n5.SetHandler(inet.ProtocolTesting, func(s inet.Stream) { - log.Debug("relay stream opened to n5!") - log.Debug("piping and echoing everything") - w := io.MultiWriter(s, pipew) - io.Copy(w, s) - log.Debug("closing stream") - s.Close() - }) - - // ok, now we can try to relay n1--->n2--->n3--->n4--->n5 - log.Debug("open relay stream") - s, err := n1.NewStream(relay.ProtocolRelay, n2p) - if err != nil { - t.Fatal(err) - } - - log.Debugf("write relay header n1->n3 (%s -> %s)", n1p, n3p) - if err := relay.WriteHeader(s, n1p, n3p); err != nil { - t.Fatal(err) - } - - log.Debugf("write relay header n1->n4 (%s -> %s)", n1p, n4p) - if err := mux.WriteProtocolHeader(relay.ProtocolRelay, s); err != nil { - t.Fatal(err) - } - if err := relay.WriteHeader(s, n1p, n4p); err != nil { - t.Fatal(err) - } - - log.Debugf("write relay header n1->n5 (%s -> %s)", n1p, n5p) - if err := mux.WriteProtocolHeader(relay.ProtocolRelay, s); err != nil { - t.Fatal(err) - } - if err := relay.WriteHeader(s, n1p, n5p); err != nil { - t.Fatal(err) - } - - // ok now the header's there, we can write the next protocol header. - log.Debug("write testing header") - if err := mux.WriteProtocolHeader(inet.ProtocolTesting, s); err != nil { - t.Fatal(err) - } - - // okay, now we should be able to write text, and read it out. - buf1 := []byte("abcdefghij") - buf2 := make([]byte, 10) - buf3 := make([]byte, 10) - log.Debug("write in some text.") - if _, err := s.Write(buf1); err != nil { - t.Fatal(err) - } - - // read it out from the pipe. - log.Debug("read it out from the pipe.") - if _, err := io.ReadFull(piper, buf2); err != nil { - t.Fatal(err) - } - if string(buf1) != string(buf2) { - t.Fatal("should've gotten that text out of the pipe") - } - - // read it out from the stream (echoed) - log.Debug("read it out from the stream (echoed).") - if _, err := io.ReadFull(s, buf3); err != nil { - t.Fatal(err) - } - if string(buf1) != string(buf3) { - t.Fatal("should've gotten that text out of the stream") - } - - // sweet. relay works. - log.Debug("sweet, relaying across 4 works.") - s.Close() -} - -func TestRelayStress(t *testing.T) { - buflen := 1 << 18 - iterations := 10 - - ctx := context.Background() - - // these networks have the relay service wired in already. - n1 := netutil.GenNetwork(t, ctx) - n2 := netutil.GenNetwork(t, ctx) - n3 := netutil.GenNetwork(t, ctx) - - n1p := n1.LocalPeer() - n2p := n2.LocalPeer() - n3p := n3.LocalPeer() - - netutil.DivulgeAddresses(n2, n1) - netutil.DivulgeAddresses(n2, n3) - - if err := n1.DialPeer(ctx, n2p); err != nil { - t.Fatalf("Failed to dial:", err) - } - if err := n3.DialPeer(ctx, n2p); err != nil { - t.Fatalf("Failed to dial:", err) - } - - // setup handler on n3 to copy everything over to the pipe. - piper, pipew := io.Pipe() - n3.SetHandler(inet.ProtocolTesting, func(s inet.Stream) { - log.Debug("relay stream opened to n3!") - log.Debug("piping and echoing everything") - w := io.MultiWriter(s, pipew) - io.Copy(w, s) - log.Debug("closing stream") - s.Close() - }) - - // ok, now we can try to relay n1--->n2--->n3. - log.Debug("open relay stream") - s, err := n1.NewStream(relay.ProtocolRelay, n2p) - if err != nil { - t.Fatal(err) - } - - // ok first thing we write the relay header n1->n3 - log.Debug("write relay header") - if err := relay.WriteHeader(s, n1p, n3p); err != nil { - t.Fatal(err) - } - - // ok now the header's there, we can write the next protocol header. - log.Debug("write testing header") - if err := mux.WriteProtocolHeader(inet.ProtocolTesting, s); err != nil { - t.Fatal(err) - } - - // okay, now write lots of text and read it back out from both - // the pipe and the stream. - buf1 := make([]byte, buflen) - buf2 := make([]byte, len(buf1)) - buf3 := make([]byte, len(buf1)) - - fillbuf := func(buf []byte, b byte) { - for i := range buf { - buf[i] = b - } - } - - for i := 0; i < iterations; i++ { - fillbuf(buf1, byte(int('a')+i)) - log.Debugf("writing %d bytes (%d/%d)", len(buf1), i, iterations) - if _, err := s.Write(buf1); err != nil { - t.Fatal(err) - } - - log.Debug("read it out from the pipe.") - if _, err := io.ReadFull(piper, buf2); err != nil { - t.Fatal(err) - } - if string(buf1) != string(buf2) { - t.Fatal("should've gotten that text out of the pipe") - } - - // read it out from the stream (echoed) - log.Debug("read it out from the stream (echoed).") - if _, err := io.ReadFull(s, buf3); err != nil { - t.Fatal(err) - } - if string(buf1) != string(buf3) { - t.Fatal("should've gotten that text out of the stream") - } - } - - log.Debug("sweet, relay works under stress.") - s.Close() -} diff --git a/p2p/net/swarm/swarm.go b/p2p/net/swarm/swarm.go index 2aa5a2bf9..96c07d015 100644 --- a/p2p/net/swarm/swarm.go +++ b/p2p/net/swarm/swarm.go @@ -3,6 +3,7 @@ package swarm import ( + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" eventlog "github.com/jbenet/go-ipfs/util/eventlog" @@ -92,7 +93,7 @@ func (s *Swarm) SetConnHandler(handler ConnHandler) { // SetStreamHandler assigns the handler for new streams. // See peerstream. -func (s *Swarm) SetStreamHandler(handler StreamHandler) { +func (s *Swarm) SetStreamHandler(handler inet.StreamHandler) { s.swarm.SetStreamHandler(func(s *ps.Stream) { handler(wrapStream(s)) }) diff --git a/p2p/net/swarm/swarm_conn.go b/p2p/net/swarm/swarm_conn.go index f5993e704..580f88fae 100644 --- a/p2p/net/swarm/swarm_conn.go +++ b/p2p/net/swarm/swarm_conn.go @@ -4,6 +4,7 @@ import ( "fmt" ic "github.com/jbenet/go-ipfs/p2p/crypto" + inet "github.com/jbenet/go-ipfs/p2p/net" conn "github.com/jbenet/go-ipfs/p2p/net/conn" peer "github.com/jbenet/go-ipfs/p2p/peer" @@ -74,12 +75,18 @@ func (c *Conn) RemotePublicKey() ic.PubKey { return c.RawConn().RemotePublicKey() } -// NewStream returns a new Stream from this connection -func (c *Conn) NewStream() (*Stream, error) { +// NewSwarmStream returns a new Stream from this connection +func (c *Conn) NewSwarmStream() (*Stream, error) { s, err := c.StreamConn().NewStream() return wrapStream(s), err } +// NewStream returns a new Stream from this connection +func (c *Conn) NewStream() (inet.Stream, error) { + s, err := c.NewSwarmStream() + return inet.Stream(s), err +} + func (c *Conn) Close() error { return c.StreamConn().Close() } diff --git a/p2p/net2/swarm/swarm_net.go b/p2p/net/swarm/swarm_net.go similarity index 99% rename from p2p/net2/swarm/swarm_net.go rename to p2p/net/swarm/swarm_net.go index eab60a36f..42230105f 100644 --- a/p2p/net2/swarm/swarm_net.go +++ b/p2p/net/swarm/swarm_net.go @@ -5,7 +5,7 @@ import ( peer "github.com/jbenet/go-ipfs/p2p/peer" - inet "github.com/jbenet/go-ipfs/p2p/net2" + inet "github.com/jbenet/go-ipfs/p2p/net" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" diff --git a/p2p/net2/swarm/swarm_net_test.go b/p2p/net/swarm/swarm_net_test.go similarity index 90% rename from p2p/net2/swarm/swarm_net_test.go rename to p2p/net/swarm/swarm_net_test.go index a0670b691..3849838ba 100644 --- a/p2p/net2/swarm/swarm_net_test.go +++ b/p2p/net/swarm/swarm_net_test.go @@ -8,7 +8,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" inet "github.com/jbenet/go-ipfs/p2p/net" - netutil "github.com/jbenet/go-ipfs/p2p/net/swarmnet/util" + testutil "github.com/jbenet/go-ipfs/p2p/test/util" ) // TestConnectednessCorrect starts a few networks, connects a few @@ -19,14 +19,14 @@ func TestConnectednessCorrect(t *testing.T) { nets := make([]inet.Network, 4) for i := 0; i < 4; i++ { - nets[i] = netutil.GenNetwork(t, ctx) + nets[i] = testutil.GenSwarmNetwork(t, ctx) } // connect 0-1, 0-2, 0-3, 1-2, 2-3 dial := func(a, b inet.Network) { - netutil.DivulgeAddresses(b, a) - if err := a.DialPeer(ctx, b.LocalPeer()); err != nil { + testutil.DivulgeAddresses(b, a) + if _, err := a.DialPeer(ctx, b.LocalPeer()); err != nil { t.Fatalf("Failed to dial: %s", err) } } diff --git a/p2p/net/swarm/swarm_stream.go b/p2p/net/swarm/swarm_stream.go index 7fe23f92b..abd641ff0 100644 --- a/p2p/net/swarm/swarm_stream.go +++ b/p2p/net/swarm/swarm_stream.go @@ -1,6 +1,8 @@ package swarm import ( + inet "github.com/jbenet/go-ipfs/p2p/net" + ps "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-peerstream" ) @@ -8,17 +10,18 @@ import ( // our Conn and Swarm (instead of just the ps.Conn and ps.Swarm) type Stream ps.Stream -// StreamHandler is called when new streams are opened from remote peers. -// See peerstream.StreamHandler -type StreamHandler func(*Stream) - // Stream returns the underlying peerstream.Stream func (s *Stream) Stream() *ps.Stream { return (*ps.Stream)(s) } -// Conn returns the Conn associated with this Stream -func (s *Stream) Conn() *Conn { +// Conn returns the Conn associated with this Stream, as an inet.Conn +func (s *Stream) Conn() inet.Conn { + return s.SwarmConn() +} + +// SwarmConn returns the Conn associated with this Stream, as a *Conn +func (s *Stream) SwarmConn() *Conn { return (*Conn)(s.Stream().Conn()) } diff --git a/p2p/net/swarm/swarm_test.go b/p2p/net/swarm/swarm_test.go index 510ee3619..ee3f8af69 100644 --- a/p2p/net/swarm/swarm_test.go +++ b/p2p/net/swarm/swarm_test.go @@ -7,6 +7,7 @@ import ( "testing" "time" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" errors "github.com/jbenet/go-ipfs/util/debugerror" testutil "github.com/jbenet/go-ipfs/util/testutil" @@ -15,12 +16,12 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ) -func EchoStreamHandler(stream *Stream) { +func EchoStreamHandler(stream inet.Stream) { go func() { defer stream.Close() // pull out the ipfs conn - c := stream.Conn().RawConn() + c := stream.Conn() log.Debugf("%s ponging to %s", c.LocalPeer(), c.RemotePeer()) buf := make([]byte, 4) diff --git a/p2p/net/swarmnet/net.go b/p2p/net/swarmnet/net.go deleted file mode 100644 index ff5e60ec1..000000000 --- a/p2p/net/swarmnet/net.go +++ /dev/null @@ -1,309 +0,0 @@ -// Package net provides an interface for ipfs to interact with the network through -package net - -import ( - "fmt" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - peer "github.com/jbenet/go-ipfs/p2p/peer" - - inet "github.com/jbenet/go-ipfs/p2p/net" - ids "github.com/jbenet/go-ipfs/p2p/net/services/identify" - mux "github.com/jbenet/go-ipfs/p2p/net/services/mux" - relay "github.com/jbenet/go-ipfs/p2p/net/services/relay" - swarm "github.com/jbenet/go-ipfs/p2p/net/swarm" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" -) - -var log = eventlog.Logger("net/mux") - -type stream swarm.Stream - -func (s *stream) SwarmStream() *swarm.Stream { - return (*swarm.Stream)(s) -} - -// Conn returns the connection this stream is part of. -func (s *stream) Conn() inet.Conn { - c := s.SwarmStream().Conn() - return (*conn_)(c) -} - -// Conn returns the connection this stream is part of. -func (s *stream) Close() error { - return s.SwarmStream().Close() -} - -// Read reads bytes from a stream. -func (s *stream) Read(p []byte) (n int, err error) { - return s.SwarmStream().Read(p) -} - -// Write writes bytes to a stream, flushing for each call. -func (s *stream) Write(p []byte) (n int, err error) { - return s.SwarmStream().Write(p) -} - -type conn_ swarm.Conn - -func (s *conn_) String() string { - return s.SwarmConn().String() -} - -func (c *conn_) SwarmConn() *swarm.Conn { - return (*swarm.Conn)(c) -} - -func (c *conn_) NewStreamWithProtocol(pr inet.ProtocolID) (inet.Stream, error) { - s, err := (*swarm.Conn)(c).NewStream() - if err != nil { - return nil, err - } - - ss := (*stream)(s) - - if err := mux.WriteProtocolHeader(pr, ss); err != nil { - ss.Close() - return nil, err - } - - return ss, nil -} - -func (c *conn_) LocalMultiaddr() ma.Multiaddr { - return c.SwarmConn().LocalMultiaddr() -} - -func (c *conn_) RemoteMultiaddr() ma.Multiaddr { - return c.SwarmConn().RemoteMultiaddr() -} - -func (c *conn_) LocalPeer() peer.ID { - return c.SwarmConn().LocalPeer() -} - -func (c *conn_) RemotePeer() peer.ID { - return c.SwarmConn().RemotePeer() -} - -func (c *conn_) LocalPrivateKey() ic.PrivKey { - return c.SwarmConn().LocalPrivateKey() -} - -func (c *conn_) RemotePublicKey() ic.PubKey { - return c.SwarmConn().RemotePublicKey() -} - -// Network implements the inet.Network interface. -// It uses a swarm to connect to remote hosts. -type Network struct { - local peer.ID // local peer - ps peer.Peerstore - - swarm *swarm.Swarm // peer connection multiplexing - mux mux.Mux // protocol multiplexing - ids *ids.IDService - relay *relay.RelayService - - cg ctxgroup.ContextGroup // for Context closing -} - -// NewNetwork constructs a new network and starts listening on given addresses. -func NewNetwork(ctx context.Context, listen []ma.Multiaddr, local peer.ID, - peers peer.Peerstore) (*Network, error) { - - s, err := swarm.NewSwarm(ctx, listen, local, peers) - if err != nil { - return nil, err - } - - n := &Network{ - local: local, - swarm: s, - mux: mux.Mux{Handlers: inet.StreamHandlerMap{}}, - cg: ctxgroup.WithContext(ctx), - ps: peers, - } - - n.cg.SetTeardown(n.close) - n.cg.AddChildGroup(s.CtxGroup()) - - s.SetStreamHandler(func(s *swarm.Stream) { - n.mux.Handle((*stream)(s)) - }) - - // setup ProtocolIdentify to immediately "asks the other side about them" - n.ids = ids.NewIDService(n) - s.SetConnHandler(n.newConnHandler) - - // setup ProtocolRelay to allow traffic relaying. - // Feed things we get for ourselves into the muxer. - n.relay = relay.NewRelayService(n.cg.Context(), n, n.mux.HandleSync) - return n, nil -} - -func (n *Network) newConnHandler(c *swarm.Conn) { - cc := (*conn_)(c) - n.ids.IdentifyConn(cc) -} - -// DialPeer attempts to establish a connection to a given peer. -// Respects the context. -func (n *Network) DialPeer(ctx context.Context, p peer.ID) error { - log.Debugf("[%s] network dialing peer [%s]", n.local, p) - sc, err := n.swarm.Dial(ctx, p) - if err != nil { - return err - } - - // identify the connection before returning. - done := make(chan struct{}) - go func() { - n.ids.IdentifyConn((*conn_)(sc)) - close(done) - }() - - // respect don contexteone - select { - case <-done: - case <-ctx.Done(): - return ctx.Err() - } - - log.Debugf("network for %s finished dialing %s", n.local, p) - return nil -} - -// Protocols returns the ProtocolIDs of all the registered handlers. -func (n *Network) Protocols() []inet.ProtocolID { - return n.mux.Protocols() -} - -// CtxGroup returns the network's ContextGroup -func (n *Network) CtxGroup() ctxgroup.ContextGroup { - return n.cg -} - -// Swarm returns the network's peerstream.Swarm -func (n *Network) Swarm() *swarm.Swarm { - return n.Swarm() -} - -// LocalPeer the network's LocalPeer -func (n *Network) LocalPeer() peer.ID { - return n.swarm.LocalPeer() -} - -// Peers returns the connected peers -func (n *Network) Peers() []peer.ID { - return n.swarm.Peers() -} - -// Peers returns the connected peers -func (n *Network) Peerstore() peer.Peerstore { - return n.ps -} - -// Conns returns the connected peers -func (n *Network) Conns() []inet.Conn { - conns1 := n.swarm.Connections() - out := make([]inet.Conn, len(conns1)) - for i, c := range conns1 { - out[i] = (*conn_)(c) - } - return out -} - -// ConnsToPeer returns the connections in this Netowrk for given peer. -func (n *Network) ConnsToPeer(p peer.ID) []inet.Conn { - conns1 := n.swarm.ConnectionsToPeer(p) - out := make([]inet.Conn, len(conns1)) - for i, c := range conns1 { - out[i] = (*conn_)(c) - } - return out -} - -// ClosePeer connection to peer -func (n *Network) ClosePeer(p peer.ID) error { - return n.swarm.CloseConnection(p) -} - -// close is the real teardown function -func (n *Network) close() error { - return n.swarm.Close() -} - -// Close calls the ContextCloser func -func (n *Network) Close() error { - return n.cg.Close() -} - -// BandwidthTotals returns the total amount of bandwidth transferred -func (n *Network) BandwidthTotals() (in uint64, out uint64) { - // need to implement this. probably best to do it in swarm this time. - // need a "metrics" object - return 0, 0 -} - -// ListenAddresses returns a list of addresses at which this network listens. -func (n *Network) ListenAddresses() []ma.Multiaddr { - return n.swarm.ListenAddresses() -} - -// InterfaceListenAddresses returns a list of addresses at which this network -// listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to -// use the known local interfaces. -func (n *Network) InterfaceListenAddresses() ([]ma.Multiaddr, error) { - return swarm.InterfaceListenAddresses(n.swarm) -} - -// Connectedness returns a state signaling connection capabilities -// For now only returns Connected || NotConnected. Expand into more later. -func (n *Network) Connectedness(p peer.ID) inet.Connectedness { - c := n.swarm.ConnectionsToPeer(p) - if c != nil && len(c) > 0 { - return inet.Connected - } - return inet.NotConnected -} - -// NewStream returns a new stream to given peer p. -// If there is no connection to p, attempts to create one. -// If ProtocolID is "", writes no header. -func (n *Network) NewStream(pr inet.ProtocolID, p peer.ID) (inet.Stream, error) { - log.Debugf("[%s] network opening stream to peer [%s]: %s", n.local, p, pr) - s, err := n.swarm.NewStreamWithPeer(p) - if err != nil { - return nil, err - } - - ss := (*stream)(s) - - if err := mux.WriteProtocolHeader(pr, ss); err != nil { - ss.Close() - return nil, err - } - - return ss, nil -} - -// SetHandler sets the protocol handler on the Network's Muxer. -// This operation is threadsafe. -func (n *Network) SetHandler(p inet.ProtocolID, h inet.StreamHandler) { - n.mux.SetHandler(p, h) -} - -// String returns a string representation of Network. -func (n *Network) String() string { - return fmt.Sprintf("", n.LocalPeer()) -} - -// IdentifyProtocol returns the network's IDService -func (n *Network) IdentifyProtocol() *ids.IDService { - return n.ids -} diff --git a/p2p/net/swarmnet/net_test.go b/p2p/net/swarmnet/net_test.go deleted file mode 100644 index 90067e0fb..000000000 --- a/p2p/net/swarmnet/net_test.go +++ /dev/null @@ -1,78 +0,0 @@ -package net_test - -import ( - "fmt" - "testing" - "time" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - - inet "github.com/jbenet/go-ipfs/p2p/net" - netutil "github.com/jbenet/go-ipfs/p2p/net/swarmnet/util" -) - -// TestConnectednessCorrect starts a few networks, connects a few -// and tests Connectedness value is correct. -func TestConnectednessCorrect(t *testing.T) { - - ctx := context.Background() - - nets := make([]inet.Network, 4) - for i := 0; i < 4; i++ { - nets[i] = netutil.GenNetwork(t, ctx) - } - - // connect 0-1, 0-2, 0-3, 1-2, 2-3 - - dial := func(a, b inet.Network) { - netutil.DivulgeAddresses(b, a) - if err := a.DialPeer(ctx, b.LocalPeer()); err != nil { - t.Fatalf("Failed to dial: %s", err) - } - } - - dial(nets[0], nets[1]) - dial(nets[0], nets[3]) - dial(nets[1], nets[2]) - dial(nets[3], nets[2]) - - // there's something wrong with dial, i think. it's not finishing - // completely. there must be some async stuff. - <-time.After(100 * time.Millisecond) - - // test those connected show up correctly - - // test connected - expectConnectedness(t, nets[0], nets[1], inet.Connected) - expectConnectedness(t, nets[0], nets[3], inet.Connected) - expectConnectedness(t, nets[1], nets[2], inet.Connected) - expectConnectedness(t, nets[3], nets[2], inet.Connected) - - // test not connected - expectConnectedness(t, nets[0], nets[2], inet.NotConnected) - expectConnectedness(t, nets[1], nets[3], inet.NotConnected) - - for _, n := range nets { - n.Close() - } -} - -func expectConnectedness(t *testing.T, a, b inet.Network, expected inet.Connectedness) { - es := "%s is connected to %s, but Connectedness incorrect. %s %s" - if a.Connectedness(b.LocalPeer()) != expected { - t.Errorf(es, a, b, printConns(a), printConns(b)) - } - - // test symmetric case - if b.Connectedness(a.LocalPeer()) != expected { - t.Errorf(es, b, a, printConns(b), printConns(a)) - } -} - -func printConns(n inet.Network) string { - s := fmt.Sprintf("Connections in %s:\n", n) - for _, c := range n.Conns() { - s = s + fmt.Sprintf("- %s\n", c) - } - return s -} diff --git a/p2p/net/swarmnet/util/util.go b/p2p/net/swarmnet/util/util.go deleted file mode 100644 index f82f11789..000000000 --- a/p2p/net/swarmnet/util/util.go +++ /dev/null @@ -1,31 +0,0 @@ -package testutil - -import ( - "testing" - - inet "github.com/jbenet/go-ipfs/p2p/net" - sn "github.com/jbenet/go-ipfs/p2p/net/swarmnet" - peer "github.com/jbenet/go-ipfs/p2p/peer" - tu "github.com/jbenet/go-ipfs/util/testutil" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" -) - -func GenNetwork(t *testing.T, ctx context.Context) *sn.Network { - p := tu.RandPeerNetParamsOrFatal(t) - ps := peer.NewPeerstore() - ps.AddAddress(p.ID, p.Addr) - ps.AddPubKey(p.ID, p.PubKey) - ps.AddPrivKey(p.ID, p.PrivKey) - n, err := sn.NewNetwork(ctx, ps.Addresses(p.ID), p.ID, ps) - if err != nil { - t.Fatal(err) - } - return n -} - -func DivulgeAddresses(a, b inet.Network) { - id := a.LocalPeer() - addrs := a.Peerstore().Addresses(id) - b.Peerstore().AddAddresses(id, addrs) -} diff --git a/p2p/net2/README.md b/p2p/net2/README.md deleted file mode 100644 index a1cf6aacf..000000000 --- a/p2p/net2/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Network - -The IPFS Network package handles all of the peer-to-peer networking. It connects to other hosts, it encrypts communications, it muxes messages between the network's client services and target hosts. It has multiple subcomponents: - -- `Conn` - a connection to a single Peer - - `MultiConn` - a set of connections to a single Peer - - `SecureConn` - an encrypted (tls-like) connection -- `Swarm` - holds connections to Peers, multiplexes from/to each `MultiConn` -- `Muxer` - multiplexes between `Services` and `Swarm`. Handles `Requet/Reply`. - - `Service` - connects between an outside client service and Network. - - `Handler` - the client service part that handles requests - -It looks a bit like this: - -
    -![](https://docs.google.com/drawings/d/1FvU7GImRsb9GvAWDDo1le85jIrnFJNVB_OTPXC15WwM/pub?h=480) -
    diff --git a/p2p/net2/conn/conn.go b/p2p/net2/conn/conn.go deleted file mode 100644 index 65b12f23e..000000000 --- a/p2p/net2/conn/conn.go +++ /dev/null @@ -1,157 +0,0 @@ -package conn - -import ( - "fmt" - "net" - "time" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" - mpool "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio/mpool" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - peer "github.com/jbenet/go-ipfs/p2p/peer" - u "github.com/jbenet/go-ipfs/util" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" -) - -var log = eventlog.Logger("conn") - -// ReleaseBuffer puts the given byte array back into the buffer pool, -// first verifying that it is the correct size -func ReleaseBuffer(b []byte) { - log.Debugf("Releasing buffer! (cap,size = %d, %d)", cap(b), len(b)) - mpool.ByteSlicePool.Put(uint32(cap(b)), b) -} - -// singleConn represents a single connection to another Peer (IPFS Node). -type singleConn struct { - local peer.ID - remote peer.ID - maconn manet.Conn - msgrw msgio.ReadWriteCloser -} - -// newConn constructs a new connection -func newSingleConn(ctx context.Context, local, remote peer.ID, maconn manet.Conn) (Conn, error) { - - conn := &singleConn{ - local: local, - remote: remote, - maconn: maconn, - msgrw: msgio.NewReadWriter(maconn), - } - - log.Debugf("newSingleConn %p: %v to %v", conn, local, remote) - return conn, nil -} - -// close is the internal close function, called by ContextCloser.Close -func (c *singleConn) Close() error { - log.Debugf("%s closing Conn with %s", c.local, c.remote) - // close underlying connection - return c.msgrw.Close() -} - -// ID is an identifier unique to this connection. -func (c *singleConn) ID() string { - return ID(c) -} - -func (c *singleConn) String() string { - return String(c, "singleConn") -} - -func (c *singleConn) LocalAddr() net.Addr { - return c.maconn.LocalAddr() -} - -func (c *singleConn) RemoteAddr() net.Addr { - return c.maconn.RemoteAddr() -} - -func (c *singleConn) LocalPrivateKey() ic.PrivKey { - return nil -} - -func (c *singleConn) RemotePublicKey() ic.PubKey { - return nil -} - -func (c *singleConn) SetDeadline(t time.Time) error { - return c.maconn.SetDeadline(t) -} -func (c *singleConn) SetReadDeadline(t time.Time) error { - return c.maconn.SetReadDeadline(t) -} - -func (c *singleConn) SetWriteDeadline(t time.Time) error { - return c.maconn.SetWriteDeadline(t) -} - -// LocalMultiaddr is the Multiaddr on this side -func (c *singleConn) LocalMultiaddr() ma.Multiaddr { - return c.maconn.LocalMultiaddr() -} - -// RemoteMultiaddr is the Multiaddr on the remote side -func (c *singleConn) RemoteMultiaddr() ma.Multiaddr { - return c.maconn.RemoteMultiaddr() -} - -// LocalPeer is the Peer on this side -func (c *singleConn) LocalPeer() peer.ID { - return c.local -} - -// RemotePeer is the Peer on the remote side -func (c *singleConn) RemotePeer() peer.ID { - return c.remote -} - -// Read reads data, net.Conn style -func (c *singleConn) Read(buf []byte) (int, error) { - return c.msgrw.Read(buf) -} - -// Write writes data, net.Conn style -func (c *singleConn) Write(buf []byte) (int, error) { - return c.msgrw.Write(buf) -} - -func (c *singleConn) NextMsgLen() (int, error) { - return c.msgrw.NextMsgLen() -} - -// ReadMsg reads data, net.Conn style -func (c *singleConn) ReadMsg() ([]byte, error) { - return c.msgrw.ReadMsg() -} - -// WriteMsg writes data, net.Conn style -func (c *singleConn) WriteMsg(buf []byte) error { - return c.msgrw.WriteMsg(buf) -} - -// ReleaseMsg releases a buffer -func (c *singleConn) ReleaseMsg(m []byte) { - c.msgrw.ReleaseMsg(m) -} - -// ID returns the ID of a given Conn. -func ID(c Conn) string { - l := fmt.Sprintf("%s/%s", c.LocalMultiaddr(), c.LocalPeer().Pretty()) - r := fmt.Sprintf("%s/%s", c.RemoteMultiaddr(), c.RemotePeer().Pretty()) - lh := u.Hash([]byte(l)) - rh := u.Hash([]byte(r)) - ch := u.XOR(lh, rh) - return u.Key(ch).Pretty() -} - -// String returns the user-friendly String representation of a conn -func String(c Conn, typ string) string { - return fmt.Sprintf("%s (%s) <-- %s %p --> (%s) %s", - c.LocalPeer(), c.LocalMultiaddr(), typ, c, c.RemoteMultiaddr(), c.RemotePeer()) -} diff --git a/p2p/net2/conn/conn_test.go b/p2p/net2/conn/conn_test.go deleted file mode 100644 index ccbbade6a..000000000 --- a/p2p/net2/conn/conn_test.go +++ /dev/null @@ -1,122 +0,0 @@ -package conn - -import ( - "bytes" - "fmt" - "os" - "runtime" - "sync" - "testing" - "time" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" -) - -func testOneSendRecv(t *testing.T, c1, c2 Conn) { - log.Debugf("testOneSendRecv from %s to %s", c1.LocalPeer(), c2.LocalPeer()) - m1 := []byte("hello") - if err := c1.WriteMsg(m1); err != nil { - t.Fatal(err) - } - m2, err := c2.ReadMsg() - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(m1, m2) { - t.Fatal("failed to send: %s %s", m1, m2) - } -} - -func testNotOneSendRecv(t *testing.T, c1, c2 Conn) { - m1 := []byte("hello") - if err := c1.WriteMsg(m1); err == nil { - t.Fatal("write should have failed", err) - } - _, err := c2.ReadMsg() - if err == nil { - t.Fatal("read should have failed", err) - } -} - -func TestClose(t *testing.T) { - // t.Skip("Skipping in favor of another test") - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - c1, c2, _, _ := setupSingleConn(t, ctx) - - testOneSendRecv(t, c1, c2) - testOneSendRecv(t, c2, c1) - - c1.Close() - testNotOneSendRecv(t, c1, c2) - - c2.Close() - testNotOneSendRecv(t, c2, c1) - testNotOneSendRecv(t, c1, c2) -} - -func TestCloseLeak(t *testing.T) { - // t.Skip("Skipping in favor of another test") - if testing.Short() { - t.SkipNow() - } - - if os.Getenv("TRAVIS") == "true" { - t.Skip("this doesn't work well on travis") - } - - var wg sync.WaitGroup - - runPair := func(num int) { - ctx, cancel := context.WithCancel(context.Background()) - c1, c2, _, _ := setupSingleConn(t, ctx) - - for i := 0; i < num; i++ { - b1 := []byte(fmt.Sprintf("beep%d", i)) - c1.WriteMsg(b1) - b2, err := c2.ReadMsg() - if err != nil { - panic(err) - } - if !bytes.Equal(b1, b2) { - panic(fmt.Errorf("bytes not equal: %s != %s", b1, b2)) - } - - b2 = []byte(fmt.Sprintf("boop%d", i)) - c2.WriteMsg(b2) - b1, err = c1.ReadMsg() - if err != nil { - panic(err) - } - if !bytes.Equal(b1, b2) { - panic(fmt.Errorf("bytes not equal: %s != %s", b1, b2)) - } - - <-time.After(time.Microsecond * 5) - } - - c1.Close() - c2.Close() - cancel() // close the listener - wg.Done() - } - - var cons = 5 - var msgs = 50 - log.Debugf("Running %d connections * %d msgs.\n", cons, msgs) - for i := 0; i < cons; i++ { - wg.Add(1) - go runPair(msgs) - } - - log.Debugf("Waiting...\n") - wg.Wait() - // done! - - <-time.After(time.Millisecond * 150) - if runtime.NumGoroutine() > 20 { - // panic("uncomment me to debug") - t.Fatal("leaking goroutines:", runtime.NumGoroutine()) - } -} diff --git a/p2p/net2/conn/dial.go b/p2p/net2/conn/dial.go deleted file mode 100644 index 1294f2241..000000000 --- a/p2p/net2/conn/dial.go +++ /dev/null @@ -1,131 +0,0 @@ -package conn - -import ( - "fmt" - "strings" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" - - peer "github.com/jbenet/go-ipfs/p2p/peer" - debugerror "github.com/jbenet/go-ipfs/util/debugerror" -) - -// String returns the string rep of d. -func (d *Dialer) String() string { - return fmt.Sprintf("", d.LocalPeer, d.LocalAddrs[0]) -} - -// Dial connects to a peer over a particular address -// Ensures raddr is part of peer.Addresses() -// Example: d.DialAddr(ctx, peer.Addresses()[0], peer) -func (d *Dialer) Dial(ctx context.Context, raddr ma.Multiaddr, remote peer.ID) (Conn, error) { - - network, _, err := manet.DialArgs(raddr) - if err != nil { - return nil, err - } - - if strings.HasPrefix(raddr.String(), "/ip4/0.0.0.0") { - return nil, debugerror.Errorf("Attempted to connect to zero address: %s", raddr) - } - - var laddr ma.Multiaddr - if len(d.LocalAddrs) > 0 { - // laddr := MultiaddrNetMatch(raddr, d.LocalAddrs) - laddr = NetAddress(network, d.LocalAddrs) - if laddr == nil { - return nil, debugerror.Errorf("No local address for network %s", network) - } - } - - // TODO: try to get reusing addr/ports to work. - // madialer := manet.Dialer{LocalAddr: laddr} - madialer := manet.Dialer{} - - log.Debugf("%s dialing %s %s", d.LocalPeer, remote, raddr) - maconn, err := madialer.Dial(raddr) - if err != nil { - return nil, err - } - - var connOut Conn - var errOut error - done := make(chan struct{}) - - // do it async to ensure we respect don contexteone - go func() { - defer func() { done <- struct{}{} }() - - c, err := newSingleConn(ctx, d.LocalPeer, remote, maconn) - if err != nil { - errOut = err - return - } - - if d.PrivateKey == nil { - log.Warning("dialer %s dialing INSECURELY %s at %s!", d, remote, raddr) - connOut = c - return - } - c2, err := newSecureConn(ctx, d.PrivateKey, c) - if err != nil { - errOut = err - c.Close() - return - } - - connOut = c2 - }() - - select { - case <-ctx.Done(): - maconn.Close() - return nil, ctx.Err() - case <-done: - // whew, finished. - } - - return connOut, errOut -} - -// MultiaddrProtocolsMatch returns whether two multiaddrs match in protocol stacks. -func MultiaddrProtocolsMatch(a, b ma.Multiaddr) bool { - ap := a.Protocols() - bp := b.Protocols() - - if len(ap) != len(bp) { - return false - } - - for i, api := range ap { - if api != bp[i] { - return false - } - } - - return true -} - -// MultiaddrNetMatch returns the first Multiaddr found to match network. -func MultiaddrNetMatch(tgt ma.Multiaddr, srcs []ma.Multiaddr) ma.Multiaddr { - for _, a := range srcs { - if MultiaddrProtocolsMatch(tgt, a) { - return a - } - } - return nil -} - -// NetAddress returns the first Multiaddr found for a given network. -func NetAddress(n string, addrs []ma.Multiaddr) ma.Multiaddr { - for _, a := range addrs { - for _, p := range a.Protocols() { - if p.Name == n { - return a - } - } - } - return nil -} diff --git a/p2p/net2/conn/dial_test.go b/p2p/net2/conn/dial_test.go deleted file mode 100644 index bf24ab09a..000000000 --- a/p2p/net2/conn/dial_test.go +++ /dev/null @@ -1,165 +0,0 @@ -package conn - -import ( - "io" - "net" - "testing" - "time" - - tu "github.com/jbenet/go-ipfs/util/testutil" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" -) - -func echoListen(ctx context.Context, listener Listener) { - for { - c, err := listener.Accept() - if err != nil { - - select { - case <-ctx.Done(): - return - default: - } - - if ne, ok := err.(net.Error); ok && ne.Temporary() { - <-time.After(time.Microsecond * 10) - continue - } - - log.Debugf("echoListen: listener appears to be closing") - return - } - - go echo(c.(Conn)) - } -} - -func echo(c Conn) { - io.Copy(c, c) -} - -func setupSecureConn(t *testing.T, ctx context.Context) (a, b Conn, p1, p2 tu.PeerNetParams) { - return setupConn(t, ctx, true) -} - -func setupSingleConn(t *testing.T, ctx context.Context) (a, b Conn, p1, p2 tu.PeerNetParams) { - return setupConn(t, ctx, false) -} - -func setupConn(t *testing.T, ctx context.Context, secure bool) (a, b Conn, p1, p2 tu.PeerNetParams) { - - p1 = tu.RandPeerNetParamsOrFatal(t) - p2 = tu.RandPeerNetParamsOrFatal(t) - laddr := p1.Addr - - key1 := p1.PrivKey - key2 := p2.PrivKey - if !secure { - key1 = nil - key2 = nil - } - l1, err := Listen(ctx, laddr, p1.ID, key1) - if err != nil { - t.Fatal(err) - } - - d2 := &Dialer{ - LocalPeer: p2.ID, - PrivateKey: key2, - } - - var c2 Conn - - done := make(chan error) - go func() { - var err error - c2, err = d2.Dial(ctx, p1.Addr, p1.ID) - if err != nil { - done <- err - } - close(done) - }() - - c1, err := l1.Accept() - if err != nil { - t.Fatal("failed to accept", err) - } - if err := <-done; err != nil { - t.Fatal(err) - } - - return c1.(Conn), c2, p1, p2 -} - -func testDialer(t *testing.T, secure bool) { - // t.Skip("Skipping in favor of another test") - - p1 := tu.RandPeerNetParamsOrFatal(t) - p2 := tu.RandPeerNetParamsOrFatal(t) - - key1 := p1.PrivKey - key2 := p2.PrivKey - if !secure { - key1 = nil - key2 = nil - } - - ctx, cancel := context.WithCancel(context.Background()) - l1, err := Listen(ctx, p1.Addr, p1.ID, key1) - if err != nil { - t.Fatal(err) - } - - d2 := &Dialer{ - LocalPeer: p2.ID, - PrivateKey: key2, - } - - go echoListen(ctx, l1) - - c, err := d2.Dial(ctx, p1.Addr, p1.ID) - if err != nil { - t.Fatal("error dialing peer", err) - } - - // fmt.Println("sending") - c.WriteMsg([]byte("beep")) - c.WriteMsg([]byte("boop")) - - out, err := c.ReadMsg() - if err != nil { - t.Fatal(err) - } - - // fmt.Println("recving", string(out)) - data := string(out) - if data != "beep" { - t.Error("unexpected conn output", data) - } - - out, err = c.ReadMsg() - if err != nil { - t.Fatal(err) - } - - data = string(out) - if string(out) != "boop" { - t.Error("unexpected conn output", data) - } - - // fmt.Println("closing") - c.Close() - l1.Close() - cancel() -} - -func TestDialerInsecure(t *testing.T) { - // t.Skip("Skipping in favor of another test") - testDialer(t, false) -} - -func TestDialerSecure(t *testing.T) { - // t.Skip("Skipping in favor of another test") - testDialer(t, true) -} diff --git a/p2p/net2/conn/interface.go b/p2p/net2/conn/interface.go deleted file mode 100644 index 1601da1aa..000000000 --- a/p2p/net2/conn/interface.go +++ /dev/null @@ -1,84 +0,0 @@ -package conn - -import ( - "io" - "net" - "time" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - peer "github.com/jbenet/go-ipfs/p2p/peer" - u "github.com/jbenet/go-ipfs/util" - - msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" -) - -// Map maps Keys (Peer.IDs) to Connections. -type Map map[u.Key]Conn - -type PeerConn interface { - // LocalPeer (this side) ID, PrivateKey, and Address - LocalPeer() peer.ID - LocalPrivateKey() ic.PrivKey - LocalMultiaddr() ma.Multiaddr - - // RemotePeer ID, PublicKey, and Address - RemotePeer() peer.ID - RemotePublicKey() ic.PubKey - RemoteMultiaddr() ma.Multiaddr -} - -// Conn is a generic message-based Peer-to-Peer connection. -type Conn interface { - PeerConn - - // ID is an identifier unique to this connection. - ID() string - - // can't just say "net.Conn" cause we have duplicate methods. - LocalAddr() net.Addr - RemoteAddr() net.Addr - SetDeadline(t time.Time) error - SetReadDeadline(t time.Time) error - SetWriteDeadline(t time.Time) error - - msgio.Reader - msgio.Writer - io.Closer -} - -// Dialer is an object that can open connections. We could have a "convenience" -// Dial function as before, but it would have many arguments, as dialing is -// no longer simple (need a peerstore, a local peer, a context, a network, etc) -type Dialer struct { - - // LocalPeer is the identity of the local Peer. - LocalPeer peer.ID - - // LocalAddrs is a set of local addresses to use. - LocalAddrs []ma.Multiaddr - - // PrivateKey used to initialize a secure connection. - // Warning: if PrivateKey is nil, connection will not be secured. - PrivateKey ic.PrivKey -} - -// Listener is an object that can accept connections. It matches net.Listener -type Listener interface { - - // Accept waits for and returns the next connection to the listener. - Accept() (net.Conn, error) - - // Addr is the local address - Addr() net.Addr - - // Multiaddr is the local multiaddr address - Multiaddr() ma.Multiaddr - - // LocalPeer is the identity of the local Peer. - LocalPeer() peer.ID - - // Close closes the listener. - // Any blocked Accept operations will be unblocked and return errors. - Close() error -} diff --git a/p2p/net2/conn/listen.go b/p2p/net2/conn/listen.go deleted file mode 100644 index dd6af24ba..000000000 --- a/p2p/net2/conn/listen.go +++ /dev/null @@ -1,115 +0,0 @@ -package conn - -import ( - "fmt" - "net" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - peer "github.com/jbenet/go-ipfs/p2p/peer" -) - -// listener is an object that can accept connections. It implements Listener -type listener struct { - manet.Listener - - maddr ma.Multiaddr // Local multiaddr to listen on - local peer.ID // LocalPeer is the identity of the local Peer - privk ic.PrivKey // private key to use to initialize secure conns - - cg ctxgroup.ContextGroup -} - -func (l *listener) teardown() error { - defer log.Debugf("listener closed: %s %s", l.local, l.maddr) - return l.Listener.Close() -} - -func (l *listener) Close() error { - log.Debugf("listener closing: %s %s", l.local, l.maddr) - return l.cg.Close() -} - -func (l *listener) String() string { - return fmt.Sprintf("", l.local, l.maddr) -} - -// Accept waits for and returns the next connection to the listener. -// Note that unfortunately this -func (l *listener) Accept() (net.Conn, error) { - - // listeners dont have contexts. given changes dont make sense here anymore - // note that the parent of listener will Close, which will interrupt all io. - // Contexts and io don't mix. - ctx := context.Background() - - maconn, err := l.Listener.Accept() - if err != nil { - return nil, err - } - - c, err := newSingleConn(ctx, l.local, "", maconn) - if err != nil { - return nil, fmt.Errorf("Error accepting connection: %v", err) - } - - if l.privk == nil { - log.Warning("listener %s listening INSECURELY!", l) - return c, nil - } - sc, err := newSecureConn(ctx, l.privk, c) - if err != nil { - return nil, fmt.Errorf("Error securing connection: %v", err) - } - return sc, nil -} - -func (l *listener) Addr() net.Addr { - return l.Listener.Addr() -} - -// Multiaddr is the identity of the local Peer. -func (l *listener) Multiaddr() ma.Multiaddr { - return l.maddr -} - -// LocalPeer is the identity of the local Peer. -func (l *listener) LocalPeer() peer.ID { - return l.local -} - -func (l *listener) Loggable() map[string]interface{} { - return map[string]interface{}{ - "listener": map[string]interface{}{ - "peer": l.LocalPeer(), - "address": l.Multiaddr(), - "secure": (l.privk != nil), - }, - } -} - -// Listen listens on the particular multiaddr, with given peer and peerstore. -func Listen(ctx context.Context, addr ma.Multiaddr, local peer.ID, sk ic.PrivKey) (Listener, error) { - - ml, err := manet.Listen(addr) - if err != nil { - return nil, fmt.Errorf("Failed to listen on %s: %s", addr, err) - } - - l := &listener{ - Listener: ml, - maddr: addr, - local: local, - privk: sk, - cg: ctxgroup.WithContext(ctx), - } - l.cg.SetTeardown(l.teardown) - - log.Infof("swarm listening on %s", l.Multiaddr()) - log.Event(ctx, "swarmListen", l) - return l, nil -} diff --git a/p2p/net2/conn/secure_conn.go b/p2p/net2/conn/secure_conn.go deleted file mode 100644 index 6d8cca6d5..000000000 --- a/p2p/net2/conn/secure_conn.go +++ /dev/null @@ -1,154 +0,0 @@ -package conn - -import ( - "net" - "time" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - msgio "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-msgio" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - secio "github.com/jbenet/go-ipfs/p2p/crypto/secio" - peer "github.com/jbenet/go-ipfs/p2p/peer" - errors "github.com/jbenet/go-ipfs/util/debugerror" -) - -// secureConn wraps another Conn object with an encrypted channel. -type secureConn struct { - - // the wrapped conn - insecure Conn - - // secure io (wrapping insecure) - secure msgio.ReadWriteCloser - - // secure Session - session secio.Session -} - -// newConn constructs a new connection -func newSecureConn(ctx context.Context, sk ic.PrivKey, insecure Conn) (Conn, error) { - - if insecure == nil { - return nil, errors.New("insecure is nil") - } - if insecure.LocalPeer() == "" { - return nil, errors.New("insecure.LocalPeer() is nil") - } - if sk == nil { - panic("way") - return nil, errors.New("private key is nil") - } - - // NewSession performs the secure handshake, which takes multiple RTT - sessgen := secio.SessionGenerator{LocalID: insecure.LocalPeer(), PrivateKey: sk} - session, err := sessgen.NewSession(ctx, insecure) - if err != nil { - return nil, err - } - - conn := &secureConn{ - insecure: insecure, - session: session, - secure: session.ReadWriter(), - } - log.Debugf("newSecureConn: %v to %v handshake success!", conn.LocalPeer(), conn.RemotePeer()) - return conn, nil -} - -func (c *secureConn) Close() error { - if err := c.secure.Close(); err != nil { - c.insecure.Close() - return err - } - return c.insecure.Close() -} - -// ID is an identifier unique to this connection. -func (c *secureConn) ID() string { - return ID(c) -} - -func (c *secureConn) String() string { - return String(c, "secureConn") -} - -func (c *secureConn) LocalAddr() net.Addr { - return c.insecure.LocalAddr() -} - -func (c *secureConn) RemoteAddr() net.Addr { - return c.insecure.RemoteAddr() -} - -func (c *secureConn) SetDeadline(t time.Time) error { - return c.insecure.SetDeadline(t) -} - -func (c *secureConn) SetReadDeadline(t time.Time) error { - return c.insecure.SetReadDeadline(t) -} - -func (c *secureConn) SetWriteDeadline(t time.Time) error { - return c.insecure.SetWriteDeadline(t) -} - -// LocalMultiaddr is the Multiaddr on this side -func (c *secureConn) LocalMultiaddr() ma.Multiaddr { - return c.insecure.LocalMultiaddr() -} - -// RemoteMultiaddr is the Multiaddr on the remote side -func (c *secureConn) RemoteMultiaddr() ma.Multiaddr { - return c.insecure.RemoteMultiaddr() -} - -// LocalPeer is the Peer on this side -func (c *secureConn) LocalPeer() peer.ID { - return c.session.LocalPeer() -} - -// RemotePeer is the Peer on the remote side -func (c *secureConn) RemotePeer() peer.ID { - return c.session.RemotePeer() -} - -// LocalPrivateKey is the public key of the peer on this side -func (c *secureConn) LocalPrivateKey() ic.PrivKey { - return c.session.LocalPrivateKey() -} - -// RemotePubKey is the public key of the peer on the remote side -func (c *secureConn) RemotePublicKey() ic.PubKey { - return c.session.RemotePublicKey() -} - -// Read reads data, net.Conn style -func (c *secureConn) Read(buf []byte) (int, error) { - return c.secure.Read(buf) -} - -// Write writes data, net.Conn style -func (c *secureConn) Write(buf []byte) (int, error) { - return c.secure.Write(buf) -} - -func (c *secureConn) NextMsgLen() (int, error) { - return c.secure.NextMsgLen() -} - -// ReadMsg reads data, net.Conn style -func (c *secureConn) ReadMsg() ([]byte, error) { - return c.secure.ReadMsg() -} - -// WriteMsg writes data, net.Conn style -func (c *secureConn) WriteMsg(buf []byte) error { - return c.secure.WriteMsg(buf) -} - -// ReleaseMsg releases a buffer -func (c *secureConn) ReleaseMsg(m []byte) { - c.secure.ReleaseMsg(m) -} diff --git a/p2p/net2/conn/secure_conn_test.go b/p2p/net2/conn/secure_conn_test.go deleted file mode 100644 index 7e364d12b..000000000 --- a/p2p/net2/conn/secure_conn_test.go +++ /dev/null @@ -1,199 +0,0 @@ -package conn - -import ( - "bytes" - "os" - "runtime" - "sync" - "testing" - "time" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" -) - -func upgradeToSecureConn(t *testing.T, ctx context.Context, sk ic.PrivKey, c Conn) (Conn, error) { - if c, ok := c.(*secureConn); ok { - return c, nil - } - - // shouldn't happen, because dial + listen already return secure conns. - s, err := newSecureConn(ctx, sk, c) - if err != nil { - return nil, err - } - return s, nil -} - -func secureHandshake(t *testing.T, ctx context.Context, sk ic.PrivKey, c Conn, done chan error) { - _, err := upgradeToSecureConn(t, ctx, sk, c) - done <- err -} - -func TestSecureSimple(t *testing.T) { - // t.Skip("Skipping in favor of another test") - - numMsgs := 100 - if testing.Short() { - numMsgs = 10 - } - - ctx := context.Background() - c1, c2, p1, p2 := setupSingleConn(t, ctx) - - done := make(chan error) - go secureHandshake(t, ctx, p1.PrivKey, c1, done) - go secureHandshake(t, ctx, p2.PrivKey, c2, done) - - for i := 0; i < 2; i++ { - if err := <-done; err != nil { - t.Fatal(err) - } - } - - for i := 0; i < numMsgs; i++ { - testOneSendRecv(t, c1, c2) - testOneSendRecv(t, c2, c1) - } - - c1.Close() - c2.Close() -} - -func TestSecureClose(t *testing.T) { - // t.Skip("Skipping in favor of another test") - - ctx := context.Background() - c1, c2, p1, p2 := setupSingleConn(t, ctx) - - done := make(chan error) - go secureHandshake(t, ctx, p1.PrivKey, c1, done) - go secureHandshake(t, ctx, p2.PrivKey, c2, done) - - for i := 0; i < 2; i++ { - if err := <-done; err != nil { - t.Fatal(err) - } - } - - testOneSendRecv(t, c1, c2) - - c1.Close() - testNotOneSendRecv(t, c1, c2) - - c2.Close() - testNotOneSendRecv(t, c1, c2) - testNotOneSendRecv(t, c2, c1) - -} - -func TestSecureCancelHandshake(t *testing.T) { - // t.Skip("Skipping in favor of another test") - - ctx, cancel := context.WithCancel(context.Background()) - c1, c2, p1, p2 := setupSingleConn(t, ctx) - - done := make(chan error) - go secureHandshake(t, ctx, p1.PrivKey, c1, done) - <-time.After(time.Millisecond) - cancel() // cancel ctx - go secureHandshake(t, ctx, p2.PrivKey, c2, done) - - for i := 0; i < 2; i++ { - if err := <-done; err == nil { - t.Error("cancel should've errored out") - } - } -} - -func TestSecureHandshakeFailsWithWrongKeys(t *testing.T) { - // t.Skip("Skipping in favor of another test") - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - c1, c2, p1, p2 := setupSingleConn(t, ctx) - - done := make(chan error) - go secureHandshake(t, ctx, p2.PrivKey, c1, done) - go secureHandshake(t, ctx, p1.PrivKey, c2, done) - - for i := 0; i < 2; i++ { - if err := <-done; err == nil { - t.Fatal("wrong keys should've errored out.") - } - } -} - -func TestSecureCloseLeak(t *testing.T) { - // t.Skip("Skipping in favor of another test") - - if testing.Short() { - t.SkipNow() - } - if os.Getenv("TRAVIS") == "true" { - t.Skip("this doesn't work well on travis") - } - - runPair := func(c1, c2 Conn, num int) { - log.Debugf("runPair %d", num) - - for i := 0; i < num; i++ { - log.Debugf("runPair iteration %d", i) - b1 := []byte("beep") - c1.WriteMsg(b1) - b2, err := c2.ReadMsg() - if err != nil { - panic(err) - } - if !bytes.Equal(b1, b2) { - panic("bytes not equal") - } - - b2 = []byte("beep") - c2.WriteMsg(b2) - b1, err = c1.ReadMsg() - if err != nil { - panic(err) - } - if !bytes.Equal(b1, b2) { - panic("bytes not equal") - } - - <-time.After(time.Microsecond * 5) - } - } - - var cons = 5 - var msgs = 50 - log.Debugf("Running %d connections * %d msgs.\n", cons, msgs) - - var wg sync.WaitGroup - for i := 0; i < cons; i++ { - wg.Add(1) - - ctx, cancel := context.WithCancel(context.Background()) - c1, c2, _, _ := setupSecureConn(t, ctx) - go func(c1, c2 Conn) { - - defer func() { - c1.Close() - c2.Close() - cancel() - wg.Done() - }() - - runPair(c1, c2, msgs) - }(c1, c2) - } - - log.Debugf("Waiting...\n") - wg.Wait() - // done! - - <-time.After(time.Millisecond * 150) - if runtime.NumGoroutine() > 20 { - // panic("uncomment me to debug") - t.Fatal("leaking goroutines:", runtime.NumGoroutine()) - } -} diff --git a/p2p/net2/interface.go b/p2p/net2/interface.go deleted file mode 100644 index b7f557ec0..000000000 --- a/p2p/net2/interface.go +++ /dev/null @@ -1,133 +0,0 @@ -package net - -import ( - "io" - - conn "github.com/jbenet/go-ipfs/p2p/net2/conn" - peer "github.com/jbenet/go-ipfs/p2p/peer" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" -) - -// MessageSizeMax is a soft (recommended) maximum for network messages. -// One can write more, as the interface is a stream. But it is useful -// to bunch it up into multiple read/writes when the whole message is -// a single, large serialized object. -const MessageSizeMax = 2 << 22 // 4MB - -// Stream represents a bidirectional channel between two agents in -// the IPFS network. "agent" is as granular as desired, potentially -// being a "request -> reply" pair, or whole protocols. -// Streams are backed by SPDY streams underneath the hood. -type Stream interface { - io.Reader - io.Writer - io.Closer - - // Conn returns the connection this stream is part of. - Conn() Conn -} - -// StreamHandler is the type of function used to listen for -// streams opened by the remote side. -type StreamHandler func(Stream) - -// Conn is a connection to a remote peer. It multiplexes streams. -// Usually there is no need to use a Conn directly, but it may -// be useful to get information about the peer on the other side: -// stream.Conn().RemotePeer() -type Conn interface { - conn.PeerConn - - // NewStream constructs a new Stream over this conn. - NewStream() (Stream, error) -} - -// ConnHandler is the type of function used to listen for -// connections opened by the remote side. -type ConnHandler func(Conn) - -// Network is the interface used to connect to the outside world. -// It dials and listens for connections. it uses a Swarm to pool -// connnections (see swarm pkg, and peerstream.Swarm). Connections -// are encrypted with a TLS-like protocol. -type Network interface { - Dialer - io.Closer - - // SetStreamHandler sets the handler for new streams opened by the - // remote side. This operation is threadsafe. - SetStreamHandler(StreamHandler) - - // SetConnHandler sets the handler for new connections opened by the - // remote side. This operation is threadsafe. - SetConnHandler(ConnHandler) - - // NewStream returns a new stream to given peer p. - // If there is no connection to p, attempts to create one. - NewStream(peer.ID) (Stream, error) - - // ListenAddresses returns a list of addresses at which this network listens. - ListenAddresses() []ma.Multiaddr - - // InterfaceListenAddresses returns a list of addresses at which this network - // listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to - // use the known local interfaces. - InterfaceListenAddresses() ([]ma.Multiaddr, error) - - // CtxGroup returns the network's contextGroup - CtxGroup() ctxgroup.ContextGroup -} - -// Dialer represents a service that can dial out to peers -// (this is usually just a Network, but other services may not need the whole -// stack, and thus it becomes easier to mock) -type Dialer interface { - - // Peerstore returns the internal peerstore - // This is useful to tell the dialer about a new address for a peer. - // Or use one of the public keys found out over the network. - Peerstore() peer.Peerstore - - // LocalPeer returns the local peer associated with this network - LocalPeer() peer.ID - - // DialPeer establishes a connection to a given peer - DialPeer(context.Context, peer.ID) (Conn, error) - - // ClosePeer closes the connection to a given peer - ClosePeer(peer.ID) error - - // Connectedness returns a state signaling connection capabilities - Connectedness(peer.ID) Connectedness - - // Peers returns the peers connected - Peers() []peer.ID - - // Conns returns the connections in this Netowrk - Conns() []Conn - - // ConnsToPeer returns the connections in this Netowrk for given peer. - ConnsToPeer(p peer.ID) []Conn -} - -// Connectedness signals the capacity for a connection with a given node. -// It is used to signal to services and other peers whether a node is reachable. -type Connectedness int - -const ( - // NotConnected means no connection to peer, and no extra information (default) - NotConnected Connectedness = iota - - // Connected means has an open, live connection to peer - Connected - - // CanConnect means recently connected to peer, terminated gracefully - CanConnect - - // CannotConnect means recently attempted connecting but failed to connect. - // (should signal "made effort, failed") - CannotConnect -) diff --git a/p2p/net2/mock/interface.go b/p2p/net2/mock/interface.go deleted file mode 100644 index 1096fa197..000000000 --- a/p2p/net2/mock/interface.go +++ /dev/null @@ -1,101 +0,0 @@ -// Package mocknet provides a mock net.Network to test with. -// -// - a Mocknet has many inet.Networks -// - a Mocknet has many Links -// - a Link joins two inet.Networks -// - inet.Conns and inet.Streams are created by inet.Networks -package mocknet - -import ( - "io" - "time" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - host "github.com/jbenet/go-ipfs/p2p/host" - inet "github.com/jbenet/go-ipfs/p2p/net2" - peer "github.com/jbenet/go-ipfs/p2p/peer" - - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" -) - -type Mocknet interface { - - // GenPeer generates a peer and its inet.Network in the Mocknet - GenPeer() (host.Host, error) - - // AddPeer adds an existing peer. we need both a privkey and addr. - // ID is derived from PrivKey - AddPeer(ic.PrivKey, ma.Multiaddr) (host.Host, error) - - // retrieve things (with randomized iteration order) - Peers() []peer.ID - Net(peer.ID) inet.Network - Nets() []inet.Network - Host(peer.ID) host.Host - Hosts() []host.Host - Links() LinkMap - LinksBetweenPeers(a, b peer.ID) []Link - LinksBetweenNets(a, b inet.Network) []Link - - // Links are the **ability to connect**. - // think of Links as the physical medium. - // For p1 and p2 to connect, a link must exist between them. - // (this makes it possible to test dial failures, and - // things like relaying traffic) - LinkPeers(peer.ID, peer.ID) (Link, error) - LinkNets(inet.Network, inet.Network) (Link, error) - Unlink(Link) error - UnlinkPeers(peer.ID, peer.ID) error - UnlinkNets(inet.Network, inet.Network) error - - // LinkDefaults are the default options that govern links - // if they do not have thier own option set. - SetLinkDefaults(LinkOptions) - LinkDefaults() LinkOptions - - // Connections are the usual. Connecting means Dialing. - // **to succeed, peers must be linked beforehand** - ConnectPeers(peer.ID, peer.ID) (inet.Conn, error) - ConnectNets(inet.Network, inet.Network) (inet.Conn, error) - DisconnectPeers(peer.ID, peer.ID) error - DisconnectNets(inet.Network, inet.Network) error -} - -// LinkOptions are used to change aspects of the links. -// Sorry but they dont work yet :( -type LinkOptions struct { - Latency time.Duration - Bandwidth int // in bytes-per-second - // we can make these values distributions down the road. -} - -// Link represents the **possibility** of a connection between -// two peers. Think of it like physical network links. Without -// them, the peers can try and try but they won't be able to -// connect. This allows constructing topologies where specific -// nodes cannot talk to each other directly. :) -type Link interface { - Networks() []inet.Network - Peers() []peer.ID - - SetOptions(LinkOptions) - Options() LinkOptions - - // Metrics() Metrics -} - -// LinkMap is a 3D map to give us an easy way to track links. -// (wow, much map. so data structure. how compose. ahhh pointer) -type LinkMap map[string]map[string]map[Link]struct{} - -// Printer lets you inspect things :) -type Printer interface { - // MocknetLinks shows the entire Mocknet's link table :) - MocknetLinks(mn Mocknet) - NetworkConns(ni inet.Network) -} - -// PrinterTo returns a Printer ready to write to w. -func PrinterTo(w io.Writer) Printer { - return &printer{w} -} diff --git a/p2p/net2/mock/mock.go b/p2p/net2/mock/mock.go deleted file mode 100644 index 5403358cb..000000000 --- a/p2p/net2/mock/mock.go +++ /dev/null @@ -1,63 +0,0 @@ -package mocknet - -import ( - eventlog "github.com/jbenet/go-ipfs/util/eventlog" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" -) - -var log = eventlog.Logger("mocknet") - -// WithNPeers constructs a Mocknet with N peers. -func WithNPeers(ctx context.Context, n int) (Mocknet, error) { - m := New(ctx) - for i := 0; i < n; i++ { - if _, err := m.GenPeer(); err != nil { - return nil, err - } - } - return m, nil -} - -// FullMeshLinked constructs a Mocknet with full mesh of Links. -// This means that all the peers **can** connect to each other -// (not that they already are connected. you can use m.ConnectAll()) -func FullMeshLinked(ctx context.Context, n int) (Mocknet, error) { - m, err := WithNPeers(ctx, n) - if err != nil { - return nil, err - } - - nets := m.Nets() - for _, n1 := range nets { - for _, n2 := range nets { - // yes, even self. - if _, err := m.LinkNets(n1, n2); err != nil { - return nil, err - } - } - } - - return m, nil -} - -// FullMeshConnected constructs a Mocknet with full mesh of Connections. -// This means that all the peers have dialed and are ready to talk to -// each other. -func FullMeshConnected(ctx context.Context, n int) (Mocknet, error) { - m, err := FullMeshLinked(ctx, n) - if err != nil { - return nil, err - } - - nets := m.Nets() - for _, n1 := range nets { - for _, n2 := range nets { - if _, err := m.ConnectNets(n1, n2); err != nil { - return nil, err - } - } - } - - return m, nil -} diff --git a/p2p/net2/mock/mock_conn.go b/p2p/net2/mock/mock_conn.go deleted file mode 100644 index f1535ff91..000000000 --- a/p2p/net2/mock/mock_conn.go +++ /dev/null @@ -1,120 +0,0 @@ -package mocknet - -import ( - "container/list" - "sync" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - inet "github.com/jbenet/go-ipfs/p2p/net2" - peer "github.com/jbenet/go-ipfs/p2p/peer" - - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" -) - -// conn represents one side's perspective of a -// live connection between two peers. -// it goes over a particular link. -type conn struct { - local peer.ID - remote peer.ID - - localAddr ma.Multiaddr - remoteAddr ma.Multiaddr - - localPrivKey ic.PrivKey - remotePubKey ic.PubKey - - net *peernet - link *link - rconn *conn // counterpart - streams list.List - - sync.RWMutex -} - -func (c *conn) Close() error { - for _, s := range c.allStreams() { - s.Close() - } - c.net.removeConn(c) - return nil -} - -func (c *conn) addStream(s *stream) { - c.Lock() - s.conn = c - c.streams.PushBack(s) - c.Unlock() -} - -func (c *conn) removeStream(s *stream) { - c.Lock() - defer c.Unlock() - for e := c.streams.Front(); e != nil; e = e.Next() { - if s == e.Value { - c.streams.Remove(e) - return - } - } -} - -func (c *conn) allStreams() []inet.Stream { - c.RLock() - defer c.RUnlock() - - strs := make([]inet.Stream, 0, c.streams.Len()) - for e := c.streams.Front(); e != nil; e = e.Next() { - s := e.Value.(*stream) - strs = append(strs, s) - } - return strs -} - -func (c *conn) remoteOpenedStream(s *stream) { - c.addStream(s) - c.net.handleNewStream(s) -} - -func (c *conn) openStream() *stream { - sl, sr := c.link.newStreamPair() - c.addStream(sl) - c.rconn.remoteOpenedStream(sr) - return sl -} - -func (c *conn) NewStream() (inet.Stream, error) { - log.Debugf("Conn.NewStreamWithProtocol: %s --> %s", c.local, c.remote) - - s := c.openStream() - return s, nil -} - -// LocalMultiaddr is the Multiaddr on this side -func (c *conn) LocalMultiaddr() ma.Multiaddr { - return c.localAddr -} - -// LocalPeer is the Peer on our side of the connection -func (c *conn) LocalPeer() peer.ID { - return c.local -} - -// LocalPrivateKey is the private key of the peer on our side. -func (c *conn) LocalPrivateKey() ic.PrivKey { - return c.localPrivKey -} - -// RemoteMultiaddr is the Multiaddr on the remote side -func (c *conn) RemoteMultiaddr() ma.Multiaddr { - return c.remoteAddr -} - -// RemotePeer is the Peer on the remote side -func (c *conn) RemotePeer() peer.ID { - return c.remote -} - -// RemotePublicKey is the private key of the peer on our side. -func (c *conn) RemotePublicKey() ic.PubKey { - return c.remotePubKey -} diff --git a/p2p/net2/mock/mock_link.go b/p2p/net2/mock/mock_link.go deleted file mode 100644 index 352c35601..000000000 --- a/p2p/net2/mock/mock_link.go +++ /dev/null @@ -1,93 +0,0 @@ -package mocknet - -import ( - "io" - "sync" - - inet "github.com/jbenet/go-ipfs/p2p/net2" - peer "github.com/jbenet/go-ipfs/p2p/peer" -) - -// link implements mocknet.Link -// and, for simplicity, inet.Conn -type link struct { - mock *mocknet - nets []*peernet - opts LinkOptions - - // this could have addresses on both sides. - - sync.RWMutex -} - -func newLink(mn *mocknet, opts LinkOptions) *link { - return &link{mock: mn, opts: opts} -} - -func (l *link) newConnPair(dialer *peernet) (*conn, *conn) { - l.RLock() - defer l.RUnlock() - - mkconn := func(ln, rn *peernet) *conn { - c := &conn{net: ln, link: l} - c.local = ln.peer - c.remote = rn.peer - - c.localAddr = ln.ps.Addresses(ln.peer)[0] - c.remoteAddr = rn.ps.Addresses(rn.peer)[0] - - c.localPrivKey = ln.ps.PrivKey(ln.peer) - c.remotePubKey = rn.ps.PubKey(rn.peer) - - return c - } - - c1 := mkconn(l.nets[0], l.nets[1]) - c2 := mkconn(l.nets[1], l.nets[0]) - c1.rconn = c2 - c2.rconn = c1 - - if dialer == c1.net { - return c1, c2 - } - return c2, c1 -} - -func (l *link) newStreamPair() (*stream, *stream) { - r1, w1 := io.Pipe() - r2, w2 := io.Pipe() - - s1 := &stream{Reader: r1, Writer: w2} - s2 := &stream{Reader: r2, Writer: w1} - return s1, s2 -} - -func (l *link) Networks() []inet.Network { - l.RLock() - defer l.RUnlock() - - cp := make([]inet.Network, len(l.nets)) - for i, n := range l.nets { - cp[i] = n - } - return cp -} - -func (l *link) Peers() []peer.ID { - l.RLock() - defer l.RUnlock() - - cp := make([]peer.ID, len(l.nets)) - for i, n := range l.nets { - cp[i] = n.peer - } - return cp -} - -func (l *link) SetOptions(o LinkOptions) { - l.opts = o -} - -func (l *link) Options() LinkOptions { - return l.opts -} diff --git a/p2p/net2/mock/mock_net.go b/p2p/net2/mock/mock_net.go deleted file mode 100644 index 8590f0187..000000000 --- a/p2p/net2/mock/mock_net.go +++ /dev/null @@ -1,340 +0,0 @@ -package mocknet - -import ( - "fmt" - "sync" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - host "github.com/jbenet/go-ipfs/p2p/host" - bhost "github.com/jbenet/go-ipfs/p2p/host/basic" - inet "github.com/jbenet/go-ipfs/p2p/net2" - peer "github.com/jbenet/go-ipfs/p2p/peer" - testutil "github.com/jbenet/go-ipfs/util/testutil" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" -) - -// mocknet implements mocknet.Mocknet -type mocknet struct { - nets map[peer.ID]*peernet - hosts map[peer.ID]*bhost.BasicHost - - // links make it possible to connect two peers. - // think of links as the physical medium. - // usually only one, but there could be multiple - // **links are shared between peers** - links map[peer.ID]map[peer.ID]map[*link]struct{} - - linkDefaults LinkOptions - - cg ctxgroup.ContextGroup // for Context closing - sync.RWMutex -} - -func New(ctx context.Context) Mocknet { - return &mocknet{ - nets: map[peer.ID]*peernet{}, - hosts: map[peer.ID]*bhost.BasicHost{}, - links: map[peer.ID]map[peer.ID]map[*link]struct{}{}, - cg: ctxgroup.WithContext(ctx), - } -} - -func (mn *mocknet) GenPeer() (host.Host, error) { - sk, _, err := testutil.RandKeyPair(512) - if err != nil { - return nil, err - } - - a := testutil.RandLocalTCPAddress() - - h, err := mn.AddPeer(sk, a) - if err != nil { - return nil, err - } - - return h, nil -} - -func (mn *mocknet) AddPeer(k ic.PrivKey, a ma.Multiaddr) (host.Host, error) { - n, err := newPeernet(mn.cg.Context(), mn, k, a) - if err != nil { - return nil, err - } - - h := bhost.New(n) - - // make sure to add listening address! - // this makes debugging things simpler as remembering to register - // an address may cause unexpected failure. - n.Peerstore().AddAddress(n.LocalPeer(), a) - log.Debugf("mocknet added listen addr for peer: %s -- %s", n.LocalPeer(), a) - - mn.cg.AddChildGroup(n.cg) - - mn.Lock() - mn.nets[n.peer] = n - mn.hosts[n.peer] = h - mn.Unlock() - return h, nil -} - -func (mn *mocknet) Peers() []peer.ID { - mn.RLock() - defer mn.RUnlock() - - cp := make([]peer.ID, 0, len(mn.nets)) - for _, n := range mn.nets { - cp = append(cp, n.peer) - } - return cp -} - -func (mn *mocknet) Host(pid peer.ID) host.Host { - mn.RLock() - host := mn.hosts[pid] - mn.RUnlock() - return host -} - -func (mn *mocknet) Net(pid peer.ID) inet.Network { - mn.RLock() - n := mn.nets[pid] - mn.RUnlock() - return n -} - -func (mn *mocknet) Hosts() []host.Host { - mn.RLock() - defer mn.RUnlock() - - cp := make([]host.Host, 0, len(mn.hosts)) - for _, h := range mn.hosts { - cp = append(cp, h) - } - return cp -} - -func (mn *mocknet) Nets() []inet.Network { - mn.RLock() - defer mn.RUnlock() - - cp := make([]inet.Network, 0, len(mn.nets)) - for _, n := range mn.nets { - cp = append(cp, n) - } - return cp -} - -// Links returns a copy of the internal link state map. -// (wow, much map. so data structure. how compose. ahhh pointer) -func (mn *mocknet) Links() LinkMap { - mn.RLock() - defer mn.RUnlock() - - links := map[string]map[string]map[Link]struct{}{} - for p1, lm := range mn.links { - sp1 := string(p1) - links[sp1] = map[string]map[Link]struct{}{} - for p2, ls := range lm { - sp2 := string(p2) - links[sp1][sp2] = map[Link]struct{}{} - for l := range ls { - links[sp1][sp2][l] = struct{}{} - } - } - } - return links -} - -func (mn *mocknet) LinkAll() error { - nets := mn.Nets() - for _, n1 := range nets { - for _, n2 := range nets { - if _, err := mn.LinkNets(n1, n2); err != nil { - return err - } - } - } - return nil -} - -func (mn *mocknet) LinkPeers(p1, p2 peer.ID) (Link, error) { - mn.RLock() - n1 := mn.nets[p1] - n2 := mn.nets[p2] - mn.RUnlock() - - if n1 == nil { - return nil, fmt.Errorf("network for p1 not in mocknet") - } - - if n2 == nil { - return nil, fmt.Errorf("network for p2 not in mocknet") - } - - return mn.LinkNets(n1, n2) -} - -func (mn *mocknet) validate(n inet.Network) (*peernet, error) { - // WARNING: assumes locks acquired - - nr, ok := n.(*peernet) - if !ok { - return nil, fmt.Errorf("Network not supported (use mock package nets only)") - } - - if _, found := mn.nets[nr.peer]; !found { - return nil, fmt.Errorf("Network not on mocknet. is it from another mocknet?") - } - - return nr, nil -} - -func (mn *mocknet) LinkNets(n1, n2 inet.Network) (Link, error) { - mn.RLock() - n1r, err1 := mn.validate(n1) - n2r, err2 := mn.validate(n2) - ld := mn.linkDefaults - mn.RUnlock() - - if err1 != nil { - return nil, err1 - } - if err2 != nil { - return nil, err2 - } - - l := newLink(mn, ld) - l.nets = append(l.nets, n1r, n2r) - mn.addLink(l) - return l, nil -} - -func (mn *mocknet) Unlink(l2 Link) error { - - l, ok := l2.(*link) - if !ok { - return fmt.Errorf("only links from mocknet are supported") - } - - mn.removeLink(l) - return nil -} - -func (mn *mocknet) UnlinkPeers(p1, p2 peer.ID) error { - ls := mn.LinksBetweenPeers(p1, p2) - if ls == nil { - return fmt.Errorf("no link between p1 and p2") - } - - for _, l := range ls { - if err := mn.Unlink(l); err != nil { - return err - } - } - return nil -} - -func (mn *mocknet) UnlinkNets(n1, n2 inet.Network) error { - return mn.UnlinkPeers(n1.LocalPeer(), n2.LocalPeer()) -} - -// get from the links map. and lazily contruct. -func (mn *mocknet) linksMapGet(p1, p2 peer.ID) *map[*link]struct{} { - - l1, found := mn.links[p1] - if !found { - mn.links[p1] = map[peer.ID]map[*link]struct{}{} - l1 = mn.links[p1] // so we make sure it's there. - } - - l2, found := l1[p2] - if !found { - m := map[*link]struct{}{} - l1[p2] = m - l2 = l1[p2] - } - - return &l2 -} - -func (mn *mocknet) addLink(l *link) { - mn.Lock() - defer mn.Unlock() - - n1, n2 := l.nets[0], l.nets[1] - (*mn.linksMapGet(n1.peer, n2.peer))[l] = struct{}{} - (*mn.linksMapGet(n2.peer, n1.peer))[l] = struct{}{} -} - -func (mn *mocknet) removeLink(l *link) { - mn.Lock() - defer mn.Unlock() - - n1, n2 := l.nets[0], l.nets[1] - delete(*mn.linksMapGet(n1.peer, n2.peer), l) - delete(*mn.linksMapGet(n2.peer, n1.peer), l) -} - -func (mn *mocknet) ConnectAll() error { - nets := mn.Nets() - for _, n1 := range nets { - for _, n2 := range nets { - if n1 == n2 { - continue - } - - if _, err := mn.ConnectNets(n1, n2); err != nil { - return err - } - } - } - return nil -} - -func (mn *mocknet) ConnectPeers(a, b peer.ID) (inet.Conn, error) { - return mn.Net(a).DialPeer(mn.cg.Context(), b) -} - -func (mn *mocknet) ConnectNets(a, b inet.Network) (inet.Conn, error) { - return a.DialPeer(mn.cg.Context(), b.LocalPeer()) -} - -func (mn *mocknet) DisconnectPeers(p1, p2 peer.ID) error { - return mn.Net(p1).ClosePeer(p2) -} - -func (mn *mocknet) DisconnectNets(n1, n2 inet.Network) error { - return n1.ClosePeer(n2.LocalPeer()) -} - -func (mn *mocknet) LinksBetweenPeers(p1, p2 peer.ID) []Link { - mn.RLock() - defer mn.RUnlock() - - ls2 := *mn.linksMapGet(p1, p2) - cp := make([]Link, 0, len(ls2)) - for l := range ls2 { - cp = append(cp, l) - } - return cp -} - -func (mn *mocknet) LinksBetweenNets(n1, n2 inet.Network) []Link { - return mn.LinksBetweenPeers(n1.LocalPeer(), n2.LocalPeer()) -} - -func (mn *mocknet) SetLinkDefaults(o LinkOptions) { - mn.Lock() - mn.linkDefaults = o - mn.Unlock() -} - -func (mn *mocknet) LinkDefaults() LinkOptions { - mn.RLock() - defer mn.RUnlock() - return mn.linkDefaults -} diff --git a/p2p/net2/mock/mock_peernet.go b/p2p/net2/mock/mock_peernet.go deleted file mode 100644 index 948b83ea0..000000000 --- a/p2p/net2/mock/mock_peernet.go +++ /dev/null @@ -1,353 +0,0 @@ -package mocknet - -import ( - "fmt" - "math/rand" - "sync" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - inet "github.com/jbenet/go-ipfs/p2p/net2" - peer "github.com/jbenet/go-ipfs/p2p/peer" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" -) - -// peernet implements inet.Network -type peernet struct { - mocknet *mocknet // parent - - peer peer.ID - ps peer.Peerstore - - // conns are actual live connections between peers. - // many conns could run over each link. - // **conns are NOT shared between peers** - connsByPeer map[peer.ID]map[*conn]struct{} - connsByLink map[*link]map[*conn]struct{} - - // implement inet.Network - streamHandler inet.StreamHandler - connHandler inet.ConnHandler - - cg ctxgroup.ContextGroup - sync.RWMutex -} - -// newPeernet constructs a new peernet -func newPeernet(ctx context.Context, m *mocknet, k ic.PrivKey, - a ma.Multiaddr) (*peernet, error) { - - p, err := peer.IDFromPublicKey(k.GetPublic()) - if err != nil { - return nil, err - } - - // create our own entirely, so that peers knowledge doesn't get shared - ps := peer.NewPeerstore() - ps.AddAddress(p, a) - ps.AddPrivKey(p, k) - ps.AddPubKey(p, k.GetPublic()) - - n := &peernet{ - mocknet: m, - peer: p, - ps: ps, - cg: ctxgroup.WithContext(ctx), - - connsByPeer: map[peer.ID]map[*conn]struct{}{}, - connsByLink: map[*link]map[*conn]struct{}{}, - } - - n.cg.SetTeardown(n.teardown) - return n, nil -} - -func (pn *peernet) teardown() error { - - // close the connections - for _, c := range pn.allConns() { - c.Close() - } - return nil -} - -// allConns returns all the connections between this peer and others -func (pn *peernet) allConns() []*conn { - pn.RLock() - var cs []*conn - for _, csl := range pn.connsByPeer { - for c := range csl { - cs = append(cs, c) - } - } - pn.RUnlock() - return cs -} - -// Close calls the ContextCloser func -func (pn *peernet) Close() error { - return pn.cg.Close() -} - -func (pn *peernet) Peerstore() peer.Peerstore { - return pn.ps -} - -func (pn *peernet) String() string { - return fmt.Sprintf("", pn.peer, len(pn.allConns())) -} - -// handleNewStream is an internal function to trigger the client's handler -func (pn *peernet) handleNewStream(s inet.Stream) { - pn.RLock() - handler := pn.streamHandler - pn.RUnlock() - if handler != nil { - go handler(s) - } -} - -// handleNewConn is an internal function to trigger the client's handler -func (pn *peernet) handleNewConn(c inet.Conn) { - pn.RLock() - handler := pn.connHandler - pn.RUnlock() - if handler != nil { - go handler(c) - } -} - -// DialPeer attempts to establish a connection to a given peer. -// Respects the context. -func (pn *peernet) DialPeer(ctx context.Context, p peer.ID) (inet.Conn, error) { - return pn.connect(p) -} - -func (pn *peernet) connect(p peer.ID) (*conn, error) { - // first, check if we already have live connections - pn.RLock() - cs, found := pn.connsByPeer[p] - pn.RUnlock() - if found && len(cs) > 0 { - for c := range cs { - return c, nil - } - } - - log.Debugf("%s (newly) dialing %s", pn.peer, p) - - // ok, must create a new connection. we need a link - links := pn.mocknet.LinksBetweenPeers(pn.peer, p) - if len(links) < 1 { - return nil, fmt.Errorf("%s cannot connect to %s", pn.peer, p) - } - - // if many links found, how do we select? for now, randomly... - // this would be an interesting place to test logic that can measure - // links (network interfaces) and select properly - l := links[rand.Intn(len(links))] - - log.Debugf("%s dialing %s openingConn", pn.peer, p) - // create a new connection with link - c := pn.openConn(p, l.(*link)) - return c, nil -} - -func (pn *peernet) openConn(r peer.ID, l *link) *conn { - lc, rc := l.newConnPair(pn) - log.Debugf("%s opening connection to %s", pn.LocalPeer(), lc.RemotePeer()) - pn.addConn(lc) - rc.net.remoteOpenedConn(rc) - return lc -} - -func (pn *peernet) remoteOpenedConn(c *conn) { - log.Debugf("%s accepting connection from %s", pn.LocalPeer(), c.RemotePeer()) - pn.addConn(c) - pn.handleNewConn(c) -} - -// addConn constructs and adds a connection -// to given remote peer over given link -func (pn *peernet) addConn(c *conn) { - pn.Lock() - defer pn.Unlock() - - cs, found := pn.connsByPeer[c.RemotePeer()] - if !found { - cs = map[*conn]struct{}{} - pn.connsByPeer[c.RemotePeer()] = cs - } - pn.connsByPeer[c.RemotePeer()][c] = struct{}{} - - cs, found = pn.connsByLink[c.link] - if !found { - cs = map[*conn]struct{}{} - pn.connsByLink[c.link] = cs - } - pn.connsByLink[c.link][c] = struct{}{} -} - -// removeConn removes a given conn -func (pn *peernet) removeConn(c *conn) { - pn.Lock() - defer pn.Unlock() - - cs, found := pn.connsByLink[c.link] - if !found || len(cs) < 1 { - panic("attempting to remove a conn that doesnt exist") - } - delete(cs, c) - - cs, found = pn.connsByPeer[c.remote] - if !found { - panic("attempting to remove a conn that doesnt exist") - } - delete(cs, c) -} - -// CtxGroup returns the network's ContextGroup -func (pn *peernet) CtxGroup() ctxgroup.ContextGroup { - return pn.cg -} - -// LocalPeer the network's LocalPeer -func (pn *peernet) LocalPeer() peer.ID { - return pn.peer -} - -// Peers returns the connected peers -func (pn *peernet) Peers() []peer.ID { - pn.RLock() - defer pn.RUnlock() - - peers := make([]peer.ID, 0, len(pn.connsByPeer)) - for _, cs := range pn.connsByPeer { - for c := range cs { - peers = append(peers, c.remote) - break - } - } - return peers -} - -// Conns returns all the connections of this peer -func (pn *peernet) Conns() []inet.Conn { - pn.RLock() - defer pn.RUnlock() - - out := make([]inet.Conn, 0, len(pn.connsByPeer)) - for _, cs := range pn.connsByPeer { - for c := range cs { - out = append(out, c) - } - } - return out -} - -func (pn *peernet) ConnsToPeer(p peer.ID) []inet.Conn { - pn.RLock() - defer pn.RUnlock() - - cs, found := pn.connsByPeer[p] - if !found || len(cs) == 0 { - return nil - } - - var cs2 []inet.Conn - for c := range cs { - cs2 = append(cs2, c) - } - return cs2 -} - -// ClosePeer connections to peer -func (pn *peernet) ClosePeer(p peer.ID) error { - pn.RLock() - cs, found := pn.connsByPeer[p] - pn.RUnlock() - if !found { - return nil - } - - for c := range cs { - c.Close() - } - return nil -} - -// BandwidthTotals returns the total amount of bandwidth transferred -func (pn *peernet) BandwidthTotals() (in uint64, out uint64) { - // need to implement this. probably best to do it in swarm this time. - // need a "metrics" object - return 0, 0 -} - -// ListenAddresses returns a list of addresses at which this network listens. -func (pn *peernet) ListenAddresses() []ma.Multiaddr { - return pn.Peerstore().Addresses(pn.LocalPeer()) -} - -// InterfaceListenAddresses returns a list of addresses at which this network -// listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to -// use the known local interfaces. -func (pn *peernet) InterfaceListenAddresses() ([]ma.Multiaddr, error) { - return pn.ListenAddresses(), nil -} - -// Connectedness returns a state signaling connection capabilities -// For now only returns Connecter || NotConnected. Expand into more later. -func (pn *peernet) Connectedness(p peer.ID) inet.Connectedness { - pn.Lock() - defer pn.Unlock() - - cs, found := pn.connsByPeer[p] - if found && len(cs) > 0 { - return inet.Connected - } - return inet.NotConnected -} - -// NewStream returns a new stream to given peer p. -// If there is no connection to p, attempts to create one. -func (pn *peernet) NewStream(p peer.ID) (inet.Stream, error) { - pn.Lock() - cs, found := pn.connsByPeer[p] - if !found || len(cs) < 1 { - pn.Unlock() - return nil, fmt.Errorf("no connection to peer") - } - pn.Unlock() - - // if many conns are found, how do we select? for now, randomly... - // this would be an interesting place to test logic that can measure - // links (network interfaces) and select properly - n := rand.Intn(len(cs)) - var c *conn - for c = range cs { - if n == 0 { - break - } - n-- - } - - return c.NewStream() -} - -// SetStreamHandler sets the new stream handler on the Network. -// This operation is threadsafe. -func (pn *peernet) SetStreamHandler(h inet.StreamHandler) { - pn.Lock() - pn.streamHandler = h - pn.Unlock() -} - -// SetConnHandler sets the new conn handler on the Network. -// This operation is threadsafe. -func (pn *peernet) SetConnHandler(h inet.ConnHandler) { - pn.Lock() - pn.connHandler = h - pn.Unlock() -} diff --git a/p2p/net2/mock/mock_printer.go b/p2p/net2/mock/mock_printer.go deleted file mode 100644 index 151b8d3d4..000000000 --- a/p2p/net2/mock/mock_printer.go +++ /dev/null @@ -1,36 +0,0 @@ -package mocknet - -import ( - "fmt" - "io" - - inet "github.com/jbenet/go-ipfs/p2p/net2" - peer "github.com/jbenet/go-ipfs/p2p/peer" -) - -// separate object so our interfaces are separate :) -type printer struct { - w io.Writer -} - -func (p *printer) MocknetLinks(mn Mocknet) { - links := mn.Links() - - fmt.Fprintf(p.w, "Mocknet link map:\n") - for p1, lm := range links { - fmt.Fprintf(p.w, "\t%s linked to:\n", peer.ID(p1)) - for p2, l := range lm { - fmt.Fprintf(p.w, "\t\t%s (%d links)\n", peer.ID(p2), len(l)) - } - } - fmt.Fprintf(p.w, "\n") -} - -func (p *printer) NetworkConns(ni inet.Network) { - - fmt.Fprintf(p.w, "%s connected to:\n", ni.LocalPeer()) - for _, c := range ni.Conns() { - fmt.Fprintf(p.w, "\t%s (addr: %s)\n", c.RemotePeer(), c.RemoteMultiaddr()) - } - fmt.Fprintf(p.w, "\n") -} diff --git a/p2p/net2/mock/mock_stream.go b/p2p/net2/mock/mock_stream.go deleted file mode 100644 index 317abbafd..000000000 --- a/p2p/net2/mock/mock_stream.go +++ /dev/null @@ -1,29 +0,0 @@ -package mocknet - -import ( - "io" - - inet "github.com/jbenet/go-ipfs/p2p/net2" -) - -// stream implements inet.Stream -type stream struct { - io.Reader - io.Writer - conn *conn -} - -func (s *stream) Close() error { - s.conn.removeStream(s) - if r, ok := (s.Reader).(io.Closer); ok { - r.Close() - } - if w, ok := (s.Writer).(io.Closer); ok { - return w.Close() - } - return nil -} - -func (s *stream) Conn() inet.Conn { - return s.conn -} diff --git a/p2p/net2/mock/mock_test.go b/p2p/net2/mock/mock_test.go deleted file mode 100644 index 6a27a047f..000000000 --- a/p2p/net2/mock/mock_test.go +++ /dev/null @@ -1,475 +0,0 @@ -package mocknet - -import ( - "bytes" - "io" - "math/rand" - "sync" - "testing" - - inet "github.com/jbenet/go-ipfs/p2p/net2" - peer "github.com/jbenet/go-ipfs/p2p/peer" - protocol "github.com/jbenet/go-ipfs/p2p/protocol" - testutil "github.com/jbenet/go-ipfs/util/testutil" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" -) - -func randPeer(t *testing.T) peer.ID { - p, err := testutil.RandPeerID() - if err != nil { - t.Fatal(err) - } - return p -} - -func TestNetworkSetup(t *testing.T) { - - ctx := context.Background() - sk1, _, err := testutil.RandKeyPair(512) - if err != nil { - t.Fatal(t) - } - sk2, _, err := testutil.RandKeyPair(512) - if err != nil { - t.Fatal(t) - } - sk3, _, err := testutil.RandKeyPair(512) - if err != nil { - t.Fatal(t) - } - mn := New(ctx) - // peers := []peer.ID{p1, p2, p3} - - // add peers to mock net - - a1 := testutil.RandLocalTCPAddress() - a2 := testutil.RandLocalTCPAddress() - a3 := testutil.RandLocalTCPAddress() - - h1, err := mn.AddPeer(sk1, a1) - if err != nil { - t.Fatal(err) - } - p1 := h1.ID() - - h2, err := mn.AddPeer(sk2, a2) - if err != nil { - t.Fatal(err) - } - p2 := h2.ID() - - h3, err := mn.AddPeer(sk3, a3) - if err != nil { - t.Fatal(err) - } - p3 := h3.ID() - - // check peers and net - if mn.Host(p1) != h1 { - t.Error("host for p1.ID != h1") - } - if mn.Host(p2) != h2 { - t.Error("host for p2.ID != h2") - } - if mn.Host(p3) != h3 { - t.Error("host for p3.ID != h3") - } - - n1 := h1.Network() - if mn.Net(p1) != n1 { - t.Error("net for p1.ID != n1") - } - n2 := h2.Network() - if mn.Net(p2) != n2 { - t.Error("net for p2.ID != n1") - } - n3 := h3.Network() - if mn.Net(p3) != n3 { - t.Error("net for p3.ID != n1") - } - - // link p1<-->p2, p1<-->p1, p2<-->p3, p3<-->p2 - - l12, err := mn.LinkPeers(p1, p2) - if err != nil { - t.Fatal(err) - } - if !(l12.Networks()[0] == n1 && l12.Networks()[1] == n2) && - !(l12.Networks()[0] == n2 && l12.Networks()[1] == n1) { - t.Error("l12 networks incorrect") - } - - l11, err := mn.LinkPeers(p1, p1) - if err != nil { - t.Fatal(err) - } - if !(l11.Networks()[0] == n1 && l11.Networks()[1] == n1) { - t.Error("l11 networks incorrect") - } - - l23, err := mn.LinkPeers(p2, p3) - if err != nil { - t.Fatal(err) - } - if !(l23.Networks()[0] == n2 && l23.Networks()[1] == n3) && - !(l23.Networks()[0] == n3 && l23.Networks()[1] == n2) { - t.Error("l23 networks incorrect") - } - - l32, err := mn.LinkPeers(p3, p2) - if err != nil { - t.Fatal(err) - } - if !(l32.Networks()[0] == n2 && l32.Networks()[1] == n3) && - !(l32.Networks()[0] == n3 && l32.Networks()[1] == n2) { - t.Error("l32 networks incorrect") - } - - // check things - - links12 := mn.LinksBetweenPeers(p1, p2) - if len(links12) != 1 { - t.Errorf("should be 1 link bt. p1 and p2 (found %d)", len(links12)) - } - if links12[0] != l12 { - t.Error("links 1-2 should be l12.") - } - - links11 := mn.LinksBetweenPeers(p1, p1) - if len(links11) != 1 { - t.Errorf("should be 1 link bt. p1 and p1 (found %d)", len(links11)) - } - if links11[0] != l11 { - t.Error("links 1-1 should be l11.") - } - - links23 := mn.LinksBetweenPeers(p2, p3) - if len(links23) != 2 { - t.Errorf("should be 2 link bt. p2 and p3 (found %d)", len(links23)) - } - if !((links23[0] == l23 && links23[1] == l32) || - (links23[0] == l32 && links23[1] == l23)) { - t.Error("links 2-3 should be l23 and l32.") - } - - // unlinking - - if err := mn.UnlinkPeers(p2, p1); err != nil { - t.Error(err) - } - - // check only one link affected: - - links12 = mn.LinksBetweenPeers(p1, p2) - if len(links12) != 0 { - t.Errorf("should be 0 now...", len(links12)) - } - - links11 = mn.LinksBetweenPeers(p1, p1) - if len(links11) != 1 { - t.Errorf("should be 1 link bt. p1 and p1 (found %d)", len(links11)) - } - if links11[0] != l11 { - t.Error("links 1-1 should be l11.") - } - - links23 = mn.LinksBetweenPeers(p2, p3) - if len(links23) != 2 { - t.Errorf("should be 2 link bt. p2 and p3 (found %d)", len(links23)) - } - if !((links23[0] == l23 && links23[1] == l32) || - (links23[0] == l32 && links23[1] == l23)) { - t.Error("links 2-3 should be l23 and l32.") - } - - // check connecting - - // first, no conns - if len(n2.Conns()) > 0 || len(n3.Conns()) > 0 { - t.Error("should have 0 conn. Got: (%d, %d)", len(n2.Conns()), len(n3.Conns())) - } - - // connect p2->p3 - if _, err := n2.DialPeer(ctx, p3); err != nil { - t.Error(err) - } - - if len(n2.Conns()) != 1 || len(n3.Conns()) != 1 { - t.Errorf("should have (1,1) conn. Got: (%d, %d)", len(n2.Conns()), len(n3.Conns())) - } - - // p := PrinterTo(os.Stdout) - // p.NetworkConns(n1) - // p.NetworkConns(n2) - // p.NetworkConns(n3) - - // can create a stream 2->3, 3->2, - if _, err := n2.NewStream(p3); err != nil { - t.Error(err) - } - if _, err := n3.NewStream(p2); err != nil { - t.Error(err) - } - - // but not 1->2 nor 2->2 (not linked), nor 1->1 (not connected) - if _, err := n1.NewStream(p2); err == nil { - t.Error("should not be able to connect") - } - if _, err := n2.NewStream(p2); err == nil { - t.Error("should not be able to connect") - } - if _, err := n1.NewStream(p1); err == nil { - t.Error("should not be able to connect") - } - - // connect p1->p1 (should work) - if _, err := n1.DialPeer(ctx, p1); err != nil { - t.Error("p1 should be able to dial self.", err) - } - - // and a stream too - if _, err := n1.NewStream(p1); err != nil { - t.Error(err) - } - - // connect p1->p2 - if _, err := n1.DialPeer(ctx, p2); err == nil { - t.Error("p1 should not be able to dial p2, not connected...") - } - - // connect p3->p1 - if _, err := n3.DialPeer(ctx, p1); err == nil { - t.Error("p3 should not be able to dial p1, not connected...") - } - - // relink p1->p2 - - l12, err = mn.LinkPeers(p1, p2) - if err != nil { - t.Fatal(err) - } - if !(l12.Networks()[0] == n1 && l12.Networks()[1] == n2) && - !(l12.Networks()[0] == n2 && l12.Networks()[1] == n1) { - t.Error("l12 networks incorrect") - } - - // should now be able to connect - - // connect p1->p2 - if _, err := n1.DialPeer(ctx, p2); err != nil { - t.Error(err) - } - - // and a stream should work now too :) - if _, err := n2.NewStream(p3); err != nil { - t.Error(err) - } - -} - -func TestStreams(t *testing.T) { - - mn, err := FullMeshConnected(context.Background(), 3) - if err != nil { - t.Fatal(err) - } - - handler := func(s inet.Stream) { - b := make([]byte, 4) - if _, err := io.ReadFull(s, b); err != nil { - panic(err) - } - if !bytes.Equal(b, []byte("beep")) { - panic("bytes mismatch") - } - if _, err := s.Write([]byte("boop")); err != nil { - panic(err) - } - s.Close() - } - - hosts := mn.Hosts() - for _, h := range mn.Hosts() { - h.SetStreamHandler(protocol.TestingID, handler) - } - - s, err := hosts[0].NewStream(protocol.TestingID, hosts[1].ID()) - if err != nil { - t.Fatal(err) - } - - if _, err := s.Write([]byte("beep")); err != nil { - panic(err) - } - b := make([]byte, 4) - if _, err := io.ReadFull(s, b); err != nil { - panic(err) - } - if !bytes.Equal(b, []byte("boop")) { - panic("bytes mismatch 2") - } - -} - -func makePinger(st string, n int) func(inet.Stream) { - return func(s inet.Stream) { - go func() { - defer s.Close() - - for i := 0; i < n; i++ { - b := make([]byte, 4+len(st)) - if _, err := s.Write([]byte("ping" + st)); err != nil { - panic(err) - } - if _, err := io.ReadFull(s, b); err != nil { - panic(err) - } - if !bytes.Equal(b, []byte("pong"+st)) { - panic("bytes mismatch") - } - } - }() - } -} - -func makePonger(st string) func(inet.Stream) { - return func(s inet.Stream) { - go func() { - defer s.Close() - - for { - b := make([]byte, 4+len(st)) - if _, err := io.ReadFull(s, b); err != nil { - if err == io.EOF { - return - } - panic(err) - } - if !bytes.Equal(b, []byte("ping"+st)) { - panic("bytes mismatch") - } - if _, err := s.Write([]byte("pong" + st)); err != nil { - panic(err) - } - } - }() - } -} - -func TestStreamsStress(t *testing.T) { - - mn, err := FullMeshConnected(context.Background(), 100) - if err != nil { - t.Fatal(err) - } - - hosts := mn.Hosts() - for _, h := range hosts { - ponger := makePonger(string(protocol.TestingID)) - h.SetStreamHandler(protocol.TestingID, ponger) - } - - var wg sync.WaitGroup - for i := 0; i < 1000; i++ { - wg.Add(1) - go func(i int) { - defer wg.Done() - from := rand.Intn(len(hosts)) - to := rand.Intn(len(hosts)) - s, err := hosts[from].NewStream(protocol.TestingID, hosts[to].ID()) - if err != nil { - log.Debugf("%d (%s) %d (%s)", from, hosts[from], to, hosts[to]) - panic(err) - } - - log.Infof("%d start pinging", i) - makePinger("pingpong", rand.Intn(100))(s) - log.Infof("%d done pinging", i) - }(i) - } - - wg.Wait() -} - -func TestAdding(t *testing.T) { - - mn := New(context.Background()) - - peers := []peer.ID{} - for i := 0; i < 3; i++ { - sk, _, err := testutil.RandKeyPair(512) - if err != nil { - t.Fatal(err) - } - - a := testutil.RandLocalTCPAddress() - h, err := mn.AddPeer(sk, a) - if err != nil { - t.Fatal(err) - } - - peers = append(peers, h.ID()) - } - - p1 := peers[0] - p2 := peers[1] - - // link them - for _, p1 := range peers { - for _, p2 := range peers { - if _, err := mn.LinkPeers(p1, p2); err != nil { - t.Error(err) - } - } - } - - // set the new stream handler on p2 - h2 := mn.Host(p2) - if h2 == nil { - t.Fatalf("no host for %s", p2) - } - h2.SetStreamHandler(protocol.TestingID, func(s inet.Stream) { - defer s.Close() - - b := make([]byte, 4) - if _, err := io.ReadFull(s, b); err != nil { - panic(err) - } - if string(b) != "beep" { - panic("did not beep!") - } - - if _, err := s.Write([]byte("boop")); err != nil { - panic(err) - } - }) - - // connect p1 to p2 - if _, err := mn.ConnectPeers(p1, p2); err != nil { - t.Fatal(err) - } - - // talk to p2 - h1 := mn.Host(p1) - if h1 == nil { - t.Fatalf("no network for %s", p1) - } - - s, err := h1.NewStream(protocol.TestingID, p2) - if err != nil { - t.Fatal(err) - } - - if _, err := s.Write([]byte("beep")); err != nil { - t.Error(err) - } - b := make([]byte, 4) - if _, err := io.ReadFull(s, b); err != nil { - t.Error(err) - } - if !bytes.Equal(b, []byte("boop")) { - t.Error("bytes mismatch 2") - } - -} diff --git a/p2p/net2/swarm/addr.go b/p2p/net2/swarm/addr.go deleted file mode 100644 index 01cb39717..000000000 --- a/p2p/net2/swarm/addr.go +++ /dev/null @@ -1,124 +0,0 @@ -package swarm - -import ( - conn "github.com/jbenet/go-ipfs/p2p/net/conn" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - manet "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net" -) - -// ListenAddresses returns a list of addresses at which this swarm listens. -func (s *Swarm) ListenAddresses() []ma.Multiaddr { - listeners := s.swarm.Listeners() - addrs := make([]ma.Multiaddr, 0, len(listeners)) - for _, l := range listeners { - if l2, ok := l.NetListener().(conn.Listener); ok { - addrs = append(addrs, l2.Multiaddr()) - } - } - return addrs -} - -// InterfaceListenAddresses returns a list of addresses at which this swarm -// listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to -// use the known local interfaces. -func InterfaceListenAddresses(s *Swarm) ([]ma.Multiaddr, error) { - return resolveUnspecifiedAddresses(s.ListenAddresses()) -} - -// resolveUnspecifiedAddresses expands unspecified ip addresses (/ip4/0.0.0.0, /ip6/::) to -// use the known local interfaces. -func resolveUnspecifiedAddresses(unspecifiedAddrs []ma.Multiaddr) ([]ma.Multiaddr, error) { - var outputAddrs []ma.Multiaddr - - // todo optimize: only fetch these if we have a "any" addr. - ifaceAddrs, err := interfaceAddresses() - if err != nil { - return nil, err - } - - for _, a := range unspecifiedAddrs { - - // split address into its components - split := ma.Split(a) - - // if first component (ip) is not unspecified, use it as is. - if !manet.IsIPUnspecified(split[0]) { - outputAddrs = append(outputAddrs, a) - continue - } - - // unspecified? add one address per interface. - for _, ia := range ifaceAddrs { - split[0] = ia - joined := ma.Join(split...) - outputAddrs = append(outputAddrs, joined) - } - } - - log.Event(context.TODO(), "interfaceListenAddresses", func() eventlog.Loggable { - var addrs []string - for _, addr := range outputAddrs { - addrs = append(addrs, addr.String()) - } - return eventlog.Metadata{"addresses": addrs} - }()) - log.Debug("InterfaceListenAddresses:", outputAddrs) - return outputAddrs, nil -} - -// interfaceAddresses returns a list of addresses associated with local machine -func interfaceAddresses() ([]ma.Multiaddr, error) { - maddrs, err := manet.InterfaceMultiaddrs() - if err != nil { - return nil, err - } - - var nonLoopback []ma.Multiaddr - for _, a := range maddrs { - if !manet.IsIPLoopback(a) { - nonLoopback = append(nonLoopback, a) - } - } - - return nonLoopback, nil -} - -// addrInList returns whether or not an address is part of a list. -// this is useful to check if NAT is happening (or other bugs?) -func addrInList(addr ma.Multiaddr, list []ma.Multiaddr) bool { - for _, addr2 := range list { - if addr.Equal(addr2) { - return true - } - } - return false -} - -// checkNATWarning checks if our observed addresses differ. if so, -// informs the user that certain things might not work yet -func checkNATWarning(s *Swarm, observed ma.Multiaddr, expected ma.Multiaddr) { - if observed.Equal(expected) { - return - } - - listen, err := InterfaceListenAddresses(s) - if err != nil { - log.Errorf("Error retrieving swarm.InterfaceListenAddresses: %s", err) - return - } - - if !addrInList(observed, listen) { // probably a nat - log.Warningf(natWarning, observed, listen) - } -} - -const natWarning = `Remote peer observed our address to be: %s -The local addresses are: %s -Thus, connection is going through NAT, and other connections may fail. - -IPFS NAT traversal is still under development. Please bug us on github or irc to fix this. -Baby steps: http://jbenet.static.s3.amazonaws.com/271dfcf/baby-steps.gif -` diff --git a/p2p/net2/swarm/simul_test.go b/p2p/net2/swarm/simul_test.go deleted file mode 100644 index b61f3f03c..000000000 --- a/p2p/net2/swarm/simul_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package swarm - -import ( - "sync" - "testing" - "time" - - peer "github.com/jbenet/go-ipfs/p2p/peer" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" -) - -func TestSimultOpen(t *testing.T) { - // t.Skip("skipping for another test") - - ctx := context.Background() - swarms, peers := makeSwarms(ctx, t, 2) - - // connect everyone - { - var wg sync.WaitGroup - connect := func(s *Swarm, dst peer.ID, addr ma.Multiaddr) { - // copy for other peer - s.peers.AddAddress(dst, addr) - if _, err := s.Dial(ctx, dst); err != nil { - t.Fatal("error swarm dialing to peer", err) - } - wg.Done() - } - - log.Info("Connecting swarms simultaneously.") - wg.Add(2) - go connect(swarms[0], swarms[1].local, peers[1].Addr) - go connect(swarms[1], swarms[0].local, peers[0].Addr) - wg.Wait() - } - - for _, s := range swarms { - s.Close() - } -} - -func TestSimultOpenMany(t *testing.T) { - // t.Skip("very very slow") - - addrs := 20 - SubtestSwarm(t, addrs, 10) -} - -func TestSimultOpenFewStress(t *testing.T) { - if testing.Short() { - t.SkipNow() - } - // t.Skip("skipping for another test") - - msgs := 40 - swarms := 2 - rounds := 10 - // rounds := 100 - - for i := 0; i < rounds; i++ { - SubtestSwarm(t, swarms, msgs) - <-time.After(10 * time.Millisecond) - } -} diff --git a/p2p/net2/swarm/swarm.go b/p2p/net2/swarm/swarm.go deleted file mode 100644 index 74201f4f0..000000000 --- a/p2p/net2/swarm/swarm.go +++ /dev/null @@ -1,158 +0,0 @@ -// package swarm implements a connection muxer with a pair of channels -// to synchronize all network communication. -package swarm - -import ( - inet "github.com/jbenet/go-ipfs/p2p/net2" - peer "github.com/jbenet/go-ipfs/p2p/peer" - eventlog "github.com/jbenet/go-ipfs/util/eventlog" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ctxgroup "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-ctxgroup" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - ps "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-peerstream" -) - -var log = eventlog.Logger("swarm2") - -// Swarm is a connection muxer, allowing connections to other peers to -// be opened and closed, while still using the same Chan for all -// communication. The Chan sends/receives Messages, which note the -// destination or source Peer. -// -// Uses peerstream.Swarm -type Swarm struct { - swarm *ps.Swarm - local peer.ID - peers peer.Peerstore - connh ConnHandler - - cg ctxgroup.ContextGroup -} - -// NewSwarm constructs a Swarm, with a Chan. -func NewSwarm(ctx context.Context, listenAddrs []ma.Multiaddr, - local peer.ID, peers peer.Peerstore) (*Swarm, error) { - - s := &Swarm{ - swarm: ps.NewSwarm(), - local: local, - peers: peers, - cg: ctxgroup.WithContext(ctx), - } - - // configure Swarm - s.cg.SetTeardown(s.teardown) - s.SetConnHandler(nil) // make sure to setup our own conn handler. - - return s, s.listen(listenAddrs) -} - -func (s *Swarm) teardown() error { - return s.swarm.Close() -} - -// CtxGroup returns the Context Group of the swarm -func (s *Swarm) CtxGroup() ctxgroup.ContextGroup { - return s.cg -} - -// Close stops the Swarm. -func (s *Swarm) Close() error { - return s.cg.Close() -} - -// StreamSwarm returns the underlying peerstream.Swarm -func (s *Swarm) StreamSwarm() *ps.Swarm { - return s.swarm -} - -// SetConnHandler assigns the handler for new connections. -// See peerstream. You will rarely use this. See SetStreamHandler -func (s *Swarm) SetConnHandler(handler ConnHandler) { - - // handler is nil if user wants to clear the old handler. - if handler == nil { - s.swarm.SetConnHandler(func(psconn *ps.Conn) { - s.connHandler(psconn) - }) - return - } - - s.swarm.SetConnHandler(func(psconn *ps.Conn) { - // sc is nil if closed in our handler. - if sc := s.connHandler(psconn); sc != nil { - // call the user's handler. in a goroutine for sync safety. - go handler(sc) - } - }) -} - -// SetStreamHandler assigns the handler for new streams. -// See peerstream. -func (s *Swarm) SetStreamHandler(handler inet.StreamHandler) { - s.swarm.SetStreamHandler(func(s *ps.Stream) { - handler(wrapStream(s)) - }) -} - -// NewStreamWithPeer creates a new stream on any available connection to p -func (s *Swarm) NewStreamWithPeer(p peer.ID) (*Stream, error) { - // if we have no connections, try connecting. - if len(s.ConnectionsToPeer(p)) == 0 { - log.Debug("Swarm: NewStreamWithPeer no connections. Attempting to connect...") - if _, err := s.Dial(context.Background(), p); err != nil { - return nil, err - } - } - log.Debug("Swarm: NewStreamWithPeer...") - - st, err := s.swarm.NewStreamWithGroup(p) - return wrapStream(st), err -} - -// StreamsWithPeer returns all the live Streams to p -func (s *Swarm) StreamsWithPeer(p peer.ID) []*Stream { - return wrapStreams(ps.StreamsWithGroup(p, s.swarm.Streams())) -} - -// ConnectionsToPeer returns all the live connections to p -func (s *Swarm) ConnectionsToPeer(p peer.ID) []*Conn { - return wrapConns(ps.ConnsWithGroup(p, s.swarm.Conns())) -} - -// Connections returns a slice of all connections. -func (s *Swarm) Connections() []*Conn { - return wrapConns(s.swarm.Conns()) -} - -// CloseConnection removes a given peer from swarm + closes the connection -func (s *Swarm) CloseConnection(p peer.ID) error { - conns := s.swarm.ConnsWithGroup(p) // boom. - for _, c := range conns { - c.Close() - } - return nil -} - -// Peers returns a copy of the set of peers swarm is connected to. -func (s *Swarm) Peers() []peer.ID { - conns := s.Connections() - - seen := make(map[peer.ID]struct{}) - peers := make([]peer.ID, 0, len(conns)) - for _, c := range conns { - p := c.RemotePeer() - if _, found := seen[p]; found { - continue - } - - peers = append(peers, p) - } - return peers -} - -// LocalPeer returns the local peer swarm is associated to. -func (s *Swarm) LocalPeer() peer.ID { - return s.local -} diff --git a/p2p/net2/swarm/swarm_conn.go b/p2p/net2/swarm/swarm_conn.go deleted file mode 100644 index dd00a89ba..000000000 --- a/p2p/net2/swarm/swarm_conn.go +++ /dev/null @@ -1,141 +0,0 @@ -package swarm - -import ( - "fmt" - - ic "github.com/jbenet/go-ipfs/p2p/crypto" - conn "github.com/jbenet/go-ipfs/p2p/net/conn" - inet "github.com/jbenet/go-ipfs/p2p/net2" - peer "github.com/jbenet/go-ipfs/p2p/peer" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - ps "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-peerstream" -) - -// a Conn is a simple wrapper around a ps.Conn that also exposes -// some of the methods from the underlying conn.Conn. -// There's **five** "layers" to each connection: -// * 0. the net.Conn - underlying net.Conn (TCP/UDP/UTP/etc) -// * 1. the manet.Conn - provides multiaddr friendly Conn -// * 2. the conn.Conn - provides Peer friendly Conn (inc Secure channel) -// * 3. the peerstream.Conn - provides peerstream / spdysptream happiness -// * 4. the Conn - abstracts everyting out, exposing only key parts of underlying layers -// (I know, this is kinda crazy. it's more historical than a good design. though the -// layers do build up pieces of functionality. and they're all just io.RW :) ) -type Conn ps.Conn - -// ConnHandler is called when new conns are opened from remote peers. -// See peerstream.ConnHandler -type ConnHandler func(*Conn) - -func (c *Conn) StreamConn() *ps.Conn { - return (*ps.Conn)(c) -} - -func (c *Conn) RawConn() conn.Conn { - // righly panic if these things aren't true. it is an expected - // invariant that these Conns are all of the typewe expect: - // ps.Conn wrapping a conn.Conn - // if we get something else it is programmer error. - return (*ps.Conn)(c).NetConn().(conn.Conn) -} - -func (c *Conn) String() string { - return fmt.Sprintf("", c.RawConn()) -} - -// LocalMultiaddr is the Multiaddr on this side -func (c *Conn) LocalMultiaddr() ma.Multiaddr { - return c.RawConn().LocalMultiaddr() -} - -// LocalPeer is the Peer on our side of the connection -func (c *Conn) LocalPeer() peer.ID { - return c.RawConn().LocalPeer() -} - -// RemoteMultiaddr is the Multiaddr on the remote side -func (c *Conn) RemoteMultiaddr() ma.Multiaddr { - return c.RawConn().RemoteMultiaddr() -} - -// RemotePeer is the Peer on the remote side -func (c *Conn) RemotePeer() peer.ID { - return c.RawConn().RemotePeer() -} - -// LocalPrivateKey is the public key of the peer on this side -func (c *Conn) LocalPrivateKey() ic.PrivKey { - return c.RawConn().LocalPrivateKey() -} - -// RemotePublicKey is the public key of the peer on the remote side -func (c *Conn) RemotePublicKey() ic.PubKey { - return c.RawConn().RemotePublicKey() -} - -// NewSwarmStream returns a new Stream from this connection -func (c *Conn) NewSwarmStream() (*Stream, error) { - s, err := c.StreamConn().NewStream() - return wrapStream(s), err -} - -// NewStream returns a new Stream from this connection -func (c *Conn) NewStream() (inet.Stream, error) { - s, err := c.NewSwarmStream() - return inet.Stream(s), err -} - -func (c *Conn) Close() error { - return c.StreamConn().Close() -} - -func wrapConn(psc *ps.Conn) (*Conn, error) { - // grab the underlying connection. - if _, ok := psc.NetConn().(conn.Conn); !ok { - // this should never happen. if we see it ocurring it means that we added - // a Listener to the ps.Swarm that is NOT one of our net/conn.Listener. - return nil, fmt.Errorf("swarm connHandler: invalid conn (not a conn.Conn): %s", psc) - } - return (*Conn)(psc), nil -} - -// wrapConns returns a *Conn for all these ps.Conns -func wrapConns(conns1 []*ps.Conn) []*Conn { - conns2 := make([]*Conn, len(conns1)) - for i, c1 := range conns1 { - if c2, err := wrapConn(c1); err == nil { - conns2[i] = c2 - } - } - return conns2 -} - -// newConnSetup does the swarm's "setup" for a connection. returns the underlying -// conn.Conn this method is used by both swarm.Dial and ps.Swarm connHandler -func (s *Swarm) newConnSetup(ctx context.Context, psConn *ps.Conn) (*Conn, error) { - - // wrap with a Conn - sc, err := wrapConn(psConn) - if err != nil { - return nil, err - } - - // if we have a public key, make sure we add it to our peerstore! - // This is an important detail. Otherwise we must fetch the public - // key from the DHT or some other system. - if pk := sc.RemotePublicKey(); pk != nil { - s.peers.AddPubKey(sc.RemotePeer(), pk) - } - - // ok great! we can use it. add it to our group. - - // set the RemotePeer as a group on the conn. this lets us group - // connections in the StreamSwarm by peer, and get a streams from - // any available connection in the group (better multiconn): - // swarm.StreamSwarm().NewStreamWithGroup(remotePeer) - psConn.AddGroup(sc.RemotePeer()) - - return sc, nil -} diff --git a/p2p/net2/swarm/swarm_dial.go b/p2p/net2/swarm/swarm_dial.go deleted file mode 100644 index dde967fbc..000000000 --- a/p2p/net2/swarm/swarm_dial.go +++ /dev/null @@ -1,104 +0,0 @@ -package swarm - -import ( - "errors" - "fmt" - - conn "github.com/jbenet/go-ipfs/p2p/net/conn" - peer "github.com/jbenet/go-ipfs/p2p/peer" - lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" -) - -// Dial connects to a peer. -// -// The idea is that the client of Swarm does not need to know what network -// the connection will happen over. Swarm can use whichever it choses. -// This allows us to use various transport protocols, do NAT traversal/relay, -// etc. to achive connection. -func (s *Swarm) Dial(ctx context.Context, p peer.ID) (*Conn, error) { - - if p == s.local { - return nil, errors.New("Attempted connection to self!") - } - - // check if we already have an open connection first - cs := s.ConnectionsToPeer(p) - for _, c := range cs { - if c != nil { // dump out the first one we find - return c, nil - } - } - - sk := s.peers.PrivKey(s.local) - if sk == nil { - // may be fine for sk to be nil, just log a warning. - log.Warning("Dial not given PrivateKey, so WILL NOT SECURE conn.") - } - - remoteAddrs := s.peers.Addresses(p) - if len(remoteAddrs) == 0 { - return nil, errors.New("peer has no addresses") - } - localAddrs := s.peers.Addresses(s.local) - if len(localAddrs) == 0 { - log.Debug("Dialing out with no local addresses.") - } - - // open connection to peer - d := &conn.Dialer{ - LocalPeer: s.local, - LocalAddrs: localAddrs, - PrivateKey: sk, - } - - // try to connect to one of the peer's known addresses. - // for simplicity, we do this sequentially. - // A future commit will do this asynchronously. - var connC conn.Conn - var err error - for _, addr := range remoteAddrs { - connC, err = d.Dial(ctx, addr, p) - if err == nil { - break - } - } - if err != nil { - return nil, err - } - - // ok try to setup the new connection. - swarmC, err := dialConnSetup(ctx, s, connC) - if err != nil { - log.Error("Dial newConnSetup failed. disconnecting.") - log.Event(ctx, "dialFailureDisconnect", lgbl.NetConn(connC), lgbl.Error(err)) - swarmC.Close() // close the connection. didn't work out :( - return nil, err - } - - log.Event(ctx, "dial", p) - return swarmC, nil -} - -// dialConnSetup is the setup logic for a connection from the dial side. it -// needs to add the Conn to the StreamSwarm, then run newConnSetup -func dialConnSetup(ctx context.Context, s *Swarm, connC conn.Conn) (*Conn, error) { - - psC, err := s.swarm.AddConn(connC) - if err != nil { - // connC is closed by caller if we fail. - return nil, fmt.Errorf("failed to add conn to ps.Swarm: %s", err) - } - - // ok try to setup the new connection. (newConnSetup will add to group) - swarmC, err := s.newConnSetup(ctx, psC) - if err != nil { - log.Error("Dial newConnSetup failed. disconnecting.") - log.Event(ctx, "dialFailureDisconnect", lgbl.NetConn(connC), lgbl.Error(err)) - swarmC.Close() // we need to call this to make sure psC is Closed. - return nil, err - } - - return swarmC, err -} diff --git a/p2p/net2/swarm/swarm_listen.go b/p2p/net2/swarm/swarm_listen.go deleted file mode 100644 index ba0bee2e7..000000000 --- a/p2p/net2/swarm/swarm_listen.go +++ /dev/null @@ -1,86 +0,0 @@ -package swarm - -import ( - conn "github.com/jbenet/go-ipfs/p2p/net/conn" - lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - ps "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-peerstream" - multierr "github.com/jbenet/go-ipfs/util/multierr" -) - -// Open listeners for each network the swarm should listen on -func (s *Swarm) listen(addrs []ma.Multiaddr) error { - retErr := multierr.New() - - // listen on every address - for i, addr := range addrs { - err := s.setupListener(addr) - if err != nil { - if retErr.Errors == nil { - retErr.Errors = make([]error, len(addrs)) - } - retErr.Errors[i] = err - log.Errorf("Failed to listen on: %s - %s", addr, err) - } - } - - if retErr.Errors != nil { - return retErr - } - return nil -} - -// Listen for new connections on the given multiaddr -func (s *Swarm) setupListener(maddr ma.Multiaddr) error { - - // TODO rethink how this has to work. (jbenet) - // - // resolved, err := resolveUnspecifiedAddresses([]ma.Multiaddr{maddr}) - // if err != nil { - // return err - // } - // for _, a := range resolved { - // s.peers.AddAddress(s.local, a) - // } - - sk := s.peers.PrivKey(s.local) - if sk == nil { - // may be fine for sk to be nil, just log a warning. - log.Warning("Listener not given PrivateKey, so WILL NOT SECURE conns.") - } - list, err := conn.Listen(s.cg.Context(), maddr, s.local, sk) - if err != nil { - return err - } - - // AddListener to the peerstream Listener. this will begin accepting connections - // and streams! - _, err = s.swarm.AddListener(list) - return err -} - -// connHandler is called by the StreamSwarm whenever a new connection is added -// here we configure it slightly. Note that this is sequential, so if anything -// will take a while do it in a goroutine. -// See https://godoc.org/github.com/jbenet/go-peerstream for more information -func (s *Swarm) connHandler(c *ps.Conn) *Conn { - ctx := context.Background() - // this context is for running the handshake, which -- when receiveing connections - // -- we have no bound on beyond what the transport protocol bounds it at. - // note that setup + the handshake are bounded by underlying io. - // (i.e. if TCP or UDP disconnects (or the swarm closes), we're done. - // Q: why not have a shorter handshake? think about an HTTP server on really slow conns. - // as long as the conn is live (TCP says its online), it tries its best. we follow suit.) - - sc, err := s.newConnSetup(ctx, c) - if err != nil { - log.Error(err) - log.Event(ctx, "newConnHandlerDisconnect", lgbl.NetConn(c.NetConn()), lgbl.Error(err)) - c.Close() // boom. close it. - return nil - } - - return sc -} diff --git a/p2p/net2/swarm/swarm_stream.go b/p2p/net2/swarm/swarm_stream.go deleted file mode 100644 index 82a66e020..000000000 --- a/p2p/net2/swarm/swarm_stream.go +++ /dev/null @@ -1,59 +0,0 @@ -package swarm - -import ( - inet "github.com/jbenet/go-ipfs/p2p/net2" - - ps "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-peerstream" -) - -// a Stream is a wrapper around a ps.Stream that exposes a way to get -// our Conn and Swarm (instead of just the ps.Conn and ps.Swarm) -type Stream ps.Stream - -// Stream returns the underlying peerstream.Stream -func (s *Stream) Stream() *ps.Stream { - return (*ps.Stream)(s) -} - -// Conn returns the Conn associated with this Stream, as an inet.Conn -func (s *Stream) Conn() inet.Conn { - return s.SwarmConn() -} - -// SwarmConn returns the Conn associated with this Stream, as a *Conn -func (s *Stream) SwarmConn() *Conn { - return (*Conn)(s.Stream().Conn()) -} - -// Wait waits for the stream to receive a reply. -func (s *Stream) Wait() error { - return s.Stream().Wait() -} - -// Read reads bytes from a stream. -func (s *Stream) Read(p []byte) (n int, err error) { - return s.Stream().Read(p) -} - -// Write writes bytes to a stream, flushing for each call. -func (s *Stream) Write(p []byte) (n int, err error) { - return s.Stream().Write(p) -} - -// Close closes the stream, indicating this side is finished -// with the stream. -func (s *Stream) Close() error { - return s.Stream().Close() -} - -func wrapStream(pss *ps.Stream) *Stream { - return (*Stream)(pss) -} - -func wrapStreams(st []*ps.Stream) []*Stream { - out := make([]*Stream, len(st)) - for i, s := range st { - out[i] = wrapStream(s) - } - return out -} diff --git a/p2p/net2/swarm/swarm_test.go b/p2p/net2/swarm/swarm_test.go deleted file mode 100644 index dfc9ca2d3..000000000 --- a/p2p/net2/swarm/swarm_test.go +++ /dev/null @@ -1,269 +0,0 @@ -package swarm - -import ( - "bytes" - "io" - "sync" - "testing" - "time" - - inet "github.com/jbenet/go-ipfs/p2p/net2" - peer "github.com/jbenet/go-ipfs/p2p/peer" - errors "github.com/jbenet/go-ipfs/util/debugerror" - testutil "github.com/jbenet/go-ipfs/util/testutil" - - context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" -) - -func EchoStreamHandler(stream inet.Stream) { - go func() { - defer stream.Close() - - // pull out the ipfs conn - c := stream.Conn() - log.Debugf("%s ponging to %s", c.LocalPeer(), c.RemotePeer()) - - buf := make([]byte, 4) - - for { - if _, err := stream.Read(buf); err != nil { - if err != io.EOF { - log.Error("ping receive error:", err) - } - return - } - - if !bytes.Equal(buf, []byte("ping")) { - log.Errorf("ping receive error: ping != %s %v", buf, buf) - return - } - - if _, err := stream.Write([]byte("pong")); err != nil { - log.Error("pond send error:", err) - return - } - } - }() -} - -func makeSwarms(ctx context.Context, t *testing.T, num int) ([]*Swarm, []testutil.PeerNetParams) { - swarms := make([]*Swarm, 0, num) - peersnp := make([]testutil.PeerNetParams, 0, num) - - for i := 0; i < num; i++ { - localnp := testutil.RandPeerNetParamsOrFatal(t) - peersnp = append(peersnp, localnp) - - peerstore := peer.NewPeerstore() - peerstore.AddAddress(localnp.ID, localnp.Addr) - peerstore.AddPubKey(localnp.ID, localnp.PubKey) - peerstore.AddPrivKey(localnp.ID, localnp.PrivKey) - - addrs := peerstore.Addresses(localnp.ID) - swarm, err := NewSwarm(ctx, addrs, localnp.ID, peerstore) - if err != nil { - t.Fatal(err) - } - - swarm.SetStreamHandler(EchoStreamHandler) - swarms = append(swarms, swarm) - } - - return swarms, peersnp -} - -func connectSwarms(t *testing.T, ctx context.Context, swarms []*Swarm, peersnp []testutil.PeerNetParams) { - - var wg sync.WaitGroup - connect := func(s *Swarm, dst peer.ID, addr ma.Multiaddr) { - // TODO: make a DialAddr func. - s.peers.AddAddress(dst, addr) - if _, err := s.Dial(ctx, dst); err != nil { - t.Fatal("error swarm dialing to peer", err) - } - wg.Done() - } - - log.Info("Connecting swarms simultaneously.") - for _, s := range swarms { - for _, p := range peersnp { - if p.ID != s.local { // don't connect to self. - wg.Add(1) - connect(s, p.ID, p.Addr) - } - } - } - wg.Wait() - - for _, s := range swarms { - log.Infof("%s swarm routing table: %s", s.local, s.Peers()) - } -} - -func SubtestSwarm(t *testing.T, SwarmNum int, MsgNum int) { - // t.Skip("skipping for another test") - - ctx := context.Background() - swarms, peersnp := makeSwarms(ctx, t, SwarmNum) - - // connect everyone - connectSwarms(t, ctx, swarms, peersnp) - - // ping/pong - for _, s1 := range swarms { - log.Debugf("-------------------------------------------------------") - log.Debugf("%s ping pong round", s1.local) - log.Debugf("-------------------------------------------------------") - - _, cancel := context.WithCancel(ctx) - got := map[peer.ID]int{} - errChan := make(chan error, MsgNum*len(peersnp)) - streamChan := make(chan *Stream, MsgNum) - - // send out "ping" x MsgNum to every peer - go func() { - defer close(streamChan) - - var wg sync.WaitGroup - send := func(p peer.ID) { - defer wg.Done() - - // first, one stream per peer (nice) - stream, err := s1.NewStreamWithPeer(p) - if err != nil { - errChan <- errors.Wrap(err) - return - } - - // send out ping! - for k := 0; k < MsgNum; k++ { // with k messages - msg := "ping" - log.Debugf("%s %s %s (%d)", s1.local, msg, p, k) - stream.Write([]byte(msg)) - } - - // read it later - streamChan <- stream - } - - for _, p := range peersnp { - if p.ID == s1.local { - continue // dont send to self... - } - - wg.Add(1) - go send(p.ID) - } - wg.Wait() - }() - - // receive "pong" x MsgNum from every peer - go func() { - defer close(errChan) - count := 0 - countShouldBe := MsgNum * (len(peersnp) - 1) - for stream := range streamChan { // one per peer - defer stream.Close() - - // get peer on the other side - p := stream.Conn().RemotePeer() - - // receive pings - msgCount := 0 - msg := make([]byte, 4) - for k := 0; k < MsgNum; k++ { // with k messages - - // read from the stream - if _, err := stream.Read(msg); err != nil { - errChan <- errors.Wrap(err) - continue - } - - if string(msg) != "pong" { - errChan <- errors.Errorf("unexpected message: %s", msg) - continue - } - - log.Debugf("%s %s %s (%d)", s1.local, msg, p, k) - msgCount++ - } - - got[p] = msgCount - count += msgCount - } - - if count != countShouldBe { - errChan <- errors.Errorf("count mismatch: %d != %d", count, countShouldBe) - } - }() - - // check any errors (blocks till consumer is done) - for err := range errChan { - if err != nil { - t.Fatal(err.Error()) - } - } - - log.Debugf("%s got pongs", s1.local) - if (len(peersnp) - 1) != len(got) { - t.Errorf("got (%d) less messages than sent (%d).", len(got), len(peersnp)) - } - - for p, n := range got { - if n != MsgNum { - t.Error("peer did not get all msgs", p, n, "/", MsgNum) - } - } - - cancel() - <-time.After(10 * time.Millisecond) - } - - for _, s := range swarms { - s.Close() - } -} - -func TestSwarm(t *testing.T) { - // t.Skip("skipping for another test") - - // msgs := 1000 - msgs := 100 - swarms := 5 - SubtestSwarm(t, swarms, msgs) -} - -func TestConnHandler(t *testing.T) { - // t.Skip("skipping for another test") - - ctx := context.Background() - swarms, peersnp := makeSwarms(ctx, t, 5) - - gotconn := make(chan struct{}, 10) - swarms[0].SetConnHandler(func(conn *Conn) { - gotconn <- struct{}{} - }) - - connectSwarms(t, ctx, swarms, peersnp) - - <-time.After(time.Millisecond) - // should've gotten 5 by now. - - swarms[0].SetConnHandler(nil) - - expect := 4 - for i := 0; i < expect; i++ { - select { - case <-time.After(time.Second): - t.Fatal("failed to get connections") - case <-gotconn: - } - } - - select { - case <-gotconn: - t.Fatalf("should have connected to %d swarms", expect) - default: - } -} diff --git a/p2p/protocol/identify/id.go b/p2p/protocol/identify/id.go index 266bcc347..2479a28f9 100644 --- a/p2p/protocol/identify/id.go +++ b/p2p/protocol/identify/id.go @@ -13,7 +13,7 @@ import ( eventlog "github.com/jbenet/go-ipfs/util/eventlog" host "github.com/jbenet/go-ipfs/p2p/host" - inet "github.com/jbenet/go-ipfs/p2p/net2" + inet "github.com/jbenet/go-ipfs/p2p/net" protocol "github.com/jbenet/go-ipfs/p2p/protocol" pb "github.com/jbenet/go-ipfs/p2p/protocol/identify/pb" diff --git a/p2p/protocol/mux.go b/p2p/protocol/mux.go index d3234f401..711b99991 100644 --- a/p2p/protocol/mux.go +++ b/p2p/protocol/mux.go @@ -7,7 +7,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - inet "github.com/jbenet/go-ipfs/p2p/net2" + inet "github.com/jbenet/go-ipfs/p2p/net" eventlog "github.com/jbenet/go-ipfs/util/eventlog" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" ) diff --git a/p2p/protocol/mux_test.go b/p2p/protocol/mux_test.go index 96e8c60ff..dfac205da 100644 --- a/p2p/protocol/mux_test.go +++ b/p2p/protocol/mux_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - inet "github.com/jbenet/go-ipfs/p2p/net2" + inet "github.com/jbenet/go-ipfs/p2p/net" ) var testCases = map[string]string{ diff --git a/p2p/protocol/relay/relay.go b/p2p/protocol/relay/relay.go index 12e0d204a..4e4f0ba22 100644 --- a/p2p/protocol/relay/relay.go +++ b/p2p/protocol/relay/relay.go @@ -7,7 +7,7 @@ import ( mh "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash" host "github.com/jbenet/go-ipfs/p2p/host" - inet "github.com/jbenet/go-ipfs/p2p/net2" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" protocol "github.com/jbenet/go-ipfs/p2p/protocol" eventlog "github.com/jbenet/go-ipfs/util/eventlog" diff --git a/p2p/protocol/relay/relay_test.go b/p2p/protocol/relay/relay_test.go index 9aaedfd3d..14145044e 100644 --- a/p2p/protocol/relay/relay_test.go +++ b/p2p/protocol/relay/relay_test.go @@ -4,7 +4,7 @@ import ( "io" "testing" - inet "github.com/jbenet/go-ipfs/p2p/net2" + inet "github.com/jbenet/go-ipfs/p2p/net" protocol "github.com/jbenet/go-ipfs/p2p/protocol" relay "github.com/jbenet/go-ipfs/p2p/protocol/relay" testutil "github.com/jbenet/go-ipfs/p2p/test/util" diff --git a/p2p/test/backpressure/backpressure_test.go b/p2p/test/backpressure/backpressure_test.go index 729856e4c..946b87b3a 100644 --- a/p2p/test/backpressure/backpressure_test.go +++ b/p2p/test/backpressure/backpressure_test.go @@ -8,7 +8,7 @@ import ( "time" host "github.com/jbenet/go-ipfs/p2p/host" - inet "github.com/jbenet/go-ipfs/p2p/net2" + inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" protocol "github.com/jbenet/go-ipfs/p2p/protocol" testutil "github.com/jbenet/go-ipfs/p2p/test/util" diff --git a/p2p/test/util/util.go b/p2p/test/util/util.go index 3c831df67..741cb597d 100644 --- a/p2p/test/util/util.go +++ b/p2p/test/util/util.go @@ -4,8 +4,8 @@ import ( "testing" bhost "github.com/jbenet/go-ipfs/p2p/host/basic" - inet "github.com/jbenet/go-ipfs/p2p/net2" - swarm "github.com/jbenet/go-ipfs/p2p/net2/swarm" + inet "github.com/jbenet/go-ipfs/p2p/net" + swarm "github.com/jbenet/go-ipfs/p2p/net/swarm" peer "github.com/jbenet/go-ipfs/p2p/peer" tu "github.com/jbenet/go-ipfs/util/testutil" diff --git a/routing/dht/dht.go b/routing/dht/dht.go index 4e9e670d8..2a576629a 100644 --- a/routing/dht/dht.go +++ b/routing/dht/dht.go @@ -10,8 +10,9 @@ import ( "sync" "time" - inet "github.com/jbenet/go-ipfs/p2p/net" + host "github.com/jbenet/go-ipfs/p2p/host" peer "github.com/jbenet/go-ipfs/p2p/peer" + protocol "github.com/jbenet/go-ipfs/p2p/protocol" routing "github.com/jbenet/go-ipfs/routing" pb "github.com/jbenet/go-ipfs/routing/dht/pb" kb "github.com/jbenet/go-ipfs/routing/kbucket" @@ -26,6 +27,8 @@ import ( var log = eventlog.Logger("dht") +var ProtocolDHT protocol.ID = "/ipfs/dht" + const doPinging = false // NumBootstrapQueries defines the number of random dht queries to do to @@ -37,7 +40,7 @@ const NumBootstrapQueries = 5 // IpfsDHT is an implementation of Kademlia with Coral and S/Kademlia modifications. // It is used to implement the base IpfsRouting module. type IpfsDHT struct { - network inet.Network // the network services we need + host host.Host // the network services we need self peer.ID // Local peer (yourself) peerstore peer.Peerstore // Peer Registry @@ -56,19 +59,19 @@ type IpfsDHT struct { } // NewDHT creates a new DHT object with the given peer as the 'local' host -func NewDHT(ctx context.Context, p peer.ID, n inet.Network, dstore ds.ThreadSafeDatastore) *IpfsDHT { +func NewDHT(ctx context.Context, h host.Host, dstore ds.ThreadSafeDatastore) *IpfsDHT { dht := new(IpfsDHT) dht.datastore = dstore - dht.self = p - dht.peerstore = n.Peerstore() + dht.self = h.ID() + dht.peerstore = h.Peerstore() dht.ContextGroup = ctxgroup.WithContext(ctx) - dht.network = n - n.SetHandler(inet.ProtocolDHT, dht.handleNewStream) + dht.host = h + h.SetStreamHandler(ProtocolDHT, dht.handleNewStream) - dht.providers = NewProviderManager(dht.Context(), p) + dht.providers = NewProviderManager(dht.Context(), dht.self) dht.AddChildGroup(dht.providers) - dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(p), time.Minute, dht.peerstore) + dht.routingTable = kb.NewRoutingTable(20, kb.ConvertPeerID(dht.self), time.Minute, dht.peerstore) dht.birth = time.Now() dht.Validators = make(map[string]ValidatorFunc) @@ -88,7 +91,8 @@ func (dht *IpfsDHT) LocalPeer() peer.ID { // Connect to a new peer at the given address, ping and add to the routing table func (dht *IpfsDHT) Connect(ctx context.Context, npeer peer.ID) error { - if err := dht.network.DialPeer(ctx, npeer); err != nil { + // TODO: change interface to accept a PeerInfo as well. + if err := dht.host.Connect(ctx, peer.PeerInfo{ID: npeer}); err != nil { return err } @@ -127,7 +131,7 @@ func (dht *IpfsDHT) putProvider(ctx context.Context, p peer.ID, key string) erro // add self as the provider pi := dht.peerstore.PeerInfo(dht.self) - pmes.ProviderPeers = pb.PeerInfosToPBPeers(dht.network, []peer.PeerInfo{pi}) + pmes.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), []peer.PeerInfo{pi}) err := dht.sendMessage(ctx, p, pmes) if err != nil { @@ -304,7 +308,7 @@ func (dht *IpfsDHT) ensureConnectedToPeer(ctx context.Context, p peer.ID) error } // dial connection - return dht.network.DialPeer(ctx, p) + return dht.host.Connect(ctx, peer.PeerInfo{ID: p}) } // PingRoutine periodically pings nearest neighbors. diff --git a/routing/dht/dht_net.go b/routing/dht/dht_net.go index 3d9bbd93f..fd088e02c 100644 --- a/routing/dht/dht_net.go +++ b/routing/dht/dht_net.go @@ -74,7 +74,7 @@ func (dht *IpfsDHT) handleNewMessage(s inet.Stream) { func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message) (*pb.Message, error) { log.Debugf("%s dht starting stream", dht.self) - s, err := dht.network.NewStream(inet.ProtocolDHT, p) + s, err := dht.host.NewStream(ProtocolDHT, p) if err != nil { return nil, err } @@ -116,7 +116,7 @@ func (dht *IpfsDHT) sendRequest(ctx context.Context, p peer.ID, pmes *pb.Message func (dht *IpfsDHT) sendMessage(ctx context.Context, p peer.ID, pmes *pb.Message) error { log.Debugf("%s dht starting stream", dht.self) - s, err := dht.network.NewStream(inet.ProtocolDHT, p) + s, err := dht.host.NewStream(ProtocolDHT, p) if err != nil { return err } diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index 18fd74274..133f7a27c 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -14,11 +14,10 @@ import ( dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - swarmnet "github.com/jbenet/go-ipfs/p2p/net/swarmnet" peer "github.com/jbenet/go-ipfs/p2p/peer" + netutil "github.com/jbenet/go-ipfs/p2p/test/util" routing "github.com/jbenet/go-ipfs/routing" u "github.com/jbenet/go-ipfs/util" - testutil "github.com/jbenet/go-ipfs/util/testutil" ) var testCaseValues = map[u.Key][]byte{} @@ -32,30 +31,11 @@ func init() { } } -func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT { - - sk, pk, err := testutil.SeededKeyPair(time.Now().UnixNano()) - if err != nil { - t.Fatal(err) - } - - p, err := peer.IDFromPublicKey(pk) - if err != nil { - t.Fatal(err) - } - - peerstore := peer.NewPeerstore() - peerstore.AddPrivKey(p, sk) - peerstore.AddPubKey(p, pk) - peerstore.AddAddress(p, addr) - - n, err := swarmnet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore) - if err != nil { - t.Fatal(err) - } +func setupDHT(ctx context.Context, t *testing.T) *IpfsDHT { + h := netutil.GenHostSwarm(t, ctx) dss := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, p, n, dss) + d := NewDHT(ctx, h, dss) d.Validators["v"] = func(u.Key, []byte) error { return nil @@ -69,9 +49,9 @@ func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer peers := make([]peer.ID, n) for i := 0; i < n; i++ { - addrs[i] = testutil.RandLocalTCPAddress() - dhts[i] = setupDHT(ctx, t, addrs[i]) + dhts[i] = setupDHT(ctx, t) peers[i] = dhts[i].self + addrs[i] = dhts[i].peerstore.Addresses(dhts[i].self)[0] } return addrs, peers, dhts @@ -116,19 +96,16 @@ func TestPing(t *testing.T) { // t.Skip("skipping test to debug another") ctx := context.Background() - addrA := testutil.RandLocalTCPAddress() - addrB := testutil.RandLocalTCPAddress() - - dhtA := setupDHT(ctx, t, addrA) - dhtB := setupDHT(ctx, t, addrB) + dhtA := setupDHT(ctx, t) + dhtB := setupDHT(ctx, t) peerA := dhtA.self peerB := dhtB.self defer dhtA.Close() defer dhtB.Close() - defer dhtA.network.Close() - defer dhtB.network.Close() + defer dhtA.host.Close() + defer dhtB.host.Close() connect(t, ctx, dhtA, dhtB) @@ -149,16 +126,13 @@ func TestValueGetSet(t *testing.T) { ctx := context.Background() - addrA := testutil.RandLocalTCPAddress() - addrB := testutil.RandLocalTCPAddress() - - dhtA := setupDHT(ctx, t, addrA) - dhtB := setupDHT(ctx, t, addrB) + dhtA := setupDHT(ctx, t) + dhtB := setupDHT(ctx, t) defer dhtA.Close() defer dhtB.Close() - defer dhtA.network.Close() - defer dhtB.network.Close() + defer dhtA.host.Close() + defer dhtB.host.Close() vf := func(u.Key, []byte) error { return nil @@ -200,7 +174,7 @@ func TestProvides(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - defer dhts[i].network.Close() + defer dhts[i].host.Close() } }() @@ -268,7 +242,7 @@ func TestBootstrap(t *testing.T) { defer func() { for i := 0; i < nDHTs; i++ { dhts[i].Close() - defer dhts[i].network.Close() + defer dhts[i].host.Close() } }() @@ -312,7 +286,7 @@ func TestProvidesMany(t *testing.T) { defer func() { for i := 0; i < nDHTs; i++ { dhts[i].Close() - defer dhts[i].network.Close() + defer dhts[i].host.Close() } }() @@ -424,7 +398,7 @@ func TestProvidesAsync(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - defer dhts[i].network.Close() + defer dhts[i].host.Close() } }() @@ -478,7 +452,7 @@ func TestLayeredGet(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - defer dhts[i].network.Close() + defer dhts[i].host.Close() } }() @@ -518,7 +492,7 @@ func TestFindPeer(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - dhts[i].network.Close() + dhts[i].host.Close() } }() @@ -554,7 +528,7 @@ func TestFindPeersConnectedToPeer(t *testing.T) { defer func() { for i := 0; i < 4; i++ { dhts[i].Close() - dhts[i].network.Close() + dhts[i].host.Close() } }() @@ -633,11 +607,11 @@ func TestConnectCollision(t *testing.T) { ctx := context.Background() - addrA := testutil.RandLocalTCPAddress() - addrB := testutil.RandLocalTCPAddress() + dhtA := setupDHT(ctx, t) + dhtB := setupDHT(ctx, t) - dhtA := setupDHT(ctx, t, addrA) - dhtB := setupDHT(ctx, t, addrB) + addrA := dhtA.peerstore.Addresses(dhtA.self)[0] + addrB := dhtB.peerstore.Addresses(dhtB.self)[0] peerA := dhtA.self peerB := dhtB.self @@ -674,7 +648,7 @@ func TestConnectCollision(t *testing.T) { dhtA.Close() dhtB.Close() - dhtA.network.Close() - dhtB.network.Close() + dhtA.host.Close() + dhtB.host.Close() } } diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index f76f5bddc..2be8127c7 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -1,6 +1,8 @@ package dht import ( + "io" + "io/ioutil" "math/rand" "testing" @@ -29,13 +31,20 @@ func TestGetFailures(t *testing.T) { if err != nil { t.Fatal(err) } - nets := mn.Nets() + hosts := mn.Hosts() peers := mn.Peers() tsds := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, peers[0], nets[0], tsds) + d := NewDHT(ctx, hosts[0], tsds) d.Update(ctx, peers[1]) + // u.POut("NotFound Test\n") + // Reply with failures to every message + hosts[1].SetStreamHandler(ProtocolDHT, func(s inet.Stream) { + defer s.Close() + io.Copy(ioutil.Discard, s) + }) + // This one should time out // u.POut("Timout Test\n") ctx1, _ := context.WithTimeout(context.Background(), time.Second) @@ -50,7 +59,7 @@ func TestGetFailures(t *testing.T) { t.Log("Timeout test passed.") // Reply with failures to every message - nets[1].SetHandler(inet.ProtocolDHT, func(s inet.Stream) { + hosts[1].SetStreamHandler(ProtocolDHT, func(s inet.Stream) { defer s.Close() pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) @@ -97,7 +106,7 @@ func TestGetFailures(t *testing.T) { } // u.POut("handleGetValue Test\n") - s, err := nets[1].NewStream(inet.ProtocolDHT, peers[0]) + s, err := hosts[1].NewStream(ProtocolDHT, hosts[0].ID()) if err != nil { t.Fatal(err) } @@ -133,19 +142,19 @@ func TestNotFound(t *testing.T) { if err != nil { t.Fatal(err) } - nets := mn.Nets() + hosts := mn.Hosts() peers := mn.Peers() tsds := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, peers[0], nets[0], tsds) + d := NewDHT(ctx, hosts[0], tsds) for _, p := range peers { d.Update(ctx, p) } // Reply with random peers to every message - for _, neti := range nets { - neti := neti // shadow loop var - neti.SetHandler(inet.ProtocolDHT, func(s inet.Stream) { + for _, host := range hosts { + host := host // shadow loop var + host.SetStreamHandler(ProtocolDHT, func(s inet.Stream) { defer s.Close() pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) @@ -163,11 +172,11 @@ func TestNotFound(t *testing.T) { ps := []peer.PeerInfo{} for i := 0; i < 7; i++ { p := peers[rand.Intn(len(peers))] - pi := neti.Peerstore().PeerInfo(p) + pi := host.Peerstore().PeerInfo(p) ps = append(ps, pi) } - resp.CloserPeers = pb.PeerInfosToPBPeers(d.network, ps) + resp.CloserPeers = pb.PeerInfosToPBPeers(d.host.Network(), ps) if err := pbw.WriteMsg(resp); err != nil { panic(err) } @@ -205,20 +214,20 @@ func TestLessThanKResponses(t *testing.T) { if err != nil { t.Fatal(err) } - nets := mn.Nets() + hosts := mn.Hosts() peers := mn.Peers() tsds := dssync.MutexWrap(ds.NewMapDatastore()) - d := NewDHT(ctx, peers[0], nets[0], tsds) + d := NewDHT(ctx, hosts[0], tsds) for i := 1; i < 5; i++ { d.Update(ctx, peers[i]) } // Reply with random peers to every message - for _, neti := range nets { - neti := neti // shadow loop var - neti.SetHandler(inet.ProtocolDHT, func(s inet.Stream) { + for _, host := range hosts { + host := host // shadow loop var + host.SetStreamHandler(ProtocolDHT, func(s inet.Stream) { defer s.Close() pbr := ggio.NewDelimitedReader(s, inet.MessageSizeMax) @@ -231,10 +240,10 @@ func TestLessThanKResponses(t *testing.T) { switch pmes.GetType() { case pb.Message_GET_VALUE: - pi := neti.Peerstore().PeerInfo(peers[1]) + pi := host.Peerstore().PeerInfo(peers[1]) resp := &pb.Message{ Type: pmes.Type, - CloserPeers: pb.PeerInfosToPBPeers(d.network, []peer.PeerInfo{pi}), + CloserPeers: pb.PeerInfosToPBPeers(d.host.Network(), []peer.PeerInfo{pi}), } if err := pbw.WriteMsg(resp); err != nil { diff --git a/routing/dht/handlers.go b/routing/dht/handlers.go index a02eb024d..3670c570d 100644 --- a/routing/dht/handlers.go +++ b/routing/dht/handlers.go @@ -89,7 +89,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess provinfos := peer.PeerInfos(dht.peerstore, provs) if len(provs) > 0 { log.Debugf("handleGetValue returning %d provider[s]", len(provs)) - resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.network, provinfos) + resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), provinfos) } // Find closest peer on given cluster to desired key and reply with that info @@ -106,7 +106,7 @@ func (dht *IpfsDHT) handleGetValue(ctx context.Context, p peer.ID, pmes *pb.Mess } } - resp.CloserPeers = pb.PeerInfosToPBPeers(dht.network, closerinfos) + resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), closerinfos) } return resp, nil @@ -161,7 +161,7 @@ func (dht *IpfsDHT) handleFindPeer(ctx context.Context, p peer.ID, pmes *pb.Mess } } - resp.CloserPeers = pb.PeerInfosToPBPeers(dht.network, withAddresses) + resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), withAddresses) return resp, nil } @@ -185,14 +185,14 @@ func (dht *IpfsDHT) handleGetProviders(ctx context.Context, p peer.ID, pmes *pb. if providers != nil && len(providers) > 0 { infos := peer.PeerInfos(dht.peerstore, providers) - resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.network, infos) + resp.ProviderPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) } // Also send closer peers. closer := dht.betterPeersToQuery(pmes, p, CloserPeerCount) if closer != nil { infos := peer.PeerInfos(dht.peerstore, providers) - resp.CloserPeers = pb.PeerInfosToPBPeers(dht.network, infos) + resp.CloserPeers = pb.PeerInfosToPBPeers(dht.host.Network(), infos) } return resp, nil diff --git a/routing/dht/query.go b/routing/dht/query.go index 5b62a8f4c..0056bee1d 100644 --- a/routing/dht/query.go +++ b/routing/dht/query.go @@ -3,7 +3,6 @@ package dht import ( "sync" - inet "github.com/jbenet/go-ipfs/p2p/net" peer "github.com/jbenet/go-ipfs/p2p/peer" queue "github.com/jbenet/go-ipfs/p2p/peer/queue" "github.com/jbenet/go-ipfs/routing" @@ -18,17 +17,10 @@ import ( var maxQueryConcurrency = AlphaValue type dhtQuery struct { - // the key we're querying for - key u.Key - - // dialer used to ensure we're connected to peers - dialer inet.Dialer - - // the function to execute per peer - qfunc queryFunc - - // the concurrency parameter - concurrency int + dht *IpfsDHT + key u.Key // the key we're querying for + qfunc queryFunc // the function to execute per peer + concurrency int // the concurrency parameter } type dhtQueryResult struct { @@ -40,10 +32,10 @@ type dhtQueryResult struct { } // constructs query -func newQuery(k u.Key, d inet.Dialer, f queryFunc) *dhtQuery { +func (dht *IpfsDHT) newQuery(k u.Key, f queryFunc) *dhtQuery { return &dhtQuery{ key: k, - dialer: d, + dht: dht, qfunc: f, concurrency: maxQueryConcurrency, } @@ -155,7 +147,7 @@ func (r *dhtQueryRunner) Run(peers []peer.ID) (*dhtQueryResult, error) { func (r *dhtQueryRunner) addPeerToQuery(ctx context.Context, next peer.ID) { // if new peer is ourselves... - if next == r.query.dialer.LocalPeer() { + if next == r.query.dht.self { return } @@ -222,10 +214,11 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { }() // make sure we're connected to the peer. - if conns := r.query.dialer.ConnsToPeer(p); len(conns) == 0 { + if conns := r.query.dht.host.Network().ConnsToPeer(p); len(conns) == 0 { log.Infof("worker for: %v -- not connected. dial start", p) - if err := r.query.dialer.DialPeer(cg.Context(), p); err != nil { + pi := peer.PeerInfo{ID: p} + if err := r.query.dht.host.Connect(cg.Context(), pi); err != nil { log.Debugf("ERROR worker for: %v -- err connecting: %v", p, err) r.Lock() r.errs = append(r.errs, err) @@ -257,12 +250,7 @@ func (r *dhtQueryRunner) queryPeer(cg ctxgroup.ContextGroup, p peer.ID) { log.Debugf("PEERS CLOSER -- worker for: %v (%d closer peers)", p, len(res.closerPeers)) for _, next := range res.closerPeers { // add their addresses to the dialer's peerstore - conns := r.query.dialer.ConnsToPeer(next.ID) - if len(conns) == 0 { - log.Infof("PEERS CLOSER -- worker for %v FOUND NEW PEER: %s %s", p, next.ID, next.Addrs) - } - - r.query.dialer.Peerstore().AddAddresses(next.ID, next.Addrs) + r.query.dht.peerstore.AddPeerInfo(next) r.addPeerToQuery(cg.Context(), next.ID) log.Debugf("PEERS CLOSER -- worker for: %v added %v (%v)", p, next.ID, next.Addrs) } diff --git a/routing/dht/routing.go b/routing/dht/routing.go index 4c3cf160b..2f00929b6 100644 --- a/routing/dht/routing.go +++ b/routing/dht/routing.go @@ -82,7 +82,7 @@ func (dht *IpfsDHT) GetValue(ctx context.Context, key u.Key) ([]byte, error) { } // setup the Query - query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { val, peers, err := dht.getValueOrPeers(ctx, p, key) if err != nil { @@ -170,7 +170,7 @@ func (dht *IpfsDHT) getClosestPeers(ctx context.Context, key u.Key) (<-chan peer peerset.Add(p) } - query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { closer, err := dht.closerPeersSingle(ctx, key, p) if err != nil { log.Errorf("error getting closer peers: %s", err) @@ -253,7 +253,7 @@ func (dht *IpfsDHT) findProvidersAsyncRoutine(ctx context.Context, key u.Key, co } // setup the Query - query := newQuery(key, dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(key, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { pmes, err := dht.findProvidersSingle(ctx, p, key) if err != nil { @@ -312,7 +312,7 @@ func (dht *IpfsDHT) FindPeer(ctx context.Context, id peer.ID) (peer.PeerInfo, er } // setup the Query - query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(u.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { @@ -361,7 +361,7 @@ func (dht *IpfsDHT) FindPeersConnectedToPeer(ctx context.Context, id peer.ID) (< } // setup the Query - query := newQuery(u.Key(id), dht.network, func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { + query := dht.newQuery(u.Key(id), func(ctx context.Context, p peer.ID) (*dhtQueryResult, error) { pmes, err := dht.findPeerSingle(ctx, p, id) if err != nil { diff --git a/routing/mock/dht.go b/routing/mock/dht.go index 1f0340ebb..2235970f5 100644 --- a/routing/mock/dht.go +++ b/routing/mock/dht.go @@ -27,12 +27,12 @@ func (rs *mocknetserver) ClientWithDatastore(ctx context.Context, p testutil.Ide // FIXME AddPeer doesn't appear to be idempotent - net, err := rs.mn.AddPeer(p.PrivateKey(), p.Address()) + host, err := rs.mn.AddPeer(p.PrivateKey(), p.Address()) if err != nil { panic("FIXME") // return nil, debugerror.Wrap(err) } - return dht.NewDHT(ctx, p.ID(), net, sync.MutexWrap(ds)) + return dht.NewDHT(ctx, host, sync.MutexWrap(ds)) } var _ Server = &mocknetserver{} From feb5e495f56970351f63a60f9ea14bbf0126568c Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 1 Jan 2015 21:53:06 -0800 Subject: [PATCH 20/21] use ZeroLocalTCPAddress for network tests This commit makes all network tests use ZeroLocalTCPAddress as the initial peer address, and then relies on net.ListenAddresses() This should get rid of the tcp addr clash problems. --- p2p/net/conn/dial_test.go | 5 +++-- p2p/net/conn/listen.go | 20 ++++++++++-------- p2p/net/swarm/simul_test.go | 7 ++++--- p2p/net/swarm/swarm_test.go | 41 +++++++++++++++++-------------------- p2p/test/util/util.go | 5 +++-- util/testutil/gen.go | 20 +++++++++++++++++- 6 files changed, 60 insertions(+), 38 deletions(-) diff --git a/p2p/net/conn/dial_test.go b/p2p/net/conn/dial_test.go index bf24ab09a..b757a1b69 100644 --- a/p2p/net/conn/dial_test.go +++ b/p2p/net/conn/dial_test.go @@ -51,7 +51,6 @@ func setupConn(t *testing.T, ctx context.Context, secure bool) (a, b Conn, p1, p p1 = tu.RandPeerNetParamsOrFatal(t) p2 = tu.RandPeerNetParamsOrFatal(t) - laddr := p1.Addr key1 := p1.PrivKey key2 := p2.PrivKey @@ -59,10 +58,11 @@ func setupConn(t *testing.T, ctx context.Context, secure bool) (a, b Conn, p1, p key1 = nil key2 = nil } - l1, err := Listen(ctx, laddr, p1.ID, key1) + l1, err := Listen(ctx, p1.Addr, p1.ID, key1) if err != nil { t.Fatal(err) } + p1.Addr = l1.Multiaddr() // Addr has been determined by kernel. d2 := &Dialer{ LocalPeer: p2.ID, @@ -110,6 +110,7 @@ func testDialer(t *testing.T, secure bool) { if err != nil { t.Fatal(err) } + p1.Addr = l1.Multiaddr() // Addr has been determined by kernel. d2 := &Dialer{ LocalPeer: p2.ID, diff --git a/p2p/net/conn/listen.go b/p2p/net/conn/listen.go index dd6af24ba..0cc1a75c8 100644 --- a/p2p/net/conn/listen.go +++ b/p2p/net/conn/listen.go @@ -17,25 +17,24 @@ import ( type listener struct { manet.Listener - maddr ma.Multiaddr // Local multiaddr to listen on - local peer.ID // LocalPeer is the identity of the local Peer - privk ic.PrivKey // private key to use to initialize secure conns + local peer.ID // LocalPeer is the identity of the local Peer + privk ic.PrivKey // private key to use to initialize secure conns cg ctxgroup.ContextGroup } func (l *listener) teardown() error { - defer log.Debugf("listener closed: %s %s", l.local, l.maddr) + defer log.Debugf("listener closed: %s %s", l.local, l.Multiaddr()) return l.Listener.Close() } func (l *listener) Close() error { - log.Debugf("listener closing: %s %s", l.local, l.maddr) + log.Debugf("listener closing: %s %s", l.local, l.Multiaddr()) return l.cg.Close() } func (l *listener) String() string { - return fmt.Sprintf("", l.local, l.maddr) + return fmt.Sprintf("", l.local, l.Multiaddr()) } // Accept waits for and returns the next connection to the listener. @@ -73,8 +72,14 @@ func (l *listener) Addr() net.Addr { } // Multiaddr is the identity of the local Peer. +// If there is an error converting from net.Addr to ma.Multiaddr, +// the return value will be nil. func (l *listener) Multiaddr() ma.Multiaddr { - return l.maddr + maddr, err := manet.FromNetAddr(l.Addr()) + if err != nil { + return nil // error + } + return maddr } // LocalPeer is the identity of the local Peer. @@ -102,7 +107,6 @@ func Listen(ctx context.Context, addr ma.Multiaddr, local peer.ID, sk ic.PrivKey l := &listener{ Listener: ml, - maddr: addr, local: local, privk: sk, cg: ctxgroup.WithContext(ctx), diff --git a/p2p/net/swarm/simul_test.go b/p2p/net/swarm/simul_test.go index b61f3f03c..c87df91c3 100644 --- a/p2p/net/swarm/simul_test.go +++ b/p2p/net/swarm/simul_test.go @@ -15,13 +15,14 @@ func TestSimultOpen(t *testing.T) { // t.Skip("skipping for another test") ctx := context.Background() - swarms, peers := makeSwarms(ctx, t, 2) + swarms := makeSwarms(ctx, t, 2) // connect everyone { var wg sync.WaitGroup connect := func(s *Swarm, dst peer.ID, addr ma.Multiaddr) { // copy for other peer + log.Debugf("TestSimultOpen: connecting: %s --> %s (%s)", s.local, dst, addr) s.peers.AddAddress(dst, addr) if _, err := s.Dial(ctx, dst); err != nil { t.Fatal("error swarm dialing to peer", err) @@ -31,8 +32,8 @@ func TestSimultOpen(t *testing.T) { log.Info("Connecting swarms simultaneously.") wg.Add(2) - go connect(swarms[0], swarms[1].local, peers[1].Addr) - go connect(swarms[1], swarms[0].local, peers[0].Addr) + go connect(swarms[0], swarms[1].local, swarms[1].ListenAddresses()[0]) + go connect(swarms[1], swarms[0].local, swarms[0].ListenAddresses()[0]) wg.Wait() } diff --git a/p2p/net/swarm/swarm_test.go b/p2p/net/swarm/swarm_test.go index ee3f8af69..4588ec55f 100644 --- a/p2p/net/swarm/swarm_test.go +++ b/p2p/net/swarm/swarm_test.go @@ -47,20 +47,17 @@ func EchoStreamHandler(stream inet.Stream) { }() } -func makeSwarms(ctx context.Context, t *testing.T, num int) ([]*Swarm, []testutil.PeerNetParams) { +func makeSwarms(ctx context.Context, t *testing.T, num int) []*Swarm { swarms := make([]*Swarm, 0, num) - peersnp := make([]testutil.PeerNetParams, 0, num) for i := 0; i < num; i++ { localnp := testutil.RandPeerNetParamsOrFatal(t) - peersnp = append(peersnp, localnp) peerstore := peer.NewPeerstore() - peerstore.AddAddress(localnp.ID, localnp.Addr) peerstore.AddPubKey(localnp.ID, localnp.PubKey) peerstore.AddPrivKey(localnp.ID, localnp.PrivKey) - addrs := peerstore.Addresses(localnp.ID) + addrs := []ma.Multiaddr{localnp.Addr} swarm, err := NewSwarm(ctx, addrs, localnp.ID, peerstore) if err != nil { t.Fatal(err) @@ -70,10 +67,10 @@ func makeSwarms(ctx context.Context, t *testing.T, num int) ([]*Swarm, []testuti swarms = append(swarms, swarm) } - return swarms, peersnp + return swarms } -func connectSwarms(t *testing.T, ctx context.Context, swarms []*Swarm, peersnp []testutil.PeerNetParams) { +func connectSwarms(t *testing.T, ctx context.Context, swarms []*Swarm) { var wg sync.WaitGroup connect := func(s *Swarm, dst peer.ID, addr ma.Multiaddr) { @@ -86,11 +83,11 @@ func connectSwarms(t *testing.T, ctx context.Context, swarms []*Swarm, peersnp [ } log.Info("Connecting swarms simultaneously.") - for _, s := range swarms { - for _, p := range peersnp { - if p.ID != s.local { // don't connect to self. + for _, s1 := range swarms { + for _, s2 := range swarms { + if s2.local != s1.local { // don't connect to self. wg.Add(1) - connect(s, p.ID, p.Addr) + connect(s1, s2.LocalPeer(), s2.ListenAddresses()[0]) // try the first. } } } @@ -105,10 +102,10 @@ func SubtestSwarm(t *testing.T, SwarmNum int, MsgNum int) { // t.Skip("skipping for another test") ctx := context.Background() - swarms, peersnp := makeSwarms(ctx, t, SwarmNum) + swarms := makeSwarms(ctx, t, SwarmNum) // connect everyone - connectSwarms(t, ctx, swarms, peersnp) + connectSwarms(t, ctx, swarms) // ping/pong for _, s1 := range swarms { @@ -118,7 +115,7 @@ func SubtestSwarm(t *testing.T, SwarmNum int, MsgNum int) { _, cancel := context.WithCancel(ctx) got := map[peer.ID]int{} - errChan := make(chan error, MsgNum*len(peersnp)) + errChan := make(chan error, MsgNum*len(swarms)) streamChan := make(chan *Stream, MsgNum) // send out "ping" x MsgNum to every peer @@ -150,13 +147,13 @@ func SubtestSwarm(t *testing.T, SwarmNum int, MsgNum int) { streamChan <- stream } - for _, p := range peersnp { - if p.ID == s1.local { + for _, s2 := range swarms { + if s2.local == s1.local { continue // dont send to self... } wg.Add(1) - go send(p.ID) + go send(s2.local) } wg.Wait() }() @@ -165,7 +162,7 @@ func SubtestSwarm(t *testing.T, SwarmNum int, MsgNum int) { go func() { defer close(errChan) count := 0 - countShouldBe := MsgNum * (len(peersnp) - 1) + countShouldBe := MsgNum * (len(swarms) - 1) for stream := range streamChan { // one per peer defer stream.Close() @@ -209,8 +206,8 @@ func SubtestSwarm(t *testing.T, SwarmNum int, MsgNum int) { } log.Debugf("%s got pongs", s1.local) - if (len(peersnp) - 1) != len(got) { - t.Errorf("got (%d) less messages than sent (%d).", len(got), len(peersnp)) + if (len(swarms) - 1) != len(got) { + t.Errorf("got (%d) less messages than sent (%d).", len(got), len(swarms)) } for p, n := range got { @@ -241,14 +238,14 @@ func TestConnHandler(t *testing.T) { // t.Skip("skipping for another test") ctx := context.Background() - swarms, peersnp := makeSwarms(ctx, t, 5) + swarms := makeSwarms(ctx, t, 5) gotconn := make(chan struct{}, 10) swarms[0].SetConnHandler(func(conn *Conn) { gotconn <- struct{}{} }) - connectSwarms(t, ctx, swarms, peersnp) + connectSwarms(t, ctx, swarms) <-time.After(time.Millisecond) // should've gotten 5 by now. diff --git a/p2p/test/util/util.go b/p2p/test/util/util.go index 741cb597d..30c9d1f99 100644 --- a/p2p/test/util/util.go +++ b/p2p/test/util/util.go @@ -10,18 +10,19 @@ import ( tu "github.com/jbenet/go-ipfs/util/testutil" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ) func GenSwarmNetwork(t *testing.T, ctx context.Context) *swarm.Network { p := tu.RandPeerNetParamsOrFatal(t) ps := peer.NewPeerstore() - ps.AddAddress(p.ID, p.Addr) ps.AddPubKey(p.ID, p.PubKey) ps.AddPrivKey(p.ID, p.PrivKey) - n, err := swarm.NewNetwork(ctx, ps.Addresses(p.ID), p.ID, ps) + n, err := swarm.NewNetwork(ctx, []ma.Multiaddr{p.Addr}, p.ID, ps) if err != nil { t.Fatal(err) } + ps.AddAddresses(p.ID, n.ListenAddresses()) return n } diff --git a/util/testutil/gen.go b/util/testutil/gen.go index ddd76523e..93bca120d 100644 --- a/util/testutil/gen.go +++ b/util/testutil/gen.go @@ -16,6 +16,19 @@ import ( ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" ) +// ZeroLocalTCPAddress is the "zero" tcp local multiaddr. This means: +// /ip4/127.0.0.1/tcp/0 +var ZeroLocalTCPAddress ma.Multiaddr + +func init() { + // initialize ZeroLocalTCPAddress + maddr, err := ma.NewMultiaddr("/ip4/127.0.0.1/tcp/0") + if err != nil { + panic(err) + } + ZeroLocalTCPAddress = maddr +} + func RandKeyPair(bits int) (ci.PrivKey, ci.PubKey, error) { return ci.GenerateKeyPairWithReader(ci.RSA, bits, u.NewTimeSeededRand()) } @@ -48,6 +61,11 @@ func RandPeerIDFatal(t testing.TB) peer.ID { // RandLocalTCPAddress returns a random multiaddr. it suppresses errors // for nice composability-- do check the address isn't nil. +// +// Note: for real network tests, use ZeroLocalTCPAddress so the kernel +// assigns an unused TCP port. otherwise you may get clashes. This +// function remains here so that p2p/net/mock (which does not touch the +// real network) can assign different addresses to peers. func RandLocalTCPAddress() ma.Multiaddr { // chances are it will work out, but it **might** fail if the port is in use @@ -123,7 +141,7 @@ func RandPeerNetParamsOrFatal(t *testing.T) PeerNetParams { func RandPeerNetParams() (*PeerNetParams, error) { var p PeerNetParams var err error - p.Addr = RandLocalTCPAddress() + p.Addr = ZeroLocalTCPAddress p.PrivKey, p.PubKey, err = RandKeyPair(512) if err != nil { return nil, err From 85e30247319d51a99b95c867a8011e28a628bd56 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 2 Jan 2015 04:48:57 -0800 Subject: [PATCH 21/21] vendor identify pb not sure how it wasnt an error --- p2p/protocol/identify/pb/identify.pb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/p2p/protocol/identify/pb/identify.pb.go b/p2p/protocol/identify/pb/identify.pb.go index 1f0458648..e656514c4 100644 --- a/p2p/protocol/identify/pb/identify.pb.go +++ b/p2p/protocol/identify/pb/identify.pb.go @@ -13,7 +13,7 @@ It has these top-level messages: */ package identify_pb -import proto "code.google.com/p/gogoprotobuf/proto" +import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" import json "encoding/json" import math "math"

    -cf$dzI&b>~KDeut#0{+(y&*zm}R&O8^5bBcmBe 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�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