1.安装dpdk
下载dpdk源码,解压源码
根据不同版本安装编译的命令不同我这里使用的是16.11版本的
make install T=x86_64-native-linuxapp-gcc(这里系统版本是7.2,64位的系统)
也有直接make install 的版本(17版本的)
编译完成后会生成x86_64-native-linuxapp-gcc这个目录,这个目录中包含了头文件的链接以及所有的静态库
2.绑定网口
首先加载内核模块modprobe uio_pci_generic或者modprobe igb_uio
然后就可以查看绑定的状态了,在dpdk下有个tools的目录进去,./dpdk-devbind.py --status
然后就可以看见我们机子上的所有网口,主要看DPDK-compatible driver下的网卡信息,这个时候还没有绑定网口
然后用ifconfig命令查看网卡信息,选择你要绑定的网卡比如eth0,首先ifconfig eth0 down 关闭网口,然后使用./dpdk-devbind.py --bind=uio_pci-generic(或者igb_uio) eth0 这样就绑定好网口了。
再使用./dpdk-devbind.py --status就可以看见字节绑定的网口了
一般我们是绑定两个网口,一个发一个收。
解绑网卡则./dpdk-devbind.py -u XX:0X.0
./dpdk-devbind.py --bind=igb(或者e1000,具体看以前的网卡驱动)XX:0X.0就ok了
3.挂载hugetlbfs
首先创建huge目录 mkdir -p /mut/huge 这是我自己创建的,自己随意
挂载ugetlbfs :mount -t hugetlbfs nodev /mnt/huge
设置页大小:echo 64(一般设置64或者128) > /sys/devices/system/node/可能多个node0之类的/hugepages-2048kB/nr_hugepages
一定要挂载,晚点都没关系,不然后面的测试程序以及你自己编译的程序都不能运行
4.编译测试程序
首先加载环境变量
export RTE_SDK=你自己安装目录的绝对路径
export RTE_TARGET=安装目录下在x86_64-native-linuxapp-gcc文件夹
然后就可以进入example下在子目录进行编译
比如进入skleton目录直接make就可以了,执行程序在生成的build目录下
如果持续输出报错信息:
EAL: Error reading from file descriptor 23: Input/output error
则
修改代码行lib/librte_eal/linuxapp/igb_uio/igb_uio.c
找到
pci_intx_mask_supported(dev)
这行代码,然后修改为
pci_intx_mask_supported(dev)||true
重新编译ok
5.对接网线
将网线对接在你绑定的网口上,这样你就可以测试收包程序了
6.如果你想自己编写或者封装接口
可以参照这个里面的程序和makefile
最好是拷贝一份自己的dpdk版本中的模板,在上面修改这样会减少很多工作和错误,如果在自己编译的过程中碰到某些未定义的变量那么最好自己定义一下比如UINT8_MAX之类的参照stdint.h文件和inttypes.h文件,由于版本不同的原因造成某些变量使用不了,当然有些版本是没有任何问题的。