87 lines
2.9 KiB
Go
87 lines
2.9 KiB
Go
|
package wtwire
|
||
|
|
||
|
import "io"
|
||
|
|
||
|
// StateUpdateCode is an error code returned by a watchtower in response to a
|
||
|
// StateUpdate message.
|
||
|
type StateUpdateCode = ErrorCode
|
||
|
|
||
|
const (
|
||
|
// StateUpdateCodeClientBehind signals that the client's sequence number
|
||
|
// is behind what the watchtower expects based on its LastApplied. This
|
||
|
// error should cause the client to record the LastApplied field in the
|
||
|
// response, and initiate another attempt with the proper sequence
|
||
|
// number.
|
||
|
//
|
||
|
// NOTE: Repeated occurrences of this could be interpreted as an attempt
|
||
|
// to siphon state updates from the client. If the client believes it
|
||
|
// is not violating the protocol, this could be grounds to blacklist
|
||
|
// this tower from future session negotiation.
|
||
|
StateUpdateCodeClientBehind StateUpdateCode = 70
|
||
|
|
||
|
// StateUpdateCodeMaxUpdatesExceeded signals that the client tried to
|
||
|
// send a sequence number beyond the negotiated MaxUpdates of the
|
||
|
// session.
|
||
|
StateUpdateCodeMaxUpdatesExceeded StateUpdateCode = 71
|
||
|
|
||
|
// StateUpdateCodeSeqNumOutOfOrder signals the client sent an update
|
||
|
// that does not follow the required incremental monotonicity required
|
||
|
// by the tower.
|
||
|
StateUpdateCodeSeqNumOutOfOrder StateUpdateCode = 72
|
||
|
)
|
||
|
|
||
|
// StateUpdateReply is a message sent from watchtower to client in response to a
|
||
|
// StateUpdate message, and signals either an acceptance or rejection of the
|
||
|
// proposed state update.
|
||
|
type StateUpdateReply struct {
|
||
|
// Code will be non-zero if the watchtower rejected the state update.
|
||
|
Code StateUpdateCode
|
||
|
|
||
|
// LastApplied returns the sequence number of the last accepted update
|
||
|
// known to the watchtower. If the update was successful, this value
|
||
|
// should be the sequence number of the last update sent.
|
||
|
LastApplied uint16
|
||
|
}
|
||
|
|
||
|
// A compile time check to ensure StateUpdateReply implements the wtwire.Message
|
||
|
// interface.
|
||
|
var _ Message = (*StateUpdateReply)(nil)
|
||
|
|
||
|
// Decode deserializes a serialized StateUpdateReply message stored in the passed
|
||
|
// io.Reader observing the specified protocol version.
|
||
|
//
|
||
|
// This is part of the wtwire.Message interface.
|
||
|
func (t *StateUpdateReply) Decode(r io.Reader, pver uint32) error {
|
||
|
return ReadElements(r,
|
||
|
&t.Code,
|
||
|
&t.LastApplied,
|
||
|
)
|
||
|
}
|
||
|
|
||
|
// Encode serializes the target StateUpdateReply into the passed io.Writer
|
||
|
// observing the protocol version specified.
|
||
|
//
|
||
|
// This is part of the wtwire.Message interface.
|
||
|
func (t *StateUpdateReply) Encode(w io.Writer, pver uint32) error {
|
||
|
return WriteElements(w,
|
||
|
t.Code,
|
||
|
t.LastApplied,
|
||
|
)
|
||
|
}
|
||
|
|
||
|
// MsgType returns the integer uniquely identifying this message type on the
|
||
|
// wire.
|
||
|
//
|
||
|
// This is part of the wtwire.Message interface.
|
||
|
func (t *StateUpdateReply) MsgType() MessageType {
|
||
|
return MsgStateUpdateReply
|
||
|
}
|
||
|
|
||
|
// MaxPayloadLength returns the maximum allowed payload size for a
|
||
|
// StateUpdateReply complete message observing the specified protocol version.
|
||
|
//
|
||
|
// This is part of the wtwire.Message interface.
|
||
|
func (t *StateUpdateReply) MaxPayloadLength(uint32) uint32 {
|
||
|
return 4
|
||
|
}
|