blob: 055f2c1aef32454c308ee4a3aa677942022f12ed [file] [log] [blame]
Barrier client protocol
=======================
QEMU's ``input-barrier`` device implements the client end of
the KVM (Keyboard-Video-Mouse) software
`Barrier <https://github.com/debauchee/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 server
``major`` = 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 client
``major`` = protocol minor version number supported by client
``name`` = 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 coordinates
``seq`` = sequence number, which is used to order messages between
screens. the secondary screen must return this number
with some messages
``modifier`` = 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 identifier
``seq`` = 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 id
``modified`` = modified mask
``button`` = 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 id
``modified`` = modified mask
``repeat`` = number of repeats
``button`` = 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 id
``modified`` = modified mask
``button`` = 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 delta
``y`` = y delta
barrierCmdDClipboard "DCLP"
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Direction:
server -> client
Parameters:
``{ int8_t id, int32_t seq, int8_t mark, char *data }``
Description:
Clipboard data.
``id`` = clipboard id
``seq`` = 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 }`` entries
``id`` = option id
``val`` = 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 size
* 1 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 objects
``content`` = 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 version
``minor`` = 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.