qos功能脚本

来源:互联网 发布:网络维护培训学校 编辑:程序博客网 时间:2024/06/06 12:40

 

#/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

}

0 0
原创粉丝点击