【发布时间】:2014-01-30 10:42:38
【问题描述】:
请在问题中告诉我。我正在基于 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 答案:文件存在。更多代码在这里:
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,也没有发生哈希表句柄超限。还有什么可能导致代码中出现此错误?
【问题讨论】:
标签: linux