usbnet驱动程序和网络子系统

时间:2013-12-11 10:30:33

标签: c linux sockets networking

我正在研究一个“AVB”桥接项目。我们正在通过以太网进行音频 - 视频流传输。数据包流通过USB进行。它像USB-ETH(MAC)芯片,USB连接到主机端。我们正在使用“usbnet.c”驱动程序。我们有两个应用程序(用户空间进程):

1)提供同步的守护进程。

2)发送音频数据包的讲话者程序(1722)。

在usbnet中实现了一个名为.ndo_start_xmit的函数指针。我们已经使用这个函数指针注册了我们的函数,这样只要有一个数据包要从上层传输,就会调用我们实现的函数。当我们单独运行守护进程时,系统工作得非常好。 但是一旦我们并行开始讲话程序,对于来自守护进程的一些数据包,xmit函数就不会被调用。 频率从守护程序发送的数据包与守护程序发送的数据包相比要高得多。 因此,就像通过相同接口发送数据包的说话者程序一样,会影响守护进程的行为。但是,如何解决这个问题仍处于两难境地......

让我更清楚。

现在假设我有两个应用程序通过相同的接口传输数据包,例如eth6。根据感知知识,我们知道当有一个要传输的数据包时,会调用.ndo_start_xmit。但其中一个应用程序要求在125毫秒内将数据包准确地从MAC传输出去。 当我运行第一个应用程序时,让我们将其命名为“A”,数据包在每个计算的125毫秒时离开MAC。这个时间由应用程序本身控制。但是当我开始执行应用程序“B”时,“A”应用程序数据包不会每隔125毫秒从数据包中传输出来。因为应用程序B以8,000 /秒发送数据包而“A”发送@ 8 /秒。

我认为子系统中对来自套接字的所有数据包进行排队的软件队列堆叠了所有“A”应用程序数据包以及许多“B”应用程序数据包,然后连续调用ndo_start_xmit来堆积所有堆积“A”app包用于传输。 因此,我们无法每隔125毫秒从MAC传输数据包。

1 个答案:

答案 0 :(得分:0)

我认为您要找的是Linux Hardware Multiqueue API。