123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- cdc_mbim - Driver for CDC MBIM Mobile Broadband modems
- ========================================================
- The cdc_mbim driver supports USB devices conforming to the "Universal
- Serial Bus Communications Class Subclass Specification for Mobile
- Broadband Interface Model" [1], which is a further development of
- "Universal Serial Bus Communications Class Subclass Specifications for
- Network Control Model Devices" [2] optimized for Mobile Broadband
- devices, aka "3G/LTE modems".
- Command Line Parameters
- =======================
- The cdc_mbim driver has no parameters of its own. But the probing
- behaviour for NCM 1.0 backwards compatible MBIM functions (an
- "NCM/MBIM function" as defined in section 3.2 of [1]) is affected
- by a cdc_ncm driver parameter:
- prefer_mbim
- -----------
- Type: Boolean
- Valid Range: N/Y (0-1)
- Default Value: Y (MBIM is preferred)
- This parameter sets the system policy for NCM/MBIM functions. Such
- functions will be handled by either the cdc_ncm driver or the cdc_mbim
- driver depending on the prefer_mbim setting. Setting prefer_mbim=N
- makes the cdc_mbim driver ignore these functions and lets the cdc_ncm
- driver handle them instead.
- The parameter is writable, and can be changed at any time. A manual
- unbind/bind is required to make the change effective for NCM/MBIM
- functions bound to the "wrong" driver
- Basic usage
- ===========
- MBIM functions are inactive when unmanaged. The cdc_mbim driver only
- provides an userspace interface to the MBIM control channel, and will
- not participate in the management of the function. This implies that a
- userspace MBIM management application always is required to enable a
- MBIM function.
- Such userspace applications includes, but are not limited to:
- - mbimcli (included with the libmbim [3] library), and
- - ModemManager [4]
- Establishing a MBIM IP session reequires at least these actions by the
- management application:
- - open the control channel
- - configure network connection settings
- - connect to network
- - configure IP interface
- Management application development
- ----------------------------------
- The driver <-> userspace interfaces are described below. The MBIM
- control channel protocol is described in [1].
- MBIM control channel userspace ABI
- ==================================
- /dev/cdc-wdmX character device
- ------------------------------
- The driver creates a two-way pipe to the MBIM function control channel
- using the cdc-wdm driver as a subdriver. The userspace end of the
- control channel pipe is a /dev/cdc-wdmX character device.
- The cdc_mbim driver does not process or police messages on the control
- channel. The channel is fully delegated to the userspace management
- application. It is therefore up to this application to ensure that it
- complies with all the control channel requirements in [1].
- The cdc-wdmX device is created as a child of the MBIM control
- interface USB device. The character device associated with a specific
- MBIM function can be looked up using sysfs. For example:
- bjorn@nemi:~$ ls /sys/bus/usb/drivers/cdc_mbim/2-4:2.12/usbmisc
- cdc-wdm0
- bjorn@nemi:~$ grep . /sys/bus/usb/drivers/cdc_mbim/2-4:2.12/usbmisc/cdc-wdm0/dev
- 180:0
- USB configuration descriptors
- -----------------------------
- The wMaxControlMessage field of the CDC MBIM functional descriptor
- limits the maximum control message size. The managament application is
- responsible for negotiating a control message size complying with the
- requirements in section 9.3.1 of [1], taking this descriptor field
- into consideration.
- The userspace application can access the CDC MBIM functional
- descriptor of a MBIM function using either of the two USB
- configuration descriptor kernel interfaces described in [6] or [7].
- See also the ioctl documentation below.
- Fragmentation
- -------------
- The userspace application is responsible for all control message
- fragmentation and defragmentaion, as described in section 9.5 of [1].
- /dev/cdc-wdmX write()
- ---------------------
- The MBIM control messages from the management application *must not*
- exceed the negotiated control message size.
- /dev/cdc-wdmX read()
- --------------------
- The management application *must* accept control messages of up the
- negotiated control message size.
- /dev/cdc-wdmX ioctl()
- --------------------
- IOCTL_WDM_MAX_COMMAND: Get Maximum Command Size
- This ioctl returns the wMaxControlMessage field of the CDC MBIM
- functional descriptor for MBIM devices. This is intended as a
- convenience, eliminating the need to parse the USB descriptors from
- userspace.
- #include <stdio.h>
- #include <fcntl.h>
- #include <sys/ioctl.h>
- #include <linux/types.h>
- #include <linux/usb/cdc-wdm.h>
- int main()
- {
- __u16 max;
- int fd = open("/dev/cdc-wdm0", O_RDWR);
- if (!ioctl(fd, IOCTL_WDM_MAX_COMMAND, &max))
- printf("wMaxControlMessage is %d\n", max);
- }
- Custom device services
- ----------------------
- The MBIM specification allows vendors to freely define additional
- services. This is fully supported by the cdc_mbim driver.
- Support for new MBIM services, including vendor specified services, is
- implemented entirely in userspace, like the rest of the MBIM control
- protocol
- New services should be registered in the MBIM Registry [5].
- MBIM data channel userspace ABI
- ===============================
- wwanY network device
- --------------------
- The cdc_mbim driver represents the MBIM data channel as a single
- network device of the "wwan" type. This network device is initially
- mapped to MBIM IP session 0.
- Multiplexed IP sessions (IPS)
- -----------------------------
- MBIM allows multiplexing up to 256 IP sessions over a single USB data
- channel. The cdc_mbim driver models such IP sessions as 802.1q VLAN
- subdevices of the master wwanY device, mapping MBIM IP session Z to
- VLAN ID Z for all values of Z greater than 0.
- The device maximum Z is given in the MBIM_DEVICE_CAPS_INFO structure
- described in section 10.5.1 of [1].
- The userspace management application is responsible for adding new
- VLAN links prior to establishing MBIM IP sessions where the SessionId
- is greater than 0. These links can be added by using the normal VLAN
- kernel interfaces, either ioctl or netlink.
- For example, adding a link for a MBIM IP session with SessionId 3:
- ip link add link wwan0 name wwan0.3 type vlan id 3
- The driver will automatically map the "wwan0.3" network device to MBIM
- IP session 3.
- Device Service Streams (DSS)
- ----------------------------
- MBIM also allows up to 256 non-IP data streams to be multiplexed over
- the same shared USB data channel. The cdc_mbim driver models these
- sessions as another set of 802.1q VLAN subdevices of the master wwanY
- device, mapping MBIM DSS session A to VLAN ID (256 + A) for all values
- of A.
- The device maximum A is given in the MBIM_DEVICE_SERVICES_INFO
- structure described in section 10.5.29 of [1].
- The DSS VLAN subdevices are used as a practical interface between the
- shared MBIM data channel and a MBIM DSS aware userspace application.
- It is not intended to be presented as-is to an end user. The
- assumption is that an userspace application initiating a DSS session
- also takes care of the necessary framing of the DSS data, presenting
- the stream to the end user in an appropriate way for the stream type.
- The network device ABI requires a dummy ethernet header for every DSS
- data frame being transported. The contents of this header is
- arbitrary, with the following exceptions:
- - TX frames using an IP protocol (0x0800 or 0x86dd) will be dropped
- - RX frames will have the protocol field set to ETH_P_802_3 (but will
- not be properly formatted 802.3 frames)
- - RX frames will have the destination address set to the hardware
- address of the master device
- The DSS supporting userspace management application is responsible for
- adding the dummy ethernet header on TX and stripping it on RX.
- This is a simple example using tools commonly available, exporting
- DssSessionId 5 as a pty character device pointed to by a /dev/nmea
- symlink:
- ip link add link wwan0 name wwan0.dss5 type vlan id 261
- ip link set dev wwan0.dss5 up
- socat INTERFACE:wwan0.dss5,type=2 PTY:,echo=0,link=/dev/nmea
- This is only an example, most suitable for testing out a DSS
- service. Userspace applications supporting specific MBIM DSS services
- are expected to use the tools and programming interfaces required by
- that service.
- Note that adding VLAN links for DSS sessions is entirely optional. A
- management application may instead choose to bind a packet socket
- directly to the master network device, using the received VLAN tags to
- map frames to the correct DSS session and adding 18 byte VLAN ethernet
- headers with the appropriate tag on TX. In this case using a socket
- filter is recommended, matching only the DSS VLAN subset. This avoid
- unnecessary copying of unrelated IP session data to userspace. For
- example:
- static struct sock_filter dssfilter[] = {
- /* use special negative offsets to get VLAN tag */
- BPF_STMT(BPF_LD|BPF_B|BPF_ABS, SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
- BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 1, 0, 6), /* true */
- /* verify DSS VLAN range */
- BPF_STMT(BPF_LD|BPF_H|BPF_ABS, SKF_AD_OFF + SKF_AD_VLAN_TAG),
- BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 0, 4), /* 256 is first DSS VLAN */
- BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 512, 3, 0), /* 511 is last DSS VLAN */
- /* verify ethertype */
- BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 2 * ETH_ALEN),
- BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_802_3, 0, 1),
- BPF_STMT(BPF_RET|BPF_K, (u_int)-1), /* accept */
- BPF_STMT(BPF_RET|BPF_K, 0), /* ignore */
- };
- Tagged IP session 0 VLAN
- ------------------------
- As described above, MBIM IP session 0 is treated as special by the
- driver. It is initially mapped to untagged frames on the wwanY
- network device.
- This mapping implies a few restrictions on multiplexed IPS and DSS
- sessions, which may not always be practical:
- - no IPS or DSS session can use a frame size greater than the MTU on
- IP session 0
- - no IPS or DSS session can be in the up state unless the network
- device representing IP session 0 also is up
- These problems can be avoided by optionally making the driver map IP
- session 0 to a VLAN subdevice, similar to all other IP sessions. This
- behaviour is triggered by adding a VLAN link for the magic VLAN ID
- 4094. The driver will then immediately start mapping MBIM IP session
- 0 to this VLAN, and will drop untagged frames on the master wwanY
- device.
- Tip: It might be less confusing to the end user to name this VLAN
- subdevice after the MBIM SessionID instead of the VLAN ID. For
- example:
- ip link add link wwan0 name wwan0.0 type vlan id 4094
- VLAN mapping
- ------------
- Summarizing the cdc_mbim driver mapping described above, we have this
- relationship between VLAN tags on the wwanY network device and MBIM
- sessions on the shared USB data channel:
- VLAN ID MBIM type MBIM SessionID Notes
- ---------------------------------------------------------
- untagged IPS 0 a)
- 1 - 255 IPS 1 - 255 <VLANID>
- 256 - 511 DSS 0 - 255 <VLANID - 256>
- 512 - 4093 b)
- 4094 IPS 0 c)
- a) if no VLAN ID 4094 link exists, else dropped
- b) unsupported VLAN range, unconditionally dropped
- c) if a VLAN ID 4094 link exists, else dropped
- References
- ==========
- [1] USB Implementers Forum, Inc. - "Universal Serial Bus
- Communications Class Subclass Specification for Mobile Broadband
- Interface Model", Revision 1.0 (Errata 1), May 1, 2013
- - http://www.usb.org/developers/docs/devclass_docs/
- [2] USB Implementers Forum, Inc. - "Universal Serial Bus
- Communications Class Subclass Specifications for Network Control
- Model Devices", Revision 1.0 (Errata 1), November 24, 2010
- - http://www.usb.org/developers/docs/devclass_docs/
- [3] libmbim - "a glib-based library for talking to WWAN modems and
- devices which speak the Mobile Interface Broadband Model (MBIM)
- protocol"
- - http://www.freedesktop.org/wiki/Software/libmbim/
- [4] ModemManager - "a DBus-activated daemon which controls mobile
- broadband (2G/3G/4G) devices and connections"
- - http://www.freedesktop.org/wiki/Software/ModemManager/
- [5] "MBIM (Mobile Broadband Interface Model) Registry"
- - http://compliance.usb.org/mbim/
- [6] "/proc/bus/usb filesystem output"
- - Documentation/usb/proc_usb_info.txt
- [7] "/sys/bus/usb/devices/.../descriptors"
- - Documentation/ABI/stable/sysfs-bus-usb
|