diff --git a/.gitignore b/.gitignore
index 53454a5..ae6eb64 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,6 @@ test/packet_netmap/odp_packet
 test/api_test/odp_atomic
 test/api_test/odp_shm
 test/api_test/odp_ring
+test/libpcap/libpcap
+test/libpcap/tcpdump
+test/libpcap/wireshark
diff --git a/platform/linux-generic/Makefile b/platform/linux-generic/Makefile
index c35eb07..2a09dbe 100644
--- a/platform/linux-generic/Makefile
+++ b/platform/linux-generic/Makefile
@@ -35,6 +35,7 @@ DOC_DIR  = ./doc
 EXTRA_CFLAGS  += -I$(ODP_ROOT)/include
 EXTRA_CFLAGS  += -I./include
 EXTRA_CFLAGS  += -I./include/api
+EXTRA_CFLAGS  += -fPIC
 
 ifeq ($(ODP_HAVE_NETMAP),yes)
 EXTRA_CFLAGS  += -DODP_HAVE_NETMAP
diff --git a/test/libpcap/Makefile b/test/libpcap/Makefile
new file mode 100644
index 0000000..4438dbe
--- /dev/null
+++ b/test/libpcap/Makefile
@@ -0,0 +1,92 @@
+# Copyright (c) 2013, Linaro Limited
+# All rights reserved.
+#
+# SPDX-License-Identifier:     BSD-3-Clause
+
+LIBPCAP_REPO=http://git.linaro.org/git/people/vincent.hsu/libpcap.git
+LIBPCAP_DIR=libpcap
+TCPDUMP_REPO=https://github.com/the-tcpdump-group/tcpdump.git
+TCPDUMP_DIR=tcpdump
+WIRESHARK_REPO=https://code.wireshark.org/review/p/wireshark.git
+WIRESHARK_DIR=wireshark
+LIBPCAP_VERSION=af25cf38dd258f3f1fb5b9b4b731248f022cc732
+TCPDUMP_VERSION=tcpdump-4.2.1
+WIRESHARK_VERSION=wireshark-1.8.9
+
+.PHONY: all
+all: libpcap tcpdump
+
+.PHONY: update
+update: get_libpcap get_tcpdump
+
+.PHONY: install
+install: install_libpcap install_tcpdump
+
+.PHONY: clean
+clean: clean_libpcap clean_tcpdump
+
+.PHONY: libpcap
+libpcap: get_libpcap
+	cd $(LIBPCAP_DIR) \
+	&& git checkout $(LIBPCAP_VERSION) \
+	&& ./configure --with-odp=../../.. --libdir=/usr/lib
+	$(MAKE) -C $(LIBPCAP_DIR)
+
+.PHONY: get_libpcap
+get_libpcap:
+	if [ ! -d $(LIBPCAP_DIR) ]; then git clone $(LIBPCAP_REPO); \
+	else cd $(LIBPCAP_DIR); git fetch --all; fi
+
+.PHONY: install_libpcap
+install_libpcap:
+	$(MAKE) -C $(LIBPCAP_DIR) install
+	if [ -d $(LIBPCAP_DIR) ]; then $(MAKE) -C $(LIBPCAP_DIR) install; fi
+
+.PHONY: clean_libpcap
+clean_libpcap:
+	$(MAKE) -C $(LIBPCAP_DIR) clean
+	if [ -d $(LIBPCAP_DIR) ]; then $(MAKE) -C $(LIBPCAP_DIR) distclean; fi
+
+.PHONY: tcpdump
+tcpdump: get_tcpdump libpcap
+	cd $(TCPDUMP_DIR) \
+	&& git checkout $(TCPDUMP_VERSION) \
+	&& ./configure
+	$(MAKE) -C $(TCPDUMP_DIR)
+
+.PHONY: get_tcpdump
+get_tcpdump:
+	if [ ! -d $(TCPDUMP_DIR) ]; then git clone $(TCPDUMP_REPO); \
+	else cd $(TCPDUMP_DIR); git fetch --all; fi
+
+.PHONY: install_tcpdump
+install_tcpdump:
+	$(MAKE) -C $(TCPDUMP_DIR) install
+	if [ -d $(TCPDUMP_DIR) ]; then $(MAKE) -C $(TCPDUMP_DIR) install; fi
+
+.PHONY: clean_tcpdump
+clean_tcpdump:
+	$(MAKE) -C $(TCPDUMP_DIR) clean
+	if [ -d $(TCPDUMP_DIR) ]; then $(MAKE) -C $(TCPDUMP_DIR) distclean; fi
+
+.PHONY: wireshark
+wireshark: get_wireshark libpcap
+	cd $(WIRESHARK_DIR) \
+	&& git checkout $(WIRESHARK_VERSION) \
+	&& ./autogen.sh && ./configure
+	$(MAKE) -C $(WIRESHARK_DIR)
+
+.PHONY: get_wireshark
+get_wireshark:
+	if [ ! -d $(WIRESHARK_DIR) ]; then git clone $(WIRESHARK_REPO); \
+	else cd $(WIRESHARK_DIR); git fetch --all; fi
+
+.PHONY: install_wireshark
+install_wireshark:
+	$(MAKE) -C $(WIRESHARK_DIR) install
+	if [ -d $(WIRESHARK_DIR) ]; then $(MAKE) -C $(WIRESHARK_DIR) install; fi
+
+.PHONY: clean_wireshark
+clean_wireshark:
+	$(MAKE) -C $(WIRESHARK_DIR) clean
+	if [ -d $(WIRESHARK_DIR) ]; then $(MAKE) -C $(WIRESHARK_DIR) distclean; fi
diff --git a/test/libpcap/README b/test/libpcap/README
new file mode 100644
index 0000000..2b6b86a
--- /dev/null
+++ b/test/libpcap/README
@@ -0,0 +1,47 @@
+ODP libpcap example
+
+This document explains how to test the libpcap which integrate the ODP.
+
+(a) Compiling the libpcap
+
+Must have ODP libs before compiling this example. Make sure those files exist:
+    - <odp_root>/build/include/
+    - <odp_root>/build/lib/libodp.a
+
+build libpcap at <odp_root>/test/libpcap/:
+$> make
+
+or add ODP_HAVE_NETMAP=yes to enable the netmap support:
+$> make ODP_HAVE_NETMAP=yes
+
+install to system:
+$> sudo make install
+
+(b) Testing
+
+test it through tcpdump:
+$> sudo ./tcpdump -ni odp:eth0
+
+test it through wireshark:
+$> sudo ./wireshark -i odp:eth0
+
+test the tcpdump bridge:
+$> sudo ./tcpdump -ni b:eth0,eth1
+
+test it through tcpdump with netmap pktio:
+$> sudo ./tcpdump -ni netmap:eth0
+
+test the tcpdump bridge with netmap pktio:
+$> sudo ./tcpdump -ni netmapb:eth0,eth1
+
+(c) Note
+
+1. Currenly system default tcpdump can't successfully do mlock which is needed
+   in ODP. So this example will use self-build tcpdump instead.
+
+2. Same reason as tcpdump, you can use self-build wireshark if you got mlock
+   related error.
+   $> sudo apt-get install autoconf bison flex libtool libgtk2.0-dev libpcap-dev
+      libc-ares-dev libsmi2-dev libgnutls-dev libgcrypt11-dev libkrb5-dev
+      libcap2-bin libgeoip-dev libortp-dev libportaudio-dev wireshark-dev
+   $> make wireshark
