Browse Source

[SQM/luci-app-sqm] Wire up link layer dandling for cake

The cake traffic-shaper qdisc omne stop solution knows how to handle
link layer adjustments for ATM and can account for per packet overhead.
This commit adds cake as link layer adjustment mechanism in the GUI and
passes numerically specified overhead as well as the ATM linklayer
keywords on to cake. This change also passes the "advanced option strings"
from the Queue Discipline tab to cake. But as before no error checking.
This needs testing, as I have no working cake qdisc available so
caveat emptor...

Signed-off-by: Sebastian Moeller <moeller0@gmx.de>
Sebastian Moeller 9 years ago
parent
commit
2ba6a3f9ab

+ 1
- 1
net/luci-app-sqm/Makefile View File

@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
9 9
 
10 10
 PKG_NAME:=luci-app-sqm
11 11
 PKG_VERSION:=3
12
-PKG_RELEASE:=4
12
+PKG_RELEASE:=5
13 13
 PKG_LICENSE:=GPLv2
14 14
 LUCI_DIR:=/usr/lib/lua/luci
15 15
 

+ 1
- 0
net/luci-app-sqm/files/sqm-cbi.lua View File

@@ -228,6 +228,7 @@ smpu.rmempty = true
228 228
 smpu:depends("linklayer_advanced", "1")
229 229
 
230 230
 lla = s:taboption("tab_linklayer", ListValue, "linklayer_adaptation_mechanism", translate("Which linklayer adaptation mechanism to use; for testing only"))
231
+lla:value("cake")
231 232
 lla:value("htb_private")
232 233
 lla:value("tc_stab", "tc_stab ("..translate("default")..")")
233 234
 lla.default = "tc_stab"

+ 1
- 1
net/sqm-scripts/Makefile View File

@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
9 9
 
10 10
 PKG_NAME:=sqm-scripts
11 11
 PKG_VERSION:=8
12
-PKG_RELEASE:=5
12
+PKG_RELEASE:=6
13 13
 PKG_LICENSE:=GPLv2
14 14
 
15 15
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

+ 17
- 0
net/sqm-scripts/files/usr/lib/sqm/functions.sh View File

@@ -139,6 +139,23 @@ get_stab_string() {
139 139
 	echo ${STABSTRING}
140 140
 }
141 141
 
142
+#sm: cake knows how to handle ATM and per packet overhead, so expose and use this...
143
+get_cake_lla_string() {
144
+	STABSTRING=""
145
+	if [ "${LLAM}" = "cake" -a "${LINKLAYER}" != "none" ]; 
146
+	then
147
+		if [ "${LINKLAYER}" = "atm" ];
148
+		then
149
+		    STABSTRING="atm"
150
+		fi
151
+		
152
+		STABSTRING="${STABSTRING} overhead ${OVERHEAD}"
153
+		sqm_logger "cake link layer adjustments: ${STABSTRING}"
154
+	fi
155
+	echo ${STABSTRING}
156
+}
157
+
158
+
142 159
 sqm_stop() {
143 160
 	$TC qdisc del dev $IFACE ingress
144 161
 	$TC qdisc del dev $IFACE root

+ 52
- 45
net/sqm-scripts/files/usr/lib/sqm/simple.qos View File

@@ -7,7 +7,7 @@
7 7
 # it under the terms of the GNU General Public License version 2 as
8 8
 # published by the Free Software Foundation.
9 9
 #
10
-#       Copyright (C) 2012-4 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
10
+#       Copyright (C) 2012-5 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
11 11
 
12 12
 # Compared to the complexity that debloat had become
13 13
 # this cleanly shows a means of going from diffserv marking
@@ -26,15 +26,18 @@ ipt_setup() {
26 26
 ipt -t mangle -N QOS_MARK_${IFACE}
27 27
 
28 28
 case $QDISC in
29
-	cake*) sqm_logger cake does all the diffserv work - no need for iptables rules ;;
29
+	cake*) 
30
+	    sqm_logger cake does all the diffserv work - no need for iptables rules 
31
+	    ;;
30 32
 	*) 
31
-ipt -t mangle -A QOS_MARK_${IFACE} -j MARK --set-mark 0x2${IPT_MASK_STRING} 
32
-# You can go further with classification but...
33
-ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS1 -j MARK --set-mark 0x3${IPT_MASK_STRING}
34
-ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS6 -j MARK --set-mark 0x1${IPT_MASK_STRING}
35
-ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class EF -j MARK --set-mark 0x1${IPT_MASK_STRING}
36
-ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class AF42 -j MARK --set-mark 0x1${IPT_MASK_STRING}
37
-ipt -t mangle -A QOS_MARK_${IFACE} -m tos  --tos Minimize-Delay -j MARK --set-mark 0x1${IPT_MASK_STRING}
33
+	    ipt -t mangle -A QOS_MARK_${IFACE} -j MARK --set-mark 0x2${IPT_MASK_STRING} 
34
+	    # You can go further with classification but...
35
+	    ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS1 -j MARK --set-mark 0x3${IPT_MASK_STRING}
36
+	    ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS6 -j MARK --set-mark 0x1${IPT_MASK_STRING}
37
+	    ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class EF -j MARK --set-mark 0x1${IPT_MASK_STRING}
38
+	    ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class AF42 -j MARK --set-mark 0x1${IPT_MASK_STRING}
39
+	    ipt -t mangle -A QOS_MARK_${IFACE} -m tos  --tos Minimize-Delay -j MARK --set-mark 0x1${IPT_MASK_STRING}
40
+	    ;;
38 41
 esac
39 42
 
40 43
 # and it might be a good idea to do it for udp tunnels too
@@ -88,49 +91,51 @@ LQ="quantum `get_mtu $IFACE $CEIL`"
88 91
 
89 92
 $TC qdisc del dev $IFACE root 2> /dev/null
90 93
 case $QDISC in
91
-	cake*) $TC qdisc add dev $IFACE root $QDISC bandwidth ${CEIL}kbit ;;
94
+	cake*) 
95
+	    $TC qdisc add dev $IFACE root $QDISC bandwidth ${CEIL}kbit get_cake_lla_string ${EQDISC_OPTS}
96
+	    ;;
92 97
 	*) 	
93
-$TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 12
94
-$TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit `get_htb_adsll_string`
95
-$TC class add dev $IFACE parent 1:1 classid 1:10 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit prio 0 `get_htb_adsll_string`
96
-$TC class add dev $IFACE parent 1:1 classid 1:11 htb $LQ rate 128kbit ceil ${PRIO_RATE}kbit prio 1 `get_htb_adsll_string`
97
-$TC class add dev $IFACE parent 1:1 classid 1:12 htb $LQ rate ${BE_RATE}kbit ceil ${BE_CEIL}kbit prio 2 `get_htb_adsll_string`
98
-$TC class add dev $IFACE parent 1:1 classid 1:13 htb $LQ rate ${BK_RATE}kbit ceil ${BE_CEIL}kbit prio 3 `get_htb_adsll_string`
98
+	    $TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 12
99
+	    $TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit `get_htb_adsll_string`
100
+	    $TC class add dev $IFACE parent 1:1 classid 1:10 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit prio 0 `get_htb_adsll_string`
101
+	    $TC class add dev $IFACE parent 1:1 classid 1:11 htb $LQ rate 128kbit ceil ${PRIO_RATE}kbit prio 1 `get_htb_adsll_string`
102
+	    $TC class add dev $IFACE parent 1:1 classid 1:12 htb $LQ rate ${BE_RATE}kbit ceil ${BE_CEIL}kbit prio 2 `get_htb_adsll_string`
103
+	    $TC class add dev $IFACE parent 1:1 classid 1:13 htb $LQ rate ${BK_RATE}kbit ceil ${BE_CEIL}kbit prio 3 `get_htb_adsll_string`
99 104
 
100
-$TC qdisc add dev $IFACE parent 1:11 handle 110: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${PRIO_RATE}` ${EQDISC_OPTS}
101
-$TC qdisc add dev $IFACE parent 1:12 handle 120: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${BE_RATE}` ${EQDISC_OPTS}
102
-$TC qdisc add dev $IFACE parent 1:13 handle 130: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${BK_RATE}` ${EQDISC_OPTS}
105
+	    $TC qdisc add dev $IFACE parent 1:11 handle 110: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${PRIO_RATE}` ${EQDISC_OPTS}
106
+	    $TC qdisc add dev $IFACE parent 1:12 handle 120: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${BE_RATE}` ${EQDISC_OPTS}
107
+	    $TC qdisc add dev $IFACE parent 1:13 handle 130: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_quantum 300` `get_flows ${BK_RATE}` ${EQDISC_OPTS}
103 108
 
104
-# Need a catchall rule
109
+	    # Need a catchall rule
105 110
 
106
-$TC filter add dev $IFACE parent 1:0 protocol all prio 999 u32 \
107
-        match ip protocol 0 0x00 flowid 1:12  
111
+	    $TC filter add dev $IFACE parent 1:0 protocol all prio 999 u32 \
112
+	        match ip protocol 0 0x00 flowid 1:12  
108 113
 
109
-# FIXME should probably change the filter here to do pre-nat
114
+	    # FIXME should probably change the filter here to do pre-nat
110 115
         
111
-$TC filter add dev $IFACE parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
112
-$TC filter add dev $IFACE parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
113
-$TC filter add dev $IFACE parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
116
+	    $TC filter add dev $IFACE parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
117
+	    $TC filter add dev $IFACE parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
118
+	    $TC filter add dev $IFACE parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
114 119
 
115
-# ipv6 support. Note that the handle indicates the fw mark bucket that is looked for
120
+	    # ipv6 support. Note that the handle indicates the fw mark bucket that is looked for
116 121
 
117
-$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 4 handle 1 fw classid 1:11
118
-$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 5 handle 2 fw classid 1:12
119
-$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 6 handle 3 fw classid 1:13
122
+	    $TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 4 handle 1 fw classid 1:11
123
+	    $TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 5 handle 2 fw classid 1:12
124
+	    $TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 6 handle 3 fw classid 1:13
120 125
 
121
-# Arp traffic
126
+	    # Arp traffic
122 127
 
123
-$TC filter add dev $IFACE parent 1:0 protocol arp prio 7 handle 1 fw classid 1:11
128
+	    $TC filter add dev $IFACE parent 1:0 protocol arp prio 7 handle 1 fw classid 1:11
124 129
 
125
-# ICMP traffic - Don't impress your friends. Deoptimize to manage ping floods
126
-# better instead
130
+	    # ICMP traffic - Don't impress your friends. Deoptimize to manage ping floods
131
+	    # better instead
127 132
 
128
-$TC filter add dev $IFACE parent 1:0 protocol ip prio 8 \
129
-	 u32 match ip protocol 1 0xff flowid 1:13
133
+	    $TC filter add dev $IFACE parent 1:0 protocol ip prio 8 \
134
+		 u32 match ip protocol 1 0xff flowid 1:13
130 135
 
131
-$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 9 \
132
-	 u32 match ip protocol 1 0xff flowid 1:13
133
-;;
136
+	    $TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 9 \
137
+		 u32 match ip protocol 1 0xff flowid 1:13
138
+	    ;;
134 139
 esac
135 140
 
136 141
 #diffserv $IFACE
@@ -157,13 +162,15 @@ then
157 162
 sqm_logger "Do not perform DSCP based filtering on ingress. (1-tier classification)"
158 163
 # Revert to no dscp based filtering
159 164
 case $QDISC in
160
-	cake*) $TC qdisc add dev $DEV root $QDISC bandwidth ${DOWNLINK}kbit besteffort ;;
165
+	cake*) 
166
+	    $TC qdisc add dev $DEV root $QDISC bandwidth ${DOWNLINK}kbit besteffort get_cake_lla_string ${IQDISC_OPTS}
167
+	    ;;
161 168
 	*) 	
162
-$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
163
-$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
164
-$TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit prio 0 `get_htb_adsll_string`
165
-$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_flows ${DOWNLINK}` ${IQDISC_OPTS}
166
-;;
169
+	    $TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
170
+	    $TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
171
+	    $TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit prio 0 `get_htb_adsll_string`
172
+	    $TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_flows ${DOWNLINK}` ${IQDISC_OPTS}
173
+	    ;;
167 174
 esac
168 175
 
169 176
 else

+ 21
- 17
net/sqm-scripts/files/usr/lib/sqm/simplest.qos View File

@@ -7,7 +7,7 @@
7 7
 # it under the terms of the GNU General Public License version 2 as
8 8
 # published by the Free Software Foundation.
9 9
 #
10
-#       Copyright (C) 2012-4 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
10
+#       Copyright (C) 2012-5 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
11 11
 
12 12
 . /usr/lib/sqm/functions.sh
13 13
 sqm_logger "Starting simplest.qos"
@@ -18,13 +18,15 @@ LQ="quantum `get_mtu $IFACE ${UPLINK}`"
18 18
 
19 19
 $TC qdisc del dev $IFACE root 2>/dev/null
20 20
 case $QDISC in
21
-	cake*) $TC qdisc add dev $IFACE root cake bandwidth ${UPLINK}kbit besteffort ;;
21
+	cake*) 
22
+	    $TC qdisc add dev $IFACE root cake bandwidth ${UPLINK}kbit besteffort get_cake_lla_string ${EQDISC_OPTS}
23
+	    ;;
22 24
 	*)
23
-$TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 10
24
-$TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit `get_htb_adsll_string`
25
-$TC class add dev $IFACE parent 1:1 classid 1:10 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0 `get_htb_adsll_string`
26
-$TC qdisc add dev $IFACE parent 1:10 handle 110: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_flows ${UPLINK}` ${EQDISC_OPTS}
27
-;;
25
+	    $TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 10
26
+	    $TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit `get_htb_adsll_string`
27
+	    $TC class add dev $IFACE parent 1:1 classid 1:10 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0 `get_htb_adsll_string`
28
+	    $TC qdisc add dev $IFACE parent 1:10 handle 110: $QDISC `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_flows ${UPLINK}` ${EQDISC_OPTS}
29
+	    ;;
28 30
 esac
29 31
 
30 32
 }
@@ -39,19 +41,21 @@ LQ="quantum `get_mtu $IFACE ${DOWNLINK}`"
39 41
  
40 42
 $TC qdisc del dev $DEV root 2>/dev/null
41 43
 case $QDISC in
42
-	cake*) $TC qdisc add dev $DEV root cake bandwidth ${DOWNLINK}kbit besteffort ;;
44
+	cake*) 
45
+	    $TC qdisc add dev $DEV root cake bandwidth ${DOWNLINK}kbit besteffort get_cake_lla_string ${IQDISC_OPTS}
46
+	    ;;
43 47
 	*)
44
-$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
45
-$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
46
-$TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit prio 0 `get_htb_adsll_string`
48
+	    $TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
49
+	    $TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
50
+	    $TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit prio 0 `get_htb_adsll_string`
47 51
 
48
-# FIXME: I'd prefer to use a pre-nat filter but we need to detect if nat is on this interface
49
-# AND we need to permute by a random number which we can't do from userspace filters
52
+	    # FIXME: I'd prefer to use a pre-nat filter but we need to detect if nat is on this interface
53
+	    # AND we need to permute by a random number which we can't do from userspace filters
50 54
 
51
-# Most high rate flows are REALLY close. This stomps on those harder, but hurts on high rate long distance
52
-#$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC limit $LIMIT $ECN interval 20ms target 3ms `get_flows ${DOWNLINK}`
53
-$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_flows ${DOWNLINK}` ${IQDISC_OPTS}
54
-;;
55
+	    # Most high rate flows are REALLY close. This stomps on those harder, but hurts on high rate long distance
56
+	    #$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC limit $LIMIT $ECN interval 20ms target 3ms `get_flows ${DOWNLINK}`
57
+	    $TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_flows ${DOWNLINK}` ${IQDISC_OPTS}
58
+	    ;;
55 59
 esac
56 60
 
57 61
 ifconfig $DEV up