1、編譯dpdk lib
一、配置編譯工具鏈
make config T=x86_64-native-linuxapp-gcc
二、編譯
cd build
make
編譯錯誤一:/root/dpdk-18.11/lib/librte_eal/linuxapp/eal/eal_memory.c:29:18: fatal error: numa.h: No such file or directory
緣由:缺乏庫
解決方法:yum install numactl-devel*x86_64 -y
編譯錯誤二:make: *** /lib/modules/3.10.0-957.1.3.el7.x86_64/build: No such file or directory. Stop.
緣由:系統沒有安裝內核開發包
解決方法:(1)yum install kernel-devel -y (2)ln -s /usr/src/kernels/3.10.0-957.5.1.el7.x86_64 /usr/src/kernels/3.10.0-957.1.3.el7.x86_64
三、結果
編譯出來的.a文件在目錄/root/dpdk-18.11/build/lib下
2、dpdk用例
一、例1:hello world
(1)編譯
cd /root/dpdk-18.11/examples/helloworld
export RTE_SDK=/root/dpdk-18.11
export RTE_TARGET=x86_64-native-linuxapp-gcc
export RTE_TARGET=build
make
會在當前目錄生成build目錄,裏面有編譯生成的可執行文件。
(2)運行helloworld
[root@localhost helloworld]# ./build/helloworld
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: No free hugepages reported in hugepages-2048kB
EAL: No free hugepages reported in hugepages-2048kB
EAL: FATAL: Cannot get hugepage information.
EAL: Cannot get hugepage information.
PANIC in main():
Cannot init EAL
5: [./build/helloworld() [0x4804df]]
4: [/lib64/libc.so.6(__libc_start_main+0xf5) [0x7fe22c67c3d5]]
3: [./build/helloworld() [0x4774b8]]
2: [./build/helloworld(__rte_panic+0xb8) [0x4609fb]]
1: [./build/helloworld(rte_dump_stack+0x1a) [0x5526ba]]
Aborted (core dumped)
運行環境配有配置,須要配置一下運行環境。
source usertools/dpdk-setup.sh,分別設置18,20,22
而後就能夠正常運行了。
[root@localhost dpdk-18.11]# ./examples/helloworld/build/helloworld -l 0-1 -n 4
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Probing VFIO support...
hello from core 0
hello from core 1node
二、例子2:Basic Forwarding/Skeleton Applicationlinux
(1)編譯完運行./build/basicfwd -l 1 -n 4
[root@localhost skeleton]# ./build/basicfwd -l 1 -n 4
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Probing VFIO support...
EAL: Error - exiting with code: 1
Cause: Error: number of ports must be even
緣由:dpdk沒有綁定網卡。
看下服務器的網卡信息,只有一塊網卡。
[root@localhost skeleton]# ifconfig
enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.8.93 netmask 255.255.255.0 broadcast 172.19.8.255
inet6 fe80::5246:5dff:fe5b:49be prefixlen 64 scopeid 0x20<link>
ether 50:46:5d:5b:49:be txqueuelen 1000 (Ethernet)
RX packets 765935 bytes 286280011 (273.0 MiB)
RX errors 0 dropped 3 overruns 0 frame 0
TX packets 128062 bytes 13559483 (12.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0服務器
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 22 bytes 1748 (1.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22 bytes 1748 (1.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
下面咱們着手建立兩塊虛擬網卡,查看dpdk支持的網卡列表,發現也支持tap虛擬網卡。
https://core.dpdk.org/supported/
支持虛擬網卡須要內核版本在4.2以上,能夠經過如下命令查詢是否支持虛擬tap:
zcat /proc/config.gz | ( grep 'CLS_FLOWER=' || echo 'not supported' ) |
tee -a /dev/stderr | grep -q '=m' &&
lsmod | ( grep cls_flower || echo 'try modprobe cls_flower' )
因爲咱們的系統內核不能升級,只能用virtualbox建立虛機時多加兩塊網卡。建立的虛機有三塊網卡,下面把其中的兩塊綁定dpdk網絡
(2)網卡綁定dpdk
[root@localhost dpdk-18.11]# ./usertools/dpdk-devbind.py --bind=uio_pci_generic enp0s8
Error - no supported modules(DPDK driver) are loaded
緣由:uio驅動沒有加載。回頭看下,source usertools/dpdk-setup.sh,設置18時,報錯了:## ERROR: Target does not have the DPDK UIO Kernel Module.To fix, please try to rebuild target.
解決方法:
[root@localhost dpdk-18.11]# modprobe uio
[root@localhost dpdk-18.11]# cd build/kmod/
[root@localhost kmod]# insmod igb_uio.ko
[root@localhost kmod]# lsmod | grep uio
再次運次
[root@localhost dpdk-18.11]# ./usertools/dpdk-devbind.py --bind=uio_pci_generic enp0s8
Routing table indicates that interface 0000:00:08.0 is active. Not modifying
緣由:接口up沒法綁定,先把指望綁定的接口down掉,再綁定。仍然報錯。
[root@localhost dpdk-18.11]# ifconfig enp0s8 down
[root@localhost dpdk-18.11]# ./usertools/dpdk-devbind.py --bind=uio_pci_generic enp0s8
Error: bind failed for 0000:00:08.0 - Cannot open /sys/bus/pci/drivers/uio_pci_generic/bind
Error: unbind failed for 0000:00:08.0 - Cannot open /sys/bus/pci/drivers//unbind
[root@localhost dpdk-18.11]#
加載驅動 uio_pci_generic,繼續綁定,仍然報錯。
[root@localhost dpdk-18.11]# modprobe uio_pci_generic
[root@localhost dpdk-18.11]# lsmod | grep uio_pci_generic
uio_pci_generic 12588 0
uio 19338 2 uio_pci_generic,igb_uio
[root@localhost dpdk-18.11]# ./usertools/dpdk-devbind.py --bind=uio_pci_generic enp0s8
Unknown device: enp0s8. Please specify device in "bus:slot.func" format
查看一下網卡信息,發現enp0s8網卡不見了。查看一下狀態,app
用id好綁定:
[root@localhost dpdk-18.11]# ./usertools/dpdk-devbind.py --bind=uio_pci_generic 00:08.0
成功。socket
一樣綁定第二塊網卡。最終狀態以下。工具
執行程序:oop
因爲虛機和辦公網絡是通的,一下把辦公網絡搞掛了。抓包看全是ARP報文。ui
(3)下面對照例子代碼,分析爲何用這個IP發包。
答案:其實這個例子自己沒有發生三層報文,只是簡單的轉發了網卡上收到的ARP廣播報文,這個報文並非自身協議棧產生的。3d