All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alon Levy <alevy@redhat.com>
To: Hans de Goede <hdegoede@redhat.com>
Cc: spice-devel@lists.freedesktop.org,
	Gerd Hoffmann <kraxel@redhat.com>,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] Re: [Spice-devel] RFC; usb redirection protocol
Date: Wed, 15 Dec 2010 17:18:21 +0200	[thread overview]
Message-ID: <20101215151820.GE21233@playa.redhat.com> (raw)
In-Reply-To: <4D08B17E.90100@redhat.com>

On Wed, Dec 15, 2010 at 01:15:58PM +0100, Hans de Goede wrote:
> Hi,
> 
> Thanks for taking the time to read all that!
> 
> On 12/13/2010 12:21 PM, Gerd Hoffmann wrote:
> >>Basic packet structure / communication
> >>--------------------------------------
> >>
> >>Each packet exchanged between the vm-host and the usb-host starts
> >>with a usb_redir_header, followed by an optional command specific
> >>header follow by optional additional data.
> >>
> >>The usb_redir_header each packet starts with looks as follows:
> >>
> >>struct usb_redir_header { uint32_t command; uint32_t length; }
> >
> >uint32_t id; ? A reply would then carry the id of the request ...
> >
> 
> That sounds like a good idea (all though for iso streams the packets
> will be only send in one direction).
> 
> >>Given that everything is done over a potentially slow transport in
> >>practice the diferentiating between synchroneous and asynchroneous
> >>commands may seem odd. The difference is how the usb-host will handle
> >>them once received. For synchroneous commands the usb-host will hand
> >>the request over to the host os and then *wait* for a response. This
> >>means that the vm-host is guaranteed to get an "immediate" response.
> >>Where as for asynchroneous commands to usb-host hands the request
> >>over to the host os with the request to let the usb-host process know
> >>when the request is done.
> >
> >Hmm. Looks like you are planning for one tcp stream and one thread (on the usb-host side) for each usb device. That will not work very good for usb-over-vnc because there is a single tcp stream only. We could of course multiplex multiple logical usb connections over vnc, but even then blocking on the usb-host side looks bad as this could disrupt other usb devices forwarded over the same connection.
> 
> The idea is for this protocol to be transport independent (*) so it
> could be one stream, or it could be multiplexed into another transport.
> 
> Assuring that there are not too large latencies, and handling things
> like not blocking for too long when handling multiple devices from the
> same thread are left to the implementation.
> 
> It could be that the implementation decides to not handle synchroneous
> commands synchroneous at all. The main difference I'm trying to make
> here is between commands which do things to end points which cannot
> be done while other packets are in flight (like setting configuration,
> or interface alt setting) and commands (normal packets) of which there
> can be multiple in flight. I'm open to using a different term then
> synchroneous and async here.
> 
> *) Assuming a reliable, ordered transport
> 
> >
> >>usb_redir_report_descriptor ---------------------------
> >>
> >>usb_redir_header.command: usb_redir_report_desciptor
> >>usb_redir_header.length: <sizeof usb device descriptors>
> >>
> >>No command specific header.
> >>
> >>The command specific additional data contains the entire descriptors
> >>for the usb device.
> >>
> >>A packet of this type is send by the usb-host directly after the
> >>hello packet it contains the usb descriptor tables for the usb
> >>device.
> >
> >Device addressing isn't done at all in the protocol, i.e. there is a fixed device <-> connection relation ship?
> >
> 
> The idea is there is a fixed device <-> transport pipe relation ship, yes.
> For the simple tcp server usb-host I plan to implement as first usb-host,
> the device would be specified on the cmdline while starting the server.
> 
> When one wants to use multiple devices, this means starting one usb-server
> per device.
> 
> For things like vnc and spice I assume there will be some sort of control
> channel where usb device management is done. To be more precise I expect
> the vnc client / spice client to have some UI which allows selecting a usb
> device to plug into the virtual machine. And then the client will setup a
> transport for this (reserve a channel within its existing stream) and tell
> the server that it has an usb device at sub channel id #, at which point
> the server will add a new usb redir device to qemu, passing in a transport
> "object" which is connected to this channel.
> 
> >>Please let me know what you think of this.
> >
> >Do you know whenever certain low-level usb ops can work with this?
> >
> 
> I expect most usb devices to work with this, I don't know about
> really weird ones.
> 
> >Specifically iphone firmware flashing was mentioned on the list.
> >
> 
> I think that should work, but that is an interesting case about which
> I don't know enough yet.
> 
> >Also I remember somewhere in the ehci (or xhci?) specs was mentioned
> > with some devices it can be needed to talk to them *before* an bus address is assigned ...
> 
> If some devices need this, and the setup done there cannot be done
> by the client machines os, we loose, as device enumeration and address
> assignment is done at the OS level, and at least under Linux we won't
> get a chance to talk to the device till after it has been assigned an
> address.
> 

I know of devices that will enumerate twice, first as one device, then
after a certain setup exchange as another. But that seems to be covered
by the suggestion here, it will just be identicle to two completely different
transports.

> Regards,
> 
> Hans
> 

  parent reply	other threads:[~2010-12-15 15:18 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-10 14:10 [Qemu-devel] RFC; usb redirection protocol Hans de Goede
2010-12-13 11:21 ` [Qemu-devel] Re: [Spice-devel] " Gerd Hoffmann
2010-12-15 12:15   ` Hans de Goede
2010-12-15 12:20     ` Frédéric Grelot
2010-12-18 16:30       ` Hans de Goede
2010-12-15 15:18     ` Alon Levy [this message]
2010-12-16  8:13       ` Gerd Hoffmann
2010-12-16  8:15     ` Gerd Hoffmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20101215151820.GE21233@playa.redhat.com \
    --to=alevy@redhat.com \
    --cc=hdegoede@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=spice-devel@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.