以l2fwd程序举例(igb为例)
1 收队列
1.1 收队列的建立
1,rte_eth_rx_queue_setup调用eth_igb_rx_queue_setup来创建队列,会根据需求创建同样数量的sw_ring 核rx_ring,如下图所示,dev->data->rx_queues[queue_idx]=rxq.

1.2 入队列
l2fwd使用rte_eth_tx_burst结构发送包,通过函数指针tx_pkt_burst,调用eth_igb_xmit_pkts发包,eth_igb_xmit_pkts的流程如下图

1.2.1 rte_pktmbuf_free_seg
rte_pktmbuf_free_seg用于把内存还给队列,会调用rte_mbuf_raw_free,rte_mbuf_raw_free调用rte_mempool_put,
rte_mempool_put调用rte_mempool_put_bulk,rte_mempool_put_bulk调用rte_mempool_generic_put,rte_mempool_generic_put调用__mempool_generic_put,
rte_mempool_generic_put的流程如下图

1.2.2 rte_mempool_ops_enqueue_bulk
rte_mempool_ops_enqueue_bulk通过函数指针enqueue从队列中出队列,enqueue对应多种方法,根据mp->ops_index来确定,本文主要分析common_ring_sc_dequeue,
common_ring_sc_dequeue调用rte_ring_sc_dequeue_bulk,rte_ring_sc_dequeue_bulk调用__rte_ring_do_dequeue。
1.3 出队列
l2fwd使用rte_eth_rx_burst接口收包,通过函数指针rx_pkt_burst,调用eth_igb_recv_pkts进行收包,eth_igb_recv_pkts的流程如图

1.3.1 rte_mbuf_raw_alloc
rte_mbuf_raw_alloc接口用于分配mbuf,主要是调用rte_mempool_get接口,rte_mempool_get接口再调用rte_mempool_get_bulk,rte_mempool_get_bulk再调用__mempool_generic_get接口

1.3.2 rte_mempool_ops_dequeue_bulk
rte_mempool_ops_dequeue_bulk通过函数指针dequeue从队列中出队列,dequeue对应多种方法,根据mp->ops_index来确定,本文主要分析common_ring_mc_dequeue
common_ring_mc_dequeue调用rte_ring_mc_dequeue_bulk,rte_ring_mc_dequeue_bulk调用__rte_ring_do_dequeue,队列的结构如下图

1.3.2.1 ring队列的创建
ring队列的创建是通过mempool_ops_alloc_once创建的,mempool_ops_alloc_once调用rte_mempool_ops_alloc,rte_mempool_ops_alloc根据ops_index,查找对应alloc接口,本文主要讲ring队列调用的是common_ring_alloc接口
文章详细介绍了l2fwd程序中igb设备的收发队列处理,包括rte_eth_rx_queue_setup用于建立收队列,rte_pktmbuf_free_seg释放内存,rte_mbuf_raw_alloc分配mbuf,以及ring队列的创建和操作。整个过程涉及到的数据结构和函数调用链路清晰呈现。
1436

被折叠的 条评论
为什么被折叠?



