DPDK中文-DPDK的reorder

来源:互联网 发布:无经验淘宝客服简历 编辑:程序博客网 时间:2024/06/10 16:32
dpdk reorder库是dpdk设计用来保证报文不乱序的;可能就是传说中的包保顺序
代码在lib/librte_reorder目录下

放进recorder bufer的报文会根据报文的sequence number来重新排序

常用在报文发送前的缓存;就是用来存放rte_mbuf的

示例代码在
examples\packet_ordering
主要API
1。创建reorder
struct rte_reorder_buffer * rte_reorder_create(const char *name, unsigned socket_id, unsigned int size)


参数1:名字,dpdk的数据结构都有名字方便查找;
参数2:cpu id ;默认0。如果是多CPU(这里多CPU指物理上的多CPU)
参数3:buffer的大小;
创建的时候自动回调用init;
如果查找之前已经创建好的,直接使用
struct rte_reorder_buffer *rte_reorder_find_existing(const char *name);

注意这个时候如果要初始化需要显示的调用:
void rte_reorder_reset(struct rte_reorder_buffer *buf)


2、插入数据
int rte_reorder_insert(struct rte_reorder_buffer *b, struct rte_mbuf *mbuf);

API清晰明了 0则是成功了;

3、一次性取出一些(类似于dequeue_burst)
unsigned int rte_reorder_drain(struct rte_reorder_buffer *b, struct rte_mbuf **mbufs,unsigned max_mbufs);

使用代码示例 代码在examples\packet_ordering 中
代码含义~~就是从reorder buf里面取出,mbuf的数组,然后发送
struct rte_mbuf *rombufs[MAX_PKTS_BURST] = {NULL};dret = rte_reorder_drain(args->buffer, rombufs, MAX_PKTS_BURST);for (i = 0; i < dret; i++) {struct rte_eth_dev_tx_buffer *outbuf;uint8_t outp1;outp1 = rombufs[i]->port;/* skip ports that are not enabled */if ((portmask & (1 << outp1)) == 0) {rte_pktmbuf_free(rombufs[i]);continue;}outbuf = tx_buffer[outp1];sent = rte_eth_tx_buffer(outp1, 0, outbuf, rombufs[i]);if (sent)


如果觉得好,请下面




2 0
原创粉丝点击