pktgen-dpdk 3.0.00のコンパイルエラーと回避
pktgen-dpdkが3.0.00にアップデートされたので、試してみたところコンパイルエラー。回避方法をメモ。
原因はdpdkのRTE_MBUF_ASSERTというマクロが無くなったため。詳しくは以下のとおり。
環境
- VirtualBox 5.0.20 r106931
- vagrant 1.7.4
- dpdk 16.04
- pktgen-dpdk 3.0.00
インストール手順
ソースコードはgit cloneで取得。
git clone http://dpdk.org/git/apps/pktgen-dpdk
手順はpktgen-dpdkのREADMEを参照。180行目以降。
もしくはhttp://dpdk.org/browse/apps/pktgen-dpdk/tree/README.mdを参照。
症状
makeでつまずく。
vagrant@vagrant:~/pktgen-dpdk$ make == lib == common == lua == src == app CC pktgen-pcap.o /home/vagrant/pktgen-dpdk/app/pktgen-pcap.c: In function ‘pktgen_pcap_mbuf_ctor’: /home/vagrant/pktgen-dpdk/app/pktgen-pcap.c:268:2: error: implicit declaration of function ‘RTE_MBUF_ASSERT’ [-Werror=implicit-function-declaration] RTE_MBUF_ASSERT(mp->elt_size >= sizeof(struct rte_mbuf)); ^ /home/vagrant/pktgen-dpdk/app/pktgen-pcap.c:268:2: error: nested extern declaration of ‘RTE_MBUF_ASSERT’ [-Werror=nested-externs] cc1: all warnings being treated as errors make[2]: *** [pktgen-pcap.o] Error 1 make[1]: *** [all] Error 2 make: *** [app] Error 2
原因
メッセージを見ると、RTE_MBUF_ASSERTの宣言が無いことによる警告があり、-Werror=implicit-function-declarationのおかげで警告がエラー扱いになっているためとわかるが、http://dpdk.org/doc/api/を調べてみるとrte_mbuf.hの中に定義はある。
不思議に思い、実際にソースコードの方をのぞいてみると、こちらには定義が無い。。。
解決方法
RTE_MBUF_ASSERTはrte_panic()を呼び出すだけのデバッグ用マクロで、基本的に不要(デバッグ向けにコンパイルしない場合は何もしない)。
http://dpdk.org/doc/api/rte__mbuf_8h_source.htmlにある以前のバージョンのコードをそのままpktgen-dpdk/app/pktgen-pcap.cに持ってくればコンパイルは通るようになる。pktgen-pcap.c以外ではこのマクロは用いられていない模様。
#ifdef RTE_LIBRTE_MBUF_DEBUG #define __rte_mbuf_sanity_check(m, is_h) rte_mbuf_sanity_check(m, is_h) #define __rte_mbuf_sanity_check_raw(m, is_h) do { \ if ((m) != NULL) \ rte_mbuf_sanity_check(m, is_h); \ } while (0) #define RTE_MBUF_ASSERT(exp) \ if (!(exp)) { \ rte_panic("line%d\tassert \"" #exp "\" failed\n", __LINE__); \ } #else /* RTE_LIBRTE_MBUF_DEBUG */ #define __rte_mbuf_sanity_check(m, is_h) do { } while (0) #define __rte_mbuf_sanity_check_raw(m, is_h) do { } while (0) #define RTE_MBUF_ASSERT(exp) do { } while (0) #endif /* RTE_LIBRTE_MBUF_DEBUG */
以上