l2fwd + pdump 的 例程
修改 l2fwd 的 例程
在 l2fwd 的 例程上添加 pdump 的功能:
- 头文件引用
<rte_pdump.h>
。 signal_handler()
中添加rte_pdump_uninit()
。main()
中添加rte_pdump_init()
。
差分结果:
- 左边 是修改前。
- 右边 是修改后。添加了 pdump 的 功能。
41c41,43
<
---
> #ifdef RTE_LIBRTE_PDUMP
> #include <rte_pdump.h>
> #endif
509a512,515
> #ifdef RTE_LIBRTE_PDUMP
> /* uninitialize packet capture framework */
> rte_pdump_uninit();
> #endif
536a543,548
>
> #ifdef RTE_LIBRTE_PDUMP
> #warning l2fwd with pdump
> /* initialize packet capture framework */
> rte_pdump_init(NULL);
> #endif
启动 l2fwd 的 例程(没有设置好 --base-virtaddr
)
./build/l2fwd -d librte_pmd_ixgbe.so -w 08:00.0 -w 08:00.1 -c 0xf0 -n 4 --proc-type primary -- -q 8 -p 0x3 -T 1 --no-mac-updating
启动 dpdk-pdump 的 例程
./dpdk-pdump -w 08:00.0 -w 08:00.1 -d librte_pmd_pcap.so -d librte_pmd_ixgbe.so --proc-type secondary -- --pdump 'port=0,queue=*,rx-dev=/tmp/capture.pcap'
> EAL: Cannot get a virtual area at requested address: 0x7ffbef800000 (got 0x7ffbef543000)
> EAL: Could not mmap 17179869184 bytes at [0x7ffbef800000] - please use '--base-virtaddr' option
> EAL: Cannot preallocate VA space for hugepage memory
> EAL: FATAL: Cannot init memory
> EAL: Cannot init memory
>
> PANIC in main():
> Cannot init EAL
分析:
由于 dpdk-pdump 的例程 无法 映射到 0x7ffbef800000,但却可以 映射到 0x7ffbef543000。所以出现错误退出。
EAL: Cannot get a virtual area at requested address: 0x7ffbef800000 (got 0x7ffbef543000) <-- eal_get_virtual_area() 抛出错误
dpdk-pdump 的例程 给出了提示:
EAL: Could not mmap 17179869184 bytes at [0x7ffbef800000] - please use ‘–base-virtaddr’ option <-- alloc_va_space() 的提示
所以需要修改 primary
进程(也就是 l2fwd 的 例程),启动的时候设置 --base-virtaddr
。
注意:
dpdk-pdump 的例程 的命令行无需改变。
重新启动 l2fwd 的 例程(正确的设置好 --base-virtaddr
)
增加 l2fwd 的 例程的启动参数 --base-virtaddr
。参数为 0x7ffbef543000
。
新的 l2fwd 的 例程的命令行参数如下:
./build/l2fwd -d librte_pmd_ixgbe.so -w 08:00.0 -w 08:00.1 -c 0xf0 -n 4 --proc-type primary --base-virtaddr 0x7ffbef543000 -- -q 8 -p 0x3 -T 1 --no-mac-updating
使用 --base-virtaddr
的 原因
dpdk-pdump 的 例程 报错的原因分析
- 第一个错误
dpdk-pdump 的 例程中,第一个报错如下:
EAL: Cannot get a virtual area at requested address: 0x7ffbef800000 (got 0x7ffbef543000) <-- eal_get_virtual_area() 抛出错误
其中的错误,出自 eal_get_virtual_area()
。
如果 requested_addr
和 aligned_addr
不匹配。则提示出错。
eal_get_virtual_area()
的源码,经过简化后如下:
void *
eal_get_virtual_area(void *requested_addr, size_t *size,
size_t page_sz, int flags, int mmap_flags)
{
/* ... */
/* 映射虚拟地址 */
mapped_addr = mmap(requested_addr, (size_t)map_sz, PROT_READ,
mmap_flags, -1, 0);
/* 经过了简化,去除了地址对齐 */
aligned_addr = mapped_addr :
/* 如果 `requested_addr` 和 `aligned_addr` 不匹配。则提示出错 */
if (requested_addr != NULL
&& aligned_addr != requested_addr) {
RTE_LOG(ERR, EAL, "Cannot get a virtual area at requested address: %p (got %p)\n",
requested_addr, aligned_addr);
munmap(mapped_addr, map_sz);
rte_errno = EADDRNOTAVAIL;
return NULL;
}
return aligned_addr;
}
- 第二个错误
dpdk-pdump 的 例程中,第二个报错如下:
EAL: Could not mmap 17179869184