可以在Linux NIC驱动程序上动态更改Rx / Tx数据包缓冲区大小吗?

时间:2016-03-02 06:53:36

标签: linux-kernel network-programming linux-device-driver

目前,发送和接收数据包大小由宏

定义
#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?它会增加开销吗?硬件是否应该在数据包到达驱动程序之前丢弃它?

非常感谢任何帮助/建议。

1 个答案:

答案 0 :(得分:1)

这不是可以在不知道特定控制器的情况下回答的问题。它们在细节上的工作方式各不相

例如,某些broadcom NIC具有不同大小的缓冲池,控制器将根据帧大小从中选择适当的缓冲池。例如,一个小(256)字节缓冲池,一个标准大小(1536左右)缓冲池和一个巨型缓冲池。

一些英特尔NIC已经允许一个固定大小的缓冲区列表以及最大帧大小,然后它将根据需要拉出尽可能多的连续缓冲区(不确定linux是否曾支持过这种用途 - 它要复杂得多)供软件处理)。

但是大多数NIC使用的最常见的模型(事实上,我相信所有商业都可以使用这种方式):他们希望整个框架适合单个缓冲区,并且您的单个缓冲区大小需要容纳您将收到的最大帧。

鉴于您的NIC是自定义FPGA,只有其设计人员可以就您提出的具体问题向您提供建议。如果linux在较大的数据包通过时崩溃,那么很可能你分配的缓冲区大小不像你告诉它那么大(导致溢出),或者NIC有一个错误,导致它写入一些其他记忆区。