rendered paste bodyBEGIN {
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
}