bestboyxie的专栏

我是个记忆力很差,但很有想法的孩子

DPDK中文-DPDK的reorder

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)


如果觉得好,请下面




阅读更多

扫码向博主提问

去开通我的Chat快问

bestboyxie

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • DPDK
  • Linux
  • Openwrt
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bestboyxie/article/details/53415192
文章标签: DPDK中文 dpdk reorder
个人分类: dpdk
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭