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 时,需要注意以下几点:
- 不同的单元测试需要使用不同的
netdevsimID 来创建netdevsim设备,以免互相干扰; - 使用
ethtool -i [DEV]来判断一个网络设备是不是netdevsim设备; - 使用 netns 来创建
netdevsim设备时,需要避免使用t.Run()。
文章作者 Leon Hwang
上次更新 2024-04-03