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,6 +25,11 @@ ipt_setup() {
|
|||
|
||||
ipt -t mangle -N QOS_MARK_${IFACE}
|
||||
|
||||
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}
|
||||
|
@ -32,6 +37,8 @@ ipt -t mangle -A QOS_MARK_${IFACE} -m dscp --dscp-class CS6 -j MARK --set-mark 0
|
|||
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,6 +90,11 @@ 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
|
||||
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`
|
||||
|
@ -92,7 +106,6 @@ $TC qdisc add dev $IFACE parent 1:11 handle 110: $QDISC `get_limit ${ELIMIT}` `g
|
|||
$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
|
||||
|
||||
$TC filter add dev $IFACE parent 1:0 protocol all prio 999 u32 \
|
||||
|
@ -122,6 +135,8 @@ $TC filter add dev $IFACE parent 1:0 protocol ip prio 8 \
|
|||
|
||||
$TC filter add dev $IFACE parent 1:0 protocol ipv6 prio 9 \
|
||||
u32 match ip protocol 1 0xff flowid 1:13
|
||||
;;
|
||||
esac
|
||||
|
||||
#diffserv $IFACE
|
||||
|
||||
|
@ -146,14 +161,25 @@ 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
|
||||
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)"
|
||||
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`
|
||||
|
@ -168,7 +194,8 @@ $TC qdisc add dev $DEV parent 1:12 handle 120: $QDISC `get_limit ${ILIMIT}` `get
|
|||
$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
|
||||
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,6 +40,11 @@ $TC qdisc add dev $IFACE handle ffff: ingress
|
|||
LQ="quantum `get_mtu $IFACE ${DOWNLINK}`"
|
||||
|
||||
$TC qdisc del dev $DEV root 2>/dev/null
|
||||
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`
|
||||
|
@ -43,6 +55,8 @@ $TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${DOWNLINK}kbit ceil
|
|||
# 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