source: trunk/package/network/config/qos-scripts/files/usr/lib/qos/tcrules.awk

Last change on this file was 48452, checked in by nbd, 8 months ago

qos-scripts: Add IPv6 support

This adds IPv6 support to qos-scripts for both tc/qdisc and the
iptables classification rules. The tc/qdisc part is accomplished
by removing "protocol ip" from the tc command line, causing the
rule to be applied to all protocols. The iptables part is
accomplished by adding each rule using both iptables and ip6tables.

This patch is based on previous work by Ilkka Ollakka and
Dominique Martinet.

Signed-off-by: Michael Marley <michael@…>

File size: 2.4 KB
Line 
1BEGIN {
2        dmax=100
3        if (!(linespeed > 0)) linespeed = 128
4        FS=":"
5        n = 0
6}
7
8($1 != "") {
9        n++
10        class[n] = $1
11        prio[n] = $2
12        avgrate[n] = ($3 * linespeed / 100)
13        pktsize[n] = $4
14        delay[n] = $5
15        maxrate[n] = ($6 * linespeed / 100)
16        qdisc[n] = $7
17        filter[n] = $8
18}
19
20END {
21        allocated = 0
22        maxdelay = 0
23
24        for (i = 1; i <= n; i++) {
25                # set defaults
26                if (!(pktsize[i] > 0)) pktsize[i] = 1500
27                if (!(prio[i] > 0)) prio[i] = 1
28
29                allocated += avgrate[i]
30                sum_prio += prio[i]
31                if ((avgrate[i] > 0) && !(delay[i] > 0)) {
32                        sum_rtprio += prio[i]
33                }
34        }
35
36        # allocation of m1 in rt classes:
37        # sum(d * m1) must not exceed dmax * (linespeed - allocated)
38        dmax = 0
39        for (i = 1; i <= n; i++) {
40                if (avgrate[i] > 0) {
41                        rtm2[i] = avgrate[i]
42                        if (delay[i] > 0) {
43                                d[i] = delay[i]
44                        } else {
45                                d[i] = 2 * pktsize[i] * 1000 / (linespeed * 1024)
46                                if (d[i] > dmax) dmax = d[i]
47                        }
48                }
49        }
50
51        ds_avail = dmax * (linespeed - allocated)
52        for (i = 1; i <= n; i++) {
53                lsm1[i] = 0
54                rtm1[i] = 0
55                lsm2[i] = linespeed * prio[i] / sum_prio
56                if ((avgrate[i] > 0) && (d[i] > 0)) {
57                        if (!(delay[i] > 0)) {
58                                ds = ds_avail * prio[i] / sum_rtprio
59                                ds_avail -= ds
60                                rtm1[i] = rtm2[i] + ds/d[i]
61                        }
62                        lsm1[i] = rtm1[i]
63                }
64                else {
65                        d[i] = 0
66                }
67        }
68
69        # main qdisc
70        for (i = 1; i <= n; i++) {
71                printf "tc class add dev "device" parent 1:1 classid 1:"class[i]"0 hfsc"
72                if (rtm1[i] > 0) {
73                        printf " rt m1 " int(rtm1[i]) "kbit d " int(d[i] * 1000) "us m2 " int(rtm2[i])"kbit"
74                }
75                printf " ls m1 " int(lsm1[i]) "kbit d " int(d[i] * 1000) "us m2 " int(lsm2[i]) "kbit"
76                print " ul rate " int(maxrate[i]) "kbit"
77        }
78
79        # leaf qdisc
80        avpkt = 1200
81        for (i = 1; i <= n; i++) {
82                print "tc qdisc add dev "device" parent 1:"class[i]"0 handle "class[i]"00: fq_codel limit 800 quantum 300 noecn"
83        }
84
85        # filter rule
86        for (i = 1; i <= n; i++) {
87                filter_cmd = "tc filter add dev "device" parent 1: prio %d handle %s fw flowid 1:%d0\n";
88                if (direction == "up") {
89                        filter_1 = sprintf("0x%x0/0xf0", class[i])
90                        filter_2 = sprintf("0x0%x/0x0f", class[i])
91                } else {
92                        filter_1 = sprintf("0x0%x/0x0f", class[i])
93                        filter_2 = sprintf("0x%x0/0xf0", class[i])
94                }
95
96                printf filter_cmd, class[i] * 2, filter_1, class[i]
97                printf filter_cmd, class[i] * 2 + 1, filter_2, class[i]
98
99                filterc=1
100                if (filter[i] != "") {
101                        print " tc filter add dev "device" parent "class[i]"00: handle "filterc"0 "filter[i]
102                        filterc=filterc+1
103                }
104        }
105}
106
Note: See TracBrowser for help on using the repository browser.