x**3な人生

基本的にはメモ

pktgen-dpdk 3.0.00のコンパイルエラーと回避

pktgen-dpdkが3.0.00にアップデートされたので、試してみたところコンパイルエラー。回避方法をメモ。
原因はdpdkのRTE_MBUF_ASSERTというマクロが無くなったため。詳しくは以下のとおり。

環境

インストール手順

ソースコードは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 */


以上