入口函数:
int rte_eal_init(int argc, char **argv)
内存池函数:
rte_pktmbuf_pool_create() 它是函数 rte_mempool_create 的一个封装(rte_mbuf*)。
struct rte_mempool *
rte_pktmbuf_pool_create(const char *name, unsigned n,
unsigned cache_size, uint16_t priv_size, uint16_t data_room_size,
int socket_id)
name是内存池名字。为了获得更好的性能,n应该为2的幂减1 。
注意flag,默认为0,ring_mp_mc
rte_pktmbuf_free() //rte_mbuf_raw_free的封装
rte_pktmbuf_alloc()
rte_pktmbuf_reset()
rte_mempool_avail_count()
rte_mbuf_raw_alloc()
rte_mbuf_raw_free()
rte_mempool_create() //内存池创建
rte_mempool_lookup() //内存池查找 key==name
rte_mempool_get() //pop内存
rte_mempool_put() //push内存
内存函数
rte_malloc()
rte_zmalloc()
rte_calloc()
rte_realloc()
rte_xxx_socket() //指定numa
rte_free()
rte_memcpy()
网卡操作函数:
rte_eth_dev_configure() 设置网卡设备。在其他操作之前,先调用这个函数进行设置。
rte_eth_rx_queue_setup() 申请并设置一个收包队列。
关键参数: struct rte_mempool *mp; 由前文创建的pool
rte_eth_tx_queue_setup() 申请并设置一个发包队列。
rte_eth_dev_start() 就是设置好了之后就启动啊,该收的收,该发的发。
rte_eth_promiscuous_enable() 启动混杂模式,不解释。
收发包函数:
rte_eth_rx_burst() 收一大批包。该接口不提供任何错误检测功能,上层应用可以在返回包数为零时,去主动检测link状态来完成接口异常及错误检测机制。
关键参数:
struct rte_mbuf** rx_pkts; 一个指针数组,数组中的每一个指针指向收取到的一个包,具体的包结构查看下文的数据结构章节。指针所指向的内存空间为queue_setup(mpool) 函数中的参数pool提供。
const uint16_t nb_pkts; 简单来说,就是数组大小。
返回值:
收到的报数,数组中被填充的item个数。
当返回值== nb_pkts时,隐含说明,收包性能已经跟不上了。
当返回值== 0 时,应该启动异常检测,查看接口状态等。
rte_eth_tx_burst() 发一大批包
rte_pktmbuf_free() 收到了但是没有被发出去的包,应该将其free,即还给mpool。
rte_eth_add_rx_callback() //设置收包回调
rte_eth_add_tx_callback() //设置发包回调
rte_eth_tx_buffer_set_err_callback() //设置发包error回调
队列操作函数
rte_ring_create() 创建队列,注意flag,默认0,多线程安全。
RING_F_SC_DEQ | RING_F_SP_ENQ
RING_F_MP_RTS_ENQ| RING_F_MC_RTS_DEQ
RING_F_MP_HTS_ENQ| RING_F_MC_HTS_DEQ
rte_ring_lookup() 根据name查找队列
rte_ring_dequeue() 出队列
rte_ring_enqueue() 入队列
rte_ring_count() 队列数量
rte_ring_full() 队列满
rte_ring_empty() 队列空
KNI操作函数
待补充,还没看呢~~~
其他函数:
rte_eth_dev_count():
返回可以被dpdk使用的网口个数。即(加载了UIO驱动,或VFIO ??) rte_eal_init 之后就可以用了。
rte_lcore_id(): 返回逻辑核ID
rte_lcore_count()
rte_get_main_lcore()
rte_lcore_to_cpu_id()
rte_socket_id(): 返回CPU sock 的ID,即命令参数中指定的lcore所属的CPU numa。
rte_socket_count()
rte_lcore_to_socket_id()
rte_eal_remote_launch() 用于在多个核上启动多线程,原例子中用法如下: RTE_LCORE_FOREACH_SLAVE(lcore_id) {
rte_eal_remote_launch(lcore_hello, NULL, lcore_id);
}
lcore_id = rte_lcore_id();
rte_eal_mp_remote_launch()用于在多个核上启动多线程,原例子中用法如下:
/* launch per-lcore init on every lcore */
rte_eal_mp_remote_launch(l2fwd_launch_one_lcore, NULL, CALL_MAIN);
RTE_LCORE_FOREACH_WORKER(lcore_id) {
if (rte_eal_wait_lcore(lcore_id) < 0) {
ret = -1;
break;
}
}
rte_eal_wait_lcore() //对应rte_eal_remote_launch()
rte_eal_mp_wait_lcore() //对应rte_eal_mp_remote_launch()