umbim: detect actual connection IP type
authorLech Perczak <lech.perczak@gmail.com>
Mon, 21 Feb 2022 21:48:10 +0000 (22:48 +0100)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 29 Apr 2023 19:33:04 +0000 (21:33 +0200)
Current implementation needlessly creates both IPv4 and IPv6
sub-interfaces for single-stack IP types. Limit this only to selected IP
type. While at that, ensure that IP type is also passed to umbim during
"connect" phase. In addition, detect the actual established connection
type returned by umbim and set up subinterfaces according to that,
not to requested configuration. While at that, allow empty IP type explicitly,
interpreted as "any" according to MBIM specification.

Signed-off-by: Lech Perczak <lech.perczak@gmail.com>
package/network/utils/umbim/files/lib/netifd/proto/mbim.sh

index c6fa6665ef399b36ca8988801800bb3accf7749b..c5f3663271082eb18183857b3aacbadbb1f2c14c 100755 (executable)
@@ -149,10 +149,13 @@ _proto_mbim_setup() {
        tid=$((tid + 1))
 
        pdptype=$(echo "$pdptype" | awk '{print tolower($0)}')
-       [ "$pdptype" = "ipv4" -o "$pdptype" = "ipv6" -o "$pdptype" = "ipv4v6" ] || pdptype="ipv4v6"
 
+       local req_pdptype="" # Pass "default" PDP type to umbim if unconfigured
+       [ "$pdptype" = "ipv4" -o "$pdptype" = "ipv6" -o "$pdptype" = "ipv4v6" ] && req_pdptype="$pdptype:"
+
+       local connect_state
        echo "mbim[$$]" "Connect to network"
-       umbim $DBG -n -t $tid -d $device connect "$pdptype:$apn" "$auth" "$username" "$password" || {
+       connect_state=$(umbim $DBG -n -t $tid -d $device connect "$req_pdptype$apn" "$auth" "$username" "$password") || {
                echo "mbim[$$]" "Failed to connect bearer"
                tid=$((tid + 1))
                umbim $DBG -t $tid -d "$device" disconnect
@@ -161,6 +164,9 @@ _proto_mbim_setup() {
        }
        tid=$((tid + 1))
 
+       echo "$connect_state"
+       local iptype="$(echo "$connect_state" | grep iptype: | awk '{print $4}')"
+
        echo "mbim[$$]" "Connected"
 
        if [ "$dhcp" = 0 ]; then
@@ -171,7 +177,7 @@ _proto_mbim_setup() {
                proto_init_update "$ifname" 1
                proto_send_update "$interface"
 
-               [ "$pdptype" = "ipv4" -o "$pdptype" = "ipv4v6" ] && {
+               [ "$iptype" != "ipv6" ] && {
                        json_init
                        json_add_string name "${interface}_4"
                        json_add_string ifname "@$interface"
@@ -188,7 +194,7 @@ _proto_mbim_setup() {
                        ubus call network add_dynamic "$(json_dump)"
                }
 
-               [ "$pdptype" = "ipv6" -o "$pdptype" = "ipv4v6" ] && {
+               [ "$iptype" != "ipv4" ] && {
                        json_init
                        json_add_string name "${interface}_6"
                        json_add_string ifname "@$interface"