forked from aergoio/aergo
/
ping.go
95 lines (75 loc) · 3.49 KB
/
ping.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/**
* @file
* @copyright defined in aergo/LICENSE.txt
*/
package subproto
import (
"fmt"
"github.com/aergoio/aergo-lib/log"
"github.com/aergoio/aergo/internal/enc"
"github.com/aergoio/aergo/p2p/p2putil"
"github.com/aergoio/aergo/p2p/p2pcommon"
"github.com/aergoio/aergo/types"
"github.com/golang/protobuf/proto"
)
type pingRequestHandler struct {
BaseMsgHandler
}
var _ p2pcommon.MessageHandler = (*pingRequestHandler)(nil)
type pingResponseHandler struct {
BaseMsgHandler
}
var _ p2pcommon.MessageHandler = (*pingResponseHandler)(nil)
type goAwayHandler struct {
BaseMsgHandler
}
var _ p2pcommon.MessageHandler = (*goAwayHandler)(nil)
// newPingReqHandler creates handler for PingRequest
func NewPingReqHandler(pm p2pcommon.PeerManager, peer p2pcommon.RemotePeer, logger *log.Logger, actor p2pcommon.ActorService) *pingRequestHandler {
ph := &pingRequestHandler{BaseMsgHandler: BaseMsgHandler{protocol: PingRequest, pm: pm, peer: peer, actor: actor, logger: logger}}
return ph
}
func (ph *pingRequestHandler) ParsePayload(rawbytes []byte) (proto.Message, error) {
return p2putil.UnmarshalAndReturn(rawbytes, &types.Ping{})
}
func (ph *pingRequestHandler) Handle(msg p2pcommon.Message, msgBody proto.Message) {
remotePeer := ph.peer
pingData := msgBody.(*types.Ping)
p2putil.DebugLogReceiveMsg(ph.logger, ph.protocol, msg.ID().String(), remotePeer, fmt.Sprintf("blockHash=%s blockNo=%d", enc.ToString(pingData.BestBlockHash), pingData.BestHeight))
if _, err := types.ParseToBlockID(pingData.GetBestBlockHash()); err != nil {
ph.logger.Info().Str(p2putil.LogPeerName, remotePeer.Name()).Msg("ping is old format or wrong")
return
}
remotePeer.UpdateLastNotice(pingData.BestBlockHash, pingData.BestHeight)
// generate response message
ph.logger.Debug().Str(p2putil.LogPeerName, remotePeer.Name()).Str(p2putil.LogMsgID, msg.ID().String()).Msg("Sending ping response")
resp := &types.Pong{}
remotePeer.SendMessage(remotePeer.MF().NewMsgResponseOrder(msg.ID(), PingResponse, resp))
}
// newPingRespHandler creates handler for PingResponse
func NewPingRespHandler(pm p2pcommon.PeerManager, peer p2pcommon.RemotePeer, logger *log.Logger, actor p2pcommon.ActorService) *pingResponseHandler {
ph := &pingResponseHandler{BaseMsgHandler: BaseMsgHandler{protocol: PingResponse, pm: pm, peer: peer, actor: actor, logger: logger}}
return ph
}
func (ph *pingResponseHandler) ParsePayload(rawbytes []byte) (proto.Message, error) {
return p2putil.UnmarshalAndReturn(rawbytes, &types.Pong{})
}
func (ph *pingResponseHandler) Handle(msg p2pcommon.Message, msgBody proto.Message) {
remotePeer := ph.peer
//data := msgBody.(*types.Pong)
p2putil.DebugLogReceiveMsg(ph.logger, ph.protocol, msg.ID().String(), remotePeer, nil)
remotePeer.ConsumeRequest(msg.ID())
}
// newGoAwayHandler creates handler for PingResponse
func NewGoAwayHandler(pm p2pcommon.PeerManager, peer p2pcommon.RemotePeer, logger *log.Logger, actor p2pcommon.ActorService) *goAwayHandler {
ph := &goAwayHandler{BaseMsgHandler: BaseMsgHandler{protocol: GoAway, pm: pm, peer: peer, actor: actor, logger: logger}}
return ph
}
func (ph *goAwayHandler) ParsePayload(rawbytes []byte) (proto.Message, error) {
return p2putil.UnmarshalAndReturn(rawbytes, &types.GoAwayNotice{})
}
func (ph *goAwayHandler) Handle(msg p2pcommon.Message, msgBody proto.Message) {
data := msgBody.(*types.GoAwayNotice)
p2putil.DebugLogReceiveMsg(ph.logger, ph.protocol, msg.ID().String(), ph.peer, data.Message)
// TODO: check to remove peer here or not. (the sending peer will disconnect.)
}