提交 0f47b930 作者: Henry

addressed CR by @jbenet

上级 67e04f0d
...@@ -4,7 +4,9 @@ import ( ...@@ -4,7 +4,9 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/coreos/go-semver/semver" updates "github.com/jbenet/go-ipfs/updates"
semver "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/coreos/go-semver/semver"
) )
// currentVersion holds the current protocol version for a client running this code // currentVersion holds the current protocol version for a client running this code
...@@ -18,9 +20,9 @@ func init() { ...@@ -18,9 +20,9 @@ func init() {
} }
} }
// Current returns the current protocol version as a protobuf message // CurrentHandshake returns the current protocol version as a protobuf message
func Current() *semver.Version { func CurrentHandshake() *Handshake1 {
return currentVersion return NewHandshake1(currentVersion.String(), "go-ipfs/"+updates.Version)
} }
// ErrVersionMismatch is returned when two clients don't share a protocol version // ErrVersionMismatch is returned when two clients don't share a protocol version
......
...@@ -161,63 +161,44 @@ func (s *Swarm) connSecure(c *conn.Conn) error { ...@@ -161,63 +161,44 @@ func (s *Swarm) connSecure(c *conn.Conn) error {
// connVersionExchange exchanges local and remote versions and compares them // connVersionExchange exchanges local and remote versions and compares them
// closes remote and returns an error in case of major difference // closes remote and returns an error in case of major difference
func (s *Swarm) connVersionExchange(remote *conn.Conn) error { func (s *Swarm) connVersionExchange(remote *conn.Conn) error {
var remoteVersion, myVersion *handshake.SemVer var remoteHandshake, localHandshake *handshake.Handshake1
myVersion = handshake.Current() localHandshake = handshake.CurrentHandshake()
// BUG(cryptix): do we need to use a NetMessage here? myVerBytes, err := proto.Marshal(localHandshake)
myVersionMsg, err := msg.FromObject(s.local, myVersion)
if err != nil { if err != nil {
return fmt.Errorf("connVersionExchange: could not prepare local version: %q", err) return err
} }
// buffered channel to send our version just once remote.Secure.Out <- myVerBytes
outBuf := make(chan []byte, 1)
outBuf <- myVersionMsg.Data()
var gotTheirs, sendMine bool log.Debug("Send my version(%s) [to = %s]", localHandshake, remote.Peer)
for {
if gotTheirs && sendMine {
break
}
select { select {
case <-s.ctx.Done(): case <-s.ctx.Done():
// close Conn. return s.ctx.Err()
remote.Close()
return nil // BUG(cryptix): should this be an error?
case <-remote.Closed:
return errors.New("remote closed connection during version exchange")
case our, ok := <-outBuf:
if ok {
remote.Secure.Out <- our
sendMine = true
close(outBuf) // only send local version once
log.Debug("Send my version(%s) [to = %s]", myVersion, remote.Peer)
}
case data, ok := <-remote.Secure.In: case <-remote.Closed:
if !ok { return errors.New("remote closed connection during version exchange")
return fmt.Errorf("Error retrieving from conn: %v", remote.Peer)
}
remoteVersion = new(handshake.SemVer) case data, ok := <-remote.Secure.In:
err = proto.Unmarshal(data, remoteVersion) if !ok {
if err != nil { return fmt.Errorf("Error retrieving from conn: %v", remote.Peer)
s.Close() }
return fmt.Errorf("connSetup: could not decode remote version: %q", err)
}
gotTheirs = true
log.Debug("Received remote version(%s) [from = %s]", remoteVersion, remote.Peer)
// BUG(cryptix): could add another case here to trigger resending our version remoteHandshake = new(handshake.Handshake1)
err = proto.Unmarshal(data, remoteHandshake)
if err != nil {
s.Close()
return fmt.Errorf("connSetup: could not decode remote version: %q", err)
} }
log.Debug("Received remote version(%s) [from = %s]", remoteHandshake, remote.Peer)
} }
if !handshake.Compatible(myVersion, remoteVersion) { if err := handshake.Compatible(localHandshake, remoteHandshake); err != nil {
log.Info("%s (%s) incompatible version with %s (%s)", s.local, localHandshake, remote.Peer, remoteHandshake)
remote.Close() remote.Close()
return handshake.ErrVersionMismatch return err
} }
log.Debug("[peer: %s] Version compatible", remote.Peer) log.Debug("[peer: %s] Version compatible", remote.Peer)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论