• 【dpdk】使用libpcap-PMD驱动收发包


    ref: Dpdk programmer’s guide

    1.  概述

        dpdk不仅提供针对物理和虚拟网卡的pmd驱动(Poll Mode Drivers),还提供两个纯软件的pmd驱动,libpcap pmd就是其中之一。Libpcap pmd使用libpcap库读写报文,读写的源可以是文件,也可以是使用Linux内核驱动的物理网卡。

        在没有或不方便配置物理网卡的机器上,使用libpcap pmd可以帮助dpdk应用开发人员进行功能性测试或代码调试;更重要的是,EAL(Environment Abstart Layer)之上的dpdk应用程序对于其底层用的是真实网卡pmd,还是libpcap pmd,是透明的,开发人员无需修改代码就可以使用libpcap pmd带来的便利。

    2.  编译与配置

    2.1  编译

    Dpdk默认的配置文件里没有打开libpcap pmd支持。如果是Linux下编译,需要修改<dpdk>/config/common_linuxapp,将其中的

    CONFIG_RTE_LIBRTE_PMD_AF_PACKET=n

    改为

    CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y

    另外,还需要安装libpcap开发包,在ubuntu上安装的命令是

    sudo apt-get install libpcap-dev

    然后重新编译dpdk即可。

    2.2  使用

    所有dpdk应用程序都运行在EAL之上,而EAL提供了—vdev选项,可能通过它来指定使用libpcap pmd。格式如下:

    app -c f -n 4 --vdev='eth_pcap0,stream_opt0=..,stream_opt1=..' --vdev='eth_pcap1,stream_opt0=..'

    可以配置多个伪设备(pseudo-ethernet device),每个设备的名称必须以eth_pcap开头,然后跟数字或字母。每个设备都可以配置多个流选项(stream options),流选项之前使用逗号隔开,不能有空格符。

    2.2.1  流选项

    流选项包括:

    •   rx_pcap 将一个pcap文件设为Rx流,参数为pcap文件路径。Libpcap pmd驱动会读取文件中的每个包,就好像从实际网口读一样。这个pcap文件必须存在且有效。如 rx_pcap=/home/dev/test.pcap
    •   tx_pcap 将一个pcap文件设为Tx流。此文件将会自动创建和重写。
    •   rx_iface 将一个使用Linux内核驱动的物理网口设为Rx流。如rx_iface=eth0
    •   tx_iface 将一个使用Linux内核驱动的物理网口设为Tx流。
    •   iface 映射一个物理网口,libpcap pmd驱动将从此口读写报文。如 iface=eth0

    由上可见,libpcap pmd不仅支持将pcap文件模拟为Rx/Tx的功能,也支持Linux驱动的普通网卡。在使用中我们可以随意组合,比如Rx设为eth0,而Tx设为tx.pcap,或者两者都是eth0或pcap文件。

    2.2.2  命令举例

    Testpmd:

    ./testpmd -c 3 -n 4 --vdev='eth_pcap0,rx_pcap=/home/zzq/tcp.pcap,tx_pcap=/home/zzq/tx0.pcap' --vdev='eth_pcap1,rx_pcap=/home/zzq/tcp.pcap,tx_pcap=/home/zzq/tx1.pcap' -- --port-topology=chained --no-flush-rx -i --nb-ports=2

    据之前的官方文档中说,testpmd在开始报文转发前会从每个Rx口收512个报文并丢弃,而使用libpcap pmd时,可以通过—no-flush-rx选项来禁用这个特性。另外,据我试用,--nb-ports=2将port数设为2,否则多个port之间会有影响,不利于测试。

    运行后,eth_pcap1的Tx对应文件将保存eth_pcap0的Rx对应文件中的报文,eth_pcap0的Tx对应文件将保存eth_pcap1的Rx对应文件中的报文。Rx对应的文件都只会读取一轮。

    L2fwd:

    ./l2fwd -c 3 -n 4 --vdev='eth_pcap0,rx_pcap=/home/zzq/tcp.pcap,tx_pcap=/home/zzq/tx0.pcap' --vdev='eth_pcap1,rx_pcap=/home/zzq/tcp.pcap,tx_pcap=/home/zzq/tx1.pcap' -- -p 3 

     再强调一下:--vdev的值字符串,即单引号括起来的内容中,不能有空格,否则会出错。

  • 相关阅读:
    [Android开发]cocos2dx工程中接入支付宝sdk
    cocos2dx android SDK接入总结
    Cocos2d-vs避免过长编译的小技巧
    math.h里的数学计算公式介绍
    Cocos Code IDE入门指南
    kbengine引擎的安装
    游戏服务端pomelo完整安装配置过程
    cocos2d-x 两个场景间进行传参数
    cocos2d-x 设置全局可变变量
    如何将cocos2d-x项目打包成一个.exe
  • 原文地址:https://www.cnblogs.com/zzqcn/p/4902373.html
Copyright © 2020-2023  润新知