如果内核由于某种原因决定更改接口索引,则我们的用户空间代码缓存接口索引不会更新,并且它开始丢弃数据包,因为它们在用户空间中缓存的接口索引与内核中实际存在的接口索引不匹配。
我使用了if_indextoname(index,interfaceName)来解决这个问题。基本上内核知道哪个索引映射到正确的接口名称。
现在出现了我的要求:我需要测试我的代码。有没有办法可以模拟索引更改,以便我可以验证我的代码?我有一种直觉,因为索引是内核特有的东西,因此它只能通过调用(if_nametoindex()/ etc。)来访问,但我们无法改变它。那么如何验证我的变更集?
答案 0 :(得分:1)
sysctl无法按照您的建议行事。
udev负责命名接口,即使有一些命名方案,也没有什么可以改变索引。
如果您可以阅读代码,请点击此处:
http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20
答案 1 :(得分:0)
如果您可以强制取消注册netdev,它将在重新注册时选择一个新索引。例如,如果接口是RNDIS(通过USB),您只需断开并重新连接USB即可。要确保索引已更改,您可以在netdev探针中添加打印...