Roman Penyaev <r.peni...@gmail.com> writes: > This patch implements a new chardev backend `hub` device, which > aggregates input from multiple backend devices and forwards it to a > single frontend device. Additionally, `hub` device takes the output > from the frontend device and sends it back to all the connected > backend devices. This allows for seamless interaction between > different backend devices and a single frontend interface. > > The idea of the change is trivial: keep list of backend devices > (up to 4), init them on demand and forward data buffer back and > forth. > > The following is QEMU command line example: > > -chardev pty,path=/tmp/pty,id=pty0 \ > -chardev vc,id=vc0 \ > -chardev hub,id=hub0,chardevs.0=pty0,chardevs.1=vc0 \ > -device virtconsole,chardev=hub0 \ > -vnc 0.0.0.0:0 > > Which creates 2 backend devices: text virtual console (`vc0`) and a > pseudo TTY (`pty0`) connected to the single virtio hvc console with > the backend aggregator (`hub0`) help. `vc0` renders text to an image, > which can be shared over the VNC protocol. `pty0` is a pseudo TTY > backend which provides biderectional communication to the virtio hvc > console. > > 'chardevs.N' list syntax is used for the sake of compatibility with > the representation of JSON lists in 'key=val' pairs format of the > util/keyval.c, despite the fact that modern QAPI way of parsing, > namely qobject_input_visitor_new_str(), is not used. Choice of keeping > QAPI list syntax may help to smoothly switch to modern parsing in the > future. > > Signed-off-by: Roman Penyaev <r.peni...@gmail.com> > Reviewed-by: "Marc-André Lureau" <marcandre.lur...@redhat.com> > Cc: qemu-devel@nongnu.org
[...] > diff --git a/qapi/char.json b/qapi/char.json > index e04535435034..f02b66c06b3e 100644 > --- a/qapi/char.json > +++ b/qapi/char.json > @@ -332,6 +332,19 @@ > 'data': { 'chardev': 'str' }, > 'base': 'ChardevCommon' } > > +## > +# @ChardevHub: > +# > +# Configuration info for hub chardevs. > +# > +# @chardevs: List of chardev IDs, which should be added to this hub Suggest "IDs to be added". According to the commit message, there's a limit of four chardevs. Better document that here. > +# > +# Since: 10.0 > +## > +{ 'struct': 'ChardevHub', > + 'data': { 'chardevs': ['str'] }, > + 'base': 'ChardevCommon' } > + > ## > # @ChardevStdio: > # > @@ -479,6 +492,8 @@ > # > # @mux: (since 1.5) > # > +# @hub: (since 10.0) > +# > # @msmouse: emulated Microsoft serial mouse (since 1.5) > # > # @wctablet: emulated Wacom Penpartner serial tablet (since 2.9) > @@ -521,6 +536,7 @@ > 'pty', > 'null', > 'mux', > + 'hub', > 'msmouse', > 'wctablet', > { 'name': 'braille', 'if': 'CONFIG_BRLAPI' }, > @@ -595,6 +611,16 @@ > { 'struct': 'ChardevMuxWrapper', > 'data': { 'data': 'ChardevMux' } } > > +## > +# @ChardevHubWrapper: > +# > +# @data: Configuration info for hub chardevs > +# > +# Since: 10.0 > +## > +{ 'struct': 'ChardevHubWrapper', > + 'data': { 'data': 'ChardevHub' } } > + > ## > # @ChardevStdioWrapper: > # > @@ -703,6 +729,7 @@ > 'pty': 'ChardevPtyWrapper', > 'null': 'ChardevCommonWrapper', > 'mux': 'ChardevMuxWrapper', > + 'hub': 'ChardevHubWrapper', > 'msmouse': 'ChardevCommonWrapper', > 'wctablet': 'ChardevCommonWrapper', > 'braille': { 'type': 'ChardevCommonWrapper', With the doc nits addressed Acked-by: Markus Armbruster <arm...@redhat.com>