精华内容
下载资源
问答
  • DPDK

    2017-10-18 19:03:20
    DPDK

    环境

    1. Ubuntu-16.04 LTS
    2. dpdk-16.11.3.tar.xz (LTS), from DPDK
    3. pktgen-3.4.2.tar

    安装DPDK和Pktgen

    1. tar -xf *.tar to extract the files

    2. Set the environment variable:

      export RTE_SDK=” (dpdk files directory, 参阅其他安装说明)
      export RTE_TARGET=” (the setting of the installation)
      edit the ~/.profile, reboot and make it enable(永久生效)

    3. Install the DPDK

      run the ./tools/dpdk-setup.sh
      then, step 1-4:

      1. install the DPDK environment(‘x86_64-native-linuxapp-gcc’)
      2. setup linuxapp environment(drivers, e.g. IGB UIO; hugepage bind the network devices )
      3. test
      4. Install the pktgen
    4. Download Pktgen and Install
      直接通过github指示或者官网下载pktgen解压安装即可,该过程中可能存在的问题:
      First, use ‘sudo apt-get install libpcap-dev’ to install pcap library( the pktgen used).
      Second, use the tools/setup.sh to test if the environment is OK
      Finally, make the pktgen

    测试环境

    可以使用DPDK自带的一些examples来测试,这些examples的使用方法直接参考DPDK文档即可.

    1. l2fwd
      Iocation: dpdk-…/examples/l2fwd/build/ (Before using, please ‘make’)
      ./l2fwd -c 0xf -n 3 – -p 0x3 -q 1
      前面的参数称为EAL,属于DPDK通用初始化参数(参看help,编程时通过rte_eal_init(argc, argv)直接完成)
      -c 0xf 运行的十六机制掩码核心数。在这里指分配4个core
      -n 3 每个处理器的内存通道数
      – 表示之后的为次参数(每个程序可以进行自定义,使用Linux的getopt_long()进行自定义处理);
      -p 0x3 设置起点的端口数对应掩码,0x3=0b11,即起点两个端口
      -q 确定每个core的队列的数量,表示每个逻辑核心有一个队列

    2. pktgen
      location: pktgen home directory ( Before using, ‘make’)
      ./app/build/pktgen -c e -n 3 –proc-type auto –file-prefix pg – -p 0x14 -P -m “2.0, 3.1” -f test/set_seq.cmd
      Similar to the l2fwd, for more information, look at the help
      [查看文档时通过 Shift+PgDn/PgUp 上下翻页].

    3. 程序运行中的其他事情
      If the warning is the hugepage, try:
      3.1 原程序前加sudo -E
      3.2 尝试运行下面命令后再运行程序(delete the too many pages)

      sudo rm -rf /dev/hugepages/*


    Pktgen Usage

    Start Usage

    sudo -E ./app/build/pktgen [EAL options] – [-h] [-P] [-G] [-T] [-f cmd_file] [-l log_file] [-s P:PCAP_file] [-m ]

    使用-f cmd_file进行定制化配置(配置在文件里,也可以在启动后pcktgen的命令行里进行相关设置操作–设置报文的内容,速率,存储等)
    TODO:
    [ ] 尝试使用-f 的方法进行配置并总结, 搭配出自定义的网络测试环境(在不同的报文构成下, size,burst等; 速率和丢包率–pktgen保存对应结果)

    启动后的命令行操作

    可以使用的命令:
    help, ls (-l)… 各种命令的使用说明参看4
    切换页面page < page name >

    cpu:查看CPU
    log: 查看log
    main: 主页
    range: 查看range的相关设置

    命令举例如下为:
    str/stp: 全部端口开始/停止发包;
    start/stop port-number: 开始/停止某些端口的发包
    clr: 全部清零;
    clear port-number: 清除某个端口的相关统计信息

    set < port list > < type > value: 把端口列表进行配置
    比较重要的一些配置方案有
    1. set 0 count 10 //0端口发送10个报文就结束
    2. set all size 100 //所有端口发送的报文内容大小为100
    3. set 0,1 rate 70 //端口0,1的速率设置为70%
    4. set 1 burst 100 // 1端口的burst为100
    5. set 1 dump 100 // 记录之后收到的100个报文到?log?(还没搞清楚)
    注意使用range 设置相关随机设置前,需要使用enable < portlist > range操作打开相关选项
    注意set,range,sequence的使用,可以配置速率,IP,MAC等信息
    参考文档: https://media.readthedocs.org/pdf/pktgen-dpdk/latest/pktgen-dpdk.pdf

    使用DPDK做自定义开发

    Environment

    为了方便查看函数调用,使用Eclipse CDT进行编辑, 拷贝DPDK的example文件夹下的makefile类工程, 同时增加DPDK的include文件夹到工程的include目录内(这样可以方便地查看DPDK自定义的函数在头文件里的说明–等价于查看文档)

    rte_eal_init(argc, argv); 初始化操作,返回值<0表示出错
    rte_exit(EXIT_FAILURE, “Port %d RX queue setup error (%d)\n”, port_rx, ret);退出操作,可以提示错误信息(注意后面的字符串的使用)
    rte_

    Reference

    1. http://blog.csdn.net/linzhaolover/article/details/9290083
      About the Pktgen
    2. http://blog.csdn.net/weicuidi/article/details/52925527
      About the l2fwd
    3. https://github.com/pktgen/Pktgen-DPDK/issues/4
      About the pcap.h question
    4. http://pktgen-dpdk.readthedocs.io/en/latest/commands.html
      About the pktgen usage
    展开全文
  • dpdk

    2020-05-25 20:21:42
    https://blog.csdn.net/rocson001/article/details/72967473/
    展开全文
  • DPDK Cookbook

    2019-03-14 16:27:16
    Intel 28年开发经验的资深工程师写得ebook,作者从2009年就参与于DPDK开发,Cookbook介绍了DPDK入门方法,使用DPDK盒子作为流量生成器,提供了DPDK性能优化的建议,深入浅出,值得DPDK开发入门者学习或资深开发者...
  • DPDK support disabled (missing /home/actionmystique/DPDK) ... </code></pre> <p>There must a way with an environment variable to specify the library path, although I'm not sure which one is ...
  • intel dpdk

    2017-12-20 16:31:00
    Intel内部DPDK培训文档, 详细说明DPDK的工作原理
  • DPDK update

    2020-12-28 13:28:54
    --dpdk DPDK_ARGS --" argument of Click itself. Allowing to run Click with or without DPDK without re-compilation, and therefore not break testing. Tests still do not use the DPDK facility though, ...
  • DPDK plugin

    2021-01-07 05:20:28
    <div><h1>FastNetMon connect to dpdk <p>Is possible FastNetMon connect to dpdk, and capture packet from dpdk interface?</p><p>该提问来源于开源项目:pavel-odintsov/fastnetmon</p></div>
  • DPDK编程指南

    2018-07-19 11:26:10
    DPDK编程指南;DPDK编程指南;DPDK编程指南;DPDK编程指南
  • <div><p>ChangeLog: dpdk_telemetry plugin: New plugin to fetch DPDK metrics. <p>This patch introduces a new plugin for collectd, which consumes DPDK metrics via the dpdk_telemetry library. The collectd...
  • DPDKDPDK APP 的指令行参数

    万次阅读 2020-05-12 14:58:45
    文章目录目录DPDK APP 的指令行参数Lcore-related options(逻辑线程相关参数)Device-related options(设备相关参数)Multiprocessing-related options(多进程相关参数)Memory-related options(存储相关参数)...

    目录

    Lcore-related options(逻辑线程相关参数)

    • -c <coremask>:选项参数可以使用指定的 lcore 来运行 DPDK 应用程序,是一个十六进制的掩码,掩码的每个位对应于 Linux 提供的 lcore ID。例如:-c 3,3 的十六进制为 0x03、二进制为 11,假设有 8 个 Core,那么二进制 00000011,从右到左依次代表核 0-7,使用 0、1 号核。

    • --lcores <lcores[@cpus]>[<,lcores[@cpus]>...]:EAL Thread 的 CPU 亲和性。

    --lcores='(0,4,5)@2,1@3,2@4,3@5'
    
    # lcores 0,4,5 绑定在 CPU2
    # lcore 1 绑定在 CPU3
    # lcore 2 绑定在 CPU4
    # lcore 3 绑定在 CPU5
    
    • -l <core list>
    • --master-lcore <core ID>:Master Core 的 CPU 亲和性。
    • -s <service core mask>:Slave Core 的 CPU 亲和性。

    在指定 lcpu mask 参数之前,需要了解平台的 CPU 布局,可以通过 hwloc 来查看:

    yum install hwloc -y
    

    在这里插入图片描述
    如果没有图形化界面则使用指令:

    $ lstopo-no-graphics
    Machine (9835MB)
      Package L#0 + L3 L#0 (16MB) + L2 L#0 (4096KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 + PU L#0 (P#0)
      Package L#1 + L3 L#1 (16MB) + L2 L#1 (4096KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1 + PU L#1 (P#1)
      Package L#2 + L3 L#2 (16MB) + L2 L#2 (4096KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2 + PU L#2 (P#2)
      Package L#3 + L3 L#3 (16MB) + L2 L#3 (4096KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3 + PU L#3 (P#3)
      Package L#4 + L3 L#4 (16MB) + L2 L#4 (4096KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4 + PU L#4 (P#4)
      Package L#5 + L3 L#5 (16MB) + L2 L#5 (4096KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5 + PU L#5 (P#5)
      Misc(MemoryModule)
      HostBridge L#0
        PCI 8086:7010
        PCI 1013:00b8
        PCI 1af4:1000
        PCI 1af4:1001
        3 x { PCI 15b3:1018 }
    

    也可以使用 DPDK 自带的 CPU layout 工具:

    $ cd ${RTE_SDK}/usertools/
    
    $ ./cpu_layout.py
    ======================================================================
    Core and Socket Information (as reported by '/sys/devices/system/cpu')
    ======================================================================
    
    cores =  [0]
    sockets =  [0, 1, 2, 3, 4, 5]
    
           Socket 0    Socket 1    Socket 2    Socket 3    Socket 4    Socket 5
           --------    --------    --------    --------    --------    --------
    Core 0 [0]         [1]         [2]         [3]         [4]         [5]
    

    Device-related options(设备相关参数)

    • -b, --pci-blacklist <[domain:]bus:devid.func>:PCI 设备黑名单,避免 EAL 使用指定的 PCI 设备。可以使用多次。
    • -w, --pci-whitelist <[domain:]bus:devid.func>:PCI 设备白名单,可以使用多次。
    • --use-device [domain:]bus:devid.func:仅使用指定的以太网设备。使用逗号分隔,不能与 -b 选项一起使用。

    注:黑白名单是互斥的。

    • --vdev <driver><id>[,key=val, ...]:添加一个虚拟设备,e.g. --vdev 'net_pcap0,rx_pcap=input.pcap,tx_pcap=output.pcap'
    • –vfio-intr <legacy|msi|msix>:为绑定到 VFIO 内核驱动的设备指定中断模式(如果不支持 VFIO,则配置无效)。
    • –create-uio-dev:为设备创建 /dev/uioX 文件并绑定指定的 igb_uio 内核驱动。
    • -d <path to shared object or directory>:加载额外驱动,参数可以是一个驱动文件或是包含了多个驱动文件的文件夹。可以使用多次。
    • –no-hpet:禁止使用 HPET 定时器。
    • –no-pci:禁止 PCI 总线。
    • –vmware-tsc-map:使用 VMware TSC 映射而不是本地 RDTSC。

    Multiprocessing-related options(多进程相关参数)

    • --file-prefix <prefix name>:用于 hugepage 文件名的前缀文本,为每个 DPDK App 设置一个不同的共享文件前缀,以及配置目录(默认为:/var/run/dpdk/rte/config)。使用多个不同的前缀文件允许运行多个独立的 DPDK 进程组。DPDK 支持多进程协同完成工作,多进程使用相同的共享文件组成进程组(进程组里的进程分为 primary 和 secondary)。e.g.
    # --file-prefix=vhost-1
    /dev/hugepages/vhost-1map_12
    /dev/hugepages/vhost-1map_11
    /dev/hugepages/vhost-1map_10
    
    • --proc-type <primary|secondary|auto>:设置当前的进程类型。
    • --base-virtaddr <address>:指定基本虚拟地址。DPDK 的 primary 进程尝试使用一个不同的内存映射开始地址。对于因为地址映射冲突而不能启动的 secondary 进程非常有用。

    当我们使用 --file-prefix 可以在响应的路径中找到内存的内置文件 config、hugepage 的信息文件,以及对于 dpdk-pdump 而言非常重要的 server-socket-file mp_socket。dpdk-pdump 通过 mp_socket 来向 DPDK app 发送抓包的请求。反之,如果 dpdk-pdump 找到不这个文件则无法抓包。

    $ ll /var/run/dpdk/vhost-1/
    总用量 228
    -rw-r----- 1 root root  11396 6月   8 23:22 config
    -rw------- 1 root root   4096 6月   8 23:22 fbarray_memseg-1048576k-0-0
    -rw------- 1 root root   4096 6月   8 23:22 fbarray_memseg-1048576k-0-1
    -rw------- 1 root root   4096 6月   8 23:22 fbarray_memseg-1048576k-0-2
    -rw------- 1 root root   4096 6月   8 23:22 fbarray_memseg-1048576k-0-3
    -rw------- 1 root root 188416 6月   8 23:22 fbarray_memzone
    -rw-r--r-- 1 root root  12432 6月   8 23:22 hugepage_info
    srwxr-xr-x 1 root root      0 6月   8 23:22 mp_socket
    

    Memory-related options(存储相关参数)

    • --socket-mem <amounts of memory per socket>:从特定的处理器 Socket 上的 hugepage 分配内存,参数用逗号分隔列表值。建议使用。
    # 在 Socket 0 上预分配1024M,在 Socket 1 上分配 2048M。
    --socket-mem 1024,2048
    
    • --socket-limit <amounts of memory per socket>:设置每个 Socket 的内存上限(仅仅是非传统存储模式),0 代表关闭限制。

    • --huge-dir <path to hugetlbfs directory>:使用指定的 hugetlbfs 目录,而不是自动检测的。hugetlbfs 是大页使用目录。e.g. --huge-dir /dev/hugepages

    • -n <number of channels>:设置每个 Socket 的内存通道数。

    • -r <number of ranks>:设置内存 Ranks 数,默认为自动检测。

    • -m <megabytes>:从 hugepage 分配内存,不考虑处理器 Socket。不建议使用。

    • –single-file-segments:在 hugetlbfs 中创建少量的文件(仅仅是非传统存储模式)。

    • –huge-unlink:创建大页文件后 Unlink (暗指不支持多进程)。

    • –match-allocations:释放 hugepages 回到系统完全像他们最初分配前一样。

    • –in-memory:不要创建任何共享数据结构,完全运行在存储中。暗指 --no-shconf 和 --huge-unlink。

    • –iova-mode <pa|va>:强制设置 IOVA 模式为指定值。

    • –no-shconf:不创建共享文件。暗指不支持多进程。

    • –no-huge:使用匿名存储而不是大页。暗指不支持多进程。

    • –legacy-mem:使用传统 DPDK 存储分配模式。

    Debugging options

    • --log-level <type:val>:为一个特定的组件指定日志级别,e.g. --log-level eal:8,可以使用多次。
    • --syslog <syslog facility>:设置日志设备,有效的日志设备如下:
      • auth
      • cron
      • daemon
      • ftp
      • kern
      • lpr
      • mail
      • news
      • syslog
      • user
      • uucp
      • local0
      • local1
      • local2
      • local3
      • local4
      • local5
      • local6
      • local7

    指定 DPDK App 使用的大页内存

    建议使用 --socket-mem 选项指定 DPDK App 使用的大页内存与预留的 hugepage 内存一致。例如:–socket-mem=0,512 指定在 Socket0(一般就是 NUMA0)上预留 512MB 内存(从 Socket1 上预留的大页内存中分配)。

    如果没有指定,则由 DPDK App 在启动时自动完成确定。如果指定的内存大小超出了预留值,则 DPDK App 启动失败。如果指定的内存大小小于预留值,也可能会导致 DPDK App 启动失败,尤其是在使用 -m(不建议使用)选项的时候,这里需要注意。

    隔离 DPDK App 使用 lcore

    虽然 DPDK App 已经是绑定核心的,但 Linux 调度程序仍然会使用这些 lcore 来运行其他的任务,所以为了防止在这些核上运行额外的工作负载,可以使用 isolcpus Linux 内核参数来将其与通用的 Linux 调度程序隔离开来。

    isolcpus=2,4,6
    

    使用基于 Intel VT-d 的 Linux IOMMU Pass-Through 来运行 DPDK App

    要在 Linux 内核中启用 Intel VT-d 硬件辅助的 IO 技术,必须配置一系列内核选项,包括:

    • IOMMU_SUPPORT
    • IOMMU_API
    • INTEL_IOMMU

    要使用 Intel VT-d 来运行 DPDK App,在使用 igb_uio 驱动时,Grub 参数必须携带 iommu=pt 参数。 这使得主机可以直接通过 DMA 重映射查找网卡的存储空间。另外,如果内核中没有设置 INTEL_IOMMU_DEFAULT_ON 参数,那么还必须要使用到 intel_iommu=on 参数。这可以确保 Intel IOMMU 被正确初始化。而在使用 vfio-pci 驱动程序时,则直接同时使用 iommu=pt intel_iommu=on

    展开全文
  • DPDK changes

    2021-01-07 03:11:48
    <div><p>I was looking to port this to newer version of DPDK. Did you make any change in DPDK to make things work? If so, will you be able to summarise the changes/issues that you faced?</p><p>该提问...
  • DPDK — PMD,DPDK 的核心优化

    千次阅读 2020-05-09 11:47:03
    文章目录目录前文列表PMD,DPDK 的核心优化PMD 与 UIP 的交互实现PMD 的应用层实现参考文章 前文列表 《DPDK — 安装部署》 《DPDK — 数据平面开发技术》 《DPDK — 架构解析》 《DPDK — IGB_UIO,与 UIO ...

    目录

    前文列表

    DPDK — 安装部署
    DPDK — 数据平面开发技术
    DPDK — 架构解析
    DPDK — IGB_UIO,与 UIO Framework 进行交互的内核模块

    PMD,DPDK 的核心优化

    我们知道,Linux 内核在收包时有两种方式可供选择,一种是中断方式,另外一种是轮询方式。

    从哲学的角度来说,中断是外界强加给你的信号,你必须被动应对,而轮询则是你主动地处理事情。前者最大的影响就是打断你当前工作的连续性,而后者则不会,事务的安排自在掌握。

    中断对性能的影响有多大?在 x86 体系结构中,一次中断处理需要将 CPU 的状态寄存器保存到堆栈,并运行中断服务程序,最后再将保存的状态寄存器信息从堆栈中恢复。整个过程需要至少 300 个处理器时钟周期。

    轮询对性能的提升有多大?网卡收到报文后,可以借助 DDIO(Direct Data I/O)技术直接将报文保存到 CPU 的 Cache 中,或者保存到内存中(没有 DDIO 技术的情况下),并设置报文到达的标志位。应用程序则可以周期性地轮询报文到达的标志位,检测是否有新报文需要处理。整个过程中完全没有中断处理过程,因此应用程序的网络报文处理能力得以极大提升。

    故此,想要 CPU 执行始终高效,就必然需要一个内核线程去主动 Poll(轮询)网卡,而这种行为与当前的内核协议栈是不相容的,即便当前内核协议栈可以使用 NAPI 中断+轮询的方式,但依旧没有根本上解决问题。除非再重新实现一套全新的内核协议栈,显然这并不现实,但幸运的是,我们可以在用户态实现这一点。

    针对 Intel 网卡,DPDK 实现了基于轮询方式的 PMD(Poll Mode Drivers)网卡驱动。该驱动由用户态的 API 以及 PMD Driver 构成,内核态的 UIO Driver 屏蔽了网卡发出的中断信号,然后由用户态的 PMD Driver 采用主动轮询的方式。除了链路状态通知仍必须采用中断方式以外,均使用无中断方式直接操作网卡设备的接收和发送队列。

    PMD Driver 从网卡上接收到数据包后,会直接通过 DMA 方式传输到预分配的内存中,同时更新无锁环形队列中的数据包指针,不断轮询的应用程序很快就能感知收到数据包,并在预分配的内存地址上直接处理数据包,这个过程非常简洁。

    PMD 极大提升了网卡 I/O 性能。此外,PMD 还同时支持物理和虚拟两种网络接口,支持 Intel、Cisco、Broadcom、Mellanox、Chelsio 等整个行业生态系统的网卡设备,以及支持基于 KVM、VMware、 Xen 等虚拟化网络接口。PMD 实现了 Intel 1GbE、10GbE 和 40GbE 网卡下基于轮询收发包。

    UIO+PMD,前者旁路了内核,后者主动轮询避免了硬中断,DPDK 从而可以在用户态进行收发包的处理。带来了零拷贝(Zero Copy)、无系统调用(System call)的优化。同时,还避免了软中断的异步处理,也减少了上下文切换带来的 Cache Miss。

    值得注意的是,运行在 PMD 的 Core 会处于用户态 CPU 100% 的状态,如下图:
    在这里插入图片描述
    由于,网络空闲时 CPU 会长期处于空转状态,带来了电力能耗的问题。所以,DPDK 引入了 Interrupt DPDK(中断 DPDK)模式。Interrupt DPDK 的原理和 NAPI 很像,就是 PMD 在没数据包需要处理时自动进入睡眠,改为中断通知,接收到收包中断信号后,激活主动轮询。这就是所谓的链路状态中断通知。并且 Interrupt DPDK 还可以和其他进程共享一个 CPU Core,但 DPDK 进程仍具有更高的调度优先级。

    在这里插入图片描述

    PMD 与 UIP 的交互实现

    对于 PMD 的实现来说,重点是处于用户态的 PMD 驱动程序如何通过 igb_uio 内核驱动模块与 UIO 进行交互,从而实现数据包处理的内核旁路。

    1. 调用 igbuio_setup_bars,设置 uio_info 的 uio_mem 和 uio_port。这一步骤的细节在前文中已有提到,igb_uio 内核模块在发现了 PCI 设备的 Memory BAR 和 IO BAR 之后会将这些 resources 的信息保存到 uioX 设备的 maps 中,这样处于用户态的 PMD 就可以访问这些原本只能被内核访问的 BAR 空间了。
      在这里插入图片描述
    2. 设置 uio_info 的其他成员。
      在这里插入图片描述
    3. 调用 uio_register_device,注册 uioX 设备。PMD 通过 uioX 设备与 igb_uio 内核驱动模块进行交互。

    在这里插入图片描述

    1. 打开 uioX 设备,应用层已经可以使用 uioX 设备了。DPDK 的应用层代码,会打开 uioX 设备。在函数 pci_uio_alloc_resource 中。
      在这里插入图片描述

    打开对应的 uioX 设备时,对应的内核操作为 uio_open(),其又会调用 igb_uio 的 open(),流程图如下:

    在这里插入图片描述

    1. 设置中断信息,igb_uio 默认的中断模式为 RTE_INTR_MODE_MSIX,在 igbuio_pci_enable_interrupts 的关键代码如下:
      在这里插入图片描述
    2. 注册中断。当打开 uio 设备时,igb_uio 就会注册了一个中断。
      在这里插入图片描述
      那么为什么作为轮询模式的 PMD 驱动需要注册中断呢?这是因为,即使应用层可以通过 UIO 来实现设备驱动,但是设备的某些事件还是需要内核进行响应,然后通知应用层的。当然,PMD 的中断处理已经非常简单了。

    在这里插入图片描述
    其中的关键步骤是调用 uio_event_notify。

    在这里插入图片描述

    这个函数很简单:

    1. 增加 uioX 设备的 “事件” 数;
    2. 唤醒在 idev->wait 等待队列中的 task;
    3. 使用信号异步通知 async_queue 队列中的进程;

    注意,因为目前 DPDK 没有使用异步 IO 的方式,所有对于 DPDK PMD 来说,只有前两个语句有用。

    1. 调用 UIO 的 mmap(),将注册的 uioX 设备的 “内存空间” 映射到应用空间,让 PMD 得以真正的从用户态中去访问内存。其 mmap 函数为 uio_mmap(),关键代码如下:
      在这里插入图片描述

    至此,UIO 框架和 igb_uio 内核模块已经可以让 PMD 访问 PCI 设备的大部分资源了。

    PMD 的应用层实现

    当 DPDK Application 启动时,会首先进行 EAL 初始化,如下图:

    在这里插入图片描述

    在 pci_uio_alloc_resource 中,主要是打开 DPDK Application 要管理的 uioX 设备。
    在这里插入图片描述

    同时,DPDK App 还需要把 PCI 设备的 BAR 映射到应用层。在 pci_uio_map_resource() 中,除了调用上图中的 pci_uio_alloc_resource,还会调用 pci_uio_map_resource_by_index 做资源映射。

    在这里插入图片描述

    下面就是 PMD 在应用层的驱动实现了。以最简单的 e1000 驱动为例,其初始化函数 eth_igb_dev_init 如下。

    在这里插入图片描述

    上面我们提到了,当 uioX 设备有事件触发时,由 eth_igb_interrupt_handler() 负责处理,实现了用户态的中断处理。

    在这里插入图片描述
    eth_igb_interrupt_handler 的实现非常简单,只是处理设备的状态变化事件,如:Link Status。

    接下来,就是最重要的了,PMD 如何读取网卡数据。DPDK App 会调用 rte_eth_rx_burst 读取数据报文。

    在这里插入图片描述

    在这个函数中,会调用驱动 dev->rx_pkt_burst 来做实际的操作。以 e1000 为例,即 eth_igb_recv_pkts。

    在这里插入图片描述

    在这里插入图片描述

    这里的实现很简单。如果网卡接收 buffer descriptor 表示已经完成一个报文的接收,有 E1000_RXD_STAT_DD 标志,则 rte_mbuf_raw_alloc 一个 mbuf,进行处理。如果没有报文,直接跳出循环。

    对应 RTC 模型的 DPDK App 来说,就是不断的调用 rte_eth_rx_burst 去 “询问” 网卡是否有新的报文。如果有,就取走所有的报文或达到参数 nb_pkts 的上限。然后进行报文处理,处理完毕,再次循环。

    参考文章

    https://cloud.tencent.com/developer/article/1411982

    展开全文
  • dpdk记录文档

    2019-01-29 17:19:58
    dpdk记录文档
  • DPDK技术峰会PPT讲稿分享,DPDK开发者大会讲稿分享,演讲者腾讯安全平台部高级工程师,该文档讨论了腾讯云数据中心的安全需求,为什么从使用专用芯片转而使用x86/DPDK,如何利用多进程模型设计安全服务,如何承受上...
  • <p>I am trying to compile mTCP with the most recent upstream DPDK git release dpdk v2.2.0-rc4, I patched up lib/librte_eal/linuxapp/igb_uio/igb_uio.c diff from mTCP DPDK and also copied igb_uio/igb_...
  • DPDK技术白皮书

    2018-03-30 10:24:38
    中国电信DPDK 技术白皮书,中国电信DPDK 技术白皮书。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,436
精华内容 2,174
关键字:

DPDK