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:
parent
866b7bad00
commit
2e2748b053
2 changed files with 94 additions and 83 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue