DPDK dpaa发包流程

本文详细介绍了DPDK在dpaaEthQueueTx接口中的工作原理,涉及nb_bufs和frames_to_send参数、indirect和extbuf特殊包处理,以及分片包的mbuf重组和fd格式转换,最后通过qman_enqueue_multi将数据包送入eqcr队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文以dpdk-github.qoriq-os-21.11-qoriq为例。

dpaa的发包最终调用的是dpaa_eth_queue_tx接口

1,图中nb_bufs是需要发送的包的个数,frames_to_send是一次能发的包的最大个数。

2,indirect应该是某种特殊包,暂未研究。

3,extbuf应该也是种特殊包处理,暂未研究。

4,对于分片包,因为一个分片包会分出两个mbuf(一个存放mac头+ip头大小的包,另一个存放分片包的数据),当时ls1043时,realloc_mbuf=1,所以会走rellocate_mbuf(会把两个mbuf合成一个mbuf).

5,当mbuf都转换为fd格式之后,通过qman_enqueue_multi进行入队操作,把数据包放到eqcr队列。

 

### 使用DPDK进行发包和接包操作 #### 发送数据包 为了通过DPDK发送数据包,通常会遵循一系列特定的操作流程。首先需要初始化环境抽象层(EAL),这是DPDK应用程序启动的基础[^3]。之后,设置必要的网络接口并分配内存池用于存储待发送的数据包。 ```c // 初始化EAL参数配置 int main(int argc, char **argv) { int ret; struct rte_mempool *mbuf_pool; // 初始化EAL ret = rte_eal_init(argc, argv); if (ret < 0) rte_exit(EXIT_FAILURE, "Error with EAL initialization\n"); mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NB_MBUF, MEMPOOL_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, SOCKET_ID_ANY); ... } ``` 接着构建mempool来容纳多个预分配的缓冲区对象,这些对象用来封装实际传输中的数据帧。当准备就绪后,可以调用`rte_eth_tx_burst()`函数批量提交一批已填充好的数据包给指定端口发出[^1]。 ```c static inline void send_packets(struct rte_mbuf **pkts, unsigned nb_pkts, uint8_t port_id){ uint16_t sent_num = rte_eth_tx_burst(port_id, QUEUE_IDX, pkts, nb_pkts); printf("Sent %d packets on port %u\n", sent_num, port_id); for(uint16_t i=sent_num;i<nb_pkts;++i){ rte_pktmbuf_free(pkts[i]); } } ``` #### 接收数据包 对于接收部分,则依赖于轮询模式下的输入队列读取机制而非中断触发方式。这意味着程序主动查询是否有新的到达报文等待处理而不是被动响应硬件事件通知。具体来说就是利用`rte_eth_rx_burst()`方法从选定的物理网卡获取一组或多组刚抵达的消息实例。 ```c struct rte_mbuf *rx_pkts[BURST_SIZE]; uint16_t num_rx = rte_eth_rx_burst(port_id, queue_idx, rx_pkts, BURST_SIZE); if(num_rx != 0){ process_received_packets(rx_pkts, num_rx); // 自定义处理逻辑 } for(i=0; i<num_rx; ++i){ rte_pktmbuf_free(rx_pkts[i]); // 处理完成后释放资源 } ``` 上述过程展示了基本框架下如何运用DPDK库完成高效的数据交换任务。值得注意的是,在真实应用场景里还需要考虑诸如错误检测、性能优化等因素以确保系统的稳定性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值