#/bin/sh
#/lib/****qos/****qos_function.sh
QOS_CONF=/etc/config/****qos
EVAL=eval
LOGGER=logger
mask=0x0000FFFF
ETHBW=1024000
lan_mark=2222
local prog=****qos
local wan_ifname
local lan_ifname=br-lan
# values for ****qos config
local qos_enable
local download_bw
local upload_bw
local dfclass
# values for high class
local high_up_rate # upload rate
local high_down_rate
local high_up_ceil
local high_down_ceil
local high_prio
local high_classid
local high_mark
# values for medium class
local medium_up_rate # upload rate
local medium_down_rate
local medium_up_ceil
local medium_down_ceil
local medium_prio
local medium_classid
local medium_mark
# values for low class
local low_up_rate # upload rate
local low_down_rate
local low_up_ceil
local low_down_ceil
local low_prio
local low_classid
local low_mark
show_data()
{
echo"### config for coolqos ###"
echo"wan_ifname=${wan_ifname}"
echo"lan_ifname=${lan_ifname}"
#values for coolqos config
echoqos_enable=${qos_enable}
echodownload_bw=${download_bw}
echoupload_bw=${upload_bw}
echodfclass=${dfclass}
echo""
#values for high class
echo"### config for high class ###"
echohigh_up_rate=${high_up_rate}
echohigh_down_rate=${high_down_rate}
echohigh_up_ceil=${high_up_ceil}
echohigh_down_ceil=${high_down_ceil}
echohigh_prio=${high_prio}
echohigh_classid=${high_classid}
echohigh_mark=${high_mark}
echo""
# values for medium class
echo"###config for medium class ###"
echomedium_up_rate=${medium_up_rate}
echomedium_down_rate=${medium_down_rate}
echomedium_up_ceil=${medium_up_ceil}
echomedium_down_ceil=${medium_down_ceil}
echomedium_prio=${medium_prio}
echomedium_classid=${medium_classid}
echomedium_mark=${medium_mark}
echo""
# values for low class
echo"### config for low class ###"
echolow_up_rate=${low_up_rate}
echolow_down_rate=${low_down_rate}
echolow_up_ceil=${low_up_ceil}
echolow_down_ceil=${low_down_ceil}
echolow_prio=${low_prio}
echolow_classid=${low_classid}
echolow_mark=${low_mark}
}
get_wan_ifname()
{
localwan_proto
config_loadnetwork
config_getwan_proto wan proto "none"
if[ ${wan_proto} == "none" ]; then
LOGGER"${prog}:cannot get wan proto,exit"
exit1
else
if[ ${wan_proto} == "pppoe" ]; then
wan_ifname=pppoe-wan
else
wan_ifname=vlan2
fi
fi
}
init_data()
{
localhigh_uprate_prec
localhigh_downrate_prec
localmedium_uprate_prec
localmedium_downrate_prec
locallow_uprate_prec
locallow_downrate_prec
get_wan_ifname;
config_load$QOS_CONF
#get config for coolqos
config_getqos_enable coolqos enable "0"
if[ ${qos_enable} != "1" ]; then
$LOGGER"${prog}:don't enable coolqos,exit"
exit1
fi
config_getdownload_bw coolqos download "10240"
config_getupload_bw coolqos upload "1024"
config_getdfclass coolqos dfclass "high"
#get config for high class default,high: 50%~100%
config_gethigh_uprate_prec high uprate"50,100"
config_gethigh_downrate_prec high downrate"50,100"
config_gethigh_prio high prio "1"
config_gethigh_classid high classid "1001"
config_gethigh_mark high mark "1001"
#get config for medium class default,medium: 30%~60%
config_getmedium_uprate_prec medium uprate "30,60"
config_getmedium_downrate_prec medium downrate "30,60"
config_getmedium_prio medium prio "2"
config_getmedium_classid medium classid "1002"
config_getmedium_mark medium mark "1002"
#get config for low class default,low: 20%~30%
config_getlow_uprate_prec low uprate "20,30"
config_getlow_downrate_prec low downrate "20,30"
config_getlow_prio low prio "1"
config_getlow_classid low classid "1003"
config_getlow_mark low mark "1003"
#get rate with prec*bw
localvar
localtmp
localdest
localrate_prec
localceil_prec
forvar in high medium low ; do
tmp=${var}_uprate_prec
dest=`evalecho '$'$tmp`
rate_prec=`echo${dest}|awk -F ',' '{print $1}' `
ceil_prec=`echo${dest}|awk -F ',' '{print $2}' `
eval${var}_up_rate=$(echo `expr ${rate_prec} \* ${upload_bw} \/ 100 `)
eval${var}_up_ceil=`expr ${ceil_prec} \* ${upload_bw} \/ 100 `
tmp=${var}_downrate_prec
dest=`evalecho '$'$tmp`
rate_prec=`echo${dest}|awk -F ',' '{print $1}' `
ceil_prec=`echo${dest}|awk -F ',' '{print $2}' `
eval${var}_down_rate=$(echo `expr ${rate_prec} \* ${download_bw} \/ 100 `)
eval${var}_down_ceil=`expr ${ceil_prec} \* ${download_bw} \/ 100 `
done
}
create_qdisc()
{
localvar
localclass
localifname
localtmp
localtmp_value
localrate
localceil
localclassid
localmark
localprio
forvar in down up ; do
if[ ${var} == "up" ]; then
ifname=${wan_ifname}
TQA="tcqdisc add dev $ifname";
TCA="tcclass add dev $ifname";
TFA="tcfilter add dev $ifname";
#########[UPLOAD] config root qdisc for wan_ifname ##########
tmp=${dfclass}_classid
tmp_value=`evalecho '$'$tmp`
$EVAL"tc qdisc del dev $ifname root 1>/dev/null 2>&1"
$EVAL"$TQA root handle 1: htb default ${tmp_value}"
$EVAL"$TCA parent 1: classid 1:1 htb rate ${upload_bw}kbit ceil ${upload_bw}kbit"
else
ifname=${lan_ifname}
TQA="tcqdisc add dev $ifname";
TCA="tcclass add dev $ifname";
TFA="tcfilter add dev $ifname";
#########[DOWNLOAD] config root qdisc for lan_ifname ##########
tmp=${dfclass}_classid
tmp_value=`evalecho '$'$tmp`
$EVAL"tc qdisc del dev $ifname root 1>/dev/null 2>&1"
$EVAL"$TQA root handle 1: htb default ${tmp_value}"
$EVAL"$TCA parent 1: classid 1:1 htb rate ${download_bw}kbit ceil ${download_bw}kbit"
#config class 1:2 for lan to lan
$EVAL"$TCA parent 1: classid 1:2 htb rate ${ETHBW}kbit ceil ${ETHBW}kbit"
$EVAL"$TQA parent 1:2 handle 2: sfq perturb 10"
$EVAL"$TFA parent 1: prio 1 protocol ip handle 0x${lan_mark} fw flowid1:2"
fi
#echo"${var}load"
#echo"TQA=$TQA"
#echo"TCA=$TCA"
#echo"TFA=$TFA"
forclass in high medium low ; do
#echo"#Config ${class} class for${var}load traffic"
tmp=${class}_${var}_rate
rate=`evalecho '$'$tmp`
tmp=${class}_${var}_ceil
ceil=`evalecho '$'$tmp`
tmp=${class}_prio
prio=`evalecho '$'$tmp`
tmp=${class}_classid
classid=`evalecho '$'$tmp`
tmp=${class}_mark
mark=`evalecho '$'$tmp`
echo"#[${var}LOAD] Config ${class},rate ${rate}kbit ceil ${ceil}kbit classid${classid}"
$EVAL"$TCA parent 1:1 classid 1:${classid} htb rate ${rate}kbit ceil${ceil}kbit prio $prio "
#add sfq disc
$EVAL"$TQA parent 1:${classid} handle ${classid}: sfq perturb 10"
#add filter
#echo"#[${var}LOAD] add filter for ${var}"
$EVAL"$TFA parent 1: prio ${prio} protocol ip handle 0x${mark} fw flowid1:${classid}"
done
done
}
# add host
add_host()
{
#echo"add_host"
#$1:IPADDR$2:class
localmark
localclass
localip
config_getip $1 ipaddr "0"
config_getclass $1 class "0"
if[ ! ${ip} ]; then
#echo"ip is null"
return1
fi
if[ "${ip}" = "0" ] ; then
return1
fi
#get host class mark
tmp=${class}_mark
mark=`evalecho '$'$tmp`
if[ ! -n "${mark}" ]; then
mark=${high_mark}
fi
IPT_CMD_DOWN="iptables-t mangle -A QOS_DOWNLOAD -d ${ip} -j MARK --set-mark 0x${mark}/${mask} "
IPT_CMD_UP="iptables-t mangle -A QOS_UPLOAD -s ${ip} -j MARK --set-mark 0x${mark}/${mask} "
$EVAL${IPT_CMD_DOWN}
$EVAL${IPT_CMD_UP}
IPT_CMD_DOWN="iptables-t mangle -A QOS_DOWNLOAD -d ${ip} -j RETURN "
IPT_CMD_UP="iptables-t mangle -A QOS_UPLOAD -s ${ip} -j RETURN"
$EVAL${IPT_CMD_DOWN}
$EVAL${IPT_CMD_UP}
}
create_netfilter_rule()
{
#echo"create_netfilter_rule"
localIPTN_CMD="iptables -t mangle -N "
localIPTA_CMD="iptables -t mangle -A "
$EVAL"$IPTN_CMD QOS_DOWNLOAD"
$EVAL"${IPTA_CMD} POSTROUTING -o${lan_ifname} -j QOS_DOWNLOAD"
$EVAL"${IPTN_CMD} QOS_UPLOAD"
$EVAL"${IPTA_CMD} POSTROUTING -o${wan_ifname} -j QOS_UPLOAD"
#add rules in mangle for lan host(192.168.1.0/24) access to router(192.168.1.1)
locallan_net_addr=`ifconfig br-lan | grep "inet addr" | cut -d":" -f 2 | cut -d " " -f 1 | cut -d "." -f1-3`.0/24
$EVAL"iptables -t mangle -A QOS_DOWNLOAD -s ${lan_net_addr} -j MARK --set-mark0x${lan_mark}/${mask}"
$EVAL"iptables -t mangle -A QOS_DOWNLOAD -s ${lan_net_addr} -j RETURN"
config_load$QOS_CONF
config_foreachadd_host host
}
qos_start()
{
init_data
#show_data
create_qdisc
create_netfilter_rule
}
qos_stop()
{
get_wan_ifname
#delete qdisc
$EVAL"tc qdisc del dev $lan_ifname root 1>/dev/null 2>&1"
$EVAL"tc qdisc del dev $wan_ifname root 1>/dev/null 2>&1"
#delete chains in mangle table
$EVAL"iptables -t mangle -F QOS_DOWNLOAD 1>/dev/null 2>&1"
$EVAL"iptables -t mangle -D POSTROUTING -o ${lan_ifname} -j QOS_DOWNLOAD 1>/dev/null 2>&1"
$EVAL"iptables -t mangle -X QOS_DOWNLOAD 1>/dev/null 2>&1"
$EVAL"iptables -t mangle -F QOS_UPLOAD 1>/dev/null 2>&1 "
$EVAL"iptables -t mangle -D POSTROUTING -o ${wan_ifname} -j QOS_UPLOAD 1>/dev/null 2>&1"
$EVAL"iptables -t mangle -X QOS_UPLOAD 1>/dev/null 2>&1"
}
qos_restart()
{
qos_stop
qos_start
}