我的采集卡发数据,dpdk接收不到数据,使用华为交换机的流量监控排查发现是采集卡没能成功发出数据
如果使用纯PL端程序发数据,发现尽管我配的参数都是ok的,但是wireshark抓包还是抓不到程序
经分析表现的情况是:如果发送端的dest_ip和接收端local_ip不一致,就会出现发一点就立马停的情况,具体如下图所示

这个问题使用仿真也可以复现,只需要让udp模块的dst_ip故意设置的和udp_echo模块的local_ip不一致,模拟仿真就会出现这个问题
关键问题是:dst_ip和local_ip不一致才会导致发送问题,这和mac没关系,仅仅和ip有关系,这不符合常理
从udp发送的角度说,发送端应该根本不管接收端是谁,不管填ip地址是什么都能正常发出去才是,但是这里的问题是:发送方和接收方ip不一致就发不出去
所以要排查的话我肯定是怀疑是fpga程序里面的逻辑有问题,而且具体是和ip/arp有问题
arp这块我之前改过,一开始没有怀疑到是arp的问题,因为之前测试过没问题,但我测的都是ip和mac都是对得上的,没测ip对不上的情况
之前关于跳过arp这一块我改的是blob_fifo_transmit这个模块和udp_inst的顶层模块,当时感觉改OK了,但实际上在下面还有一个和arp相关的模块我没发现需要修改
然后这次发现问题后我排查了很久才定位到是这个底层ip模块的问题,然后修改了ip_64模块,这个模块是这个udp协议栈里面的一个模块
改完后仿真测试,即使ip对不上也能正常发出数据了
然后再改我之前的程序,上板测试,华为交换机看端口流量,能看到有jumbo了,然后再试dpdk,终于能接收到数据了
我拿到姚老师的udpdk dd程序后也做了些简单改动适配
这里说一下dpdk接收采集卡数据的程序的架构

分为两个进程
dpdk_recv是接收进程,也是相对于buffer_ring的生产者,利用udpdk接收到数据包后,利用姚老师给的api函数将数据写入环形缓冲区buffer_ring
dd_comsumer是消费进程,相对于buffer_ring的消费者,利用姚老师给的api函数将数据从环形缓冲区buffer_ring读出来
然后之后的工作就是根据需求修改dd_comsumer进程即可
关于参数配置这一块,我的设想是上位机侧有一个配置文件config.yml,这个文件会被dd_comsumer和我采集卡的linux程序共同使用(下发到采集卡linux),一次采集任务的话就是两个程序会共享同一套采集参数,具体就是包括 采样率等等(这些参数不包括在包头)
要先运行dpdk_recv程序,然后运行dd_comsumer程序
现在还是单生产者单消费者模型,采集卡发送数据,能看到
./dd_consumer -c config.yml
dd_cons
dd_init:133:pHeader: 0x7ff4df739000, pHeader->br: 0x7ff4df739040, pHeader->br.br_ring: 0x7ff4df7390c0, sample: 0x7ff4df8390c0
dd_init(): 0
dd_status:150:size: 131072, used: 60, tail: 60, head: 0, drop: 0
thread #0: get index: 0
first 4 channel sample data:
channel # 0: 0x 0
channel # 1: 0x1000
channel # 2: 0x2000
channel # 3: 0x3000
thread #0: get index: 1
first 4 channel sample data:
channel # 0: 0x 1
channel # 1: 0x1001
channel # 2: 0x2001
channel # 3: 0x3001
thread #0: get index: 2
first 4 channel sample data:
channel # 0: 0x 2
channel # 1: 0x1002
channel # 2: 0x2002
channel # 3: 0x3002
thread #0: get index: 3
first 4 channel sample data:
channel # 0: 0x 3
channel # 1: 0x1003
channel # 2: 0x2003
channel # 3: 0x3003
thread #0: get index: 4
first 4 channel sample data:
channel # 0: 0x 4
channel # 1: 0x1004
channel # 2: 0x2004
channel # 3: 0x3004
thread #0: get index: 5
first 4 channel sample data:
channel # 0: 0x 5
channel # 1: 0x1005
channel # 2: 0x2005
channel # 3: 0x3005
thread #0: get index: 6
first 4 channel sample data:
channel # 0: 0x 6
channel # 1: 0x1006
channel # 2: 0x2006
channel # 3: 0x3006
thread #0: get index: 7
first 4 channel sample data:
channel # 0: 0x 7
channel # 1: 0x1007
channel # 2: 0x2007
channel # 3: 0x3007
thread #0: get index: 8
first 4 channel sample data:
channel # 0: 0x 8
channel # 1: 0x1008
channel # 2: 0x2008
channel # 3: 0x3008
thread #0: get index: 9
first 4 channel sample data:
channel # 0: 0x 9
channel # 1: 0x1009
channel # 2: 0x2009
channel # 3: 0x3009
thread #0: get index: 10
first 4 channel sample data:
channel # 0: 0x a
channel # 1: 0x100a
channel # 2: 0x200a
channel # 3: 0x300a
本文章使用limfx的vscode插件快速发布