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

标签 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-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_PACKET(假设应用程序可以告诉 linux),那么 linux 会接受这个数据包吗?如果控制相机(向其发送数据包)并接收数据包中的图像数据的应用程序必须以 root 权限运行,这是可以接受的。

#2:哪个会更快:

A: linux sockets with AF_PACKET protocol
B: libpcap application

速度至关重要,因为数据包到达时之间的空间很小,因为每个数据包都包含采用我自己的无损压缩格式的水平行像素(除非我能找到一种更好的算法,也可以在 FPGA 中以实时速度实现)。帧之间会有暂停,但那是在 1200 或更多水平行(以太网帧数据包)之后。

因为应用程序是机器人技术,所以每个水平行将立即解压缩并存储在简单的 RGBA 像素打包数组中,就像 OpenGL 接受纹理一样。因此,机器人软件可以在图像逐行到达时立即检查每个图像,并可能以超人的速度使用react。

每行中第一个 RGBA 像素的数据紧随前一行中最后一个 RGBA 像素的数据,因此在最后一个水平行像素的末尾,图像已完成并准备好传输到 GPU 和/或保存到磁盘。每个水平行都是 16 像素的倍数,因此不需要“填充”。

注意:摄像机必须直接插入 RJ45 插孔,摄像机和 PC 之间不能通过路由器或其他设备。

最佳答案

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

对于性能,黄金法则是衡量,不要猜测。选择最容易编程的一个并尝试。

希望这有帮助。

关于linux - Linux 中以太网帧的低级别要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18973041/

相关文章:

java - System.currentTimeMillis 是否总是返回一个值 >= 以前的调用?

java - 如何从 shell 脚本顺序运行 jar 文件

python - 如何创建一个日志文件来记录 python 中的每个步骤?

c - 是否可以使用 for 循环索引访问结构元素?

android - 在 Android 设备上使用 800/900Mhz 频率

c++ - OpenCV:如何从以太网摄像头捕获帧

arduino - 如何让 2 个 Arduinos 通过以太网通信变量?

c# - 单声道 HTTPS 错误 - "Error Writing Headers"

java - HTTP代理可以修改TCP Java字节流吗?

linux - 为了编写PCI以太网驱动程序。如何在PCI以太网驱动程序中实现MMAP