1.. SPDX-License-Identifier: GPL-2.0
2
3======================================================
4cdc_mbim - Driver for CDC MBIM Mobile Broadband modems
5======================================================
6
7The cdc_mbim driver supports USB devices conforming to the "Universal
8Serial Bus Communications Class Subclass Specification for Mobile
9Broadband Interface Model" [1], which is a further development of
10"Universal Serial Bus Communications Class Subclass Specifications for
11Network Control Model Devices" [2] optimized for Mobile Broadband
12devices, aka "3G/LTE modems".
13
14
15Command Line Parameters
16=======================
17
18The cdc_mbim driver has no parameters of its own.  But the probing
19behaviour for NCM 1.0 backwards compatible MBIM functions (an
20"NCM/MBIM function" as defined in section 3.2 of [1]) is affected
21by a cdc_ncm driver parameter:
22
23prefer_mbim
24-----------
25:Type:          Boolean
26:Valid Range:   N/Y (0-1)
27:Default Value: Y (MBIM is preferred)
28
29This parameter sets the system policy for NCM/MBIM functions.  Such
30functions will be handled by either the cdc_ncm driver or the cdc_mbim
31driver depending on the prefer_mbim setting.  Setting prefer_mbim=N
32makes the cdc_mbim driver ignore these functions and lets the cdc_ncm
33driver handle them instead.
34
35The parameter is writable, and can be changed at any time. A manual
36unbind/bind is required to make the change effective for NCM/MBIM
37functions bound to the "wrong" driver
38
39
40Basic usage
41===========
42
43MBIM functions are inactive when unmanaged. The cdc_mbim driver only
44provides a userspace interface to the MBIM control channel, and will
45not participate in the management of the function. This implies that a
46userspace MBIM management application always is required to enable a
47MBIM function.
48
49Such userspace applications includes, but are not limited to:
50
51 - mbimcli (included with the libmbim [3] library), and
52 - ModemManager [4]
53
54Establishing a MBIM IP session reequires at least these actions by the
55management application:
56
57 - open the control channel
58 - configure network connection settings
59 - connect to network
60 - configure IP interface
61
62Management application development
63----------------------------------
64The driver <-> userspace interfaces are described below.  The MBIM
65control channel protocol is described in [1].
66
67
68MBIM control channel userspace ABI
69==================================
70
71/dev/cdc-wdmX character device
72------------------------------
73The driver creates a two-way pipe to the MBIM function control channel
74using the cdc-wdm driver as a subdriver.  The userspace end of the
75control channel pipe is a /dev/cdc-wdmX character device.
76
77The cdc_mbim driver does not process or police messages on the control
78channel.  The channel is fully delegated to the userspace management
79application.  It is therefore up to this application to ensure that it
80complies with all the control channel requirements in [1].
81
82The cdc-wdmX device is created as a child of the MBIM control
83interface USB device.  The character device associated with a specific
84MBIM function can be looked up using sysfs.  For example::
85
86 bjorn@nemi:~$ ls /sys/bus/usb/drivers/cdc_mbim/2-4:2.12/usbmisc
87 cdc-wdm0
88
89 bjorn@nemi:~$ grep . /sys/bus/usb/drivers/cdc_mbim/2-4:2.12/usbmisc/cdc-wdm0/dev
90 180:0
91
92
93USB configuration descriptors
94-----------------------------
95The wMaxControlMessage field of the CDC MBIM functional descriptor
96limits the maximum control message size. The management application is
97responsible for negotiating a control message size complying with the
98requirements in section 9.3.1 of [1], taking this descriptor field
99into consideration.
100
101The userspace application can access the CDC MBIM functional
102descriptor of a MBIM function using either of the two USB
103configuration descriptor kernel interfaces described in [6] or [7].
104
105See also the ioctl documentation below.
106
107
108Fragmentation
109-------------
110The userspace application is responsible for all control message
111fragmentation and defragmentaion, as described in section 9.5 of [1].
112
113
114/dev/cdc-wdmX write()
115---------------------
116The MBIM control messages from the management application *must not*
117exceed the negotiated control message size.
118
119
120/dev/cdc-wdmX read()
121--------------------
122The management application *must* accept control messages of up the
123negotiated control message size.
124
125
126/dev/cdc-wdmX ioctl()
127---------------------
128IOCTL_WDM_MAX_COMMAND: Get Maximum Command Size
129This ioctl returns the wMaxControlMessage field of the CDC MBIM
130functional descriptor for MBIM devices.  This is intended as a
131convenience, eliminating the need to parse the USB descriptors from
132userspace.
133
134::
135
136	#include <stdio.h>
137	#include <fcntl.h>
138	#include <sys/ioctl.h>
139	#include <linux/types.h>
140	#include <linux/usb/cdc-wdm.h>
141	int main()
142	{
143		__u16 max;
144		int fd = open("/dev/cdc-wdm0", O_RDWR);
145		if (!ioctl(fd, IOCTL_WDM_MAX_COMMAND, &max))
146			printf("wMaxControlMessage is %d\n", max);
147	}
148
149
150Custom device services
151----------------------
152The MBIM specification allows vendors to freely define additional
153services.  This is fully supported by the cdc_mbim driver.
154
155Support for new MBIM services, including vendor specified services, is
156implemented entirely in userspace, like the rest of the MBIM control
157protocol
158
159New services should be registered in the MBIM Registry [5].
160
161
162
163MBIM data channel userspace ABI
164===============================
165
166wwanY network device
167--------------------
168The cdc_mbim driver represents the MBIM data channel as a single
169network device of the "wwan" type. This network device is initially
170mapped to MBIM IP session 0.
171
172
173Multiplexed IP sessions (IPS)
174-----------------------------
175MBIM allows multiplexing up to 256 IP sessions over a single USB data
176channel.  The cdc_mbim driver models such IP sessions as 802.1q VLAN
177subdevices of the master wwanY device, mapping MBIM IP session Z to
178VLAN ID Z for all values of Z greater than 0.
179
180The device maximum Z is given in the MBIM_DEVICE_CAPS_INFO structure
181described in section 10.5.1 of [1].
182
183The userspace management application is responsible for adding new
184VLAN links prior to establishing MBIM IP sessions where the SessionId
185is greater than 0. These links can be added by using the normal VLAN
186kernel interfaces, either ioctl or netlink.
187
188For example, adding a link for a MBIM IP session with SessionId 3::
189
190  ip link add link wwan0 name wwan0.3 type vlan id 3
191
192The driver will automatically map the "wwan0.3" network device to MBIM
193IP session 3.
194
195
196Device Service Streams (DSS)
197----------------------------
198MBIM also allows up to 256 non-IP data streams to be multiplexed over
199the same shared USB data channel.  The cdc_mbim driver models these
200sessions as another set of 802.1q VLAN subdevices of the master wwanY
201device, mapping MBIM DSS session A to VLAN ID (256 + A) for all values
202of A.
203
204The device maximum A is given in the MBIM_DEVICE_SERVICES_INFO
205structure described in section 10.5.29 of [1].
206
207The DSS VLAN subdevices are used as a practical interface between the
208shared MBIM data channel and a MBIM DSS aware userspace application.
209It is not intended to be presented as-is to an end user. The
210assumption is that a userspace application initiating a DSS session
211also takes care of the necessary framing of the DSS data, presenting
212the stream to the end user in an appropriate way for the stream type.
213
214The network device ABI requires a dummy ethernet header for every DSS
215data frame being transported.  The contents of this header is
216arbitrary, with the following exceptions:
217
218 - TX frames using an IP protocol (0x0800 or 0x86dd) will be dropped
219 - RX frames will have the protocol field set to ETH_P_802_3 (but will
220   not be properly formatted 802.3 frames)
221 - RX frames will have the destination address set to the hardware
222   address of the master device
223
224The DSS supporting userspace management application is responsible for
225adding the dummy ethernet header on TX and stripping it on RX.
226
227This is a simple example using tools commonly available, exporting
228DssSessionId 5 as a pty character device pointed to by a /dev/nmea
229symlink::
230
231  ip link add link wwan0 name wwan0.dss5 type vlan id 261
232  ip link set dev wwan0.dss5 up
233  socat INTERFACE:wwan0.dss5,type=2 PTY:,echo=0,link=/dev/nmea
234
235This is only an example, most suitable for testing out a DSS
236service. Userspace applications supporting specific MBIM DSS services
237are expected to use the tools and programming interfaces required by
238that service.
239
240Note that adding VLAN links for DSS sessions is entirely optional.  A
241management application may instead choose to bind a packet socket
242directly to the master network device, using the received VLAN tags to
243map frames to the correct DSS session and adding 18 byte VLAN ethernet
244headers with the appropriate tag on TX.  In this case using a socket
245filter is recommended, matching only the DSS VLAN subset. This avoid
246unnecessary copying of unrelated IP session data to userspace.  For
247example::
248
249  static struct sock_filter dssfilter[] = {
250	/* use special negative offsets to get VLAN tag */
251	BPF_STMT(BPF_LD|BPF_B|BPF_ABS, SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
252	BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 1, 0, 6), /* true */
253
254	/* verify DSS VLAN range */
255	BPF_STMT(BPF_LD|BPF_H|BPF_ABS, SKF_AD_OFF + SKF_AD_VLAN_TAG),
256	BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 0, 4),	/* 256 is first DSS VLAN */
257	BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 512, 3, 0),	/* 511 is last DSS VLAN */
258
259	/* verify ethertype */
260	BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 2 * ETH_ALEN),
261	BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_802_3, 0, 1),
262
263	BPF_STMT(BPF_RET|BPF_K, (u_int)-1),	/* accept */
264	BPF_STMT(BPF_RET|BPF_K, 0),		/* ignore */
265  };
266
267
268
269Tagged IP session 0 VLAN
270------------------------
271As described above, MBIM IP session 0 is treated as special by the
272driver.  It is initially mapped to untagged frames on the wwanY
273network device.
274
275This mapping implies a few restrictions on multiplexed IPS and DSS
276sessions, which may not always be practical:
277
278 - no IPS or DSS session can use a frame size greater than the MTU on
279   IP session 0
280 - no IPS or DSS session can be in the up state unless the network
281   device representing IP session 0 also is up
282
283These problems can be avoided by optionally making the driver map IP
284session 0 to a VLAN subdevice, similar to all other IP sessions.  This
285behaviour is triggered by adding a VLAN link for the magic VLAN ID
2864094.  The driver will then immediately start mapping MBIM IP session
2870 to this VLAN, and will drop untagged frames on the master wwanY
288device.
289
290Tip: It might be less confusing to the end user to name this VLAN
291subdevice after the MBIM SessionID instead of the VLAN ID.  For
292example::
293
294  ip link add link wwan0 name wwan0.0 type vlan id 4094
295
296
297VLAN mapping
298------------
299
300Summarizing the cdc_mbim driver mapping described above, we have this
301relationship between VLAN tags on the wwanY network device and MBIM
302sessions on the shared USB data channel::
303
304  VLAN ID       MBIM type   MBIM SessionID           Notes
305  ---------------------------------------------------------
306  untagged      IPS         0                        a)
307  1 - 255       IPS         1 - 255 <VLANID>
308  256 - 511     DSS         0 - 255 <VLANID - 256>
309  512 - 4093                                         b)
310  4094          IPS         0                        c)
311
312    a) if no VLAN ID 4094 link exists, else dropped
313    b) unsupported VLAN range, unconditionally dropped
314    c) if a VLAN ID 4094 link exists, else dropped
315
316
317
318
319References
320==========
321
322 1) USB Implementers Forum, Inc. - "Universal Serial Bus
323    Communications Class Subclass Specification for Mobile Broadband
324    Interface Model", Revision 1.0 (Errata 1), May 1, 2013
325
326      - http://www.usb.org/developers/docs/devclass_docs/
327
328 2) USB Implementers Forum, Inc. - "Universal Serial Bus
329    Communications Class Subclass Specifications for Network Control
330    Model Devices", Revision 1.0 (Errata 1), November 24, 2010
331
332      - http://www.usb.org/developers/docs/devclass_docs/
333
334 3) libmbim - "a glib-based library for talking to WWAN modems and
335    devices which speak the Mobile Interface Broadband Model (MBIM)
336    protocol"
337
338      - http://www.freedesktop.org/wiki/Software/libmbim/
339
340 4) ModemManager - "a DBus-activated daemon which controls mobile
341    broadband (2G/3G/4G) devices and connections"
342
343      - http://www.freedesktop.org/wiki/Software/ModemManager/
344
345 5) "MBIM (Mobile Broadband Interface Model) Registry"
346
347       - http://compliance.usb.org/mbim/
348
349 6) "/sys/kernel/debug/usb/devices output format"
350
351       - Documentation/driver-api/usb/usb.rst
352
353 7) "/sys/bus/usb/devices/.../descriptors"
354
355       - Documentation/ABI/stable/sysfs-bus-usb
356