======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.