Назад | Перейти на главную страницу

PRIO пример qdisc не работает

У меня TP-Link WR1043-ND с OpenWrt 12.09 (r36088, Linux 3.3.8). Существует мост под названием br-lan, соединяющий eth0.1 (маркированная VLAN для 4 портов LAN) и wlan0 (Wi-Fi). Также есть порт WAN на eth0.2. На данный момент я хочу попробовать пример в LARTC для классификации пакетов SSH внутри моста, чтобы они получали приоритет над другим трафиком. Мой компьютер подключен напрямую к маршрутизатору через br-lan для измерения, и между ними и ни в одном из портов маршрутизатора нет ничего другого.

Это моя настройка qdisc, прежде чем что-либо делать:

qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc mq 0: dev wlan0 root

Нет правил iptables, все сброшено и политика по умолчанию ACCEPT.

Вот соответствующий абзац LARTC, раздел 9.5.3.2:

Мы создадим это дерево:

     1:   root qdisc
    / | \ 
  /   |   \
  /   |   \
1:1  1:2  1:3    classes
 |    |    |
10:  20:  30:    qdiscs    qdiscs
sfq  tbf  sfq

band 0 1 2 Массовый трафик пойдет на 30 :, интерактивный трафик на 20: или 10 :.

Командные строки:

# tc qdisc add dev eth0 root handle 1: prio<br>
This *instantly* creates classes 1:1, 1:2, 1:3
# tc qdisc add dev eth0 parent 1:1 handle 10: sfq<br>
# tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000
# tc qdisc add dev eth0 parent 1:3 handle 30: sfq                                

Теперь посмотрим, что мы создали:

# tc -s qdisc ls dev eth0 qdisc sfq 30: Quantity 1514b Отправлено 0 байтов 0 пакетов (отброшено 0, превышено 0)

qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms 
Sent 0 bytes 0 pkts (dropped 0, overlimits 0) 

 qdisc sfq 10: quantum 1514b 
 Sent 132 bytes 2 pkts (dropped 0, overlimits 0) 

 qdisc prio 1: bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
 Sent 174 bytes 3 pkts (dropped 0, overlimits 0) 

Это моя настройка qdisc после выполнения приведенных выше команд, полученная при запуске tc qdisc show:

qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc prio 1: dev br-lan root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc sfq 10: dev br-lan parent 1:1 limit 127p quantum 1514b depth 127 divisor 1024
qdisc tbf 20: dev br-lan parent 1:2 rate 20000bit burst 1600b lat 560.0ms
qdisc sfq 30: dev br-lan parent 1:3 limit 127p quantum 1514b depth 127 divisor 1024
qdisc mq 0: dev wlan0 root

Пример вывода tc -s qdisc ls dev br-lan:

qdisc prio 1: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
 Sent 52544 bytes 528 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc sfq 10: parent 1:1 limit 127p quantum 1514b depth 127 divisor 1024
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc tbf 20: parent 1:2 rate 20000bit burst 1600b lat 560.0ms
 Sent 23492 bytes 206 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc sfq 30: parent 1:3 limit 127p quantum 1514b depth 127 divisor 1024
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0

Мои пакеты ssh неправильно классифицируются, и все отправляются на 20 :. То же самое с пакетами scp и всем остальным по сути.

Если я правильно понимаю, PRIO смотрит на поле TOS, чтобы узнать, в какой полосе установить пакет, и, согласно priomap, пакеты с TOS 0x10 (SSH) должны отправляться в полосу 0 (10 :), а они с TOS 0x08 (SCP) должен попасть в полосу 2 (30 :). Я подтвердил, что для пакетов правильно установлены TOS, посмотрев в wirehark на моем компьютере, а также что TOS попадает на маршрутизатор, просматривая вывод tcpdump внутри маршрутизатора. Но все равно все заканчивается в 20 :.

Есть идеи, почему?

Заранее спасибо.

Ознакомьтесь с руководством по эксплуатации prio планировщик (man tc-prio), чтобы увидеть, как биты TOS соотносятся с первичной картой. TOS 0x08 и TOS 0x10 соответствуют priomap entrien # 5 и # 9 соответственно, которые в вашем примере отображаются как на полосу 1, соответствующую qdisc 20:

Вы должны изменить priomap, чтобы пакеты TOS-LowDelay отправлялись на полосу 0