PLease告诉我的问题。我正在构建基于CentOS x86_64,Linux版本2.6.32-431.3.1.el6.x86_64的流量整形器。所以它有大约10个u32哈希表,全部有256个除数。在缺省表800中,我散列第3个八位字节并将分组指向这个表中的一个,然后将第4个八位字节和点分组散列到描述每个用户带宽限制的类。所以,对于每个IP地址都有一个相应的tc类。我们很容易塑造大约3000个IP地址。当我的脚本将这些IP添加到散列表中时,我得到一个错误:RTNETLINK的答案是:文件存在。更多代码在这里:Linux tc,u32过滤奇怪的错误
tc qdisc add dev $inet root handle 2: htb default 8000
tc class add dev $inet parent 2: classid 2:6000 htb rate 100mbit
#this hash-tables are for subnets
for i in {901..912}; do
tc filter add dev $inet parent 2: handle $i: protocol ip u32 divisor 256
done
#adding filters for packet classifying
tc filter add dev $inet protocol ip parent 2: u32 ht 800:: match ip src 172.16.16.0/20 hashkey mask 0x0000ff00 at 12 link 901:
tc filter add dev $inet protocol ip parent 2: u32 ht 901:11: match ip src 172.16.17.0/24 hashkey mask 0x000000ff at 12 link 902:
tc filter add dev $inet protocol ip parent 2: u32 ht 901:12: match ip src 172.16.18.0/24 hashkey mask 0x000000ff at 12 link 903:
#...
#and so on under "link 912:"
#creating classes for every host, place it under root class 2: (100mb for all)
for i in {1..2815}; do tc class add dev $inet parent 2:6000 classid 2:$i htb rate 1mbit ceil 6mbit; done
#place each host in corresponding u32 table
for i in {1..255}; do printf -v hi "%x" "$i";
tc filter add dev $inet protocol ip parent 2: u32 ht 902:$hi: match ip src 172.16.17.$i flowid 2:$i
done
for i in {256..511}; do let j="i-256"; printf -v hi "%x" "$j";
tc filter add dev $inet protocol ip parent 2: u32 ht 903:$hi: match ip src 172.16.18.$j flowid 2:$i
done
#....
#and so on under 2815 hosts
而且某处命令后结束
tc filter add dev eth0 protocol ip parent 2: u32 ht 909:dc: match ip src 172.16.24.220 flowid 2:2012
RTNETLINK answers: File exists
We have an error talking to the kernel
我解决不了这个问题,我认为有在Linux内核中的过滤器数量的限制,但有些人说我这不是真的,根本没有限制。没有flowid重用,并且没有哈希表处理超限。还有什么可以导致代码中的这个错误?