DPDK简单example的阅读——l2fwd

本文介绍了DPDK的l2fwd应用,这是一个简单的二层转发示例,用于演示如何在用户态快速转发数据包。主要内容包括解析命令行参数、创建内存池、设置转发端口、分配逻辑核、初始化端口、任务分发和线程循环。通过理解这个示例,读者可以更好地掌握DPDK的基本用法。
摘要由CSDN通过智能技术生成

从大四开始嚷嚷着要学DPDK,一直没有静下心来看源码,拖了两年到现在才开始钻研DPDK的简单应用。二层转发是DPDK数据报处理应用里一个比较简单的example,代码只有几百行,全部看懂也大约只要半天时间。

在计算机网络中,二层是链路层,是以太网所在的层,识别的是设备端口的MAC地址。DPDK作为用户态驱动,主要的目的也就是不需要让报文经过操作系统协议栈而能实现快速的转发功能。网卡驱动在二层上的作用就是根据设定的目的端口,转发报文到目的端口。

l2fwd的运行效果如下:
将两台机器用网线相连,一台用pktgen发送数据,一台用l2fwd转发数据,l2fwd的运行界面:

l2fwd运行界面.png

由于只开了一个端口转发,所以在l2fwd的默认规则下,就是单个port自己收自己发,发送的报文数量和接收的一样多。

程序的主要流程如下:

l2fwd主流程图.png
每个逻辑核在任务分发后会执行如下的循环,直到退出:

从线程循环.png

其中打印时间片在命令行参数中是可以自己设置的。

1.解析命令行参数

DPDK的命令行参数包括:EAL参数和程序自身的参数,之间用“–”隔开。比如说,运行l2fwd时,输入命令
./l2fwd -c 0x3 -n 4 -- -p 3 -q 1
其中-c和-n就是EAL参数,后面的-p和-q就是程序自带的参数
所以在代码中,解析命令行参数,也分了两步,先解析的是EAL参数

ret = rte_eal_init(argc, argv);
    if (ret < 0)
        rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n");
    argc -= ret;
    argv += ret;

rte_eal_init不仅有解析命令行参数的作用,以及一系列很复杂的环境的初始化,详见前一篇。当解析完了EAL的参数之后,argc减去EAL参数的个数同时argv后移这么多位,这样就能保证后面解析程序参数的时候跳过了前面的EAL参数。

ret = l2fwd_parse_args(argc, argv);
    if (ret < 0)
        rte_exit(EXIT_FAILURE, "Invalid L2FWD arguments\n");

(其实真正做到分割的原因是系统函数getopt以及getopt_long,这些处理命令行参数的函数,处理到“–”时就会停止,所以这一机制可以被用来做多段参数)

2.创建内存池

由于DPDK在使用前需要分配大页,所以实际创建内存池时就是从这些已分配的大页中创建。

l2fwd_pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", NB_MBUF,
        MEMPOOL_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE,
        rte_socket_id());

其中参数包括cache_size、priv_size、data_room_size,以及在哪个socket上分配。这里的socket不是网络中的套接字,而是numa架构的socket。
numa架构是多核技术发展的产物,在传统结构上,每个处理器都是通过系统总线访问内存,访存时间开销一致。而numa架构里,每个socket上有数个node,每个node又包括数个core。每个socket有自己的内存,每个socket里的处理器访问自己内存的速度最快,访问其他socket的内存则比较慢,如下图所示[1]。因此我们在创建缓冲区的时候就需要充分考虑到内存位置对性能的影响。

numa架构简单示意图.png

3.设置二层转发目的端口

对每个端口,先初始化设置他们的目的端口都是0,然后用一个for循环来让端口两两互为目的端口。例如:0号端口的目的端口是1,1号端口的目的端

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值