uqmi: set plmn only if necessary
authorMartin Schiller <ms@dev.tdt.de>
Wed, 28 Aug 2019 05:24:33 +0000 (07:24 +0200)
committerDaniel Golle <daniel@makrotopia.org>
Tue, 24 Nov 2020 15:18:16 +0000 (15:18 +0000)
Setting the plmn to '0' (auto) will implicitly lead to a (delayed)
network re-registration, which could further lead to some timing
related issues in the qmi proto handler.

On the other hand, if you switch back from manual plmn selection
to auto mode you have to set it to '0', because this setting is
permanently "saved" in the wwan module.

Conclusion:
If plmn is configured, check if it's already set euqally in the module.
If so, do nothing. Otherwise set it.

Signed-off-by: Martin Schiller <ms@dev.tdt.de>
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
package/network/utils/uqmi/Makefile
package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh

index c892c3f8e8b993bf88d454bf2c77f28fceca3160..68958a372919eecd1513bdf03adff8c116a175c4 100644 (file)
@@ -1,7 +1,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=uqmi
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE_PROTO:=git
 PKG_SOURCE_URL=$(PROJECT_GIT)/project/uqmi.git
index 13a4fc96119b24ff18ded552f00f38380e7853c5..a6c785eb563d680b0ce672cb82477b7dc4fdf69c 100755 (executable)
@@ -30,7 +30,7 @@ proto_qmi_init_config() {
 
 proto_qmi_setup() {
        local interface="$1"
-       local dataformat connstat
+       local dataformat connstat plmn_mode mcc mnc
        local device apn auth username password pincode delay modes pdptype
        local profile dhcp dhcpv6 autoconnect plmn timeout mtu $PROTO_DEFAULT_OPTIONS
        local ip4table ip6table
@@ -152,24 +152,38 @@ proto_qmi_setup() {
                esac
        fi
 
-       [ -n "$plmn" ] && {
-               local mcc mnc
-               if [ "$plmn" = 0 ]; then
+       if [ -n "$plmn" ]; then
+               json_load "$(uqmi -s -d "$device" --get-plmn)"
+               json_get_var plmn_mode mode
+               json_get_vars mcc mnc || {
                        mcc=0
                        mnc=0
-                       echo "Setting PLMN to auto"
-               else
+               }
+
+               if [ "$plmn" = "0" ]; then
+                       if [ "$plmn_mode" != "automatic" ]; then
+                               mcc=0
+                               mnc=0
+                               echo "Setting PLMN to auto"
+                       fi
+               elif [ "$mcc" -ne "${plmn:0:3}" -o "$mnc" -ne "${plmn:3}" ]; then
                        mcc=${plmn:0:3}
                        mnc=${plmn:3}
                        echo "Setting PLMN to $plmn"
+               else
+                       mcc=""
+                       mnc=""
                fi
+       fi
+
+       if [ -n "$mcc" -a -n "$mnc" ]; then
                uqmi -s -d "$device" --set-plmn --mcc "$mcc" --mnc "$mnc" > /dev/null 2>&1 || {
                        echo "Unable to set PLMN"
                        proto_notify_error "$interface" PLMN_FAILED
                        proto_block_restart "$interface"
                        return 1
                }
-       }
+       fi
 
        # Cleanup current state if any
        uqmi -s -d "$device" --stop-network 0xffffffff --autoconnect > /dev/null 2>&1