【问题标题】:low level requirements for ethernet frame in linuxlinux中以太网帧的低级要求
【发布时间】:2013-09-24 04:37:50
【问题描述】:

我正在为机器人应用开发一款高速、高分辨率的摄像机。由于各种原因,我需要采用千兆以太网 (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_PACKETs,linux 会接受这个数据包吗(假设应用程序可以告诉 linux 这个)?如果控制相机(向其发送数据包)和接收数据包中的图像数据的应用程序必须以 root 权限运行是可以接受的。

#2:哪个会更快:

A: linux sockets with AF_PACKET protocol
B: libpcap application

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

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

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

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

【问题讨论】:

    标签: linux packet ethernet libpcap winpcap


    【解决方案1】:

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

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

    希望这会有所帮助。

    【讨论】:

    • (实际上,它是“小于 1500”;1501 到 1535 范围内的值根本无效 - 我猜 1536 被选为第一个有效类型值,因为它是 0x0600,在一个整洁的十六进制上边界。)
    • “如果您想要 6K 或更多,接收以太网芯片/Linux 数据包处理程序有可能会丢弃您的帧,因为它们格式错误。”大概是指以太网规范说最大帧大小为1518字节,包括以太网头和FCS;正如您所注意到的,大多数以太网适配器可能会丢弃大于坏帧的帧,因此您必须为此应用程序启用适配器的“巨型帧”支持(并使用支持巨型帧的适配器)。跨度>
    • 为什么启用“巨型帧”会出现问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多