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
 
9
 
10
 PKG_NAME:=luci-app-sqm
10
 PKG_NAME:=luci-app-sqm
11
 PKG_VERSION:=3
11
 PKG_VERSION:=3
12
-PKG_RELEASE:=4
12
+PKG_RELEASE:=5
13
 PKG_LICENSE:=GPLv2
13
 PKG_LICENSE:=GPLv2
14
 LUCI_DIR:=/usr/lib/lua/luci
14
 LUCI_DIR:=/usr/lib/lua/luci
15
 
15
 

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

228
 smpu:depends("linklayer_advanced", "1")
228
 smpu:depends("linklayer_advanced", "1")
229
 
229
 
230
 lla = s:taboption("tab_linklayer", ListValue, "linklayer_adaptation_mechanism", translate("Which linklayer adaptation mechanism to use; for testing only"))
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
 lla:value("htb_private")
232
 lla:value("htb_private")
232
 lla:value("tc_stab", "tc_stab ("..translate("default")..")")
233
 lla:value("tc_stab", "tc_stab ("..translate("default")..")")
233
 lla.default = "tc_stab"
234
 lla.default = "tc_stab"

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

9
 
9
 
10
 PKG_NAME:=sqm-scripts
10
 PKG_NAME:=sqm-scripts
11
 PKG_VERSION:=8
11
 PKG_VERSION:=8
12
-PKG_RELEASE:=5
12
+PKG_RELEASE:=6
13
 PKG_LICENSE:=GPLv2
13
 PKG_LICENSE:=GPLv2
14
 
14
 
15
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
15
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

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

139
 	echo ${STABSTRING}
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
 sqm_stop() {
159
 sqm_stop() {
143
 	$TC qdisc del dev $IFACE ingress
160
 	$TC qdisc del dev $IFACE ingress
144
 	$TC qdisc del dev $IFACE root
161
 	$TC qdisc del dev $IFACE root

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

7
 # it under the terms of the GNU General Public License version 2 as
7
 # it under the terms of the GNU General Public License version 2 as
8
 # published by the Free Software Foundation.
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
 # Compared to the complexity that debloat had become
12
 # Compared to the complexity that debloat had become
13
 # this cleanly shows a means of going from diffserv marking
13
 # this cleanly shows a means of going from diffserv marking
26
 ipt -t mangle -N QOS_MARK_${IFACE}
26
 ipt -t mangle -N QOS_MARK_${IFACE}
27
 
27
 
28
 case $QDISC in
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
 esac
41
 esac
39
 
42
 
40
 # and it might be a good idea to do it for udp tunnels too
43
 # and it might be a good idea to do it for udp tunnels too
88
 
91
 
89
 $TC qdisc del dev $IFACE root 2> /dev/null
92
 $TC qdisc del dev $IFACE root 2> /dev/null
90
 case $QDISC in
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
 esac
139
 esac
135
 
140
 
136
 #diffserv $IFACE
141
 #diffserv $IFACE
157
 sqm_logger "Do not perform DSCP based filtering on ingress. (1-tier classification)"
162
 sqm_logger "Do not perform DSCP based filtering on ingress. (1-tier classification)"
158
 # Revert to no dscp based filtering
163
 # Revert to no dscp based filtering
159
 case $QDISC in
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
 esac
174
 esac
168
 
175
 
169
 else
176
 else

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

7
 # it under the terms of the GNU General Public License version 2 as
7
 # it under the terms of the GNU General Public License version 2 as
8
 # published by the Free Software Foundation.
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
 . /usr/lib/sqm/functions.sh
12
 . /usr/lib/sqm/functions.sh
13
 sqm_logger "Starting simplest.qos"
13
 sqm_logger "Starting simplest.qos"
18
 
18
 
19
 $TC qdisc del dev $IFACE root 2>/dev/null
19
 $TC qdisc del dev $IFACE root 2>/dev/null
20
 case $QDISC in
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
 esac
30
 esac
29
 
31
 
30
 }
32
 }
39
  
41
  
40
 $TC qdisc del dev $DEV root 2>/dev/null
42
 $TC qdisc del dev $DEV root 2>/dev/null
41
 case $QDISC in
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
 esac
59
 esac
56
 
60
 
57
 ifconfig $DEV up
61
 ifconfig $DEV up