371 lines
11 KiB
Plaintext
371 lines
11 KiB
Plaintext
|
QEMU Barrier Client
|
||
|
|
||
|
|
||
|
* About
|
||
|
|
||
|
Barrier is a KVM (Keyboard-Video-Mouse) software forked from Symless's
|
||
|
synergy 1.9 codebase.
|
||
|
|
||
|
See https://github.com/debauchee/barrier
|
||
|
|
||
|
* QEMU usage
|
||
|
|
||
|
Generally, mouse and keyboard are grabbed through the QEMU video
|
||
|
interface emulation.
|
||
|
|
||
|
But when we want to use a video graphic adapter via a PCI passthrough
|
||
|
there is no way to provide the keyboard and mouse inputs to the VM
|
||
|
except by plugging a second set of mouse and keyboard to the host
|
||
|
or by installing a KVM software in the guest OS.
|
||
|
|
||
|
The QEMU Barrier client avoids this by implementing directly the Barrier
|
||
|
protocol into QEMU.
|
||
|
|
||
|
This protocol is enabled by adding an input-barrier object to QEMU.
|
||
|
|
||
|
Syntax: input-barrier,id=<object-id>,name=<guest display name>
|
||
|
[,server=<barrier server address>][,port=<barrier server port>]
|
||
|
[,x-origin=<x-origin>][,y-origin=<y-origin>]
|
||
|
[,width=<width>][,height=<height>]
|
||
|
|
||
|
The object can be added on the QEMU command line, for instance with:
|
||
|
|
||
|
... -object input-barrier,id=barrier0,name=VM-1 ...
|
||
|
|
||
|
where VM-1 is the name the display configured int the Barrier server
|
||
|
on the host providing the mouse and the keyboard events.
|
||
|
|
||
|
by default <barrier server address> is "localhost", port is 24800,
|
||
|
<x-origin> and <y-origin> are set to 0, <width> and <height> to
|
||
|
1920 and 1080.
|
||
|
|
||
|
If Barrier server is stopped QEMU needs to be reconnected manually,
|
||
|
by removing and re-adding the input-barrier object, for instance
|
||
|
with the help of the HMP monitor:
|
||
|
|
||
|
(qemu) object_del barrier0
|
||
|
(qemu) object_add input-barrier,id=barrier0,name=VM-1
|
||
|
|
||
|
* Message format
|
||
|
|
||
|
Message format between the server and client is in two parts:
|
||
|
|
||
|
1- the payload length is a 32bit integer in network endianness,
|
||
|
2- 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 (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" int16_t char *
|
||
|
|
||
|
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.
|
||
|
|
||
|
* TO DO
|
||
|
|
||
|
- Enable SSL
|
||
|
- Manage SetOptions/ResetOptions commands
|
||
|
|