dpdk_18_05 的 helloworld 例程
编译
方法1: 编译并安装到 ./build/
(使用,后续都是以这个为例子)
cd ${RTE_SDK}/examples/helloworld
make
方法2: 编译并安装到 ${dpdk_example} 路径
(暂不使用)
cd ${RTE_SDK}/examples/helloworld
make O=${dpdk_example}
运行
cd ${RTE_SDK}/examples/helloworld
./build/helloworld
l2fwd 的 例程
编译
情况1. 编译的时候没有网卡的驱动。(使用,后续都是以这个为例子)
EXTRA_CFLAGS="-O0 -g3" make
情况1. 编译的时候加上网卡的驱动。(暂不使用)
EXTRA_CFLAGS="-O0 -g3 -lrte_pmd_ixgbe" make
查看应用程序是否有使用PMD
驱动
ldd build/l2fwd | grep pmd
如果为空。则表示应用程序没有使用PMD
驱动。后续启动的时候需用-d
指定驱动。
查询网卡驱动驱动库文件
通过网卡的 pci地址
,查看网卡的 device id
的值。
# show the nic device id
cat /sys/bus/pci/devices/0000:08:00.0/device
> 0x10fb
在 dpdk 的源码中,通过 device id
的值,查找到 device id
的宏。
#define IXGBE_DEV_ID_82599_SFP 0x10FB
在 dpdk 的源码中,通过 device id
的宏,查找到网卡所在的 id table
。
pci_id_ixgbe_map = {
{
RTE_PCI_DEVICE(IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP) },
};
在 dpdk 的源码中,通过 id table
,查找到网卡的驱动 rte_pci_driver
。
static struct rte_pci_driver rte_ixgbe_pmd = {
.id_table = pci_id_ixgbe_map,
.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC |
RTE_PCI_DRV_IOVA_AS_VA,
.probe = eth_ixgbe_pci_probe,
.remove = eth_ixgbe_pci_remove,
};
在 dpdk 的源码中,查找到网卡的驱动 rte_pci_driver
的注册函数。
得到注册函数所在的文件路径。
RTE_PMD_REGISTER_PCI(net_ixgbe, rte_ixgbe_pmd);
所在的文件路径为:
${
RTE_SDK}/drivers/net/ixgbe/ixgbe_ethdev.c
查看 Makefile
,找到驱动库的名字。
cd ${
RTE_SDK}/drivers/net/ixgbe
grep LIB Makefile | head -n 1
> LIB = librte_pmd_ixgbe.a
在 ${RTE_SDK}/${RTE_TARGET}/lib
里,查看是否有驱动库。
ls ${RTE_SDK}/${RTE_TARGET}/lib | grep librte_pmd_ixgbe
> librte_pmd_ixgbe.so
> librte_pmd_ixgbe.so.2.1
运行
情况1. 编译的时候没有网卡的驱动
需要在运行的时候指定驱动。
函数eal_plugins_init()
会使用 dlopen()
来打开so
库文件。
./build/l2fwd -d librte_pmd_ixgbe.so -w 08:00.0 -w 08:00.1 -c 0xf0 -n 4 -- -q 8 -p 0x3 -T 1 --no-mac-updating
情况2. 编译的时候加上网卡的驱动
不需要在运行的时候指定驱动。
./build/l2fwd -w 08:00.0 -w 08:00.1 -