总体流程如图所示,初始化时配置设备和队列,运行时通过rte_eth_tx_burst和rte_eth_rx_burst来收发包。
rte_pktmbuf_pool_create(pool_name, num, cache_size, priv_size, data_room_size, socket_id);
num是pool里block个数
cache_size是一些lcore的指针,指向本mempool里的buffer,注意每个lcore都会reserve这么多指针,其它buffer就没法访问这些block了。
priv_size是预留的内部空间,比如可以作为一些custom header的存储位置。
data_room_size是实际payload size + RTE_PKTMBUF_HEADROOM
socket_id可以是0,如果只有1个socket。也可以是任意的,比如SOCKET_ID_ANY,也就是-1。主要涉及到不同的NUMA,会用到不同的DMA。
有些驱动比如ice的一些驱动,不支持iova=va的模式,因为PMD需要大块的连续物理内存。
收包DMA会搬运到事先分配好的收包内存池。注意发包内存池不需要给驱动额外创建,rte_eth_tx_burst前的buffer已经分配好了。
rte_eth_dev_count_avail()
看有几个eth port,就是几个eth设备,包括所有PF和VF的数量。
rte_eth_dev_info_get(port, &dev_info);
看当前port支持哪些功能,比如最大的rx queue和tx queue数量。
rte_eth_dev_configure(port, n_rx_q, n_tx_q + n_free_tx_q, &port_conf)
配置port有几个tx和rx的队列。
rte_eth_dev_set_vlan_offload(port_id, vlan_offload)
先获得当前的VLAN offload配置。rte_eth_dev_get_vlan_offload(port_id),再配置vlan offload配置。rte_eth_dev_get_vlan_offload
rte_eth_dev_vlan_filter(port_id, vlan_id, 1)
给port_id和vlan_id配置offload,1表示使能,也就是允许让这些p