Most of docs/barrier.txt is describing the protocol implemented by the input-barrier device. Move this into the interop section of the manual, and rstify it. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-id: 20210727204112.12579-2-peter.maydell@linaro.org
		
			
				
	
	
		
			427 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			427 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
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.
 | 
						|
 |