uzbek-plus/b6p/diff-old-b6-vs-b6p.diff

172 lines
12 KiB
Diff

--- b6/aurora-modem 2026-09-30 19:39:43.675393185 +0600
+++ b6p/rootfs/usr/sbin/aurora-modem 2026-09-30 22:24:42.244902667 +0600
@@ -1,18 +1,17 @@
#!/bin/sh
-# B6 RAM-only modem lifecycle controller for Aurora (golden mm1). Lives in /tmp only.
-# aurora-modem start | stop | status | addroute <ipv4>
-# Reconstructs the proven flow (NOTES sessions 14-22 Aurora, JZ02 stopcycle/wwanfix/openrc):
-# start: RO gates -> rmtfs -r -P -s -v (rmtfs -s starts MSS) -> MSS running -> wwan0qmi0+wwan0 (+2 s, JZ02 port-race guard)
-# -> qmicli -p DMS online (one SET, only if not online) -> NAS registered + PS attached -> kill qmi-proxy
-# -> udevd/dbus/polkitd/ModemManager -> MM modem registered -> ONE simple-connect -> bearer IPv4 on wwanN
-# + /32 host routes only (no default route, usb0 untouched).
-# stop: simple-disconnect -> MM disable (radio low-power = detach) -> del our /32 routes, flush+down all wwan* -> stop MM (+qmi-proxy) -> BAM-DMUX suspended
-# -> SIGTERM rmtfs: rmtfs writes "stop" to remoteproc state (MSS stops while rmtfs still serves) -> rmtfs exits LAST.
-# Never writes eMMC/NV: rmtfs -r keeps EFS writes in RAM; the script refuses to run unless the NV partitions are getro=1.
+# Aurora (JZ08AU, MSM8916) modem lifecycle controller - B6P production build of the B6N-proven controller (b6j/aurora-modem).
+# aurora-modem start | disconnect | stop | status | addroute <ipv4>
+# start: [rmtfs -r -P -s -v -> MSS -> wwan0qmi0 (+2 s port-race guard) -> SIM ready -> DMS online (one SET, retried only on DeviceNotReady)
+# -> registration state machine (registered + PS attached, deadline REG_TIMEOUT, default 600 s)] (skipped when rmtfs+MSS already run)
+# -> udevd/dbus/polkitd/ModemManager (reused if running) -> ONE simple-connect -> bearer IPv4 on wwanN + /32 routes only (no default route).
+# disconnect: simple-disconnect, our routes, flush+down all wwan*, wait BAM-DMUX suspended. MSS, rmtfs, MM and radio stay up; 'start' reconnects.
+# stop: disconnect -> stop MM (+qmi-proxy) -> BAM-DMUX suspended -> SIGTERM rmtfs (rmtfs writes 'stop' -> MSS offline) -> rmtfs exits last.
+# Never writes eMMC/NV: rmtfs -r keeps EFS writes in RAM; refuses to start unless modemst1/2, fsc, fsg, persist, mmcblk0 are getro=1 and /firmware is ro.
+# Does not need a valid wall clock (all timing from /proc/uptime). No automatic MSS/rmtfs retry.
# Exit: 0 ok, 1 failure/timeout (start rolls back with a full stop unless MODEM_KEEP_ON_FAIL=1), 2 usage/config error.
-CONF=${MODEM_CONF:-/tmp/aurora-modem.conf}
-D=/tmp/aurora-modem.d; mkdir -p $D
+CONF=${MODEM_CONF:-/etc/aurora/modem.conf}
+D=/run/aurora-modem; mkdir -p $D
LOG=$D/lifecycle.log; STATE=$D/state; ROUTES=$D/routes; BEARER=$D/bearer
RPNAME=4080000.remoteproc
BAM=/sys/bus/platform/devices/4080000.remoteproc:bam-dmux
@@ -20,10 +19,10 @@
# --- timeouts (s); override in $CONF
T_RMTFS=5 T_MSS=60 T_QMI_DEV=30 T_QMI=45 T_SIM=60 T_ONLINE=30 T_REG=180 T_MM_DETECT=150 T_MM_REG=60 T_CONNECT=150
-MODEM_REATTACH_HOLDOFF=120 # s between radio stop and next MSS start (B6: re-attach <=61 s after stop was rejected 3/3 by Beeline)
T_DISCONNECT=60 T_DISABLE=30 T_MM_EXIT=30 T_BAM_IDLE=15 T_MSS_STOP=30 T_RMTFS_EXIT=15
-MODEM_APN= MODEM_USER= MODEM_PASSWORD= MODEM_AUTH= MODEM_IP_TYPE=ipv4 MODEM_TEST_ROUTES= KEEP=${MODEM_KEEP_ON_FAIL:-0}
+APN= USER= PASSWORD= AUTH= IP_TYPE=ipv4 REG_TIMEOUT=600 ROUTES= KEEP=${MODEM_KEEP_ON_FAIL:-0}
[ -f "$CONF" ] && . "$CONF"
+MODEM_APN=$APN MODEM_USER=$USER MODEM_PASSWORD=$PASSWORD MODEM_AUTH=$AUTH MODEM_IP_TYPE=${IP_TYPE:-ipv4} MODEM_TEST_ROUTES=$ROUTES T_REG=${REG_TIMEOUT:-600}
MODEM_KEEP_ON_FAIL=${MODEM_KEEP_ON_FAIL:-$KEEP}
mmc() { mmcli "$@" 2>/dev/null | tr -d '\033' | sed 's/\[[0-9;]*m//g'; } # mmcli colours values even without a tty
@@ -62,6 +61,43 @@
# this mmcli has no --list-bearers ("no actions specified"); use 'Bearer | paths:' of mmcli -m, not the initial (attach) bearer
bearers() { mmc -m "$(mm_idx)" | grep -v "initial bearer" | grep -oE "Bearer/[0-9]+" | cut -d/ -f2; }
any_bearer_connected() { for b in $(bearers); do mmc -b $b | grep -q "connected: yes" && return 0; done; return 1; }
+qv() { grep -m1 -oE "$1: *'[^']*'" $2 2>/dev/null | sed -E "s/.*'([^']*)'/\1/"; }
+# B6M registration state machine. rc 0 = registered+PS attached, 1 = REGISTRATION_TIMEOUT, 2 = local failure (reason in $D/reg-fail)
+reg_sm() {
+ T=$D/reg-trans.tsv; t0=$1; last=; n=0; nd=0; rm -f $D/reg-fail; D0=$(dmesg | wc -l)
+ printf 'uptime t_online reg ps status true_status domain plmn earfcn pci si_tac si_eci cl_tac cl_eci rsrp rsrq snr
+' > $T
+ lf() { echo "$*" > $D/reg-fail; return 2; }
+ while :; do n=$((n+1))
+ mss_is running || { lf "MSS state $(mss_state)"; return 2; }
+ [ -e /dev/wwan0qmi0 ] || { lf "wwan0qmi0 disappeared"; return 2; }
+ [ -n "$(rmtfs_pid)" ] || { lf "rmtfs died"; return 2; }
+ [ "$(bam_pm)" = error ] && { lf "BAM-DMUX runtime_status=error"; return 2; }
+ dmesg | tail -n +$((D0+1)) | grep -qE 'crash detected|fatal error|[Ww]atchdog|wdog|Oops|BUG:|Failed to resume' && { lf "dmesg: $(dmesg | tail -n +$((D0+1)) | grep -m1 -E 'crash detected|fatal error|[Ww]atchdog|wdog|Oops|BUG:|Failed to resume')"; return 2; }
+ if [ $((n % 5)) = 1 ]; then
+ sim_ready || { lf "SIM not ready: $(grep -E 'Card state|Application state' $D/qmi-uim.txt | head -2 | tr -s ' \t\n' ' ')"; return 2; }
+ ping -c1 -W2 172.16.42.2 >/dev/null 2>&1 || { sleep 1; ping -c1 -W2 172.16.42.2 >/dev/null 2>&1 || { lf "USB management (usb0 ping) lost"; return 2; }; }
+ fi
+ timeout 20 $Q --nas-get-serving-system > $D/qmi-ss.txt 2>&1
+ timeout 20 $Q --nas-get-system-info > $D/qmi-si-all.txt 2>&1; sed -n '/LTE service:/,/SIM reject/p' $D/qmi-si-all.txt > $D/qmi-si.txt
+ RG=$(qv 'Registration state' $D/qmi-ss.txt); PS=$(qv PS $D/qmi-ss.txt); ST=$(qv Status $D/qmi-si.txt); TS=$(qv 'True Status' $D/qmi-si.txt)
+ DM=$(qv Domain $D/qmi-si.txt); PL=$(qv MCC $D/qmi-si.txt)-$(qv MNC $D/qmi-si.txt); SIT=$(qv 'Tracking Area Code' $D/qmi-si.txt); SIE=$(qv 'Cell ID' $D/qmi-si.txt)
+ key="$RG|$PS|$ST|$TS|$DM|$PL|$SIT|$SIE"
+ if [ "$key" != "$last" ]; then
+ timeout 20 $Q --nas-get-cell-location-info > $D/qmi-cl.txt 2>&1; timeout 20 $Q --nas-get-signal-info > $D/qmi-sig.txt 2>&1
+ [ "$RG" = registration-denied ] && [ "${last%%|*}" != registration-denied ] && nd=$((nd+1))
+ printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' $(now) $(since $t0) "$RG" "$PS" "$ST" "$TS" "$DM" "$PL" \
+ "$(qv 'EUTRA Absolute RF Channel Number' $D/qmi-cl.txt)" "$(qv 'Serving Cell ID' $D/qmi-cl.txt)" "$SIT" "$SIE" \
+ "$(qv 'Tracking Area Code' $D/qmi-cl.txt)" "$(qv 'Global Cell ID' $D/qmi-cl.txt)" "$(qv RSRP $D/qmi-sig.txt)" "$(qv RSRQ $D/qmi-sig.txt)" "$(qv SNR $D/qmi-sig.txt)" >> $T
+ log "REG t+$(since $t0)s: $RG / PS $PS / $ST ($TS, $DM) $PL pci=$(qv 'Serving Cell ID' $D/qmi-cl.txt) si=$SIT/$SIE cl=$(qv 'Tracking Area Code' $D/qmi-cl.txt)/$(qv 'Global Cell ID' $D/qmi-cl.txt)"
+ last=$key
+ fi
+ echo $nd > $D/reg-denied-count
+ [ "$RG" = registered ] && [ "$PS" = attached ] && return 0
+ [ "$(awk -v a="$(now)" -v b="$t0" -v t="$T_REG" 'BEGIN{print (a-b>=t)}')" = 1 ] && { lf "REGISTRATION_TIMEOUT after ${T_REG}s ($RG, PS $PS)"; return 1; }
+ sleep 3
+ done
+}
bearer_field() { awk -F': ' -v k="$1" '$1 ~ " "k"$" {gsub(/ /,"",$2); print $2; exit}' $BEARER.txt; }
check_safety() {
@@ -110,14 +146,11 @@
elif [ -n "$(rmtfs_pid)" ] || ! mss_is offline; then
log "FAIL: inconsistent (rmtfs='$(rmtfs_pid)' MSS=$(mss_state)); run stop first"; exit 1
else
- if [ -f $D/last-radio-stop ]; then
- w=$(awk -v a="$(now)" -v b="$(cat $D/last-radio-stop)" -v h="$MODEM_REATTACH_HOLDOFF" 'BEGIN{d=h-(a-b); printf "%d", (d>0)?d+1:0}')
- [ "$w" -gt 0 ] && { log "re-attach holdoff: last radio stop $(since $(cat $D/last-radio-stop))s ago, waiting ${w}s (MODEM_REATTACH_HOLDOFF=$MODEM_REATTACH_HOLDOFF)"; sleep $w; }
- fi
: > $ROUTES; rm -f $D/ipcfg
+ n0=$(grep -c 'registering services' $D/rmtfs.log 2>/dev/null)
LD_PRELOAD=/usr/lib/linebuf.so rmtfs -r -P -s -v >> $D/rmtfs.log 2>&1 &
echo $! > $D/rmtfs.pid
- wait_for $T_RMTFS 0.2 sh -c "kill -0 $(cat $D/rmtfs.pid) 2>/dev/null && grep -q 'registering services' $D/rmtfs.log" \
+ wait_for $T_RMTFS 0.2 sh -c "kill -0 $(cat $D/rmtfs.pid) 2>/dev/null && [ \$(grep -c 'registering services' $D/rmtfs.log) -gt ${n0:-0} ]" \
|| fail_start "rmtfs did not start (pid $(cat $D/rmtfs.pid))"
setstate RMTFS_READY
setstate MPSS_BOOTING
@@ -149,7 +182,10 @@
log "DMS online after $(since $t)s"
fi
setstate RADIO_ONLINE
- t=$(now); wait_for $T_REG 2 qmi_reg || fail_start "not registered+PS attached after ${T_REG}s ($(grep -E "Registration state" $D/qmi-ss.txt | tr -s ' \t'))"
+ t=$(now); reg_sm $t; rr=$?
+ [ $rr = 2 ] && fail_start "LOCAL FAILURE during registration: $(cat $D/reg-fail)"
+ [ $rr = 1 ] && fail_start "$(cat $D/reg-fail)"
+
log "registered: $(grep -oE "(MCC|MNC|Description): '[^']*'" $D/qmi-ss.txt | tr '\n' ' ')after $(since $t)s"
setstate REGISTERED
killall qmi-proxy 2>/dev/null; wait_for 5 0.2 sh -c '! pidof qmi-proxy >/dev/null'
@@ -210,13 +246,6 @@
if [ -n "$(mm_pid)" ] && mm_has_modem; then
timeout $T_DISCONNECT mmcli -m "$(mm_idx)" --simple-disconnect >> $LOG 2>&1; log "simple-disconnect rc=$? (bearers: $(bearers | tr '\n' ' '))"
wait_for 15 1 sh -c "! sh $0 _anyconn" && log "no bearer connected" || { log "WARNING: bearer still connected"; rc=1; }
- # 1b. radio off / network detach before MSS goes away (B6 addition: abrupt MSS stop while EPS-attached
- # was followed by attach rejection 'limited' on quick restart). MM disable = DMS low-power.
- timeout $T_DISABLE mmcli -m "$(mm_idx)" --disable >> $LOG 2>&1; r=$?
- wait_for 10 0.5 sh -c "[ \"\$(sh $0 _mmstate)\" = disabled ]" && log "MM disable rc=$r -> state disabled (radio low-power, detached)" \
- || { log "WARNING: MM disable rc=$r state '$(mm_state)'"; rc=1; }
- elif [ -e /dev/wwan0qmi0 ] && mss_is running; then
- timeout 20 $Q --dms-set-operating-mode=low-power >> $LOG 2>&1; log "qmicli low-power rc=$? (MM not running)"
fi
# 2. our /32 routes, 3. flush + DOWN every wwan*
for h in $(cat $ROUTES 2>/dev/null); do ip route del $h/32 2>/dev/null; done; : > $ROUTES
@@ -242,7 +271,6 @@
fi
# 6. MSS stop via rmtfs -s (SIGTERM -> pwrite "stop" to remoteproc state -> exit), 7. rmtfs exits last
P=$(rmtfs_pid)
- mss_is running && now > $D/last-radio-stop
if [ -n "$P" ]; then
t=$(now); kill -TERM $P; log "SIGTERM rmtfs $P (rmtfs stops MSS, then exits)"
wait_for $T_MSS_STOP 0.2 mss_is offline && log "MSS offline after $(since $t)s (rmtfs alive: $(kill -0 $P 2>/dev/null && echo yes || echo no))" \
@@ -260,6 +288,23 @@
return $rc
}
+do_disconnect() { # B6N: bearer down only; MSS, rmtfs, MM (and DMS radio) stay up. Next 'start' reuses them and only simple-connects.
+ T0=$(now); log "=== DISCONNECT (from $(cat $STATE 2>/dev/null || echo OFF): mss=$(mss_state) rmtfs=$(rmtfs_pid) mm=$(mm_pid) bam=$(bam_pm))"; rc=0
+ [ -n "$(mm_pid)" ] && mm_has_modem || { log "DISCONNECT: no MM modem"; return 1; }
+ timeout $T_DISCONNECT mmcli -m "$(mm_idx)" --simple-disconnect >> $LOG 2>&1; log "simple-disconnect rc=$? (bearers: $(bearers | tr '\n' ' '))"
+ wait_for 15 1 sh -c "! sh $0 _anyconn" && log "no bearer connected" || { log "ERROR: bearer still connected"; rc=1; }
+ for h in $(cat $ROUTES 2>/dev/null); do ip route del $h/32 2>/dev/null; done; : > $ROUTES
+ for d in /sys/class/net/wwan*; do [ -e "$d" ] || continue; w=${d##*/}
+ ip addr flush dev $w 2>/dev/null; ip link set $w down 2>/dev/null
+ link_up $w && { log "ERROR: $w still UP"; rc=1; }; done
+ rm -f $D/ipcfg
+ ip route | grep -q " dev wwan" && { log "ERROR: routes via wwan remain: $(ip route | grep ' dev wwan' | tr '\n' ';')"; rc=1; }
+ t=$(now); wait_for $T_BAM_IDLE 0.5 bam_suspended && log "BAM-DMUX suspended after $(since $t)s" || { log "ERROR: BAM-DMUX '$(bam_pm)' not suspended"; rc=1; }
+ setstate MM_IDLE
+ log "=== DISCONNECT done rc=$rc in $(since $T0)s (mss=$(mss_state) rmtfs='$(rmtfs_pid)' mm='$(mm_pid)' mm_state=$(mm_state) bam=$(bam_pm))"
+ return $rc
+}
+
do_status() {
r=$(rp)
echo "controller: $(cat $STATE 2>/dev/null || echo OFF)"
@@ -285,6 +330,7 @@
case "$1" in
start) do_start;;
stop) do_stop; exit $?;;
+ disconnect) do_disconnect; exit $?;;
status) do_status;;
addroute) [ -n "$2" ] || exit 2; addroute "$2";;
_anyconn) any_bearer_connected;;