sqm-scripts/luci-app-sqm: Merge upstream changes.
Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
This commit is contained in:
commit
c293247428
7 changed files with 159 additions and 78 deletions
|
@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
|
|||
|
||||
PKG_NAME:=luci-app-sqm
|
||||
PKG_VERSION:=3
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=5
|
||||
PKG_LICENSE:=GPLv2
|
||||
LUCI_DIR:=/usr/lib/lua/luci
|
||||
|
||||
|
|
|
@ -36,9 +36,30 @@ s.addremove = true -- set to true to allow adding SQM instances in the GUI
|
|||
s.anonymous = true
|
||||
|
||||
-- BASIC
|
||||
e = s:taboption("tab_basic", Flag, "enabled", translate("Enable"))
|
||||
e = s:taboption("tab_basic", Flag, "enabled", translate("Enable this SQM instance."))
|
||||
e.rmempty = false
|
||||
|
||||
-- sm: following jow's advise, be helpful to the user and enable
|
||||
-- sqm's init script if even a single sm instance/interface
|
||||
-- is enabled; this is unexpected in that the init script gets
|
||||
-- enabled as soon as at least one sqm instance is enabled
|
||||
-- and that state is saved, so it does not require "Save & Apply"
|
||||
-- to effect the init scripts.
|
||||
-- the implementation was inpired/lifted from
|
||||
-- https://github.com/openwrt/luci/blob/master/applications/luci-app-minidlna/luasrc/model/cbi/minidlna.lua
|
||||
function e.write(self, section, value)
|
||||
if value == "1" then
|
||||
luci.sys.init.enable("sqm")
|
||||
m.message = translate("The SQM GUI has just enabled the sqm initscript on your behalf. Remember to disable the sqm initscript manually under System Startup menu in case this change was not wished for.")
|
||||
-- luci.sys.call("/etc/init.d/sqm start >/dev/null")
|
||||
-- else
|
||||
-- luci.sys.call("/etc/init.d/sqm stop >/dev/null")
|
||||
-- luci.sys.init.disable("sqm")
|
||||
end
|
||||
return Flag.write(self, section, value)
|
||||
end
|
||||
-- TODO: inform the user what we just did...
|
||||
|
||||
n = s:taboption("tab_basic", ListValue, "interface", translate("Interface name"))
|
||||
-- sm lifted from luci-app-wol, the original implementation failed to show pppoe-ge00 type interface names
|
||||
for _, iface in ipairs(ifaces) do
|
||||
|
@ -71,6 +92,7 @@ c:value("codel")
|
|||
c:value("ns2_codel")
|
||||
c:value("pie")
|
||||
c:value("sfq")
|
||||
c:value("cake")
|
||||
c.default = "fq_codel"
|
||||
c.rmempty = false
|
||||
|
||||
|
@ -89,7 +111,7 @@ sc.default = "simple.qos"
|
|||
sc.rmempty = false
|
||||
sc.description = qos_desc
|
||||
|
||||
ad = s:taboption("tab_qdisc", Flag, "qdisc_advanced", translate("Show and Use Advanced Configuration"))
|
||||
ad = s:taboption("tab_qdisc", Flag, "qdisc_advanced", translate("Show and Use Advanced Configuration. Advanced options will only be used as long as this box is checked."))
|
||||
ad.default = false
|
||||
ad.rmempty = true
|
||||
|
||||
|
@ -121,7 +143,7 @@ eecn.default = "NOECN"
|
|||
eecn.rmempty = true
|
||||
eecn:depends("qdisc_advanced", "1")
|
||||
|
||||
ad2 = s:taboption("tab_qdisc", Flag, "qdisc_really_really_advanced", translate("Show and Use Dangerous Configuration"))
|
||||
ad2 = s:taboption("tab_qdisc", Flag, "qdisc_really_really_advanced", translate("Show and Use Dangerous Configuration. Dangerous options will only be used as long as this box is checked."))
|
||||
ad2.default = false
|
||||
ad2.rmempty = true
|
||||
ad2:depends("qdisc_advanced", "1")
|
||||
|
@ -178,7 +200,7 @@ po:depends("linklayer", "ethernet")
|
|||
po:depends("linklayer", "atm")
|
||||
|
||||
|
||||
adll = s:taboption("tab_linklayer", Flag, "linklayer_advanced", translate("Show Advanced Linklayer Options, (only needed if MTU > 1500)"))
|
||||
adll = s:taboption("tab_linklayer", Flag, "linklayer_advanced", translate("Show Advanced Linklayer Options, (only needed if MTU > 1500). Advanced options will only be used as long as this box is checked."))
|
||||
adll.rmempty = true
|
||||
adll:depends("linklayer", "ethernet")
|
||||
-- adll:depends("linklayer", "adsl")
|
||||
|
@ -206,6 +228,7 @@ smpu.rmempty = true
|
|||
smpu:depends("linklayer_advanced", "1")
|
||||
|
||||
lla = s:taboption("tab_linklayer", ListValue, "linklayer_adaptation_mechanism", translate("Which linklayer adaptation mechanism to use; for testing only"))
|
||||
lla:value("cake")
|
||||
lla:value("htb_private")
|
||||
lla:value("tc_stab", "tc_stab ("..translate("default")..")")
|
||||
lla.default = "tc_stab"
|
||||
|
|
|
@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
|
|||
|
||||
PKG_NAME:=sqm-scripts
|
||||
PKG_VERSION:=8
|
||||
PKG_RELEASE:=4
|
||||
PKG_RELEASE:=7
|
||||
PKG_LICENSE:=GPLv2
|
||||
|
||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
|
||||
|
|
|
@ -8,7 +8,7 @@ config queue 'eth1'
|
|||
option script 'simple.qos'
|
||||
option qdisc_advanced '0'
|
||||
option ingress_ecn 'ECN'
|
||||
option egress_ecn 'NOECN'
|
||||
option egress_ecn 'ECN'
|
||||
option qdisc_really_really_advanced '0'
|
||||
option itarget 'auto'
|
||||
option etarget 'auto'
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#improve the logread output
|
||||
sqm_logger() {
|
||||
logger -t SQM -s ${1}
|
||||
logger -t SQM -s "${1}"
|
||||
}
|
||||
|
||||
insmod() {
|
||||
|
@ -139,6 +139,23 @@ get_stab_string() {
|
|||
echo ${STABSTRING}
|
||||
}
|
||||
|
||||
#sm: cake knows how to handle ATM and per packet overhead, so expose and use this...
|
||||
get_cake_lla_string() {
|
||||
STABSTRING=""
|
||||
if [ "${LLAM}" = "cake" -a "${LINKLAYER}" != "none" ];
|
||||
then
|
||||
if [ "${LINKLAYER}" = "atm" ];
|
||||
then
|
||||
STABSTRING="atm"
|
||||
fi
|
||||
|
||||
STABSTRING="${STABSTRING} overhead ${OVERHEAD}"
|
||||
sqm_logger "cake link layer adjustments: ${STABSTRING}"
|
||||
fi
|
||||
echo ${STABSTRING}
|
||||
}
|
||||
|
||||
|
||||
sqm_stop() {
|
||||
$TC qdisc del dev $IFACE ingress
|
||||
$TC qdisc del dev $IFACE root
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# Copyright (C) 2012-4 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
|
||||
# Copyright (C) 2012-5 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
|
||||
|
||||
# Compared to the complexity that debloat had become
|
||||
# this cleanly shows a means of going from diffserv marking
|
||||
|
@ -25,13 +25,20 @@ ipt_setup() {
|
|||
|
||||
ipt -t mangle -N QOS_MARK_${IFACE}
|
||||
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -j MARK --set-mark 0x2${IPT_MASK_STRING}
|
||||
# You can go further with classification but...
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS1 -j MARK --set-mark 0x3${IPT_MASK_STRING}
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS6 -j MARK --set-mark 0x1${IPT_MASK_STRING}
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class EF -j MARK --set-mark 0x1${IPT_MASK_STRING}
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class AF42 -j MARK --set-mark 0x1${IPT_MASK_STRING}
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -m tos --tos Minimize-Delay -j MARK --set-mark 0x1${IPT_MASK_STRING}
|
||||
case $QDISC in
|
||||
cake*)
|
||||
sqm_logger cake does all the diffserv work - no need for iptables rules
|
||||
;;
|
||||
*)
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -j MARK --set-mark 0x2${IPT_MASK_STRING}
|
||||
# You can go further with classification but...
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS1 -j MARK --set-mark 0x3${IPT_MASK_STRING}
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS6 -j MARK --set-mark 0x1${IPT_MASK_STRING}
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class EF -j MARK --set-mark 0x1${IPT_MASK_STRING}
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class AF42 -j MARK --set-mark 0x1${IPT_MASK_STRING}
|
||||
ipt -t mangle -A QOS_MARK_${IFACE} -m tos --tos Minimize-Delay -j MARK --set-mark 0x1${IPT_MASK_STRING}
|
||||
;;
|
||||
esac
|
||||
|
||||
# and it might be a good idea to do it for udp tunnels too
|
||||
|
||||
|
@ -43,9 +50,11 @@ ipt -t mangle -A QOS_MARK_${IFACE} -m tos --tos Minimize-Delay -j MARK --set-ma
|
|||
if [ "$SQUASH_DSCP" = "1" ]
|
||||
then
|
||||
sqm_logger "Squashing differentiated services code points (DSCP) from ingress."
|
||||
CAKE_OPTS=besteffort # someday squash
|
||||
ipt -t mangle -I PREROUTING -i $IFACE -m dscp ! --dscp 0 -j DSCP --set-dscp-class be
|
||||
else
|
||||
sqm_logger "Keeping differentiated services code points (DSCP) from ingress."
|
||||
CAKE_OPTS=""
|
||||
ipt -t mangle -A PREROUTING -i $IFACE -m mark --mark 0x00${IPT_MASK_STRING} -g QOS_MARK_${IFACE}
|
||||
fi
|
||||
|
||||
|
@ -81,47 +90,53 @@ BE_CEIL=`expr $CEIL - 16` # A little slop at the top
|
|||
LQ="quantum `get_mtu $IFACE $CEIL`"
|
||||
|
||||
$TC qdisc del dev $IFACE root 2> /dev/null
|
||||
$TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 12
|
||||
$TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit `get_htb_adsll_string`
|
||||
$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`
|
||||
$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`
|
||||
$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`
|
||||
$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`
|
||||
case $QDISC in
|
||||
cake*)
|
||||
$TC qdisc add dev $IFACE root `get_stab_string` $QDISC bandwidth ${CEIL}kbit `get_cake_lla_string` ${EQDISC_OPTS}
|
||||
;;
|
||||
*)
|
||||
$TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 12
|
||||
$TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit `get_htb_adsll_string`
|
||||
$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`
|
||||
$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`
|
||||
$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`
|
||||
$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`
|
||||
|
||||
$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}
|
||||
$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}
|
||||
$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}
|
||||
$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}
|
||||
$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}
|
||||
$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}
|
||||
|
||||
# Need a catchall rule
|
||||
|
||||
# Need a catchall rule
|
||||
$TC filter add dev $IFACE parent 1:0 protocol all prio 999 u32 \
|
||||
match ip protocol 0 0x00 flowid 1:12
|
||||
|
||||
$TC filter add dev $IFACE parent 1:0 protocol all prio 999 u32 \
|
||||
match ip protocol 0 0x00 flowid 1:12
|
||||
|
||||
# FIXME should probably change the filter here to do pre-nat
|
||||
# FIXME should probably change the filter here to do pre-nat
|
||||
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
|
||||
|
||||
# ipv6 support. Note that the handle indicates the fw mark bucket that is looked for
|
||||
# ipv6 support. Note that the handle indicates the fw mark bucket that is looked for
|
||||
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 4 handle 1 fw classid 1:11
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 5 handle 2 fw classid 1:12
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 6 handle 3 fw classid 1:13
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 4 handle 1 fw classid 1:11
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 5 handle 2 fw classid 1:12
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 6 handle 3 fw classid 1:13
|
||||
|
||||
# Arp traffic
|
||||
# Arp traffic
|
||||
|
||||
$TC filter add dev $IFACE parent 1:0 protocol arp prio 7 handle 1 fw classid 1:11
|
||||
$TC filter add dev $IFACE parent 1:0 protocol arp prio 7 handle 1 fw classid 1:11
|
||||
|
||||
# ICMP traffic - Don't impress your friends. Deoptimize to manage ping floods
|
||||
# better instead
|
||||
# ICMP traffic - Don't impress your friends. Deoptimize to manage ping floods
|
||||
# better instead
|
||||
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ip prio 8 \
|
||||
u32 match ip protocol 1 0xff flowid 1:13
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ip prio 8 \
|
||||
u32 match ip protocol 1 0xff flowid 1:13
|
||||
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 9 \
|
||||
u32 match ip protocol 1 0xff flowid 1:13
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 9 \
|
||||
u32 match ip protocol 1 0xff flowid 1:13
|
||||
;;
|
||||
esac
|
||||
|
||||
#diffserv $IFACE
|
||||
|
||||
|
@ -144,31 +159,43 @@ $TC qdisc del dev $DEV root 2> /dev/null
|
|||
|
||||
if [ "$SQUASH_INGRESS" = "1" ]
|
||||
then
|
||||
sqm_logger "Do not perform DSCP based filtering on ingress. (1-tier classification)"
|
||||
# Revert to no dscp based filtering
|
||||
$TC qdisc del dev $DEV root 2>/dev/null
|
||||
$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
|
||||
$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
|
||||
$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`
|
||||
$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}
|
||||
sqm_logger "Do not perform DSCP based filtering on ingress. (1-tier classification)"
|
||||
# Revert to no dscp based filtering
|
||||
case $QDISC in
|
||||
cake*)
|
||||
$TC qdisc add dev $DEV root `get_stab_string` $QDISC bandwidth ${DOWNLINK}kbit besteffort `get_cake_lla_string` ${IQDISC_OPTS}
|
||||
;;
|
||||
*)
|
||||
$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
|
||||
$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
|
||||
$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`
|
||||
$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}
|
||||
;;
|
||||
esac
|
||||
|
||||
else
|
||||
sqm_logger "Perform DSCP based filtering on ingress. (3-tier classification)"
|
||||
$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 12
|
||||
$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit `get_htb_adsll_string`
|
||||
$TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit prio 0 `get_htb_adsll_string`
|
||||
$TC class add dev $DEV parent 1:1 classid 1:11 htb $LQ rate 32kbit ceil ${PRIO_RATE}kbit prio 1 `get_htb_adsll_string`
|
||||
$TC class add dev $DEV parent 1:1 classid 1:12 htb $LQ rate ${BE_RATE}kbit ceil ${BE_CEIL}kbit prio 2 `get_htb_adsll_string`
|
||||
$TC class add dev $DEV parent 1:1 classid 1:13 htb $LQ rate ${BK_RATE}kbit ceil ${BE_CEIL}kbit prio 3 `get_htb_adsll_string`
|
||||
sqm_logger "Perform DSCP based filtering on ingress. (3-tier classification)"
|
||||
case $QDISC in
|
||||
cake*)
|
||||
$TC qdisc add dev $DEV root `get_stab_string` $QDISC bandwidth ${DOWNLINK}kbit `get_cake_lla_string` $CAKE_OPTS ${IQDISC_OPTS}
|
||||
;;
|
||||
*)
|
||||
$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 12
|
||||
$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit `get_htb_adsll_string`
|
||||
$TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${CEIL}kbit ceil ${CEIL}kbit prio 0 `get_htb_adsll_string`
|
||||
$TC class add dev $DEV parent 1:1 classid 1:11 htb $LQ rate 32kbit ceil ${PRIO_RATE}kbit prio 1 `get_htb_adsll_string`
|
||||
$TC class add dev $DEV parent 1:1 classid 1:12 htb $LQ rate ${BE_RATE}kbit ceil ${BE_CEIL}kbit prio 2 `get_htb_adsll_string`
|
||||
$TC class add dev $DEV parent 1:1 classid 1:13 htb $LQ rate ${BK_RATE}kbit ceil ${BE_CEIL}kbit prio 3 `get_htb_adsll_string`
|
||||
|
||||
# I'd prefer to use a pre-nat filter but that causes permutation...
|
||||
# I'd prefer to use a pre-nat filter but that causes permutation...
|
||||
|
||||
$TC qdisc add dev $DEV parent 1:11 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 500` `get_flows ${PRIO_RATE}` ${IQDISC_OPTS}
|
||||
$TC qdisc add dev $DEV parent 1:12 handle 120: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 1500` `get_flows ${BE_RATE}` ${IQDISC_OPTS}
|
||||
$TC qdisc add dev $DEV parent 1:13 handle 130: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 300` `get_flows ${BK_RATE}` ${IQDISC_OPTS}
|
||||
|
||||
diffserv $DEV
|
||||
$TC qdisc add dev $DEV parent 1:11 handle 110: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 500` `get_flows ${PRIO_RATE}` ${IQDISC_OPTS}
|
||||
$TC qdisc add dev $DEV parent 1:12 handle 120: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 1500` `get_flows ${BE_RATE}` ${IQDISC_OPTS}
|
||||
$TC qdisc add dev $DEV parent 1:13 handle 130: $QDISC `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_quantum 300` `get_flows ${BK_RATE}` ${IQDISC_OPTS}
|
||||
|
||||
diffserv $DEV
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
ifconfig $DEV up
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# Copyright (C) 2012-4 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
|
||||
# Copyright (C) 2012-5 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
|
||||
|
||||
. /usr/lib/sqm/functions.sh
|
||||
sqm_logger "Starting simplest.qos"
|
||||
|
@ -17,10 +17,17 @@ egress() {
|
|||
LQ="quantum `get_mtu $IFACE ${UPLINK}`"
|
||||
|
||||
$TC qdisc del dev $IFACE root 2>/dev/null
|
||||
$TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 10
|
||||
$TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit `get_htb_adsll_string`
|
||||
$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`
|
||||
$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}
|
||||
case $QDISC in
|
||||
cake*)
|
||||
$TC qdisc add dev $IFACE root `get_stab_string` cake bandwidth ${UPLINK}kbit besteffort `get_cake_lla_string` ${EQDISC_OPTS}
|
||||
;;
|
||||
*)
|
||||
$TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 10
|
||||
$TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit `get_htb_adsll_string`
|
||||
$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`
|
||||
$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}
|
||||
;;
|
||||
esac
|
||||
|
||||
}
|
||||
|
||||
|
@ -33,16 +40,23 @@ $TC qdisc add dev $IFACE handle ffff: ingress
|
|||
LQ="quantum `get_mtu $IFACE ${DOWNLINK}`"
|
||||
|
||||
$TC qdisc del dev $DEV root 2>/dev/null
|
||||
$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
|
||||
$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
|
||||
$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`
|
||||
case $QDISC in
|
||||
cake*)
|
||||
$TC qdisc add dev $DEV root `get_stab_string` cake bandwidth ${DOWNLINK}kbit besteffort `get_cake_lla_string` ${IQDISC_OPTS}
|
||||
;;
|
||||
*)
|
||||
$TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
|
||||
$TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit `get_htb_adsll_string`
|
||||
$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`
|
||||
|
||||
# FIXME: I'd prefer to use a pre-nat filter but we need to detect if nat is on this interface
|
||||
# AND we need to permute by a random number which we can't do from userspace filters
|
||||
# FIXME: I'd prefer to use a pre-nat filter but we need to detect if nat is on this interface
|
||||
# AND we need to permute by a random number which we can't do from userspace filters
|
||||
|
||||
# Most high rate flows are REALLY close. This stomps on those harder, but hurts on high rate long distance
|
||||
#$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC limit $LIMIT $ECN interval 20ms target 3ms `get_flows ${DOWNLINK}`
|
||||
$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}
|
||||
# Most high rate flows are REALLY close. This stomps on those harder, but hurts on high rate long distance
|
||||
#$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC limit $LIMIT $ECN interval 20ms target 3ms `get_flows ${DOWNLINK}`
|
||||
$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}
|
||||
;;
|
||||
esac
|
||||
|
||||
ifconfig $DEV up
|
||||
|
||||
|
|
Loading…
Reference in a new issue