@ -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
}
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 = ""
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
}
}
[ -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