[PATCH] uqmi: fix network registration loop
Florian Eckert
fe at dev.tdt.de
Tue Apr 20 07:20:26 BST 2021
On 2021-04-19 19:46, thomas.richard at kontron.com wrote:
> From: Thomas Richard <thomas.richard at kontron.com>
>
> Instrumenting qmi.sh script with following patch, some errors are
> visible.
> --- a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh
> +++ b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh
> @@ -29,6 +29,7 @@ proto_qmi_init_config() {
> }
>
> proto_qmi_setup() {
> + set -x
> local interface="$1"
> local dataformat connstat plmn_mode mcc mnc
> local device apn auth username password pincode delay modes
> pdptype
> @@ -224,6 +225,8 @@ proto_qmi_setup() {
> fi
> done
>
> + registration=$(uqmi -s -d "$device" --get-serving-system)
> +
> [ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes
> "$modes" > /dev/null 2>&1
>
> echo "Starting network $interface"
>
> During the boot of the system, modem could not start automatically its
> network registration.
> netifd: wan (9235): + echo 'Waiting for network registration'
> netifd: wan (9235): Waiting for network registration
> netifd: wan (9235): + local 'registration_timeout=0'
> netifd: wan (9235): + uqmi -s -d /dev/cdc-wdm1 --get-serving-system
> netifd: wan (9235): + grep '"searching"'
> netifd: wan (9235): + uqmi -s -d /dev/cdc-wdm1 --get-serving-system
> netifd: wan (9235): +
> registration='{"registration":"not_registered","plmn_mcc":208,"plmn_mnc":20,"plmn_description":"","roaming":true}'
> netifd: wan (9235): + '[' -n ]
> netifd: wan (9235): + echo 'Starting network wan'
>
> As the while loop checks only "searching" pattern, uqmi.sh script
> quits searching loop and continues whereas the modem is not registered
>
> Other issue, after X seconds modem stop searching.
> netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system
> netifd: wan (9213): + grep '"searching"'
> netifd: wan (9213): + '[' -e /dev/cdc-wdm0 ]
> netifd: wan (9213): + '[' 3 -lt 0 -o 0 '=' 0 ]
> netifd: wan (9213): + let registration_timeout++
> netifd: wan (9213): + sleep 1
> netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system
> netifd: wan (9213): + grep '"searching"'
> netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system
> netifd: wan (9213): + registration='{"registration":"not_registered"}'
> netifd: wan (9213): + '[' -n ]
> netifd: wan (9213): + echo 'Starting network wan'
> netifd: wan (9213): Starting network wan
>
> If registration_timeout is not expired, registration can be restarted
>
> Signed-off-by: Thomas Richard <thomas.richard at kontron.com>
> ---
> package/network/utils/uqmi/Makefile | 2 +-
> .../utils/uqmi/files/lib/netifd/proto/qmi.sh | 35
> ++++++++++++++++------
> 2 files changed, 27 insertions(+), 10 deletions(-)
>
> diff --git a/package/network/utils/uqmi/Makefile
> b/package/network/utils/uqmi/Makefile
> index 68958a3729..da54ba0f46 100644
> --- a/package/network/utils/uqmi/Makefile
> +++ b/package/network/utils/uqmi/Makefile
> @@ -1,7 +1,7 @@
> include $(TOPDIR)/rules.mk
>
> PKG_NAME:=uqmi
> -PKG_RELEASE:=2
> +PKG_RELEASE:=3
>
> PKG_SOURCE_PROTO:=git
> PKG_SOURCE_URL=$(PROJECT_GIT)/project/uqmi.git
> diff --git a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh
> b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh
> index a6c785eb56..c29187cfbf 100755
> --- a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh
> +++ b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh
> @@ -209,19 +209,36 @@ proto_qmi_setup() {
>
> uqmi -s -d "$device" --sync > /dev/null 2>&1
>
> + uqmi -s -d "$device" --network-register > /dev/null 2>&1
> +
> echo "Waiting for network registration"
> + sleep 1
> local registration_timeout=0
> - while uqmi -s -d "$device" --get-serving-system | grep '"searching"'
> > /dev/null; do
> - [ -e "$device" ] || return 1
> - if [ "$registration_timeout" -lt "$timeout" -o "$timeout" = "0" ];
> then
Could we please use not -o or -a?
In OpenWrt we prefer && or || pattern
> - let registration_timeout++
> - sleep 1;
> + local registration_state=""
> + while true; do
> + registration_state=$(uqmi -s -d "$device" --get-serving-system
> 2>/dev/null | jsonfilter -e "@.registration" 2>/dev/null)
> +
> + [ "$registration_state" = "registered" ] && break
> +
> + if [ "$registration_state" = "searching" -o "$registration_state" =
> "not_registered" ]; then
> + [ "$registration_timeout" -lt "$timeout" -o "$timeout" = "0" ] && {
> + [ "$registration_state" = "searching" ] || {
> + echo "Device stopped network registration. Restart
> network registration"
> + uqmi -s -d "$device" --network-register > /dev/null 2>&1
> + }
> + let registration_timeout++
> + sleep 1
> + continue
> + }
> + echo "Network registration failed, registration timeout reached"
> else
> - echo "Network registration failed"
> - proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED
> - proto_block_restart "$interface"
> - return 1
> + # registration_state is 'registration_denied' or 'unknown' or ''
> + echo "Network registration failed (reason: '$registration_state')"
> fi
> +
> + proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED
> + proto_block_restart "$interface"
> + return 1
> done
>
> [ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes "$modes"
> > /dev/null 2>&1
More information about the openwrt-devel
mailing list