@ -17,28 +17,25 @@ proto_qmi_init_config() {
proto_config_add_string pincode
proto_config_add_string pincode
proto_config_add_string delay
proto_config_add_string delay
proto_config_add_string modes
proto_config_add_string modes
proto_config_add_boolean ipv6
proto_config_add_boolean dhcp
}
}
qmi_disconnect( ) {
proto_qmi_setup( ) {
# disable previous autoconnect state using the global handle
local interface = " $1 "
# do not reuse previous wds client id to prevent hangs caused by stale data
uqmi -s -d " $device " \
--stop-network 0xffffffff \
--autoconnect > /dev/null
}
qmi_wds_release( ) {
[ -n " $cid " ] || return 0
uqmi -s -d " $device " --set-client-id wds," $cid " --release-client-id wds
local device apn auth username password pincode delay modes ipv6 dhcp
uci_revert_state network $interface cid
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_qmi_setup( ) {
ipv4 = 1
local interface = " $1 "
local device apn auth username password pincode delay modes cid pdh
if [ " $ipv6 " = 0 ] ; then
json_get_vars device apn auth username password pincode delay modes
ipv6 = ""
else
ipv6 = 1
fi
[ -n " $ctl_device " ] && device = $ctl_device
[ -n " $ctl_device " ] && device = $ctl_device
@ -86,8 +83,6 @@ _proto_qmi_setup() {
return 1
return 1
}
}
qmi_disconnect
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
@ -99,67 +94,159 @@ _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 $apn "
cid = ` 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"
proto_notify_error " $interface " NO_CID
proto_notify_error " $interface " NO_CID
return 1
return 1
}
}
uqmi -s -d " $device " --set-client-id wds," $cid " \
pdh_4 = ` uqmi -s -d " $device " --set-client-id wds," $cid_4 " \
--start-network " $apn " \
--start-network " $apn " \
${ auth : +--auth-type $auth } \
${ auth : +--auth-type $auth } \
${ username : +--username $username } \
${ username : +--username $username } \
${ password : +--password $password } \
${ password : +--password $password } \
--autoconnect > /dev/null
--ip-family ipv4`
[ $? -ne 0 ] && {
echo "Starting DHCP"
echo "Unable to connect IPv4"
proto_init_update " $ifname " 1
uqmi -s -d " $device " --set-client-id wds," $cid_4 " --release-client-id wds
proto_send_update " $interface "
ipv4 = ""
}
json_init
json_add_string name " ${ interface } _4 "
json_add_string ifname " @ $interface "
json_add_string proto "dhcp"
json_close_object
ubus call network add_dynamic " $( json_dump) "
json_init
json_add_string name " ${ interface } _6 "
json_add_string ifname " @ $interface "
json_add_string proto "dhcpv6"
json_add_string extendprefix 1
json_close_object
ubus call network add_dynamic " $( json_dump) "
}
proto_qmi_setup( ) {
local ret
_proto_qmi_setup $@
[ -n " $ipv6 " ] && {
ret = $?
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`
[ $? -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
}
[ " $ret " = 0 ] || {
[ -z " $ipv4 " -a -z " $ipv6 " ] && {
logger "qmi bringup failed, retry in 15s"
echo "Unable to connect"
sleep 15
proto_notify_error " $interface " CALL_FAILED
return 1
}
}
return $rt
if [ -z " $dhcp " ] ; then
echo " Setting up $ifname "
[ -n " $ipv4 " ] && {
json_load " $( uqmi -s -d $device --set-client-id wds,$cid_4 --get-current-settings) "
json_select ipv4
json_get_vars ip subnet gateway dns1 dns2
proto_init_update " $ifname " 1
proto_set_keep 1
proto_add_ipv4_address " $ip " " $subnet "
proto_add_dns_server " $dns1 "
proto_add_dns_server " $dns2 "
proto_add_ipv4_route "0.0.0.0" 0 " $gateway "
proto_add_data
json_add_string "cid_4" " $cid_4 "
json_add_string "pdh_4" " $pdh_4 "
proto_close_data
proto_send_update " $interface "
}
[ -n " $ipv6 " ] && {
json_load " $( uqmi -s -d $device --set-client-id wds,$cid_6 --get-current-settings) "
json_select ipv6
json_get_var ip_6 ip
json_get_var gateway_6 gateway
json_get_var dns1_6 dns1
json_get_var dns2_6 dns2
json_get_var ip_prefix_length ip-prefix-length
proto_init_update " $ifname " 1
proto_set_keep 1
# RFC 7278: Extend an IPv6 /64 Prefix to LAN
proto_add_ipv6_address " $ip_6 " "128"
proto_add_ipv6_prefix " ${ ip_6 } / ${ ip_prefix_length } "
proto_add_ipv6_route " $gateway_6 " "128"
proto_add_ipv6_route "::0" 0 " $gateway_6 " "" "" " ${ ip_6 } / ${ ip_prefix_length } "
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_close_data
proto_send_update " $interface "
}
else
echo " Starting DHCP on $ifname "
proto_init_update " $ifname " 1
proto_add_data
[ -n " $ipv4 " ] && {
json_add_string "cid_4" " $cid_4 "
json_add_string "pdh_4" " $pdh_4 "
}
[ -n " $ipv6 " ] && {
json_add_string "cid_6" " $cid_6 "
json_add_string "pdh_6" " $pdh_6 "
}
proto_close_data
proto_send_update " $interface "
[ -n " $ipv4 " ] && {
json_init
json_add_string name " ${ interface } _4 "
json_add_string ifname " @ $interface "
json_add_string proto "dhcp"
json_close_object
ubus call network add_dynamic " $( json_dump) "
}
[ -n " $ipv6 " ] && {
json_init
json_add_string name " ${ interface } _6 "
json_add_string ifname " @ $interface "
json_add_string proto "dhcpv6"
# RFC 7278: Extend an IPv6 /64 Prefix to LAN
json_add_string extendprefix 1
json_close_object
ubus call network add_dynamic " $( json_dump) "
}
fi
}
}
proto_qmi_teardown( ) {
proto_qmi_teardown( ) {
local interface = " $1 "
local interface = " $1 "
local device
local device cid_4 pdh_4 cid_6 pdh_6
json_get_vars device
json_get_vars device
[ -n " $ctl_device " ] && device = $ctl_device
[ -n " $ctl_device " ] && device = $ctl_device
local cid = $( uci_get_state network $interface cid)
echo "Stopping network"
echo "Stopping network"
qmi_disconnect
qmi_wds_release
json_load " $( ubus call network.interface.$interface status) "
json_select data
json_get_vars cid_4 pdh_4 cid_6 pdh_6
[ -n " $cid_4 " ] && {
[ -n " $pdh_4 " ] && {
uqmi -s -d " $device " --set-client-id wds," $cid_4 " --stop-network " $pdh_4 "
uqmi -s -d " $device " --set-client-id wds," $cid_4 " --release-client-id wds
}
}
[ -n " $cid_6 " ] && {
[ -n " $pdh_6 " ] && {
uqmi -s -d " $device " --set-client-id wds," $cid_6 " --stop-network " $pdh_6 "
uqmi -s -d " $device " --set-client-id wds," $cid_6 " --release-client-id wds
}
}
proto_init_update "*" 0
proto_init_update "*" 0
proto_send_update " $interface "
proto_send_update " $interface "