tcfilter不能与DRR一起使用

我正试图用DRR qdisc来控制两台虚拟机的stream量。

这是我想要的层次结构:

root | qdisc drr 1: / | \ / | \ class drr class drr class drr quantum 200 quantum 800 (w/ max quantum) 1:1 1:2 1:3 

VM1的stream量应该为1:1,VM2的stream量为1:2,其他都为1:3(因为DRR本身没有默认的类别)。 虚拟机的出站stream量被标记为1。 2.用iptables -L -v -n -t mangle我可以看到数据包正确标记。

我用下面的命令设置它:

 tc qdisc add dev wlan0 handle 1: root drr tc class add dev wlan0 parent 1: classid 1:1 drr quantum 200 tc class add dev wlan0 parent 1: classid 1:2 drr quantum 800 tc class add dev wlan0 parent 1: classid 1:3 drr #used as default class tc filter add dev wlan0 parent 1: protocol ip prio 1 handle 1 fw classid 1:1 tc filter add dev wlan0 parent 1: protocol ip prio 1 handle 2 fw classid 1:2 tc filter add dev wlan0 parent 1: protocol ip prio 2 u32 match ip dst 0.0.0.0/0 classid 1:3 #match everything 

但是使用这种configuration我根本无法访问networking。 几乎每个数据包都被root qdisc丢弃。

这些是从VM1发送83个数据包后的输出(所有数据都被正确标记)。

 #tc -s class show dev wlan0 class drr 1:1 root quantum 200b Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 deficit 0b class drr 1:2 root quantum 800b Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 deficit 0b class drr 1:3 root quantum 1514b Sent 118029 bytes 497 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 deficit 0b #tc -s qdisc show dev wlan0 qdisc drr 1: root refcnt 2 Sent 117057 bytes 493 pkt (dropped 3372, overlimits 0 requeues 0) backlog 0b 0p requeues 0 

正如你所看到的,没有数据包被定向到1:1,而从非VMstream量,只有一小部分被定向到1:3。

当HTB使用相同的过滤命令时,一切都按预期工作。 我在这里做错了什么?

由于DRR没有默认队列,因此必须将ARPstream量分配给特定的队列,否则这些数据包将丢失,从而导致您的机器忘记了其网关物理地址。