Linux 网络: netdevsim
文章目录
netdevsim
,Netwoking Device Simulator,网络设备模拟器。
netdevsim
就是用来模拟网络设备的,其实它是 Linux 里的一种网络设备驱动;可以用来测试一些网络功能,比如 tc
、tc-bpf
、XDP
。
netdevsim
ID
创建 netdevsim
设备:echo "[ID] [PORT_COUNT] [NUM_QUEUES]" > /sys/bus/netdevsim/new_device.
。不能通过 ip link add dev [NAME] type netdevsim
来创建。
销毁 netdevsim
设备:echo "[ID]" > /sys/bus/netdevsim/del_device
。不能通过 ip link del dev [NAME]
来销毁。
也就是,不同 ID 可用来创建互不干扰的 netdevsim
设备。
netdevsim
设备类型
netdevsim
设备的类型当然是 netdevsim
。
不过,在代码里,该怎么判断一个网络设备是 netdevsim
呢?
|
|
可以通过 readlink /sys/class/net/[DEV]
的方式来判断。
不过,在 netns 里就不一定有用了。
真实且稳定的判断方式:
|
|
就是判断设备的驱动是不是 netdevsim
就行了。
netdevsim
与 Go 单元测试
在 Go 的单元测试里使用 netdevsim
踩坑了。
其实踩坑的地方不在 netdevsim
,而是单元测试上。
我创建一个 netns 用来隔离不同单元测试实例,并且会 runtime.LockOSThread()
;然后在 netns 里创建 netdevsim
网络设备用来测试 tc
规则。
但却没认识到 t.Run()
会起一个新的 goroutine
,而不是当前 goroutine
;导致,t.Run()
的单测代码并没有跑在创建的 netns 里。
所以,使用 netns 时,需要避免使用 t.Run()
。
小结
在 Go 的单元测试里使用 netdevsim
时,需要注意以下几点:
- 不同的单元测试需要使用不同的
netdevsim
ID 来创建netdevsim
设备,以免互相干扰; - 使用
ethtool -i [DEV]
来判断一个网络设备是不是netdevsim
设备; - 使用 netns 来创建
netdevsim
设备时,需要避免使用t.Run()
。
文章作者 Leon Hwang
上次更新 2024-04-03