目前,发送和接收数据包大小由宏
定义#define PKT_BUF_SZ (VLAN_ETH_FRAME_LEN + NET_IP_ALIGN + 4)
因此PKT_BUF_SZ大约为1524字节。因此,我所拥有的NIC可以处理来自网络的输入数据包< = 1524.任何大于此的数据都会导致系统崩溃或更严重的重启。使用Linux内核2.6.32和RHEL 6.0,以及自定义FPGA NIC。
有没有办法通过从NIC获取传入数据包的大小来动态更改PKY_BUF_SZ?它会增加开销吗?硬件是否应该在数据包到达驱动程序之前丢弃它?
非常感谢任何帮助/建议。
答案 0 :(得分:1)
这不是可以在不知道特定控制器的情况下回答的问题。它们在细节上的工作方式各不相
例如,某些broadcom NIC具有不同大小的缓冲池,控制器将根据帧大小从中选择适当的缓冲池。例如,一个小(256)字节缓冲池,一个标准大小(1536左右)缓冲池和一个巨型缓冲池。
一些英特尔NIC已经允许一个固定大小的缓冲区列表以及最大帧大小,然后它将根据需要拉出尽可能多的连续缓冲区(不确定linux是否曾支持过这种用途 - 它要复杂得多)供软件处理)。
但是大多数NIC使用的最常见的模型(事实上,我相信所有商业都可以使用这种方式):他们希望整个框架适合单个缓冲区,并且您的单个缓冲区大小需要容纳您将收到的最大帧。
鉴于您的NIC是自定义FPGA,只有其设计人员可以就您提出的具体问题向您提供建议。如果linux在较大的数据包通过时崩溃,那么很可能你分配的缓冲区大小不像你告诉它那么大(导致溢出),或者NIC有一个错误,导致它写入一些其他记忆区。