| 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 a 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 a 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 |