#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2014 OpenWrt.org

START=94
STOP=13
USE_PROCD=1

#设置防火墙
# $1:网络接口名称
set_firewall()
{
	local interface_name="$1"

	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
		uci add_list firewall.@zone[$num].network="${interface_name}"
	fi
	uci commit firewall
}

#设置IPv4网络接口
# $1:网络接口名称
# $2:网络接口
set_ipv4_interface()
{
	local interface_name="$1"
	local network_interface="$2"

	#添加或修改网络配置
	uci set network.${interface_name}='interface'
	uci set network.${interface_name}.proto='dhcp'
	uci set network.${interface_name}.device="${network_interface}"
	uci set network.${interface_name}.device="${network_interface}"
	uci commit network

	#加入WAN防火墙
	set_firewall "${interface_name}"

	#启动网络接口
	ifup "${interface_name}"
}

#设置IPv6网络接口
# $1:网络接口名称
# $2:网络接口
set_ipv6_interface()
{
	local interface_name="$1"
	local network_interface="$2"

	#添加或修改网络配置
	uci set network.${interface_name}='interface'
	uci set network.${interface_name}.proto='dhcpv6'
	uci set network.${interface_name}.extendprefix='1'
	uci set network.${interface_name}.device="${network_interface}"
	uci set network.${interface_name}.device="${network_interface}"
	uci commit network

	#加入WAN防火墙
	set_firewall "${interface_name}"
	
	#启动网络接口
	ifup "${interface_name}"
}

#设置IPV4和IPv6网络接口
# $1:IPV4网络接口名称
# $2:IPv6网络接口名称
# $3:网络接口
set_ipv4v6_interface()
{
	local ipv4_interface_name="$1"
	local ipv6_interface_name="$2"
	local network_interface="$3"

	#设置IPV4网络接口
	set_ipv4_interface "${ipv4_interface_name}" "${network_interface}"
	#设置IPV6网络接口（别名）
	set_ipv6_interface "${ipv6_interface_name}" "@${ipv4_interface_name}"
}

#设置网络接口
# $2:网络接口
set_interface()
{
	local network_interface="$1"

	local pdp_type
	[ "$ipv6" = "1" ] && {
		pdp_type="ipv4v6"
	}

	case $pdp_type in
		"ipv4") set_ipv4_interface "wwan_5g" "${network_interface}" ;;
		"ipv6") set_ipv6_interface "wwan6_5g" "${network_interface}" ;;
		"ipv4v6") set_ipv4v6_interface "wwan_5g" "wwan6_5g" "${network_interface}" ;;
		*) set_ipv4v6_interface "wwan_5g" "wwan6_5g" "${network_interface}" ;;
	esac
}

run_dial()
{
	local enabled
	config_get_bool enabled $1 enabled

	if [ "$enabled" = "1" ]; then
		local apn
		local user
		local password
		local auth
		local ipv6
		local network_bridge
		local device

		config_get apn $1 apn
		config_get user $1 user
		config_get password $1 password
		config_get auth $1 auth
		config_get ipv6 $1 ipv6
		config_get network_bridge $1 network_bridge
		config_get device $1 device

		devname="$(basename "${device}")"
		devicepath="$(find /sys/class/ -name ${devname})"
		devpath="$(readlink -f ${devicepath}/device/)"
		network="$( ls "${devpath}"/net )"

		#拨号配置
		procd_open_instance
		procd_set_param command quectel-CM
		if [ "$ipv6" = 1 ]; then
			procd_append_param command "-4" "-6"
		fi
		if [ "$network_bridge" = 1 ]; then
			procd_append_param command "-b"
		fi
		if [ "$apn" != "" ];then
			procd_append_param command "-s" "$apn"
		fi
		if [ "$username" != "" ]; then
			procd_append_param command "$username"
		fi
		if [ "$password" != "" ]; then
			procd_append_param command "$password"
		fi
		if [ "$auth" != "" ]; then
			procd_append_param command "$auth"
		fi
		if [ "$device" != "" ]; then
			procd_append_param command -i "$network"
		fi
		procd_set_param respawn
		procd_close_instance

		#设置网络接口
		local network_interface
		if [ -d /sys/class/net/rmnet_mhi0 ]; then
			network_interface="rmnet_mhi0.1"
		elif [ -d /sys/class/net/wwan0_1 ]; then
			network_interface="wwan0_1"
		elif [ -d /sys/class/net/wwan0.1 ]; then
			network_interface="wwan0.1"
		elif [ -d /sys/class/net/wwan0 ]; then
			network_interface="wwan0"
		fi
		set_interface "${network_interface}"
	fi

	sleep 15
}

service_triggers()
{
	procd_add_reload_trigger "hypermodem"
}

start_service() {
	config_load hypermodem
	config_foreach run_dial service
}

stop_service()
{
	killall quectel-CM >/dev/null 2>&1
}

reload_service() {
	restart
}
