Hi Jan,

On 2020-07-02 12:06, Jan Behrens wrote:
On Thu, 2 Jul 2020 11:23:32 +0200
Hans Petter Selasky <[email protected]> wrote:

On 2020-07-02 11:15, Jan Behrens wrote:
On Thu, 2 Jul 2020 10:54:27 +0200
Hans Petter Selasky <[email protected]> wrote:

On 2020-07-02 10:47, Jan Behrens wrote:
But wouldn't both drivers require access to the entries in /dev ?

Yes, user-space drivers would require access to /dev, yes, but kernel
drivers not, like mouse, keyboard, storage, network.

Thus not every user could mess with any USB device, or do I get it
wrong?

A so-called composite USB device may appear like a USB storage device
(kernel driver) and a security token (firefox). Firefox can only grab
the device if you set the proper permissions for /dev of course, but the
reset device IOCTL then also becomes possible, which is why we currently
block it for non-root.

--HPS

Okay, so if I understand it right, the problem is due to devices that
shall be partly accessible by root, and partly by users. Some device
nodes (e.g. /dev/usb/2.2.1 ) while others (e.g. /dev/usr/2.2.2 ) are
limited to root access only. An USB reset always affects all devices
(e.g. also /dev/usb/2.2.2, 2.2.3, etc.), right?

Yes, correct.

Does /dev/usb/2.2.0 (in the given example) represent the device as a
whole, or is it just another subdevice? (What's the correct term for
"subdevice" in this context by the way? I assume "interface"?)



I experienced that /dev/usb/2.2.0 and /dev/usb/2.2.1, 2.2.2, 2.2.3,
etc. get treated differently when I reset the LimeSDR Mini with
"usbconfig -u 2 -a 2 reset". The devices 2.2.1 and up are supposingly
re-created (and have their access rights reset), while the device 2.2.0
maintains any manually changed access rights.


Let me explain, now you are getting me into dirty details :-)

This device is used for all of LibUSB interfaces and gives access to all endpoints:

/dev/usb/X.Y.0

These devices are legacy devices, which allow direct access to the endpoint via the shell. They are there to support the old user-space model FreeBSD had. And they are re-created when you reset/reconfigure a USB device. Actually you can "echo > /dev/usb/X.Y.N" to write directly to an endpoint from user-space. But don't do that unless it is a modem endpoint which support AT commands for example.

/dev/usb/X.Y.[1..15]

Is it correct that 2.2.0 identifies the device as a whole?

Yes, this is correct.


What do you think?

I'm not sure if this is (from a semantic point of view) the best thing
to do. I would say you should only be able to reset a device if you
have been granted access to the device as a whole (including all
interfaces/subdevices/whatever), as the reset seems to affect all of
those.


In FreeBSD and LibUSB there is no such concept. Everything is oriented around interfaces. There is a function to claim an interface, but not the device itself. (man libusb_claim_interface)



That sounds better than adding a sysctl option to me. But I assume that
would require a lot of changes in the code?

If a simple rule can be formulated, I could implement it in the generic
USB kernel code.

--HPS

Regards,
Jan


--HPS
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to "[email protected]"

Reply via email to