]>
Commit | Line | Data |
---|---|---|
6105683d LV |
1 | QEMU Barrier Client |
2 | ||
3 | ||
4 | * About | |
5 | ||
6 | Barrier is a KVM (Keyboard-Video-Mouse) software forked from Symless's | |
7 | synergy 1.9 codebase. | |
8 | ||
9 | See https://github.com/debauchee/barrier | |
10 | ||
11 | * QEMU usage | |
12 | ||
13 | Generally, mouse and keyboard are grabbed through the QEMU video | |
14 | interface emulation. | |
15 | ||
16 | But when we want to use a video graphic adapter via a PCI passthrough | |
17 | there is no way to provide the keyboard and mouse inputs to the VM | |
18 | except by plugging a second set of mouse and keyboard to the host | |
19 | or by installing a KVM software in the guest OS. | |
20 | ||
21 | The QEMU Barrier client avoids this by implementing directly the Barrier | |
22 | protocol into QEMU. | |
23 | ||
24 | This protocol is enabled by adding an input-barrier object to QEMU. | |
25 | ||
26 | Syntax: input-barrier,id=<object-id>,name=<guest display name> | |
27 | [,server=<barrier server address>][,port=<barrier server port>] | |
28 | [,x-origin=<x-origin>][,y-origin=<y-origin>] | |
29 | [,width=<width>][,height=<height>] | |
30 | ||
31 | The object can be added on the QEMU command line, for instance with: | |
32 | ||
33 | ... -object input-barrier,id=barrier0,name=VM-1 ... | |
34 | ||
35 | where VM-1 is the name the display configured int the Barrier server | |
36 | on the host providing the mouse and the keyboard events. | |
37 | ||
38 | by default <barrier server address> is "localhost", port is 24800, | |
39 | <x-origin> and <y-origin> are set to 0, <width> and <height> to | |
40 | 1920 and 1080. | |
41 | ||
42 | If Barrier server is stopped QEMU needs to be reconnected manually, | |
43 | by removing and re-adding the input-barrier object, for instance | |
44 | with the help of the HMP monitor: | |
45 | ||
46 | (qemu) object_del barrier0 | |
47 | (qemu) object_add input-barrier,id=barrier0,name=VM-1 | |
48 | ||
49 | * Message format | |
50 | ||
51 | Message format between the server and client is in two parts: | |
52 | ||
53 | 1- the payload length is a 32bit integer in network endianness, | |
54 | 2- the payload | |
55 | ||
56 | The payload starts with a 4byte string (without NUL) which is the | |
57 | command. The first command between the server and the client | |
58 | is the only command not encoded on 4 bytes ("Barrier"). | |
59 | The remaining part of the payload is decoded according to the command. | |
60 | ||
61 | * Protocol Description (from barrier/src/lib/barrier/protocol_types.h) | |
62 | ||
63 | - barrierCmdHello "Barrier" | |
64 | ||
65 | Direction: server -> client | |
66 | Parameters: { int16_t minor, int16_t major } | |
67 | Description: | |
68 | ||
69 | Say hello to client | |
70 | minor = protocol major version number supported by server | |
71 | major = protocol minor version number supported by server | |
72 | ||
73 | - barrierCmdHelloBack "Barrier" | |
74 | ||
75 | Direction: client ->server | |
76 | Parameters: { int16_t minor, int16_t major, char *name} | |
77 | Description: | |
78 | ||
79 | Respond to hello from server | |
80 | minor = protocol major version number supported by client | |
81 | major = protocol minor version number supported by client | |
82 | name = client name | |
83 | ||
84 | - barrierCmdDInfo "DINF" | |
85 | ||
86 | Direction: client ->server | |
87 | Parameters: { int16_t x_origin, int16_t y_origin, int16_t width, int16_t height, int16_t x, int16_t y} | |
88 | Description: | |
89 | ||
90 | The client screen must send this message in response to the | |
91 | barrierCmdQInfo message. It must also send this message when the | |
92 | screen's resolution changes. In this case, the client screen should | |
93 | ignore any barrierCmdDMouseMove messages until it receives a | |
94 | barrierCmdCInfoAck in order to prevent attempts to move the mouse off | |
95 | the new screen area. | |
96 | ||
97 | - barrierCmdCNoop "CNOP" | |
98 | ||
99 | Direction: client -> server | |
100 | Parameters: None | |
101 | Description: | |
102 | ||
103 | No operation | |
104 | ||
105 | - barrierCmdCClose "CBYE" | |
106 | ||
107 | Direction: server -> client | |
108 | Parameters: None | |
109 | Description: | |
110 | ||
111 | Close connection | |
112 | ||
113 | - barrierCmdCEnter "CINN" | |
114 | ||
115 | Direction: server -> client | |
116 | Parameters: { int16_t x, int16_t y, int32_t seq, int16_t modifier } | |
117 | Description: | |
118 | ||
119 | Enter screen. | |
120 | x,y = entering screen absolute coordinates | |
121 | seq = sequence number, which is used to order messages between | |
122 | screens. the secondary screen must return this number | |
123 | with some messages | |
124 | modifier = modifier key mask. this will have bits set for each | |
125 | toggle modifier key that is activated on entry to the | |
126 | screen. the secondary screen should adjust its toggle | |
127 | modifiers to reflect that state. | |
128 | ||
129 | - barrierCmdCLeave "COUT" | |
130 | ||
131 | Direction: server -> client | |
132 | Parameters: None | |
133 | Description: | |
134 | ||
135 | Leaving screen. the secondary screen should send clipboard data in | |
136 | response to this message for those clipboards that it has grabbed | |
137 | (i.e. has sent a barrierCmdCClipboard for and has not received a | |
138 | barrierCmdCClipboard for with a greater sequence number) and that | |
139 | were grabbed or have changed since the last leave. | |
140 | ||
141 | - barrierCmdCClipboard "CCLP" | |
142 | ||
143 | Direction: server -> client | |
144 | Parameters: { int8_t id, int32_t seq } | |
145 | Description: | |
146 | ||
147 | Grab clipboard. Sent by screen when some other app on that screen | |
148 | grabs a clipboard. | |
149 | id = the clipboard identifier | |
150 | seq = sequence number. Client must use the sequence number passed in | |
151 | the most recent barrierCmdCEnter. the server always sends 0. | |
152 | ||
153 | - barrierCmdCScreenSaver "CSEC" | |
154 | ||
155 | Direction: server -> client | |
156 | Parameters: { int8_t started } | |
157 | Description: | |
158 | ||
159 | Screensaver change. | |
160 | started = Screensaver on primary has started (1) or closed (0) | |
161 | ||
162 | - barrierCmdCResetOptions "CROP" | |
163 | ||
164 | Direction: server -> client | |
165 | Parameters: None | |
166 | Description: | |
167 | ||
168 | Reset options. Client should reset all of its options to their | |
169 | defaults. | |
170 | ||
171 | - barrierCmdCInfoAck "CIAK" | |
172 | ||
173 | Direction: server -> client | |
174 | Parameters: None | |
175 | Description: | |
176 | ||
177 | Resolution change acknowledgment. Sent by server in response to a | |
178 | client screen's barrierCmdDInfo. This is sent for every | |
179 | barrierCmdDInfo, whether or not the server had sent a barrierCmdQInfo. | |
180 | ||
181 | - barrierCmdCKeepAlive "CALV" | |
182 | ||
183 | Direction: server -> client | |
184 | Parameters: None | |
185 | Description: | |
186 | ||
187 | Keep connection alive. Sent by the server periodically to verify | |
188 | that connections are still up and running. clients must reply in | |
189 | kind on receipt. if the server gets an error sending the message or | |
190 | does not receive a reply within a reasonable time then the server | |
191 | disconnects the client. if the client doesn't receive these (or any | |
192 | message) periodically then it should disconnect from the server. the | |
193 | appropriate interval is defined by an option. | |
194 | ||
195 | - barrierCmdDKeyDown "DKDN" | |
196 | ||
197 | Direction: server -> client | |
198 | Parameters: { int16_t keyid, int16_t modifier [,int16_t button] } | |
199 | Description: | |
200 | ||
201 | Key pressed. | |
202 | keyid = X11 key id | |
203 | modified = modified mask | |
204 | button = X11 Xkb keycode (optional) | |
205 | ||
206 | - barrierCmdDKeyRepeat "DKRP" | |
207 | ||
208 | Direction: server -> client | |
209 | Parameters: { int16_t keyid, int16_t modifier, int16_t repeat [,int16_t button] } | |
210 | Description: | |
211 | ||
212 | Key auto-repeat. | |
213 | keyid = X11 key id | |
214 | modified = modified mask | |
215 | repeat = number of repeats | |
216 | button = X11 Xkb keycode (optional) | |
217 | ||
218 | - barrierCmdDKeyUp "DKUP" | |
219 | ||
220 | Direction: server -> client | |
221 | Parameters: { int16_t keyid, int16_t modifier [,int16_t button] } | |
222 | Description: | |
223 | ||
224 | Key released. | |
225 | keyid = X11 key id | |
226 | modified = modified mask | |
227 | button = X11 Xkb keycode (optional) | |
228 | ||
229 | - barrierCmdDMouseDown "DMDN" | |
230 | ||
231 | Direction: server -> client | |
232 | Parameters: { int8_t button } | |
233 | Description: | |
234 | ||
235 | Mouse button pressed. | |
236 | button = button id | |
237 | ||
238 | - barrierCmdDMouseUp "DMUP" | |
239 | ||
240 | Direction: server -> client | |
241 | Parameters: { int8_t button } | |
242 | Description: | |
243 | ||
244 | Mouse button release. | |
245 | button = button id | |
246 | ||
247 | - barrierCmdDMouseMove "DMMV" | |
248 | ||
249 | Direction: server -> client | |
250 | Parameters: { int16_t x, int16_t y } | |
251 | Description: | |
252 | ||
253 | Absolute mouse moved. | |
254 | x,y = absolute screen coordinates | |
255 | ||
256 | - barrierCmdDMouseRelMove "DMRM" | |
257 | ||
258 | Direction: server -> client | |
259 | Parameters: { int16_t x, int16_t y } | |
260 | Description: | |
261 | ||
262 | Relative mouse moved. | |
263 | x,y = r relative screen coordinates | |
264 | ||
265 | - barrierCmdDMouseWheel "DMWM" | |
266 | ||
267 | Direction: server -> client | |
268 | Parameters: { int16_t x , int16_t y } or { int16_t y } | |
269 | Description: | |
270 | ||
271 | Mouse scroll. The delta should be +120 for one tick forward (away | |
272 | from the user) or right and -120 for one tick backward (toward the | |
273 | user) or left. | |
274 | x = x delta | |
275 | y = y delta | |
276 | ||
277 | - barrierCmdDClipboard "DCLP" | |
278 | ||
279 | Direction: server -> client | |
280 | Parameters: { int8_t id, int32_t seq, int8_t mark, char *data } | |
281 | Description: | |
282 | ||
283 | Clipboard data. | |
284 | id = clipboard id | |
285 | seq = sequence number. The sequence number is 0 when sent by the | |
286 | server. Client screens should use the/ sequence number from | |
287 | the most recent barrierCmdCEnter. | |
288 | ||
289 | - barrierCmdDSetOptions "DSOP" | |
290 | ||
291 | Direction: server -> client | |
292 | Parameters: { int32 t nb, { int32_t id, int32_t val }[] } | |
293 | Description: | |
294 | ||
295 | Set options. Client should set the given option/value pairs. | |
296 | nb = numbers of { id, val } entries | |
297 | id = option id | |
298 | val = option new value | |
299 | ||
300 | - barrierCmdDFileTransfer "DFTR" | |
301 | ||
302 | Direction: server -> client | |
303 | Parameters: { int8_t mark, char *content } | |
304 | Description: | |
305 | ||
306 | Transfer file data. | |
307 | mark = 0 means the content followed is the file size | |
308 | 1 means the content followed is the chunk data | |
309 | 2 means the file transfer is finished | |
310 | ||
311 | - barrierCmdDDragInfo "DDRG" int16_t char * | |
312 | ||
313 | Direction: server -> client | |
314 | Parameters: { int16_t nb, char *content } | |
315 | Description: | |
316 | ||
317 | Drag information. | |
318 | nb = number of dragging objects | |
319 | content = object's directory | |
320 | ||
321 | - barrierCmdQInfo "QINF" | |
322 | ||
323 | Direction: server -> client | |
324 | Parameters: None | |
325 | Description: | |
326 | ||
327 | Query screen info | |
328 | Client should reply with a barrierCmdDInfo | |
329 | ||
330 | - barrierCmdEIncompatible "EICV" | |
331 | ||
332 | Direction: server -> client | |
333 | Parameters: { int16_t nb, major *minor } | |
334 | Description: | |
335 | ||
336 | Incompatible version. | |
337 | major = major version | |
338 | minor = minor version | |
339 | ||
340 | - barrierCmdEBusy "EBSY" | |
341 | ||
342 | Direction: server -> client | |
343 | Parameters: None | |
344 | Description: | |
345 | ||
346 | Name provided when connecting is already in use. | |
347 | ||
348 | - barrierCmdEUnknown "EUNK" | |
349 | ||
350 | Direction: server -> client | |
351 | Parameters: None | |
352 | Description: | |
353 | ||
354 | Unknown client. Name provided when connecting is not in primary's | |
355 | screen configuration map. | |
356 | ||
357 | - barrierCmdEBad "EBAD" | |
358 | ||
359 | Direction: server -> client | |
360 | Parameters: None | |
361 | Description: | |
362 | ||
363 | Protocol violation. Server should disconnect after sending this | |
364 | message. | |
365 | ||
366 | * TO DO | |
367 | ||
368 | - Enable SSL | |
369 | - Manage SetOptions/ResetOptions commands | |
370 |