#!/bin/sh /etc/rc.common
#
# Copyright Eric Bishop, 2008
# This is free software licensed under the terms of the GNU GPL v2.0
#
. /lib/functions.sh
. /lib/functions/network.sh

START=90

EXTRA_COMMANDS=show
EXTRA_HELP="	show	Show current Qos configuration (if active)"

include /lib/network

#created while qos is being initialized so hotplug and init script don't
#both try to initialize qos at the same time
lock_file="/var/run/qos_updating"
[ -n "$USE_PROCD" ] && unset USE_PROCD


define_interface()
{
	#Wait for up to 15 seconds for the wan interface to indicate it is up.
	wait_sec=15
	while [ -z $(uci -P /var/state get network.wan.up 2>/dev/null) ] && [ $wait_sec -gt 0 ] ; do
		sleep 1
		wait_sec=$(($wait_sec - 1))
	done

	#The interface name will depend on if pppoe is used or not.  If pppoe is used then 
	#the name we are looking for is in network.wan.ifname.  If there is nothing there
	#use the device named by network.wan.device

	wan_interface=$(uci -P /var/state get network.wan.ifname 2>/dev/null)
	if [ -z $wan_interface ] ; then
		wan_interface=$(uci -P /var/state get network.wan.device 2>/dev/null)
	fi

	up_interface=imq1
	down_interface=imq0
}

do_iptables() {
	
	config_get smartqos_mod qos mode 0
	
	delete_chain_from_table "mangle" "qos_ingress"
	delete_chain_from_table "mangle" "qos_egress"
	iptables -t mangle -N qos_ingress;iptables -t mangle -N qos_egress
	iptables -t mangle -I PREROUTING -i $wan_interface -j qos_ingress
	iptables -t mangle -I POSTROUTING -o $wan_interface -j qos_egress

	iptables -t mangle -A qos_ingress -j IMQ --todev 0
	iptables -t mangle -A qos_egress -j IMQ --todev 1

	iptables -t mangle -A qos_ingress -p udp --sport 53 -j TOS --set-tos 0x01/0xff
	iptables -t mangle -A qos_egress -p udp --dport 53 -j MARK --set-mark 255
	
	#sohu p2pdownload
	iptables -t mangle -A qos_ingress -m tos --tos 0x03/0xff -j RETURN
	iptables -t mangle -A qos_egress -m mark --mark 253 -j RETURN

	#MODE_DEFAULT = 0,				//ԶģʽҳȺϷ
	#MODE_DOWN,                                     //DNSκ
	#MODE_WEB,					//ҳȺС
	#MODE_GAME,					//Ϸȣ10%
	#MODE_VIDEO					//Ƶվ
	if [ $smartqos_mod -eq 0 ] || [ $smartqos_mod -eq 4 ];then
		delete_chain_from_table "mangle" "VIDEO"
		iptables -t mangle -N VIDEO
		iptables -t mangle -I PREROUTING -p tcp --dport 80 -j VIDEO
		iptables -t mangle -A VIDEO -m connmark --mark 80 -j RETURN
		iptables -t mangle -A VIDEO -m video --host xxxx.com -j CONNMARK --set-mark 80

		iptables -t mangle -A qos_ingress -m connmark --mark 80 -j TOS --set-tos 0x04/0xff
		iptables -t mangle -A qos_ingress -m connmark --mark 80 -j RETURN
		iptables -t mangle -A qos_egress -m connmark --mark 80 -j MARK --set-mark 252
		iptables -t mangle -A qos_egress -m connmark --mark 80 -j RETURN
	fi
	#disable game priority	
	if [ $smartqos_mod -eq 0 ] && [ $smartqos_mod -eq 3 ];then
		iptables -t mangle -A qos_ingress -m connbytes --connbytes 0:800 --connbytes-dir both --connbytes-mode avgpkt -j TOS --set-tos 0x05/0xff
		iptables -t mangle -A qos_ingress -m tos --tos 0x05/0xff -j RETURN
		iptables -t mangle -A qos_egress -m connbytes --connbytes 0:800 --connbytes-dir both --connbytes-mode avgpkt -j MARK --set-mark 251
		iptables -t mangle -A qos_egress -m mark --mark 251 -j RETURN
	fi

	if [ $smartqos_mod -eq 0 ]; then
		iptables -t mangle -A qos_ingress -m length --length :128 -j TOS --set-tos 0x01/0xff
		iptables -t mangle -A qos_egress -m length --length :64 -j MARK --set-mark 255
		iptables -t mangle -A qos_ingress -m tos --tos 0x01/0xff -j RETURN
		iptables -t mangle -A qos_egress -m mark --mark 255 -j RETURN
	fi

	if [ $smartqos_mod -eq 0 ] || [ $smartqos_mod -eq 2 ]; then
		iptables -t mangle -A qos_ingress -p tcp --sport 80 -m connbytes \
		--connbytes :20480 --connbytes-dir reply --connbytes-mode bytes -j TOS --set-tos 0x02/0xff
		iptables -t mangle -A qos_egress -p tcp --dport 80 -m connbytes \
		--connbytes :10240 --connbytes-dir original --connbytes-mode bytes -j MARK --set-mark 254
		iptables -t mangle -A qos_ingress -p tcp --sport 443 -m connbytes \
		--connbytes :20480 --connbytes-dir reply --connbytes-mode bytes -j TOS --set-tos 0x02/0xff
		iptables -t mangle -A qos_egress -p tcp --dport 443 -m connbytes \
		--connbytes :10240 --connbytes-dir original --connbytes-mode bytes -j MARK --set-mark 254
		iptables -t mangle -A qos_ingress -m tos --tos 0x02/0xff -j RETURN
		iptables -t mangle -A qos_egress -m mark --mark 254 -j RETURN
		#big webs
		iptables -t mangle -A qos_ingress -p tcp --sport 80 -m connbytes \
		--connbytes 20480:61440 --connbytes-dir reply --connbytes-mode bytes -j TOS --set-tos 0x06/0xff
		iptables -t mangle -A qos_egress -p tcp --dport 80 -m connbytes \
		--connbytes 10240:30720 --connbytes-dir original --connbytes-mode bytes -j MARK --set-mark 250
		iptables -t mangle -A qos_ingress -p tcp --sport 443 -m connbytes \
		--connbytes 20480:61440 --connbytes-dir reply --connbytes-mode bytes -j TOS --set-tos 0x06/0xff
		iptables -t mangle -A qos_egress -p tcp --dport 443 -m connbytes \
		--connbytes 10240:30720 --connbytes-dir original --connbytes-mode bytes -j MARK --set-mark 250
		iptables -t mangle -A qos_ingress -m tos --tos 0x06/0xff -j RETURN
		iptables -t mangle -A qos_egress -m mark --mark 250 -j RETURN
	fi
}

stop()
{
	if [ -e "$lock_file" ] ; then
		exit
	fi

	killall smartqos 2>/dev/null
	killall -9 smartqos 2>/dev/null

	tc qdisc del dev $up_interface root >/dev/null 2>&1
	tc qdisc del dev $down_interface root >/dev/null 2>&1

	# eliminate existing rules in mangle table
	delete_chain_from_table "mangle" "VIDEO" >/dev/null 2>&1
	delete_chain_from_table "mangle" "qos_egress" >/dev/null 2>&1
	delete_chain_from_table "mangle" "qos_ingress" >/dev/null 2>&1
}

start()
{
	config_load smartqos
	config_get enable qos enable
	
	[ 1 -ne "$enable" ] && return
	
	stop
	touch "$lock_file"
	
	#load up_interface from global variables
	define_interface

	do_iptables
	smartqos 2>/dev/null &
	rm -rf "$lock_file"
}

show()
{
	#load up_interface from global variables
	define_interface

	echo "Egress configuration on $up_interface"
	iptables -t mangle -vnL qos_egress 2>/dev/null
	tc -s qdisc show dev $up_interface
	tc -s class show dev $up_interface
	tc -s filter show dev $up_interface

	echo "Ingress configuration in $down_interface"
	iptables -t mangle -vnL qos_ingress 2>/dev/null
	tc -s qdisc show dev $down_interface
	tc -s class show dev $down_interface
	tc -s filter show dev $down_interface
	tc -s filter show dev $down_interface parent 2:
	

}

boot()
{
	#Do nothing during init.  Start is called by hotplug.
	return
}

