linux中以太网帧的低级别要求

linux中以太网帧的低级别要求,linux,packet,ethernet,libpcap,winpcap,Linux,Packet,Ethernet,Libpcap,Winpcap,我正在开发一种用于机器人应用的高速、高分辨率摄像机。出于各种原因,我需要采用千兆以太网(1Ge)或10Ge将我的相机连接到PC。要么这样,要么我需要开发我自己的PCIe卡,我不喜欢这样做(更多的工作,再加上我必须创建驱动程序) 在阅读了linux文档之后,我有两个不确定的问题 #1:我想要的以太网帧是: 8-byte interpacket pad + sync byte 6-byte MAC address (destination) 6-byte MAC address (source) 2

我正在开发一种用于机器人应用的高速、高分辨率摄像机。出于各种原因,我需要采用千兆以太网(1Ge)或10Ge将我的相机连接到PC。要么这样,要么我需要开发我自己的PCIe卡,我不喜欢这样做(更多的工作,再加上我必须创建驱动程序)

在阅读了linux文档之后,我有两个不确定的问题

#1:我想要的以太网帧是:

8-byte interpacket pad + sync byte
6-byte MAC address (destination)
6-byte MAC address (source)
2-byte packet length (varies 6KB to 9KB depending on lossless compression)
n-byte image data (number of bytes specified in previous 2-byte field)
4-byte CRC32
问题是,如果应用程序告诉linux需要AF_数据包(假设应用程序可以告诉linux),linux会接受这个数据包吗?如果控制相机(向相机发送数据包)并接收数据包中的图像数据的应用程序必须以root权限运行,则可以接受

#2:哪个更快:

A: linux sockets with AF_PACKET protocol
B: libpcap application
速度是至关重要的,因为数据包到达时,它们之间的空间很小,因为每个数据包都包含一行我自己的无损压缩格式的水平像素(除非我能找到一个更好的算法,也可以在FPGA中以实时速度实现)。帧之间将有一个暂停,但这是在1200或更多水平行(以太网帧数据包)之后

由于应用程序是机器人技术,每个水平行将立即解压缩并存储在一个简单的RGBA像素压缩数组中,就像OpenGL接受的纹理一样。因此,机器人软件可以在图像一行一行地到达时立即检查每个图像,并可能以不人道的方式尽可能快地做出反应

每行中第一个RGBA像素的数据紧跟在前一行中最后一个RGBA像素的后面,因此在最后一个水平像素行的末尾,图像是完整的,可以传输到GPU和/或保存到磁盘。每个水平行将是16像素的倍数,因此不需要“填充”


注:摄像机必须直接插入RJ45插孔,摄像机和PC之间无需路由器或其他设备。

我认为您必须更改以太网帧格式,以使用源和目标MAC后的前两个字节作为类型,而不是长度。旧式长度必须小于1536,任何较大的长度都将被视为IEEE类型字段。当您需要6K或更多时,接收以太网芯片/Linux数据包处理程序可能会丢弃您的帧,因为它们的格式不正确

至于表现,黄金法则是衡量,不要猜测。选择一个最简单的程序并尝试


希望这有帮助。

(实际上,它“小于1500”;1501到1535范围内的值根本无效-我猜1536被选为第一个有效类型值,因为它是0x0600,位于整洁的十六进制边界上。)“当您需要6K或更多时,接收以太网芯片/Linux数据包处理程序可能会丢弃您的帧,因为它们的格式不正确。“大概是指以太网规范中规定的最大帧大小为1518字节,包括以太网报头和FCS;正如您所注意到的,大多数以太网适配器可能会将大于该值的帧作为坏帧丢弃,因此您必须为此应用程序启用适配器的“巨型帧”支持(并使用支持巨型帧的适配器)。为什么启用“巨型帧”会有问题?