PRIO qdisc示例不起作用

我有一个带有OpenWrt 12.09(r36088,Linux 3.3.8)的TP-Link WR1043-ND。 有一个名为br-lan的网桥,连接eth0.1(为4个LAN端口标记VLAN)和wlan0(Wi-Fi)。 eth0.2还有WAN端口。 目前我想在LARTC中尝试一个例子来对网桥内部的SSH数据包进行分类,以使它们优先于其他stream量。 我的电脑直接连接到路由器,用于测量,而且在路由器端口之间没有其他东西。

这是我做任何事情之前的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 节 :

我们将创build这棵树:

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

乐队0 1 2批量stream量将达到30:,互动stream量达到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 

现在让我们看看我们创build了什么:

#tc -s qdisc ls dev eth0 qdisc sfq 30:量子1514b发送0字节0 pkts(丢弃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) 

这是我运行上面的命令后,运行tc qdisc显示的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 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)最终会以第二乐队(30 :)结束。 我已经确认数据包的TOS设置是通过在我的计算机上查看wireshark来正确设置的,而且TOS通过查看路由器内部的tcpdump输出使其进入路由器。 但是一切仍然以20:结束。

任何想法,为什么?

提前致谢。

检查prio调度程序( man tc-prio )的手册以查看TOS位如何与priomap关联。 TOS 0x08和TOS 0x10分别对应于priomap entrien#5和#9,它们在你的例子中被映射到band 1,对应于qdisc 20:

您应该更改priomap以将TOS-LowDelay数据包发送到带0