BEGIN { FS=":" class = 0 default = 0 append = "" } $1 == "class" { if (clsheader != 1) { print "insmod cls_fw >&- 2>&-" print "insmod sch_hfsc >&- 2>&-" print "insmod ipt_CONNMARK >&- 2>&-" print "tc qdisc del dev " device " root" print "tc qdisc add dev " device " root handle 1: hfsc default 1" print "tc class add dev " device " parent 1: classid 1:1 hfsc sc rate " linespeed "kbit ul rate " linespeed "kbit" clsheader=1 } class++ classes[$2] = class include = "" exclude = "" limit = linespeed maxdelay = 100 rate = 10 } $1 == "default" { default = class } $1 == "maxdelay" { maxdelay = $2 } $1 == "rate" { rate = int($2 / 100 * linespeed) } $1 == "limit" { limit = int($2 / 100 * linespeed) } (($1 == "classify") && (classes[$2] > 0)) || (($1 == "clear") && ((classes[$2] > 0) || ($2 == "*"))) { if (fwheader != 1) { print "iptables -t mangle -F" print "iptables -t mangle -A POSTROUTING -o " device " -j CONNMARK --restore-mark" fwheader = 1 } if ($1 == "clear") { if ($2 == "*") req = "" else req = "-m mark --mark " classes[$2] target = "-j MARK --set-mark 0" } else { req = "-m mark --mark 0" target = "-j MARK --set-mark " classes[$2] } cmd = "" singlepacket = 0 if (($3 == "layer7") && ($4 != "")) { if (insmod_l7 != 1) { print "insmod ipt_layer7 >&- 2>&-" insmod_l7 = 1 } cmd = "-m layer7 --l7proto " $4 } else if ($3 == "ipp2p") { if (insmod_ipp2p != 1) { print "insmod ipt_ipp2p >&- 2>&-" insmod_ipp2p = 1 } if ($4 != "") ipp2p = "--" $4 else ipp2p = "--ipp2p" cmd = "-m ipp2p " ipp2p } else if (($3 == "src") || ($3 == "dest")) { if (($4 != "") && ($4 != "*")) { if ($3 == "src") cmd = "-s " $4 " " else cmd = "-d " $4 " " } if (($5 == "tcp") || ($5 == "udp")) { cmd = cmd "-p " $5 if ($6 ~ /^[0-9]+-[0-9]+$/) { ports = $6 gsub(/-/, ":", ports) if ($3 == "src") cmd = cmd " --sport " ports else cmd = cmd " --dport " ports } else { if (insmod_mport != 1) { print "insmod ipt_multiport >&- 2>&-" insmod_mport = 1 } cmd = cmd " -m multiport" if ($3 == "src") cmd = cmd " --sports " $6 else cmd = cmd " --dports " $6 } } } else if ($3 == "proto") { cmd = "-p " $4 } else if ($3 == "tcpack") { if (insmod_len != 1) { print "insmod ipt_length >&- 2>&-" insmod_len = 1 } cmd = "-p tcp --tcp-flags ALL ACK -m length --length :64" singlepacket = 1 } if (cmd != "") { if (singlepacket == 1) append = append "\niptables -t mangle -A POSTROUTING -o " device " " req " " cmd " " target else print "iptables -t mangle -A POSTROUTING -o " device " " req " " cmd " " target } } $1 == "end" { print "tc class add dev " device " parent 1:1 classid 1:" class "0 hfsc sc umax 1500b dmax " maxdelay "ms rate " rate "kbit ul rate " limit "kbit" print "tc filter add dev " device " parent 1: prio " class " protocol ip handle " class " fw flowid 1:" class "0" } END { print "iptables -t mangle -A POSTROUTING -o " device " -j CONNMARK --save-mark" append if (default > 0) print "iptables -t mangle -A POSTROUTING -o " device " -m mark --mark 0 -j MARK --set-mark " default }