diff --git a/protocol/PROTOCOL.md b/protocol/PROTOCOL.md index d24295064..ab6140f0c 100644 --- a/protocol/PROTOCOL.md +++ b/protocol/PROTOCOL.md @@ -70,12 +70,13 @@ Messages -------- Every message starts with one 32 bit word indicating the message -version, type and ID. +version, type and ID. The header is in network byte order, i.e. big +endian. 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Ver | Type | Message ID | Reply To | + | Ver | Message ID | Type | Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ For BEP v1 the Version field is set to zero. Future versions with @@ -84,19 +85,19 @@ with an unknown version is a protocol error and MUST result in the connection being terminated. A client supporting multiple versions MAY retry with a different protocol version upon disconnection. +The Message ID is set to a unique value for each transmitted request +message. In response messages it is set to the Message ID of the +corresponding request message. The uniqueness requirement implies that +no more than 4096 messages may be outstanding at any given moment. The +ordering requirement implies that a response to a given message ID also +means that all preceding messages have been received, specifically those +which do not otherwise demand a response. Hence their message ID:s may +be reused. + The Type field indicates the type of data following the message header and is one of the integers defined below. A message of an unknown type is a protocol error and MUST result in the connection being terminated. -The Message ID is set to a unique value for each transmitted message. In -request messages the Reply To is set to zero. In response messages it is -set to the message ID of the corresponding request. The uniqueness -requirement implies that no more than 4096 messages may be outstanding -at any given moment. The ordering requirement implies that a response to -a given message ID also means that all preceding messages have been -received, specifically those which do not otherwise demand a response. -Hence their message ID:s may be reused. - All data following the message header MUST be in XDR (RFC 1014) encoding. All fields shorter than 32 bits and all variable length data MUST be padded to a multiple of 32 bits. The actual data types in use by diff --git a/protocol/protocol_test.go b/protocol/protocol_test.go index 609eb0de6..5add18cd2 100644 --- a/protocol/protocol_test.go +++ b/protocol/protocol_test.go @@ -25,6 +25,31 @@ func TestHeaderFunctions(t *testing.T) { } } +func TestHeaderLayout(t *testing.T) { + var e, a uint32 + + // Version are the first four bits + e = 0xf0000000 + a = encodeHeader(header{0xf, 0, 0}) + if a != e { + t.Errorf("Header layout incorrect; %08x != %08x", a, e) + } + + // Message ID are the following 12 bits + e = 0x0fff0000 + a = encodeHeader(header{0, 0xfff, 0}) + if a != e { + t.Errorf("Header layout incorrect; %08x != %08x", a, e) + } + + // Type are the last 8 bits before reserved + e = 0x0000ff00 + a = encodeHeader(header{0, 0, 0xff}) + if a != e { + t.Errorf("Header layout incorrect; %08x != %08x", a, e) + } +} + func TestPing(t *testing.T) { ar, aw := io.Pipe() br, bw := io.Pipe()