uqmi: Add support for specifying profile index

Update uqmi to latest version, which brings about support for
specifying a call profile index instead of APN. A specific index
different from 1 must be used for some service provider and modem
combinations.

Also change option dhcp to dhcpv6, since IPv4 now always uses DHCP,
replace option ipv6 with pdptype, which is less ambiguous, and
make autoconnect optional and default it to off for IPv6 due to it
not working with statically configured IPv6.

Signed-off-by: Matti Laakso <malaakso@elisanet.fi>
This commit is contained in:
Matti Laakso 2016-12-11 17:23:38 +02:00 committed by John Crispin
parent 866b7bad00
commit 2e2748b053
2 changed files with 94 additions and 83 deletions

View file

@ -1,15 +1,15 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=uqmi
PKG_VERSION:=2016-08-23
PKG_VERSION:=2016-11-22
PKG_RELEASE=$(PKG_SOURCE_VERSION)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL=$(LEDE_GIT)/project/uqmi.git
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=eb1dec7d0dc283a7f61aa574a443a0ab61f8793f
PKG_SOURCE_VERSION:=d682e966615fc652da6e4e26b57aa3adfebeb2fe
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
PKG_MIRROR_MD5SUM:=e6273e6aee6fce419e13f84439c240d48c32020fce7f07b2dc123ae32742382c
PKG_MIRROR_MD5SUM:=a82c4682d07870d1bdf63e475afe1c1fffabf0954a49e0e67058dae0d4f6f71c
PKG_MAINTAINER:=Matti Laakso <malaakso@elisanet.fi>
PKG_LICENSE:=GPL-2.0

View file

@ -15,24 +15,22 @@ proto_qmi_init_config() {
proto_config_add_string username
proto_config_add_string password
proto_config_add_string pincode
proto_config_add_string delay
proto_config_add_int delay
proto_config_add_string modes
proto_config_add_boolean ipv6
proto_config_add_boolean dhcp
proto_config_add_string pdptype
proto_config_add_int profile
proto_config_add_boolean dhcpv6
proto_config_add_boolean autoconnect
proto_config_add_defaults
}
proto_qmi_setup() {
local interface="$1"
local device apn auth username password pincode delay modes ipv6 dhcp $PROTO_DEFAULT_OPTIONS
local cid_4 pdh_4 cid_6 pdh_6 ipv4
local ip subnet gateway dns1 dns2 ip_6 ip_prefix_length gateway_6 dns1_6 dns2_6
json_get_vars device apn auth username password pincode delay modes ipv6 dhcp $PROTO_DEFAULT_OPTIONS
ipv4=1
[ "$ipv6" = 1 ] || ipv6=""
local device apn auth username password pincode delay modes pdptype profile dhcpv6 autoconnect $PROTO_DEFAULT_OPTIONS
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 pdptype profile dhcpv6 autoconnect $PROTO_DEFAULT_OPTIONS
[ "$metric" = "" ] && metric="0"
@ -76,18 +74,6 @@ proto_qmi_setup() {
}
}
[ -n "$apn" ] || {
echo "No APN specified"
proto_notify_error "$interface" NO_APN
return 1
}
# try to clear previous autoconnect state
# do not reuse previous wds client id to prevent hangs caused by stale data
uqmi -s -d "$device" \
--stop-network 0xffffffff \
--autoconnect > /dev/null
uqmi -s -d "$device" --set-data-format 802.3
uqmi -s -d "$device" --wda-set-data-format 802.3
@ -98,68 +84,96 @@ proto_qmi_setup() {
[ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes "$modes"
echo "Starting network $apn"
echo "Starting network $interface"
cid_4=`uqmi -s -d "$device" --get-client-id wds`
[ $? -ne 0 ] && {
echo "Unable to obtain client ID"
proto_notify_error "$interface" NO_CID
return 1
pdptype=`echo "$pdptype" | awk '{print tolower($0)}'`
[ "$pdptype" = "ip" -o "$pdptype" = "ipv6" -o "$pdptype" = "ipv4v6" ] || pdptype="ip"
if [ "$pdptype" = "ip" ]; then
[ -z "$autoconnect" ] && autoconnect=1
[ "$autoconnect" = 0 ] && autoconnect=""
else
[ "$autoconnect" = 1 ] || autoconnect=""
fi
[ "$pdptype" = "ip" -o "$pdptype" = "ipv4v6" ] && {
cid_4=`uqmi -s -d "$device" --get-client-id wds`
[ $? -ne 0 ] && {
echo "Unable to obtain client ID"
proto_notify_error "$interface" NO_CID
return 1
}
uqmi -s -d "$device" --set-client-id wds,"$cid_4" --set-ip-family ipv4 > /dev/null
# try to clear previous autoconnect state
uqmi -s -d "$device" --set-client-id wds,"$cid_4" \
--stop-network 0xffffffff \
--autoconnect > /dev/null
pdh_4=`uqmi -s -d "$device" --set-client-id wds,"$cid_4" \
--start-network \
${apn:+--apn $apn} \
${profile:+--profile $profile} \
${auth:+--auth-type $auth} \
${username:+--username $username} \
${password:+--password $password} \
${autoconnect:+--autoconnect}`
[ $? -ne 0 ] && {
echo "Unable to connect IPv4"
uqmi -s -d "$device" --set-client-id wds,"$cid_4" --release-client-id wds
proto_notify_error "$interface" CALL_FAILED
return 1
}
}
pdh_4=`uqmi -s -d "$device" --set-client-id wds,"$cid_4" \
--start-network "$apn" \
${auth:+--auth-type $auth} \
${username:+--username $username} \
${password:+--password $password} \
--ip-family ipv4 \
--autoconnect`
[ $? -ne 0 ] && {
echo "Unable to connect IPv4"
uqmi -s -d "$device" --set-client-id wds,"$cid_4" --release-client-id wds
ipv4=""
}
[ -n "$ipv6" ] && {
[ "$pdptype" = "ipv6" -o "$pdptype" = "ipv4v6" ] && {
cid_6=`uqmi -s -d "$device" --get-client-id wds`
if [ $? = 0 ]; then
pdh_6=`uqmi -s -d "$device" --set-client-id wds,"$cid_6" \
--start-network "$apn" \
${auth:+--auth-type $auth} \
${username:+--username $username} \
${password:+--password $password} \
--ip-family ipv6 --autoconnect`
[ $? -ne 0 ] && {
echo "Unable to connect IPv6"
uqmi -s -d "$device" --set-client-id wds,"$cid_6" --release-client-id wds
ipv6=""
}
else
echo "Unable to connect IPv6"
ipv6=""
fi
}
[ $? -ne 0 ] && {
echo "Unable to obtain client ID"
proto_notify_error "$interface" NO_CID
return 1
}
[ -z "$ipv4" -a -z "$ipv6" ] && {
echo "Unable to connect"
proto_notify_error "$interface" CALL_FAILED
return 1
uqmi -s -d "$device" --set-client-id wds,"$cid_6" --set-ip-family ipv6 > /dev/null
# try to clear previous autoconnect state
uqmi -s -d "$device" --set-client-id wds,"$cid_6" \
--stop-network 0xffffffff \
--autoconnect > /dev/null
pdh_6=`uqmi -s -d "$device" --set-client-id wds,"$cid_6" \
--start-network \
${apn:+--apn $apn} \
${profile:+--profile $profile} \
${auth:+--auth-type $auth} \
${username:+--username $username} \
${password:+--password $password} \
${autoconnect:+--autoconnect}`
[ $? -ne 0 ] && {
echo "Unable to connect IPv6"
uqmi -s -d "$device" --set-client-id wds,"$cid_6" --release-client-id wds
proto_notify_error "$interface" CALL_FAILED
return 1
}
}
echo "Setting up $ifname"
proto_init_update "$ifname" 1
proto_set_keep 1
proto_add_data
[ -n "$ipv4" ] && {
[ -n "$pdh_4" ] && {
json_add_string "cid_4" "$cid_4"
json_add_string "pdh_4" "$pdh_4"
}
[ -n "$ipv6" ] && {
[ -n "$pdh_6" ] && {
json_add_string "cid_6" "$cid_6"
json_add_string "pdh_6" "$pdh_6"
}
[ -n "$ipv6" ] && {
if [ -z "$dhcp" -o "$dhcp" = 0 ]; then
proto_close_data
proto_send_update "$interface"
[ -n "$pdh_6" ] && {
if [ -z "$dhcpv6" -o "$dhcpv6" = 0 ]; then
json_load "$(uqmi -s -d $device --set-client-id wds,$cid_6 --get-current-settings)"
json_select ipv6
json_get_var ip_6 ip
@ -168,7 +182,8 @@ proto_qmi_setup() {
json_get_var dns2_6 dns2
json_get_var ip_prefix_length ip-prefix-length
# RFC 7278: Extend an IPv6 /64 Prefix to LAN
proto_init_update "$ifname" 1
proto_set_keep 1
proto_add_ipv6_address "$ip_6" "128"
proto_add_ipv6_prefix "${ip_6}/${ip_prefix_length}"
proto_add_ipv6_route "$gateway_6" "128"
@ -177,9 +192,7 @@ proto_qmi_setup() {
proto_add_dns_server "$dns1_6"
proto_add_dns_server "$dns2_6"
}
proto_add_data
json_add_string "cid_6" "$cid_6"
json_add_string "pdh_6" "$pdh_6"
proto_send_update "$interface"
else
json_init
json_add_string name "${interface}_6"
@ -193,10 +206,7 @@ proto_qmi_setup() {
fi
}
proto_close_data
proto_send_update "$interface"
[ -n "$ipv4" ] && {
[ -n "$pdh_4" ] && {
json_init
json_add_string name "${interface}_4"
json_add_string ifname "@$interface"
@ -213,8 +223,9 @@ qmi_wds_stop() {
[ -n "$cid" ] || return
# disable previous autoconnect state using the global handle
uqmi -s -d "$device" --set-client-id wds,"$cid" --stop-network "0xffffffff"
uqmi -s -d "$device" --set-client-id wds,"$cid" \
--stop-network 0xffffffff \
--autoconnect > /dev/null
[ -n "$pdh" ] && uqmi -s -d "$device" --set-client-id wds,"$cid" --stop-network "$pdh"
uqmi -s -d "$device" --set-client-id wds,"$cid" --release-client-id wds
@ -228,7 +239,7 @@ proto_qmi_teardown() {
[ -n "$ctl_device" ] && device=$ctl_device
echo "Stopping network"
echo "Stopping network $interface"
json_load "$(ubus call network.interface.$interface status)"
json_select data