通过linux macvtap接口发送数据包

时间:2015-03-04 00:47:59

标签: linux sockets networking tunnel libvirt

Linux支持接口类型macvtap。我找不到很好的文档,但这是一个很好的入门者:http://virt.kernelnewbies.org/MacVTap

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

  1. 我正在使用常规open系统调用打开点按设备。
  2. 尝试使用write发送数据包,但收到Invalid argument (EINVAL)错误回复。
  3. 还尝试使用sendmsg,但当然会收到错误,我有一个纯文件描述符,而不是套接字。
  4. 可以这样做吗?或者macvtap接口只支持从tap接口读取并要求你使用原始套接字或其他东西来发送数据包?

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

    块引用

1 个答案:

答案 0 :(得分:2)

好的,我也碰到了这个。我读了内核源代码,结果发现macvlan有一个卸载工具用于tcp校验和卸载以及默认启用的各种其他功能,并且需要在数据包之前的缓冲区开头有一堆关于数据包的元数据。数据(不确定格式是否记录在案)。如果使用TUNSETIFF ioctl禁用IFF_VNET_HDR标志,它就像普通的点击设备一样工作。