User Tools

Site Tools

ReadOnly
    ReadOnly

projects:glinet:e3372:glbugs_etc

Issues with glinet modem compatibility

A list of useful info

/usr/bin/gl_modem                ## The gl_modem binary
/lib/netifd/proto/ncm.sh         ## Part of netifd
/lib/netifd/netifd-proto.sh      ## More netifd
/usr/bin/modem_network_recover_detection.sh  ## part of glinet kmwan for fixing broken connections.
ls -l  /usr/bin/modem*

Modem details:

# This is for a Huawei E3372-320h
Vendor=12d1 ProdID=155e Rev= 1.02

AT Commands:

ATI
AT+CPIN?
AT^ICCID?
  ^ICCID: 8912345678987654321  # Not the real iccid!
  OK
AT^NDISDUP=1,1,"giffgaff.com"

drop pdp for testing

gl_modem -B 1-1 AT 'AT+CGACT=0,1'

bring pdp up:

gl_modem -B 1-1 AT 'AT+CGACT=1,1'

OS and uci peek and poke:

ls -l /var/usbnode/1-1/modem/
cat /var/state/network
uci -P /var/state show network.wwan.ifname
  network.wwan.ifname='wwan0'
uci -P /var/state show network.modem_1_1.ifname
  network.modem_1_1.ifname='wwan0'
uci -P /var/state show
uci -q get glmodem.global.log_level

Databases:

/www/js/apns-full-conf.json.gz      ## An isp apn list in the firmware that gets unzipped to...
/var/run/modem/apns-full-conf.json  ## ...here. If it exists already it doesn't get re-unzipped.

I added giffgaff entry to the apns-full-conf.json files above:

   {
      "-carrier": "giffgaff",
      "-carrier_id": "2118",
      "-mcc": "234",
      "-mnc": "10",
      "-apn": "giffgaff.com",
      "-type": "default,ia,supl,mms,xcap"
    },
    {
      "-carrier": "giffgaff",
      "-carrier_id": "2118",
      "-mcc": "234",
      "-mnc": "105",
      "-apn": "giffgaff.com",
      "-type": "default,ia,supl,mms,xcap"
    },

Sniffing the calls made to gl_modem:

# A shim to wrap around gl_modem to sniff calling info and processes.
nano /usr/bin/gl_modem

#!/bin/sh
# Stub wrapper for gl_modem to log calls and forward to the real binary
logger -p notice -t gl_modem_AndyFix "gl_modem called args: $*"

# Run the real binary with all arguments, capture its exit code
/usr/bin/gl_modem.patched4 "$@"
ret=$?

# Log the exit code
logger -p notice -t gl_modem_AndyFix "gl_modem exit code: $ret"

# Propagate the exit code back to the caller
exit $ret

Errors in the logs and what they probably mean

Failed to get iccid

The Problem

If you see this in the logs:

Wed Dec 17 07:15:17 2025 daemon.info gl_modem: (modem_cm.c:1324) Enter the dialing process
Wed Dec 17 07:15:17 2025 daemon.err gl_modem: (modem_cm.c:1343) Failed to get iccid, maybe PIN code is locked,please check!

It probably means the sim is returning a 19 digit iccid. gl_modem is hardcoded to look for 20 digits.

The fix: Patch /usr/bin/gl_modem:

At file address 019990 change:

BF 52 00 71     cmp        w21,#0x14      // 20 digit check

to

BF 4E 00 71     cmp        w21,#0x13      // 19 digit check

glinet gl_modem hacking

Why and what did we achieve

gl_modem has a lookup table for each modem it recognises and a list of functions it can call to do various things.

The idea (i think) is that the command gl_m#odem -B 1-1 connect-auto uses this table and the info in the apn database to setup the modem and populate a config interface xxxx in /etc/config/network as if by magic.

Useful binary info

modem_head is the start of the table at 029000 in the file, 439000 in the ghidra project.

Modem Struct E3372 Model ID:

(029DE0) 00439de0 5E 15 00 00     int32_t         155Eh                modem_productid
(-29e88) 00000000 Remove modem_get_sim_mcc_mnc call, not supported.
projects/glinet/e3372/glbugs_etc.txt · Last modified: by Andy Moore