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  }