device filtering support

Vitali Lovich vlovich at gmail.com
Sat Feb 4 17:34:21 EST 2012


I'm in agreement, except you may want to change the filtering independently of initialization; i.e. initialize, set filters, at some point later include devices into filter.  That's the reason it's a separate API call in my proposal.

-Vitali

On Feb 4, 2012, at 7:04 AM, Segher Boessenkool wrote:

> Hi guys,
> 
> It seems there are a few separate issues here.  Let me try to
> summarise and untangle it a bit, and propose a few things.
> 
> First, there is "enumeration".  In the context of USB, this is
> often understood to mean walking the bus, sending lots of packets.
> We do not want that, that is the kernel's job, not ours.  The only
> thing libusbx should do is ask the OS "what devices are there?",
> and get some list of identifying information for those devices from
> that.  This might or might not contain some descriptors; it is hard
> to imagine an OS that does not at least give us VID/PID for the
> devices, for example.
> 
> With hotplug (and hot unplug), all we need to immediately handle
> from the OS is again such a device handle ("minimal identifying
> information").
> 
> I understand the libusb core wants to keep all kinds of other info
> cached; we should change that to not ask for that information until
> it is actually needed.  And most of that information should be
> cached, not asked for every time!
> 
> If there is anything in our API that requires us to ask the OS for
> lots more (expensive) information than what is actually used, then
> we need to change things there (add a new cheaper API).  But I've
> seen no evidence for that yet luckily.
> 
> Then, filtering.  There are two aspects to filtering: it can reduce
> the amount of communication between libusbx and the OS (if the OS's
> interfaces allow for that); and it can let the user of the library
> say up front what devices it cares for (so we don't bother it with
> uninteresting devices).
> 
> This can potentially reduce the boilerplate code somewhat, too; it
> isn't so great that every program using libusbx has to do the whole
> dance with libusb_get_device_list() etc. (or use
> libusb_open_device_with_vid_pid() which is completely inadequate
> for anything but toy programs).
> 
> We could add a get_device_list_with_filter() thing; that reduces
> the OS communication, but not the boilerplate.  We could do an
> open_nth_device_with_filter() thing, but that is not ideal if you
> actually want to filter on more things.  It also doesn't help
> listing the devices.
> 
> I propose we do a libusb_init_with_filter() instead; what it should
> do is completely ignore (as far as the user of the library is
> concerned, and as much as possible internally as well) all devices
> that the filter doesn't match.
> 
> I don't have a strong opinion what a filter should look like, except
> it should be *simple*, so the filters people actually use can map
> to the filters the OS let's you filter by in its API.  I would avoid
> "deny" filters unless they are really really useful, since a) again,
> OSes do not give you those, and b) they are expensive (a list of
> allow/deny requires you to walk the whole list always, instead of
> using a hash or whatever).  So maybe just a list of accepted VID/PID,
> and classcode perhaps.  I dunno, let's experiment, and/or investigate
> what real programs want to use.
> 
> 
> Segher
> 




More information about the libusbx mailing list