<div dir="ltr">Bjørn,<div><br></div><div>Thanks for the detailed write-up, which answers a lot of questions I originally had.</div><div><br></div><div>Another issue I come across, which I don't know if it matters in practice, is that the VLAN interfaces share the same MTU limit imposed by the main wwan0 interface. There are probably other properties that the VLAN interfaces inherit from the wwan0 interface, which may not be optimal for the DSS usage. There may be something we could do on the kernel driver side.</div>

<div><br></div><div>As for the separation with regular network traffic, I've been experimenting with having the VLAN in its own network namespace, which seems to simplify things quite a bit. Most of time, the VLAN interface isn't used directly, but to create a PTY (and unsurprisingly expose an AT or AT-like interface). We could implement some abstraction (perhaps in libmbim) to simplify such use case of DSS.</div>

<div><br></div><div>Ben<br></div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Apr 10, 2014 at 12:01 PM, Bjørn Mork <span dir="ltr"><<a href="mailto:bjorn@mork.no" target="_blank">bjorn@mork.no</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5">Aleksander Morgado <<a href="mailto:aleksander@aleksander.es">aleksander@aleksander.es</a>> writes:<br>


> On Thu, Apr 10, 2014 at 5:10 PM, Dmytro Milinevskyy<br>
> <<a href="mailto:dmilinevskyy@sequans.com">dmilinevskyy@sequans.com</a>> wrote:<br>
>> I would like to add few cents to Arnaud's email.<br>
>> Is smth preventing modem manager to keep wwan interface up if DSS channels<br>
>> are in use? I expect that modem manager is aware of their presence.<br>
>> In my opinion the link state of wwan interface should always be "up". If<br>
>> there's a need to disable wwan interface the modem manager can flush IP<br>
>> address(es) assigned to it and clean the routing table(which normally should<br>
>> be done automatically).<br>
>> This will eliminate any change to existing kernel drivers.<br>
><br>
> ModemManager won't be aware of DSS channels, as those will (some day,<br>
> when it gets finished) be allocated through the 'mbim-proxy' setup in<br>
> libmbim, not through ModemManager.<br>
><br>
> Also, as a side note, bringing the iface up and keeping it that way<br>
> will be a task of NetworkManager, not ModemManager.<br>
><br>
> I have mixed feelings in to whether this is a task of the kernel (the<br>
> one which enables VLANs for the actual DSS channels in the net<br>
> interface) or a task for userspace (the one actually requesting to<br>
> create the DSS channels). NetworkManager will definitely not know<br>
> whether a DSS channel is ongoing, unless we e.g. link libmbim-glib to<br>
> it and we maintain the list of DSS channels setup in the mbim-proxy.<br>
> It's kind of nasty to do that, though... having it managed by the<br>
> kernel, if easy, would be more clear - at least for userspace, of<br>
> course...<br>
<br>
</div></div>Yes, this is revealing some downsides to the current driver design.  I'd<br>
like to thank Dmytro and Arnaud for bringing up the necessary<br>
discussion. Most of this has so far been just decided by me, without<br>
much discussion at all.  Mostly because noone showed much interest...<br>
Not even Greg S, who wrote the initial version of the cdc_mbim driver,<br>
had much to say about DSS handling.<br>
<br>
The multiplexing nature of MBIM did not fit directly into the current<br>
usbnet driver framework. To support multiplexed IP sessions we needed<br>
some way for userspace to create additional network interfaces on<br>
demand.  And we either had to drop usbnet or implement multiple network<br>
interfaces within the (possibly extended) usbnet framework. usbnet has a<br>
really tight mapping between a single network interface and two bulk<br>
endpoints.  Changing that is not an easy task.  And we really wanted to<br>
reuse cdc_ncm as much as possible, to avoid adding yet-another<br>
implementation of the NCM NTB framing.  cdc_ncm was of course already a<br>
usbnet driver.<br>
<br>
Mapping the MBIM sessions to VLANs seemed like the obvious solution once<br>
the idea turned up. There is an existing kernel API (or several,<br>
actually) for managing VLAN interfaces, and command line tools using<br>
this API is installed on every Linux system out there.  And even more<br>
important: This meant that we could reuse cdc_ncm and the usbnet<br>
framework without adding lots of support for mapping multiple network<br>
devices to the same two bulk endpoints.<br>
<br>
There was a wish that the parent interface (wwan0) to always be mapped<br>
to IP session 0, for simplicity.  The reasoning was: This network<br>
interface will be automatically created, and everything will work<br>
without further setup.  Setting up IP session 0 is the common case,<br>
which should Just Work(tm)<br>
<br>
Now, the drawback is that you have to keep the "session 0" interface up<br>
at all times, even if you only connect higher session IDs.  And if you<br>
snoop on the wwan0 interface, you will not only see the untagged session<br>
0 traffic but also any tagged traffic on any other active session.<br>
<br>
But these issues seemed minor to me...  At least compared to the<br>
additional complexity multiple network interfaces in usbnet would<br>
present.  I still think this is a good compromise for IP sessions.<br>
<br>
Dealing with DSS seemed a lot more difficult for a long time.  I really<br>
did not know how to do that.  I played with driver specific APIs to add<br>
and remove ttys, and I played with automatic tty creation based on MBIM<br>
control channel snooping inside the driver. But none of this really<br>
touched the issue that the transport still depended on the same two bulk<br>
endpoints which were controlled by usbnet and tied to a network device.<br>
And the tty code ended up being horrific hacks (possibly because I was<br>
writing the code...).  In theory it should all be simple.  But when you<br>
add the on demand device creation and the upstream interfacing to a<br>
network device, it soon became ugly and most likely very buggy. I had<br>
exactly *one* device with DSS support to test it on, and that support<br>
was all but standard.<br>
<br>
I ended up preparing the cdc_mbim driver for mainline without any DSS<br>
support at all, thinking that it would be better to add it when we knew<br>
how userspace would want to use it.<br>
<br>
But then I got this brilliant (feel free to interprete that as a sarcasm<br>
:-) idea: We had only used 255 (session 0 is untagged) of our 4094<br>
VLANs.  Why not just map the DSS sessions to 256 other VLANs?  Yes, I<br>
know DSS is defined as "not IP" and that this nowadays pretty much means<br>
"not network traffic". The point is that the VLANs aren't intended as<br>
the DSS session endpoints.  They are there as a mere "standard" kernel<br>
API for the MBIM userspace tools.  More processing is definetely needed<br>
between the VLAN interfaces and whatever userspace consumers we have,<br>
whether those are minicom or gpsd or something completely different.  As<br>
noted this API choice ends up requiring dummy ethernet headers, which<br>
must be added and removed.<br>
<br>
The advantages of the VLAN approach for DSS were many:<br>
- Simple and existing API for adding and removing the kernel interfaces.<br>
- Very easy integration with the usbnet transmit and receive code.<br>
- Flexible use, supporting *any* type of DSS, not only applications<br>
  where ttys are the primary kernel interface.<br>
- Keeping frame boundaries intact from device to userspace, supporting<br>
  DSS use cases where that might matter.<br>
<br>
The downsides are as have been mentioned:<br>
- dependency on the parent wwan0 interface, which belongs to IP session 0<br>
  management<br>
- odd userspace interface, requiring dummy ethernet headers to be added<br>
  and stripped in userspace<br>
<br>
Of these, the dependecy on wwan0 is by far the worst IMHO.  And I would<br>
have loved to just "fix" that in the driver.  But when Arnaud first made<br>
me think about this, I realized that it wasn't really me who added<br>
that... It's really an inheritage of the multiplexing protocol.  There<br>
is no way you are going to transport those DSS fragments without<br>
cooperating with all the other users of the two bulk endpoints on the<br>
MBIM data interface.  There just has to be some top level policy manager<br>
here "owning" both the MBIM data and control channels. wwan0 represents<br>
the shared data channel, and /dev/cdc-wdm0 represents the shared control<br>
channel.  Both these resources must be managed by one application to<br>
facilitate resource sharing.<br>
<br>
Yes, we have moved a lot of management stuff from the kernel to<br>
userspace here.  Maybe too much?  It started out as a blueprint of the<br>
qmi_wwan design, but the data multiplexing stuff adds another<br>
dimension.  Maybe we should have let the driver do the resource<br>
management?  But then we would have had to let it manage the control<br>
channel as well.  Which would not have been a good solution, with an<br>
extensible protocol like MBIM.<br>
<br>
I don't think we are going to change much of this now in any case.  We<br>
might be able to add some extra policy around the wwan0 link management<br>
in the driver, to avoid userspace applications not aware of MBIM at all,<br>
like generic DHCP clients, from taking the link down without approval<br>
from the MBIM management application.  But I don't know exactly how to<br>
do that.  And it is just taking some control away from userspace.  Not<br>
sure about that at all.<br>
<br>
I am not in favour of rushing to do anything here. It seems to me that<br>
the kernel currently allows any possible use case we can come up with,<br>
only with a few more gotchas than we wanted. I believe this is still<br>
better than ending up removing support for some use case.  And we do<br>
have to obey the kernel userspace API rules, which severely limits our<br>
ability to change any major bits at this point. We can of course add<br>
stuff and fix bugs, but we cannot really change or remove anything.<br>
<span class=""><font color="#888888"><br>
<br>
Bjørn<br>
</font></span><div class=""><div class="h5">_______________________________________________<br>
libmbim-devel mailing list<br>
<a href="mailto:libmbim-devel@lists.freedesktop.org">libmbim-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/libmbim-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/libmbim-devel</a><br>
</div></div></blockquote></div><br></div></div></div>