mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-10-14 00:59:33 +00:00

* [NOD-1168] Add context interfaces to flows * [NOD-1168] Move IBD state to protocol manager * [NOD-1168] Move ready peers to protocol manager * [NOD-1168] Add comments * [NOD-1168] Separate context interfaces for send and receive pings * [NOD-1168] Add protocol shared state to FlowContext * [NOD-1168] Fix comment * [NOD-1168] Rename Context->HandleHandshakeContext * [NOD-1168] Initialize readyPeers and transactionsToRebroadcast * [NOD-1168] Rename readyPeers -> peers
73 lines
2.0 KiB
Go
73 lines
2.0 KiB
Go
package ping
|
|
|
|
import (
|
|
"github.com/kaspanet/kaspad/protocol/common"
|
|
"time"
|
|
|
|
"github.com/kaspanet/kaspad/netadapter/router"
|
|
peerpkg "github.com/kaspanet/kaspad/protocol/peer"
|
|
"github.com/kaspanet/kaspad/protocol/protocolerrors"
|
|
"github.com/kaspanet/kaspad/util/random"
|
|
"github.com/kaspanet/kaspad/wire"
|
|
)
|
|
|
|
// ReceivePingsContext is the interface for the context needed for the ReceivePings flow.
|
|
type ReceivePingsContext interface {
|
|
}
|
|
|
|
// ReceivePings handles all ping messages coming through incomingRoute.
|
|
// This function assumes that incomingRoute will only return MsgPing.
|
|
func ReceivePings(_ ReceivePingsContext, incomingRoute *router.Route, outgoingRoute *router.Route) error {
|
|
for {
|
|
message, err := incomingRoute.Dequeue()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pingMessage := message.(*wire.MsgPing)
|
|
|
|
pongMessage := wire.NewMsgPong(pingMessage.Nonce)
|
|
err = outgoingRoute.Enqueue(pongMessage)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
// SendPingsContext is the interface for the context needed for the SendPings flow.
|
|
type SendPingsContext interface {
|
|
}
|
|
|
|
// SendPings starts sending MsgPings every pingInterval seconds to the
|
|
// given peer.
|
|
// This function assumes that incomingRoute will only return MsgPong.
|
|
func SendPings(_ SendPingsContext, incomingRoute *router.Route, outgoingRoute *router.Route, peer *peerpkg.Peer) error {
|
|
const pingInterval = 2 * time.Minute
|
|
ticker := time.NewTicker(pingInterval)
|
|
defer ticker.Stop()
|
|
|
|
for range ticker.C {
|
|
nonce, err := random.Uint64()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
peer.SetPingPending(nonce)
|
|
|
|
pingMessage := wire.NewMsgPing(nonce)
|
|
err = outgoingRoute.Enqueue(pingMessage)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
message, err := incomingRoute.DequeueWithTimeout(common.DefaultTimeout)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pongMessage := message.(*wire.MsgPong)
|
|
if pongMessage.Nonce != pingMessage.Nonce {
|
|
return protocolerrors.New(true, "nonce mismatch between ping and pong")
|
|
}
|
|
peer.SetPingIdle()
|
|
}
|
|
return nil
|
|
}
|