uqmi: don't block restart on failed registration
[openwrt/staging/wigyori.git] / package / network / utils / uqmi / files / lib / netifd / proto / qmi.sh
index c2c5fc1eca0baf714be018f7864e2ab1bdc07403..f4432b4fa33676e0bacc7e7e6e7a0244cc11c37d 100755 (executable)
@@ -11,6 +11,7 @@ proto_qmi_init_config() {
        no_device=1
        proto_config_add_string "device:device"
        proto_config_add_string apn
+       proto_config_add_string v6apn
        proto_config_add_string auth
        proto_config_add_string username
        proto_config_add_string password
@@ -19,6 +20,7 @@ proto_qmi_init_config() {
        proto_config_add_string modes
        proto_config_add_string pdptype
        proto_config_add_int profile
+       proto_config_add_int v6profile
        proto_config_add_boolean dhcp
        proto_config_add_boolean dhcpv6
        proto_config_add_boolean autoconnect
@@ -31,14 +33,14 @@ proto_qmi_init_config() {
 proto_qmi_setup() {
        local interface="$1"
        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 device apn v6apn auth username password pincode delay modes pdptype
+       local profile v6profile dhcp dhcpv6 autoconnect plmn timeout mtu $PROTO_DEFAULT_OPTIONS
        local ip4table ip6table
        local cid_4 pdh_4 cid_6 pdh_6
        local ip_6 ip_prefix_length gateway_6 dns1_6 dns2_6
 
-       json_get_vars device apn auth username password pincode delay modes
-       json_get_vars pdptype profile dhcp dhcpv6 autoconnect plmn ip4table
+       json_get_vars device apn v6apn auth username password pincode delay modes
+       json_get_vars pdptype profile v6profile dhcp dhcpv6 autoconnect plmn ip4table
        json_get_vars ip6table timeout mtu $PROTO_DEFAULT_OPTIONS
 
        [ "$timeout" = "" ] && timeout="10"
@@ -81,6 +83,8 @@ proto_qmi_setup() {
 
        echo "Waiting for SIM initialization"
        local uninitialized_timeout=0
+       # timeout 3s for first call to avoid hanging uqmi
+       uqmi -d "$device" --get-pin-status -t 3000 > /dev/null 2>&1
        while uqmi -s -d "$device" --get-pin-status | grep '"UIM uninitialized"' > /dev/null; do
                [ -e "$device" ] || return 1
                if [ "$uninitialized_timeout" -lt "$timeout" -o "$timeout" = "0" ]; then
@@ -192,6 +196,7 @@ proto_qmi_setup() {
 
        # Cleanup current state if any
        uqmi -s -d "$device" --stop-network 0xffffffff --autoconnect > /dev/null 2>&1
+       uqmi -s -d "$device" --set-ip-family ipv6 --stop-network 0xffffffff --autoconnect > /dev/null 2>&1
 
        # Go online
        uqmi -s -d "$device" --set-device-operating-mode online > /dev/null 2>&1
@@ -242,7 +247,6 @@ proto_qmi_setup() {
                fi
 
                proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED
-               proto_block_restart "$interface"
                return 1
        done
 
@@ -308,10 +312,13 @@ proto_qmi_setup() {
 
                uqmi -s -d "$device" --set-client-id wds,"$cid_6" --set-ip-family ipv6 > /dev/null 2>&1
 
+               : "${v6apn:=${apn}}"
+               : "${v6profile:=${profile}}"
+
                pdh_6=$(uqmi -s -d "$device" --set-client-id wds,"$cid_6" \
                        --start-network \
-                       ${apn:+--apn $apn} \
-                       ${profile:+--profile $profile} \
+                       ${v6apn:+--apn $v6apn} \
+                       ${v6profile:+--profile $v6profile} \
                        ${auth:+--auth-type $auth} \
                        ${username:+--username $username} \
                        ${password:+--password $password} \
@@ -326,7 +333,7 @@ proto_qmi_setup() {
                fi
 
                # Check data connection state
-               connstat=$(uqmi -s -d "$device" --set-client-id wds,"$cid_6" --get-data-status)
+               connstat=$(uqmi -s -d "$device" --set-client-id wds,"$cid_6" --set-ip-family ipv6 --get-data-status)
                [ "$connstat" == '"connected"' ] || {
                        echo "No data link!"
                        uqmi -s -d "$device" --set-client-id wds,"$cid_6" --release-client-id wds > /dev/null 2>&1
@@ -382,6 +389,7 @@ proto_qmi_setup() {
                        json_init
                        json_add_string name "${interface}_6"
                        json_add_string ifname "@$interface"
+                       [ "$pdptype" = "ipv4v6" ] && json_add_string iface_464xlat "0"
                        json_add_string proto "dhcpv6"
                        [ -n "$ip6table" ] && json_add_string ip6table "$ip6table"
                        proto_add_dynamic_defaults