aboutsummaryrefslogtreecommitdiffstats
path: root/p2p/peer.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2015-06-28 19:52:37 +0800
committerFelix Lange <fjl@twurst.com>2015-06-28 19:52:37 +0800
commita0191910fcc7f4122c90db49f8381e4d3bd58823 (patch)
treea58ecfde989414dc0682abb39002d6fe074c5125 /p2p/peer.go
parentb9ebdffd83267ad387facfd2c87133aa8bd3aa62 (diff)
parent216fc267fafa6e27b14f642d0440cbd817a3a2d3 (diff)
downloaddexon-a0191910fcc7f4122c90db49f8381e4d3bd58823.tar
dexon-a0191910fcc7f4122c90db49f8381e4d3bd58823.tar.gz
dexon-a0191910fcc7f4122c90db49f8381e4d3bd58823.tar.bz2
dexon-a0191910fcc7f4122c90db49f8381e4d3bd58823.tar.lz
dexon-a0191910fcc7f4122c90db49f8381e4d3bd58823.tar.xz
dexon-a0191910fcc7f4122c90db49f8381e4d3bd58823.tar.zst
dexon-a0191910fcc7f4122c90db49f8381e4d3bd58823.zip
Merge pull request #1341 from karalabe/proto-version-negotiation
p2p: support protocol version negotiation
Diffstat (limited to 'p2p/peer.go')
-rw-r--r--p2p/peer.go11
1 files changed, 9 insertions, 2 deletions
diff --git a/p2p/peer.go b/p2p/peer.go
index 40466cf84..e1bda1d03 100644
--- a/p2p/peer.go
+++ b/p2p/peer.go
@@ -249,15 +249,22 @@ func countMatchingProtocols(protocols []Protocol, caps []Cap) int {
// matchProtocols creates structures for matching named subprotocols.
func matchProtocols(protocols []Protocol, caps []Cap, rw MsgReadWriter) map[string]*protoRW {
- sort.Sort(capsByName(caps))
+ sort.Sort(capsByNameAndVersion(caps))
offset := baseProtocolLength
result := make(map[string]*protoRW)
+
outer:
for _, cap := range caps {
for _, proto := range protocols {
- if proto.Name == cap.Name && proto.Version == cap.Version && result[cap.Name] == nil {
+ if proto.Name == cap.Name && proto.Version == cap.Version {
+ // If an old protocol version matched, revert it
+ if old := result[cap.Name]; old != nil {
+ offset -= old.Length
+ }
+ // Assign the new match
result[cap.Name] = &protoRW{Protocol: proto, offset: offset, in: make(chan Msg), w: rw}
offset += proto.Length
+
continue outer
}
}