以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接口