All pastes #22663 Raw Edit

Miscellany

public text v1 · immutable
#22663 ·published 2005-09-11 18:19 UTC
rendered paste body
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
}