Dpdk distrabutor

1.创建分流器distrabutor

首先要检测系统的核数,核数至少需要2个才可以运行,建议核数大于等于3个,可以在分配worker时达到较好的效果。

接下来就创建分流器了

static struct rte_distributor *d;

d =rte_distributor_create("Test_distributor", rte_socket_id(),

                      rte_lcore_count()- 1);

如果d返回null,创建失败,记得要删除分流器哦。

rte_distributor_flush(d);

     rte_distributor_clear_returns(d);

2.分配内存池

static struct rte_mempool *p;

p =rte_mempool_create("DT_MBUF_POOL", nb_bufs,

                      MBUF_SIZE,BURST,

                      sizeof(structrte_pktmbuf_pool_private),

                      rte_pktmbuf_pool_init,NULL,

                      rte_pktmbuf_init,NULL,

                       rte_socket_id(),0);

为分流器分配内存池,内存池的大小固定。大小为MBUF_SIZE*nb_bufs

3.为worker指定工作函数

rte_eal_mp_remote_launch(handle_work,d, SKIP_MASTER);

其中handle_work为worker的工作函数

使用rte_distributor_get_pkt从内存池中获取包,此时可以根据包的app_id在handle_work中调用对应的函数来处理不同app_id的包

4.处理在mempool中的包

struct rte_mbuf *bufs[BURST];

首先使用rte_mempool_get_bulk函数从mempool中获取包的句柄。

      接下来修改包的hash值,方便分流器将hash值相同的包送到同一个worker去处理。

      同时判断包的app类型,给packet打上mark,方便后续处理。

      标记包的hash值后,使用

rte_distributor_process(d, bufs, BURST);

              rte_distributor_flush(d);

              这两个函数将包分配到指定的worker去处理。

预想中的大致流程图如下:

每个worker取包后,根据包的app_id,调用对应的函数处理 。

Dpdk distrabutor