How to use LTE modem in QMI mode for WAN connection

Some new 3G/4G dongles use qmi and mbim protocol to establish connection to ISP. For your information, qmi protocol is proprietary protocol by Qualcomm. In contrast to qmi, mbim is more standardized protocol for 3G/4G dongles.

This recipe explains how to setup and configure OpenWrt for using a USB LTE/3g/UMTS-modem for WAN connection, using QMI interface. You may want to checkout the Multiwan package to use this simultaneously with other connections to the internet.

:!: All recent information is valid for Barrier Breaker release and later. Not tested on AA or elder.

Many modern USB dongles could perform in different ways. If your modem provides only AT command interface - please refer to How to use 3g/UMTS USB Dongle for WAN connection. For more information about different protocols used:

If it is possible to switch your modem to provide NDIS interface - then this article if for YOU.

FIXME Add Speed and Performance test results on Modem mode and QMI mode.

:!: 8-) Subjective, solution based on NDIS (QMI mode) works much stable. Faster reconnect. Easy to control and monitor.

You need to switch modem to provide native NDIS interface instead of Modem interface.

:!: Please read about AT commands for your modem.

Once you've done - you can disconnect modem from the PC and connect it to the router.

More recent Modem default CDC_MBIM OR QMI MODE, This is example for the E20 R2.1, EM05, EM06, EM12, EM20, RM500Q and RM510Q modules

YOU CAN USE AT+QCFG=“usbnet” to CHECK USB Driver

If you want to change the USB MODE, you can set the usbnet value

AT+QCFG=“usbnet”,0 GobiNet or QMI_WWAN

AT+QCFG=“usbnet”,2 CDC_MBIM

Than reset the power

1. Install OpenWrt

2. Complete Steps OpenWrt Configuration

Router should be turned on and connected to the Internet to get the needed packages. Please refer to: Internet Connection.

To make use of qmi protocol, package kmod-usb-net-qmi-wwan and uqmi are needed. uqmi is available on both barrier breaker and bleeding edge repository.

  • usb-modeswitch - It will automatically issue a “special” command to the modem for switching it into the “Working” state
  • kmod-mii - Mii driver
  • kmod-usb-net - USB to Ethernet
  • kmod-usb-wdm
  • kmod-usb-net-qmi-wwan
  • uqmi - Control utility

1. Add support for MBIM devices

  • kmod-usb-net-cdc-mbim Kernel module for MBIM Devices
  • umbim MBIM modem utility
opkg update
opkg install kmod-usb-net-cdc-mbim umbim

2. Add support for PC Interface (ttyUSB0) - You need it if you want to send AT commands, for eg. to check your balance by USSD.

  • kmod-usb-serial-option
  • kmod-usb-serial
  • kmod-usb-serial-wwan
opkg update
opkg install kmod-usb-serial-option kmod-usb-serial kmod-usb-serial-wwan

3. Add support for FlashCard of your dongle - refer to: USB Storage

1. Install all the needed packages

opkg update
opkg install usb-modeswitch kmod-mii kmod-usb-net kmod-usb-wdm kmod-usb-net-qmi-wwan uqmi

:!: If your have not enough space on your device - think of installing Rootfs on External Storage (extroot)

:!: Another option is Hardware memory upgrade. Refer to your router Forum thread for possibility and instructions.

2. Reboot the router


3. Check that everything is OK and You got new device:

ls -l /dev/cdc-wdm0

crw-r--r--    1 root     root      180, 176 Oct  1 12:03 /dev/cdc-wdm0

If you have no such device - try to find out what went wrong:

try dmesg to read kernel logs on USB init


or look info about USB devices and interfaces present in the system:

cat /sys/kernel/debug/usb/devices

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  3 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=12d1 ProdID=1506 Rev= 0.00
S:  Manufacturer=Huawei Technologies
S:  Product=HUAWEI Mobile
C:* #Ifs= 3 Cfg#= 1 Atr=c0 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=02 Driver=option
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
I:* If#= 1 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=01 Prot=09 Driver=qmi_wwan
E:  Ad=82(I) Atr=03(Int.) MxPS=  64 Ivl=2ms
I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=08 Driver=qmi_wwan
E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms

See Troubleshooting Section of this page for more information.

Install the package luci-proto-qmi using Luci (System → Software) and configure the modem using LuCi (Network → Interfaces).

You can configure UCI manually using uci command line or text editor.
UCI is supporting qmi network protocol configuration.

:!: The package uqmi must be installed to use QMI protocol.

Name Type Required Default Description
device file path yes (none) QMI device node, typically /dev/cdc-wdm0
apn string yes (none) Used APN
auth string no (none) Authentication type: pap, chap, both, none
username string no (none) Username for PAP/CHAP authentication
password string no (none) Password for PAP/CHAP authentication
pincode number no (none) PIN code to unlock SIM card
delay number no 0 Seconds to wait before trying to interact with the modem (some ZTE modems require up to 30 s.)
modes string no (modem default) Allowed network modes, comma separated list of: all, lte, umts, gsm, cdma, td-scdma
pdptype string no IP Used IP-stack mode, IP (for IPv4), IPV6 (for IPv6) or IPV4V6 (for dual-stack)
profile number no (none) Connection profile to use
dhcp boolean no 1 Whether to use dhcp (default) or uqmi (0) to get IPv4 interface configuration
dhcpv6 boolean no 0 Whether to use dhcp (1) or uqmi (default) to get IPv6 interface configuration
autoconnect boolean no 1
plmn number no (none) First three digits are the mcc (mobile country code) and the last three digits are the mnc (mobile network code), for example if plmn=338020, then the mcc is 338 and the mnc is 020
timeout number no 10 Timeout (in seconds) to wait for SIM operations

Here is a brief help about uqmi command line usage.

No device given
Usage: uqmi <options|actions>
  --single, -s:                     Print output as a single line (for scripts)
  --device=NAME, -d NAME:           Set device name to NAME (required)
  --keep-client-id <name>:          Keep Client ID for service <name>
  --release-client-id <name>:       Release Client ID after exiting
  --mbim, -m                        NAME is an MBIM device with EXT_QMUX support
  --timeout, -t                     response timeout in msecs
Services:                           dms, nas, pds, wds, wms
  --get-versions:                   Get service versions
  --set-client-id <name>,<id>:      Set Client ID for service <name> to <id>
                                    (implies --keep-client-id)
  --get-client-id <name>:           Connect and get Client ID for service <name>
                                    (implies --keep-client-id)
  --sync:                           Release all Client IDs
  --start-network:                  Start network connection (use with options below)
    --apn <apn>:                    Use APN
    --auth-type pap|chap|both|none: Use network authentication type
    --username <name>:              Use network username
    --password <password>:          Use network password
    --ip-family <family>:           Use ip-family for the connection (ipv4, ipv6, unspecified)
    --autoconnect:                  Enable automatic connect/reconnect
    --profile <index>:              Use connection profile
  --stop-network <pdh>:             Stop network connection (use with option below)
    --autoconnect:                  Disable automatic connect/reconnect
  --get-data-status:                Get current data access status
  --set-ip-family <val>:            Set ip-family (ipv4, ipv6, unspecified)
  --set-autoconnect <val>:          Set automatic connect/reconnect (disabled, enabled, paused)
  --get-current-settings:           Get current connection settings
  --get-capabilities:               List device capabilities
  --get-pin-status:                 Get PIN verification status
  --verify-pin1 <pin>:              Verify PIN1
  --verify-pin2 <pin>:              Verify PIN2
  --set-pin1-protection <state>:    Set PIN1 protection state (disabled, enabled)
    --pin <pin>:                    PIN1 needed to change state
  --set-pin2-protection <state>:    Set PIN2 protection state (disabled, enabled)
    --pin <pin2>:                   PIN2 needed to change state
  --change-pin1:                    Change PIN1
    --pin <old pin>:                Current PIN1
    --new-pin <new pin>:            New pin
  --change-pin2:                    Change PIN2
    --pin <old pin>:                Current PIN2
    --new-pin <new pin>:            New pin
  --unblock-pin1:                   Unblock PIN1
    --puk <puk>:                    PUK needed to unblock
    --new-pin <new pin>:            New pin
  --unblock-pin2:                   Unblock PIN2
    --puk <puk>:                    PUK needed to unblock
    --new-pin <new pin>:            New pin
  --get-iccid:                      Get the ICCID
  --get-imsi:                       Get International Mobile Subscriber ID
  --get-imei:                       Get International Mobile Equipment ID
  --get-msisdn:                     Get the MSISDN (telephone number)
  --reset-dms:                      Reset the DMS service
  --set-device-operating-mode <m>   Set the device operating mode
                                    (modes: online, low_power, factory_test, offline
                                     reset, shutting_down, persistent_low_power,
  --fcc-auth:                       Set FCC authentication
  --uim-verify-pin1 <pin>:          Verify PIN1 (new devices)
  --uim-verify-pin2 <pin>:          Verify PIN2 (new devices)
  --set-network-modes <modes>:      Set usable network modes (Syntax: <mode1>[,<mode2>,...])
                                    Available modes: all, lte, umts, gsm, cdma, td-scdma
  --set-network-preference <mode>:  Set preferred network mode to <mode>
                                    Available modes: auto, gsm, wcdma
  --set-network-roaming <mode>:     Set roaming preference:
                                    Available modes: any, off, only
  --network-scan:                   Initiate network scan
  --network-register:               Initiate network register
  --set-plmn:                       Register at specified network
    --mcc <mcc>:                    Mobile Country Code (0 - auto)
    --mnc <mnc>:                    Mobile Network Code
  --get-plmn:                       Get preferred network selection info
  --get-signal-info:                Get signal strength info
  --get-serving-system:             Get serving system info
  --list-messages:                  List SMS messages
  --delete-message <id>:            Delete SMS message at index <id>
  --get-message <id>:               Get SMS message at index <id>
  --get-raw-message <id>:           Get SMS raw message contents at index <id>
  --send-message <data>:            Send SMS message (use options below)
    --send-message-smsc <nr>:       SMSC number
    --send-message-target <nr>:     Destination number (required)
    --send-message-flash:           Send as Flash SMS
  --wda-set-data-format <type>:     Set data format (type: 802.3|raw-ip)
  --wda-get-data-format:            Get data format

Currently, there is not enough information about mbim protocol as it's being actively developed. If you are curious about setting up mbim protocol, you may ask OpenWrt users/devel mailing lists or OpenWrt forum

Here is a brief help about umbim command line.

umbim help
Usage: mbim <caps|pinstate|unlock|connect|disconnect> [options]
    -d <device>         the device (/dev/cdc-wdmX)
    -t <transaction>    the transaction id
    -n                  no close
    -v                  verbose

First check that everything works correctly:

root@OpenWrt:~# uqmi -d /dev/cdc-wdm0 --get-data-status


root@OpenWrt:~# uqmi -d /dev/cdc-wdm0 --get-signal-info
        "type": "lte",
        "rssi": -71,
        "rsrq": -9,
        "rsrp": -94,
        "snr": 70

To start the internet connection - issue a command:

uqmi -d /dev/cdc-wdm0 --start-network internet --autoconnect

Where “internet” is the APN of your provider.

:!: Many providers allow to use “any” APN, so-called “no-settings” connection. So, in many cases “internet” would be just fine

Check the status:

uqmi -d /dev/cdc-wdm0 --get-data-status

–autoconnect key says that you want always be connected, once dongle is inserted to the router and Cellular Network is in range. :!: It will be kept after reboot.

In case you need additional authentication, please look at the possible arguments for the uqmi utility:

  --start-network <apn>:            Start network connection (use with options below)
    --auth-type pap|chap|both|none: Use network authentication type
    --username <name>:              Use network username
    --password <password>:          Use network password
    --autoconnect:                  Enable automatic connect/reconnect
  --stop-network <pdh>:             Stop network connection (use with option below)
    --autoconnect:                  Disable automatic connect/reconnect

Now you should add new Interface to /etc/config/network

config interface 'wwan'
        option ifname 'wwan0'
        option proto 'dhcp'

You can do this using the vi text editor, but if you're not comfortable with that, point your browser to again, choose Network → Interfaces and click Add new interface.

Write wwan as the name of the interface and make it cover the wwan0 interface. Choose DHCP client as the protocol.

FIXME Insert a screenshot of LUCI add Interface. I have not enought rights.

The only thing that is left - Add wwan interface to WAN zone

Using LUCI:

  • go to Network → Firewall, scroll down to wan and click the Edit button
  • add a checkmark to the wwan box under Covered networks heading, click Save & Apply

:-D That's It! 8-)

FIXME Insert a Screen Shot from LUCI.

To check your balance or send any other AT commands, you need to have usb serial device like: /dev/ttyUSB0

If you have it (if not then install missing usb serial drivers), you can run in first terminal:

cat /dev/ttyUSB0

and in the second (*101# is my ussd code):

echo -ne 'AT+CUSD=1,"*101#",15\r\n' > /dev/ttyUSB0

You should see in first terminal USSD response.

Some providers of the cellular internet use redirection to their pages for access activation, when you are connected first time. I.e. YOTA in Russia.

Normally this would be blocked by dnsmasq:

Jan 18 14:36:49 OpenWrt daemon.warn dnsmasq[1325]: possible DNS-rebind attack detected:

You have 2 options:

  • Allow rebind responses RFC1918 (In LUCI goto NetworkDHCP and DNS and uncheck Rebind protection checkmark)
  • Add domain to Whitelist (In LUCI goto NetworkDHCP and DNS and type in “” without quotes to the Domain whitelist field.

Save & apply

Based on: This Article

Everything is okay but modem doesn't establish connection. What can I try?

You may want to try adding the argument –get-client-id wds and –set-client-id when running uqmi like:

wds=`uqmi -s -d /dev/cdc-wdm0 --get-client-id wds`
uqmi -d /dev/cdc-wdm0 --set-client-id wds,"$wds" --start-network your_apn

Moreover based on this article I discovered that need to reset my modem (tested on Dell Wireless 5804 413c:819b) in boot process, so you can try add the following commands in your /etc/rc.local:

/sbin/uqmi -d /dev/cdc-wdm0 --set-device-operating-mode offline
/sbin/uqmi -d /dev/cdc-wdm0 --set-device-operating-mode reset
/bin/sleep 20
/sbin/uqmi -d /dev/cdc-wdm0 --set-device-operating-mode online
/sbin/uqmi -d /dev/cdc-wdm0 --set-autoconnect enabled
/sbin/uqmi -d /dev/cdc-wdm0 --network-register

My router is not detecting the dongle. What should I do?

Try the following commands:

usbmode -l

It should respond with a message about your USB device is detected. If it does, issue the next command. If it doesn't, you might want to get help from the forum.

usbmode -s

Then wait for the dongle to get issued an IP from your ISP.

No serial device is available (cdc_wdm0, ttyUSB0)

You may need to install the packages kmod-usb-net-cdc-mbim and libmbim

opkg install kmod-usb-net-cdc-mbim libmbim

At least for the Sierra Wireless EM7455 is this the case.

I have to issue usbmode -l and usbmode -s every time I reboot my router to detect my USB device. How can I automate it?

Include the following codes into /etc/rc.local just before exit 0:

/sbin/usbmode -l
/bin/sleep 2
/sbin/usbmode -s
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2022/07/07 18:41
  • by phoebe