1.环境准备
DPDK是英特尔推出的用于网络数据转发的一项技术,仅支持x86架构的机器。
系统:
在这里插入代码片
dpdk@dpdk-virtual-machine:~$ uname -a
Linux dpdk-virtual-machine 4.4.0-142-generic #168~14.04.1-Ubuntu SMP Sat Jan 19 11:26:28 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
dpdk@dpdk-virtual-machine:~$
是否支持hpet:
在这里插入代码片
dpdk@dpdk-virtual-machine:~$ cat /proc/timer_list | grep hpet
Clock Event Device: hpet
set_next_event: hpet_legacy_next_event
shutdown: hpet_legacy_shutdown
periodic: hpet_legacy_set_periodic
oneshot: hpet_legacy_set_oneshot
resume: hpet_legacy_resume
网卡信息:
在这里插入代码片
dpdk@dpdk-virtual-machine:~$ lspci | grep "Ethernet"
02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:06.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:07.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
2.下载dpdk
在这里插入代码片
wget http://fast.dpdk.org/rel/dpdk-16.07.tar.xz
3.编译
解压文件,并进入dpdk根目录,执行如下语句
在这里插入代码片
make install T=x86_64-native-linuxapp-gcc
等待编译完成,目录下会生成
在这里插入代码片
dpdk@dpdk-virtual-machine:~/dpdk_test/dpdk-16.07$ ls
app config drivers GNUmakefile LICENSE.GPL MAINTAINERS mk README tools
buildtools doc examples lib LICENSE.LGPL Makefile pkg scripts x86_64-native-linuxapp-gcc
编译过程中遇到编译错误,缺少libpcap-dev库,执行如下命令安装
在这里插入代码片
sudo apt-get install libpcap-dev
4.加载uio内核模块
在这里插入代码片
sudo modprobe uio
sudo insmod x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
5.绑定网卡到dpdk
在这里插入代码片
查看网卡信息:
./tools/dpdk-devbind.py --status
绑定:
./tools/dpdk-devbind.py --bind=igb_uio 02:06.0
./tools/dpdk-devbind.py --bind=igb_uio 02:07.0
如果脚本不行,可能是因为权限的问题,加sudo或者chmod修改对应的文件即可
6.配置环境env
在这里插入代码片
dpdk@dpdk-virtual-machine:~/dpdk_test$ cat env.sh
#!/bin/sh
export RTE_SDK=/home/dpdk/dpdk_test/dpdk-16.07
export RTE_TARGET=x86_64-native-linuxapp-gcc
通过source使其生效。
7.编译example测试用例
在这里插入代码片
cd examples/helloworld
make
执行sudo ./build/helloword,对于虚拟设备有可能会打印IO error的错误,是因为网卡不支持dpdk,修改如下代码重新编译
在这里插入代码片
vim lib/librte_eal/linuxapp/igb_uio/igb_uio.c中的
case RTE_INTR_MODE_LEGACY:
if (pci_intx_mask_supported(dev) || 1) {
dev_dbg(&dev->dev, "using INTX");
udev->info.irq_flags = IRQF_SHARED;
udev->info.irq = dev->irq;
udev->mode = RTE_INTR_MODE_LEGACY;
break;
}
可修改为
case RTE_INTR_MODE_LEGACY:
if (pci_intx_mask_supported(dev) || 1) {
dev_dbg(&dev->dev, "using INTX");
udev->info.irq_flags = IRQF_SHARED;
udev->info.irq = dev->irq;
udev->mode = RTE_INTR_MODE_LEGACY;
break;
}