1027 lines
30 KiB
Bash
Executable File
1027 lines
30 KiB
Bash
Executable File
#!/bin/sh
|
||
source /lib/functions.sh
|
||
#运行目录
|
||
MODEM_RUNDIR="/var/run/qmodem"
|
||
SCRIPT_DIR="/usr/share/qmodem"
|
||
|
||
modem_config=$1
|
||
mkdir -p "${MODEM_RUNDIR}/${modem_config}_dir"
|
||
log_file="${MODEM_RUNDIR}/${modem_config}_dir/dial_log"
|
||
debug_subject="modem_dial"
|
||
source "${SCRIPT_DIR}/generic.sh"
|
||
touch $log_file
|
||
|
||
exec_pre_dial()
|
||
{
|
||
section=$1
|
||
/usr/share/qmodem/modem_hook.sh $section pre_dial
|
||
}
|
||
|
||
get_led()
|
||
{
|
||
config_foreach get_led_by_slot modem-slot
|
||
}
|
||
|
||
get_led_by_slot()
|
||
{
|
||
local cfg="$1"
|
||
config_get slot "$cfg" slot
|
||
if [ "$modem_slot" = "$slot" ];then
|
||
config_get sim_led "$cfg" sim_led
|
||
config_get net_led "$cfg" net_led
|
||
fi
|
||
}
|
||
|
||
get_associate_ethernet_by_path()
|
||
{
|
||
local cfg="$1"
|
||
config_get slot "$cfg" slot
|
||
config_get ethernet "$cfg" ethernet
|
||
if [ "$modem_slot" = "$slot" ];then
|
||
config_get ethernet_5g "$cfg" ethernet_5g
|
||
fi
|
||
}
|
||
|
||
set_led()
|
||
{
|
||
local type=$1
|
||
local modem_config=$2
|
||
local value=$3
|
||
get_led "$modem_slot"
|
||
case $type in
|
||
sim)
|
||
[ -z "$sim_led" ] && return
|
||
echo $value > /sys/class/leds/$sim_led/brightness
|
||
;;
|
||
net)
|
||
[ -z "$net_led" ] && return
|
||
cfg_name=$(echo $net_led |tr ":" "_")
|
||
uci batch << EOF
|
||
set system.n${cfg_name}=led
|
||
set system.n${cfg_name}.name=${modem_slot}_net_indicator
|
||
set system.n${cfg_name}.sysfs=${net_led}
|
||
set system.n${cfg_name}.trigger=netdev
|
||
set system.n${cfg_name}.dev=${modem_netcard}
|
||
set system.n${cfg_name}.mode="tx rx"
|
||
commit system
|
||
EOF
|
||
|
||
/etc/init.d/led restart
|
||
;;
|
||
esac
|
||
}
|
||
|
||
get_driver()
|
||
{
|
||
for i in $(find $modem_path -name driver);do
|
||
lsfile=$(ls -l $i)
|
||
type=${lsfile:0:1}
|
||
if [ "$type" == "l" ];then
|
||
link=$(basename $(ls -l $i | awk '{print $11}'))
|
||
case $link in
|
||
"mtk_t7xx")
|
||
mode="mtk_pcie"
|
||
break
|
||
;;
|
||
"qmi_wwan"*)
|
||
mode="qmi"
|
||
break
|
||
;;
|
||
"cdc_mbim")
|
||
mode="mbim"
|
||
break
|
||
;;
|
||
"cdc_ncm")
|
||
mode="ncm"
|
||
break
|
||
;;
|
||
"cdc_ether")
|
||
mode="ecm"
|
||
break
|
||
;;
|
||
"rndis_host")
|
||
mode="rndis"
|
||
break
|
||
;;
|
||
"mhi_netdev")
|
||
mode="mhi"
|
||
break
|
||
;;
|
||
*)
|
||
if [ -z "$mode" ]; then
|
||
mode="unknown"
|
||
fi
|
||
;;
|
||
esac
|
||
fi
|
||
done
|
||
echo $mode
|
||
}
|
||
|
||
unlock_sim()
|
||
{
|
||
pin=$1
|
||
sim_lock_file="/var/run/qmodem/${modem_config}_dir/pincode"
|
||
lock ${sim_lock_file}.lock
|
||
if [ -f $sim_lock_file ] && [ "$pin" == "$(cat $sim_lock_file)"];then
|
||
m_debug "pin code is already try"
|
||
else
|
||
|
||
res=$(at "$at_port" "AT+CPIN=\"$pin\"")
|
||
case "$?" in
|
||
0)
|
||
m_debug "unlock sim card with pin code $pin success"
|
||
;;
|
||
*)
|
||
echo $pin > $sim_lock_file
|
||
m_debug "info" "unlock sim card with pin code $pin failed,block try until nextboot"
|
||
;;
|
||
esac
|
||
fi
|
||
lock -u ${sim_lock_file}.lock
|
||
|
||
}
|
||
|
||
update_config()
|
||
{
|
||
config_load qmodem
|
||
config_get state $modem_config state
|
||
config_get enable_dial $modem_config enable_dial
|
||
config_get modem_path $modem_config path
|
||
config_get dial_tool $modem_config dial_tool
|
||
config_get pdp_type $modem_config pdp_type
|
||
config_get network_bridge $modem_config network_bridge
|
||
config_get metric $modem_config metric
|
||
config_get at_port $modem_config at_port
|
||
config_get manufacturer $modem_config manufacturer
|
||
config_get platform $modem_config platform
|
||
config_get define_connect $modem_config define_connect
|
||
config_get ra_master $modem_config ra_master
|
||
config_get extend_prefix $modem_config extend_prefix
|
||
config_get en_bridge $modem_config en_bridge
|
||
config_get do_not_add_dns $modem_config do_not_add_dns
|
||
config_get dns_list $modem_config dns_list
|
||
config_get global_dial main enable_dial
|
||
# config_get ethernet_5g u$modem_config ethernet 转往口获取命令更新,待测试
|
||
config_foreach get_associate_ethernet_by_path modem-slot
|
||
modem_slot=$(basename $modem_path)
|
||
config_get alias $modem_config alias
|
||
driver=$(get_driver)
|
||
update_sim_slot
|
||
case $sim_slot in
|
||
1)
|
||
config_get apn $modem_config apn
|
||
config_get username $modem_config username
|
||
config_get password $modem_config password
|
||
config_get auth $modem_config auth
|
||
config_get pincode $modem_config pincode
|
||
;;
|
||
2)
|
||
config_get apn $modem_config apn2
|
||
config_get username $modem_config username2
|
||
config_get password $modem_config password2
|
||
config_get auth $modem_config auth2
|
||
config_get pincode $modem_config pincode2
|
||
[ -z "$apn" ] && config_get apn $modem_config apn
|
||
[ -z "$username" ] && config_get username $modem_config username
|
||
[ -z "$password" ] && config_get password $modem_config password
|
||
[ -z "$auth" ] && config_get auth $modem_config auth
|
||
[ -z "$pin" ] && config_get pincode $modem_config pincode
|
||
;;
|
||
*)
|
||
config_get apn $modem_config apn
|
||
config_get username $modem_config username
|
||
config_get password $modem_config password
|
||
config_get auth $modem_config auth
|
||
config_get pincode $modem_config pincode
|
||
;;
|
||
esac
|
||
modem_net=$(find $modem_path -name net |tail -1)
|
||
modem_netcard=$(ls $modem_net)
|
||
interface_name=$modem_config
|
||
[ -n "$alias" ] && interface_name=$alias
|
||
interface6_name=${interface_name}v6
|
||
}
|
||
|
||
check_dial_prepare()
|
||
{
|
||
cpin=$(at "$at_port" "AT+CPIN?")
|
||
get_sim_status "$cpin"
|
||
case $sim_state_code in
|
||
"0")
|
||
m_debug "info sim card is miss"
|
||
;;
|
||
"1")
|
||
m_debug "info sim card is ready"
|
||
sim_fullfill=1
|
||
;;
|
||
"2")
|
||
m_debug "pin code required"
|
||
[ -n "$pincode" ] && unlock_sim $pincode
|
||
;;
|
||
*)
|
||
m_debug "info sim card state is $sim_state_code"
|
||
;;
|
||
esac
|
||
|
||
if [ "$sim_fullfill" = "1" ];then
|
||
set_led "sim" $modem_config 255
|
||
else
|
||
set_led "sim" $modem_config 0
|
||
fi
|
||
if [ -n "$modem_netcard" ] && [ -d "/sys/class/net/$modem_netcard" ];then
|
||
netdev_fullfill=1
|
||
else
|
||
netdev_fullfill=0
|
||
fi
|
||
|
||
if [ "$enable_dial" = "1" ] && [ "$sim_fullfill" = "1" ] && [ "$state" != "disabled" ] ;then
|
||
config_fullfill=1
|
||
fi
|
||
if [ "$config_fullfill" = "1" ] && [ "$sim_fullfill" = "1" ] && [ "$netdev_fullfill" = "1" ] ;then
|
||
at "$at_port" "AT+CFUN=1"
|
||
return 1
|
||
else
|
||
return 0
|
||
fi
|
||
}
|
||
|
||
check_ip()
|
||
{
|
||
case $manufacturer in
|
||
"quectel")
|
||
case $platform in
|
||
"qualcomm")
|
||
check_ip_command="AT+CGPADDR=1"
|
||
;;
|
||
"unisoc")
|
||
check_ip_command="AT+CGPADDR=1"
|
||
;;
|
||
"lte")
|
||
if [ "$define_connect" = "3" ];then
|
||
check_ip_command="AT+CGPADDR=3"
|
||
else
|
||
check_ip_command="AT+CGPADDR=1"
|
||
fi
|
||
;;
|
||
|
||
esac
|
||
;;
|
||
"fibocom")
|
||
case $platform in
|
||
"qualcomm")
|
||
check_ip_command="AT+CGPADDR=1"
|
||
;;
|
||
"unisoc")
|
||
check_ip_command="AT+CGPADDR=1"
|
||
;;
|
||
"lte")
|
||
check_ip_command="AT+CGPADDR=1"
|
||
;;
|
||
"mediatek")
|
||
check_ip_command="AT+CGPADDR=3"
|
||
stric=1
|
||
;;
|
||
esac
|
||
;;
|
||
"simcom")
|
||
case $platform in
|
||
"qualcomm")
|
||
check_ip_command="AT+CGPADDR=6"
|
||
;;
|
||
esac
|
||
;;
|
||
"meig")
|
||
case $platform in
|
||
"qualcomm")
|
||
check_ip_command="AT+CGPADDR=1"
|
||
;;
|
||
esac
|
||
;;
|
||
esac
|
||
ipaddr=$(at "$at_port" "$check_ip_command" | grep +CGPADDR:)
|
||
if [ -n "$ipaddr" ];then
|
||
if [ $mtk -eq 1 ] && echo "$ipv4_config" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'; then
|
||
if [ "$pdp_type" = "ipv4v6" ];then
|
||
if ! ping -c 2 -w 5 2400:3200::1 > /dev/null 2>&1; then
|
||
m_debug "ipv6 is down,try to restart"
|
||
ifdown "$interface6_name" && sleep 2 && ifup "$interface6_name"
|
||
fi
|
||
fi
|
||
fi
|
||
ipv6=$(echo $ipaddr | grep -oE "\b([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}\b")
|
||
ipv4=$(echo $ipaddr | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b")
|
||
if [ "$manufacturer" = "simcom" ];then
|
||
ipv4=$(echo $ipaddr | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | grep -v "0\.0\.0\.0" | head -n 1)
|
||
ipaddr=$(echo $ipaddr | sed 's/\./:/g' | sed 's/+CGPADDR: //g' | sed 's/'$ipv4',//g')
|
||
ipv6=$(echo $ipaddr | grep -oE "\b([0-9a-fA-F]{0,4}.){2,7}[0-9a-fA-F]{0,4}\b")
|
||
fi
|
||
disallow_ipv4="0.0.0.0"
|
||
#remove the disallow ip
|
||
if [ "$ipv4" == *"$disallow_ipv4"* ];then
|
||
ipv4=""
|
||
fi
|
||
connection_status=0
|
||
if [ -n "$ipv4" ];then
|
||
connection_status=1
|
||
fi
|
||
if [ -n "$ipv6" ];then
|
||
connection_status=2
|
||
fi
|
||
if [ -n "$ipv4" ] && [ -n "$ipv6" ];then
|
||
connection_status=3
|
||
fi
|
||
else
|
||
connection_status="-1"
|
||
m_debug "at port response unexpected $ipaddr"
|
||
fi
|
||
}
|
||
|
||
append_to_fw_zone()
|
||
{
|
||
local fw_zone=$1
|
||
local if_name=$2
|
||
source /etc/os-release
|
||
local os_version=${VERSION_ID:0:2}
|
||
if [ "$os_version" -le 21 ];then
|
||
has_ifname=0
|
||
origin_line=$(uci -q get firewall.@zone[${fw_zone}].network)
|
||
for i in $origin_line
|
||
do
|
||
if [ "$i" = "$if_name" ];then
|
||
has_ifname=1
|
||
fi
|
||
done
|
||
if [ -n "$origin_line" ] && [ "$has_ifname" -eq 0 ];then
|
||
uci set firewall.@zone[${fw_zone}].network="${origin_line} ${if_name}"
|
||
elif [ -z "$origin_line" ];then
|
||
uci set firewall.@zone[${fw_zone}].network="${if_name}"
|
||
fi
|
||
else
|
||
uci add_list firewall.@zone[${fw_zone}].network=${if_name}
|
||
fi
|
||
}
|
||
|
||
set_if()
|
||
{
|
||
fw_reload_flag=0
|
||
dhcp_reload_flag=0
|
||
network_reload_flag=0
|
||
#check if exist
|
||
proto="dhcp"
|
||
protov6="dhcpv6"
|
||
case $manufacturer in
|
||
"quectel")
|
||
case $platform in
|
||
"unisoc")
|
||
case $driver in
|
||
"mbim")
|
||
proto="none"
|
||
protov6="none"
|
||
;;
|
||
esac
|
||
;;
|
||
esac
|
||
;;
|
||
"fibocom")
|
||
case $platform in
|
||
"mediatek")
|
||
proto="static"
|
||
protov6="dhcpv6"
|
||
;;
|
||
esac
|
||
;;
|
||
esac
|
||
case $pdp_type in
|
||
"ip")
|
||
env4="1"
|
||
env6="0"
|
||
;;
|
||
"ipv6")
|
||
env4="0"
|
||
env6="1"
|
||
;;
|
||
"ipv4v6")
|
||
env4="1"
|
||
env6="1"
|
||
;;
|
||
esac
|
||
interface=$(uci -q get network.$interface_name)
|
||
interfacev6=$(uci -q get network.$interface6_name)
|
||
if [ "$env4" -eq 1 ];then
|
||
if [ -z "$inetrface" ];then
|
||
uci set network.${interface_name}=interface
|
||
uci set network.${interface_name}.modem_config="${modem_config}"
|
||
uci set network.${interface_name}.proto="${proto}"
|
||
uci set network.${interface_name}.defaultroute='1'
|
||
uci set network.${interface_name}.metric="${metric}"
|
||
uci del network.${interface_name}.dns
|
||
if [ -n "$dns_list" ];then
|
||
uci set network.${interface_name}.peerdns='0'
|
||
for dns in $dns_list;do
|
||
uci add_list network.${interface_name}.dns="${dns}"
|
||
done
|
||
else
|
||
uci del network.${interface_name}.peerdns
|
||
fi
|
||
local num=$(uci show firewall | grep "name='wan'" | wc -l)
|
||
local wwan_num=$(uci -q get firewall.@zone[$num].network | grep -w "${interface_name}" | wc -l)
|
||
if [ "$wwan_num" = "0" ]; then
|
||
append_to_fw_zone $num ${interface_name}
|
||
fi
|
||
network_reload_flag=1
|
||
firewall_reload_flag=1
|
||
m_debug "create interface $interface_name with proto $proto and metric $metric"
|
||
fi
|
||
else
|
||
if [ -n "$interface" ];then
|
||
uci delete network.${interface_name}
|
||
network_reload_flag=1
|
||
m_debug "delete interface $interface_name"
|
||
fi
|
||
fi
|
||
if [ "$env6" -eq 1 ];then
|
||
if [ -z "$interfacev6" ];then
|
||
uci set network.lan.ipv6='1'
|
||
uci set network.lan.ip6assign='64'
|
||
uci set network.${interface6_name}='interface'
|
||
uci set network.${interface6_name}.modem_config="${modem_config}"
|
||
uci set network.${interface6_name}.proto="${protov6}"
|
||
uci set network.${interface6_name}.ifname="@${interface_name}"
|
||
uci set network.${interface6_name}.device="@${interface_name}"
|
||
uci set network.${interface6_name}.metric="${metric}"
|
||
|
||
local wwan6_num=$(uci -q get firewall.@zone[$num].network | grep -w "${interface6_name}" | wc -l)
|
||
if [ "$wwan6_num" = "0" ]; then
|
||
append_to_fw_zone $num ${interface6_name}
|
||
fi
|
||
network_reload_flag=1
|
||
firewall_reload_flag=1
|
||
m_debug "create interface $interface6_name with proto $protov6 and metric $metric"
|
||
fi
|
||
if [ "$ra_master" = "1" ];then
|
||
uci set dhcp.${interface6_name}='dhcp'
|
||
uci set dhcp.${interface6_name}.interface="${interface6_name}"
|
||
uci set dhcp.${interface6_name}.ra='relay'
|
||
uci set dhcp.${interface6_name}.ndp='relay'
|
||
uci set dhcp.${interface6_name}.master='1'
|
||
uci set dhcp.${interface6_name}.ignore='1'
|
||
uci set dhcp.lan.ra='relay'
|
||
uci set dhcp.lan.ndp='relay'
|
||
uci set dhcp.lan.dhcpv6='relay'
|
||
dhcp_reload_flag=1
|
||
elif [ "$extend_prefix" = "1" ];then
|
||
uci set network.${interface6_name}.extendprefix=1
|
||
dhcpv6=$(uci -q get dhcp.${interface6_name})
|
||
if [ -n "$dhcpv6" ];then
|
||
uci delete dhcp.${interface6_name}
|
||
dhcp_reload_flag=1
|
||
fi
|
||
else
|
||
dhcpv6=$(uci -q get dhcp.${interface6_name})
|
||
if [ -n "$dhcpv6" ];then
|
||
uci delete dhcp.${interface6_name}
|
||
dhcp_reload_flag=1
|
||
fi
|
||
fi
|
||
else
|
||
if [ -n "$interfacev6" ];then
|
||
uci delete network.${interface6_name}
|
||
network_reload_flag=1
|
||
dhcpv6=$(uci -q get dhcp.${interface6_name})
|
||
if [ -n "$dhcpv6" ];then
|
||
dhcp_reload_flag=1
|
||
fi
|
||
m_debug "delete interface $interface6_name"
|
||
fi
|
||
fi
|
||
|
||
if [ "$network_reload_flag" -eq 1 ];then
|
||
uci commit network
|
||
ifup ${interface_name}
|
||
ifup ${interface6_name}
|
||
m_debug "network reload"
|
||
fi
|
||
if [ "$firewall_reload_flag" -eq 1 ];then
|
||
uci commit firewall
|
||
/etc/init.d/firewall restart
|
||
m_debug "firewall reload"
|
||
fi
|
||
if [ "$dhcp_reload_flag" -eq 1 ];then
|
||
uci commit dhcp
|
||
/etc/init.d/dhcp restart
|
||
m_debug "dhcp reload"
|
||
fi
|
||
|
||
|
||
set_modem_netcard=$modem_netcard
|
||
if [ -z "$set_modem_netcard" ];then
|
||
m_debug "no netcard found"
|
||
fi
|
||
ethernet_check=$(handle_5gethernet)
|
||
if [ -n "$ethernet_check" ] && [ -n "/sys/class/net/$ethernet_5g" ] && [ -n "$ethernet_5g" ];then
|
||
set_modem_netcard=$ethernet_5g
|
||
fi
|
||
#set led
|
||
set_led "net" $modem_config $set_modem_netcard
|
||
origin_netcard=$(uci -q get network.$interface_name.ifname)
|
||
origin_device=$(uci -q get network.$interface_name.device)
|
||
origin_metric=$(uci -q get network.$interface_name.metric)
|
||
origin_proto=$(uci -q get network.$interface_name.proto)
|
||
if [ "$origin_netcard" == "$set_modem_netcard" ] && [ "$origin_device" == "$set_modem_netcard" ] && [ "$origin_metric" == "$metric" ] && [ "$origin_proto" == "$proto" ];then
|
||
m_debug "interface $interface_name already set to $set_modem_netcard"
|
||
else
|
||
uci set network.${interface_name}.ifname="${set_modem_netcard}"
|
||
uci set network.${interface_name}.device="${set_modem_netcard}"
|
||
uci set network.${interface_name}.modem_config="${modem_config}"
|
||
if [ "$env4" -eq 1 ];then
|
||
uci set network.${interface_name}.proto="${proto}"
|
||
uci set network.${interface_name}.metric="${metric}"
|
||
fi
|
||
if [ "$env6" -eq 1 ];then
|
||
uci set network.${interface6_name}.proto="${protov6}"
|
||
uci set network.${interface6_name}.metric="${metric}"
|
||
fi
|
||
uci commit network
|
||
ifup ${interface_name}
|
||
m_debug "set interface $interface_name to $set_modem_netcard"
|
||
fi
|
||
}
|
||
|
||
flush_if()
|
||
{
|
||
# uci delete network.${interface_name}
|
||
# uci delete network.${interface6_name}
|
||
# uci delete dhcp.${interface6_name}
|
||
# uci commit network
|
||
# uci commit dhcp
|
||
# set_led "net" $modem_config
|
||
# set_led "sim" $modem_config 0
|
||
# m_debug "delete interface $interface_name"
|
||
config_load network
|
||
remove_target="$modem_config"
|
||
config_foreach flush_ip_cb "interface"
|
||
set_led "net" $modem_config
|
||
set_led "sim" $modem_config 0
|
||
m_debug "delete interface $interface_name"
|
||
uci commit network
|
||
uci commit dhcp
|
||
}
|
||
|
||
flush_ip_cb()
|
||
{
|
||
local network_cfg=$1
|
||
local bind_modem_config
|
||
config_get bind_modem_config "$network_cfg" modem_config
|
||
if [ "$remove_target" = "$bind_modem_config" ];then
|
||
uci delete network.$network_cfg
|
||
fi
|
||
|
||
}
|
||
|
||
|
||
dial(){
|
||
update_config
|
||
m_debug "modem_path=$modem_path,driver=$driver,interface=$interface_name,at_port=$at_port,using_sim_slot:$sim_slot,dns_list:$dns_list"
|
||
while [ "$dial_prepare" != 1 ] ; do
|
||
sleep 5
|
||
update_config
|
||
check_dial_prepare
|
||
dial_prepare=$?
|
||
done
|
||
set_if
|
||
m_debug "dialing $modem_path driver $driver"
|
||
exec_pre_dial $modem_config
|
||
case $driver in
|
||
"qmi")
|
||
qmi_dial
|
||
;;
|
||
"mbim")
|
||
mbim_dial
|
||
;;
|
||
"mhi")
|
||
mhi_dial
|
||
;;
|
||
"ncm")
|
||
at_dial_monitor
|
||
;;
|
||
"ecm")
|
||
at_dial_monitor
|
||
;;
|
||
"rndis")
|
||
at_dial_monitor
|
||
;;
|
||
"mtk_pcie")
|
||
at_dial_monitor
|
||
;;
|
||
*)
|
||
mbim_dial
|
||
;;
|
||
esac
|
||
}
|
||
|
||
wwan_hang()
|
||
{
|
||
m_debug "wwan_hang"
|
||
}
|
||
|
||
|
||
ecm_hang()
|
||
{
|
||
if [ "$manufacturer" = "quectel" ]; then
|
||
at_command="AT+QNETDEVCTL=1,2,1"
|
||
elif [ "$manufacturer" = "fibocom" ]; then
|
||
#联发科平台(广和通FM350-GL)
|
||
if [ "$platform" = "mediatek" ]; then
|
||
at_command="AT+CGACT=0,3"
|
||
else
|
||
at_command="AT+GTRNDIS=0,1"
|
||
fi
|
||
elif [ "$manufacturer" = "meig" ]; then
|
||
at_command="AT$QCRMCALL=0,1,1,2,1"
|
||
else
|
||
at_command='ATI'
|
||
fi
|
||
|
||
tmp=$(at "${at_port}" "${at_command}")
|
||
}
|
||
|
||
|
||
hang()
|
||
{
|
||
m_debug "hang up $modem_path driver $driver"
|
||
case $driver in
|
||
"ncm")
|
||
ecm_hang
|
||
;;
|
||
"ecm")
|
||
ecm_hang
|
||
;;
|
||
"rndis")
|
||
ecm_hang
|
||
;;
|
||
"qmi")
|
||
wwan_hang
|
||
;;
|
||
"mbim")
|
||
wwan_hang
|
||
;;
|
||
"mhi")
|
||
wwan_hang
|
||
;;
|
||
esac
|
||
flush_if
|
||
}
|
||
|
||
mbim_dial(){
|
||
if [ -z "$apn" ];then
|
||
apn="auto"
|
||
fi
|
||
qmi_dial
|
||
}
|
||
|
||
mhi_dial()
|
||
{
|
||
qmi_dial
|
||
}
|
||
qmi_dial()
|
||
{
|
||
cmd_line="quectel-CM"
|
||
[ -e "/usr/bin/quectel-CM-M" ] && cmd_line="quectel-CM-M"
|
||
case $pdp_type in
|
||
"ip") cmd_line="$cmd_line -4" ;;
|
||
"ipv6") cmd_line="$cmd_line -6" ;;
|
||
"ipv4v6") cmd_line="$cmd_line -4 -6" ;;
|
||
*) cmd_line="$cmd_line -4 -6" ;;
|
||
esac
|
||
|
||
if [ "$network_bridge" = "1" ]; then
|
||
cmd_line="$cmd_line -b"
|
||
fi
|
||
if [ -n "$apn" ]; then
|
||
cmd_line="$cmd_line -s $apn"
|
||
fi
|
||
if [ -n "$username" ]; then
|
||
cmd_line="$cmd_line $username"
|
||
fi
|
||
if [ -n "$password" ]; then
|
||
cmd_line="$cmd_line $password"
|
||
fi
|
||
if [ "$auth" != "none" ]; then
|
||
cmd_line="$cmd_line $auth"
|
||
fi
|
||
if [ -n "$modem_netcard" ]; then
|
||
qmi_if=$modem_netcard
|
||
#if is wwan* ,use the first part of the name
|
||
if [[ "$modem_netcard" = "wwan"* ]];then
|
||
qmi_if=$(echo "$modem_netcard" | cut -d_ -f1)
|
||
fi
|
||
#if is rmnet* ,use the first part of the name
|
||
if [[ "$modem_netcard" = "rmnet"* ]];then
|
||
qmi_if=$(echo "$modem_netcard" | cut -d. -f1)
|
||
fi
|
||
cmd_line="${cmd_line} -i ${qmi_if}"
|
||
fi
|
||
if [ "$en_bridge" = "1" ];then
|
||
cmd_line="${cmd_line} -b"
|
||
fi
|
||
if [ "$do_not_add_dns" = "1" ];then
|
||
cmd_line="${cmd_line} -D"
|
||
fi
|
||
if [ -e "/usr/bin/quectel-CM-M" ];then
|
||
[ -n "$metric" ] && cmd_line="$cmd_line -d -M $metric"
|
||
else
|
||
[ -n "$metric" ] && cmd_line="$cmd_line"
|
||
fi
|
||
cmd_line="$cmd_line -f $log_file"
|
||
m_debug "dialing $cmd_line"
|
||
exec $cmd_line
|
||
|
||
|
||
}
|
||
|
||
at_dial()
|
||
{
|
||
if [ -z "$apn" ];then
|
||
apn="auto"
|
||
fi
|
||
if [ -z "$pdp_type" ];then
|
||
pdp_type="IP"
|
||
fi
|
||
local at_command='AT+COPS=0,0'
|
||
tmp=$(at "${at_port}" "${at_command}")
|
||
pdp_type=$(echo $pdp_type | tr 'a-z' 'A-Z')
|
||
case $manufacturer in
|
||
"quectel")
|
||
case $platform in
|
||
"qualcomm")
|
||
at_command="AT+QNETDEVCTL=1,3,1"
|
||
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\",\"$apn\""
|
||
;;
|
||
"unisoc")
|
||
at_command="AT+QNETDEVCTL=1,3,1"
|
||
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\",\"$apn\""
|
||
;;
|
||
"lte")
|
||
if [ "$define_connect" = "3" ];then
|
||
at_command="AT+QNETDEVCTL=3,3,1"
|
||
cgdcont_command="AT+CGDCONT=3,\"$pdp_type\",\"$apn\""
|
||
else
|
||
at_command="AT+QNETDEVCTL=1,3,1"
|
||
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\",\"$apn\""
|
||
fi
|
||
;;
|
||
*)
|
||
at_command="AT+QNETDEVCTL=1,3,1"
|
||
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\",\"$apn\""
|
||
;;
|
||
esac
|
||
;;
|
||
"fibocom")
|
||
case $platform in
|
||
"qualcomm")
|
||
at_command="AT+GTRNDIS=1,1"
|
||
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\",\"$apn\""
|
||
;;
|
||
"unisoc")
|
||
at_command="AT+GTRNDIS=1,1"
|
||
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\",\"$apn\""
|
||
;;
|
||
"lte")
|
||
at_command="AT+GTRNDIS=1,1"
|
||
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\",\"$apn\""
|
||
;;
|
||
"mediatek")
|
||
mtk=1
|
||
if [ "$apn" = "auto" ];then
|
||
apn="cbnet"
|
||
fi
|
||
at_command="AT+CGACT=1,3"
|
||
cgdcont_command="AT+CGDCONT=3,\"$pdp_type\",\"$apn\""
|
||
;;
|
||
esac
|
||
;;
|
||
"simcom")
|
||
case $platform in
|
||
"qualcomm")
|
||
local cnmp=$(at ${at_port} "AT+CNMP?" | grep "+CNMP:" | sed 's/+CNMP: //g' | sed 's/\r//g')
|
||
at_command="AT+CNMP=$cnmp;+CNWINFO=1"
|
||
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\",\"$apn\""
|
||
;;
|
||
esac
|
||
;;
|
||
"meig")
|
||
case $platform in
|
||
"qualcomm")
|
||
at_command=""
|
||
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\",\"$apn\""
|
||
;;
|
||
esac
|
||
;;
|
||
esac
|
||
m_debug "dialing vendor:$manufacturer;platform:$platform; $cgdcont_command ; $at_command"
|
||
at "${at_port}" "${cgdcont_command}"
|
||
if [ $mtk -eq 1 ];then
|
||
sleep 3
|
||
fi
|
||
at "$at_port" "$at_command"
|
||
if [ $mtk -eq 1 ];then
|
||
sleep 3
|
||
fi
|
||
}
|
||
|
||
ip_change_fm350()
|
||
{
|
||
m_debug "ip_change_fm350"
|
||
at_command="AT+CGPADDR=3"
|
||
local ipv4_config=$(at ${at_port} ${at_command} | cut -d, -f2 | grep -oE '[0-9]+.[0-9]+.[0-9]+.[0-9]+')
|
||
local public_dns1_ipv4="223.5.5.5"
|
||
local public_dns2_ipv4="119.29.29.29"
|
||
local public_dns1_ipv6="2400:3200::1"
|
||
local public_dns2_ipv6="2402:4e00::"
|
||
at_command="AT+GTDNS=3" | grep "+GTDNS: "| grep -E '[0-9]+.[0-9]+.[0-9]+.[0-9]+' | sed -n '1p'
|
||
local ipv4_dns1=$(echo "${response}" | awk -F'"' '{print $2}' | awk -F',' '{print $1}')
|
||
[ -z "$ipv4_dns1" ] && {
|
||
ipv4_dns1="${public_dns1_ipv4}"
|
||
}
|
||
|
||
local ipv4_dns2=$(echo "${response}" | awk -F'"' '{print $4}' | awk -F',' '{print $1}')
|
||
[ -z "$ipv4_dns2" ] && {
|
||
ipv4_dns2="${public_dns2_ipv4}"
|
||
}
|
||
|
||
local ipv6_dns1=$(echo "${response}" | awk -F'"' '{print $2}' | awk -F',' '{print $2}')
|
||
[ -z "$ipv6_dns1" ] && {
|
||
ipv6_dns1="${public_dns1_ipv6}"
|
||
}
|
||
|
||
local ipv6_dns2=$(echo "${response}" | awk -F'"' '{print $4}' | awk -F',' '{print $2}')
|
||
[ -z "$ipv6_dns2" ] && {
|
||
ipv6_dns2="${public_dns2_ipv6}"
|
||
}
|
||
uci_ipv4=$(uci -q get network.$interface_name.ipaddr)
|
||
|
||
uci set network.${interface_name}.proto='static'
|
||
uci set network.${interface_name}.ipaddr="${ipv4_config}"
|
||
uci set network.${interface_name}.netmask='255.255.255.0'
|
||
uci set network.${interface_name}.gateway="${ipv4_config%.*}.1"
|
||
uci set network.${interface_name}.peerdns='0'
|
||
uci -q del network.${interface_name}.dns
|
||
uci add_list network.${interface_name}.dns="${ipv4_dns1}"
|
||
uci add_list network.${interface_name}.dns="${ipv4_dns2}"
|
||
uci commit network
|
||
ifdown ${interface_name}
|
||
ifup ${interface_name}
|
||
m_debug "set interface $interface_name to $ipv4_config"
|
||
|
||
}
|
||
|
||
handle_5gethernet()
|
||
{
|
||
case $manufacturer in
|
||
"quectel")
|
||
case $platform in
|
||
"qualcomm")
|
||
quectel_qualcomm_ethernet
|
||
;;
|
||
"unisoc")
|
||
quectel_unisoc_ethernet
|
||
;;
|
||
esac
|
||
;;
|
||
esac
|
||
}
|
||
|
||
quectel_unisoc_ethernet()
|
||
{
|
||
case "$driver" in
|
||
"ncm"|\
|
||
"ecm"|\
|
||
"rndis")
|
||
check_ethernet_cmd="AT+QCFG=\"ethernet\""
|
||
time=0
|
||
while [ $time -lt 5 ]; do
|
||
result=$(at $at_port $check_ethernet_cmd | grep "+QCFG:")
|
||
if [ -n "$result" ]; then
|
||
if [ -n "$(echo $result | grep "ethernet\",1")" ]; then
|
||
echo "1"
|
||
m_debug "5G Ethernet mode is enabled"
|
||
break
|
||
fi
|
||
fi
|
||
sleep 5
|
||
time=$((time+1))
|
||
done
|
||
;;
|
||
esac
|
||
}
|
||
|
||
quectel_qualcomm_ethernet()
|
||
{
|
||
case "$driver" in
|
||
"mbim")
|
||
eth_driver_at="AT+QETH=\"eth_driver\""
|
||
data_interface_at="AT+QCFG=\"data_interface\""
|
||
ehter_driver_expect="\"r8125\",1"
|
||
data_interface_expect="\"data_interface\",1"
|
||
|
||
time=0
|
||
while [ $time -lt 5 ]; do
|
||
eth_driver_result=$(at $at_port $eth_driver_at | grep "+QETH:")
|
||
time=$(($time+1))
|
||
sleep 1
|
||
if [ -n "$eth_driver_result" ];then
|
||
break
|
||
fi
|
||
done
|
||
time=0
|
||
while [ $time -lt 5 ]; do
|
||
data_interface_result=$(at $at_port $data_interface_at | grep "+QCFG:")
|
||
time=$(($time+1))
|
||
sleep 1
|
||
if [ -n "$data_interface_result" ];then
|
||
break
|
||
fi
|
||
done
|
||
eth_driver_pass=$(echo $eth_driver_result | grep "$ehter_driver_expect")
|
||
data_interface_pass=$(echo $data_interface_result | grep "$data_interface_expect")
|
||
if [ -n "$eth_driver_pass" ] && [ -n "$data_interface_pass" ];then
|
||
echo "1"
|
||
m_debug "5G Ethernet mode is enabled"
|
||
fi
|
||
;;
|
||
esac
|
||
}
|
||
|
||
handle_ip_change()
|
||
{
|
||
export ipv4
|
||
export ipv6
|
||
export connection_status
|
||
m_debug "ip changed from $ipv6_cache,$ipv4_cache to $ipv6,$ipv4"
|
||
case $manufacturer in
|
||
"fibocom")
|
||
case $platform in
|
||
"mediatek")
|
||
ip_change_fm350
|
||
;;
|
||
esac
|
||
;;
|
||
esac
|
||
}
|
||
|
||
check_logfile_line()
|
||
{
|
||
local line=$(wc -l $log_file | awk '{print $1}')
|
||
if [ $line -gt 300 ];then
|
||
echo "" > $log_file
|
||
m_debug "log file line is over 300,clear it"
|
||
fi
|
||
}
|
||
|
||
unexpected_response_count=0
|
||
at_dial_monitor()
|
||
{
|
||
check_ip
|
||
at_dial
|
||
ipv4_cache=$ipv4
|
||
while true; do
|
||
check_ip
|
||
if [ $connection_status -eq 0 ];then
|
||
at_dial
|
||
sleep 5
|
||
elif [ $connection_status -eq -1 ];then
|
||
unexpected_response_count=$((unexpected_response_count+1))
|
||
if [ $unexpected_response_count -gt 3 ];then
|
||
at_dial
|
||
unexpected_response_count=0
|
||
fi
|
||
sleep 10
|
||
else
|
||
#检测ipv4是否变化
|
||
sleep 15
|
||
if [ "$ipv4" != "$ipv4_cache" ];then
|
||
handle_ip_change
|
||
ipv6_cache=$ipv6
|
||
ipv4_cache=$ipv4
|
||
fi
|
||
fi
|
||
check_logfile_line
|
||
done
|
||
}
|
||
|
||
case "$2" in
|
||
"hang")
|
||
debug_subject="modem_hang"
|
||
update_config
|
||
hang;;
|
||
"dial")
|
||
case "$state" in
|
||
"disabled")
|
||
debug_subject="modem_hang"
|
||
hang;;
|
||
*)
|
||
dial;;
|
||
esac
|
||
esac
|