2024-03-25 20:28:02 +08:00

137 lines
3.9 KiB
Bash

#!/bin/sh
. /lib/functions.sh
. /lib/functions/network.sh
. ../netifd-proto.sh
init_proto "$@"
proto_fm350_init_config() {
no_device=1
available=1
proto_config_add_string "device:device"
proto_config_add_string "apn"
proto_config_add_string "pdp"
proto_config_add_string "delay"
#proto_config_add_string "username"
#proto_config_add_string "password"
#proto_config_add_string "auth"
proto_config_add_defaults
}
proto_fm350_setup() {
local interface="$1"
local devname devpath hwaddr ip4addr ip4mask dns1 dns2 defroute lladdr
local name ifname proto extendprefix auth username password
local device ifname auth username password apn pdp pincode delay $PROTO_DEFAULT_OPTIONS
json_get_vars device ifname auth username password apn pdp pincode delay $PROTO_DEFAULT_OPTIONS
[ "$metric" = "" ] && metric="0"
[ -z $ifname ] && {
devname=$(basename $device)
case "$devname" in
*ttyUSB*)
echo "Setup fm350 interface $interface with port ${device}"
devpath="$(readlink -f /sys/class/tty/$devname/device)"
echo "Found path $devpath"
hwaddr="$(ls -1 $devpath/../../*/net/*/*address*)"
for h in $hwaddr; do
if [ "$(cat ${h})" = "00:00:11:12:13:14" ]; then
ifname=$(echo ${h} | awk -F [\/] '{print $(NF-1)}')
fi
done
;;
esac
}
[ -n "$ifname" ] && {
echo "Found interface $ifname"
} || {
echo "The interface could not be found."
proto_notify_error "$interface" NO_IFACE
proto_set_available "$interface" 0
return 1
}
pdp=$(echo $pdp | awk '{print toupper($0)}')
[ "$pdp" = "IP" -o "$pdp" = "IPV6" -o "$pdp" = "IPV4V6" ] || pdp="IP"
echo "Setting up $ifname"
[ -n "$delay" ] && sleep "$delay" || sleep 5
# [ -n "$username" ] && [ -n "$password" ] && {
# echo "Using auth type is: $auth"
# case $auth in
# pap) AUTH=1 ;;
# chap) AUTH=2 ;;
# *) AUTH=0 ;;
# esac
# AUTH=$AUTH USER=$username PASS=$password gcom -d "$device" -s /etc/gcom/fm350-auth.gcom >/dev/null 2>&1
# }
APN=$apn PDP=$pdp gcom -d $device -s /etc/gcom/fm350-connect.gcom >/dev/null 2>&1
proto_init_update "$ifname" 1
proto_add_data
proto_close_data
DATA=$(gcom -d $device -s /etc/gcom/fm350-config.gcom)
ip4addr=$(echo "$DATA" | awk -F [,] '/^\+CGPADDR/{gsub("\r|\"", ""); print $2}') >/dev/null 2>&1
lladdr=$(echo "$DATA" | awk -F [,] '/^\+CGPADDR/{gsub("\r|\"", ""); print $3}') >/dev/null 2>&1
ns=$(echo "$DATA" | awk -F [,] '/^\+GTDNS: /{gsub("\r|\"",""); print $2" "$3}' | sed 's/^[[:space:]]//g')
dns1=$(echo "$ns" | grep -v "0.0.0.0" | tail -1)
if ! [ $ip4addr ]; then
proto_notify_error "$interface" CONFIGURE_FAILED
return 1
fi
case $ip4addr in
*FE80*)
lladdr=$ip4addr
ip4addr=""
;;
*)
ip4mask=24
defroute=$(echo $ip4addr | awk -F [.] '{print $1"."$2"."$3".1"}')
;;
esac
proto_set_keep 1
ip link set dev $ifname arp off
echo "PDP type is: $pdp"
[ "$pdp" = "IP" -o "$pdp" = "IPV4V6" ] && {
if ! [ "$(echo $ip4addr | grep 0.0.0.0)" ]; then
echo "Set IPv4 address: ${ip4addr}/${ip4mask}"
proto_add_ipv4_address $ip4addr $ip4mask
proto_add_ipv4_route "0.0.0.0" 0 $defroute $ip4addr
else
echo "Failed to configure interface"
proto_notify_error "$interface" CONFIGURE_FAILED
return 1
fi
if ! [ "$(echo $dns1 | grep 0.0.0.0)" ]; then
proto_add_dns_server "$dns1"
echo "Using IPv4 DNS: $dns1"
fi
proto_add_data
proto_close_data
proto_send_update "$interface"
}
[ "$pdp" = "IPV6" -o "$pdp" = "IPV4V6" ] && {
ip -6 address add ${lladdr}/64 dev $ifname >/dev/null 2>&1
json_init
json_add_string name "${interface}_6"
json_add_string ifname "@$interface"
json_add_string proto "dhcpv6"
json_add_string extendprefix 1
proto_add_dynamic_defaults
json_close_object
ubus call network add_dynamic "$(json_dump)"
}
}
proto_fm350_teardown() {
local interface="$1"
local device
device=$(uci -q get network.$interface.device)
gcom -d $device -s /etc/gcom/fm350-disconnect.gcom >/dev/null 2>&1
echo "Modem $device disconnected"
proto_kill_command "$interface"
}
add_protocol fm350