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 include $(TOPDIR)/rules.mk
PKG_NAME:=uqmi PKG_NAME:=uqmi
PKG_VERSION:=2016-08-23 PKG_VERSION:=2016-11-22
PKG_RELEASE=$(PKG_SOURCE_VERSION) PKG_RELEASE=$(PKG_SOURCE_VERSION)
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL=$(LEDE_GIT)/project/uqmi.git PKG_SOURCE_URL=$(LEDE_GIT)/project/uqmi.git
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) 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_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_MAINTAINER:=Matti Laakso <malaakso@elisanet.fi>
PKG_LICENSE:=GPL-2.0 PKG_LICENSE:=GPL-2.0

View file

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