This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6670以太网发包出现No TX Free Descriptor的问题



大家好,

**************************************************************************************************************

我在做用C6670发送MAC层的以太网数据包。

环境是:C6670,为客户定制的板卡,C6670链接到以太网SWITCH再连接到背板,CCSv5.3,SYS/BIOSv6.33.06.50

**************************************************************************************************************

代码情况:工程基于C:\ti\pdk_C6670_1_1_2_6\packages\ti\drv\exampleProjects\PA_multicoreExample_exampleProject。Core0初始化QMSS、CPPI、以太网TX/RXQueue、以太网物理层配置等,给4个Core每个Core分配一个MAC地址,4个Core可同时收发以太网MAC层数据包。.text放在DDR3上。

**************************************************************************************************************

代码功能:4个Core同时响应一个1.5ms的GPIO脉冲信号,在中断处理函数中,对机箱内的主机发送一个MAC数据包(payload是100Bytes左右),在主机上用抓包软件分析数据包流量。

**************************************************************************************************************

遇到的问题是:4个Core同时按照1.5ms中断发送一个包,每秒每个Core发送667个包,每个包的payload为100Bytes。如果再提高payload或者增加每次中断发包个数,就会出现No TX Free Descriptor的问题。感觉C6670以太网发包发不过来了,请帮忙分析。

具体情况:

1. 如果把pyadload增加到600Bytes,也就是每个Core每隔1.5ms中断一次,对外发送一个600Bytes字节的MAC层数据包,此时会出现“No TX Free Descriptor“的问题。

2. 如果payload仍然是100Bytes,但每个Core每隔1.5ms中断一次,对外连续发送5个MAC层数据包,也会出现”No TX Free Descriptor“的问题。

3. 如果payload改成600Byes,每个Core每隔1.5ms中断一次,对外了连续发送5个MAC层数据包,此时哪怕只有Core0工作,也会出现”No TX Free Descriptor“的问题。

**************************************************************************************************************

而我想实现的是:C6670的4个Core,每个Core同时每隔1.5ms,对外连续发送5个payload为600Bytes的MAC层数据包。

**************************************************************************************************************

我揣测原因可能是是:

每次发包,都是从TX Free Queue从Pop出来一个Descriptor,填充Buffer Pointer,再Push到PA TX Queue(648)中去,从而完成一个发包。

按理说,每次这个Descriptor被Push完以后,应该Return回TX Free Queue中,这样的话,整个TX Free Queue就不会空。

但是,如果我增加发包强度(例如每隔1.5ms,连续发送5个包或者增加每次发包的payload字节数),这样的话Descriptor就没法及时地Return到TX Free Queue中,渐渐地TX Free Queue就空了,于是出现了“No TX Free Descriptor”的问题。

而且我每次从TX Free Queue中Pop出一个Descriptor之前,先用

do
{
    queue_pkt_num = Qmss_getQueueEntryCount(gTxFreeQHnd);
}while(queue_pkt_num == 0);

读取一个TX Free Queue中的Descriptor数,发现发包强度不大时(每隔1.5ms只发生一个100Bytes的包),Descpripor数量基本不变;但是如果增加发包强度(例如每隔1.5ms,连续发送5个包或者增加每次发包的payload字节数),则TX Free Queue中的Descriptor逐渐下降直至变空!!

但是,感觉我拟实现的目标(即每隔1.5ms,4个Core同时对外连续发送5个Payload为600Bytes的MAC层数据包)整个数据率才1000/1.5*4*5*600=7.6MBytes,对于千兆的以太网应该能够足以胜任的啊,可是为什么会出现这样的问题呢??

求TI专家指点一下!非常感谢。

  • "连续发送5个包或者增加每次发包的payload字节数"...看起来你的问题跟以太网子系统关系不大,倒可能是发包使用的描述符或者buffer的cache问题。

    请先确认:

    1. SGMII的协商速率和能力是GE全双工

    2. 发包使用的描述符和buffer是在LL2,MSMC还是DDR? 如果是MSMC或者DDR,是否使能cache?

    3.将你的发包函数用TSC进行profiling,找到效率最低的点。

  • 您好!

    我修改了cppi_qmss_mgmt.c中的如下代码

    if (cpswLpbkMode != CPSW_LOOPBACK_NONE)
    {
         /* Force the packet to specific EMAC port if loopback is enabled */
        Cppi_setPSFlags(Cppi_DescType_HOST, (Cppi_Desc *)pCppiDesc, psFlags);
    }
    else
    {
         Cppi_setPSFlags(Cppi_DescType_HOST, (Cppi_Desc *)pCppiDesc, 0);
    }

    Cppi_setPSFlags(Cppi_DescType_HOST, (Cppi_Desc *)pCppiDesc, 1);

    在我们板子上,Port1连接到以太网SWITCH,这样的话,就bypass ALE直接将包发送到Port1了,Port0什么都没接。

    然后,感觉发包性能极大地提升了!现在每隔1.5ms连续发送5个600Bytes的MAC层数据包,都不会出现Free Queue中Descriptor逐渐下降直至耗尽的问题了。

    虽然,感觉ALE应该不会这么降低发包性能的吧?

  • ALE对于包处理的latency当然有增加,但理论上应该不明显才对。从目前结果看来你单个包发送的效率实在太低,才导致ALE latency去掉后也能显式的看出来。

    注意,AE_BYPASS只指的接收方向,发送侧指定端口号叫做direct packet mode. 能否在你设置direct packet mode后,继续增大traffic,看看该极限值能到多少?估计你能计算到的throughput也很低。根本问题还是在你单个包的发送效率太低,还是需要用TSC来做profiling,找到效率低下的原因。