Barrier client protocol
QEMU’s input-barrier
device implements the client end of
the KVM (Keyboard-Video-Mouse) software
Barrier.
This document briefly describes the protocol as we implement it.
Message format
Message format between the server and client is in two parts:
the payload length, a 32bit integer in network endianness
the payload
The payload starts with a 4byte string (without NUL) which is the command. The first command between the server and the client is the only command not encoded on 4 bytes (“Barrier”). The remaining part of the payload is decoded according to the command.
Protocol Description
This comes from barrier/src/lib/barrier/protocol_types.h
.
barrierCmdHello “Barrier”
- Direction:
server -> client
- Parameters:
{ int16_t minor, int16_t major }
- Description:
Say hello to client
minor
= protocol major version number supported by servermajor
= protocol minor version number supported by server
barrierCmdHelloBack “Barrier”
- Direction:
client ->server
- Parameters:
{ int16_t minor, int16_t major, char *name}
- Description:
Respond to hello from server
minor
= protocol major version number supported by clientmajor
= protocol minor version number supported by clientname
= client name
barrierCmdDInfo “DINF”
- Direction:
client ->server
- Parameters:
{ int16_t x_origin, int16_t y_origin, int16_t width, int16_t height, int16_t x, int16_t y}
- Description:
The client screen must send this message in response to the barrierCmdQInfo message. It must also send this message when the screen’s resolution changes. In this case, the client screen should ignore any barrierCmdDMouseMove messages until it receives a barrierCmdCInfoAck in order to prevent attempts to move the mouse off the new screen area.
barrierCmdCNoop “CNOP”
- Direction:
client -> server
- Parameters:
None
- Description:
No operation
barrierCmdCClose “CBYE”
- Direction:
server -> client
- Parameters:
None
- Description:
Close connection
barrierCmdCEnter “CINN”
- Direction:
server -> client
- Parameters:
{ int16_t x, int16_t y, int32_t seq, int16_t modifier }
- Description:
Enter screen.
x
,y
= entering screen absolute coordinatesseq
= sequence number, which is used to order messages between screens. the secondary screen must return this number with some messagesmodifier
= modifier key mask. this will have bits set for each toggle modifier key that is activated on entry to the screen. the secondary screen should adjust its toggle modifiers to reflect that state.
barrierCmdCLeave “COUT”
- Direction:
server -> client
- Parameters:
None
- Description:
Leaving screen. the secondary screen should send clipboard data in response to this message for those clipboards that it has grabbed (i.e. has sent a barrierCmdCClipboard for and has not received a barrierCmdCClipboard for with a greater sequence number) and that were grabbed or have changed since the last leave.
barrierCmdCClipboard “CCLP”
- Direction:
server -> client
- Parameters:
{ int8_t id, int32_t seq }
- Description:
Grab clipboard. Sent by screen when some other app on that screen grabs a clipboard.
id
= the clipboard identifierseq
= sequence number. Client must use the sequence number passed in the most recent barrierCmdCEnter. the server always sends 0.
barrierCmdCScreenSaver “CSEC”
- Direction:
server -> client
- Parameters:
{ int8_t started }
- Description:
Screensaver change.
started
= Screensaver on primary has started (1) or closed (0)
barrierCmdCResetOptions “CROP”
- Direction:
server -> client
- Parameters:
None
- Description:
Reset options. Client should reset all of its options to their defaults.
barrierCmdCInfoAck “CIAK”
- Direction:
server -> client
- Parameters:
None
- Description:
Resolution change acknowledgment. Sent by server in response to a client screen’s barrierCmdDInfo. This is sent for every barrierCmdDInfo, whether or not the server had sent a barrierCmdQInfo.
barrierCmdCKeepAlive “CALV”
- Direction:
server -> client
- Parameters:
None
- Description:
Keep connection alive. Sent by the server periodically to verify that connections are still up and running. clients must reply in kind on receipt. if the server gets an error sending the message or does not receive a reply within a reasonable time then the server disconnects the client. if the client doesn’t receive these (or any message) periodically then it should disconnect from the server. the appropriate interval is defined by an option.
barrierCmdDKeyDown “DKDN”
- Direction:
server -> client
- Parameters:
{ int16_t keyid, int16_t modifier [,int16_t button] }
- Description:
Key pressed.
keyid
= X11 key idmodified
= modified maskbutton
= X11 Xkb keycode (optional)
barrierCmdDKeyRepeat “DKRP”
- Direction:
server -> client
- Parameters:
{ int16_t keyid, int16_t modifier, int16_t repeat [,int16_t button] }
- Description:
Key auto-repeat.
keyid
= X11 key idmodified
= modified maskrepeat
= number of repeatsbutton
= X11 Xkb keycode (optional)
barrierCmdDKeyUp “DKUP”
- Direction:
server -> client
- Parameters:
{ int16_t keyid, int16_t modifier [,int16_t button] }
- Description:
Key released.
keyid
= X11 key idmodified
= modified maskbutton
= X11 Xkb keycode (optional)
barrierCmdDMouseDown “DMDN”
- Direction:
server -> client
- Parameters:
{ int8_t button }
- Description:
Mouse button pressed.
button
= button id
barrierCmdDMouseUp “DMUP”
- Direction:
server -> client
- Parameters:
{ int8_t button }
- Description:
Mouse button release.
button
= button id
barrierCmdDMouseMove “DMMV”
- Direction:
server -> client
- Parameters:
{ int16_t x, int16_t y }
- Description:
Absolute mouse moved.
x
,y
= absolute screen coordinates
barrierCmdDMouseRelMove “DMRM”
- Direction:
server -> client
- Parameters:
{ int16_t x, int16_t y }
- Description:
Relative mouse moved.
x
,y
= r relative screen coordinates
barrierCmdDMouseWheel “DMWM”
- Direction:
server -> client
- Parameters:
{ int16_t x , int16_t y }
or{ int16_t y }
- Description:
Mouse scroll. The delta should be +120 for one tick forward (away from the user) or right and -120 for one tick backward (toward the user) or left.
x
= x deltay
= y delta
barrierCmdDClipboard “DCLP”
- Direction:
server -> client
- Parameters:
{ int8_t id, int32_t seq, int8_t mark, char *data }
- Description:
Clipboard data.
id
= clipboard idseq
= sequence number. The sequence number is 0 when sent by the server. Client screens should use the/ sequence number from the most recent barrierCmdCEnter.
barrierCmdDSetOptions “DSOP”
- Direction:
server -> client
- Parameters:
{ int32 t nb, { int32_t id, int32_t val }[] }
- Description:
Set options. Client should set the given option/value pairs.
nb
= numbers of{ id, val }
entriesid
= option idval
= option new value
barrierCmdDFileTransfer “DFTR”
- Direction:
server -> client
- Parameters:
{ int8_t mark, char *content }
- Description:
Transfer file data.
mark
= 0 means the content followed is the file size1 means the content followed is the chunk data
2 means the file transfer is finished
barrierCmdDDragInfo “DDRG”
- Direction:
server -> client
- Parameters:
{ int16_t nb, char *content }
- Description:
Drag information.
nb
= number of dragging objectscontent
= object’s directory
barrierCmdQInfo “QINF”
- Direction:
server -> client
- Parameters:
None
- Description:
Query screen info
Client should reply with a barrierCmdDInfo
barrierCmdEIncompatible “EICV”
- Direction:
server -> client
- Parameters:
{ int16_t nb, major *minor }
- Description:
Incompatible version.
major
= major versionminor
= minor version
barrierCmdEBusy “EBSY”
- Direction:
server -> client
- Parameters:
None
- Description:
Name provided when connecting is already in use.
barrierCmdEUnknown “EUNK”
- Direction:
server -> client
- Parameters:
None
- Description:
Unknown client. Name provided when connecting is not in primary’s screen configuration map.
barrierCmdEBad “EBAD”
- Direction:
server -> client
- Parameters:
None
- Description:
Protocol violation. Server should disconnect after sending this message.