简介
mbuf是DPDK中报文缓冲区对应的结构,当然也可以用于其他类型(如控制数据、事件等),其设计充分考虑的灵活性和性能,基于mempool库实现,mbuf的头结构长度尽可能的小,目前是占用两个缓存行,且常用的字段位于第一个缓存行。
mbuf单数据段结构
- next为NULL,说明没有连接指向其他的mbuf
- headroom空间长度data_off一般为RTE_PKTMBUF_HEADROOM(128)字节,开始存放mbuf结构体(元数据:如port、长度等)
- rte_pktmbuf_mtod(m, struct rte_ether_hdr *)指向数据开始位置(即buf_addr+data_off),并做结构体类型强转
- rte_pktmbuf_pkt_len(m)返回整个报文长度
- rte_pktmbuf_data_len(m)返回数据段长度
- 只有一个数据段的情况下,尾部还有剩余空间,pkt_len等于data_len
mbuf多个数据段结构
- 用于巨型帧存储
- 元数据只存在第一个mbuf中
- 报文长度等于所有mbuf的数据长度之和
其他接口函数
- rte_pktmbuf_pool_create()初始化内存池,返回值作为rte_eth_rx_queue_setup()入参,用于网口队列报文接收
pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", nb_mbufs, MEMPOOL_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
- rte_pktmbuf_free(m); 释放mbuf内存到mempool中
- rte_pktmbuf_prepend()在数据前面增加长度
- rte_pktmbuf_append()在数据后面增加长度
- rte_pktmbuf_adj()在数据前面移除长度
- rte_pktmbuf_trim()在数据后面移除长度
- m->ol_flags |= (RTE_MBUF_F_TX_IPV4 | RTE_MBUF_F_TX_IP_CKSUM)发送报文时利用硬件重新生成IP校验和等卸载功能
- rte_mbuf_dyn*动态字段操作
- rte_pktmbuf_clone(),间接缓冲区,引用直接缓冲区,用于报文复制和分片场景