TC-u32 手册页指出 HANDLE 是:
HANDLE := { u12_hex_htid:[**u8_hex_hash:[u12_hex_nodeid]** | 0xu32_hex_value }
因此,由于它是一个 u8 值,因此存储桶的大小应在 0x00 到 0xff 之间。
问题是我无法创建大于 0x1f(五位)的存储桶。我收到:RTNETLINK 答案:无效参数我们在与内核通信时出错
/sbin/tc filter add dev ifb0 parent 1:0 protocol ip prio 5 u32 ht 5:2: match ip src 10.16.240.0/24 hashkey mask 0x000000ff at 12 link 100:
没问题
/sbin/tc filter add dev ifb0 parent 1:0 protocol ip prio 5 u32 ht 5:20: match ip src 10.16.240.0/24 hashkey mask 0x000000ff at 12 link 100:
产生错误。
环境:
iproute2 版本 4.3.0-1ubuntu3.16
Ubuntu 16.04.5 LTS
有什么提示吗?
閱讀
答案1
回答我自己的问题:我错误地理解了 bucket 必须大于我打算散列的过滤器数量,但事实并非如此。bucket 必须大于或等于(限制为 0xff)我打算在其上使用的最大散列值。
因此,由于我打算在存储桶内使用 26 个过滤器,因此我创建了一个“除数为 32”的存储桶。由于我对这个存储桶的 26 个哈希值随机取值范围从 0 到 255(最后一个 IP 地址八位字节),因此我溢出了,内核对此表示不满。
然后,我使用“除数 256”创建了一个存储桶,尽管事实上我只会使用其中的 26 个,但错误就消失了。
我希望这对将来的某人有所帮助
干杯
(顺便问一下:我该如何将其标记为“已解决”?