github.com/decred/dcrlnd@v0.7.6/lnwire/ping.go (about) 1 package lnwire 2 3 import ( 4 "bytes" 5 "io" 6 ) 7 8 // PingPayload is a set of opaque bytes used to pad out a ping message. 9 type PingPayload []byte 10 11 // Ping defines a message which is sent by peers periodically to determine if 12 // the connection is still valid. Each ping message carries the number of bytes 13 // to pad the pong response with, and also a number of bytes to be ignored at 14 // the end of the ping message (which is padding). 15 type Ping struct { 16 // NumPongBytes is the number of bytes the pong response to this 17 // message should carry. 18 NumPongBytes uint16 19 20 // PaddingBytes is a set of opaque bytes used to pad out this ping 21 // message. Using this field in conjunction to the one above, it's 22 // possible for node to generate fake cover traffic. 23 PaddingBytes PingPayload 24 } 25 26 // NewPing returns a new Ping message. 27 func NewPing(numBytes uint16) *Ping { 28 return &Ping{ 29 NumPongBytes: numBytes, 30 } 31 } 32 33 // A compile time check to ensure Ping implements the lnwire.Message interface. 34 var _ Message = (*Ping)(nil) 35 36 // Decode deserializes a serialized Ping message stored in the passed io.Reader 37 // observing the specified protocol version. 38 // 39 // This is part of the lnwire.Message interface. 40 func (p *Ping) Decode(r io.Reader, pver uint32) error { 41 err := ReadElements(r, &p.NumPongBytes, &p.PaddingBytes) 42 if err != nil { 43 return err 44 } 45 46 if p.NumPongBytes > MaxPongBytes { 47 return ErrMaxPongBytesExceeded 48 } 49 50 return nil 51 } 52 53 // Encode serializes the target Ping into the passed io.Writer observing the 54 // protocol version specified. 55 // 56 // This is part of the lnwire.Message interface. 57 func (p *Ping) Encode(w *bytes.Buffer, pver uint32) error { 58 if err := WriteUint16(w, p.NumPongBytes); err != nil { 59 return err 60 } 61 62 return WritePingPayload(w, p.PaddingBytes) 63 } 64 65 // MsgType returns the integer uniquely identifying this message type on the 66 // wire. 67 // 68 // This is part of the lnwire.Message interface. 69 func (p *Ping) MsgType() MessageType { 70 return MsgPing 71 }