cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cdc_mbim.rst (12610B)


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