通过 linux macvtap 接口发送数据包
Sending packet through linux macvtap interface
Linux 支持接口类型,macvtap。我找不到关于它的优秀文档,但这是一个很好的开始:http://virt.kernelnewbies.org/MacVTap
我正在尝试使用它来创建一个新的虚拟网络设备,我可以通过编程方式读取和写入该设备以发送原始数据包。虽然我可以很好地从 tap 接口读取数据,但我想不出任何方法来写入它。
- 我正在使用常规
open
系统调用打开 tap 设备。
- 尝试使用
write
发送数据包,但收到 Invalid argument (EINVAL)
错误响应。
- 也尝试使用
sendmsg
但当然会得到一个错误,我有一个普通的文件描述符,而不是一个套接字。
这能做到吗?还是 macvtap 接口只支持从 tap 接口读取并要求您使用原始套接字或其他方式发送数据包?
(macvtap 的 Libvirt 代码在这里:https://gitorious.org/libvirt/libvirt/source/63889e0c775010d8d70b71d25340bab995aa83ce:src/util/virmacaddr.c)
块引用
好的,我 运行 也喜欢这个。我阅读了内核源代码,结果发现 macvlan 有一个用于 tcp 校验和卸载的卸载工具和默认情况下打开的各种其他东西,并且需要一堆关于缓冲区开头的数据包的元数据,在数据包之前数据(不确定格式是否记录在案)。如果您使用 TUNSETIFF ioctl 禁用 IFF_VNET_HDR 标志,它会像普通的 tap 设备一样工作。
Linux 支持接口类型,macvtap。我找不到关于它的优秀文档,但这是一个很好的开始:http://virt.kernelnewbies.org/MacVTap
我正在尝试使用它来创建一个新的虚拟网络设备,我可以通过编程方式读取和写入该设备以发送原始数据包。虽然我可以很好地从 tap 接口读取数据,但我想不出任何方法来写入它。
- 我正在使用常规
open
系统调用打开 tap 设备。 - 尝试使用
write
发送数据包,但收到Invalid argument (EINVAL)
错误响应。 - 也尝试使用
sendmsg
但当然会得到一个错误,我有一个普通的文件描述符,而不是一个套接字。
这能做到吗?还是 macvtap 接口只支持从 tap 接口读取并要求您使用原始套接字或其他方式发送数据包?
(macvtap 的 Libvirt 代码在这里:https://gitorious.org/libvirt/libvirt/source/63889e0c775010d8d70b71d25340bab995aa83ce:src/util/virmacaddr.c)
块引用
好的,我 运行 也喜欢这个。我阅读了内核源代码,结果发现 macvlan 有一个用于 tcp 校验和卸载的卸载工具和默认情况下打开的各种其他东西,并且需要一堆关于缓冲区开头的数据包的元数据,在数据包之前数据(不确定格式是否记录在案)。如果您使用 TUNSETIFF ioctl 禁用 IFF_VNET_HDR 标志,它会像普通的 tap 设备一样工作。