通过 linux macvtap 接口发送数据包

Sending packet through linux macvtap interface

Linux 支持接口类型,macvtap。我找不到关于它的优秀文档,但这是一个很好的开始:http://virt.kernelnewbies.org/MacVTap

我正在尝试使用它来创建一个新的虚拟网络设备,我可以通过编程方式读取和写入该设备以发送原始数据包。虽然我可以很好地从 tap 接口读取数据,但我想不出任何方法来写入它。

  1. 我正在使用常规 open 系统调用打开 tap 设备。
  2. 尝试使用 write 发送数据包,但收到 Invalid argument (EINVAL) 错误响应。
  3. 也尝试使用 sendmsg 但当然会得到一个错误,我有一个普通的文件描述符,而不是一个套接字。

这能做到吗?还是 macvtap 接口只支持从 tap 接口读取并要求您使用原始套接字或其他方式发送数据包?

(macvtap 的 Libvirt 代码在这里:https://gitorious.org/libvirt/libvirt/source/63889e0c775010d8d70b71d25340bab995aa83ce:src/util/virmacaddr.c

块引用

好的,我 运行 也喜欢这个。我阅读了内核源代码,结果发现 macvlan 有一个用于 tcp 校验和卸载的卸载工具和默认情况下打开的各种其他东西,并且需要一堆关于缓冲区开头的数据包的元数据,在数据包之前数据(不确定格式是否记录在案)。如果您使用 TUNSETIFF ioctl 禁用 IFF_VNET_HDR 标志,它会像普通的 tap 设备一样工作。