Mudi 7 4.10.0, modem is redialed every couple minutes when kmwan is disabled

Bug is not present on firmware 4.8.1. Did not check other previous firmware versions.

On firmware 4.10.0, when MultiWan/kmwan is disabled (kmwan.global.enable='0', kmwan.modem_cpu.check='0', kmwan.modem_cpu.disabled='1'), the modem is dialing a new cellular connection every couple of minutes.

These are the relevant log patterns (truncated/annotated):

Diag_Lib: (cm.c:9544) Executing dial disconnection, initiated by PREPARE_DIAL [...]
Diag_Lib: (cm.c:9416) Executing dial connect, initiated by INTERFACE OFFLINE [...]
[ Similar logs continued every 1-2 mins ]

To reproduce:

uci set kmwan.global.enable='0'
uci set kmwan.modem_cpu.check='0'
uci set kmwan.modem_cpu.disabled='1'
uci commit kmwan
/etc/init.d/kmwan restart
grep -a "Executing dial" /etc/sys_log

I had the same issue and debugged it with Claude via ssh and web plugin, issue is fixed for me now, here is its report:

Mudi 7 (GL-E5800), firmware 4.10.0 (release5), gl-sdk4-cellular git-2026.236. Here kmwan was disabled by Speedify's init script, which sets the same three options you list. I traced the cause, and the workaround below has held for over two hours.

Cause

cellular_manager has a new network online detector ("NOD", in /usr/lib/libcm_network.so, reading /etc/config/cellular/network_check.json). It counts the modem as online only when it receives a kmwan.status "online" event from kmwan. Its own fallback ping probe always reports failure, even when the modem works. So when kmwan is off, every 40-second tick is an offline sample, and after 3 of them NOD calls cm_dial_restore. That is your PREPARE_DIAL / INTERFACE OFFLINE pair. Each redial also swaps the data interface between rmnet_data0 and rmnet_data1 and gives a new IP.

With the cellular log level raised (ubus call cellular.status set_cellular_log_level '{"level":0}', set it back to 1 afterwards), logread shows:

NOD: ping probe if=rmnet_data0 ip=1.1.1.1 count=1 ret=1
NOD: ping probe if=rmnet_data0 ip=8.8.8.8 count=1 ret=1
NOD: tick sample bus=cpu slot=2 if=modem_cpu status=offline
NOD: restore cmd=ubus -t 5 call cellular.cm cm_dial_restore '{"bus":"cpu","slot":2,"nw_st":4}'
NOD: force restore by ubus event bus=cpu slot=2 src=ubus:network.interface

The same command, ping -I rmnet_data0 -c 1 -W 1 1.1.1.1, run from a shell every 5 seconds over the same minutes, succeeded every time. cellular_manager runs with SIGCHLD ignored (grep SigIgn /proc/$(pidof cellular_manager)/status shows 0000000000011000, bit 17 set). That most likely makes system() unable to collect ping's exit status, so the probe can never succeed. This last step is my inference; I didn't confirm it in the binary. With kmwan enabled the problem is hidden, because kmwan's "online" events keep NOD happy.

Raising offline_threshold in network_check.json doesn't fix it. Values above about 10 were ignored, and the ifdown during each redial triggers a "force restore" that bypasses the guard anyway.

Confirmation

Sending the event kmwan would send makes NOD log online stable and clear its restore guard:

ubus send kmwan.status '{"interface":"modem_cpu","status":"online"}'

Workaround

A small loop that, only while kmwan is disabled, pings through each up modem* interface every 20 s and sends that event when the ping works. If the modem really loses data, nothing is sent and NOD redials as designed. Since 11:01 the modem has redialed only when the owner switched modes on purpose; before, it redialed about every 2.5 minutes.

/usr/sbin/modem-online-probe:

#!/bin/sh
INTERVAL=20
TARGETS="1.1.1.1 8.8.8.8 9.9.9.9"
probe() {
    for ip in $TARGETS; do
        ping -I "$1" -c 1 -W 2 "$ip" >/dev/null 2>&1 && return 0
    done
    return 1
}
while :; do
    if [ "$(uci -q get kmwan.global.enable)" != "1" ]; then
        for iface in $(ubus list 2>/dev/null | sed -n 's/^network\.interface\.\(modem[^.]*\)$/\1/p'); do
            case "$iface" in *_6|*_v6) continue ;; esac
            dev=$(ubus call "network.interface.$iface" status 2>/dev/null | jsonfilter -q -e '@.l3_device')
            [ -n "$dev" ] || continue
            probe "$dev" && ubus send kmwan.status "{\"interface\":\"$iface\",\"status\":\"online\"}"
        done
    fi
    sleep "$INTERVAL"
done

/etc/init.d/modem-online-probe:

#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1
start_service() {
    procd_open_instance
    procd_set_param command /usr/sbin/modem-online-probe
    procd_set_param respawn 3600 5 0
    procd_close_instance
}

Then chmod 755 both, /etc/init.d/modem-online-probe enable, /etc/init.d/modem-online-probe start, and add both paths to /etc/sysupgrade.conf.

Request to GL.iNet

Could the NOD's own probe be fixed, for example by restoring SIGCHLD to the default before calling system(), or by probing in-process? It should also work without kmwan, or skip automatic redials when kmwan is disabled. Disabling Multi-WAN is a normal configuration, including for bonding apps such as Speedify that GL.iNet lists as compatible, and in 4.10.0 it makes the modem redial every few minutes.

Hi,

Thanks for reporting this and sharing the detailed findings.

We believe this issue has been fixed in v4.10.2 beta6. When you have a chance, could you try updating and let us know if the issue persists?

You can find the firmware in the download center:

I tested the firmware you provided. It solves the issue. Thank you very much.