通过linux macvtap接口发送数据包

通过linux macvtap接口发送数据包,linux,sockets,networking,tunnel,libvirt,Linux,Sockets,Networking,Tunnel,Libvirt,Linux支持接口类型macvtap。我找不到关于它的优秀文档,但这是一个很好的开端: 我正试图用它来创建一个新的虚拟网络设备,我可以通过编程的方式读写它来发送原始数据包。虽然我可以很好地从tap界面读取数据,但我想不出任何写入方法 我正在使用常规的opensyscall打开tap设备 尝试使用write发送数据包,但收到无效参数(EINVAL)错误响应 还尝试使用sendmsg,但当然会得到一个错误,我有一个普通的文件描述符,而不是套接字 这能做到吗?或者macvtap接口是否只支持从tap接

Linux支持接口类型macvtap。我找不到关于它的优秀文档,但这是一个很好的开端:

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

  • 我正在使用常规的
    open
    syscall打开tap设备
  • 尝试使用
    write
    发送数据包,但收到
    无效参数(EINVAL)
    错误响应
  • 还尝试使用
    sendmsg
    ,但当然会得到一个错误,我有一个普通的文件描述符,而不是套接字
  • 这能做到吗?或者macvtap接口是否只支持从tap接口读取数据,并要求您使用原始套接字或其他方式发送数据包

    (此处是macvtap的Libvirt代码:)


    Blockquote

    好的,我也遇到了这个问题。我阅读了内核源代码,结果发现macvlan有一个卸载功能,用于tcp校验和卸载以及默认情况下启用的其他各种功能,并且在数据包数据之前(不确定是否记录了格式),需要在缓冲区的开头提供一组关于数据包的元数据。如果使用TUNSETIFF ioctl禁用IFF_VNET_HDR标志,则其工作原理与普通tap设备类似