1067 lines
32 KiB
Bash
Executable File
1067 lines
32 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
|
|
}
|
|
|
|
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 connect_check $modem_config connect_check
|
|
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 "auto"
|
|
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 "auto"
|
|
[ -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"
|
|
[ "$manufacturer" = "neoway" ] && {
|
|
local res
|
|
res=$(at $at_port 'AT+SIMCROSS=1,1;$MYCCID' | grep -q "ERROR")
|
|
if [ $? -ne 0 ]; then
|
|
sim_state_code="1"
|
|
else
|
|
sim_state_code="0"
|
|
fi
|
|
}
|
|
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"
|
|
;;
|
|
esac
|
|
;;
|
|
"simcom")
|
|
case $platform in
|
|
"qualcomm")
|
|
check_ip_command="AT+CGPADDR=6"
|
|
;;
|
|
esac
|
|
;;
|
|
"meig")
|
|
case $platform in
|
|
"qualcomm")
|
|
check_ip_command="AT+CGPADDR=1"
|
|
;;
|
|
"unisoc")
|
|
check_ip_command="AT+CGPADDR=1"
|
|
;;
|
|
esac
|
|
;;
|
|
"neoway")
|
|
case $platform in
|
|
"unisoc")
|
|
check_ip_command="AT+CGPADDR=1"
|
|
;;
|
|
esac
|
|
;;
|
|
*)
|
|
check_ip_command="AT+CGPADDR=1"
|
|
;;
|
|
esac
|
|
|
|
if [ "$driver" = "mtk_pcie" ]; then
|
|
mbim_port=$(echo "$at_port" | sed 's/at/mbim/g')
|
|
local config=$(umbim -d $mbim_port config)
|
|
ipaddr=$(echo "$config" | grep "ipv4address:" | awk '{print $2}' | cut -d'/' -f1)
|
|
ipaddr="$ipaddr $(echo "$config" | grep "ipv6address:" | awk '{print $2}' | cut -d'/' -f1)"
|
|
else
|
|
ipaddr=$(at "$at_port" "$check_ip_command" | grep +CGPADDR:)
|
|
fi
|
|
|
|
if [ -n "$ipaddr" ];then
|
|
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)
|
|
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
|
|
}
|
|
|
|
check_connection()
|
|
{
|
|
[ "$connection_status" = "0" ] || [ "$connection_status" = "-1" ] && return 0
|
|
if [ -n "$ipv4" ] && [ -n "$modem_netcard" ]; then
|
|
for i in 1 2; do
|
|
if ping -I "$modem_netcard" -w 1 1.1.1.1 >/dev/null 2>&1 ||
|
|
ping -I "$modem_netcard" -w 2 8.8.8.8 >/dev/null 2>&1; then
|
|
break
|
|
fi
|
|
if [ $i -eq 2 ]; then
|
|
m_debug "IPv4 connection test failed, will redial"
|
|
return 1
|
|
fi
|
|
sleep 1
|
|
done
|
|
local ifup_time=$(ubus call network.interface.$interface6_name status 2>/dev/null | jsonfilter -e '@.uptime' 2>/dev/null || echo 0)
|
|
if [ "$ifup_time" -gt 5 ] && [ "$pdp_type" = "ipv4v6" ]; then
|
|
rdisc6 $origin_device &
|
|
ndisc6 fe80::1 $origin_device &
|
|
fi
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
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()
|
|
{
|
|
case "$manufacturer" in
|
|
"quectel")
|
|
at_command="AT+QNETDEVCTL=1,2,1"
|
|
;;
|
|
"fibocom")
|
|
case "$platform" in
|
|
"mediatek")
|
|
at_command="AT+CGACT=0,3"
|
|
;;
|
|
*)
|
|
at_command="AT+GTRNDIS=0,1"
|
|
;;
|
|
esac
|
|
;;
|
|
"meig")
|
|
at_command='AT$QCRMCALL=0,0,1,2,1'
|
|
;;
|
|
"huawei")
|
|
at_command="AT^NDISDUP=0,0"
|
|
;;
|
|
"neoway")
|
|
delay=3
|
|
at_command='AT$MYUSBNETACT=0,0'
|
|
;;
|
|
*)
|
|
at_command="ATI"
|
|
;;
|
|
esac
|
|
fastat "${at_port}" "${at_command}"
|
|
sleep "$delay"
|
|
}
|
|
|
|
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\""
|
|
;;
|
|
"hisilicon")
|
|
at_command="AT+QNETDEVCTL=1,1,1"
|
|
cgdcont_command=""
|
|
;;
|
|
"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")
|
|
delay=3
|
|
if [ "$apn" = "auto" ];then
|
|
apn="cbnet"
|
|
fi
|
|
at_command="AT+CGACT=1,3"
|
|
cgdcont_command="AT+CGDCONT=3,\"$pdp_type\",\"$apn\""
|
|
;;
|
|
esac
|
|
;;
|
|
"huawei")
|
|
case $platform in
|
|
"hisilicon")
|
|
at_command="AT^NDISDUP=1,1"
|
|
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\""
|
|
;;
|
|
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='AT$QCRMCALL=1,0,1,2,1'
|
|
cgdcont_command="AT+CGDCONT=1,\"$pdp_type\",\"$apn\""
|
|
;;
|
|
esac
|
|
;;
|
|
"neoway")
|
|
case $platform in
|
|
"unisoc")
|
|
at_command='AT$MYUSBNETACT=0,1'
|
|
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}"
|
|
fastat "$at_port" "$at_command"
|
|
sleep "$delay"
|
|
if [ "$driver" = "mtk_pcie" ];then
|
|
fastat "$at_port" "AT+CGACT=0,3"
|
|
mbim_port=$(echo "$at_port" | sed 's/at/mbim/g')
|
|
umbim -d $mbim_port disconnect
|
|
sleep 1
|
|
umbim -d $mbim_port connect 0
|
|
fi
|
|
}
|
|
|
|
ip_change_fm350()
|
|
{
|
|
m_debug "ip_change_fm350"
|
|
local public_dns1_ipv4="223.5.5.5"
|
|
local public_dns2_ipv4="119.29.29.29"
|
|
local netmask="255.255.255.0"
|
|
|
|
if [ "$driver" = "mtk_pcie" ]; then
|
|
mbim_port=$(echo "$at_port" | sed 's/at/mbim/g')
|
|
|
|
local config=$(umbim -d $mbim_port config)
|
|
ipv4_config=$(echo "$config" | grep "ipv4address:" | awk '{print $2}' | cut -d'/' -f1)
|
|
gateway=$(echo "$config" | grep "ipv4gateway:" | awk '{print $2}')
|
|
|
|
ipv4_dns1=$(echo "$config" | grep "ipv4dnsserver:" | head -n 1 | awk '{print $2}')
|
|
ipv4_dns2=$(echo "$config" | grep "ipv4dnsserver:" | tail -n 1 | awk '{print $2}')
|
|
[ -z "$ipv4_dns1" ] && ipv4_dns1="$public_dns1_ipv4"
|
|
[ -z "$ipv4_dns2" ] && ipv4_dns2="$public_dns2_ipv4"
|
|
# m_debug "umbim config: ipv4=$ipv4_config, gateway=$gateway, netmask=$netmask, dns1=$ipv4_dns1, dns2=$ipv4_dns2"
|
|
else
|
|
at_command="AT+CGPADDR=3"
|
|
response=$(at ${at_port} ${at_command})
|
|
ipv4_config=$(echo "$response" | grep "+CGPADDR:" | grep -o '"[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"' | head -1 | tr -d '"')
|
|
gateway="${ipv4_config%.*}.1"
|
|
|
|
response=$(at ${at_port} "AT+GTDNS=3")
|
|
ipv4_dns=$(echo "$response" | grep "+GTDNS:" | head -1)
|
|
ipv4_dns1=$(echo "$ipv4_dns" | grep -o '"[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"' | head -1 | tr -d '"')
|
|
ipv4_dns2=$(echo "$ipv4_dns" | grep -o '"[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"' | tail -1 | tr -d '"')
|
|
[ -z "$ipv4_dns1" ] && ipv4_dns1="$public_dns1_ipv4"
|
|
[ -z "$ipv4_dns2" ] && ipv4_dns2="$public_dns2_ipv4"
|
|
uci_ipv4=$(uci -q get network.$interface_name.ipaddr)
|
|
fi
|
|
uci set network.${interface_name}.proto='static'
|
|
uci set network.${interface_name}.ipaddr="${ipv4_config}"
|
|
uci set network.${interface_name}.netmask="${netmask}"
|
|
uci set network.${interface_name}.gateway="${gateway}"
|
|
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()
|
|
{
|
|
at_dial
|
|
ipv4_cache=$ipv4
|
|
ipv6_cache=$ipv6
|
|
sleep 5
|
|
while true; do
|
|
check_ip
|
|
case $connection_status in
|
|
0)
|
|
at_dial
|
|
sleep 3
|
|
;;
|
|
-1)
|
|
unexpected_response_count=$((unexpected_response_count+1))
|
|
if [ $unexpected_response_count -gt 3 ]; then
|
|
at_dial
|
|
unexpected_response_count=0
|
|
fi
|
|
sleep 5
|
|
;;
|
|
*)
|
|
if [ "$ipv4" != "$ipv4_cache" ] || [ "$ipv6" != "$ipv6_cache" ]; then
|
|
handle_ip_change
|
|
ipv4_cache=$ipv4
|
|
ipv6_cache=$ipv6
|
|
fi
|
|
[ "$connect_check" -eq 1 ] && { sleep 5; check_connection || { hang && at_dial; }; } || sleep 15
|
|
;;
|
|
esac
|
|
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
|