accel-ppp icon indicating copy to clipboard operation
accel-ppp copied to clipboard

Modify htb

Open alakiza opened this issue 4 years ago • 3 comments

Краткое описание

Добавлен "конструктор" шейпера, в виде шейпера adv_shaper модуля shaper. Требуется для того, чтобы избавиться от pppd_compat, когда необходим только сложный шейпер (htb, несколько классов, несколько фильтров, несколько действий).

Добавлена команда

shaper refresh all
shaper refresh INTERFACE

На основе существующей shaper change, чтобы можно было менять шейперы всем абонентам (одному абоненту) после перезагрузки конфигурации.

Описание полей

секция shaper down-limiter = adv_shaper up-limiter=adv_shaper

секция advanced_shaper и advanced_shaper_up синтаксис (в [] необязательные параметры)

qdisc = htb handle HANDLE parent PARENTID r2q R2Q default DEF_CLASS
qdisc = fq_codel handle HANDLE parent PARENTID [ limit LIMIT ] [ flows FLOWS ] [ quantum QUANTUM ] [ target TARGET ] [ interval INTERVAL ] [ ecn|noecn ]
qdisc = sfq handle HANDLE parent PARENTID perturb PERTURB [ limit LIMIT ] [ quantum QUANTUM ]
qdisc = tbf handle HANDLE parent PARENTID rate RATE burst BURST latency LATENCY
qdisc = ingress handle HANDLE parent PARENTID

class = classid CLASSID parent PARENTID [ rate RATE ] [ burst BURST ] [ cburst CBURST ] [ ceil CEIL ]

filter = net parent PARENTID priority PRIO ip NET src|dst classid CLASSID
filter = net6 parent PARENTID priority PRIO ip6 NET src|dst classid CLASSID
filter = fw parent PARENTID priority PRIO handle HANDLE classid CLASSID
filter = u32 parent PARENTID priority PRIO value VAL mask VAL_MASK offset OFFSET offmask OFFMASK classid CLASSID

action = parent PARENTID priority PRIO pass
action = parent PARENTID priority PRIO police mtu MTU action pass|drop [ mpu MPU ] [ rate RATE ] [ burst BURST ]

qdisc

Дисциплина. Может быть корневой и краевой Первая дисциплина (qdisc) в списке - корневая (root) Остальные - краевые (leaf) По умолчанию Linux ставит pfifo_fast в качестве краевой дисциплины Реализованы дисцпилины:

  • htb
  • tbf
  • sfq
  • fq_codel
  • ingress

Пример:

qdisc = tbf handle 1:0 parent ffff:ffff rate 10240 burst 10240 latency 50
qdisc = htb handle 1:0 parent ffff:ffff r2q 100 default 1:100
qdisc = sfq handle 2:0 parent 1:10 perturb 10
qdisc = fq_codel handle 3:0 parent 1:100
qdisc = ingress handle ffff:0 parent ffff:fff1

filter fw

Фильтр по fwmark, которую следует добавлять в таблице mangle

iptables -t mangle -A PREROUTING -s XXX.XXX.XXX.XXX/24 -j MARK --set-mark 10

Пример:

filter = fw  parent 1:0 priority 60  handle 10 classid 1:10

filter u32

Фильтр u32. Производит сравнение 32-битного значения VAL со значением в пакете со смещением OFFSET, с применением маски VAL_MASK Пример:

filter = u32 parent 1:0 priority 200 value f16de000 mask ffffff00 offset 16 classid 1:10

filter net

Частный случай фильтра u32, который производит сравнение по IP адресу источника или назначения. (Смещение 12 и 16 соответственно) с применением маски Пример:

filter = net parent 1:0 priority 100 ip XXX.XXX.XXX.XXX/24 src classid 1:10

filter net6

Частный случай фильтра u32, который производит сравнение по IPv6 адресу источника или назначения. (Смещение 8 и 24 соответственно) с применением маски Пример:

filter = net6 parent 1:0 priority 500 ip6 fe80::cdef/127 dst classid 1:10

action pass

Пример:

#Exclude packets from policer
filter = net parent ffff:0 priority 50 ip 192.0.2.0/24 dst classid ffff:0
action = parent ffff:0 priority 50 pass

action police

Пример

#Policer that use speed from radius
filter = net parent ffff:0 priority 100 ip 0.0.0.0/0 src classid ffff:0
action = parent ffff:0 priority 100 police rate 0 burst 0 mpu 0 mtu 40960 action drop

Описание параметров

HANDLE, PARENTID, CLASSID, DEF_CLASS - 32-битное число. Записывается в виде шестнадцатеричного числа в формате XXXX:XXXX Пример:

1:100 == 0x00010100
1:0   == 0x00010000
0:1   == 0x00000001

PARENTID для корневой дисциплины требуется указывать ffff:ffff

Если требуется пропустить трафик без шейпера, то в поле фильтра CLASSID следует указывать HANDLE корневой дисциплины. Иначе указывается CLASSID определённого класса.

R2Q для дисциплины htb - параметр r2q, то есть rate to quantum. Требуется подбирать при больших расхождениях пропускной способности между классами и при больших скоростях.

RATE,BURST для дисциплин указывать 0, если требуется брать данные из radius и секции shaper. Если требуется какое-то специфичное значение - указывать в килобитах**.

PRIO - порядковый номер фильтра. Чем меньше - тем раньше будет проверяться. Записывается в виде десятичного числа.

NET - подсеть в формате XXX.XXX.XXX.XXX/YY для IPV4 И любая допустимая запись IPv6 с точки зрения функции inet_pton

NETTYPE - src или dst

VAL, VAL_MASK - 32-битные числа. Записываются в виде шестнадцатеричного числа

ffffffff
00a01000
a01000
ffffff00

OFFSET - смещение от начала пакета. Записывается в виде десятичного числа.

Примеры использования

Пример 1:

[shaper]
attr-down=PPPD-Downstream-Speed-Limit
attr-up=PPPD-Upstream-Speed-Limit
up-limiter=police
down-limiter=adv_shaper
down-burst-factor=0.1
up-burst-factor=1.0
rate-multiplier=1.1
verbose=1

[advanced_shaper]
qdisc = htb handle 1:0 parent ffff:ffff r2q 100 default 1:100

class = classid 1:1   parent 1:0 rate 0 burst 0 cburst 0
class = classid 1:100 parent 1:1 rate 0 burst 0 cburst 0
class = classid 1:200 parent 1:1 rate 0 burst 0 cburst 0
class = classid 1:10  parent 1:1 rate 10240 ceil 10240 burst 5120 cburst 5120

qdisc = sfq handle 2:0 parent 1:10 perturb 10
qdisc = fq_codel handle 3:0 parent 1:100
qdisc = tbf handle 4:0 parent 1:200 rate 10240 burst 10240 latency 50

filter = net parent 1:0 priority 100 ip XXX.XXX.XXX.XXX/24 src classid 1:10
filter = net6 parent 1:0 priority 300 ip6 fe80::cdef/24 src classid 1:10
filter = net6 parent 1:0 priority 400 ip6 fe80::cdef/127 src classid 1:10
filter = net6 parent 1:0 priority 500 ip6 fe80::cdef/127 dst classid 1:10
filter = net6 parent 1:0 priority 600 ip6 ::/0 dst classid 1:10
filter = u32 parent 1:0 priority 200 value f16db000 mask ffffff00 offset 16 classid 1:10
filter = fw  parent 1:0 priority 50  handle 10 classid 1:0
filter = fw  parent 1:0 priority 60  handle 20 classid 1:10

Результат:

 ✘ ⚡ root@host  ~  tc -d qdisc sh dev ppp0
qdisc htb 1: root refcnt 2 r2q 100 default 0x10100 direct_packets_stat 0 ver 3.17 direct_qlen 3
qdisc sfq 2: parent 1:10 limit 127p quantum 1518b depth 127 flows 128/1024 divisor 1024 perturb 10sec
qdisc tbf 4: parent 1:200 rate 81920bit burst 10Kb/1 mpu 0b lat 50.0ms linklayer ethernet
qdisc fq_codel 3: parent 1:100 limit 10240p flows 1024 quantum 1518 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
qdisc ingress ffff: parent ffff:fff1 ----------------

 ⚡ root@host  ~  tc -d class sh dev ppp0
class htb 1:1 root rate 112640Kbit ceil 112640Kbit linklayer ethernet burst 1375Kb/1 mpu 0b cburst 1375Kb/1 mpu 0b level 7
class htb 1:100 parent 1:1 leaf 3: prio 0 quantum 140800 rate 112640Kbit ceil 112640Kbit linklayer ethernet burst 1375Kb/1 mpu 0b cburst 1375Kb/1 mpu 0b level 0
class htb 1:10 parent 1:1 leaf 2: prio 0 quantum 12800 rate 10240Kbit ceil 10240Kbit linklayer ethernet burst 625Kb/1 mpu 0b cburst 625Kb/1 mpu 0b level 0
class htb 1:200 parent 1:1 leaf 4: prio 0 quantum 140800 rate 112640Kbit ceil 112640Kbit linklayer ethernet burst 1375Kb/1 mpu 0b cburst 1375Kb/1 mpu 0b level 0
class tbf 4:1 parent 4:
class tbf 4:1 parent 4:

 ⚡ root@host  ~  tc -d f sh dev ppp0
filter parent 1: protocol ip pref 50 fw chain 0
filter parent 1: protocol ip pref 50 fw chain 0 handle 0xa classid 1:
filter parent 1: protocol ip pref 60 fw chain 0
filter parent 1: protocol ip pref 60 fw chain 0 handle 0x14 classid 1:10
filter parent 1: protocol all pref 100 u32 chain 0
filter parent 1: protocol all pref 100 u32 chain 0 fh 800: ht divisor 1
filter parent 1: protocol all pref 100 u32 chain 0 fh 800::1 order 1 key ht 800 bkt 0 flowid 1:10 not_in_hw
  match c16da000/ffffff00 at 12
filter parent 1: protocol all pref 200 u32 chain 0
filter parent 1: protocol all pref 200 u32 chain 0 fh 805: ht divisor 1
filter parent 1: protocol all pref 200 u32 chain 0 fh 805::1 order 1 key ht 805 bkt 0 flowid 1:10 not_in_hw
  match c16db000/ffffff00 at 16
filter parent 1: protocol all pref 300 u32 chain 0
filter parent 1: protocol all pref 300 u32 chain 0 fh 801: ht divisor 1
filter parent 1: protocol all pref 300 u32 chain 0 fh 801::1 order 1 key ht 801 bkt 0 flowid 1:10 not_in_hw
  match fe800000/ffffff00 at 8
filter parent 1: protocol all pref 400 u32 chain 0
filter parent 1: protocol all pref 400 u32 chain 0 fh 802: ht divisor 1
filter parent 1: protocol all pref 400 u32 chain 0 fh 802::1 order 1 key ht 802 bkt 0 flowid 1:10 not_in_hw
  match fe800000/ffffffff at 8
  match 00000000/ffffffff at 12
  match 00000000/ffffffff at 16
  match 0000cdef/fffffffe at 20
filter parent 1: protocol all pref 500 u32 chain 0
filter parent 1: protocol all pref 500 u32 chain 0 fh 803: ht divisor 1
filter parent 1: protocol all pref 500 u32 chain 0 fh 803::1 order 1 key ht 803 bkt 0 flowid 1:10 not_in_hw
  match fe800000/ffffffff at 24
  match 00000000/ffffffff at 28
  match 00000000/ffffffff at 32
  match 0000cdef/fffffffe at 36
filter parent 1: protocol all pref 600 u32 chain 0
filter parent 1: protocol all pref 600 u32 chain 0 fh 804: ht divisor 1
filter parent 1: protocol all pref 600 u32 chain 0 fh 804::1 order 1 key ht 804 bkt 0 flowid 1:10 not_in_hw

Пример 2:

[shaper]
attr-down=PPPD-Downstream-Speed-Limit
attr-up=PPPD-Upstream-Speed-Limit
up-limiter=police
down-limiter=adv_shaper
down-burst-factor=0.1
up-burst-factor=1.0
rate-multiplier=1.1
verbose=1

[advanced_shaper]
qdisc = htb handle 1:0 parent ffff:ffff r2q 20 default 1:1
class = classid 1:100 parent 1:0 rate 0 burst 0 cburst 0
class = classid 1:1   parent 1:100 rate 0 burst 0 cburst 0
class = classid 1:10 parent 1:100 rate 10240 burst 5120 cburst 5120
filter = net parent 1:0 priority 100 ip XXX.XXX.XXX.XXX/24 src classid 1:0
filter = net parent 1:0 priority 110 ip YYY.YYY.YYY.YYY/24 src classid 1:0
filter = net parent 1:0 priority 201 ip ZZZ.ZZZ.ZZZ.ZZZ/22 src classid 1:10
filter = net parent 1:0 priority 202 ip WWW.WWW.WWW.WWW/17 src classid 1:10
filter = net parent 1:0 priority 203 ip KKK.KKK.KKK.KKK/31 src classid 1:10

Пример 3:

[shaper]
attr-down=PPPD-Downstream-Speed-Limit
attr-up=PPPD-Upstream-Speed-Limit
up-limiter=police
down-limiter=adv_shaper
down-burst-factor=0.1
up-burst-factor=1.0
rate-multiplier=1.1
verbose=1

[advanced_shaper]
qdisc = tbf handle 1:0 parent ffff:ffff rate 0 burst 0 latency 50

Пример 4:

[shaper]
attr-down=PPPD-Downstream-Speed-Limit
attr-up=PPPD-Upstream-Speed-Limit
up-limiter=police
down-limiter=adv_shaper
down-burst-factor=0.1
up-burst-factor=1.0
rate-multiplier=1.1
verbose=1

[advanced_shaper]
qdisc = htb handle 1:0 parent ffff:ffff r2q 20 default 1:100
class = classid 1:1 parent 1:0 rate 0 burst 0 cburst 0
class = classid 1:100 parent 1:1 rate 0 burst 0 cburst 0
class = classid 1:10 parent 1:1 rate 10240 burst 5120 cburst 5120
qdisc = sfq handle 2:0 parent 1:10 perturb 10
qdisc = fq_codel handle 3:0 parent 1:100
filter = fw parent 1:0 priority 50 handle 10 classid 1:0
filter = u32 parent 1:0 priority 30 value f16da000 mask ffffff00 offset 12 classid 1:10

Пример 5:

Используем полисер и для download и для upload

[shaper]
attr-down=PPPD-Downstream-Speed-Limit
attr-up=PPPD-Upstream-Speed-Limit
down-limiter=adv_shaper
up-limiter=adv_shaper
down-burst-factor=0.1
up-burst-factor=1.0
verbose=1

[advanced_shaper]
qdisc = htb handle 1:0 parent ffff:ffff r2q 100 default 1:100

filter = net parent 1:0 priority 50 ip XXX.XXX.XXX.XXX/24 src classid 1:0
action = parent 1:0 priority 50 pass

filter = net parent 1:0 priority 100 ip 0.0.0.0/0 src classid ffff:0
action = parent 1:0 priority 100 police rate 0 burst 0 mpu 0 mtu 40960 action drop

[advanced_shaper_up]
qdisc = ingress handle ffff:0 parent ffff:fff1

filter = net parent ffff:0 priority 50 ip XXX.XXX.XXX.XXX/24 dst classid ffff:0
action = parent ffff:0 priority 50 pass

filter = net parent ffff:0 priority 100 ip 0.0.0.0/0 src classid ffff:0
action = parent ffff:0 priority 100 police rate 0 burst 0 mpu 0 mtu 40960 action drop

Результаты:

tc qd sh dev ppp0

qdisc htb 1: root refcnt 2 r2q 100 default 0x10100 direct_packets_stat 96767 direct_qlen 3
qdisc ingress ffff: parent ffff:fff1 ----------------

tc f sh dev ppp0

filter parent 1: protocol all pref 50 u32 chain 0
filter parent 1: protocol all pref 50 u32 chain 0 fh 800: ht divisor 1
filter parent 1: protocol all pref 50 u32 chain 0 fh 800::1 order 1 key ht 800 bkt 0 flowid 1: not_in_hw
  match XXXXXXXX/ffffff00 at 12
        action order 1: gact action pass
         random type none pass val 0
         index 2 ref 1 bind 1

filter parent 1: protocol all pref 100 u32 chain 0
filter parent 1: protocol all pref 100 u32 chain 0 fh 801: ht divisor 1
filter parent 1: protocol all pref 100 u32 chain 0 fh 801::1 order 1 key ht 801 bkt 0 flowid ffff: not_in_hw
  match 00000000/00000000 at 12
        action order 1:  police 0x2 rate 102400Kbit burst 1250Kb mtu 40Kb action drop overhead 0b
        ref 1 bind 1

tc f sh dev ppp0 parent root

filter protocol all pref 50 u32 chain 0
filter protocol all pref 50 u32 chain 0 fh 800: ht divisor 1
filter protocol all pref 50 u32 chain 0 fh 800::1 order 1 key ht 800 bkt 0 flowid ffff: not_in_hw
  match XXXXXXXX/ffffff00 at 16
        action order 1: gact action pass
         random type none pass val 0
         index 3 ref 1 bind 1

filter protocol all pref 100 u32 chain 0
filter protocol all pref 100 u32 chain 0 fh 801: ht divisor 1
filter protocol all pref 100 u32 chain 0 fh 801::1 order 1 key ht 801 bkt 0 flowid ffff: not_in_hw
  match 00000000/00000000 at 12
        action order 1:  police 0x3 rate 102400Kbit burst 12500Kb mtu 40Kb action drop overhead 0b
        ref 1 bind 1

speedtest

   Speedtest by Ookla


    Latency:     0.50 ms   (0.04 ms jitter)
   Download:    96.39 Mbps (data used: 43.6 MB )
     Upload:    98.92 Mbps (data used: 161.8 MB )
Packet Loss:     0.0%

iperf3 в исключённой сети ~= 700/700 (гигабитный линк и ~= 300 МБит постоянного трафика)

alakiza avatar Apr 06 '22 11:04 alakiza

Hi. Looks great. Is it possible to add ipv6 support?

svlobanov avatar Apr 06 '22 11:04 svlobanov

Hi. Looks great. Is it possible to add ipv6 support?

Hi. I'll try later, because I need to build a test bench with ipv6.

alakiza avatar Apr 06 '22 11:04 alakiza

  1. Syntax changed Now you can write parameters in any order Now the syntax has become more similar to tc utility
  2. filter net6 added

alakiza avatar Apr 07 '22 23:04 alakiza