我目前使用的evmC6678官方评估板,目前在调试网络部分。目前只启用了一个核,通过配置PA,目前能收到指定目的MAC数据包。我的网络中存在STP协议数据包(组播包),我没有配置组播包的接收,正常来讲我不应该收到。后来我发现接收描述符越来越少,通过仿真器查看,我确实收到了STP协议数据包,并且ACCLIST监听不到收到STP协议数据包的描述符,这样就会导致我中断处理程序无法回收STP协议数据包的描述符,导致描述符越来越少。另外,我低速通信时收不到这种组播包,只有高速通信时才能收到。下图就是我收到的组播包。我的问题是我并没有对组播接收进行配置,为什么会收到?(STP协议包固定MAC地址为 01:80:C2:00:00:00)
Ryan BL:
你用的pa然后定制的自己的协议栈吗?
如果是ndk的话尝试找找有没有stp的配置,自己的协议栈的话,在接收到的ip层将不识别的ip protocol包对应描述符直接回收就好了呀。
当然可能pa会有配置异常的回收Q(我没太研究过官方pa固件,只是自己在考虑定制pa固件,然后简单看了看,),这样的话可能得你自己去检查对应的错误回收Q,或者使用Qmss的PDSP模块的累积功能自动监控之,而后自动/手动回收。
xin he2:
回复 Ryan BL:
感谢您的回答。我用的lwip协议栈,PA固件也是用的官方的。我现在的情况是这样的,举例如下:比如说描述符大小为64字节,有三个描述符,地址分别为0x0,0x40, 0x80。由ACC_LIST上报描述符,如果此时0x40描述符收到STP协议包,那么ACC_LIST中只会上报0x0和0x80这两个描述符,而不会上报0x40这个描述符,所以我在中断里面是获取不到这个描述符的,没法回收。我通过仿真器观察0x40那个描述符,发现描述符指向的缓冲区内容也是对的,和通过抓包软件获取的STP协议包一样。所以现在的问题是,我明明没有配置PA接收STP这种MAC地址的包,但是PA却收到了,而且在ACC_LIST中还获取不到这个描述符。我想知道,那个描述符哪里去了。我也是觉得应该可以配置一个错误回收queue,但是没找到,请问有相关资料吗?
Ryan BL:
回复 xin he2:
可有尝试使用IBL里面的pa固件?使用lwip估计你也没有用到校验自动生成等特性;
IBL的pa固件可以支持两个MAC的过滤,一般的配置是一个MAC地址和一个广播地址即可,使用组播的话就麻烦些了,可以考虑在ARP后禁用广播地址,这依赖于你的网络和通信模型是否允许。使用ti pa drv,你可以尝试研究下他的L1 LUT,pa drv会配置这块,当然是通过向对应的硬件队列push带配置信息的描述符做的,pa的固件里面的那块代码是PDSP汇编写的(需要从git.ti获取),有些难懂,而TI对应这块的资料又比较少,pa模块并未完全开放。
我对照了下我使用IBL里面的pa固件实现的一个简单udp,对应的初始化没有garabgeQ的配置,srio才有。
另外,你可以参考下pa的nimu网络测试例子,里面有比较详细的MAC过滤配置的示例,还有些组播支持的配置等,或许有用。
xin he2:
回复 Ryan BL:
感谢您的回复。我现在的PA就是配置的两个MAC地址,一个自身MAC,一个广播地址。你说的这个ARP之后禁用广播这种方式我尝试过,也没有解决。我还发现的问题就是当网络通信速度比较慢时,就不会收到STP协议包,只要速度稍微快点,就会收到这种包,我准备换最新的pdk里面的固件试试
Ryan BL:
回复 xin he2:
那看起来很有可能是L1 LUT的默认策略是允许STP包通过的。
你确定是描述符丢失了?就是按你描述的例子,00/40/80三个描述符,ACC累积了00和80并确定40不仅没有累积,在FDQ里面也木有?这就很奇怪了,为啥描述符会丢失呢。。。
我能想到的仅有一种可能,配置pa的时候会有个类似nfailRoute的东东,描述如果一个包匹配失败并且其策略为非丢失的情况下,会使用对应的flow-queue去接收。我隐约记得我使用IBL的pa固件测试时,网内也是有抓到STP包的,但是我并没有发现有受到STP的情况,看起来应该就是默认的pa在L1的策略允许了STP通过。
xin he2:
回复 Ryan BL:
我当时的调试方法是当接收描述符不连续时打断点,然后去内存观察累加器对应缓冲区中描述符地址值,发现那个0x40地址描述符确实没有。在free Queue中也确实没有那个描述符了。你说的那个nfailRoute我觉得很有道理,我想的也是存在这么一种机制,然后去那里回收。
请问你说的 FDQ 指的是 free Queue吗?我的邮箱是 hexin900110@163.com,如果方便的话可以邮箱交流。
Ryan BL:
回复 xin he2:
FDQ就是free descriptor Queue,
在pdk里面的ti/drv/pa/test/PAUnitTest/src/tests里面有,建议先研究研究这些测试是怎么做mac匹配的,如果要用drv里面的pa的话。
我截取的信息如下,这里只是一个默认的初始化配置:static paRouteInfo_tnfailRoute = {pa_DEST_DISCARD,/* Dest */0,/* Flow ID */0,/* queue */-1,/* Multi route */0,/* sw Info 0 */0,/* sw Info 1 */0,/* customType : not used*/0,/* customIndex: not used*/0,/* pkyType: for SRIO only */NULL};/* No commands*/
我已经在手机上找回了ti e2e密码,有疑问我会尽快回复的。
我的邮箱是ryan988&qq*com
xin he2:
回复 Ryan BL:
好的,我在研究研究代码,多谢了
Ryan BL:
回复 xin he2:
不客气。
个人建议,你要是不使用pa里面的高级特性,仅仅只做mac过滤的话,可以考虑下IBL里面的固件。
只是如果需要用组播的话,得在ARP后替换广播MAC为组播MAC,并且依赖外部对你进行ARP老化的时候不能以广播再次向你询问(这条我见过的系统倒都是满足),然后就是这样就只能运行一个外部ip对你进行链接了。
综合来看,专网这样做是值得的。有兴趣可以一起研究研究pa固件,^_^
xin he2:
回复 Ryan BL:
您好,我试了下nfailroute那个选项,描述符丢的时候并没有出现在那里,然后我从所有队列中(8192个)查找那个描述符,仍然没有找到,请问哪里可以找到PA固件的说明文档呢?