DPAA dqrr eqcr的逻辑分析

DPAA中收包队列是dqrr,发包队列是eqcr。

1.收包逻辑

示意如如下:

1,从dqrr队列中找到当前qm_dqrr_entry ,qm_dqrr_entry的fd指针指向qm_fd。

2,从qm_fd中获取到包的类型。

3,如果类型是qm_fd_sg,则说明mbuf包含多个分段。从qm_fd里面取到物理地址addr,转换为虚拟地址vaddr之后,得到qm_sg_entry数组。从qm_sg_entry里面取到物理地址addr,转换为虚拟地址sg_vaddr之后,就可以得到mbuf。多个分段之间用next指针连接。

4,如果类型不是qm_fd_sg,则说明只有之歌mbuf,直接从qm_fd里面取到物理地址addr,转换为虚拟地址ptr之后,就可以得到mbuf。

PS:

1,在分段时,第一个mbuf分配到的地址,用于存放了qm_sg_entry。

2,qm_sg_entry获取到虚拟地址之后,需要减去mbuf的大小才能获取mbuf。是因为给mbuf分配内存之后,前面填的mbuf结构,后面的就是数据部分,所以要获取到mbuf的地址,必须减去mbuf的大小。

2.发包逻辑

发包队列是eqcr。示意图如下:

 

1.先从eqcr队列中找到qm_eqcr_entry。

2,如果有多个分段包要发mbuf->nb_segs>1。则设置qm_fd的类型为QM_FD_SG。

3,分配一个temp_buf。在它的分配的内存之上填充qm_sg_entry,并把mbuf的物理地址buf_iova赋值给qm_sg_entry的addr。有多少mbuf,就需要多少个qm_sg_entry

4,如果只有一个mbuf需要发送,mbuf->nb_segs=1,则只需要把qm_fd的addr赋值为mbuf的物理地址buf_iova。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值