xref: /openbmc/qemu/qapi/char.json (revision 3e301c8d7ef0259c7e19277ea93a9915b55a1c6d)
1dbeee392SMarkus Armbruster# -*- Mode: Python -*-
2f7160f32SAndrea Bolognani# vim: filetype=python
3dbeee392SMarkus Armbruster#
4dbeee392SMarkus Armbruster
5dbeee392SMarkus Armbruster##
6dbeee392SMarkus Armbruster# = Character devices
7dbeee392SMarkus Armbruster##
8dbeee392SMarkus Armbruster
9dbeee392SMarkus Armbruster{ 'include': 'sockets.json' }
10dbeee392SMarkus Armbruster
11dbeee392SMarkus Armbruster##
12dbeee392SMarkus Armbruster# @ChardevInfo:
13dbeee392SMarkus Armbruster#
14dbeee392SMarkus Armbruster# Information about a character device.
15dbeee392SMarkus Armbruster#
16dbeee392SMarkus Armbruster# @label: the label of the character device
17dbeee392SMarkus Armbruster#
18dbeee392SMarkus Armbruster# @filename: the filename of the character device
19dbeee392SMarkus Armbruster#
20dbeee392SMarkus Armbruster# @frontend-open: shows whether the frontend device attached to this backend
21dbeee392SMarkus Armbruster#                 (eg. with the chardev=... option) is in open or closed state
22dbeee392SMarkus Armbruster#                 (since 2.1)
23dbeee392SMarkus Armbruster#
24dbeee392SMarkus Armbruster# Notes: @filename is encoded using the QEMU command line character device
25dbeee392SMarkus Armbruster#        encoding.  See the QEMU man page for details.
26dbeee392SMarkus Armbruster#
279bc6e893SMarkus Armbruster# Since: 0.14
28dbeee392SMarkus Armbruster##
29b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevInfo',
30b0ddeba2SMarc-André Lureau  'data': { 'label': 'str',
31dbeee392SMarkus Armbruster            'filename': 'str',
32dbeee392SMarkus Armbruster            'frontend-open': 'bool' } }
33dbeee392SMarkus Armbruster
34dbeee392SMarkus Armbruster##
35dbeee392SMarkus Armbruster# @query-chardev:
36dbeee392SMarkus Armbruster#
37dbeee392SMarkus Armbruster# Returns information about current character devices.
38dbeee392SMarkus Armbruster#
39dbeee392SMarkus Armbruster# Returns: a list of @ChardevInfo
40dbeee392SMarkus Armbruster#
419bc6e893SMarkus Armbruster# Since: 0.14
42dbeee392SMarkus Armbruster#
43dbeee392SMarkus Armbruster# Example:
44dbeee392SMarkus Armbruster#
45dbeee392SMarkus Armbruster# -> { "execute": "query-chardev" }
46dbeee392SMarkus Armbruster# <- {
47dbeee392SMarkus Armbruster#       "return": [
48dbeee392SMarkus Armbruster#          {
49dbeee392SMarkus Armbruster#             "label": "charchannel0",
509d902d51SPaolo Bonzini#             "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server=on",
51dbeee392SMarkus Armbruster#             "frontend-open": false
52dbeee392SMarkus Armbruster#          },
53dbeee392SMarkus Armbruster#          {
54dbeee392SMarkus Armbruster#             "label": "charmonitor",
559d902d51SPaolo Bonzini#             "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server=on",
56dbeee392SMarkus Armbruster#             "frontend-open": true
57dbeee392SMarkus Armbruster#          },
58dbeee392SMarkus Armbruster#          {
59dbeee392SMarkus Armbruster#             "label": "charserial0",
60dbeee392SMarkus Armbruster#             "filename": "pty:/dev/pts/2",
61dbeee392SMarkus Armbruster#             "frontend-open": true
62dbeee392SMarkus Armbruster#          }
63dbeee392SMarkus Armbruster#       ]
64dbeee392SMarkus Armbruster#    }
65dbeee392SMarkus Armbruster#
66dbeee392SMarkus Armbruster##
67a87706c8SIgor Mammedov{ 'command': 'query-chardev', 'returns': ['ChardevInfo'],
68a87706c8SIgor Mammedov  'allow-preconfig': true }
69dbeee392SMarkus Armbruster
70dbeee392SMarkus Armbruster##
71dbeee392SMarkus Armbruster# @ChardevBackendInfo:
72dbeee392SMarkus Armbruster#
73dbeee392SMarkus Armbruster# Information about a character device backend
74dbeee392SMarkus Armbruster#
75dbeee392SMarkus Armbruster# @name: The backend name
76dbeee392SMarkus Armbruster#
77dbeee392SMarkus Armbruster# Since: 2.0
78dbeee392SMarkus Armbruster##
79dbeee392SMarkus Armbruster{ 'struct': 'ChardevBackendInfo', 'data': {'name': 'str'} }
80dbeee392SMarkus Armbruster
81dbeee392SMarkus Armbruster##
82dbeee392SMarkus Armbruster# @query-chardev-backends:
83dbeee392SMarkus Armbruster#
84dbeee392SMarkus Armbruster# Returns information about character device backends.
85dbeee392SMarkus Armbruster#
86dbeee392SMarkus Armbruster# Returns: a list of @ChardevBackendInfo
87dbeee392SMarkus Armbruster#
88dbeee392SMarkus Armbruster# Since: 2.0
89dbeee392SMarkus Armbruster#
90dbeee392SMarkus Armbruster# Example:
91dbeee392SMarkus Armbruster#
92dbeee392SMarkus Armbruster# -> { "execute": "query-chardev-backends" }
93dbeee392SMarkus Armbruster# <- {
94dbeee392SMarkus Armbruster#       "return":[
95dbeee392SMarkus Armbruster#          {
96dbeee392SMarkus Armbruster#             "name":"udp"
97dbeee392SMarkus Armbruster#          },
98dbeee392SMarkus Armbruster#          {
99dbeee392SMarkus Armbruster#             "name":"tcp"
100dbeee392SMarkus Armbruster#          },
101dbeee392SMarkus Armbruster#          {
102dbeee392SMarkus Armbruster#             "name":"unix"
103dbeee392SMarkus Armbruster#          },
104dbeee392SMarkus Armbruster#          {
105dbeee392SMarkus Armbruster#             "name":"spiceport"
106dbeee392SMarkus Armbruster#          }
107dbeee392SMarkus Armbruster#       ]
108dbeee392SMarkus Armbruster#    }
109dbeee392SMarkus Armbruster#
110dbeee392SMarkus Armbruster##
111dbeee392SMarkus Armbruster{ 'command': 'query-chardev-backends', 'returns': ['ChardevBackendInfo'] }
112dbeee392SMarkus Armbruster
113dbeee392SMarkus Armbruster##
114dbeee392SMarkus Armbruster# @DataFormat:
115dbeee392SMarkus Armbruster#
116dbeee392SMarkus Armbruster# An enumeration of data format.
117dbeee392SMarkus Armbruster#
118dbeee392SMarkus Armbruster# @utf8: Data is a UTF-8 string (RFC 3629)
119dbeee392SMarkus Armbruster#
120dbeee392SMarkus Armbruster# @base64: Data is Base64 encoded binary (RFC 3548)
121dbeee392SMarkus Armbruster#
122dbeee392SMarkus Armbruster# Since: 1.4
123dbeee392SMarkus Armbruster##
124dbeee392SMarkus Armbruster{ 'enum': 'DataFormat',
125dbeee392SMarkus Armbruster  'data': [ 'utf8', 'base64' ] }
126dbeee392SMarkus Armbruster
127dbeee392SMarkus Armbruster##
128dbeee392SMarkus Armbruster# @ringbuf-write:
129dbeee392SMarkus Armbruster#
130dbeee392SMarkus Armbruster# Write to a ring buffer character device.
131dbeee392SMarkus Armbruster#
132dbeee392SMarkus Armbruster# @device: the ring buffer character device name
133dbeee392SMarkus Armbruster#
134dbeee392SMarkus Armbruster# @data: data to write
135dbeee392SMarkus Armbruster#
136dbeee392SMarkus Armbruster# @format: data encoding (default 'utf8').
137100cc4feSPeter Maydell#
138dbeee392SMarkus Armbruster#          - base64: data must be base64 encoded text.  Its binary
139dbeee392SMarkus Armbruster#            decoding gets written.
140dbeee392SMarkus Armbruster#          - utf8: data's UTF-8 encoding is written
141dbeee392SMarkus Armbruster#          - data itself is always Unicode regardless of format, like
142dbeee392SMarkus Armbruster#            any other string.
143dbeee392SMarkus Armbruster#
144dbeee392SMarkus Armbruster# Returns: Nothing on success
145dbeee392SMarkus Armbruster#
146dbeee392SMarkus Armbruster# Since: 1.4
147dbeee392SMarkus Armbruster#
148dbeee392SMarkus Armbruster# Example:
149dbeee392SMarkus Armbruster#
150dbeee392SMarkus Armbruster# -> { "execute": "ringbuf-write",
151dbeee392SMarkus Armbruster#      "arguments": { "device": "foo",
152dbeee392SMarkus Armbruster#                     "data": "abcdefgh",
153dbeee392SMarkus Armbruster#                     "format": "utf8" } }
154dbeee392SMarkus Armbruster# <- { "return": {} }
155dbeee392SMarkus Armbruster#
156dbeee392SMarkus Armbruster##
157dbeee392SMarkus Armbruster{ 'command': 'ringbuf-write',
158b0ddeba2SMarc-André Lureau  'data': { 'device': 'str',
159b0ddeba2SMarc-André Lureau            'data': 'str',
160dbeee392SMarkus Armbruster           '*format': 'DataFormat'} }
161dbeee392SMarkus Armbruster
162dbeee392SMarkus Armbruster##
163dbeee392SMarkus Armbruster# @ringbuf-read:
164dbeee392SMarkus Armbruster#
165dbeee392SMarkus Armbruster# Read from a ring buffer character device.
166dbeee392SMarkus Armbruster#
167dbeee392SMarkus Armbruster# @device: the ring buffer character device name
168dbeee392SMarkus Armbruster#
169dbeee392SMarkus Armbruster# @size: how many bytes to read at most
170dbeee392SMarkus Armbruster#
171dbeee392SMarkus Armbruster# @format: data encoding (default 'utf8').
172100cc4feSPeter Maydell#
173dbeee392SMarkus Armbruster#          - base64: the data read is returned in base64 encoding.
174dbeee392SMarkus Armbruster#          - utf8: the data read is interpreted as UTF-8.
175dbeee392SMarkus Armbruster#            Bug: can screw up when the buffer contains invalid UTF-8
176dbeee392SMarkus Armbruster#            sequences, NUL characters, after the ring buffer lost
177dbeee392SMarkus Armbruster#            data, and when reading stops because the size limit is
178dbeee392SMarkus Armbruster#            reached.
179dbeee392SMarkus Armbruster#          - The return value is always Unicode regardless of format,
180dbeee392SMarkus Armbruster#            like any other string.
181dbeee392SMarkus Armbruster#
182dbeee392SMarkus Armbruster# Returns: data read from the device
183dbeee392SMarkus Armbruster#
184dbeee392SMarkus Armbruster# Since: 1.4
185dbeee392SMarkus Armbruster#
186dbeee392SMarkus Armbruster# Example:
187dbeee392SMarkus Armbruster#
188dbeee392SMarkus Armbruster# -> { "execute": "ringbuf-read",
189dbeee392SMarkus Armbruster#      "arguments": { "device": "foo",
190dbeee392SMarkus Armbruster#                     "size": 1000,
191dbeee392SMarkus Armbruster#                     "format": "utf8" } }
192dbeee392SMarkus Armbruster# <- { "return": "abcdefgh" }
193dbeee392SMarkus Armbruster#
194dbeee392SMarkus Armbruster##
195dbeee392SMarkus Armbruster{ 'command': 'ringbuf-read',
196dbeee392SMarkus Armbruster  'data': {'device': 'str', 'size': 'int', '*format': 'DataFormat'},
197dbeee392SMarkus Armbruster  'returns': 'str' }
198dbeee392SMarkus Armbruster
199dbeee392SMarkus Armbruster##
200dbeee392SMarkus Armbruster# @ChardevCommon:
201dbeee392SMarkus Armbruster#
202dbeee392SMarkus Armbruster# Configuration shared across all chardev backends
203dbeee392SMarkus Armbruster#
204dbeee392SMarkus Armbruster# @logfile: The name of a logfile to save output
205dbeee392SMarkus Armbruster# @logappend: true to append instead of truncate
206dbeee392SMarkus Armbruster#             (default to false to truncate)
207dbeee392SMarkus Armbruster#
208dbeee392SMarkus Armbruster# Since: 2.6
209dbeee392SMarkus Armbruster##
210b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevCommon',
211b0ddeba2SMarc-André Lureau  'data': { '*logfile': 'str',
212dbeee392SMarkus Armbruster            '*logappend': 'bool' } }
213dbeee392SMarkus Armbruster
214dbeee392SMarkus Armbruster##
215dbeee392SMarkus Armbruster# @ChardevFile:
216dbeee392SMarkus Armbruster#
217dbeee392SMarkus Armbruster# Configuration info for file chardevs.
218dbeee392SMarkus Armbruster#
219dbeee392SMarkus Armbruster# @in:  The name of the input file
220dbeee392SMarkus Armbruster# @out: The name of the output file
221dbeee392SMarkus Armbruster# @append: Open the file in append mode (default false to
222dbeee392SMarkus Armbruster#          truncate) (Since 2.6)
223dbeee392SMarkus Armbruster#
224dbeee392SMarkus Armbruster# Since: 1.4
225dbeee392SMarkus Armbruster##
226b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevFile',
227b0ddeba2SMarc-André Lureau  'data': { '*in': 'str',
228dbeee392SMarkus Armbruster            'out': 'str',
229dbeee392SMarkus Armbruster            '*append': 'bool' },
230dbeee392SMarkus Armbruster  'base': 'ChardevCommon' }
231dbeee392SMarkus Armbruster
232dbeee392SMarkus Armbruster##
233dbeee392SMarkus Armbruster# @ChardevHostdev:
234dbeee392SMarkus Armbruster#
235dbeee392SMarkus Armbruster# Configuration info for device and pipe chardevs.
236dbeee392SMarkus Armbruster#
237dbeee392SMarkus Armbruster# @device: The name of the special file for the device,
238dbeee392SMarkus Armbruster#          i.e. /dev/ttyS0 on Unix or COM1: on Windows
239dbeee392SMarkus Armbruster#
240dbeee392SMarkus Armbruster# Since: 1.4
241dbeee392SMarkus Armbruster##
242b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevHostdev',
243b0ddeba2SMarc-André Lureau  'data': { 'device': 'str' },
244dbeee392SMarkus Armbruster  'base': 'ChardevCommon' }
245dbeee392SMarkus Armbruster
246dbeee392SMarkus Armbruster##
247dbeee392SMarkus Armbruster# @ChardevSocket:
248dbeee392SMarkus Armbruster#
249dbeee392SMarkus Armbruster# Configuration info for (stream) socket chardevs.
250dbeee392SMarkus Armbruster#
251dbeee392SMarkus Armbruster# @addr: socket address to listen on (server=true)
252dbeee392SMarkus Armbruster#        or connect to (server=false)
253dbeee392SMarkus Armbruster# @tls-creds: the ID of the TLS credentials object (since 2.6)
254fd4a5fd4SDaniel P. Berrange# @tls-authz: the ID of the QAuthZ authorization object against which
255fd4a5fd4SDaniel P. Berrange#             the client's x509 distinguished name will be validated. This
256fd4a5fd4SDaniel P. Berrange#             object is only resolved at time of use, so can be deleted
257fd4a5fd4SDaniel P. Berrange#             and recreated on the fly while the chardev server is active.
258fd4a5fd4SDaniel P. Berrange#             If missing, it will default to denying access (since 4.0)
259dbeee392SMarkus Armbruster# @server: create server socket (default: true)
260dbeee392SMarkus Armbruster# @wait: wait for incoming connection on server
261dbeee392SMarkus Armbruster#        sockets (default: false).
2620f365e33SMarkus Armbruster#        Silently ignored with server: false.  This use is deprecated.
263dbeee392SMarkus Armbruster# @nodelay: set TCP_NODELAY socket option (default: false)
264dbeee392SMarkus Armbruster# @telnet: enable telnet protocol on server
265dbeee392SMarkus Armbruster#          sockets (default: false)
266dbeee392SMarkus Armbruster# @tn3270: enable tn3270 protocol on server
267dbeee392SMarkus Armbruster#          sockets (default: false) (Since: 2.10)
268981b06e7SJulia Suvorova# @websocket: enable websocket protocol on server
269981b06e7SJulia Suvorova#             sockets (default: false) (Since: 3.1)
270dbeee392SMarkus Armbruster# @reconnect: For a client socket, if a socket is disconnected,
271dbeee392SMarkus Armbruster#             then attempt a reconnect after the given number of seconds.
272dbeee392SMarkus Armbruster#             Setting this to zero disables this function. (default: 0)
273dbeee392SMarkus Armbruster#             (Since: 2.2)
274dbeee392SMarkus Armbruster#
275dbeee392SMarkus Armbruster# Since: 1.4
276dbeee392SMarkus Armbruster##
277b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevSocket',
278b0ddeba2SMarc-André Lureau  'data': { 'addr': 'SocketAddressLegacy',
279dbeee392SMarkus Armbruster            '*tls-creds': 'str',
280fd4a5fd4SDaniel P. Berrange            '*tls-authz'  : 'str',
281dbeee392SMarkus Armbruster            '*server': 'bool',
282dbeee392SMarkus Armbruster            '*wait': 'bool',
283dbeee392SMarkus Armbruster            '*nodelay': 'bool',
284dbeee392SMarkus Armbruster            '*telnet': 'bool',
285dbeee392SMarkus Armbruster            '*tn3270': 'bool',
286981b06e7SJulia Suvorova            '*websocket': 'bool',
287dbeee392SMarkus Armbruster            '*reconnect': 'int' },
288dbeee392SMarkus Armbruster  'base': 'ChardevCommon' }
289dbeee392SMarkus Armbruster
290dbeee392SMarkus Armbruster##
291dbeee392SMarkus Armbruster# @ChardevUdp:
292dbeee392SMarkus Armbruster#
293dbeee392SMarkus Armbruster# Configuration info for datagram socket chardevs.
294dbeee392SMarkus Armbruster#
295dbeee392SMarkus Armbruster# @remote: remote address
296dbeee392SMarkus Armbruster# @local: local address
297dbeee392SMarkus Armbruster#
298dbeee392SMarkus Armbruster# Since: 1.5
299dbeee392SMarkus Armbruster##
300b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevUdp',
301b0ddeba2SMarc-André Lureau  'data': { 'remote': 'SocketAddressLegacy',
302dbeee392SMarkus Armbruster            '*local': 'SocketAddressLegacy' },
303dbeee392SMarkus Armbruster  'base': 'ChardevCommon' }
304dbeee392SMarkus Armbruster
305dbeee392SMarkus Armbruster##
306dbeee392SMarkus Armbruster# @ChardevMux:
307dbeee392SMarkus Armbruster#
308dbeee392SMarkus Armbruster# Configuration info for mux chardevs.
309dbeee392SMarkus Armbruster#
310dbeee392SMarkus Armbruster# @chardev: name of the base chardev.
311dbeee392SMarkus Armbruster#
312dbeee392SMarkus Armbruster# Since: 1.5
313dbeee392SMarkus Armbruster##
314b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevMux',
315b0ddeba2SMarc-André Lureau  'data': { 'chardev': 'str' },
316dbeee392SMarkus Armbruster  'base': 'ChardevCommon' }
317dbeee392SMarkus Armbruster
318dbeee392SMarkus Armbruster##
319dbeee392SMarkus Armbruster# @ChardevStdio:
320dbeee392SMarkus Armbruster#
321dbeee392SMarkus Armbruster# Configuration info for stdio chardevs.
322dbeee392SMarkus Armbruster#
323dbeee392SMarkus Armbruster# @signal: Allow signals (such as SIGINT triggered by ^C)
3246deb20f6SKevin Wolf#          be delivered to qemu.  Default: true.
325dbeee392SMarkus Armbruster#
326dbeee392SMarkus Armbruster# Since: 1.5
327dbeee392SMarkus Armbruster##
328b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevStdio',
329b0ddeba2SMarc-André Lureau  'data': { '*signal': 'bool' },
330dbeee392SMarkus Armbruster  'base': 'ChardevCommon' }
331dbeee392SMarkus Armbruster
332dbeee392SMarkus Armbruster
333dbeee392SMarkus Armbruster##
334dbeee392SMarkus Armbruster# @ChardevSpiceChannel:
335dbeee392SMarkus Armbruster#
336dbeee392SMarkus Armbruster# Configuration info for spice vm channel chardevs.
337dbeee392SMarkus Armbruster#
338dbeee392SMarkus Armbruster# @type: kind of channel (for example vdagent).
339dbeee392SMarkus Armbruster#
340dbeee392SMarkus Armbruster# Since: 1.5
341dbeee392SMarkus Armbruster##
342b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevSpiceChannel',
343b0ddeba2SMarc-André Lureau  'data': { 'type': 'str' },
344fd9dda3bSMarc-André Lureau  'base': 'ChardevCommon',
3458a9f1e1dSMarc-André Lureau  'if': 'CONFIG_SPICE' }
346dbeee392SMarkus Armbruster
347dbeee392SMarkus Armbruster##
348dbeee392SMarkus Armbruster# @ChardevSpicePort:
349dbeee392SMarkus Armbruster#
350dbeee392SMarkus Armbruster# Configuration info for spice port chardevs.
351dbeee392SMarkus Armbruster#
352dbeee392SMarkus Armbruster# @fqdn: name of the channel (see docs/spice-port-fqdn.txt)
353dbeee392SMarkus Armbruster#
354dbeee392SMarkus Armbruster# Since: 1.5
355dbeee392SMarkus Armbruster##
356b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevSpicePort',
357b0ddeba2SMarc-André Lureau  'data': { 'fqdn': 'str' },
358fd9dda3bSMarc-André Lureau  'base': 'ChardevCommon',
3598a9f1e1dSMarc-André Lureau  'if': 'CONFIG_SPICE' }
360dbeee392SMarkus Armbruster
361dbeee392SMarkus Armbruster##
362*3e301c8dSMarc-André Lureau# @ChardevDBus:
363*3e301c8dSMarc-André Lureau#
364*3e301c8dSMarc-André Lureau# Configuration info for DBus chardevs.
365*3e301c8dSMarc-André Lureau#
366*3e301c8dSMarc-André Lureau# @name: name of the channel (following docs/spice-port-fqdn.txt)
367*3e301c8dSMarc-André Lureau#
368*3e301c8dSMarc-André Lureau# Since: 7.0
369*3e301c8dSMarc-André Lureau##
370*3e301c8dSMarc-André Lureau{ 'struct': 'ChardevDBus',
371*3e301c8dSMarc-André Lureau  'data': { 'name': 'str' },
372*3e301c8dSMarc-André Lureau  'base': 'ChardevCommon',
373*3e301c8dSMarc-André Lureau  'if': 'CONFIG_DBUS_DISPLAY' }
374*3e301c8dSMarc-André Lureau
375*3e301c8dSMarc-André Lureau##
376dbeee392SMarkus Armbruster# @ChardevVC:
377dbeee392SMarkus Armbruster#
378dbeee392SMarkus Armbruster# Configuration info for virtual console chardevs.
379dbeee392SMarkus Armbruster#
380dbeee392SMarkus Armbruster# @width:  console width,  in pixels
381dbeee392SMarkus Armbruster# @height: console height, in pixels
382dbeee392SMarkus Armbruster# @cols:   console width,  in chars
383dbeee392SMarkus Armbruster# @rows:   console height, in chars
384dbeee392SMarkus Armbruster#
385dbeee392SMarkus Armbruster# Since: 1.5
386dbeee392SMarkus Armbruster##
387b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevVC',
388b0ddeba2SMarc-André Lureau  'data': { '*width': 'int',
389dbeee392SMarkus Armbruster            '*height': 'int',
390dbeee392SMarkus Armbruster            '*cols': 'int',
391dbeee392SMarkus Armbruster            '*rows': 'int' },
392dbeee392SMarkus Armbruster  'base': 'ChardevCommon' }
393dbeee392SMarkus Armbruster
394dbeee392SMarkus Armbruster##
395dbeee392SMarkus Armbruster# @ChardevRingbuf:
396dbeee392SMarkus Armbruster#
397dbeee392SMarkus Armbruster# Configuration info for ring buffer chardevs.
398dbeee392SMarkus Armbruster#
399dbeee392SMarkus Armbruster# @size: ring buffer size, must be power of two, default is 65536
400dbeee392SMarkus Armbruster#
401dbeee392SMarkus Armbruster# Since: 1.5
402dbeee392SMarkus Armbruster##
403b0ddeba2SMarc-André Lureau{ 'struct': 'ChardevRingbuf',
404b0ddeba2SMarc-André Lureau  'data': { '*size': 'int' },
405dbeee392SMarkus Armbruster  'base': 'ChardevCommon' }
406dbeee392SMarkus Armbruster
407dbeee392SMarkus Armbruster##
408de74a22cSGerd Hoffmann# @ChardevQemuVDAgent:
409de74a22cSGerd Hoffmann#
410de74a22cSGerd Hoffmann# Configuration info for qemu vdagent implementation.
411de74a22cSGerd Hoffmann#
41256081919SGerd Hoffmann# @mouse: enable/disable mouse, default is enabled.
413f0349f4dSGerd Hoffmann# @clipboard: enable/disable clipboard, default is disabled.
41456081919SGerd Hoffmann#
415de74a22cSGerd Hoffmann# Since: 6.1
416de74a22cSGerd Hoffmann#
417de74a22cSGerd Hoffmann##
418de74a22cSGerd Hoffmann{ 'struct': 'ChardevQemuVDAgent',
419f0349f4dSGerd Hoffmann  'data': { '*mouse': 'bool',
420f0349f4dSGerd Hoffmann            '*clipboard': 'bool' },
421de74a22cSGerd Hoffmann  'base': 'ChardevCommon',
4228a9f1e1dSMarc-André Lureau  'if': 'CONFIG_SPICE_PROTOCOL' }
423de74a22cSGerd Hoffmann
424de74a22cSGerd Hoffmann##
4253218c0e9SMarkus Armbruster# @ChardevBackendKind:
4263218c0e9SMarkus Armbruster#
4273218c0e9SMarkus Armbruster# @pipe: Since 1.5
4283218c0e9SMarkus Armbruster# @udp: Since 1.5
4293218c0e9SMarkus Armbruster# @mux: Since 1.5
4303218c0e9SMarkus Armbruster# @msmouse: Since 1.5
4313218c0e9SMarkus Armbruster# @wctablet: Since 2.9
4323218c0e9SMarkus Armbruster# @braille: Since 1.5
4333218c0e9SMarkus Armbruster# @testdev: Since 2.2
4343218c0e9SMarkus Armbruster# @stdio: Since 1.5
4353218c0e9SMarkus Armbruster# @console: Since 1.5
4363218c0e9SMarkus Armbruster# @spicevmc: Since 1.5
4373218c0e9SMarkus Armbruster# @spiceport: Since 1.5
4383218c0e9SMarkus Armbruster# @qemu-vdagent: Since 6.1
439*3e301c8dSMarc-André Lureau# @dbus: Since 7.0
4403218c0e9SMarkus Armbruster# @vc: v1.5
4413218c0e9SMarkus Armbruster# @ringbuf: Since 1.6
4423218c0e9SMarkus Armbruster# @memory: Since 1.5
4433218c0e9SMarkus Armbruster#
4443218c0e9SMarkus Armbruster# Since: 1.4
4453218c0e9SMarkus Armbruster##
4463218c0e9SMarkus Armbruster{ 'enum': 'ChardevBackendKind',
4473218c0e9SMarkus Armbruster  'data': [ 'file',
4483218c0e9SMarkus Armbruster            'serial',
4493218c0e9SMarkus Armbruster            'parallel',
4503218c0e9SMarkus Armbruster            'pipe',
4513218c0e9SMarkus Armbruster            'socket',
4523218c0e9SMarkus Armbruster            'udp',
4533218c0e9SMarkus Armbruster            'pty',
4543218c0e9SMarkus Armbruster            'null',
4553218c0e9SMarkus Armbruster            'mux',
4563218c0e9SMarkus Armbruster            'msmouse',
4573218c0e9SMarkus Armbruster            'wctablet',
4583218c0e9SMarkus Armbruster            'braille',
4593218c0e9SMarkus Armbruster            'testdev',
4603218c0e9SMarkus Armbruster            'stdio',
4613218c0e9SMarkus Armbruster            'console',
4623218c0e9SMarkus Armbruster            { 'name': 'spicevmc', 'if': 'CONFIG_SPICE' },
4633218c0e9SMarkus Armbruster            { 'name': 'spiceport', 'if': 'CONFIG_SPICE' },
4643218c0e9SMarkus Armbruster            { 'name': 'qemu-vdagent', 'if': 'CONFIG_SPICE_PROTOCOL' },
465*3e301c8dSMarc-André Lureau            { 'name': 'dbus', 'if': 'CONFIG_DBUS_DISPLAY' },
4663218c0e9SMarkus Armbruster            'vc',
4673218c0e9SMarkus Armbruster            'ringbuf',
4683218c0e9SMarkus Armbruster            # next one is just for compatibility
4693218c0e9SMarkus Armbruster            'memory' ] }
4703218c0e9SMarkus Armbruster
4713218c0e9SMarkus Armbruster##
4723218c0e9SMarkus Armbruster# @ChardevFileWrapper:
4733218c0e9SMarkus Armbruster#
4743218c0e9SMarkus Armbruster# Since: 1.4
4753218c0e9SMarkus Armbruster##
4763218c0e9SMarkus Armbruster{ 'struct': 'ChardevFileWrapper',
4773218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevFile' } }
4783218c0e9SMarkus Armbruster
4793218c0e9SMarkus Armbruster##
4803218c0e9SMarkus Armbruster# @ChardevHostdevWrapper:
4813218c0e9SMarkus Armbruster#
4823218c0e9SMarkus Armbruster# Since: 1.4
4833218c0e9SMarkus Armbruster##
4843218c0e9SMarkus Armbruster{ 'struct': 'ChardevHostdevWrapper',
4853218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevHostdev' } }
4863218c0e9SMarkus Armbruster
4873218c0e9SMarkus Armbruster##
4883218c0e9SMarkus Armbruster# @ChardevSocketWrapper:
4893218c0e9SMarkus Armbruster#
4903218c0e9SMarkus Armbruster# Since: 1.4
4913218c0e9SMarkus Armbruster##
4923218c0e9SMarkus Armbruster{ 'struct': 'ChardevSocketWrapper',
4933218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevSocket' } }
4943218c0e9SMarkus Armbruster
4953218c0e9SMarkus Armbruster##
4963218c0e9SMarkus Armbruster# @ChardevUdpWrapper:
4973218c0e9SMarkus Armbruster#
4983218c0e9SMarkus Armbruster# Since: 1.5
4993218c0e9SMarkus Armbruster##
5003218c0e9SMarkus Armbruster{ 'struct': 'ChardevUdpWrapper',
5013218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevUdp' } }
5023218c0e9SMarkus Armbruster
5033218c0e9SMarkus Armbruster##
5043218c0e9SMarkus Armbruster# @ChardevCommonWrapper:
5053218c0e9SMarkus Armbruster#
5063218c0e9SMarkus Armbruster# Since: 2.6
5073218c0e9SMarkus Armbruster##
5083218c0e9SMarkus Armbruster{ 'struct': 'ChardevCommonWrapper',
5093218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevCommon' } }
5103218c0e9SMarkus Armbruster
5113218c0e9SMarkus Armbruster##
5123218c0e9SMarkus Armbruster# @ChardevMuxWrapper:
5133218c0e9SMarkus Armbruster#
5143218c0e9SMarkus Armbruster# Since: 1.5
5153218c0e9SMarkus Armbruster##
5163218c0e9SMarkus Armbruster{ 'struct': 'ChardevMuxWrapper',
5173218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevMux' } }
5183218c0e9SMarkus Armbruster
5193218c0e9SMarkus Armbruster##
5203218c0e9SMarkus Armbruster# @ChardevStdioWrapper:
5213218c0e9SMarkus Armbruster#
5223218c0e9SMarkus Armbruster# Since: 1.5
5233218c0e9SMarkus Armbruster##
5243218c0e9SMarkus Armbruster{ 'struct': 'ChardevStdioWrapper',
5253218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevStdio' } }
5263218c0e9SMarkus Armbruster
5273218c0e9SMarkus Armbruster##
5283218c0e9SMarkus Armbruster# @ChardevSpiceChannelWrapper:
5293218c0e9SMarkus Armbruster#
5303218c0e9SMarkus Armbruster# Since: 1.5
5313218c0e9SMarkus Armbruster##
5323218c0e9SMarkus Armbruster{ 'struct': 'ChardevSpiceChannelWrapper',
5333218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevSpiceChannel' },
5343218c0e9SMarkus Armbruster  'if': 'CONFIG_SPICE' }
5353218c0e9SMarkus Armbruster
5363218c0e9SMarkus Armbruster##
5373218c0e9SMarkus Armbruster# @ChardevSpicePortWrapper:
5383218c0e9SMarkus Armbruster#
5393218c0e9SMarkus Armbruster# Since: 1.5
5403218c0e9SMarkus Armbruster##
5413218c0e9SMarkus Armbruster{ 'struct': 'ChardevSpicePortWrapper',
5423218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevSpicePort' },
5433218c0e9SMarkus Armbruster  'if': 'CONFIG_SPICE' }
5443218c0e9SMarkus Armbruster
5453218c0e9SMarkus Armbruster##
5463218c0e9SMarkus Armbruster# @ChardevQemuVDAgentWrapper:
5473218c0e9SMarkus Armbruster#
5483218c0e9SMarkus Armbruster# Since: 6.1
5493218c0e9SMarkus Armbruster##
5503218c0e9SMarkus Armbruster{ 'struct': 'ChardevQemuVDAgentWrapper',
5513218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevQemuVDAgent' },
5523218c0e9SMarkus Armbruster  'if': 'CONFIG_SPICE_PROTOCOL' }
5533218c0e9SMarkus Armbruster
5543218c0e9SMarkus Armbruster##
555*3e301c8dSMarc-André Lureau# @ChardevDBusWrapper:
556*3e301c8dSMarc-André Lureau#
557*3e301c8dSMarc-André Lureau# Since: 7.0
558*3e301c8dSMarc-André Lureau##
559*3e301c8dSMarc-André Lureau{ 'struct': 'ChardevDBusWrapper',
560*3e301c8dSMarc-André Lureau  'data': { 'data': 'ChardevDBus' },
561*3e301c8dSMarc-André Lureau  'if': 'CONFIG_DBUS_DISPLAY' }
562*3e301c8dSMarc-André Lureau
563*3e301c8dSMarc-André Lureau##
5643218c0e9SMarkus Armbruster# @ChardevVCWrapper:
5653218c0e9SMarkus Armbruster#
5663218c0e9SMarkus Armbruster# Since: 1.5
5673218c0e9SMarkus Armbruster##
5683218c0e9SMarkus Armbruster{ 'struct': 'ChardevVCWrapper',
5693218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevVC' } }
5703218c0e9SMarkus Armbruster
5713218c0e9SMarkus Armbruster##
5723218c0e9SMarkus Armbruster# @ChardevRingbufWrapper:
5733218c0e9SMarkus Armbruster#
5743218c0e9SMarkus Armbruster# Since: 1.5
5753218c0e9SMarkus Armbruster##
5763218c0e9SMarkus Armbruster{ 'struct': 'ChardevRingbufWrapper',
5773218c0e9SMarkus Armbruster  'data': { 'data': 'ChardevRingbuf' } }
5783218c0e9SMarkus Armbruster
5793218c0e9SMarkus Armbruster##
580dbeee392SMarkus Armbruster# @ChardevBackend:
581dbeee392SMarkus Armbruster#
582dbeee392SMarkus Armbruster# Configuration info for the new chardev backend.
583dbeee392SMarkus Armbruster#
5843218c0e9SMarkus Armbruster# Since: 1.4
585dbeee392SMarkus Armbruster##
586b0ddeba2SMarc-André Lureau{ 'union': 'ChardevBackend',
5873218c0e9SMarkus Armbruster  'base': { 'type': 'ChardevBackendKind' },
5883218c0e9SMarkus Armbruster  'discriminator': 'type',
5893218c0e9SMarkus Armbruster  'data': { 'file': 'ChardevFileWrapper',
5903218c0e9SMarkus Armbruster            'serial': 'ChardevHostdevWrapper',
5913218c0e9SMarkus Armbruster            'parallel': 'ChardevHostdevWrapper',
5923218c0e9SMarkus Armbruster            'pipe': 'ChardevHostdevWrapper',
5933218c0e9SMarkus Armbruster            'socket': 'ChardevSocketWrapper',
5943218c0e9SMarkus Armbruster            'udp': 'ChardevUdpWrapper',
5953218c0e9SMarkus Armbruster            'pty': 'ChardevCommonWrapper',
5963218c0e9SMarkus Armbruster            'null': 'ChardevCommonWrapper',
5973218c0e9SMarkus Armbruster            'mux': 'ChardevMuxWrapper',
5983218c0e9SMarkus Armbruster            'msmouse': 'ChardevCommonWrapper',
5993218c0e9SMarkus Armbruster            'wctablet': 'ChardevCommonWrapper',
6003218c0e9SMarkus Armbruster            'braille': 'ChardevCommonWrapper',
6013218c0e9SMarkus Armbruster            'testdev': 'ChardevCommonWrapper',
6023218c0e9SMarkus Armbruster            'stdio': 'ChardevStdioWrapper',
6033218c0e9SMarkus Armbruster            'console': 'ChardevCommonWrapper',
6043218c0e9SMarkus Armbruster            'spicevmc': { 'type': 'ChardevSpiceChannelWrapper',
6058a9f1e1dSMarc-André Lureau                          'if': 'CONFIG_SPICE' },
6063218c0e9SMarkus Armbruster            'spiceport': { 'type': 'ChardevSpicePortWrapper',
6078a9f1e1dSMarc-André Lureau                           'if': 'CONFIG_SPICE' },
6083218c0e9SMarkus Armbruster            'qemu-vdagent': { 'type': 'ChardevQemuVDAgentWrapper',
6098a9f1e1dSMarc-André Lureau                              'if': 'CONFIG_SPICE_PROTOCOL' },
610*3e301c8dSMarc-André Lureau            'dbus': { 'type': 'ChardevDBusWrapper',
611*3e301c8dSMarc-André Lureau                      'if': 'CONFIG_DBUS_DISPLAY' },
6123218c0e9SMarkus Armbruster            'vc': 'ChardevVCWrapper',
6133218c0e9SMarkus Armbruster            'ringbuf': 'ChardevRingbufWrapper',
614dbeee392SMarkus Armbruster            # next one is just for compatibility
6153218c0e9SMarkus Armbruster            'memory': 'ChardevRingbufWrapper' } }
616dbeee392SMarkus Armbruster
617dbeee392SMarkus Armbruster##
618dbeee392SMarkus Armbruster# @ChardevReturn:
619dbeee392SMarkus Armbruster#
620dbeee392SMarkus Armbruster# Return info about the chardev backend just created.
621dbeee392SMarkus Armbruster#
622dbeee392SMarkus Armbruster# @pty: name of the slave pseudoterminal device, present if
623dbeee392SMarkus Armbruster#       and only if a chardev of type 'pty' was created
624dbeee392SMarkus Armbruster#
625dbeee392SMarkus Armbruster# Since: 1.4
626dbeee392SMarkus Armbruster##
627b0ddeba2SMarc-André Lureau{ 'struct' : 'ChardevReturn',
628b0ddeba2SMarc-André Lureau  'data': { '*pty': 'str' } }
629dbeee392SMarkus Armbruster
630dbeee392SMarkus Armbruster##
631dbeee392SMarkus Armbruster# @chardev-add:
632dbeee392SMarkus Armbruster#
633dbeee392SMarkus Armbruster# Add a character device backend
634dbeee392SMarkus Armbruster#
635dbeee392SMarkus Armbruster# @id: the chardev's ID, must be unique
636dbeee392SMarkus Armbruster# @backend: backend type and parameters
637dbeee392SMarkus Armbruster#
638dbeee392SMarkus Armbruster# Returns: ChardevReturn.
639dbeee392SMarkus Armbruster#
640dbeee392SMarkus Armbruster# Since: 1.4
641dbeee392SMarkus Armbruster#
642dbeee392SMarkus Armbruster# Example:
643dbeee392SMarkus Armbruster#
644dbeee392SMarkus Armbruster# -> { "execute" : "chardev-add",
645dbeee392SMarkus Armbruster#      "arguments" : { "id" : "foo",
646dbeee392SMarkus Armbruster#                      "backend" : { "type" : "null", "data" : {} } } }
647dbeee392SMarkus Armbruster# <- { "return": {} }
648dbeee392SMarkus Armbruster#
649dbeee392SMarkus Armbruster# -> { "execute" : "chardev-add",
650dbeee392SMarkus Armbruster#      "arguments" : { "id" : "bar",
651dbeee392SMarkus Armbruster#                      "backend" : { "type" : "file",
652dbeee392SMarkus Armbruster#                                    "data" : { "out" : "/tmp/bar.log" } } } }
653dbeee392SMarkus Armbruster# <- { "return": {} }
654dbeee392SMarkus Armbruster#
655dbeee392SMarkus Armbruster# -> { "execute" : "chardev-add",
656dbeee392SMarkus Armbruster#      "arguments" : { "id" : "baz",
657dbeee392SMarkus Armbruster#                      "backend" : { "type" : "pty", "data" : {} } } }
658dbeee392SMarkus Armbruster# <- { "return": { "pty" : "/dev/pty/42" } }
659dbeee392SMarkus Armbruster#
660dbeee392SMarkus Armbruster##
661b0ddeba2SMarc-André Lureau{ 'command': 'chardev-add',
662b0ddeba2SMarc-André Lureau  'data': { 'id': 'str',
663dbeee392SMarkus Armbruster            'backend': 'ChardevBackend' },
664dbeee392SMarkus Armbruster  'returns': 'ChardevReturn' }
665dbeee392SMarkus Armbruster
666dbeee392SMarkus Armbruster##
667dbeee392SMarkus Armbruster# @chardev-change:
668dbeee392SMarkus Armbruster#
669dbeee392SMarkus Armbruster# Change a character device backend
670dbeee392SMarkus Armbruster#
671dbeee392SMarkus Armbruster# @id: the chardev's ID, must exist
672dbeee392SMarkus Armbruster# @backend: new backend type and parameters
673dbeee392SMarkus Armbruster#
674dbeee392SMarkus Armbruster# Returns: ChardevReturn.
675dbeee392SMarkus Armbruster#
676dbeee392SMarkus Armbruster# Since: 2.10
677dbeee392SMarkus Armbruster#
678dbeee392SMarkus Armbruster# Example:
679dbeee392SMarkus Armbruster#
680dbeee392SMarkus Armbruster# -> { "execute" : "chardev-change",
681dbeee392SMarkus Armbruster#      "arguments" : { "id" : "baz",
682dbeee392SMarkus Armbruster#                      "backend" : { "type" : "pty", "data" : {} } } }
683dbeee392SMarkus Armbruster# <- { "return": { "pty" : "/dev/pty/42" } }
684dbeee392SMarkus Armbruster#
685dbeee392SMarkus Armbruster# -> {"execute" : "chardev-change",
686dbeee392SMarkus Armbruster#     "arguments" : {
687dbeee392SMarkus Armbruster#         "id" : "charchannel2",
688dbeee392SMarkus Armbruster#         "backend" : {
689dbeee392SMarkus Armbruster#             "type" : "socket",
690dbeee392SMarkus Armbruster#             "data" : {
691dbeee392SMarkus Armbruster#                 "addr" : {
692dbeee392SMarkus Armbruster#                     "type" : "unix" ,
693dbeee392SMarkus Armbruster#                     "data" : {
694dbeee392SMarkus Armbruster#                         "path" : "/tmp/charchannel2.socket"
695dbeee392SMarkus Armbruster#                     }
696dbeee392SMarkus Armbruster#                  },
697dbeee392SMarkus Armbruster#                  "server" : true,
698dbeee392SMarkus Armbruster#                  "wait" : false }}}}
699dbeee392SMarkus Armbruster# <- {"return": {}}
700dbeee392SMarkus Armbruster#
701dbeee392SMarkus Armbruster##
702b0ddeba2SMarc-André Lureau{ 'command': 'chardev-change',
703b0ddeba2SMarc-André Lureau  'data': { 'id': 'str',
704dbeee392SMarkus Armbruster            'backend': 'ChardevBackend' },
705dbeee392SMarkus Armbruster  'returns': 'ChardevReturn' }
706dbeee392SMarkus Armbruster
707dbeee392SMarkus Armbruster##
708dbeee392SMarkus Armbruster# @chardev-remove:
709dbeee392SMarkus Armbruster#
710dbeee392SMarkus Armbruster# Remove a character device backend
711dbeee392SMarkus Armbruster#
712dbeee392SMarkus Armbruster# @id: the chardev's ID, must exist and not be in use
713dbeee392SMarkus Armbruster#
714dbeee392SMarkus Armbruster# Returns: Nothing on success
715dbeee392SMarkus Armbruster#
716dbeee392SMarkus Armbruster# Since: 1.4
717dbeee392SMarkus Armbruster#
718dbeee392SMarkus Armbruster# Example:
719dbeee392SMarkus Armbruster#
720dbeee392SMarkus Armbruster# -> { "execute": "chardev-remove", "arguments": { "id" : "foo" } }
721dbeee392SMarkus Armbruster# <- { "return": {} }
722dbeee392SMarkus Armbruster#
723dbeee392SMarkus Armbruster##
724b0ddeba2SMarc-André Lureau{ 'command': 'chardev-remove',
725b0ddeba2SMarc-André Lureau  'data': { 'id': 'str' } }
726dbeee392SMarkus Armbruster
727dbeee392SMarkus Armbruster##
728dbeee392SMarkus Armbruster# @chardev-send-break:
729dbeee392SMarkus Armbruster#
730dbeee392SMarkus Armbruster# Send a break to a character device
731dbeee392SMarkus Armbruster#
732dbeee392SMarkus Armbruster# @id: the chardev's ID, must exist
733dbeee392SMarkus Armbruster#
734dbeee392SMarkus Armbruster# Returns: Nothing on success
735dbeee392SMarkus Armbruster#
736dbeee392SMarkus Armbruster# Since: 2.10
737dbeee392SMarkus Armbruster#
738dbeee392SMarkus Armbruster# Example:
739dbeee392SMarkus Armbruster#
740dbeee392SMarkus Armbruster# -> { "execute": "chardev-send-break", "arguments": { "id" : "foo" } }
741dbeee392SMarkus Armbruster# <- { "return": {} }
742dbeee392SMarkus Armbruster#
743dbeee392SMarkus Armbruster##
744b0ddeba2SMarc-André Lureau{ 'command': 'chardev-send-break',
745b0ddeba2SMarc-André Lureau  'data': { 'id': 'str' } }
746dbeee392SMarkus Armbruster
747dbeee392SMarkus Armbruster##
748dbeee392SMarkus Armbruster# @VSERPORT_CHANGE:
749dbeee392SMarkus Armbruster#
750dbeee392SMarkus Armbruster# Emitted when the guest opens or closes a virtio-serial port.
751dbeee392SMarkus Armbruster#
752dbeee392SMarkus Armbruster# @id: device identifier of the virtio-serial port
753dbeee392SMarkus Armbruster#
754dbeee392SMarkus Armbruster# @open: true if the guest has opened the virtio-serial port
755dbeee392SMarkus Armbruster#
756382bd1cbSMarkus Armbruster# Note: This event is rate-limited.
757382bd1cbSMarkus Armbruster#
758dbeee392SMarkus Armbruster# Since: 2.1
759dbeee392SMarkus Armbruster#
760dbeee392SMarkus Armbruster# Example:
761dbeee392SMarkus Armbruster#
762dbeee392SMarkus Armbruster# <- { "event": "VSERPORT_CHANGE",
763dbeee392SMarkus Armbruster#      "data": { "id": "channel0", "open": true },
764dbeee392SMarkus Armbruster#      "timestamp": { "seconds": 1401385907, "microseconds": 422329 } }
765dbeee392SMarkus Armbruster#
766dbeee392SMarkus Armbruster##
767dbeee392SMarkus Armbruster{ 'event': 'VSERPORT_CHANGE',
768b0ddeba2SMarc-André Lureau  'data': { 'id': 'str',
769b0ddeba2SMarc-André Lureau            'open': 'bool' } }
770