Page MenuHomeVyOS Platform

RNDIS Missing from Kernel
Closed, WontfixPublicBUG

Description

Protectli uses the Qualcomm MDG200 cellular modem for an internal modem when you purchase from their store.

The device is designed to present itself as a USB Ethernet adapter to the host OS.

VyOS 1.3.2, and VyOS 1.4 nightly both list the device as a USB device, but do not show it as an Ethernet device.

Research indicates that the host OS should use RNDIS to communicate with the device.

Possible solution could be to modify the vyos-build project to include CONFIG_USBNET_RNDIS_HOST=m

Since this is a Kernel modification, I thought it would be prudent to open up a dialog on the implications of this change. It could open up additional USB Ethernet adapters (maybe Android/iPhone tethering?), but could potentially cause unknown effects as well.

vyos-build RNDIS search in GitHub shows that arm64 does seem to include RNDIS configuration options, but x86 does not. Since I'm not completely familiar with Kernel configuration, I just wanted to reference the two different files, and the related configuration items.

Tested the device with ipfire distro, and found that the modem did work, and presented itself as an Ethernet adapter to the host OS. Pulled some relevant information from that distro for reference.

Neglected to pull relevant logs from VyOS distro, but will update when I am working on the device again.


Relevant lsusb output from ipfire distro

[root@test ~]# lsusb -s 001:003 -v

Bus 001 Device 003: ID 05c6:90b3 Qualcomm, Inc. MDG200
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  idVendor           0x05c6 Qualcomm, Inc.
  idProduct          0x90b3 
  bcdDevice            3.18
  iManufacturer           1 Qualcomm
  iProduct                2 MDG200
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x004b
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              500mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         2
      bFunctionClass        224 Wireless
      bFunctionSubClass       1 Radio Frequency
      bFunctionProtocol       3 RNDIS
      iFunction               9 RNDIS
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass       224 Wireless
      bInterfaceSubClass      1 Radio Frequency
      bInterfaceProtocol      3 RNDIS
      iInterface              7 RNDIS Communications Control
      ** UNRECOGNIZED:  05 24 00 10 01
      ** UNRECOGNIZED:  05 24 01 00 01
      ** UNRECOGNIZED:  04 24 02 00
      ** UNRECOGNIZED:  05 24 06 00 01
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               9
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              8 RNDIS Ethernet Data
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)

Related bootlog messages from ipfire

[root@test ~]# cat /var/log/bootlog | grep usb
[    0.245158] usbcore: registered new interface driver usbfs
[    0.245158] usbcore: registered new interface driver hub
[    0.245160] usbcore: registered new device driver usb
[    0.356693] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.01
[    0.356777] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    0.356856] usb usb1: Product: xHCI Host Controller
[    0.356930] usb usb1: Manufacturer: Linux 6.1.11-ipfire xhci-hcd
[    0.357007] usb usb1: SerialNumber: 0000:00:14.0
[    0.357980] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.01
[    0.358064] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    0.358142] usb usb2: Product: xHCI Host Controller
[    0.358228] usb usb2: Manufacturer: Linux 6.1.11-ipfire xhci-hcd
[    0.358305] usb usb2: SerialNumber: 0000:00:14.0
[    0.359329] usbcore: registered new interface driver uas
[    0.359433] usbcore: registered new interface driver usb-storage
[    0.362084] usbcore: registered new interface driver usbhid
[    0.362184] usbhid: USB HID core driver
[    0.598285] usb 1-3: new high-speed USB device number 2 using xhci_hcd
[    0.744675] usb 1-3: New USB device found, idVendor=1a40, idProduct=0101, bcdDevice= 1.00
[    0.744769] usb 1-3: New USB device strings: Mfr=0, Product=1, SerialNumber=0
[    0.744846] usb 1-3: Product: USB 2.0 Hub [MTT]
[    0.862175] usb 1-5: new high-speed USB device number 3 using xhci_hcd
[    1.000598] usb 1-5: New USB device found, idVendor=05c6, idProduct=90b3, bcdDevice= 3.18
[    1.000692] usb 1-5: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    1.000771] usb 1-5: Product: MDG200
[    1.000843] usb 1-5: Manufacturer: Qualcomm
[    1.163206] usb 1-3.2: new low-speed USB device number 4 using xhci_hcd
[    1.351354] usb 1-3.2: New USB device found, idVendor=413c, idProduct=2113, bcdDevice= 1.08
[    1.351459] usb 1-3.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[    1.351545] usb 1-3.2: Product: Dell KB216 Wired Keyboard
[    1.360753] input: Dell KB216 Wired Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.2/1-3.2:1.0/0003:413C:2113.0001/input/input2
[    1.412840] hid-generic 0003:413C:2113.0001: input,hidraw0: USB HID v1.11 Keyboard [Dell KB216 Wired Keyboard] on usb-0000:00:14.0-3.2/input0
[    1.417841] input: Dell KB216 Wired Keyboard System Control as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.2/1-3.2:1.1/0003:413C:2113.0002/input/input3
[    1.470393] input: Dell KB216 Wired Keyboard Consumer Control as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.2/1-3.2:1.1/0003:413C:2113.0002/input/input4
[    1.470613] hid-generic 0003:413C:2113.0002: input,hidraw1: USB HID v1.11 Device [Dell KB216 Wired Keyboard] on usb-0000:00:14.0-3.2/input1
[    3.272719] usbcore: registered new interface driver cdc_ether
[    3.343880] rndis_host 1-5:1.0 usb0: register 'rndis_host' at usb-0000:00:14.0-5, RNDIS device, c6:d7:3d:9e:a8:59
[    3.343963] usbcore: registered new interface driver rndis_host
[    3.761964] rndis_host 1-5:1.0 red0: renamed from usb0

Related kernel module output from ipfire

[root@test ~]# lsmod | grep rndis
rndis_host             24576  0
cdc_ether              24576  1 rndis_host
usbnet                 57344  2 rndis_host,cdc_ether
[root@test ~]# lsmod 
Module                  Size  Used by
xt_set                 20480  2
ip_set_hash_net        53248  1
xt_MASQUERADE          20480  1
cfg80211             1122304  0
rfkill                 36864  1 cfg80211
8021q                  40960  0
garp                   16384  1 8021q
ip_set                 61440  2 xt_set,ip_set_hash_net
xt_hashlimit           20480  2
xt_policy              16384  5
xt_TCPMSS              16384  1
xt_conntrack           16384  7
xt_comment             16384  12
ipt_REJECT             16384  1
nf_reject_ipv4         16384  1 ipt_REJECT
xt_LOG                 20480  12
xt_limit               16384  12
xt_mark                16384  7
xt_connmark            16384  2
nf_log_syslog          24576  12
iptable_raw            16384  0
iptable_mangle         16384  1
iptable_filter         16384  1
vfat                   24576  1
fat                    90112  1 vfat
snd_hda_codec_hdmi     81920  0
snd_hda_codec_realtek   176128  1
snd_hda_codec_generic    98304  1 snd_hda_codec_realtek
ledtrig_audio          16384  1 snd_hda_codec_generic
sch_cake               40960  3
fb_sys_fops            16384  0
syscopyarea            16384  0
sysfillrect            16384  0
sysimgblt              16384  0
snd_hda_intel          57344  0
snd_intel_dspcfg       20480  1 snd_hda_intel
intel_powerclamp       20480  0
coretemp               20480  0
snd_hda_codec         180224  4 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec_realtek
kvm_intel             376832  0
snd_hda_core          122880  5 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_codec_realtek
kvm                  1122304  1 kvm_intel
snd_hwdep              16384  1 snd_hda_codec
iTCO_wdt               16384  0
igb                   274432  0
at24                   28672  0
snd_pcm               184320  4 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_core
regmap_i2c             16384  1 at24
iTCO_vendor_support    16384  1 iTCO_wdt
ptp                    36864  1 igb
processor_thermal_device_pci_legacy    16384  0
rndis_host             24576  0
i2c_i801               36864  0
snd_timer              40960  1 snd_pcm
processor_thermal_device    20480  1 processor_thermal_device_pci_legacy
pps_core               24576  1 ptp
cdc_ether              24576  1 rndis_host
irqbypass              16384  1 kvm
i2c_smbus              20480  1 i2c_i801
processor_thermal_rfim    16384  1 processor_thermal_device
dca                    16384  1 igb
snd                   126976  8 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hwdep,snd_hda_intel,snd_hda_codec,snd_hda_codec_realtek,snd_timer,snd_pcm
lpc_ich                28672  0
usbnet                 57344  2 rndis_host,cdc_ether
i2c_algo_bit           16384  1 igb
processor_thermal_mbox    16384  2 processor_thermal_rfim,processor_thermal_device
pcspkr                 16384  0
mii                    16384  1 usbnet
i2c_core              114688  6 i2c_algo_bit,at24,igb,i2c_smbus,i2c_i801,regmap_i2c
mfd_core               20480  1 lpc_ich
int340x_thermal_zone    20480  1 processor_thermal_device
soundcore              16384  1 snd
intel_soc_dts_iosf     20480  1 processor_thermal_device_pci_legacy
video                  65536  0
wmi                    36864  1 video
crct10dif_pclmul       16384  1
crc32_pclmul           16384  0
polyval_generic        16384  0
ghash_clmulni_intel    16384  0
sha512_ssse3           49152  0
pinctrl_cherryview     49152  0
dm_mirror              28672  0
dm_region_hash         24576  1 dm_mirror
dm_log                 20480  2 dm_region_hash,dm_mirror
dm_mod                167936  2 dm_log,dm_mirror

Details

Difficulty level
Unknown (require assessment)
Version
1.3.2
Why the issue appeared?
Will be filled on close
Is it a breaking change?
Unspecified (possibly destroys the router)
Issue type
Internal change (not visible to end users)

Event Timeline

c-po changed the task status from Open to In progress.Apr 30 2023, 6:02 AM
c-po claimed this task.
c-po triaged this task as Normal priority.
c-po added a project: VyOS 1.4 Sagitta.

Added requested config option to Kernel for 1.4

Please test before we backport this to 1.3

Tested successfully! Modem showed up as usb0 in ip link, but not in show interfaces.

Additional work will be necessary to get modem integrated within the configuration mode as it exists currently.

MAC address does change when the modem reboots.

Relevant output from device shown below.

vyos@vyos:~$ show version 
Version:          VyOS 1.4-rolling-202305010317
Release train:    current

Built by:         [email protected]
Built on:         Mon 01 May 2023 03:17 UTC
Build UUID:       9d08b14d-b7a9-4275-8b17-db00820bcca9
Build commit ID:  88be901bc103d1

Architecture:     x86_64
Boot via:         livecd
System type:      bare metal

Hardware vendor:  Protectli
Hardware model:   FW2B
Hardware S/N:     123456789
Hardware UUID:    Unknown

Copyright:        VyOS maintainers and contributors

lsusb output

Bus 001 Device 003: ID 05c6:90b3 Qualcomm, Inc. MDG200
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  idVendor           0x05c6 Qualcomm, Inc.
  idProduct          0x90b3 
  bcdDevice            3.18
  iManufacturer           1 Qualcomm
  iProduct                2 MDG200
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x004b
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              500mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         2
      bFunctionClass        224 Wireless
      bFunctionSubClass       1 Radio Frequency
      bFunctionProtocol       3 RNDIS
      iFunction               9 RNDIS
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass       224 Wireless
      bInterfaceSubClass      1 Radio Frequency
      bInterfaceProtocol      3 RNDIS
      iInterface              7 RNDIS Communications Control
      ** UNRECOGNIZED:  05 24 00 10 01
      ** UNRECOGNIZED:  05 24 01 00 01
      ** UNRECOGNIZED:  04 24 02 00
      ** UNRECOGNIZED:  05 24 06 00 01
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               9
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              8 RNDIS Ethernet Data
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 
  bDeviceProtocol         1 Interface Association
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)

System detecting device during boot

[    3.426821] usb 1-5: new high-speed USB device number 3 using xhci_hcd
[    3.572302] usb 1-5: New USB device found, idVendor=05c6, idProduct=90b3, bcdDevice= 3.18
[    3.580768] usb 1-5: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.588094] usb 1-5: Product: MDG200
[    3.591831] usb 1-5: Manufacturer: Qualcomm
[    3.658696] usbcore: registered new interface driver cdc_ether
[    3.681646] rndis_host 1-5:1.0 usb0: register 'rndis_host' at usb-0000:00:14.0-5, RNDIS device, 6a:71:b0:27:f7:36
[    3.692396] usbcore: registered new interface driver rndis_host

Modem doesn't show up in interfaces list

vyos@vyos:~$ show interfaces 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             -                                 u/D  
eth1             -                                 u/D  
lo               127.0.0.1/8                       u/u  
                 ::1/128
root@vyos:/home/vyos# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:e0:97:XX:XX:YY brd ff:ff:ff:ff:ff:ff
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:e0:97:XX:XX:ZZ brd ff:ff:ff:ff:ff:ff
4: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 6a:71:b0:27:f7:36 brd ff:ff:ff:ff:ff:ff

After running ip link set up dev usb0 and dhclient usb0, the link will show in the routing table.

root@vyos:/home/vyos# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

S>* 0.0.0.0/0 [210/0] via 172.16.0.1, usb0, weight 1, 00:00:31
C>* 172.16.0.0/24 is directly connected, usb0, 00:00:32

lsmod output

Module                  Size  Used by
nf_nat_tftp            16384  0
nf_conntrack_tftp      20480  1 nf_nat_tftp
nf_nat_sip             20480  0
nf_conntrack_sip       45056  1 nf_nat_sip
nf_nat_pptp            20480  0
nf_conntrack_pptp      24576  1 nf_nat_pptp
nf_nat_h323            24576  0
nf_conntrack_h323      77824  1 nf_nat_h323
nf_nat_ftp             20480  0
nf_conntrack_ftp       24576  1 nf_nat_ftp
nft_objref             16384  3
nft_ct                 24576  7
nft_chain_nat          16384  1
nf_nat                 57344  6 nf_nat_ftp,nf_nat_tftp,nf_nat_pptp,nf_nat_h323,nft_chain_nat,nf_nat_sip
nf_tables             278528  52 nft_ct,nft_objref,nft_chain_nat
nfnetlink_cthelper     20480  3
nf_conntrack          180224  13 nf_nat,nf_conntrack_tftp,nfnetlink_cthelper,nft_ct,nf_nat_ftp,nf_conntrack_pptp,nf_nat_tftp,nf_conntrack_sip,nf_conntrack_h323,nf_nat_pptp,nf_conntrack_ftp,nf_nat_h323,nf_nat_sip
nf_defrag_ipv6         24576  1 nf_conntrack
nf_defrag_ipv4         16384  1 nf_conntrack
nfnetlink              20480  2 nfnetlink_cthelper,nf_tables
af_packet              53248  4
intel_powerclamp       20480  0
coretemp               20480  0
crct10dif_pclmul       16384  1
crc32_pclmul           16384  0
ghash_clmulni_intel    16384  0
sha512_ssse3           49152  0
sha512_generic         16384  1 sha512_ssse3
aesni_intel           393216  0
crypto_simd            16384  1 aesni_intel
pcspkr                 16384  0
cryptd                 24576  2 crypto_simd,ghash_clmulni_intel
intel_cstate           16384  0
at24                   28672  0
evdev                  24576  9
iTCO_wdt               16384  0
iTCO_vendor_support    16384  1 iTCO_wdt
sg                     36864  0
button                 24576  0
processor_thermal_device_pci_legacy    16384  0
processor_thermal_device    20480  1 processor_thermal_device_pci_legacy
processor_thermal_rfim    16384  1 processor_thermal_device
processor_thermal_mbox    16384  2 processor_thermal_rfim,processor_thermal_device
int340x_thermal_zone    20480  1 processor_thermal_device
intel_soc_dts_iosf     20480  1 processor_thermal_device_pci_legacy
binfmt_misc            24576  1
mpls_iptunnel          20480  0
mpls_router            49152  1 mpls_iptunnel
ip_tunnel              36864  1 mpls_router
br_netfilter           32768  0
bridge                303104  1 br_netfilter
stp                    16384  1 bridge
llc                    16384  2 bridge,stp
fuse                  147456  1
efi_pstore             16384  0
configfs               57344  1
ip_tables              32768  0
x_tables               57344  1 ip_tables
autofs4                49152  2
squashfs               69632  1
lz4_decompress         24576  1 squashfs
zstd_decompress       102400  1 squashfs
zstd_common            28672  1 zstd_decompress
loop                   32768  2
overlay               155648  1
isofs                  53248  1
cdrom                  69632  1 isofs
nls_cp437              20480  0
vfat                   24576  0
fat                    86016  1 vfat
ext4                  913408  0
crc16                  16384  1 ext4
mbcache                16384  1 ext4
jbd2                  167936  1 ext4
nls_ascii              16384  0
hid_generic            16384  0
usbhid                 65536  0
hid                   147456  2 usbhid,hid_generic
usb_storage            77824  1
rndis_host             20480  0
cdc_ether              24576  1 rndis_host
usbnet                 53248  2 rndis_host,cdc_ether
mii                    16384  1 usbnet
sd_mod                 53248  1
t10_pi                 16384  1 sd_mod
crc64_rocksoft         20480  1 t10_pi
crc64                  20480  1 crc64_rocksoft
igb                   266240  0
i2c_algo_bit           16384  1 igb
ahci                   49152  0
xhci_pci               24576  0
libahci                49152  1 ahci
crc32c_intel           24576  0
libata                393216  2 libahci,ahci
i2c_i801               32768  0
i2c_smbus              20480  1 i2c_i801
lpc_ich                28672  0
xhci_hcd              311296  1 xhci_pci
i2c_designware_pci     16384  0
i2c_ccgx_ucsi          16384  1 i2c_designware_pci
scsi_mod              266240  4 sd_mod,usb_storage,libata,sg
scsi_common            16384  4 scsi_mod,usb_storage,libata,sg

dmesg output when modem was rebooted without restarting device.

[  935.593594] usb 1-5: USB disconnect, device number 3
[  935.594019] rndis_host 1-5:1.0 usb0: unregister 'rndis_host' usb-0000:00:14.0-5, RNDIS device
[  948.509035] usb 1-5: new high-speed USB device number 6 using xhci_hcd
[  948.645652] usb 1-5: New USB device found, idVendor=2c7c, idProduct=0125, bcdDevice= 3.18
[  948.645694] usb 1-5: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  948.645778] usb 1-5: Product: EC25-AF
[  948.645797] usb 1-5: Manufacturer: Quectel
[  948.800413] usbcore: registered new interface driver cdc_wdm
[  948.810574] usbcore: registered new interface driver usbserial_generic
[  948.810601] usbserial: USB Serial support registered for generic
[  948.819557] qmi_wwan 1-5:1.4: cdc-wdm0: USB WDM device
[  948.822532] qmi_wwan 1-5:1.4 wwan0: register 'qmi_wwan' at usb-0000:00:14.0-5, WWAN/QMI device, c6:97:d6:e2:d5:5c
[  948.822611] usbcore: registered new interface driver qmi_wwan
[  948.834235] usbcore: registered new interface driver option
[  948.834265] usbserial: USB Serial support registered for GSM modem (1-port)
[  948.834351] option 1-5:1.0: GSM modem (1-port) converter detected
[  948.836752] usb 1-5: GSM modem (1-port) converter now attached to ttyUSB0
[  948.836842] option 1-5:1.1: GSM modem (1-port) converter detected
[  948.836982] usb 1-5: GSM modem (1-port) converter now attached to ttyUSB1
[  948.837031] option 1-5:1.2: GSM modem (1-port) converter detected
[  948.837124] usb 1-5: GSM modem (1-port) converter now attached to ttyUSB2
[  948.837172] option 1-5:1.3: GSM modem (1-port) converter detected
[  948.837267] usb 1-5: GSM modem (1-port) converter now attached to ttyUSB3
[  950.383874] usb 1-5: USB disconnect, device number 6
[  950.384775] option1 ttyUSB0: GSM modem (1-port) converter now disconnected from ttyUSB0
[  950.384913] option 1-5:1.0: device disconnected
[  950.385684] option1 ttyUSB1: GSM modem (1-port) converter now disconnected from ttyUSB1
[  950.385867] option 1-5:1.1: device disconnected
[  950.388098] option1 ttyUSB2: GSM modem (1-port) converter now disconnected from ttyUSB2
[  950.388230] option 1-5:1.2: device disconnected
[  950.389122] option1 ttyUSB3: GSM modem (1-port) converter now disconnected from ttyUSB3
[  950.389251] option 1-5:1.3: device disconnected
[  950.389799] qmi_wwan 1-5:1.4 wwan0: unregister 'qmi_wwan' usb-0000:00:14.0-5, WWAN/QMI device
[  954.620190] usb 1-5: new high-speed USB device number 7 using xhci_hcd
[  954.759391] usb 1-5: New USB device found, idVendor=05c6, idProduct=90b3, bcdDevice= 3.18
[  954.759431] usb 1-5: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  954.759452] usb 1-5: Product: MDG200
[  954.759468] usb 1-5: Manufacturer: Qualcomm
[  954.780755] rndis_host 1-5:1.0 usb0: register 'rndis_host' at usb-0000:00:14.0-5, RNDIS device, fe:0e:70:5d:af:8e

Hi, the reason why the modem does not show up is because usb0 interfaces do not match the prefix we use to distinguish between interfaces.

adding usb here https://github.com/vyos/vyos-1x/blob/current/python/vyos/ifconfig/wwan.py#L25 and restarting vyos-configd on your device should do the trick for a first testround.

It still would be better to rename it from usb0 > wwan0

c-po changed the task status from In progress to Needs testing.May 4 2023, 9:22 PM

Could you write and test an udev rule which renames the RNDIS usb0 device to wwan*?

I successfully tested a udev rule to rename to wwan0.

The issue with that is that since this doesn't behave like a typical modem, you can not set configuration of it as the APN setting is mandatory.

All of the modem specific settings appear to be done through the web GUI of the modem.

If I instead rename it to eth99 (or something similar) it appears to work as a normal ethernet interface, and can be configured as such.

I will poke around at the ifconfig scripts referenced above to see if adding usb* to them work okay, but it might be easier to just utilize the udev rule to make it into an eth* name.

Rule used for udev testing:

SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="05c6", ATTRS{idProduct}=="90b3", DRIVERS=="?*", NAME="eth99"

All of the modem specific settings appear to be done through the web GUI of the modem.

Oh, that's actually bad

@giga1699 I've spent way too much time banging my head off this thing over the last two weeks, so here are some of my notes.

Most roads lead to pain with this modem because of some of the choices Amit (the module OEM) made in the software they loaded on it. Even though the onboard modem is QMI-compatible, Amit's software forces the modem into RNDIS mode and wants to be configured via the web interface, and is very hostile to being set up any other way. I don't think it's exaggerating to say it's largely incompatible with VyOS's approach to WWAN.


In more detail:

VyOS's current WWAN command tree makes some fairly specific assumptions about the modem:

  • Cfg-mode assumes it's configurable with ModemManager (it shells to mmcli).
  • Op-mode assumes it's in QMI mode (possibly compatible with MBIM mode too?) because it shells to qmicli.

So this mostly translates to "the modem needs to be a Qualcomm modem in QMI mode". I don't think this is a problem in itself - QCOM has a lock on the market and most reasonable modems will satisfy these assumptions.

Problem is, the Amit MDG200 isn't reasonable. It has a Quectel EC25 modem on board, which is a Qualcomm MDM9207 under the hood. So you'd think this wouldn't be an issue because that modem supports QMI. But Amit's software causes several problems here:

  • The modem actually does boot in QMI mode, but then it immediately gets switched into RNDIS mode. If you're watching dmesg, you can see this happen - a "normal" QMI-mode EC25 shows up on the USB bus, and then disappears and gets replaced with an RNDIS device. I haven't found a way to stop this from happening.
    • The modem can be bludgeoned back into QMI mode using manual AT commands, but it'll switch back into RNDIS mode the next time it reboots.
  • After the mode switch, the Amit software also sets it to a USB vid/pid (05c6:90b3) which isn't known by the option serial port driver. So the driver isn't loaded, the ttyUSB ports don't enumerate, and ModemManager can't control it.
    • This can be addressed by telling the option driver about the vid/pid of the modem (echo 0x05c6 0x90b3 > /sys/bus/usb-serial/drivers/option1/new_id) but this doesn't persist through a reboot.

In short: this modem likely can't be made to work cleanly in VyOS without a fair bit of custom scripting to work around how the modem's software behaves. And even outside of VyOS, it's real hard to use it with the "standard" NetworkManager/ModemManager stack.

Side note: a udev rename (from usb to wwan) probably won't really help here in any meaningful way. Even once its name satisfies what VyOS cfg-mode wants, you still need to fiddle with the option driver (mentioned above) so that ModemManager can see it - and this thing is extremely fickle when being run by ModemManager. It has a really annoying tendency to drop into a false "SIM card missing" state which I couldn't recover without rebooting the modem.

A udev rename to eth as you suggested above might be "okay", but it means completely ignoring the "modem" aspect of it within VyOS and IMO that kinda defeats the point of using it. I'm personally not sure that's something that should be added to VyOS upstream, but for individual users on a custom basis it might make sense.


So... yeah. Working with the MDG200 is painful, even outside of a VyOS context. In my opinion, Protectli made a poor choice when they selected this modem... it'll work in a very rigid use-case, but falls apart in most others.

Thanks for the follow-up @eyanulis!

I really racked my head on that one for a while. Even with the hacks, I found the modem to be too unreliable for consistent use, at least with VyOS + Protectli. It would routinely fail to connect to the cellular network, and I had to keep modifying the APN settings back and forth to get it to connect eventually.

The eth rename was the only thing that made sense to me given that it refused to do any actual modem work outside of the web interface, so treating it as any other ethernet device would've been an okay compromise if it actually worked more consistently.

Since all of the issues combined, I decided it was best to go with an external modem for that use case since it was going to be more reliable. It's thankfully powered by the USB port, but it would've been nice to have a tight package. I imagine there are other vendors out there that would be a better option, but this is what I had to work with on this case.

I do wonder if RNDIS would allow for some additional modules, though. It seems like it might help support other things that aren't this modem, so it may not be terrible to have the module available. I wasn't sure if there were any security implications since I don't have a lot of experience with it, or how much it might actually benefit other potential use cases.

RNDIS is once more on the "removal" list of the Linux Kernel.
https://www.phoronix.com/news/Linux-Disabling-RNDIS-Drivers

We should not bet on this feature that's why it will be disabled in 1.5 and 1.4 releases