VersionHandle handles version handshake protocol from peer
(data *msgTypes.MsgPayload, p2p p2p.P2P, pid *evtActor.PID, args ...interface{})
| 238 | |
| 239 | // VersionHandle handles version handshake protocol from peer |
| 240 | func VersionHandle(data *msgTypes.MsgPayload, p2p p2p.P2P, pid *evtActor.PID, args ...interface{}) { |
| 241 | log.Trace("[p2p]receive version message", data.Addr, data.Id) |
| 242 | |
| 243 | version := data.Payload.(*msgTypes.Version) |
| 244 | |
| 245 | remotePeer := p2p.GetPeerFromAddr(data.Addr) |
| 246 | if remotePeer == nil { |
| 247 | log.Debug("[p2p]peer is not exist", data.Addr) |
| 248 | //peer not exist,just remove list and return |
| 249 | p2p.RemoveFromConnectingList(data.Addr) |
| 250 | return |
| 251 | } |
| 252 | addrIp, err := msgCommon.ParseIPAddr(data.Addr) |
| 253 | if err != nil { |
| 254 | log.Warn(err) |
| 255 | return |
| 256 | } |
| 257 | nodeAddr := addrIp + ":" + |
| 258 | strconv.Itoa(int(version.P.SyncPort)) |
| 259 | if config.DefConfig.P2PNode.ReservedPeersOnly && len(config.DefConfig.P2PNode.ReservedCfg.ReservedPeers) > 0 { |
| 260 | found := false |
| 261 | for _, addr := range config.DefConfig.P2PNode.ReservedCfg.ReservedPeers { |
| 262 | if strings.HasPrefix(data.Addr, addr) { |
| 263 | log.Debug("[p2p]peer in reserved list", data.Addr) |
| 264 | found = true |
| 265 | break |
| 266 | } |
| 267 | } |
| 268 | if !found { |
| 269 | remotePeer.Close() |
| 270 | log.Debug("[p2p]peer not in reserved list,close", data.Addr) |
| 271 | return |
| 272 | } |
| 273 | |
| 274 | } |
| 275 | |
| 276 | if version.P.Nonce == p2p.GetID() { |
| 277 | p2p.RemoveFromInConnRecord(remotePeer.GetAddr()) |
| 278 | p2p.RemoveFromOutConnRecord(remotePeer.GetAddr()) |
| 279 | log.Warn("[p2p]the node handshake with itself", remotePeer.GetAddr()) |
| 280 | p2p.SetOwnAddress(nodeAddr) |
| 281 | remotePeer.Close() |
| 282 | return |
| 283 | } |
| 284 | |
| 285 | s := remotePeer.GetState() |
| 286 | if s != msgCommon.INIT && s != msgCommon.HAND { |
| 287 | log.Warnf("[p2p]unknown status to received version,%d,%s\n", s, remotePeer.GetAddr()) |
| 288 | remotePeer.Close() |
| 289 | return |
| 290 | } |
| 291 | |
| 292 | // Obsolete node |
| 293 | p := p2p.GetPeer(version.P.Nonce) |
| 294 | if p != nil { |
| 295 | ipOld, err := msgCommon.ParseIPAddr(p.GetAddr()) |
| 296 | if err != nil { |
| 297 | log.Warn("[p2p]exist peer %d ip format is wrong %s", version.P.Nonce, p.GetAddr()) |