simplest.qos 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. ################################################################################
  2. # simplest.qos (Cero3 Simple Shaper)
  3. #
  4. # Abstract:
  5. # This is a single band fq_codel and ipv6 enabled shaping script for Ethernet
  6. # gateways. This is nearly the simplest possible. With FQ_CODEL, the sparseness
  7. # priority will work pretty well for a casual network. Flow-hashes should not
  8. # overlap much with only a few users.
  9. #
  10. # References:
  11. # This alternate shaper attempts to go for 1/u performance in a clever way
  12. # http://git.coverfire.com/?p=linux-qos-scripts.git;a=blob;f=src-3tos.sh;hb=HEAD
  13. #
  14. ################################################################################
  15. #
  16. # This program is free software; you can redistribute it and/or modify
  17. # it under the terms of the GNU General Public License version 2 as
  18. # published by the Free Software Foundation.
  19. #
  20. # Copyright (C) 2012-2016
  21. # Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
  22. #
  23. ################################################################################
  24. . ${SQM_LIB_DIR}/defaults.sh
  25. ################################################################################
  26. cake_egress()
  27. {
  28. $TC qdisc add dev $IFACE root `get_stab_string` cake bandwidth ${UPLINK}kbit besteffort `get_cake_lla_string` ${EQDISC_OPTS}
  29. }
  30. egress() {
  31. LQ="quantum `get_htb_quantum $IFACE ${UPLINK} ${ESHAPER_QUANTUM_DUR_US}`"
  32. BURST="`get_htb_burst $IFACE ${UPLINK} ${ESHAPER_BURST_DUR_US}`"
  33. SILENT=1 $TC qdisc del dev $IFACE root
  34. case $QDISC in
  35. cake*) cake_egress; return ;;
  36. esac
  37. $TC qdisc add dev $IFACE root handle 1: `get_stab_string` htb default 10
  38. $TC class add dev $IFACE parent 1: classid 1:1 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit $BURST `get_htb_adsll_string`
  39. $TC class add dev $IFACE parent 1:1 classid 1:10 htb $LQ rate ${UPLINK}kbit ceil ${UPLINK}kbit $BURST prio 0 `get_htb_adsll_string`
  40. $TC qdisc add dev $IFACE parent 1:10 handle 110: $QDISC \
  41. `get_limit ${ELIMIT}` `get_target "${ETARGET}" ${UPLINK}` `get_ecn ${EECN}` `get_flows ${UPLINK}` ${EQDISC_OPTS}
  42. }
  43. cake_ingress()
  44. {
  45. $TC qdisc add dev $DEV root `get_stab_string` cake bandwidth ${DOWNLINK}kbit besteffort `get_cake_lla_string` ${IQDISC_OPTS}
  46. $IP link set dev $DEV up
  47. # redirect all IP packets arriving in $IFACE to $DEV
  48. $TC filter add dev $IFACE parent ffff: protocol all prio 10 u32 \
  49. match u32 0 0 flowid 1:1 action mirred egress redirect dev $DEV
  50. }
  51. ingress() {
  52. sqm_debug "ingress"
  53. SILENT=1 $TC qdisc del dev $IFACE handle ffff: ingress
  54. $TC qdisc add dev $IFACE handle ffff: ingress
  55. LQ="quantum `get_htb_quantum $IFACE ${DOWNLINK} ${ISHAPER_QUANTUM_DUR_US}`"
  56. BURST="`get_htb_burst $IFACE ${DOWNLINK} ${ISHAPER_BURST_DUR_US}`"
  57. SILENT=1 $TC qdisc del dev $DEV root
  58. case $QDISC in
  59. cake*) cake_ingress; return ;;
  60. esac
  61. $TC qdisc add dev $DEV root handle 1: `get_stab_string` htb default 10
  62. $TC class add dev $DEV parent 1: classid 1:1 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit $BURST `get_htb_adsll_string`
  63. $TC class add dev $DEV parent 1:1 classid 1:10 htb $LQ rate ${DOWNLINK}kbit ceil ${DOWNLINK}kbit $BURST prio 0 `get_htb_adsll_string`
  64. # FIXME: I'd prefer to use a pre-nat filter but we need to detect if nat is on this interface
  65. # AND we need to permute by a random number which we can't do from userspace filters
  66. # Most high rate flows are REALLY close. This stomps on those harder, but hurts on high rate long distance
  67. #$TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC limit $LIMIT $ECN interval 20ms target 3ms `get_flows ${DOWNLINK}`
  68. $TC qdisc add dev $DEV parent 1:10 handle 110: $QDISC \
  69. `get_limit ${ILIMIT}` `get_target "${ITARGET}" ${DOWNLINK}` `get_ecn ${IECN}` `get_flows ${DOWNLINK}` ${IQDISC_OPTS}
  70. $IP link set dev $DEV up
  71. # redirect all IP packets arriving in $IFACE to ifb0
  72. $TC filter add dev $IFACE parent ffff: protocol all prio 10 u32 \
  73. match u32 0 0 flowid 1:1 action mirred egress redirect dev $DEV
  74. }
  75. sqm_prepare_script() {
  76. do_modules
  77. verify_qdisc "htb" || return 1
  78. }
  79. ################################################################################