DPDK的优点:
- 可以绑定到固定的core上运行;
- 舍弃内核中断,报文直接通过DMA传输到用户态处理;
- 单独的内存管理机制,效率高效;
用户态配置参数:
- NB_MBUF:rte_mempool中包含的rte_mbuf元素的个数;
- MBUF_SIZE:每个rte_mbuf元素的大小;
- 环形队列的元素个数;
内存池:
1 l2fwd_pktmbuf_pool = 2 rte_mempool_create("mbuf_pool", NB_MBUF, //rte_mempool包含的rte_mbuf元素的个数; 3 MBUF_SIZE, 32, //每个rte_mbuf元素的大小; 4 sizeof(struct rte_pktmbuf_pool_private), 5 rte_pktmbuf_pool_init, NULL, 6 rte_pktmbuf_init, NULL, 7 rte_socket_id(), 0);
环形队列:
- 环形无锁队列,存储mempool中的对象指针
- share_ring = rte_ring_create("TESTRING", 1048576, rte_socket_id(), rg_flags);
DPDK从队列摘包过程:
void *obj;
struct header_info *hdr;
struct rte_mbuf *m;
const char *p;
while(1){
ring_count = rte_ring_count(share_ring); // share_ring = rte_ring_create("TESTRING", 1048576, rte_socket_id(), rg_flags);
if(ring_count > 0){
rte_ring_mc_dequeue(share_ring,&obj);
hdr = (struct header_info *)obj;
m = (struct rte_mbuf *)hdr->buffer;
p = rte_pktmbuf_mtod(m, u_char *);
(*pkt_parse)(p, m->data_len);
rte_pktmbuf_free(m);
rte_mempool_mp_put(header_info_pool, hdr);
}