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.