<div dir="auto">I figured that made most sense :)<div dir="auto"><br></div><div dir="auto">Still, it would be good if we could have a rule to not grab the CDC interface part if the device includes WebUSB functionality. The likelihood of a modem+WebUSB combo is so small that it must fall in the category where potential rare exotic devices combining it must be whitelisted and the rest be left alone.</div><div dir="auto"><br></div><div dir="auto">Also (probably more a generic udev/systemd patch) always give user (or at least browser - if that differentiation is possible) access to WebUSB devices.</div><div dir="auto"><br></div><div dir="auto">Btw: Afaik, Chromebooks are still using modemmanager, where not even experts have easy access to creating udev rules </div><div dir="auto"><br></div><div dir="auto">Br</div><div dir="auto">Lars</div><div dir="auto"><br></div><div dir="auto">Br</div><div dir="auto">Lars</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Jan 10, 2017 17:34, "Dan Williams" <<a href="mailto:dcbw@redhat.com">dcbw@redhat.com</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="quoted-text">On Tue, <a href="tel:2017-01-10" value="+4520170110">2017-01-10</a> at 01:01 +0100, Lars Knudsen wrote:<br>
> On Tue, Jan 10, 2017 at 12:47 AM, Lars Knudsen <<a href="mailto:larsgk@gmail.com">larsgk@gmail.com</a>><br>
> wrote:<br>
><br>
> > A small update:  When the modemmanager finishes probing (~16 secs<br>
> > after<br>
> > connection) data seems to stop flowing in from the WebUSB bulk<br>
> > endpoint<br>
> > also.  It is, however, possible to reconnect and get data again -<br>
> > so I need<br>
> > to see if there should be anything in the mbed firmware causing<br>
> > that<br>
> > behavior or there is some sort of silent reset of<br>
> > interfaces/endpoints<br>
> > happening on the linux side when probing is done.<br>
> ><br>
><br>
> Had to separate the CDC and WebUSB serial control signals completely<br>
> in the<br>
> firmware driver. - now survives<br>
<br>
</div>Yes, if you expose two USB interfaces that can be bound by two<br>
different drivers, then you must expect they could be used<br>
independently.  Not only by MM, but by anything.<br>
<br>
Most devices that expose multiple ttys (eg, modems) treat the ttys as<br>
completely separate at the link layer (serial signals) but commands<br>
issued on separate ttys obviously affect internal firmware state<br>
concurrently.<br>
<font color="#888888"><br>
Dan<br>
</font><div class="elided-text"><br>
> ><br>
> > On Tue, Jan 10, 2017 at 12:11 AM, Lars Knudsen <<a href="mailto:larsgk@gmail.com">larsgk@gmail.com</a>><br>
> > wrote:<br>
> ><br>
> > > I finally managed to make a configuration that *seems* to work<br>
> > > and I<br>
> > > realize that I may have had something else blocking the WebUSB<br>
> > > interface<br>
> > > (2) while modemmanager was communicating with the CDC_ACM<br>
> > > interface (1).<br>
> > ><br>
> > > I made a clean arbitrary VID/PID and get what seems to be a<br>
> > > functioning<br>
> > > WebUSB (now) while modemmanager sends "AT...AT..." to the CDC<br>
> > > interface -<br>
> > > so while I thought the modemmanager grabbed my WebUSB interface<br>
> > > part, it<br>
> > > must have been because of a faulty combination on my side - my<br>
> > > apologies.<br>
> > > WebUSB actually *does* seem to give immediate "bulk" access to a<br>
> > > device<br>
> > > otherwise claimed by modemmanager - a very nice option to have<br>
> > > and sorry<br>
> > > for the confusion I had that modemmanager grabbed more interfaces<br>
> > > than it<br>
> > > should have.<br>
> > ><br>
> > > Still, the original request still stands and please tell me if<br>
> > > it's a<br>
> > > viable path:<br>
> > ><br>
> > > 1.  If a device has a WebUSB descriptor, it's most probably *not*<br>
> > > a modem<br>
> > > - and should in stead be considered a device that in this rare<br>
> > > case needs<br>
> > > to be whitelisted (as modem), while defaulting to not being<br>
> > > it.  This is to<br>
> > > ease the usage from non-browsers to the same hardware, which can<br>
> > > then<br>
> > > happen immediately and not be required to fail and wait over the<br>
> > > modemmanager probing period (30 sec?) - related to modemmanager<br>
> > > 2. If a device has a WebUSB descriptor, at least the interface<br>
> > > linked to<br>
> > > WebUSB should be made accessible in user land by default so no<br>
> > > average user<br>
> > > has to figure out how to do udev rules - related to udev/systemd<br>
> > ><br>
> > > my headers that seem to work now for the case above:<br>
> > ><br>
> > > Bus 002 Device 089: ID 1209:d010 InterBiometrics<br>
> > > Device Descriptor:<br>
> > >   bLength                18<br>
> > >   bDescriptorType         1<br>
> > >   bcdUSB               2.10<br>
> > >   bDeviceClass            0 (Defined at Interface level)<br>
> > >   bDeviceSubClass         0<br>
> > >   bDeviceProtocol         0<br>
> > >   bMaxPacketSize0        64<br>
> > >   idVendor           0x1209 InterBiometrics<br>
> > >   idProduct          0xd010<br>
> > >   bcdDevice            0.01<br>
> > >   iManufacturer           1 empriKit<br>
> > >   iProduct                2 empriKit|MOTION<br>
> > >   iSerial                 3 00.01<br>
> > >   bNumConfigurations      1<br>
> > >   Configuration Descriptor:<br>
> > >     bLength                 9<br>
> > >     bDescriptorType         2<br>
> > >     wTotalLength           90<br>
> > >     bNumInterfaces          3<br>
> > >     bConfigurationValue     1<br>
> > >     iConfiguration          0<br>
> > >     bmAttributes         0xc0<br>
> > >       Self Powered<br>
> > >     MaxPower              <wbr>100mA<br>
> > >     Interface Descriptor:<br>
> > >       bLength                 <wbr>9<br>
> > >       bDescriptorType         <wbr>4<br>
> > >       bInterfaceNumber        <wbr>0<br>
> > >       bAlternateSetting       <wbr>0<br>
> > >       bNumEndpoints           <wbr>1<br>
> > >       bInterfaceClass         <wbr>2 Communications<br>
> > >       bInterfaceSubClass      <wbr>2 Abstract (modem)<br>
> > >       bInterfaceProtocol      <wbr>1 AT-commands (v.25ter)<br>
> > >       iInterface              <wbr>0<br>
> > >       CDC Header:<br>
> > >         bcdCDC               <wbr>1.10<br>
> > >       CDC Call Management:<br>
> > >         bmCapabilities       <wbr>0x03<br>
> > >           call management<br>
> > >           use DataInterface<br>
> > >         bDataInterface        <wbr>  1<br>
> > >       CDC ACM:<br>
> > >         bmCapabilities       <wbr>0x02<br>
> > >           line coding and serial state<br>
> > >       CDC Union:<br>
> > >         bMasterInterface      <wbr>  0<br>
> > >         bSlaveInterface       <wbr>  1<br>
> > >       Endpoint Descriptor:<br>
> > >         bLength               <wbr>  7<br>
> > >         bDescriptorType       <wbr>  5<br>
> > >         bEndpointAddress     <wbr>0x81  EP 1 IN<br>
> > >         bmAttributes          <wbr>  3<br>
> > >           Transfer Type            Interrupt<br>
> > >           Synch Type               None<br>
> > >           Usage Type               Data<br>
> > >         wMaxPacketSize     <wbr>0x0010  1x 16 bytes<br>
> > >         bInterval             <wbr> 16<br>
> > >     Interface Descriptor:<br>
> > >       bLength                 <wbr>9<br>
> > >       bDescriptorType         <wbr>4<br>
> > >       bInterfaceNumber        <wbr>1<br>
> > >       bAlternateSetting       <wbr>0<br>
> > >       bNumEndpoints           <wbr>2<br>
> > >       bInterfaceClass        <wbr>10 CDC Data<br>
> > >       bInterfaceSubClass      <wbr>0 Unused<br>
> > >       bInterfaceProtocol      <wbr>0<br>
> > >       iInterface              <wbr>0<br>
> > >       Endpoint Descriptor:<br>
> > >         bLength               <wbr>  7<br>
> > >         bDescriptorType       <wbr>  5<br>
> > >         bEndpointAddress     <wbr>0x82  EP 2 IN<br>
> > >         bmAttributes          <wbr>  2<br>
> > >           Transfer Type            Bulk<br>
> > >           Synch Type               None<br>
> > >           Usage Type               Data<br>
> > >         wMaxPacketSize     <wbr>0x0040  1x 64 bytes<br>
> > >         bInterval             <wbr>  0<br>
> > >       Endpoint Descriptor:<br>
> > >         bLength               <wbr>  7<br>
> > >         bDescriptorType       <wbr>  5<br>
> > >         bEndpointAddress     <wbr>0x02  EP 2 OUT<br>
> > >         bmAttributes          <wbr>  2<br>
> > >           Transfer Type            Bulk<br>
> > >           Synch Type               None<br>
> > >           Usage Type               Data<br>
> > >         wMaxPacketSize     <wbr>0x0040  1x 64 bytes<br>
> > >         bInterval             <wbr>  0<br>
> > >     Interface Descriptor:<br>
> > >       bLength                 <wbr>9<br>
> > >       bDescriptorType         <wbr>4<br>
> > >       bInterfaceNumber        <wbr>2<br>
> > >       bAlternateSetting       <wbr>0<br>
> > >       bNumEndpoints           <wbr>2<br>
> > >       bInterfaceClass       <wbr>255 Vendor Specific Class<br>
> > >       bInterfaceSubClass      <wbr>0<br>
> > >       bInterfaceProtocol      <wbr>0<br>
> > >       iInterface              <wbr>0<br>
> > >       Endpoint Descriptor:<br>
> > >         bLength               <wbr>  7<br>
> > >         bDescriptorType       <wbr>  5<br>
> > >         bEndpointAddress     <wbr>0x85  EP 5 IN<br>
> > >         bmAttributes          <wbr>  2<br>
> > >           Transfer Type            Bulk<br>
> > >           Synch Type               None<br>
> > >           Usage Type               Data<br>
> > >         wMaxPacketSize     <wbr>0x0040  1x 64 bytes<br>
> > >         bInterval             <wbr>  0<br>
> > >       Endpoint Descriptor:<br>
> > >         bLength               <wbr>  7<br>
> > >         bDescriptorType       <wbr>  5<br>
> > >         bEndpointAddress     <wbr>0x05  EP 5 OUT<br>
> > >         bmAttributes          <wbr>  2<br>
> > >           Transfer Type            Bulk<br>
> > >           Synch Type               None<br>
> > >           Usage Type               Data<br>
> > >         wMaxPacketSize     <wbr>0x0040  1x 64 bytes<br>
> > >         bInterval             <wbr>  0<br>
> > > Binary Object Store Descriptor:<br>
> > >   bLength                 5<br>
> > >   bDescriptorType        15<br>
> > >   wTotalLength           29<br>
> > >   bNumDeviceCaps          1<br>
> > >   ** UNRECOGNIZED:  18 10 05 00 38 b6 08 34 a9 09 a0 47 8b fd a0<br>
> > > 76 88 15<br>
> > > b6 65 00 01 57 02<br>
> > > Device Status:     0x0001<br>
> > >   Self Powered<br>
> > ><br>
> > ><br>
> > > On Mon, Jan 9, 2017 at 10:32 PM, Reilly Grant <<a href="mailto:me@reilly.io">me@reilly.io</a>><br>
> > > wrote:<br>
> > ><br>
> > > > On <a href="tel:2017-01-09" value="+4520170109">2017-01-09</a> 9:55 am, Greg KH wrote:<br>
> > > ><br>
> > > > > On Mon, Jan 09, 2017 at 06:13:04PM +0100, Bjørn Mork wrote:<br>
> > > > ><br>
> > > > > > Greg KH <<a href="mailto:greg@kroah.com">greg@kroah.com</a>> writes:<br>
> > > > > > > On Mon, Jan 09, 2017 at 09:40:59AM +0000, Kenneth Rohde<br>
> > > > > > > Christiansen<br>
> > > > > ><br>
> > > > > > wrote:<br>
> > > > > > > > Web USB can only grab devices which has special Web USB<br>
> > > > > > > > headers. It<br>
> > > > > ><br>
> > > > > > can not<br>
> > > > > > > > grab any USB device.<br>
> > > > > > > ><br>
> > > > > > > > <a href="https://wicg.github.io/webusb/#webusb-descriptors" rel="noreferrer" target="_blank">https://wicg.github.io/webusb/<wbr>#webusb-descriptors</a><br>
> > > > > > ><br>
> > > > > > > Ah, fun :(<br>
> > > > > > ><br>
> > > > > > > So, we can add a quirk into the kernel cdc-acm driver to<br>
> > > > > > > never bind<br>
> > > > > ><br>
> > > > > > to a<br>
> > > > > > > device that has the wusb platform capability descriptor,<br>
> > > > > ><br>
> > > > > > I fail to see why a quirk should be necessary. New device<br>
> > > > > > classes are<br>
> > > > > > expected to use new class/subclass codes distintly<br>
> > > > > > different from<br>
> > > > > > anything handled by existing class drivers.<br>
> > > > > ><br>
> > > > ><br>
> > > > > One would hope, but it seems like they want to piggy-back on<br>
> > > > > the cdc-acm<br>
> > > > > spec.  But I could be totally wrong here, does anyone have<br>
> > > > > the actual<br>
> > > > > descriptor dump of a device anywhere?<br>
> > > > ><br>
> > > ><br>
> > > > We don't want to piggy-back on the CDC-ACM spec. A WebUSB<br>
> > > > device should<br>
> > > > always have its interfaces marked vendor-specific. Below is an<br>
> > > > example of a<br>
> > > > device which implements both a CDC-ACM interface and a WebUSB<br>
> > > > interface. As<br>
> > > > far as I've noticed ModemManager has not interfered with the<br>
> > > > browser<br>
> > > > accessing this device but Lars has observed this behavior. What<br>
> > > > I have had<br>
> > > > to do, however, is add a udev rule which sets ownership on the<br>
> > > > devnode so<br>
> > > > that the browser can access it as an unprivileged user-space<br>
> > > > application.<br>
> > > > What would be nice to have from systemd-udevd is a way to write<br>
> > > > a rule that<br>
> > > > will detect the presence of WebUSB descriptors (which is a BOS<br>
> > > > capability<br>
> > > > descriptor) and set ownership accordingly.<br>
> > > ><br>
> > > > Bus 002 Device 040: ID 2341:8037 Arduino SA<br>
> > > > Device Descriptor:<br>
> > > >   bLength                18<br>
> > > >   bDescriptorType         1<br>
> > > >   bcdUSB               2.10<br>
> > > >   bDeviceClass            0 (Defined at Interface level)<br>
> > > >   bDeviceSubClass         0<br>
> > > >   bDeviceProtocol         0<br>
> > > >   bMaxPacketSize0        64<br>
> > > >   idVendor           0x2341 Arduino SA<br>
> > > >   idProduct          0x8037<br>
> > > >   bcdDevice            1.00<br>
> > > >   iManufacturer           1 Arduino LLC<br>
> > > >   iProduct                2 Arduino Micro<br>
> > > >   iSerial                 3 WUARTR<br>
> > > >   bNumConfigurations      1<br>
> > > >   Configuration Descriptor:<br>
> > > >     bLength                 9<br>
> > > >     bDescriptorType         2<br>
> > > >     wTotalLength           98<br>
> > > >     bNumInterfaces          3<br>
> > > >     bConfigurationValue     1<br>
> > > >     iConfiguration          0<br>
> > > >     bmAttributes         0xa0<br>
> > > >       (Bus Powered)<br>
> > > >       Remote Wakeup<br>
> > > >     MaxPower              <wbr>500mA<br>
> > > >     Interface Association:<br>
> > > >       bLength                 <wbr>8<br>
> > > >       bDescriptorType        <wbr>11<br>
> > > >       bFirstInterface         <wbr>0<br>
> > > >       bInterfaceCount         <wbr>2<br>
> > > >       bFunctionClass          <wbr>2 Communications<br>
> > > >       bFunctionSubClass       <wbr>2 Abstract (modem)<br>
> > > >       bFunctionProtocol       <wbr>1 AT-commands (v.25ter)<br>
> > > >       iFunction               <wbr>0<br>
> > > >     Interface Descriptor:<br>
> > > >       bLength                 <wbr>9<br>
> > > >       bDescriptorType         <wbr>4<br>
> > > >       bInterfaceNumber        <wbr>0<br>
> > > >       bAlternateSetting       <wbr>0<br>
> > > >       bNumEndpoints           <wbr>1<br>
> > > >       bInterfaceClass         <wbr>2 Communications<br>
> > > >       bInterfaceSubClass      <wbr>2 Abstract (modem)<br>
> > > >       bInterfaceProtocol      <wbr>0 None<br>
> > > >       iInterface              <wbr>0<br>
> > > >       CDC Header:<br>
> > > >         bcdCDC               <wbr>1.10<br>
> > > >       CDC Call Management:<br>
> > > >         bmCapabilities       <wbr>0x01<br>
> > > >           call management<br>
> > > >         bDataInterface        <wbr>  1<br>
> > > >       CDC ACM:<br>
> > > >         bmCapabilities       <wbr>0x06<br>
> > > >           sends break<br>
> > > >           line coding and serial state<br>
> > > >       CDC Union:<br>
> > > >         bMasterInterface      <wbr>  0<br>
> > > >         bSlaveInterface       <wbr>  1<br>
> > > >       Endpoint Descriptor:<br>
> > > >         bLength               <wbr>  7<br>
> > > >         bDescriptorType       <wbr>  5<br>
> > > >         bEndpointAddress     <wbr>0x81  EP 1 IN<br>
> > > >         bmAttributes          <wbr>  3<br>
> > > >           Transfer Type            Interrupt<br>
> > > >           Synch Type               None<br>
> > > >           Usage Type               Data<br>
> > > >         wMaxPacketSize     <wbr>0x0010  1x 16 bytes<br>
> > > >         bInterval             <wbr> 64<br>
> > > >     Interface Descriptor:<br>
> > > >       bLength                 <wbr>9<br>
> > > >       bDescriptorType         <wbr>4<br>
> > > >       bInterfaceNumber        <wbr>1<br>
> > > >       bAlternateSetting       <wbr>0<br>
> > > >       bNumEndpoints           <wbr>2<br>
> > > >       bInterfaceClass        <wbr>10 CDC Data<br>
> > > >       bInterfaceSubClass      <wbr>0 Unused<br>
> > > >       bInterfaceProtocol      <wbr>0<br>
> > > >       iInterface              <wbr>0<br>
> > > >       Endpoint Descriptor:<br>
> > > >         bLength               <wbr>  7<br>
> > > >         bDescriptorType       <wbr>  5<br>
> > > >         bEndpointAddress     <wbr>0x02  EP 2 OUT<br>
> > > >         bmAttributes          <wbr>  2<br>
> > > >           Transfer Type            Bulk<br>
> > > >           Synch Type               None<br>
> > > >           Usage Type               Data<br>
> > > >         wMaxPacketSize     <wbr>0x0040  1x 64 bytes<br>
> > > >         bInterval             <wbr>  0<br>
> > > >       Endpoint Descriptor:<br>
> > > >         bLength               <wbr>  7<br>
> > > >         bDescriptorType       <wbr>  5<br>
> > > >         bEndpointAddress     <wbr>0x83  EP 3 IN<br>
> > > >         bmAttributes          <wbr>  2<br>
> > > >           Transfer Type            Bulk<br>
> > > >           Synch Type               None<br>
> > > >           Usage Type               Data<br>
> > > >         wMaxPacketSize     <wbr>0x0040  1x 64 bytes<br>
> > > >         bInterval             <wbr>  0<br>
> > > >     Interface Descriptor:<br>
> > > >       bLength                 <wbr>9<br>
> > > >       bDescriptorType         <wbr>4<br>
> > > >       bInterfaceNumber        <wbr>2<br>
> > > >       bAlternateSetting       <wbr>0<br>
> > > >       bNumEndpoints           <wbr>2<br>
> > > >       bInterfaceClass       <wbr>255 Vendor Specific Class<br>
> > > >       bInterfaceSubClass      <wbr>0<br>
> > > >       bInterfaceProtocol      <wbr>0<br>
> > > >       iInterface              <wbr>0<br>
> > > >       Endpoint Descriptor:<br>
> > > >         bLength               <wbr>  7<br>
> > > >         bDescriptorType       <wbr>  5<br>
> > > >         bEndpointAddress     <wbr>0x04  EP 4 OUT<br>
> > > >         bmAttributes          <wbr>  2<br>
> > > >           Transfer Type            Bulk<br>
> > > >           Synch Type               None<br>
> > > >           Usage Type               Data<br>
> > > >         wMaxPacketSize     <wbr>0x0040  1x 64 bytes<br>
> > > >         bInterval             <wbr>  0<br>
> > > >       Endpoint Descriptor:<br>
> > > >         bLength               <wbr>  7<br>
> > > >         bDescriptorType       <wbr>  5<br>
> > > >         bEndpointAddress     <wbr>0x85  EP 5 IN<br>
> > > >         bmAttributes          <wbr>  2<br>
> > > >           Transfer Type            Bulk<br>
> > > >           Synch Type               None<br>
> > > >           Usage Type               Data<br>
> > > >         wMaxPacketSize     <wbr>0x0040  1x 64 bytes<br>
> > > >         bInterval             <wbr>  0<br>
> > > > Binary Object Store Descriptor:<br>
> > > >   bLength                 5<br>
> > > >   bDescriptorType        15<br>
> > > >   wTotalLength           57<br>
> > > >   bNumDeviceCaps          2<br>
> > > > FIXME: alloc bigger buffer for device capability descriptors<br>
> > > > Device Status:     0x0000<br>
> > > >   (Bus Powered)<br>
> > > ><br>
> > > ><br>
><br>
</div><div class="elided-text">> ______________________________<wbr>_________________<br>
> systemd-devel mailing list<br>
> <a href="mailto:systemd-devel@lists.freedesktop.org">systemd-devel@lists.<wbr>freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/systemd-devel" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/systemd-devel</a><br>
</div></blockquote></div><br></div>