[Pkg-ofed-commits] [perftest] 01/05: New upstream version 3.4+0.6.gc3435c2

Benjamin Drung bdrung at moszumanska.debian.org
Mon Jan 2 12:55:04 UTC 2017


This is an automated email from the git hooks/post-receive script.

bdrung pushed a commit to branch master
in repository perftest.

commit 99fe4b48ffd1cbd51f98a58f93d0601d81530eca
Author: Benjamin Drung <benjamin.drung at profitbricks.com>
Date:   Mon Jan 2 13:31:06 2017 +0100

    New upstream version 3.4+0.6.gc3435c2
---
 Makefile.am                                        |   6 +-
 Makefile.in                                        |  27 +-
 autom4te.cache/output.0                            | 416 ++++++++++++-
 autom4te.cache/output.1                            | 416 ++++++++++++-
 autom4te.cache/traces.0                            | 162 +++--
 autom4te.cache/traces.1                            | 322 +++++++---
 config.h.in                                        |  28 +-
 configure                                          | 414 ++++++++++++-
 configure.ac                                       |  90 ++-
 perftest.spec                                      |   6 +-
 src/atomic_bw.c                                    |  40 +-
 src/atomic_lat.c                                   |  26 +-
 src/get_clock.c                                    |   5 +-
 src/get_clock.h                                    |   2 +-
 src/perftest_parameters.c                          | 551 +++++++++++++----
 src/perftest_parameters.h                          |  52 +-
 src/perftest_resources.c                           | 654 ++++++++++++++++-----
 src/perftest_resources.h                           |  65 +-
 src/raw_ethernet_resources.c                       | 401 ++++++++++---
 src/raw_ethernet_resources.h                       |  25 +-
 ...et_send_lat.c => raw_ethernet_send_burst_lat.c} | 102 ++--
 src/raw_ethernet_send_bw.c                         | 299 ++++++----
 src/raw_ethernet_send_lat.c                        |  91 ++-
 src/read_bw.c                                      |  55 +-
 src/read_lat.c                                     |  22 +-
 src/send_bw.c                                      |  64 +-
 src/send_lat.c                                     |  46 +-
 src/write_bw.c                                     |  53 +-
 src/write_lat.c                                    |  16 +-
 29 files changed, 3564 insertions(+), 892 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 1926623..f0a0503 100755
--- a/Makefile.am
+++ b/Makefile.am
@@ -24,7 +24,7 @@ bin_SCRIPTS = run_perftest_loopback
 if HAVE_RAW_ETH
 libperftest_a_SOURCES += src/raw_ethernet_resources.c
 noinst_HEADERS += src/raw_ethernet_resources.h
-bin_PROGRAMS += raw_ethernet_bw raw_ethernet_lat
+bin_PROGRAMS += raw_ethernet_bw raw_ethernet_lat raw_ethernet_burst_lat
 else
 libperftest_a_SOURCES +=
 noinst_HEADERS +=
@@ -70,6 +70,10 @@ raw_ethernet_bw_LDADD = libperftest.a $(LIBMATH) $(LIBMLX4) $(LIBMLX5)
 raw_ethernet_lat_SOURCES = src/raw_ethernet_send_lat.c
 raw_ethernet_lat_LDADD = libperftest.a $(LIBMATH) $(LIBMLX4) $(LIBMLX5)
 
+raw_ethernet_burst_lat_SOURCES = src/raw_ethernet_send_burst_lat.c
+raw_ethernet_burst_lat_LDADD = libperftest.a $(LIBMATH) $(LIBMLX4) $(LIBMLX5)
+
+
 else
 raw_ethernet_bw_SOURCES =
 raw_ethernet_bw_LDADD =
diff --git a/Makefile.in b/Makefile.in
index 60e58f9..2cff486 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -101,7 +101,7 @@ bin_PROGRAMS = ib_send_bw$(EXEEXT) ib_send_lat$(EXEEXT) \
 	$(am__EXEEXT_2)
 @HAVE_RAW_ETH_TRUE at am__append_1 = src/raw_ethernet_resources.c
 @HAVE_RAW_ETH_TRUE at am__append_2 = src/raw_ethernet_resources.h
- at HAVE_RAW_ETH_TRUE@am__append_3 = raw_ethernet_bw raw_ethernet_lat
+ at HAVE_RAW_ETH_TRUE@am__append_3 = raw_ethernet_bw raw_ethernet_lat raw_ethernet_burst_lat
 @HAVE_RAW_ETH_FALSE at am__append_4 = 
 @HAVE_RAW_ETH_FALSE at am__append_5 = 
 @HAVE_RAW_ETH_FALSE at am__append_6 = 
@@ -148,7 +148,8 @@ am_libperftest_a_OBJECTS = src/get_clock.$(OBJEXT) \
 	$(am__objects_2)
 libperftest_a_OBJECTS = $(am_libperftest_a_OBJECTS)
 @HAVE_RAW_ETH_TRUE at am__EXEEXT_1 = raw_ethernet_bw$(EXEEXT) \
- at HAVE_RAW_ETH_TRUE@	raw_ethernet_lat$(EXEEXT)
+ at HAVE_RAW_ETH_TRUE@	raw_ethernet_lat$(EXEEXT) \
+ at HAVE_RAW_ETH_TRUE@	raw_ethernet_burst_lat$(EXEEXT)
 am__EXEEXT_2 =
 am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
 PROGRAMS = $(bin_PROGRAMS)
@@ -193,6 +194,14 @@ am_ib_write_lat_OBJECTS = src/write_lat.$(OBJEXT)
 ib_write_lat_OBJECTS = $(am_ib_write_lat_OBJECTS)
 ib_write_lat_DEPENDENCIES = libperftest.a $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am__raw_ethernet_burst_lat_SOURCES_DIST =  \
+	src/raw_ethernet_send_burst_lat.c
+ at HAVE_RAW_ETH_TRUE@am_raw_ethernet_burst_lat_OBJECTS =  \
+ at HAVE_RAW_ETH_TRUE@	src/raw_ethernet_send_burst_lat.$(OBJEXT)
+raw_ethernet_burst_lat_OBJECTS = $(am_raw_ethernet_burst_lat_OBJECTS)
+ at HAVE_RAW_ETH_TRUE@raw_ethernet_burst_lat_DEPENDENCIES =  \
+ at HAVE_RAW_ETH_TRUE@	libperftest.a $(am__DEPENDENCIES_1) \
+ at HAVE_RAW_ETH_TRUE@	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
 am__raw_ethernet_bw_SOURCES_DIST = src/raw_ethernet_send_bw.c
 @HAVE_RAW_ETH_TRUE at am_raw_ethernet_bw_OBJECTS =  \
 @HAVE_RAW_ETH_TRUE@	src/raw_ethernet_send_bw.$(OBJEXT)
@@ -273,13 +282,14 @@ SOURCES = $(libperftest_a_SOURCES) $(ib_atomic_bw_SOURCES) \
 	$(ib_atomic_lat_SOURCES) $(ib_read_bw_SOURCES) \
 	$(ib_read_lat_SOURCES) $(ib_send_bw_SOURCES) \
 	$(ib_send_lat_SOURCES) $(ib_write_bw_SOURCES) \
-	$(ib_write_lat_SOURCES) $(raw_ethernet_bw_SOURCES) \
-	$(raw_ethernet_lat_SOURCES)
+	$(ib_write_lat_SOURCES) $(raw_ethernet_burst_lat_SOURCES) \
+	$(raw_ethernet_bw_SOURCES) $(raw_ethernet_lat_SOURCES)
 DIST_SOURCES = $(am__libperftest_a_SOURCES_DIST) \
 	$(ib_atomic_bw_SOURCES) $(ib_atomic_lat_SOURCES) \
 	$(ib_read_bw_SOURCES) $(ib_read_lat_SOURCES) \
 	$(ib_send_bw_SOURCES) $(ib_send_lat_SOURCES) \
 	$(ib_write_bw_SOURCES) $(ib_write_lat_SOURCES) \
+	$(am__raw_ethernet_burst_lat_SOURCES_DIST) \
 	$(am__raw_ethernet_bw_SOURCES_DIST) \
 	$(am__raw_ethernet_lat_SOURCES_DIST)
 am__can_run_installinfo = \
@@ -495,6 +505,8 @@ ib_atomic_bw_LDADD = libperftest.a $(LIBMATH) $(LIBMLX4) $(LIBMLX5)
 @HAVE_RAW_ETH_TRUE at raw_ethernet_lat_SOURCES = src/raw_ethernet_send_lat.c
 @HAVE_RAW_ETH_FALSE at raw_ethernet_lat_LDADD = 
 @HAVE_RAW_ETH_TRUE at raw_ethernet_lat_LDADD = libperftest.a $(LIBMATH) $(LIBMLX4) $(LIBMLX5)
+ at HAVE_RAW_ETH_TRUE@raw_ethernet_burst_lat_SOURCES = src/raw_ethernet_send_burst_lat.c
+ at HAVE_RAW_ETH_TRUE@raw_ethernet_burst_lat_LDADD = libperftest.a $(LIBMATH) $(LIBMLX4) $(LIBMLX5)
 all: config.h
 	$(MAKE) $(AM_MAKEFLAGS) all-am
 
@@ -672,6 +684,12 @@ src/write_lat.$(OBJEXT): src/$(am__dirstamp) \
 ib_write_lat$(EXEEXT): $(ib_write_lat_OBJECTS) $(ib_write_lat_DEPENDENCIES) $(EXTRA_ib_write_lat_DEPENDENCIES) 
 	@rm -f ib_write_lat$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ib_write_lat_OBJECTS) $(ib_write_lat_LDADD) $(LIBS)
+src/raw_ethernet_send_burst_lat.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+
+raw_ethernet_burst_lat$(EXEEXT): $(raw_ethernet_burst_lat_OBJECTS) $(raw_ethernet_burst_lat_DEPENDENCIES) $(EXTRA_raw_ethernet_burst_lat_DEPENDENCIES) 
+	@rm -f raw_ethernet_burst_lat$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(raw_ethernet_burst_lat_OBJECTS) $(raw_ethernet_burst_lat_LDADD) $(LIBS)
 src/raw_ethernet_send_bw.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 
@@ -735,6 +753,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/perftest_parameters.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/perftest_resources.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/raw_ethernet_resources.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/raw_ethernet_send_burst_lat.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/raw_ethernet_send_bw.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/raw_ethernet_send_lat.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/read_bw.Po at am__quote@
diff --git a/autom4te.cache/output.0 b/autom4te.cache/output.0
index 38e70b0..811e654 100644
--- a/autom4te.cache/output.0
+++ b/autom4te.cache/output.0
@@ -638,12 +638,28 @@ LTLIBOBJS
 LIB@&t at OBJS
 LIBMATH
 LIBUMAD
+HAVE_PACKET_PACING_FALSE
+HAVE_PACKET_PACING_TRUE
+HAVE_PACKET_PACING_EXP_FALSE
+HAVE_PACKET_PACING_EXP_TRUE
 HAVE_GID_ATTR_FALSE
 HAVE_GID_ATTR_TRUE
 HAVE_SCATTER_FCS_FALSE
 HAVE_SCATTER_FCS_TRUE
-HAVE_ODP_FALSE
-HAVE_ODP_TRUE
+HAVE_EXP_ODP_FALSE
+HAVE_EXP_ODP_TRUE
+HAVE_EX_ODP_FALSE
+HAVE_EX_ODP_TRUE
+HAVE_EX_FALSE
+HAVE_EX_TRUE
+HAVE_SNIFFER_FALSE
+HAVE_SNIFFER_TRUE
+HAVE_SNIFFER_EXP_FALSE
+HAVE_SNIFFER_EXP_TRUE
+HAVE_IPV4_EXT_FALSE
+HAVE_IPV4_EXT_TRUE
+HAVE_IPV6_FALSE
+HAVE_IPV6_TRUE
 HAVE_ACCL_VERBS_FALSE
 HAVE_ACCL_VERBS_TRUE
 HAVE_DC_FALSE
@@ -16103,36 +16119,304 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 #include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_FLOW_SPEC_IPV6;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV6=yes
+else
+  HAVE_IPV6=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV6" = "xyes"; then
+  HAVE_IPV6_TRUE=
+  HAVE_IPV6_FALSE='#'
+else
+  HAVE_IPV6_TRUE='#'
+  HAVE_IPV6_FALSE=
+fi
+
+if test $HAVE_IPV6 = yes && test $HAVE_VERBS_EXP = no; then
+        
+$as_echo "@%:@define HAVE_IPV6 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
 #include <infiniband/verbs_exp.h>
 int
 main ()
 {
-int x = IBV_EXP_ACCESS_ON_DEMAND;
+int x = IBV_EXP_FLOW_SPEC_IPV6_EXT;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV6=yes
+else
+  HAVE_IPV6=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV6" = "xyes"; then
+  HAVE_IPV6_TRUE=
+  HAVE_IPV6_FALSE='#'
+else
+  HAVE_IPV6_TRUE='#'
+  HAVE_IPV6_FALSE=
+fi
+
+if test $HAVE_IPV6 = yes && test $HAVE_VERBS_EXP = yes; then
+        
+$as_echo "@%:@define HAVE_IPV6 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_FLOW_SPEC_IPV4_EXT;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV4_EXT=yes
+else
+  HAVE_IPV4_EXT=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV4_EXT" = "xyes"; then
+  HAVE_IPV4_EXT_TRUE=
+  HAVE_IPV4_EXT_FALSE='#'
+else
+  HAVE_IPV4_EXT_TRUE='#'
+  HAVE_IPV4_EXT_FALSE=
+fi
+
+if test $HAVE_IPV4_EXT = yes && test $HAVE_VERBS_EXP = yes; then
+        
+$as_echo "@%:@define HAVE_IPV4_EXT 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_FLOW_SPEC_IPV4_EXT;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV4_EXT=yes
+else
+  HAVE_IPV4_EXT=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV4_EXT" = "xyes"; then
+  HAVE_IPV4_EXT_TRUE=
+  HAVE_IPV4_EXT_FALSE='#'
+else
+  HAVE_IPV4_EXT_TRUE='#'
+  HAVE_IPV4_EXT_FALSE=
+fi
+
+if test $HAVE_IPV4_EXT = yes && test $HAVE_VERBS_EXP = no; then
+        
+$as_echo "@%:@define HAVE_IPV4_EXT 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_FLOW_ATTR_SNIFFER;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_SNIFFER_EXP=yes
+else
+  HAVE_SNIFFER_EXP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_SNIFFER_EXP" = "xyes"; then
+  HAVE_SNIFFER_EXP_TRUE=
+  HAVE_SNIFFER_EXP_FALSE='#'
+else
+  HAVE_SNIFFER_EXP_TRUE='#'
+  HAVE_SNIFFER_EXP_FALSE=
+fi
+
+if test $HAVE_SNIFFER_EXP = yes && test $HAVE_VERBS_EXP = yes; then
+        
+$as_echo "@%:@define HAVE_SNIFFER_EXP 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_FLOW_ATTR_SNIFFER;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_SNIFFER=yes
+else
+  HAVE_SNIFFER=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_SNIFFER" = "xyes"; then
+  HAVE_SNIFFER_TRUE=
+  HAVE_SNIFFER_FALSE='#'
+else
+  HAVE_SNIFFER_TRUE='#'
+  HAVE_SNIFFER_FALSE=
+fi
+
+if test $HAVE_SNIFFER = yes && test $HAVE_VERBS_EXP = no; then
+        
+$as_echo "@%:@define HAVE_SNIFFER 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <infiniband/verbs.h>
+int
+main ()
+{
+struct ibv_device_attr_ex *attr_ex; int x = attr_ex->comp_mask;
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  HAVE_ODP=yes
+  HAVE_EX=yes
 else
-  HAVE_ODP=no
+  HAVE_EX=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
- if test "x$HAVE_ODP" = "xyes"; then
-  HAVE_ODP_TRUE=
-  HAVE_ODP_FALSE='#'
+ if test "x$HAVE_EX" = "xyes"; then
+  HAVE_EX_TRUE=
+  HAVE_EX_FALSE='#'
 else
-  HAVE_ODP_TRUE='#'
-  HAVE_ODP_FALSE=
+  HAVE_EX_TRUE='#'
+  HAVE_EX_FALSE=
+fi
+
+if test $HAVE_EX = yes; then
+	
+$as_echo "@%:@define HAVE_EX 1" >>confdefs.h
+
 fi
 
-if test $HAVE_ODP = yes && test $HAVE_VERBS_EXP = yes; then
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_ACCESS_ON_DEMAND;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_EX_ODP=yes
+else
+  HAVE_EX_ODP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_EX_ODP" = "xyes"; then
+  HAVE_EX_ODP_TRUE=
+  HAVE_EX_ODP_FALSE='#'
+else
+  HAVE_EX_ODP_TRUE='#'
+  HAVE_EX_ODP_FALSE=
+fi
+
+if test $HAVE_EX_ODP = yes && test $HAVE_EX = yes; then
         
-$as_echo "@%:@define HAVE_ODP 1" >>confdefs.h
+$as_echo "@%:@define HAVE_EX_ODP 1" >>confdefs.h
 
 fi
 
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_ACCESS_ON_DEMAND;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_EXP_ODP=yes
+else
+  HAVE_EXP_ODP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_EXP_ODP" = "xyes"; then
+  HAVE_EXP_ODP_TRUE=
+  HAVE_EXP_ODP_FALSE='#'
+else
+  HAVE_EXP_ODP_TRUE='#'
+  HAVE_EXP_ODP_FALSE=
+fi
+
+if test $HAVE_EXP_ODP = yes ; then
+	if  test $HAVE_EX_ODP = no ; then
+		
+$as_echo "@%:@define HAVE_EXP_ODP 1" >>confdefs.h
+
+	fi
+fi
+
 if test "$CUDA_H_PATH" ; then
 	
 $as_echo "@%:@define HAVE_CUDA 1" >>confdefs.h
@@ -16213,6 +16497,70 @@ $as_echo "@%:@define HAVE_GID_ATTR 1" >>confdefs.h
 
 fi
 
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <infiniband/verbs.h>
+int
+main ()
+{
+struct ibv_exp_qp_attr *attr; int x = attr->rate_limit;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_PACKET_PACING_EXP=yes
+else
+  HAVE_PACKET_PACING_EXP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_PACKET_PACING_EXP" = "xyes"; then
+  HAVE_PACKET_PACING_EXP_TRUE=
+  HAVE_PACKET_PACING_EXP_FALSE='#'
+else
+  HAVE_PACKET_PACING_EXP_TRUE='#'
+  HAVE_PACKET_PACING_EXP_FALSE=
+fi
+
+if test $HAVE_PACKET_PACING_EXP = yes && test $HAVE_VERBS_EXP = yes; then
+	
+$as_echo "@%:@define HAVE_PACKET_PACING_EXP 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <infiniband/verbs.h>
+int
+main ()
+{
+struct ibv_qp_attr *attr; int x = attr->rate_limit;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_PACKET_PACING=yes
+else
+  HAVE_PACKET_PACING=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_PACKET_PACING" = "xyes"; then
+  HAVE_PACKET_PACING_TRUE=
+  HAVE_PACKET_PACING_FALSE='#'
+else
+  HAVE_PACKET_PACING_TRUE='#'
+  HAVE_PACKET_PACING_FALSE=
+fi
+
+if test $HAVE_PACKET_PACING = yes; then
+	
+$as_echo "@%:@define HAVE_PACKET_PACING 1" >>confdefs.h
+
+fi
+
 CFLAGS="-g -Wall -D_GNU_SOURCE -O3"
 
 
@@ -16411,8 +16759,40 @@ if test -z "${HAVE_ACCL_VERBS_TRUE}" && test -z "${HAVE_ACCL_VERBS_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_ACCL_VERBS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${HAVE_ODP_TRUE}" && test -z "${HAVE_ODP_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_ODP\" was never defined.
+if test -z "${HAVE_IPV6_TRUE}" && test -z "${HAVE_IPV6_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV6\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_IPV6_TRUE}" && test -z "${HAVE_IPV6_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV6\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_IPV4_EXT_TRUE}" && test -z "${HAVE_IPV4_EXT_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV4_EXT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_IPV4_EXT_TRUE}" && test -z "${HAVE_IPV4_EXT_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV4_EXT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_SNIFFER_EXP_TRUE}" && test -z "${HAVE_SNIFFER_EXP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_SNIFFER_EXP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_SNIFFER_TRUE}" && test -z "${HAVE_SNIFFER_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_SNIFFER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_EX_TRUE}" && test -z "${HAVE_EX_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_EX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_EX_ODP_TRUE}" && test -z "${HAVE_EX_ODP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_EX_ODP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_EXP_ODP_TRUE}" && test -z "${HAVE_EXP_ODP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_EXP_ODP\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${HAVE_SCATTER_FCS_TRUE}" && test -z "${HAVE_SCATTER_FCS_FALSE}"; then
@@ -16423,6 +16803,14 @@ if test -z "${HAVE_GID_ATTR_TRUE}" && test -z "${HAVE_GID_ATTR_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_GID_ATTR\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_PACKET_PACING_EXP_TRUE}" && test -z "${HAVE_PACKET_PACING_EXP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PACKET_PACING_EXP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PACKET_PACING_TRUE}" && test -z "${HAVE_PACKET_PACING_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PACKET_PACING\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
 : "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
diff --git a/autom4te.cache/output.1 b/autom4te.cache/output.1
index b4f15e1..b6fe298 100644
--- a/autom4te.cache/output.1
+++ b/autom4te.cache/output.1
@@ -638,12 +638,28 @@ LTLIBOBJS
 LIB@&t at OBJS
 LIBMATH
 LIBUMAD
+HAVE_PACKET_PACING_FALSE
+HAVE_PACKET_PACING_TRUE
+HAVE_PACKET_PACING_EXP_FALSE
+HAVE_PACKET_PACING_EXP_TRUE
 HAVE_GID_ATTR_FALSE
 HAVE_GID_ATTR_TRUE
 HAVE_SCATTER_FCS_FALSE
 HAVE_SCATTER_FCS_TRUE
-HAVE_ODP_FALSE
-HAVE_ODP_TRUE
+HAVE_EXP_ODP_FALSE
+HAVE_EXP_ODP_TRUE
+HAVE_EX_ODP_FALSE
+HAVE_EX_ODP_TRUE
+HAVE_EX_FALSE
+HAVE_EX_TRUE
+HAVE_SNIFFER_FALSE
+HAVE_SNIFFER_TRUE
+HAVE_SNIFFER_EXP_FALSE
+HAVE_SNIFFER_EXP_TRUE
+HAVE_IPV4_EXT_FALSE
+HAVE_IPV4_EXT_TRUE
+HAVE_IPV6_FALSE
+HAVE_IPV6_TRUE
 HAVE_ACCL_VERBS_FALSE
 HAVE_ACCL_VERBS_TRUE
 HAVE_DC_FALSE
@@ -16099,36 +16115,304 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 #include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_FLOW_SPEC_IPV6;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV6=yes
+else
+  HAVE_IPV6=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV6" = "xyes"; then
+  HAVE_IPV6_TRUE=
+  HAVE_IPV6_FALSE='#'
+else
+  HAVE_IPV6_TRUE='#'
+  HAVE_IPV6_FALSE=
+fi
+
+if test $HAVE_IPV6 = yes && test $HAVE_VERBS_EXP = no; then
+        
+$as_echo "@%:@define HAVE_IPV6 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
 #include <infiniband/verbs_exp.h>
 int
 main ()
 {
-int x = IBV_EXP_ACCESS_ON_DEMAND;
+int x = IBV_EXP_FLOW_SPEC_IPV6_EXT;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV6=yes
+else
+  HAVE_IPV6=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV6" = "xyes"; then
+  HAVE_IPV6_TRUE=
+  HAVE_IPV6_FALSE='#'
+else
+  HAVE_IPV6_TRUE='#'
+  HAVE_IPV6_FALSE=
+fi
+
+if test $HAVE_IPV6 = yes && test $HAVE_VERBS_EXP = yes; then
+        
+$as_echo "@%:@define HAVE_IPV6 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_FLOW_SPEC_IPV4_EXT;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV4_EXT=yes
+else
+  HAVE_IPV4_EXT=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV4_EXT" = "xyes"; then
+  HAVE_IPV4_EXT_TRUE=
+  HAVE_IPV4_EXT_FALSE='#'
+else
+  HAVE_IPV4_EXT_TRUE='#'
+  HAVE_IPV4_EXT_FALSE=
+fi
+
+if test $HAVE_IPV4_EXT = yes && test $HAVE_VERBS_EXP = yes; then
+        
+$as_echo "@%:@define HAVE_IPV4_EXT 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_FLOW_SPEC_IPV4_EXT;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV4_EXT=yes
+else
+  HAVE_IPV4_EXT=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV4_EXT" = "xyes"; then
+  HAVE_IPV4_EXT_TRUE=
+  HAVE_IPV4_EXT_FALSE='#'
+else
+  HAVE_IPV4_EXT_TRUE='#'
+  HAVE_IPV4_EXT_FALSE=
+fi
+
+if test $HAVE_IPV4_EXT = yes && test $HAVE_VERBS_EXP = no; then
+        
+$as_echo "@%:@define HAVE_IPV4_EXT 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_FLOW_ATTR_SNIFFER;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_SNIFFER_EXP=yes
+else
+  HAVE_SNIFFER_EXP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_SNIFFER_EXP" = "xyes"; then
+  HAVE_SNIFFER_EXP_TRUE=
+  HAVE_SNIFFER_EXP_FALSE='#'
+else
+  HAVE_SNIFFER_EXP_TRUE='#'
+  HAVE_SNIFFER_EXP_FALSE=
+fi
+
+if test $HAVE_SNIFFER_EXP = yes && test $HAVE_VERBS_EXP = yes; then
+        
+$as_echo "@%:@define HAVE_SNIFFER_EXP 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_FLOW_ATTR_SNIFFER;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_SNIFFER=yes
+else
+  HAVE_SNIFFER=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_SNIFFER" = "xyes"; then
+  HAVE_SNIFFER_TRUE=
+  HAVE_SNIFFER_FALSE='#'
+else
+  HAVE_SNIFFER_TRUE='#'
+  HAVE_SNIFFER_FALSE=
+fi
+
+if test $HAVE_SNIFFER = yes && test $HAVE_VERBS_EXP = no; then
+        
+$as_echo "@%:@define HAVE_SNIFFER 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <infiniband/verbs.h>
+int
+main ()
+{
+struct ibv_device_attr_ex *attr_ex; int x = attr_ex->comp_mask;
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  HAVE_ODP=yes
+  HAVE_EX=yes
 else
-  HAVE_ODP=no
+  HAVE_EX=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
- if test "x$HAVE_ODP" = "xyes"; then
-  HAVE_ODP_TRUE=
-  HAVE_ODP_FALSE='#'
+ if test "x$HAVE_EX" = "xyes"; then
+  HAVE_EX_TRUE=
+  HAVE_EX_FALSE='#'
 else
-  HAVE_ODP_TRUE='#'
-  HAVE_ODP_FALSE=
+  HAVE_EX_TRUE='#'
+  HAVE_EX_FALSE=
+fi
+
+if test $HAVE_EX = yes; then
+	
+$as_echo "@%:@define HAVE_EX 1" >>confdefs.h
+
 fi
 
-if test $HAVE_ODP = yes && test $HAVE_VERBS_EXP = yes; then
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_ACCESS_ON_DEMAND;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_EX_ODP=yes
+else
+  HAVE_EX_ODP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_EX_ODP" = "xyes"; then
+  HAVE_EX_ODP_TRUE=
+  HAVE_EX_ODP_FALSE='#'
+else
+  HAVE_EX_ODP_TRUE='#'
+  HAVE_EX_ODP_FALSE=
+fi
+
+if test $HAVE_EX_ODP = yes && test $HAVE_EX = yes; then
         
-$as_echo "@%:@define HAVE_ODP 1" >>confdefs.h
+$as_echo "@%:@define HAVE_EX_ODP 1" >>confdefs.h
 
 fi
 
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_ACCESS_ON_DEMAND;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_EXP_ODP=yes
+else
+  HAVE_EXP_ODP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_EXP_ODP" = "xyes"; then
+  HAVE_EXP_ODP_TRUE=
+  HAVE_EXP_ODP_FALSE='#'
+else
+  HAVE_EXP_ODP_TRUE='#'
+  HAVE_EXP_ODP_FALSE=
+fi
+
+if test $HAVE_EXP_ODP = yes ; then
+	if  test $HAVE_EX_ODP = no ; then
+		
+$as_echo "@%:@define HAVE_EXP_ODP 1" >>confdefs.h
+
+	fi
+fi
+
 if test "$CUDA_H_PATH" ; then
 	
 $as_echo "@%:@define HAVE_CUDA 1" >>confdefs.h
@@ -16209,6 +16493,70 @@ $as_echo "@%:@define HAVE_GID_ATTR 1" >>confdefs.h
 
 fi
 
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <infiniband/verbs.h>
+int
+main ()
+{
+struct ibv_exp_qp_attr *attr; int x = attr->rate_limit;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_PACKET_PACING_EXP=yes
+else
+  HAVE_PACKET_PACING_EXP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_PACKET_PACING_EXP" = "xyes"; then
+  HAVE_PACKET_PACING_EXP_TRUE=
+  HAVE_PACKET_PACING_EXP_FALSE='#'
+else
+  HAVE_PACKET_PACING_EXP_TRUE='#'
+  HAVE_PACKET_PACING_EXP_FALSE=
+fi
+
+if test $HAVE_PACKET_PACING_EXP = yes && test $HAVE_VERBS_EXP = yes; then
+	
+$as_echo "@%:@define HAVE_PACKET_PACING_EXP 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <infiniband/verbs.h>
+int
+main ()
+{
+struct ibv_qp_attr *attr; int x = attr->rate_limit;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_PACKET_PACING=yes
+else
+  HAVE_PACKET_PACING=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_PACKET_PACING" = "xyes"; then
+  HAVE_PACKET_PACING_TRUE=
+  HAVE_PACKET_PACING_FALSE='#'
+else
+  HAVE_PACKET_PACING_TRUE='#'
+  HAVE_PACKET_PACING_FALSE=
+fi
+
+if test $HAVE_PACKET_PACING = yes; then
+	
+$as_echo "@%:@define HAVE_PACKET_PACING 1" >>confdefs.h
+
+fi
+
 CFLAGS="-g -Wall -D_GNU_SOURCE -O3"
 
 
@@ -16407,8 +16755,40 @@ if test -z "${HAVE_ACCL_VERBS_TRUE}" && test -z "${HAVE_ACCL_VERBS_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_ACCL_VERBS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${HAVE_ODP_TRUE}" && test -z "${HAVE_ODP_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_ODP\" was never defined.
+if test -z "${HAVE_IPV6_TRUE}" && test -z "${HAVE_IPV6_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV6\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_IPV6_TRUE}" && test -z "${HAVE_IPV6_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV6\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_IPV4_EXT_TRUE}" && test -z "${HAVE_IPV4_EXT_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV4_EXT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_IPV4_EXT_TRUE}" && test -z "${HAVE_IPV4_EXT_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV4_EXT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_SNIFFER_EXP_TRUE}" && test -z "${HAVE_SNIFFER_EXP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_SNIFFER_EXP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_SNIFFER_TRUE}" && test -z "${HAVE_SNIFFER_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_SNIFFER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_EX_TRUE}" && test -z "${HAVE_EX_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_EX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_EX_ODP_TRUE}" && test -z "${HAVE_EX_ODP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_EX_ODP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_EXP_ODP_TRUE}" && test -z "${HAVE_EXP_ODP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_EXP_ODP\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${HAVE_SCATTER_FCS_TRUE}" && test -z "${HAVE_SCATTER_FCS_FALSE}"; then
@@ -16419,6 +16799,14 @@ if test -z "${HAVE_GID_ATTR_TRUE}" && test -z "${HAVE_GID_ATTR_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_GID_ATTR\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_PACKET_PACING_EXP_TRUE}" && test -z "${HAVE_PACKET_PACING_EXP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PACKET_PACING_EXP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PACKET_PACING_TRUE}" && test -z "${HAVE_PACKET_PACING_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PACKET_PACING\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
 : "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
diff --git a/autom4te.cache/traces.0 b/autom4te.cache/traces.0
index 5ac91b5..2cf5cc4 100644
--- a/autom4te.cache/traces.0
+++ b/autom4te.cache/traces.0
@@ -2677,41 +2677,131 @@ m4trace:configure.ac:156: -1- m4_pattern_allow([^HAVE_ACCL_VERBS$])
 m4trace:configure.ac:159: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
 configure.ac:159: the top level])
-m4trace:configure.ac:163: -1- AM_CONDITIONAL([HAVE_ODP], [test "x$HAVE_ODP" = "xyes"])
-m4trace:configure.ac:163: -1- m4_pattern_allow([^HAVE_ODP_TRUE$])
-m4trace:configure.ac:163: -1- m4_pattern_allow([^HAVE_ODP_FALSE$])
-m4trace:configure.ac:163: -1- _AM_SUBST_NOTMAKE([HAVE_ODP_TRUE])
-m4trace:configure.ac:163: -1- _AM_SUBST_NOTMAKE([HAVE_ODP_FALSE])
-m4trace:configure.ac:165: -1- m4_pattern_allow([^HAVE_ODP$])
-m4trace:configure.ac:169: -1- m4_pattern_allow([^HAVE_CUDA$])
-m4trace:configure.ac:170: -1- m4_pattern_allow([^CUDA_PATH$])
-m4trace:configure.ac:174: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:162: -1- AM_CONDITIONAL([HAVE_IPV6], [test "x$HAVE_IPV6" = "xyes"])
+m4trace:configure.ac:162: -1- m4_pattern_allow([^HAVE_IPV6_TRUE$])
+m4trace:configure.ac:162: -1- m4_pattern_allow([^HAVE_IPV6_FALSE$])
+m4trace:configure.ac:162: -1- _AM_SUBST_NOTMAKE([HAVE_IPV6_TRUE])
+m4trace:configure.ac:162: -1- _AM_SUBST_NOTMAKE([HAVE_IPV6_FALSE])
+m4trace:configure.ac:164: -1- m4_pattern_allow([^HAVE_IPV6$])
+m4trace:configure.ac:167: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
-configure.ac:174: the top level])
-m4trace:configure.ac:178: -1- AM_CONDITIONAL([HAVE_SCATTER_FCS], [test "x$HAVE_SCATTER_FCS" = "xyes"])
-m4trace:configure.ac:178: -1- m4_pattern_allow([^HAVE_SCATTER_FCS_TRUE$])
-m4trace:configure.ac:178: -1- m4_pattern_allow([^HAVE_SCATTER_FCS_FALSE$])
-m4trace:configure.ac:178: -1- _AM_SUBST_NOTMAKE([HAVE_SCATTER_FCS_TRUE])
-m4trace:configure.ac:178: -1- _AM_SUBST_NOTMAKE([HAVE_SCATTER_FCS_FALSE])
-m4trace:configure.ac:180: -1- m4_pattern_allow([^HAVE_SCATTER_FCS$])
-m4trace:configure.ac:183: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:167: the top level])
+m4trace:configure.ac:171: -1- AM_CONDITIONAL([HAVE_IPV6], [test "x$HAVE_IPV6" = "xyes"])
+m4trace:configure.ac:171: -1- m4_pattern_allow([^HAVE_IPV6_TRUE$])
+m4trace:configure.ac:171: -1- m4_pattern_allow([^HAVE_IPV6_FALSE$])
+m4trace:configure.ac:171: -1- _AM_SUBST_NOTMAKE([HAVE_IPV6_TRUE])
+m4trace:configure.ac:171: -1- _AM_SUBST_NOTMAKE([HAVE_IPV6_FALSE])
+m4trace:configure.ac:173: -1- m4_pattern_allow([^HAVE_IPV6$])
+m4trace:configure.ac:176: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
-configure.ac:183: the top level])
-m4trace:configure.ac:187: -1- AM_CONDITIONAL([HAVE_GID_ATTR], [test "x$HAVE_GID_ATTR" = "xyes"])
-m4trace:configure.ac:187: -1- m4_pattern_allow([^HAVE_GID_ATTR_TRUE$])
-m4trace:configure.ac:187: -1- m4_pattern_allow([^HAVE_GID_ATTR_FALSE$])
-m4trace:configure.ac:187: -1- _AM_SUBST_NOTMAKE([HAVE_GID_ATTR_TRUE])
-m4trace:configure.ac:187: -1- _AM_SUBST_NOTMAKE([HAVE_GID_ATTR_FALSE])
-m4trace:configure.ac:189: -1- m4_pattern_allow([^HAVE_GID_ATTR$])
-m4trace:configure.ac:193: -1- m4_pattern_allow([^LIBUMAD$])
-m4trace:configure.ac:194: -1- m4_pattern_allow([^LIBMATH$])
-m4trace:configure.ac:196: -1- m4_pattern_allow([^LIB@&t at OBJS$])
-m4trace:configure.ac:196: -1- m4_pattern_allow([^LTLIBOBJS$])
-m4trace:configure.ac:196: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
-m4trace:configure.ac:196: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
-m4trace:configure.ac:196: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
-m4trace:configure.ac:196: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
-m4trace:configure.ac:196: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
-m4trace:configure.ac:196: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"])
-m4trace:configure.ac:196: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS
-m4trace:configure.ac:196: -1- _LT_PROG_LTMAIN
+configure.ac:176: the top level])
+m4trace:configure.ac:180: -1- AM_CONDITIONAL([HAVE_IPV4_EXT], [test "x$HAVE_IPV4_EXT" = "xyes"])
+m4trace:configure.ac:180: -1- m4_pattern_allow([^HAVE_IPV4_EXT_TRUE$])
+m4trace:configure.ac:180: -1- m4_pattern_allow([^HAVE_IPV4_EXT_FALSE$])
+m4trace:configure.ac:180: -1- _AM_SUBST_NOTMAKE([HAVE_IPV4_EXT_TRUE])
+m4trace:configure.ac:180: -1- _AM_SUBST_NOTMAKE([HAVE_IPV4_EXT_FALSE])
+m4trace:configure.ac:182: -1- m4_pattern_allow([^HAVE_IPV4_EXT$])
+m4trace:configure.ac:185: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:185: the top level])
+m4trace:configure.ac:188: -1- AM_CONDITIONAL([HAVE_IPV4_EXT], [test "x$HAVE_IPV4_EXT" = "xyes"])
+m4trace:configure.ac:188: -1- m4_pattern_allow([^HAVE_IPV4_EXT_TRUE$])
+m4trace:configure.ac:188: -1- m4_pattern_allow([^HAVE_IPV4_EXT_FALSE$])
+m4trace:configure.ac:188: -1- _AM_SUBST_NOTMAKE([HAVE_IPV4_EXT_TRUE])
+m4trace:configure.ac:188: -1- _AM_SUBST_NOTMAKE([HAVE_IPV4_EXT_FALSE])
+m4trace:configure.ac:190: -1- m4_pattern_allow([^HAVE_IPV4_EXT$])
+m4trace:configure.ac:193: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:193: the top level])
+m4trace:configure.ac:197: -1- AM_CONDITIONAL([HAVE_SNIFFER_EXP], [test "x$HAVE_SNIFFER_EXP" = "xyes"])
+m4trace:configure.ac:197: -1- m4_pattern_allow([^HAVE_SNIFFER_EXP_TRUE$])
+m4trace:configure.ac:197: -1- m4_pattern_allow([^HAVE_SNIFFER_EXP_FALSE$])
+m4trace:configure.ac:197: -1- _AM_SUBST_NOTMAKE([HAVE_SNIFFER_EXP_TRUE])
+m4trace:configure.ac:197: -1- _AM_SUBST_NOTMAKE([HAVE_SNIFFER_EXP_FALSE])
+m4trace:configure.ac:199: -1- m4_pattern_allow([^HAVE_SNIFFER_EXP$])
+m4trace:configure.ac:202: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:202: the top level])
+m4trace:configure.ac:205: -1- AM_CONDITIONAL([HAVE_SNIFFER], [test "x$HAVE_SNIFFER" = "xyes"])
+m4trace:configure.ac:205: -1- m4_pattern_allow([^HAVE_SNIFFER_TRUE$])
+m4trace:configure.ac:205: -1- m4_pattern_allow([^HAVE_SNIFFER_FALSE$])
+m4trace:configure.ac:205: -1- _AM_SUBST_NOTMAKE([HAVE_SNIFFER_TRUE])
+m4trace:configure.ac:205: -1- _AM_SUBST_NOTMAKE([HAVE_SNIFFER_FALSE])
+m4trace:configure.ac:207: -1- m4_pattern_allow([^HAVE_SNIFFER$])
+m4trace:configure.ac:210: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:210: the top level])
+m4trace:configure.ac:212: -1- AM_CONDITIONAL([HAVE_EX], [test "x$HAVE_EX" = "xyes"])
+m4trace:configure.ac:212: -1- m4_pattern_allow([^HAVE_EX_TRUE$])
+m4trace:configure.ac:212: -1- m4_pattern_allow([^HAVE_EX_FALSE$])
+m4trace:configure.ac:212: -1- _AM_SUBST_NOTMAKE([HAVE_EX_TRUE])
+m4trace:configure.ac:212: -1- _AM_SUBST_NOTMAKE([HAVE_EX_FALSE])
+m4trace:configure.ac:214: -1- m4_pattern_allow([^HAVE_EX$])
+m4trace:configure.ac:217: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:217: the top level])
+m4trace:configure.ac:220: -1- AM_CONDITIONAL([HAVE_EX_ODP], [test "x$HAVE_EX_ODP" = "xyes"])
+m4trace:configure.ac:220: -1- m4_pattern_allow([^HAVE_EX_ODP_TRUE$])
+m4trace:configure.ac:220: -1- m4_pattern_allow([^HAVE_EX_ODP_FALSE$])
+m4trace:configure.ac:220: -1- _AM_SUBST_NOTMAKE([HAVE_EX_ODP_TRUE])
+m4trace:configure.ac:220: -1- _AM_SUBST_NOTMAKE([HAVE_EX_ODP_FALSE])
+m4trace:configure.ac:222: -1- m4_pattern_allow([^HAVE_EX_ODP$])
+m4trace:configure.ac:225: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:225: the top level])
+m4trace:configure.ac:229: -1- AM_CONDITIONAL([HAVE_EXP_ODP], [test "x$HAVE_EXP_ODP" = "xyes"])
+m4trace:configure.ac:229: -1- m4_pattern_allow([^HAVE_EXP_ODP_TRUE$])
+m4trace:configure.ac:229: -1- m4_pattern_allow([^HAVE_EXP_ODP_FALSE$])
+m4trace:configure.ac:229: -1- _AM_SUBST_NOTMAKE([HAVE_EXP_ODP_TRUE])
+m4trace:configure.ac:229: -1- _AM_SUBST_NOTMAKE([HAVE_EXP_ODP_FALSE])
+m4trace:configure.ac:232: -1- m4_pattern_allow([^HAVE_EXP_ODP$])
+m4trace:configure.ac:237: -1- m4_pattern_allow([^HAVE_CUDA$])
+m4trace:configure.ac:238: -1- m4_pattern_allow([^CUDA_PATH$])
+m4trace:configure.ac:242: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:242: the top level])
+m4trace:configure.ac:246: -1- AM_CONDITIONAL([HAVE_SCATTER_FCS], [test "x$HAVE_SCATTER_FCS" = "xyes"])
+m4trace:configure.ac:246: -1- m4_pattern_allow([^HAVE_SCATTER_FCS_TRUE$])
+m4trace:configure.ac:246: -1- m4_pattern_allow([^HAVE_SCATTER_FCS_FALSE$])
+m4trace:configure.ac:246: -1- _AM_SUBST_NOTMAKE([HAVE_SCATTER_FCS_TRUE])
+m4trace:configure.ac:246: -1- _AM_SUBST_NOTMAKE([HAVE_SCATTER_FCS_FALSE])
+m4trace:configure.ac:248: -1- m4_pattern_allow([^HAVE_SCATTER_FCS$])
+m4trace:configure.ac:251: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:251: the top level])
+m4trace:configure.ac:255: -1- AM_CONDITIONAL([HAVE_GID_ATTR], [test "x$HAVE_GID_ATTR" = "xyes"])
+m4trace:configure.ac:255: -1- m4_pattern_allow([^HAVE_GID_ATTR_TRUE$])
+m4trace:configure.ac:255: -1- m4_pattern_allow([^HAVE_GID_ATTR_FALSE$])
+m4trace:configure.ac:255: -1- _AM_SUBST_NOTMAKE([HAVE_GID_ATTR_TRUE])
+m4trace:configure.ac:255: -1- _AM_SUBST_NOTMAKE([HAVE_GID_ATTR_FALSE])
+m4trace:configure.ac:257: -1- m4_pattern_allow([^HAVE_GID_ATTR$])
+m4trace:configure.ac:260: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:260: the top level])
+m4trace:configure.ac:262: -1- AM_CONDITIONAL([HAVE_PACKET_PACING_EXP], [test "x$HAVE_PACKET_PACING_EXP" = "xyes"])
+m4trace:configure.ac:262: -1- m4_pattern_allow([^HAVE_PACKET_PACING_EXP_TRUE$])
+m4trace:configure.ac:262: -1- m4_pattern_allow([^HAVE_PACKET_PACING_EXP_FALSE$])
+m4trace:configure.ac:262: -1- _AM_SUBST_NOTMAKE([HAVE_PACKET_PACING_EXP_TRUE])
+m4trace:configure.ac:262: -1- _AM_SUBST_NOTMAKE([HAVE_PACKET_PACING_EXP_FALSE])
+m4trace:configure.ac:264: -1- m4_pattern_allow([^HAVE_PACKET_PACING_EXP$])
+m4trace:configure.ac:267: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:267: the top level])
+m4trace:configure.ac:269: -1- AM_CONDITIONAL([HAVE_PACKET_PACING], [test "x$HAVE_PACKET_PACING" = "xyes"])
+m4trace:configure.ac:269: -1- m4_pattern_allow([^HAVE_PACKET_PACING_TRUE$])
+m4trace:configure.ac:269: -1- m4_pattern_allow([^HAVE_PACKET_PACING_FALSE$])
+m4trace:configure.ac:269: -1- _AM_SUBST_NOTMAKE([HAVE_PACKET_PACING_TRUE])
+m4trace:configure.ac:269: -1- _AM_SUBST_NOTMAKE([HAVE_PACKET_PACING_FALSE])
+m4trace:configure.ac:271: -1- m4_pattern_allow([^HAVE_PACKET_PACING$])
+m4trace:configure.ac:275: -1- m4_pattern_allow([^LIBUMAD$])
+m4trace:configure.ac:276: -1- m4_pattern_allow([^LIBMATH$])
+m4trace:configure.ac:278: -1- m4_pattern_allow([^LIB@&t at OBJS$])
+m4trace:configure.ac:278: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.ac:278: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
+m4trace:configure.ac:278: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
+m4trace:configure.ac:278: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
+m4trace:configure.ac:278: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
+m4trace:configure.ac:278: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
+m4trace:configure.ac:278: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"])
+m4trace:configure.ac:278: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS
+m4trace:configure.ac:278: -1- _LT_PROG_LTMAIN
diff --git a/autom4te.cache/traces.1 b/autom4te.cache/traces.1
index ce55110..52bbbb5 100644
--- a/autom4te.cache/traces.1
+++ b/autom4te.cache/traces.1
@@ -797,90 +797,250 @@ m4trace:configure.ac:156: -1- AH_OUTPUT([HAVE_ACCL_VERBS], [/* Enable Accelerate
 m4trace:configure.ac:159: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
 configure.ac:159: the top level])
-m4trace:configure.ac:163: -1- AM_CONDITIONAL([HAVE_ODP], [test "x$HAVE_ODP" = "xyes"])
-m4trace:configure.ac:163: -1- AC_SUBST([HAVE_ODP_TRUE])
-m4trace:configure.ac:163: -1- AC_SUBST_TRACE([HAVE_ODP_TRUE])
-m4trace:configure.ac:163: -1- m4_pattern_allow([^HAVE_ODP_TRUE$])
-m4trace:configure.ac:163: -1- AC_SUBST([HAVE_ODP_FALSE])
-m4trace:configure.ac:163: -1- AC_SUBST_TRACE([HAVE_ODP_FALSE])
-m4trace:configure.ac:163: -1- m4_pattern_allow([^HAVE_ODP_FALSE$])
-m4trace:configure.ac:163: -1- _AM_SUBST_NOTMAKE([HAVE_ODP_TRUE])
-m4trace:configure.ac:163: -1- _AM_SUBST_NOTMAKE([HAVE_ODP_FALSE])
-m4trace:configure.ac:165: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ODP])
-m4trace:configure.ac:165: -1- m4_pattern_allow([^HAVE_ODP$])
-m4trace:configure.ac:165: -1- AH_OUTPUT([HAVE_ODP], [/* Have ODP support */
-@%:@undef HAVE_ODP])
-m4trace:configure.ac:169: -1- AC_DEFINE_TRACE_LITERAL([HAVE_CUDA])
-m4trace:configure.ac:169: -1- m4_pattern_allow([^HAVE_CUDA$])
-m4trace:configure.ac:169: -1- AH_OUTPUT([HAVE_CUDA], [/* Enable CUDA feature */
+m4trace:configure.ac:162: -1- AM_CONDITIONAL([HAVE_IPV6], [test "x$HAVE_IPV6" = "xyes"])
+m4trace:configure.ac:162: -1- AC_SUBST([HAVE_IPV6_TRUE])
+m4trace:configure.ac:162: -1- AC_SUBST_TRACE([HAVE_IPV6_TRUE])
+m4trace:configure.ac:162: -1- m4_pattern_allow([^HAVE_IPV6_TRUE$])
+m4trace:configure.ac:162: -1- AC_SUBST([HAVE_IPV6_FALSE])
+m4trace:configure.ac:162: -1- AC_SUBST_TRACE([HAVE_IPV6_FALSE])
+m4trace:configure.ac:162: -1- m4_pattern_allow([^HAVE_IPV6_FALSE$])
+m4trace:configure.ac:162: -1- _AM_SUBST_NOTMAKE([HAVE_IPV6_TRUE])
+m4trace:configure.ac:162: -1- _AM_SUBST_NOTMAKE([HAVE_IPV6_FALSE])
+m4trace:configure.ac:164: -1- AC_DEFINE_TRACE_LITERAL([HAVE_IPV6])
+m4trace:configure.ac:164: -1- m4_pattern_allow([^HAVE_IPV6$])
+m4trace:configure.ac:164: -1- AH_OUTPUT([HAVE_IPV6], [/* Enable IPv6 Flow Specification */
+@%:@undef HAVE_IPV6])
+m4trace:configure.ac:167: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:167: the top level])
+m4trace:configure.ac:171: -1- AM_CONDITIONAL([HAVE_IPV6], [test "x$HAVE_IPV6" = "xyes"])
+m4trace:configure.ac:171: -1- AC_SUBST([HAVE_IPV6_TRUE])
+m4trace:configure.ac:171: -1- AC_SUBST_TRACE([HAVE_IPV6_TRUE])
+m4trace:configure.ac:171: -1- m4_pattern_allow([^HAVE_IPV6_TRUE$])
+m4trace:configure.ac:171: -1- AC_SUBST([HAVE_IPV6_FALSE])
+m4trace:configure.ac:171: -1- AC_SUBST_TRACE([HAVE_IPV6_FALSE])
+m4trace:configure.ac:171: -1- m4_pattern_allow([^HAVE_IPV6_FALSE$])
+m4trace:configure.ac:171: -1- _AM_SUBST_NOTMAKE([HAVE_IPV6_TRUE])
+m4trace:configure.ac:171: -1- _AM_SUBST_NOTMAKE([HAVE_IPV6_FALSE])
+m4trace:configure.ac:173: -1- AC_DEFINE_TRACE_LITERAL([HAVE_IPV6])
+m4trace:configure.ac:173: -1- m4_pattern_allow([^HAVE_IPV6$])
+m4trace:configure.ac:173: -1- AH_OUTPUT([HAVE_IPV6], [/* Enable IPv6 Flow Specification */
+@%:@undef HAVE_IPV6])
+m4trace:configure.ac:176: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:176: the top level])
+m4trace:configure.ac:180: -1- AM_CONDITIONAL([HAVE_IPV4_EXT], [test "x$HAVE_IPV4_EXT" = "xyes"])
+m4trace:configure.ac:180: -1- AC_SUBST([HAVE_IPV4_EXT_TRUE])
+m4trace:configure.ac:180: -1- AC_SUBST_TRACE([HAVE_IPV4_EXT_TRUE])
+m4trace:configure.ac:180: -1- m4_pattern_allow([^HAVE_IPV4_EXT_TRUE$])
+m4trace:configure.ac:180: -1- AC_SUBST([HAVE_IPV4_EXT_FALSE])
+m4trace:configure.ac:180: -1- AC_SUBST_TRACE([HAVE_IPV4_EXT_FALSE])
+m4trace:configure.ac:180: -1- m4_pattern_allow([^HAVE_IPV4_EXT_FALSE$])
+m4trace:configure.ac:180: -1- _AM_SUBST_NOTMAKE([HAVE_IPV4_EXT_TRUE])
+m4trace:configure.ac:180: -1- _AM_SUBST_NOTMAKE([HAVE_IPV4_EXT_FALSE])
+m4trace:configure.ac:182: -1- AC_DEFINE_TRACE_LITERAL([HAVE_IPV4_EXT])
+m4trace:configure.ac:182: -1- m4_pattern_allow([^HAVE_IPV4_EXT$])
+m4trace:configure.ac:182: -1- AH_OUTPUT([HAVE_IPV4_EXT], [/* Enable IPv4 Extended Flow Specification */
+@%:@undef HAVE_IPV4_EXT])
+m4trace:configure.ac:185: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:185: the top level])
+m4trace:configure.ac:188: -1- AM_CONDITIONAL([HAVE_IPV4_EXT], [test "x$HAVE_IPV4_EXT" = "xyes"])
+m4trace:configure.ac:188: -1- AC_SUBST([HAVE_IPV4_EXT_TRUE])
+m4trace:configure.ac:188: -1- AC_SUBST_TRACE([HAVE_IPV4_EXT_TRUE])
+m4trace:configure.ac:188: -1- m4_pattern_allow([^HAVE_IPV4_EXT_TRUE$])
+m4trace:configure.ac:188: -1- AC_SUBST([HAVE_IPV4_EXT_FALSE])
+m4trace:configure.ac:188: -1- AC_SUBST_TRACE([HAVE_IPV4_EXT_FALSE])
+m4trace:configure.ac:188: -1- m4_pattern_allow([^HAVE_IPV4_EXT_FALSE$])
+m4trace:configure.ac:188: -1- _AM_SUBST_NOTMAKE([HAVE_IPV4_EXT_TRUE])
+m4trace:configure.ac:188: -1- _AM_SUBST_NOTMAKE([HAVE_IPV4_EXT_FALSE])
+m4trace:configure.ac:190: -1- AC_DEFINE_TRACE_LITERAL([HAVE_IPV4_EXT])
+m4trace:configure.ac:190: -1- m4_pattern_allow([^HAVE_IPV4_EXT$])
+m4trace:configure.ac:190: -1- AH_OUTPUT([HAVE_IPV4_EXT], [/* Enable IPv4 Extended Flow Specification */
+@%:@undef HAVE_IPV4_EXT])
+m4trace:configure.ac:193: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:193: the top level])
+m4trace:configure.ac:197: -1- AM_CONDITIONAL([HAVE_SNIFFER_EXP], [test "x$HAVE_SNIFFER_EXP" = "xyes"])
+m4trace:configure.ac:197: -1- AC_SUBST([HAVE_SNIFFER_EXP_TRUE])
+m4trace:configure.ac:197: -1- AC_SUBST_TRACE([HAVE_SNIFFER_EXP_TRUE])
+m4trace:configure.ac:197: -1- m4_pattern_allow([^HAVE_SNIFFER_EXP_TRUE$])
+m4trace:configure.ac:197: -1- AC_SUBST([HAVE_SNIFFER_EXP_FALSE])
+m4trace:configure.ac:197: -1- AC_SUBST_TRACE([HAVE_SNIFFER_EXP_FALSE])
+m4trace:configure.ac:197: -1- m4_pattern_allow([^HAVE_SNIFFER_EXP_FALSE$])
+m4trace:configure.ac:197: -1- _AM_SUBST_NOTMAKE([HAVE_SNIFFER_EXP_TRUE])
+m4trace:configure.ac:197: -1- _AM_SUBST_NOTMAKE([HAVE_SNIFFER_EXP_FALSE])
+m4trace:configure.ac:199: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SNIFFER_EXP])
+m4trace:configure.ac:199: -1- m4_pattern_allow([^HAVE_SNIFFER_EXP$])
+m4trace:configure.ac:199: -1- AH_OUTPUT([HAVE_SNIFFER_EXP], [/* Enable Sniffer Flow Specification */
+@%:@undef HAVE_SNIFFER_EXP])
+m4trace:configure.ac:202: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:202: the top level])
+m4trace:configure.ac:205: -1- AM_CONDITIONAL([HAVE_SNIFFER], [test "x$HAVE_SNIFFER" = "xyes"])
+m4trace:configure.ac:205: -1- AC_SUBST([HAVE_SNIFFER_TRUE])
+m4trace:configure.ac:205: -1- AC_SUBST_TRACE([HAVE_SNIFFER_TRUE])
+m4trace:configure.ac:205: -1- m4_pattern_allow([^HAVE_SNIFFER_TRUE$])
+m4trace:configure.ac:205: -1- AC_SUBST([HAVE_SNIFFER_FALSE])
+m4trace:configure.ac:205: -1- AC_SUBST_TRACE([HAVE_SNIFFER_FALSE])
+m4trace:configure.ac:205: -1- m4_pattern_allow([^HAVE_SNIFFER_FALSE$])
+m4trace:configure.ac:205: -1- _AM_SUBST_NOTMAKE([HAVE_SNIFFER_TRUE])
+m4trace:configure.ac:205: -1- _AM_SUBST_NOTMAKE([HAVE_SNIFFER_FALSE])
+m4trace:configure.ac:207: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SNIFFER])
+m4trace:configure.ac:207: -1- m4_pattern_allow([^HAVE_SNIFFER$])
+m4trace:configure.ac:207: -1- AH_OUTPUT([HAVE_SNIFFER], [/* Enable Sniffer Flow Specification */
+@%:@undef HAVE_SNIFFER])
+m4trace:configure.ac:210: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:210: the top level])
+m4trace:configure.ac:212: -1- AM_CONDITIONAL([HAVE_EX], [test "x$HAVE_EX" = "xyes"])
+m4trace:configure.ac:212: -1- AC_SUBST([HAVE_EX_TRUE])
+m4trace:configure.ac:212: -1- AC_SUBST_TRACE([HAVE_EX_TRUE])
+m4trace:configure.ac:212: -1- m4_pattern_allow([^HAVE_EX_TRUE$])
+m4trace:configure.ac:212: -1- AC_SUBST([HAVE_EX_FALSE])
+m4trace:configure.ac:212: -1- AC_SUBST_TRACE([HAVE_EX_FALSE])
+m4trace:configure.ac:212: -1- m4_pattern_allow([^HAVE_EX_FALSE$])
+m4trace:configure.ac:212: -1- _AM_SUBST_NOTMAKE([HAVE_EX_TRUE])
+m4trace:configure.ac:212: -1- _AM_SUBST_NOTMAKE([HAVE_EX_FALSE])
+m4trace:configure.ac:214: -1- AC_DEFINE_TRACE_LITERAL([HAVE_EX])
+m4trace:configure.ac:214: -1- m4_pattern_allow([^HAVE_EX$])
+m4trace:configure.ac:214: -1- AH_OUTPUT([HAVE_EX], [/* Have EX support */
+@%:@undef HAVE_EX])
+m4trace:configure.ac:217: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:217: the top level])
+m4trace:configure.ac:220: -1- AM_CONDITIONAL([HAVE_EX_ODP], [test "x$HAVE_EX_ODP" = "xyes"])
+m4trace:configure.ac:220: -1- AC_SUBST([HAVE_EX_ODP_TRUE])
+m4trace:configure.ac:220: -1- AC_SUBST_TRACE([HAVE_EX_ODP_TRUE])
+m4trace:configure.ac:220: -1- m4_pattern_allow([^HAVE_EX_ODP_TRUE$])
+m4trace:configure.ac:220: -1- AC_SUBST([HAVE_EX_ODP_FALSE])
+m4trace:configure.ac:220: -1- AC_SUBST_TRACE([HAVE_EX_ODP_FALSE])
+m4trace:configure.ac:220: -1- m4_pattern_allow([^HAVE_EX_ODP_FALSE$])
+m4trace:configure.ac:220: -1- _AM_SUBST_NOTMAKE([HAVE_EX_ODP_TRUE])
+m4trace:configure.ac:220: -1- _AM_SUBST_NOTMAKE([HAVE_EX_ODP_FALSE])
+m4trace:configure.ac:222: -1- AC_DEFINE_TRACE_LITERAL([HAVE_EX_ODP])
+m4trace:configure.ac:222: -1- m4_pattern_allow([^HAVE_EX_ODP$])
+m4trace:configure.ac:222: -1- AH_OUTPUT([HAVE_EX_ODP], [/* Have Extended ODP support */
+@%:@undef HAVE_EX_ODP])
+m4trace:configure.ac:225: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:225: the top level])
+m4trace:configure.ac:229: -1- AM_CONDITIONAL([HAVE_EXP_ODP], [test "x$HAVE_EXP_ODP" = "xyes"])
+m4trace:configure.ac:229: -1- AC_SUBST([HAVE_EXP_ODP_TRUE])
+m4trace:configure.ac:229: -1- AC_SUBST_TRACE([HAVE_EXP_ODP_TRUE])
+m4trace:configure.ac:229: -1- m4_pattern_allow([^HAVE_EXP_ODP_TRUE$])
+m4trace:configure.ac:229: -1- AC_SUBST([HAVE_EXP_ODP_FALSE])
+m4trace:configure.ac:229: -1- AC_SUBST_TRACE([HAVE_EXP_ODP_FALSE])
+m4trace:configure.ac:229: -1- m4_pattern_allow([^HAVE_EXP_ODP_FALSE$])
+m4trace:configure.ac:229: -1- _AM_SUBST_NOTMAKE([HAVE_EXP_ODP_TRUE])
+m4trace:configure.ac:229: -1- _AM_SUBST_NOTMAKE([HAVE_EXP_ODP_FALSE])
+m4trace:configure.ac:232: -1- AC_DEFINE_TRACE_LITERAL([HAVE_EXP_ODP])
+m4trace:configure.ac:232: -1- m4_pattern_allow([^HAVE_EXP_ODP$])
+m4trace:configure.ac:232: -1- AH_OUTPUT([HAVE_EXP_ODP], [/* Have Experimental ODP support */
+@%:@undef HAVE_EXP_ODP])
+m4trace:configure.ac:237: -1- AC_DEFINE_TRACE_LITERAL([HAVE_CUDA])
+m4trace:configure.ac:237: -1- m4_pattern_allow([^HAVE_CUDA$])
+m4trace:configure.ac:237: -1- AH_OUTPUT([HAVE_CUDA], [/* Enable CUDA feature */
 @%:@undef HAVE_CUDA])
-m4trace:configure.ac:170: -1- AC_DEFINE_TRACE_LITERAL([CUDA_PATH])
-m4trace:configure.ac:170: -1- m4_pattern_allow([^CUDA_PATH$])
-m4trace:configure.ac:170: -1- AH_OUTPUT([CUDA_PATH], [/* Enable CUDA feature */
+m4trace:configure.ac:238: -1- AC_DEFINE_TRACE_LITERAL([CUDA_PATH])
+m4trace:configure.ac:238: -1- m4_pattern_allow([^CUDA_PATH$])
+m4trace:configure.ac:238: -1- AH_OUTPUT([CUDA_PATH], [/* Enable CUDA feature */
 @%:@undef CUDA_PATH])
-m4trace:configure.ac:174: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:242: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
-configure.ac:174: the top level])
-m4trace:configure.ac:178: -1- AM_CONDITIONAL([HAVE_SCATTER_FCS], [test "x$HAVE_SCATTER_FCS" = "xyes"])
-m4trace:configure.ac:178: -1- AC_SUBST([HAVE_SCATTER_FCS_TRUE])
-m4trace:configure.ac:178: -1- AC_SUBST_TRACE([HAVE_SCATTER_FCS_TRUE])
-m4trace:configure.ac:178: -1- m4_pattern_allow([^HAVE_SCATTER_FCS_TRUE$])
-m4trace:configure.ac:178: -1- AC_SUBST([HAVE_SCATTER_FCS_FALSE])
-m4trace:configure.ac:178: -1- AC_SUBST_TRACE([HAVE_SCATTER_FCS_FALSE])
-m4trace:configure.ac:178: -1- m4_pattern_allow([^HAVE_SCATTER_FCS_FALSE$])
-m4trace:configure.ac:178: -1- _AM_SUBST_NOTMAKE([HAVE_SCATTER_FCS_TRUE])
-m4trace:configure.ac:178: -1- _AM_SUBST_NOTMAKE([HAVE_SCATTER_FCS_FALSE])
-m4trace:configure.ac:180: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SCATTER_FCS])
-m4trace:configure.ac:180: -1- m4_pattern_allow([^HAVE_SCATTER_FCS$])
-m4trace:configure.ac:180: -1- AH_OUTPUT([HAVE_SCATTER_FCS], [/* Have SCATTER_FCS support */
+configure.ac:242: the top level])
+m4trace:configure.ac:246: -1- AM_CONDITIONAL([HAVE_SCATTER_FCS], [test "x$HAVE_SCATTER_FCS" = "xyes"])
+m4trace:configure.ac:246: -1- AC_SUBST([HAVE_SCATTER_FCS_TRUE])
+m4trace:configure.ac:246: -1- AC_SUBST_TRACE([HAVE_SCATTER_FCS_TRUE])
+m4trace:configure.ac:246: -1- m4_pattern_allow([^HAVE_SCATTER_FCS_TRUE$])
+m4trace:configure.ac:246: -1- AC_SUBST([HAVE_SCATTER_FCS_FALSE])
+m4trace:configure.ac:246: -1- AC_SUBST_TRACE([HAVE_SCATTER_FCS_FALSE])
+m4trace:configure.ac:246: -1- m4_pattern_allow([^HAVE_SCATTER_FCS_FALSE$])
+m4trace:configure.ac:246: -1- _AM_SUBST_NOTMAKE([HAVE_SCATTER_FCS_TRUE])
+m4trace:configure.ac:246: -1- _AM_SUBST_NOTMAKE([HAVE_SCATTER_FCS_FALSE])
+m4trace:configure.ac:248: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SCATTER_FCS])
+m4trace:configure.ac:248: -1- m4_pattern_allow([^HAVE_SCATTER_FCS$])
+m4trace:configure.ac:248: -1- AH_OUTPUT([HAVE_SCATTER_FCS], [/* Have SCATTER_FCS support */
 @%:@undef HAVE_SCATTER_FCS])
-m4trace:configure.ac:183: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:251: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
-configure.ac:183: the top level])
-m4trace:configure.ac:187: -1- AM_CONDITIONAL([HAVE_GID_ATTR], [test "x$HAVE_GID_ATTR" = "xyes"])
-m4trace:configure.ac:187: -1- AC_SUBST([HAVE_GID_ATTR_TRUE])
-m4trace:configure.ac:187: -1- AC_SUBST_TRACE([HAVE_GID_ATTR_TRUE])
-m4trace:configure.ac:187: -1- m4_pattern_allow([^HAVE_GID_ATTR_TRUE$])
-m4trace:configure.ac:187: -1- AC_SUBST([HAVE_GID_ATTR_FALSE])
-m4trace:configure.ac:187: -1- AC_SUBST_TRACE([HAVE_GID_ATTR_FALSE])
-m4trace:configure.ac:187: -1- m4_pattern_allow([^HAVE_GID_ATTR_FALSE$])
-m4trace:configure.ac:187: -1- _AM_SUBST_NOTMAKE([HAVE_GID_ATTR_TRUE])
-m4trace:configure.ac:187: -1- _AM_SUBST_NOTMAKE([HAVE_GID_ATTR_FALSE])
-m4trace:configure.ac:189: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GID_ATTR])
-m4trace:configure.ac:189: -1- m4_pattern_allow([^HAVE_GID_ATTR$])
-m4trace:configure.ac:189: -1- AH_OUTPUT([HAVE_GID_ATTR], [/* Enable GID Attribute query feature */
+configure.ac:251: the top level])
+m4trace:configure.ac:255: -1- AM_CONDITIONAL([HAVE_GID_ATTR], [test "x$HAVE_GID_ATTR" = "xyes"])
+m4trace:configure.ac:255: -1- AC_SUBST([HAVE_GID_ATTR_TRUE])
+m4trace:configure.ac:255: -1- AC_SUBST_TRACE([HAVE_GID_ATTR_TRUE])
+m4trace:configure.ac:255: -1- m4_pattern_allow([^HAVE_GID_ATTR_TRUE$])
+m4trace:configure.ac:255: -1- AC_SUBST([HAVE_GID_ATTR_FALSE])
+m4trace:configure.ac:255: -1- AC_SUBST_TRACE([HAVE_GID_ATTR_FALSE])
+m4trace:configure.ac:255: -1- m4_pattern_allow([^HAVE_GID_ATTR_FALSE$])
+m4trace:configure.ac:255: -1- _AM_SUBST_NOTMAKE([HAVE_GID_ATTR_TRUE])
+m4trace:configure.ac:255: -1- _AM_SUBST_NOTMAKE([HAVE_GID_ATTR_FALSE])
+m4trace:configure.ac:257: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GID_ATTR])
+m4trace:configure.ac:257: -1- m4_pattern_allow([^HAVE_GID_ATTR$])
+m4trace:configure.ac:257: -1- AH_OUTPUT([HAVE_GID_ATTR], [/* Enable GID Attribute query feature */
 @%:@undef HAVE_GID_ATTR])
-m4trace:configure.ac:193: -1- AC_SUBST([LIBUMAD])
-m4trace:configure.ac:193: -1- AC_SUBST_TRACE([LIBUMAD])
-m4trace:configure.ac:193: -1- m4_pattern_allow([^LIBUMAD$])
-m4trace:configure.ac:194: -1- AC_SUBST([LIBMATH])
-m4trace:configure.ac:194: -1- AC_SUBST_TRACE([LIBMATH])
-m4trace:configure.ac:194: -1- m4_pattern_allow([^LIBMATH$])
-m4trace:configure.ac:195: -1- AC_CONFIG_FILES([Makefile])
-m4trace:configure.ac:196: -1- AC_SUBST([LIB@&t at OBJS], [$ac_libobjs])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([LIB@&t at OBJS])
-m4trace:configure.ac:196: -1- m4_pattern_allow([^LIB@&t at OBJS$])
-m4trace:configure.ac:196: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([LTLIBOBJS])
-m4trace:configure.ac:196: -1- m4_pattern_allow([^LTLIBOBJS$])
-m4trace:configure.ac:196: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
-m4trace:configure.ac:196: -1- AC_SUBST([am__EXEEXT_TRUE])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE])
-m4trace:configure.ac:196: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
-m4trace:configure.ac:196: -1- AC_SUBST([am__EXEEXT_FALSE])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE])
-m4trace:configure.ac:196: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
-m4trace:configure.ac:196: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
-m4trace:configure.ac:196: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([top_builddir])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([top_build_prefix])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([srcdir])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([abs_srcdir])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([top_srcdir])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([abs_top_srcdir])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([builddir])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([abs_builddir])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([abs_top_builddir])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([INSTALL])
-m4trace:configure.ac:196: -1- AC_SUBST_TRACE([MKDIR_P])
-m4trace:configure.ac:196: -1- AC_REQUIRE_AUX_FILE([ltmain.sh])
+m4trace:configure.ac:260: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:260: the top level])
+m4trace:configure.ac:262: -1- AM_CONDITIONAL([HAVE_PACKET_PACING_EXP], [test "x$HAVE_PACKET_PACING_EXP" = "xyes"])
+m4trace:configure.ac:262: -1- AC_SUBST([HAVE_PACKET_PACING_EXP_TRUE])
+m4trace:configure.ac:262: -1- AC_SUBST_TRACE([HAVE_PACKET_PACING_EXP_TRUE])
+m4trace:configure.ac:262: -1- m4_pattern_allow([^HAVE_PACKET_PACING_EXP_TRUE$])
+m4trace:configure.ac:262: -1- AC_SUBST([HAVE_PACKET_PACING_EXP_FALSE])
+m4trace:configure.ac:262: -1- AC_SUBST_TRACE([HAVE_PACKET_PACING_EXP_FALSE])
+m4trace:configure.ac:262: -1- m4_pattern_allow([^HAVE_PACKET_PACING_EXP_FALSE$])
+m4trace:configure.ac:262: -1- _AM_SUBST_NOTMAKE([HAVE_PACKET_PACING_EXP_TRUE])
+m4trace:configure.ac:262: -1- _AM_SUBST_NOTMAKE([HAVE_PACKET_PACING_EXP_FALSE])
+m4trace:configure.ac:264: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PACKET_PACING_EXP])
+m4trace:configure.ac:264: -1- m4_pattern_allow([^HAVE_PACKET_PACING_EXP$])
+m4trace:configure.ac:264: -1- AH_OUTPUT([HAVE_PACKET_PACING_EXP], [/* Have PACKET_PACING_EXP support */
+@%:@undef HAVE_PACKET_PACING_EXP])
+m4trace:configure.ac:267: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from...
+configure.ac:267: the top level])
+m4trace:configure.ac:269: -1- AM_CONDITIONAL([HAVE_PACKET_PACING], [test "x$HAVE_PACKET_PACING" = "xyes"])
+m4trace:configure.ac:269: -1- AC_SUBST([HAVE_PACKET_PACING_TRUE])
+m4trace:configure.ac:269: -1- AC_SUBST_TRACE([HAVE_PACKET_PACING_TRUE])
+m4trace:configure.ac:269: -1- m4_pattern_allow([^HAVE_PACKET_PACING_TRUE$])
+m4trace:configure.ac:269: -1- AC_SUBST([HAVE_PACKET_PACING_FALSE])
+m4trace:configure.ac:269: -1- AC_SUBST_TRACE([HAVE_PACKET_PACING_FALSE])
+m4trace:configure.ac:269: -1- m4_pattern_allow([^HAVE_PACKET_PACING_FALSE$])
+m4trace:configure.ac:269: -1- _AM_SUBST_NOTMAKE([HAVE_PACKET_PACING_TRUE])
+m4trace:configure.ac:269: -1- _AM_SUBST_NOTMAKE([HAVE_PACKET_PACING_FALSE])
+m4trace:configure.ac:271: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PACKET_PACING])
+m4trace:configure.ac:271: -1- m4_pattern_allow([^HAVE_PACKET_PACING$])
+m4trace:configure.ac:271: -1- AH_OUTPUT([HAVE_PACKET_PACING], [/* Have PACKET_PACING support */
+@%:@undef HAVE_PACKET_PACING])
+m4trace:configure.ac:275: -1- AC_SUBST([LIBUMAD])
+m4trace:configure.ac:275: -1- AC_SUBST_TRACE([LIBUMAD])
+m4trace:configure.ac:275: -1- m4_pattern_allow([^LIBUMAD$])
+m4trace:configure.ac:276: -1- AC_SUBST([LIBMATH])
+m4trace:configure.ac:276: -1- AC_SUBST_TRACE([LIBMATH])
+m4trace:configure.ac:276: -1- m4_pattern_allow([^LIBMATH$])
+m4trace:configure.ac:277: -1- AC_CONFIG_FILES([Makefile])
+m4trace:configure.ac:278: -1- AC_SUBST([LIB@&t at OBJS], [$ac_libobjs])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([LIB@&t at OBJS])
+m4trace:configure.ac:278: -1- m4_pattern_allow([^LIB@&t at OBJS$])
+m4trace:configure.ac:278: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([LTLIBOBJS])
+m4trace:configure.ac:278: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.ac:278: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])
+m4trace:configure.ac:278: -1- AC_SUBST([am__EXEEXT_TRUE])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE])
+m4trace:configure.ac:278: -1- m4_pattern_allow([^am__EXEEXT_TRUE$])
+m4trace:configure.ac:278: -1- AC_SUBST([am__EXEEXT_FALSE])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE])
+m4trace:configure.ac:278: -1- m4_pattern_allow([^am__EXEEXT_FALSE$])
+m4trace:configure.ac:278: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE])
+m4trace:configure.ac:278: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([top_builddir])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([top_build_prefix])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([srcdir])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([abs_srcdir])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([top_srcdir])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([abs_top_srcdir])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([builddir])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([abs_builddir])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([abs_top_builddir])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([INSTALL])
+m4trace:configure.ac:278: -1- AC_SUBST_TRACE([MKDIR_P])
+m4trace:configure.ac:278: -1- AC_REQUIRE_AUX_FILE([ltmain.sh])
diff --git a/config.h.in b/config.h.in
index c30d10d..b7d78d9 100644
--- a/config.h.in
+++ b/config.h.in
@@ -18,6 +18,15 @@
 /* Enable endian conversion */
 #undef HAVE_ENDIAN
 
+/* Have EX support */
+#undef HAVE_EX
+
+/* Have Experimental ODP support */
+#undef HAVE_EXP_ODP
+
+/* Have Extended ODP support */
+#undef HAVE_EX_ODP
+
 /* Enable GID Attribute query feature */
 #undef HAVE_GID_ATTR
 
@@ -30,6 +39,12 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* Enable IPv4 Extended Flow Specification */
+#undef HAVE_IPV4_EXT
+
+/* Enable IPv6 Flow Specification */
+#undef HAVE_IPV6
+
 /* Define to 1 if you have the `ibverbs' library (-libverbs). */
 #undef HAVE_LIBIBVERBS
 
@@ -42,8 +57,11 @@
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H
 
-/* Have ODP support */
-#undef HAVE_ODP
+/* Have PACKET_PACING support */
+#undef HAVE_PACKET_PACING
+
+/* Have PACKET_PACING_EXP support */
+#undef HAVE_PACKET_PACING_EXP
 
 /* Enable RAW_ETH_TEST */
 #undef HAVE_RAW_ETH
@@ -63,6 +81,12 @@
 /* Enable SCIF link Layer */
 #undef HAVE_SCIF
 
+/* Enable Sniffer Flow Specification */
+#undef HAVE_SNIFFER
+
+/* Enable Sniffer Flow Specification */
+#undef HAVE_SNIFFER_EXP
+
 /* Define to 1 if you have the <stdint.h> header file. */
 #undef HAVE_STDINT_H
 
diff --git a/configure b/configure
index a7c68ec..4c22e82 100755
--- a/configure
+++ b/configure
@@ -638,12 +638,28 @@ LTLIBOBJS
 LIBOBJS
 LIBMATH
 LIBUMAD
+HAVE_PACKET_PACING_FALSE
+HAVE_PACKET_PACING_TRUE
+HAVE_PACKET_PACING_EXP_FALSE
+HAVE_PACKET_PACING_EXP_TRUE
 HAVE_GID_ATTR_FALSE
 HAVE_GID_ATTR_TRUE
 HAVE_SCATTER_FCS_FALSE
 HAVE_SCATTER_FCS_TRUE
-HAVE_ODP_FALSE
-HAVE_ODP_TRUE
+HAVE_EXP_ODP_FALSE
+HAVE_EXP_ODP_TRUE
+HAVE_EX_ODP_FALSE
+HAVE_EX_ODP_TRUE
+HAVE_EX_FALSE
+HAVE_EX_TRUE
+HAVE_SNIFFER_FALSE
+HAVE_SNIFFER_TRUE
+HAVE_SNIFFER_EXP_FALSE
+HAVE_SNIFFER_EXP_TRUE
+HAVE_IPV4_EXT_FALSE
+HAVE_IPV4_EXT_TRUE
+HAVE_IPV6_FALSE
+HAVE_IPV6_TRUE
 HAVE_ACCL_VERBS_FALSE
 HAVE_ACCL_VERBS_TRUE
 HAVE_DC_FALSE
@@ -16099,6 +16115,272 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 #include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_FLOW_SPEC_IPV6;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV6=yes
+else
+  HAVE_IPV6=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV6" = "xyes"; then
+  HAVE_IPV6_TRUE=
+  HAVE_IPV6_FALSE='#'
+else
+  HAVE_IPV6_TRUE='#'
+  HAVE_IPV6_FALSE=
+fi
+
+if test $HAVE_IPV6 = yes && test $HAVE_VERBS_EXP = no; then
+
+$as_echo "#define HAVE_IPV6 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_FLOW_SPEC_IPV6_EXT;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV6=yes
+else
+  HAVE_IPV6=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV6" = "xyes"; then
+  HAVE_IPV6_TRUE=
+  HAVE_IPV6_FALSE='#'
+else
+  HAVE_IPV6_TRUE='#'
+  HAVE_IPV6_FALSE=
+fi
+
+if test $HAVE_IPV6 = yes && test $HAVE_VERBS_EXP = yes; then
+
+$as_echo "#define HAVE_IPV6 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_FLOW_SPEC_IPV4_EXT;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV4_EXT=yes
+else
+  HAVE_IPV4_EXT=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV4_EXT" = "xyes"; then
+  HAVE_IPV4_EXT_TRUE=
+  HAVE_IPV4_EXT_FALSE='#'
+else
+  HAVE_IPV4_EXT_TRUE='#'
+  HAVE_IPV4_EXT_FALSE=
+fi
+
+if test $HAVE_IPV4_EXT = yes && test $HAVE_VERBS_EXP = yes; then
+
+$as_echo "#define HAVE_IPV4_EXT 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_FLOW_SPEC_IPV4_EXT;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_IPV4_EXT=yes
+else
+  HAVE_IPV4_EXT=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_IPV4_EXT" = "xyes"; then
+  HAVE_IPV4_EXT_TRUE=
+  HAVE_IPV4_EXT_FALSE='#'
+else
+  HAVE_IPV4_EXT_TRUE='#'
+  HAVE_IPV4_EXT_FALSE=
+fi
+
+if test $HAVE_IPV4_EXT = yes && test $HAVE_VERBS_EXP = no; then
+
+$as_echo "#define HAVE_IPV4_EXT 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>
+int
+main ()
+{
+int x = IBV_EXP_FLOW_ATTR_SNIFFER;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_SNIFFER_EXP=yes
+else
+  HAVE_SNIFFER_EXP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_SNIFFER_EXP" = "xyes"; then
+  HAVE_SNIFFER_EXP_TRUE=
+  HAVE_SNIFFER_EXP_FALSE='#'
+else
+  HAVE_SNIFFER_EXP_TRUE='#'
+  HAVE_SNIFFER_EXP_FALSE=
+fi
+
+if test $HAVE_SNIFFER_EXP = yes && test $HAVE_VERBS_EXP = yes; then
+
+$as_echo "#define HAVE_SNIFFER_EXP 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_FLOW_ATTR_SNIFFER;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_SNIFFER=yes
+else
+  HAVE_SNIFFER=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_SNIFFER" = "xyes"; then
+  HAVE_SNIFFER_TRUE=
+  HAVE_SNIFFER_FALSE='#'
+else
+  HAVE_SNIFFER_TRUE='#'
+  HAVE_SNIFFER_FALSE=
+fi
+
+if test $HAVE_SNIFFER = yes && test $HAVE_VERBS_EXP = no; then
+
+$as_echo "#define HAVE_SNIFFER 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <infiniband/verbs.h>
+int
+main ()
+{
+struct ibv_device_attr_ex *attr_ex; int x = attr_ex->comp_mask;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_EX=yes
+else
+  HAVE_EX=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_EX" = "xyes"; then
+  HAVE_EX_TRUE=
+  HAVE_EX_FALSE='#'
+else
+  HAVE_EX_TRUE='#'
+  HAVE_EX_FALSE=
+fi
+
+if test $HAVE_EX = yes; then
+
+$as_echo "#define HAVE_EX 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
+int
+main ()
+{
+int x = IBV_ACCESS_ON_DEMAND;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_EX_ODP=yes
+else
+  HAVE_EX_ODP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_EX_ODP" = "xyes"; then
+  HAVE_EX_ODP_TRUE=
+  HAVE_EX_ODP_FALSE='#'
+else
+  HAVE_EX_ODP_TRUE='#'
+  HAVE_EX_ODP_FALSE=
+fi
+
+if test $HAVE_EX_ODP = yes && test $HAVE_EX = yes; then
+
+$as_echo "#define HAVE_EX_ODP 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <infiniband/verbs.h>
 #include <infiniband/verbs_exp.h>
 int
 main ()
@@ -16109,24 +16391,26 @@ int x = IBV_EXP_ACCESS_ON_DEMAND;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  HAVE_ODP=yes
+  HAVE_EXP_ODP=yes
 else
-  HAVE_ODP=no
+  HAVE_EXP_ODP=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
- if test "x$HAVE_ODP" = "xyes"; then
-  HAVE_ODP_TRUE=
-  HAVE_ODP_FALSE='#'
+ if test "x$HAVE_EXP_ODP" = "xyes"; then
+  HAVE_EXP_ODP_TRUE=
+  HAVE_EXP_ODP_FALSE='#'
 else
-  HAVE_ODP_TRUE='#'
-  HAVE_ODP_FALSE=
+  HAVE_EXP_ODP_TRUE='#'
+  HAVE_EXP_ODP_FALSE=
 fi
 
-if test $HAVE_ODP = yes && test $HAVE_VERBS_EXP = yes; then
+if test $HAVE_EXP_ODP = yes ; then
+	if  test $HAVE_EX_ODP = no ; then
 
-$as_echo "#define HAVE_ODP 1" >>confdefs.h
+$as_echo "#define HAVE_EXP_ODP 1" >>confdefs.h
 
+	fi
 fi
 
 if test "$CUDA_H_PATH" ; then
@@ -16209,6 +16493,70 @@ $as_echo "#define HAVE_GID_ATTR 1" >>confdefs.h
 
 fi
 
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <infiniband/verbs.h>
+int
+main ()
+{
+struct ibv_exp_qp_attr *attr; int x = attr->rate_limit;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_PACKET_PACING_EXP=yes
+else
+  HAVE_PACKET_PACING_EXP=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_PACKET_PACING_EXP" = "xyes"; then
+  HAVE_PACKET_PACING_EXP_TRUE=
+  HAVE_PACKET_PACING_EXP_FALSE='#'
+else
+  HAVE_PACKET_PACING_EXP_TRUE='#'
+  HAVE_PACKET_PACING_EXP_FALSE=
+fi
+
+if test $HAVE_PACKET_PACING_EXP = yes && test $HAVE_VERBS_EXP = yes; then
+
+$as_echo "#define HAVE_PACKET_PACING_EXP 1" >>confdefs.h
+
+fi
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <infiniband/verbs.h>
+int
+main ()
+{
+struct ibv_qp_attr *attr; int x = attr->rate_limit;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  HAVE_PACKET_PACING=yes
+else
+  HAVE_PACKET_PACING=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$HAVE_PACKET_PACING" = "xyes"; then
+  HAVE_PACKET_PACING_TRUE=
+  HAVE_PACKET_PACING_FALSE='#'
+else
+  HAVE_PACKET_PACING_TRUE='#'
+  HAVE_PACKET_PACING_FALSE=
+fi
+
+if test $HAVE_PACKET_PACING = yes; then
+
+$as_echo "#define HAVE_PACKET_PACING 1" >>confdefs.h
+
+fi
+
 CFLAGS="-g -Wall -D_GNU_SOURCE -O3"
 
 
@@ -16407,8 +16755,40 @@ if test -z "${HAVE_ACCL_VERBS_TRUE}" && test -z "${HAVE_ACCL_VERBS_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_ACCL_VERBS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${HAVE_ODP_TRUE}" && test -z "${HAVE_ODP_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_ODP\" was never defined.
+if test -z "${HAVE_IPV6_TRUE}" && test -z "${HAVE_IPV6_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV6\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_IPV6_TRUE}" && test -z "${HAVE_IPV6_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV6\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_IPV4_EXT_TRUE}" && test -z "${HAVE_IPV4_EXT_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV4_EXT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_IPV4_EXT_TRUE}" && test -z "${HAVE_IPV4_EXT_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_IPV4_EXT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_SNIFFER_EXP_TRUE}" && test -z "${HAVE_SNIFFER_EXP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_SNIFFER_EXP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_SNIFFER_TRUE}" && test -z "${HAVE_SNIFFER_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_SNIFFER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_EX_TRUE}" && test -z "${HAVE_EX_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_EX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_EX_ODP_TRUE}" && test -z "${HAVE_EX_ODP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_EX_ODP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_EXP_ODP_TRUE}" && test -z "${HAVE_EXP_ODP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_EXP_ODP\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${HAVE_SCATTER_FCS_TRUE}" && test -z "${HAVE_SCATTER_FCS_FALSE}"; then
@@ -16419,6 +16799,14 @@ if test -z "${HAVE_GID_ATTR_TRUE}" && test -z "${HAVE_GID_ATTR_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_GID_ATTR\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_PACKET_PACING_EXP_TRUE}" && test -z "${HAVE_PACKET_PACING_EXP_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PACKET_PACING_EXP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PACKET_PACING_TRUE}" && test -z "${HAVE_PACKET_PACING_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PACKET_PACING\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
 : "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
diff --git a/configure.ac b/configure.ac
index d840d25..5060bd7 100755
--- a/configure.ac
+++ b/configure.ac
@@ -157,12 +157,80 @@ if [test $HAVE_ACCL_VERBS = yes] && [test $HAVE_VERBS_EXP = yes]; then
 fi
 
 AC_TRY_LINK([
+#include <infiniband/verbs.h>],
+        [int x = IBV_FLOW_SPEC_IPV6;],[HAVE_IPV6=yes], [HAVE_IPV6=no])
+AM_CONDITIONAL([HAVE_IPV6],[test "x$HAVE_IPV6" = "xyes"])
+if [test $HAVE_IPV6 = yes] && [test $HAVE_VERBS_EXP = no]; then
+        AC_DEFINE([HAVE_IPV6], [1], [Enable IPv6 Flow Specification])
+fi
+
+AC_TRY_LINK([
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>],
+        [int x = IBV_EXP_FLOW_SPEC_IPV6_EXT;],[HAVE_IPV6=yes], [HAVE_IPV6=no])
+AM_CONDITIONAL([HAVE_IPV6],[test "x$HAVE_IPV6" = "xyes"])
+if [test $HAVE_IPV6 = yes] && [test $HAVE_VERBS_EXP = yes]; then
+        AC_DEFINE([HAVE_IPV6], [1], [Enable IPv6 Flow Specification])
+fi
+
+AC_TRY_LINK([
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>],
+        [int x = IBV_EXP_FLOW_SPEC_IPV4_EXT;],[HAVE_IPV4_EXT=yes], [HAVE_IPV4_EXT=no])
+AM_CONDITIONAL([HAVE_IPV4_EXT],[test "x$HAVE_IPV4_EXT" = "xyes"])
+if [test $HAVE_IPV4_EXT = yes] && [test $HAVE_VERBS_EXP = yes]; then
+        AC_DEFINE([HAVE_IPV4_EXT], [1], [Enable IPv4 Extended Flow Specification])
+fi
+
+AC_TRY_LINK([
+#include <infiniband/verbs.h>],
+        [int x = IBV_FLOW_SPEC_IPV4_EXT;],[HAVE_IPV4_EXT=yes], [HAVE_IPV4_EXT=no])
+AM_CONDITIONAL([HAVE_IPV4_EXT],[test "x$HAVE_IPV4_EXT" = "xyes"])
+if [test $HAVE_IPV4_EXT = yes] && [test $HAVE_VERBS_EXP = no]; then
+        AC_DEFINE([HAVE_IPV4_EXT], [1], [Enable IPv4 Extended Flow Specification])
+fi
+
+AC_TRY_LINK([
+#include <infiniband/verbs.h>
+#include <infiniband/verbs_exp.h>],
+        [int x = IBV_EXP_FLOW_ATTR_SNIFFER;],[HAVE_SNIFFER_EXP=yes], [HAVE_SNIFFER_EXP=no])
+AM_CONDITIONAL([HAVE_SNIFFER_EXP],[test "x$HAVE_SNIFFER_EXP" = "xyes"])
+if [test $HAVE_SNIFFER_EXP = yes] && [test $HAVE_VERBS_EXP = yes]; then
+        AC_DEFINE([HAVE_SNIFFER_EXP], [1], [Enable Sniffer Flow Specification])
+fi
+
+AC_TRY_LINK([
+#include <infiniband/verbs.h>],
+        [int x = IBV_FLOW_ATTR_SNIFFER;],[HAVE_SNIFFER=yes], [HAVE_SNIFFER=no])
+AM_CONDITIONAL([HAVE_SNIFFER],[test "x$HAVE_SNIFFER" = "xyes"])
+if [test $HAVE_SNIFFER = yes] && [test $HAVE_VERBS_EXP = no]; then
+        AC_DEFINE([HAVE_SNIFFER], [1], [Enable Sniffer Flow Specification])
+fi
+
+AC_TRY_LINK([#include <infiniband/verbs.h>],
+	[struct ibv_device_attr_ex *attr_ex; int x = attr_ex->comp_mask;],[HAVE_EX=yes], [HAVE_EX=no])
+AM_CONDITIONAL([HAVE_EX],[test "x$HAVE_EX" = "xyes"])
+if [test $HAVE_EX = yes]; then
+	AC_DEFINE([HAVE_EX], [1], [Have EX support])
+fi
+
+AC_TRY_LINK([
+#include <infiniband/verbs.h>],
+        [int x = IBV_ACCESS_ON_DEMAND;],[HAVE_EX_ODP=yes], [HAVE_EX_ODP=no])
+AM_CONDITIONAL([HAVE_EX_ODP],[test "x$HAVE_EX_ODP" = "xyes"])
+if [test $HAVE_EX_ODP = yes] && [test $HAVE_EX = yes]; then
+        AC_DEFINE([HAVE_EX_ODP], [1], [Have Extended  ODP support])
+fi
+
+AC_TRY_LINK([
 #include <infiniband/verbs.h>
 #include <infiniband/verbs_exp.h>],
-        [int x = IBV_EXP_ACCESS_ON_DEMAND;],[HAVE_ODP=yes], [HAVE_ODP=no])
-AM_CONDITIONAL([HAVE_ODP],[test "x$HAVE_ODP" = "xyes"])
-if [test $HAVE_ODP = yes] && [test $HAVE_VERBS_EXP = yes]; then
-        AC_DEFINE([HAVE_ODP], [1], [Have ODP support])
+        [int x = IBV_EXP_ACCESS_ON_DEMAND;],[HAVE_EXP_ODP=yes], [HAVE_EXP_ODP=no])
+AM_CONDITIONAL([HAVE_EXP_ODP],[test "x$HAVE_EXP_ODP" = "xyes"])
+if [test $HAVE_EXP_ODP = yes] ; then
+	if  [test $HAVE_EX_ODP = no] ; then
+		AC_DEFINE([HAVE_EXP_ODP], [1], [Have Experimental ODP support])
+	fi
 fi
 
 if [test "$CUDA_H_PATH" ]; then
@@ -189,6 +257,20 @@ if [test $HAVE_GID_ATTR = yes] && [test $HAVE_VERBS_EXP = yes]; then
         AC_DEFINE([HAVE_GID_ATTR], [1], [Enable GID Attribute query feature])
 fi
 
+AC_TRY_LINK([#include <infiniband/verbs.h>],
+	[struct ibv_exp_qp_attr *attr; int x = attr->rate_limit;],[HAVE_PACKET_PACING_EXP=yes], [HAVE_PACKET_PACING_EXP=no])
+AM_CONDITIONAL([HAVE_PACKET_PACING_EXP],[test "x$HAVE_PACKET_PACING_EXP" = "xyes"])
+if [test $HAVE_PACKET_PACING_EXP = yes] && [test $HAVE_VERBS_EXP = yes]; then
+	AC_DEFINE([HAVE_PACKET_PACING_EXP], [1], [Have PACKET_PACING_EXP support])
+fi
+
+AC_TRY_LINK([#include <infiniband/verbs.h>],
+	[struct ibv_qp_attr *attr; int x = attr->rate_limit;],[HAVE_PACKET_PACING=yes], [HAVE_PACKET_PACING=no])
+AM_CONDITIONAL([HAVE_PACKET_PACING],[test "x$HAVE_PACKET_PACING" = "xyes"])
+if [test $HAVE_PACKET_PACING = yes]; then
+	AC_DEFINE([HAVE_PACKET_PACING], [1], [Have PACKET_PACING support])
+fi
+
 CFLAGS="-g -Wall -D_GNU_SOURCE -O3"
 AC_SUBST([LIBUMAD])
 AC_SUBST([LIBMATH])
diff --git a/perftest.spec b/perftest.spec
index c4eb173..11f5269 100644
--- a/perftest.spec
+++ b/perftest.spec
@@ -1,10 +1,10 @@
 Name:           perftest
 Summary:        IB Performance tests
-Version: 3.0
-Release: 3.2.g8ade541
+Version: 3.4
+Release: 0.6.gc3435c2
 License:        BSD 3-Clause, GPL v2 or later
 Group:          Productivity/Networking/Diagnostic
-Source: http://www.openfabrics.org/downloads/perftest-3.0-3.2.g8ade541.tar.gz
+Source: http://www.openfabrics.org/downloads/perftest-3.4-0.6.gc3435c2.tar.gz
 Url:            http://www.openfabrics.org
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  libibverbs-devel librdmacm-devel libibumad-devel
diff --git a/src/atomic_bw.c b/src/atomic_bw.c
index 479cb1d..faaf1bf 100755
--- a/src/atomic_bw.c
+++ b/src/atomic_bw.c
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
 	if (ret_parser) {
 		if (ret_parser != VERSION_EXIT && ret_parser != HELP_EXIT)
 			fprintf(stderr, " Parser function exited with Error\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.use_xrc && user_param.duplex) {
@@ -84,7 +84,7 @@ int main(int argc, char *argv[])
 	ctx.context = ibv_open_device(ib_dev);
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
-		return 1;
+		return FAILURE;
 	}
 
 	#ifdef HAVE_MASKED_ATOMICS
@@ -95,7 +95,7 @@ int main(int argc, char *argv[])
 
 	if (user_param.masked_atomics && (user_param.work_rdma_cm || user_param.use_rdma_cm)) {
 		fprintf(stderr, "atomic test is not supported with -R/-z flag (rdma_cm) with this device.\n");
-		return 1;
+		return FAILURE;
 	}
 	#endif
 
@@ -108,7 +108,7 @@ int main(int argc, char *argv[])
 	/* copy the relevant user parameters to the comm struct + creating rdma_cm resources. */
 	if (create_comm_struct(&user_comm, &user_param)) {
 		fprintf(stderr, " Unable to create RDMA_CM resources\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY && user_param.machine == SERVER) {
@@ -189,7 +189,7 @@ int main(int argc, char *argv[])
 		/* shaking hands and gather the other side info. */
 		if (ctx_hand_shake(&user_comm, &my_dest[i], &rem_dest[i])) {
 			fprintf(stderr, "Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 		ctx_print_pingpong_data(&rem_dest[i], &user_comm);
 	}
@@ -198,21 +198,21 @@ int main(int argc, char *argv[])
 		if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0])) {
 			fprintf(stderr, "\n Found Incompatibility issue with GID types.\n");
 			fprintf(stderr, " Please Try to use a different IP version.\n\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	if (user_param.work_rdma_cm == OFF) {
 		if (ctx_connect(&ctx, rem_dest, &user_param, my_dest)) {
 			fprintf(stderr, " Unable to Connect the HCA's through the link\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	/* An additional handshake is required after moving qp to RTR. */
 	if (ctx_hand_shake(&user_comm, &my_dest[0], &rem_dest[0])) {
 		fprintf(stderr, "Failed to exchange data between server and clients\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* For half duplex tests, server just waits for client to exit */
@@ -237,7 +237,7 @@ int main(int argc, char *argv[])
 
 		if (ctx_close_connection(&user_comm, &my_dest[0], &rem_dest[0])) {
 			fprintf(stderr, "Failed to close connection between server and client\n");
-			return 1;
+			return FAILURE;
 		}
 
 		return destroy_ctx(&ctx, &user_param);
@@ -246,7 +246,7 @@ int main(int argc, char *argv[])
 	if (user_param.use_event) {
 		if (ibv_req_notify_cq(ctx.send_cq, 0)) {
 			fprintf(stderr, "Couldn't request CQ notification\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 	if (user_param.output == FULL_VERBOSITY) {
@@ -259,21 +259,23 @@ int main(int argc, char *argv[])
 
 	if (user_param.test_method == RUN_REGULAR || user_param.test_method == RUN_ALL) {
 
-		if (perform_warm_up(&ctx, &user_param)) {
-			fprintf(stderr, "Problems with warm up\n");
-			return 1;
+		if (user_param.perform_warm_up) {
+			if (perform_warm_up(&ctx, &user_param)) {
+				fprintf(stderr, "Problems with warm up\n");
+				return FAILURE;
+			}
 		}
 
 		if (user_param.duplex) {
 			if (ctx_hand_shake(&user_comm, &my_dest[0], &rem_dest[0])) {
 				fprintf(stderr, "Failed to sync between server and client between different msg sizes\n");
-				return 1;
+				return FAILURE;
 			}
 		}
 
 		if (run_iter_bw(&ctx, &user_param)) {
 			fprintf(stderr, " Error occured in run_iter function\n");
-			return 1;
+			return FAILURE;
 		}
 
 		print_report_bw(&user_param, &my_bw_rep);
@@ -302,7 +304,7 @@ int main(int argc, char *argv[])
 
 		if (run_iter_bw_infinitely(&ctx, &user_param)) {
 			fprintf(stderr, " Error occured while running infinitely! aborting ...\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -322,17 +324,17 @@ int main(int argc, char *argv[])
 
 	if (ctx_close_connection(&user_comm, &my_dest[0], &rem_dest[0])) {
 		fprintf(stderr, "Failed to close connection between server and client\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (!user_param.is_bw_limit_passed && (user_param.is_limit_bw == ON)) {
 		fprintf(stderr, "Error: BW result is below bw limit\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (!user_param.is_msgrate_limit_passed && (user_param.is_limit_bw == ON)) {
 		fprintf(stderr, "Error: Msg rate  is below msg_rate limit\n");
-		return 1;
+		return FAILURE;
 	}
 
 	return destroy_ctx(&ctx, &user_param);
diff --git a/src/atomic_lat.c b/src/atomic_lat.c
index fd61a14..fdcce18 100755
--- a/src/atomic_lat.c
+++ b/src/atomic_lat.c
@@ -77,7 +77,7 @@ int main(int argc, char *argv[])
 	if (ret_parser) {
 		if (ret_parser != VERSION_EXIT && ret_parser != HELP_EXIT)
 			fprintf(stderr," Parser function exited with Error\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if(user_param.use_xrc)
@@ -94,7 +94,7 @@ int main(int argc, char *argv[])
 	ctx.context = ibv_open_device(ib_dev);
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
-		return 1;
+		return FAILURE;
 	}
 
 	#ifdef HAVE_MASKED_ATOMICS
@@ -105,7 +105,7 @@ int main(int argc, char *argv[])
 
 	if (user_param.masked_atomics && (user_param.work_rdma_cm || user_param.use_rdma_cm)) {
 		fprintf(stderr, "atomic test is not supported with -R/-z flag (rdma_cm) with this device.\n");
-		return 1;
+		return FAILURE;
 	}
 
 	#endif
@@ -119,7 +119,7 @@ int main(int argc, char *argv[])
 	/* copy the relevant user parameters to the comm struct + creating rdma_cm resources. */
 	if (create_comm_struct(&user_comm,&user_param)) {
 		fprintf(stderr," Unable to create RDMA_CM resources\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY && user_param.machine == SERVER) {
@@ -184,7 +184,7 @@ int main(int argc, char *argv[])
 	/* Set up the Connection. */
 	if (set_up_connection(&ctx,&user_param,my_dest)) {
 		fprintf(stderr," Unable to set up socket connection\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* Print basic test information. */
@@ -196,7 +196,7 @@ int main(int argc, char *argv[])
 	/* shaking hands and gather the other side info. */
 	if (ctx_hand_shake(&user_comm,my_dest,rem_dest)) {
 		fprintf(stderr,"Failed to exchange data between server and clients\n");
-		return 1;
+		return FAILURE;
 	}
 
 	user_comm.rdma_params->side = REMOTE;
@@ -205,7 +205,7 @@ int main(int argc, char *argv[])
 		/* shaking hands and gather the other side info. */
 		if (ctx_hand_shake(&user_comm,&my_dest[i],&rem_dest[i])) {
 			fprintf(stderr,"Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 
 		ctx_print_pingpong_data(&rem_dest[i],&user_comm);
@@ -215,28 +215,28 @@ int main(int argc, char *argv[])
 		if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0])) {
 			fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
 			fprintf(stderr," Please Try to use a different IP version.\n\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	if (user_param.work_rdma_cm == OFF) {
 		if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
 			fprintf(stderr," Unable to Connect the HCA's through the link\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	/* An additional handshake is required after moving qp to RTR. */
 	if (ctx_hand_shake(&user_comm,my_dest,rem_dest)) {
 		fprintf(stderr,"Failed to exchange data between server and clients\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* Only Client post read request. */
 	if (user_param.machine == SERVER) {
 		if (ctx_close_connection(&user_comm,my_dest,rem_dest)) {
 			fprintf(stderr,"Failed to close connection between server and client\n");
-			return 1;
+			return FAILURE;
 		}
 		if (user_param.output == FULL_VERBOSITY) {
 			printf(RESULT_LINE);
@@ -247,7 +247,7 @@ int main(int argc, char *argv[])
 	if (user_param.use_event) {
 		if (ibv_req_notify_cq(ctx.send_cq, 0)) {
 			fprintf(stderr, "Couldn't request CQ notification\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -265,7 +265,7 @@ int main(int argc, char *argv[])
 
 	if (ctx_close_connection(&user_comm,my_dest,rem_dest)) {
 		fprintf(stderr,"Failed to close connection between server and client\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY) {
diff --git a/src/get_clock.c b/src/get_clock.c
index dc0b0ff..5baa120 100755
--- a/src/get_clock.c
+++ b/src/get_clock.c
@@ -167,15 +167,14 @@ static double proc_get_cpu_mhz(int no_cpu_freq_warn)
 		 * Cpu{cpu-num}ClkTck      : 00000000a9beeee4
 		 */
 		char *s;
-		unsigned val;
 
 		s = strstr(buf, "ClkTck\t: ");
 		if (!s)
 			continue;
 		s += (strlen("ClkTck\t: ") - strlen("0x"));
 		strncpy(s, "0x", strlen("0x"));
-		rc = sscanf(s, "%x", &val);
-		m = val/1000000;
+		rc = sscanf(s, "%lf", &m);
+		m /= 1000000;
 		#else
 		#if defined (__FreeBSD__)
 		rc = sscanf(buf, "hw.clockrate: %lf", &m);
diff --git a/src/get_clock.h b/src/get_clock.h
index 858eb69..b20c91b 100755
--- a/src/get_clock.h
+++ b/src/get_clock.h
@@ -57,7 +57,7 @@ static inline cycles_t get_cycles()
 {
 	cycles_t ret;
 
-	asm volatile ("mftb %0" : "=r" (ret) : );
+	__asm__ __volatile__ ("\n\t isync" "\n\t mftb %0" : "=r"(ret));
 	return ret;
 }
 #elif defined(__ia64__)
diff --git a/src/perftest_parameters.c b/src/perftest_parameters.c
index d5964c6..ac70f20 100755
--- a/src/perftest_parameters.c
+++ b/src/perftest_parameters.c
@@ -14,7 +14,6 @@
 #define ETHERTYPE_LEN (6)
 #define MAC_ARR_LEN (6)
 #define HEX_BASE (16)
-
 static const char *connStr[] = {"RC","UC","UD","RawEth","XRC","DC"};
 static const char *testsStr[] = {"Send","RDMA_Write","RDMA_Read","Atomic"};
 static const char *portStates[] = {"Nop","Down","Init","Armed","","Active Defer"};
@@ -85,7 +84,6 @@ static int parse_mac_from_str(char *mac, u_int8_t *addr)
 	}
 	return SUCCESS;
 }
-
 static int parse_ethertype_from_str(char *ether_str, uint16_t *ethertype_val)
 {
 	if (strlen(ether_str) != ETHERTYPE_LEN) {
@@ -117,6 +115,12 @@ int parse_ip_from_str(char *ip, u_int32_t *addr)
 	return inet_pton(AF_INET, ip, addr);
 }
 
+/******************************************************************************/
+int parse_ip6_from_str(char *ip6, struct in6_addr *addr)
+{
+	return inet_pton(AF_INET6, ip6, addr);
+}
+
 /******************************************************************************
   check_valid_udp_port.
  ******************************************************************************/
@@ -226,7 +230,7 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 	printf("  -h, --help ");
 	printf(" Show this help screen.\n");
 
-	if (tst == LAT) {
+	if (tst == LAT || tst == LAT_BY_BW) {
 		printf("  -H, --report-histogram ");
 		printf(" Print out all results (default print summary only)\n");
 	}
@@ -239,7 +243,7 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 		printf(" Max size of message to be sent in inline\n");
 	}
 
-	if (tst == BW) {
+	if (tst == BW || tst == LAT_BY_BW) {
 		printf("  -l, --post_list=<list size>");
 		printf(" Post list of WQEs of <list size> size (instead of single post)\n");
 	}
@@ -278,8 +282,8 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 	printf("  -p, --port=<port> ");
 	printf(" Listen on/connect to port <port> (default %d)\n",DEF_PORT);
 
-	if (tst == BW  && connection_type != RawEth) {
-		printf("  -q, --qp=<num of qp's>  Num of qp's(default %d)\n",DEF_NUM_QPS);
+	if (tst == BW ) {
+		printf("  -q, --qp=<num of qp's>  Num of qp's(default %d)\n", DEF_NUM_QPS);
 	}
 
 	if (tst == BW) {
@@ -306,7 +310,7 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 	printf("  -S, --sl=<sl> ");
 	printf(" SL (default %d)\n",DEF_SL);
 
-	if (tst == BW) {
+	if (tst == BW || tst == LAT_BY_BW) {
 		printf("  -t, --tx-depth=<dep> ");
 		printf(" Size of tx queue (default %d)\n",tst == LAT ? DEF_TX_LAT : DEF_TX_BW);
 	}
@@ -317,7 +321,7 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 	printf("  -u, --qp-timeout=<timeout> ");
 	printf(" QP timeout, timeout value is 4 usec * 2 ^(timeout), default %d\n",DEF_QP_TIME);
 
-	if (tst == LAT) {
+	if (tst == LAT || tst == LAT_BY_BW) {
 		printf("  -U, --report-unsorted ");
 		printf(" (implies -H) print out unsorted results (default sorted)\n");
 	}
@@ -359,6 +363,10 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 		printf(" Do not exchange versions and MTU with other side \n");
 	}
 
+	printf("      --force-link=<value> ");
+	printf(" Force the link(s) to a specific type: IB or Ethernet.\n");
+
+
 	if (verb != WRITE) {
 		printf("      --inline_recv=<size> ");
 		printf(" Max size of message to be sent in inline receive\n");
@@ -386,7 +394,7 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 		printf(" Create memory region for each qp.\n");
 	}
 
-	#ifdef HAVE_ODP
+	#if defined HAVE_EX_ODP || defined HAVE_EXP_ODP
 	printf("      --odp ");
 	printf(" Use On Demand Paging instead of Memory Registration.\n");
 	#endif
@@ -395,6 +403,9 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 	printf(" Set verbosity output level: bandwidth , message_rate, latency \n");
 	printf(" Latency measurement is Average calculation \n");
 
+	printf("      --perform_warm_up");
+	printf(" Perform some iterations before start measuring in order to warming-up memory cache, valid in Atomic, Read and Write BW tests\n");
+
 	printf("      --pkey_index=<pkey index> PKey index to use for QP\n");
 
 	if ( tst == BW ) {
@@ -429,12 +440,15 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 	printf(" Use CUDA lib for GPU-Direct testing.\n");
 	#endif
 
-
 	#ifdef HAVE_VERBS_EXP
 	printf("      --use_exp ");
 	printf(" Use Experimental verbs in data path. Default is OFF.\n");
 	#endif
 
+	printf("      --use_hugepages ");
+	printf(" Use Hugepages instead of contig, memalign allocations.\n");
+
+
 	#ifdef HAVE_ACCL_VERBS
 	printf("      --use_res_domain ");
 	printf(" Use shared resource domain\n");
@@ -443,7 +457,7 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 	printf(" Set verb type: normal, accl. Default is normal.\n");
 	#endif
 
-	if (tst == BW) {
+	if (tst == BW || tst == LAT_BY_BW) {
 		printf("      --wait_destroy=<seconds> ");
 		printf(" Wait <seconds> before destroying allocated resources (QP/CQ/PD/MR..)\n");
 
@@ -455,10 +469,13 @@ static void usage(const char *argv0, VerbType verb, TestType tst, int connection
 		printf(" Set the maximum rate of sent packages. default unit is [Gbps]. use --rate_units to change that.\n");
 
 		printf("      --rate_units=<units>");
-		printf(" [Mgp] Set the units for rate limit to MBps (M), Gbps (g) or pps (p). default is Gbps (g) , pps not supported when HW limit.\n");
+		printf(" [Mgp] Set the units for rate limit to MBps (M), Gbps (g) or pps (p). default is Gbps (g).\n");
+		printf("      Note (1): pps not supported with HW limit.\n");
+		printf("      Note (2): When using PP rate_units is forced to Kbps.\n");
 
 		printf("      --rate_limit_type=<type>");
-		printf(" [HW/SW] Limit the QP's by HW or by SW. Disabled by default. when rate_limit is specified HW limit is Default .\n");
+		printf(" [HW/SW/PP] Limit the QP's by HW, PP or by SW. Disabled by default. When rate_limit Not is specified HW limit is Default.\n");
+		printf("      Note (1) in Latency under load test SW rate limit is forced\n");
 
 	}
 
@@ -480,10 +497,18 @@ void usage_raw_ethernet(TestType tst)
 	printf(" use RSS on server side. need to open 2^x qps (using -q flag. default is -q 2). open 2^x clients that transmit to this server\n");
 
 	printf("  -J, --dest_ip ");
+	#ifdef HAVE_IPV6
+	printf(" destination ip address by this format X.X.X.X for IPv4 or X:X:X:X:X:X for IPv6 (using to send packets with IP header)\n");
+	#else
 	printf(" destination ip address by this format X.X.X.X (using to send packets with IP header)\n");
+	#endif
 
 	printf("  -j, --source_ip ");
+	#ifdef HAVE_IPV6
+	printf(" source ip address by this format X.X.X.X for IPv4 or X:X:X:X:X:X for IPv6 (using to send packets with IP header)\n");
+	#else
 	printf(" source ip address by this format X.X.X.X (using to send packets with IP header)\n");
+	#endif
 
 	printf("  -K, --dest_port ");
 	printf(" destination port number (using to send packets with UDP header as default, or you can use --tcp flag to send TCP Header)\n");
@@ -517,9 +542,25 @@ void usage_raw_ethernet(TestType tst)
 	printf("      --promiscuous");
 	printf(" run promiscuous mode.\n");
 
+	printf("      --reply_every ");
+	printf(" in latency test, receiver pong after number of received pings\n");
+
+	#if defined HAVE_SNIFFER || defined HAVE_SNIFFER_EXP
+	printf("      --sniffer");
+	printf(" run sniffer mode.\n");
+	#endif
+
 	printf("      --tcp ");
 	printf(" send TCP Packets. must include IP and Ports information.\n");
 
+	#ifdef HAVE_IPV6
+	printf("      --raw_ipv6 ");
+	printf(" send IPv6 Packets.\n");
+	#endif
+
+	printf("      --flow_label ");
+	printf(" IPv6 flow label\n");
+
 	printf("\n");
 
 }
@@ -531,8 +572,10 @@ static void init_perftest_params(struct perftest_parameters *user_param)
 	user_param->port		= DEF_PORT;
 	user_param->ib_port		= DEF_IB_PORT;
 	user_param->ib_port2		= DEF_IB_PORT2;
+	user_param->link_type		= LINK_UNSPEC;
+	user_param->link_type2		= LINK_UNSPEC;
 	user_param->size		= (user_param->tst == BW ) ? DEF_SIZE_BW : DEF_SIZE_LAT;
-	user_param->tx_depth		= (user_param->tst == BW ) ? DEF_TX_BW : DEF_TX_LAT;
+	user_param->tx_depth		= (user_param->tst == BW || user_param->tst == LAT_BY_BW ) ? DEF_TX_BW : DEF_TX_LAT;
 	user_param->qp_timeout		= DEF_QP_TIME;
 	user_param->test_method		= RUN_REGULAR;
 	user_param->cpu_freq_f		= OFF;
@@ -587,6 +630,9 @@ static void init_perftest_params(struct perftest_parameters *user_param)
 	user_param->iters_per_port[0]	= 0;
 	user_param->iters_per_port[1]	= 0;
 	user_param->wait_destroy	= 0;
+	user_param->is_old_raw_eth_param = 0;
+	user_param->is_new_raw_eth_param = 0;
+	user_param->reply_every		= 1;
 
 	if (user_param->tst == LAT) {
 		user_param->r_flag->unsorted	= OFF;
@@ -607,7 +653,9 @@ static void init_perftest_params(struct perftest_parameters *user_param)
 	user_param->ipv6			= 0;
 	user_param->report_per_port		= 0;
 	user_param->use_odp			= 0;
+	user_param->use_hugepages		= 0;
 	user_param->use_promiscuous		= 0;
+	user_param->use_sniffer			= 0;
 	user_param->check_alive_exited		= 0;
 	user_param->raw_mcast			= 0;
 	user_param->masked_atomics		= 0;
@@ -627,6 +675,7 @@ static void init_perftest_params(struct perftest_parameters *user_param)
 	user_param->disable_fcs		= 0;
 	user_param->flows		= DEF_FLOWS;
 	user_param->flows_burst		= 1;
+	user_param->perform_warm_up	= 0;
 }
 
 /******************************************************************************
@@ -803,6 +852,12 @@ static void force_dependecies(struct perftest_parameters *user_param)
 		}
 	}
 
+	if (user_param->tst == LAT_BY_BW && user_param->rate_limit_type == DISABLE_RATE_LIMIT) {
+		if (user_param->output == FULL_VERBOSITY)
+			printf("rate_limit type is forced to SW.\n");
+		user_param->rate_limit_type = SW_RATE_LIMIT;
+	}
+
 	if (user_param->cq_mod > user_param->tx_depth) {
 		user_param->cq_mod = user_param->tx_depth;
 	}
@@ -835,6 +890,8 @@ static void force_dependecies(struct perftest_parameters *user_param)
 			printf(" Dual-port mode not supported in multicast feature\n");
 			exit (1);
 		}
+		if (user_param->link_type != LINK_UNSPEC)
+			user_param->link_type2 = user_param->link_type;
 	}
 
 	if (user_param->post_list > 1) {
@@ -879,11 +936,6 @@ static void force_dependecies(struct perftest_parameters *user_param)
 			exit(1);
 		}
 
-		if (user_param->num_of_qps > 1 && !user_param->use_rss) {
-			printf(RESULT_LINE);
-			fprintf(stdout," Raw Ethernet test supports only 1 QP for now\n");
-			exit(1);
-		}
 		if (user_param->use_rdma_cm == ON || user_param->work_rdma_cm == ON) {
 			fprintf(stderr," RDMA CM isn't supported for Raw Ethernet tests\n");
 			exit(1);
@@ -1081,7 +1133,7 @@ static void force_dependecies(struct perftest_parameters *user_param)
 		user_param->srq_exists = 1;
 
 	if (user_param->burst_size > 0) {
-		if (user_param->rate_limit_type == DISABLE_RATE_LIMIT) {
+		if (user_param->rate_limit_type == DISABLE_RATE_LIMIT && user_param->tst != LAT_BY_BW ) {
 			printf(RESULT_LINE);
 			fprintf(stderr," Can't enable burst mode when rate limiter is off\n");
 			exit(1);
@@ -1132,9 +1184,45 @@ static void force_dependecies(struct perftest_parameters *user_param)
 			}
 			user_param->valid_hw_rate_limit = rate_to_set;
 		}
+	} else if (user_param->rate_limit_type == PP_RATE_LIMIT) {
+		if (user_param->rate_limit < 0) {
+			fprintf(stderr," Must specify a rate limit when using Packet Pacing.\n Please add --rate_limit=<limit>.\n");
+			exit(1);
+		}
+		if (user_param->connection_type != RawEth) {
+			fprintf(stderr,"Packet Pacing is only supported for Raw Ethernet.\n");
+			exit(1);
+		}
+
+		if (user_param->rate_units != MEGA_BYTE_PS) {
+			fprintf(stderr,"Packet Pacing only supports MEGA_BYTE_PS.\n");
+			exit(1);
+		}
+
+		user_param->rate_limit = user_param->rate_limit * 8 * 1024;
 	}
 
-	if (user_param->output != -1) {
+	if (user_param->tst == LAT_BY_BW) {
+		if ( user_param->test_type == DURATION) {
+			fprintf(stderr, "Latency under load test is currently support iteration mode only.\n");
+			exit(1);
+		}
+		if (user_param->num_of_qps > 1) {
+			fprintf(stderr, "Multi QP is not supported in LAT under load test\n");
+			exit(1);
+		}
+		if (user_param->duplex) {
+			fprintf(stderr, "Bi-Dir is not supported in LAT under load test\n");
+			exit(1);
+		}
+		if(user_param->output != FULL_VERBOSITY && user_param->output != OUTPUT_LAT) {
+			printf(RESULT_LINE);
+			fprintf(stderr," Output verbosity level for BW can be latency\n");
+			exit(1);
+		}
+	}
+
+	if (user_param->output != FULL_VERBOSITY) {
 		if (user_param->tst == BW && !(user_param->output == OUTPUT_BW || user_param->output == OUTPUT_MR)) {
 			printf(RESULT_LINE);
 			fprintf(stderr," Output verbosity level for BW can be: bandwidth, message_rate\n");
@@ -1243,6 +1331,12 @@ static void force_dependecies(struct perftest_parameters *user_param)
 			exit(1);
 		}
 	}
+	if (user_param->perform_warm_up &&
+	    !(user_param->tst == BW &&
+	    (user_param->verb == ATOMIC || user_param->verb == WRITE || user_param->verb == READ))) {
+		fprintf(stderr, "Perform warm up is available in ATOMIC, READ and WRITE BW tests only");
+		exit(1);
+	}
 	#endif
 
 	return;
@@ -1265,9 +1359,9 @@ const char *transport_str(enum ibv_transport_type type)
 }
 
 /******************************************************************************
- *
+ * Try to map verbs' link layer types to a descriptive string or "Unknown"
  ******************************************************************************/
-const char *link_layer_str(uint8_t link_layer)
+const char *link_layer_str(int8_t link_layer)
 {
 	switch (link_layer) {
 
@@ -1276,16 +1370,25 @@ const char *link_layer_str(uint8_t link_layer)
 			return "IB";
 		case IBV_LINK_LAYER_ETHERNET:
 			return "Ethernet";
-		#ifdef HAVE_SCIF
-		case IBV_LINK_LAYER_SCIF:
-			return "SCIF";
-		#endif
 		default:
 			return "Unknown";
 	}
 }
 
 /******************************************************************************
+ * Try to parse a string to a verbs link layer or LINK_FAILURE
+ ******************************************************************************/
+const int str_link_layer(const char *str)
+{
+	if (strncasecmp("IB", str, 2) == 0)
+		return IBV_LINK_LAYER_INFINIBAND;
+	else if (strncasecmp("Ethernet", str, 8) == 0)
+		return IBV_LINK_LAYER_ETHERNET;
+	else
+		return LINK_FAILURE;
+}
+
+/******************************************************************************
  *
  ******************************************************************************/
 enum ctx_device ib_dev_name(struct ibv_context *context)
@@ -1317,6 +1420,10 @@ enum ctx_device ib_dev_name(struct ibv_context *context)
 			case 4116  : dev_fname = CONNECTX4; break;
 			case 4117  : dev_fname = CONNECTX4LX; break;
 			case 4118  : dev_fname = CONNECTX4LX; break;
+			case 4119  : dev_fname = CONNECTX5; break;
+			case 4120  : dev_fname = CONNECTX5; break;
+			case 4121  : dev_fname = CONNECTX5EX; break;
+			case 4122  : dev_fname = CONNECTX5EX; break;
 			case 4113  : dev_fname = CONNECTIB; break;
 			case 4099  : dev_fname = CONNECTX3; break;
 			case 4100  : dev_fname = CONNECTX3; break;
@@ -1397,32 +1504,63 @@ enum ibv_mtu set_mtu(struct ibv_context *context,uint8_t ib_port,int user_mtu)
 }
 
 /******************************************************************************
+ * Set both link layers and return SUCCESS if both ports are active.
+ * FAILURE is returned when requested port/link is not active/known except
+ * when the link type is over-rode (--force-link="..."), in which case FAILURE
+ * is returned only when the link(s) are not active.
  *
+ * When --force-link is specified both ports are over-rode (ie no support for
+ * forcing different link types on different ports).
  ******************************************************************************/
-static uint8_t set_link_layer(struct ibv_context *context,uint8_t ib_port)
+static int set_link_layer(struct ibv_context *context, struct perftest_parameters *params)
 {
 	struct ibv_port_attr port_attr;
-	uint8_t curr_link;
+	int8_t curr_link = params->link_type;
 
-	if (ibv_query_port(context,ib_port,&port_attr)) {
-		fprintf(stderr," Unable to query port attributes\n");
-		return LINK_FAILURE;
+	if (ibv_query_port(context, params->ib_port, &port_attr)) {
+		fprintf(stderr, " Unable to query port %d attributes\n", params->ib_port);
+		return FAILURE;
 	}
 
+	if (curr_link == LINK_UNSPEC)
+		params->link_type = port_attr.link_layer;
+
 	if (port_attr.state != IBV_PORT_ACTIVE) {
-		fprintf(stderr," Port number %d state is %s\n"
-				,ib_port
+		fprintf(stderr, " Port number %d state is %s\n"
+				,params->ib_port
 				,portStates[port_attr.state]);
-		return LINK_FAILURE;
+		return FAILURE;
 	}
 
-	curr_link = port_attr.link_layer;
-	if (!strcmp(link_layer_str(curr_link),"Unknown")) {
-		fprintf(stderr," Unable to determine link layer \n");
-		return LINK_FAILURE;
+	if (strcmp("Unknown", link_layer_str(params->link_type)) == 0) {
+		fprintf(stderr, "Link layer on port %d is Unknown\n", params->ib_port);
+		return FAILURE;
 	}
 
-	return port_attr.link_layer;
+	if (params->dualport == ON) {
+		curr_link = params->link_type2;
+		if (ibv_query_port(context, params->ib_port2, &port_attr)) {
+			fprintf(stderr, " Unable to query port %d attributes\n", params->ib_port2);
+			return FAILURE;
+		}
+
+		if (curr_link == LINK_UNSPEC)
+			params->link_type2 = port_attr.link_layer;
+
+		if (port_attr.state != IBV_PORT_ACTIVE) {
+			fprintf(stderr, " Port number %d state is %s\n"
+				,params->ib_port2
+				,portStates[port_attr.state]);
+			return FAILURE;
+		}
+
+		if (strcmp("Unknown", link_layer_str(params->link_type2)) == 0) {
+			fprintf(stderr, "Link layer on port %d is Unknown\n", params->ib_port2);
+			return FAILURE;
+		}
+	}
+
+	return SUCCESS;
 }
 
 /******************************************************************************
@@ -1489,6 +1627,41 @@ static void ctx_set_max_inline(struct ibv_context *context,struct perftest_param
 /******************************************************************************
  *
  ******************************************************************************/
+void set_raw_eth_parameters(struct perftest_parameters *user_param)
+{
+	int i;
+
+	if (user_param->is_new_raw_eth_param == 1 && user_param->is_old_raw_eth_param == 1) {
+		printf(RESULT_LINE);
+		fprintf(stderr," Invalid Command line.\nMix of source with local|remote and dest with local|remote is not supported.\n");
+		fprintf(stderr,"For L2 tests you must enter local and remote mac  by this format --local_mac XX:XX:XX:XX:XX:XX --remote_mac XX:XX:XX:XX:XX:XX\n");
+		fprintf(stderr,"For L3 tests You must add also local and remote ip  by this format --local_ip X.X.X.X --remote_ip X.X.X.X\n");
+		fprintf(stderr,"For L4 you need to add also local and remote port  by this format --local_port XXXX  --remote_port XXXX\n");
+		exit(1);
+	}
+	if (user_param->is_new_raw_eth_param) {
+		for (i = 0; i < MAC_ARR_LEN; i++)
+		{
+			user_param->source_mac[i] = user_param->local_mac[i];
+			user_param->dest_mac[i] = user_param->remote_mac[i];
+		}
+
+		if (user_param->machine == SERVER) {
+			user_param->server_ip = user_param->local_ip;
+			user_param->client_ip = user_param->remote_ip;
+			user_param->server_port = user_param->local_port;
+			user_param->client_port = user_param->remote_port;
+		} else if (user_param->machine == CLIENT) {
+			user_param->server_ip = user_param->remote_ip;
+			user_param->client_ip = user_param->local_ip;
+			user_param->server_port = user_param->remote_port;
+			user_param->client_port = user_param->local_port;
+		}
+	}
+}
+/******************************************************************************
+ *
+ ******************************************************************************/
 int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 {
 	int c,size_len;
@@ -1508,6 +1681,7 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 	static int verbosity_output_flag = 0;
 	static int cpu_util_flag = 0;
 	static int latency_gap_flag = 0;
+	static int flow_label_flag = 0;
 	static int retry_count_flag = 0;
 	static int dont_xchg_versions_flag = 0;
 	static int use_exp_flag = 0;
@@ -1515,9 +1689,12 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 	static int mmap_file_flag = 0;
 	static int mmap_offset_flag = 0;
 	static int ipv6_flag = 0;
+	static int raw_ipv6_flag = 0;
 	static int report_per_port_flag = 0;
 	static int odp_flag = 0;
+	static int hugepages_flag = 0;
 	static int use_promiscuous_flag = 0;
+	static int use_sniffer_flag = 0;
 	static int raw_mcast_flag = 0;
 	static int verb_type_flag = 0;
 	static int use_res_domain_flag = 0;
@@ -1528,6 +1705,20 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 	static int disable_fcs_flag = 0;
 	static int flows_flag = 0;
 	static int flows_burst_flag = 0;
+	static int force_link_flag = 0;
+	static int local_ip_flag = 0;
+	static int remote_ip_flag = 0;
+	static int local_port_flag = 0;
+	static int remote_port_flag = 0;
+	static int local_mac_flag = 0;
+	static int remote_mac_flag = 0;
+	static int reply_every_flag = 0;
+	static int perform_warm_up_flag = 0;
+
+	char *server_ip = NULL;
+	char *client_ip = NULL;
+	char *local_ip = NULL;
+	char *remote_ip = NULL;
 
 	init_perftest_params(user_param);
 
@@ -1585,6 +1776,13 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 			{ .name = "client",		.has_arg = 0, .val = 'P' },
 			{ .name = "mac_fwd",		.has_arg = 0, .val = 'v' },
 			{ .name = "use_rss",		.has_arg = 0, .val = 'G' },
+			{ .name = "force-link",		.has_arg = 1, .flag = &force_link_flag, .val = 1},
+			{ .name = "remote_mac",		.has_arg = 1, .flag = &remote_mac_flag, .val = 1 },
+			{ .name = "local_mac",		.has_arg = 1, .flag = &local_mac_flag, .val = 1 },
+			{ .name = "remote_ip",		.has_arg = 1, .flag = &remote_ip_flag, .val = 1 },
+			{ .name = "local_ip",		.has_arg = 1, .flag = &local_ip_flag, .val = 1 },
+			{ .name = "remote_port",	.has_arg = 1, .flag = &remote_port_flag, .val = 1 },
+			{ .name = "local_port",		.has_arg = 1, .flag = &local_port_flag, .val = 1 },
 			{ .name = "run_infinitely",	.has_arg = 0, .flag = &run_inf_flag, .val = 1 },
 			{ .name = "report_gbits",	.has_arg = 0, .flag = &report_fmt_flag, .val = 1},
 			{ .name = "use-srq",		.has_arg = 0, .flag = &srq_flag, .val = 1},
@@ -1600,15 +1798,23 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 			{ .name = "output",		.has_arg = 1, .flag = &verbosity_output_flag, .val = 1},
 			{ .name = "cpu_util",		.has_arg = 0, .flag = &cpu_util_flag, .val = 1},
 			{ .name = "latency_gap",	.has_arg = 1, .flag = &latency_gap_flag, .val = 1},
+			{ .name = "flow_label",		.has_arg = 1, .flag = &flow_label_flag, .val = 1},
 			{ .name = "retry_count",	.has_arg = 1, .flag = &retry_count_flag, .val = 1},
 			{ .name = "dont_xchg_versions",	.has_arg = 0, .flag = &dont_xchg_versions_flag, .val = 1},
 			{ .name = "use_cuda",		.has_arg = 0, .flag = &use_cuda_flag, .val = 1},
 			{ .name = "mmap",		.has_arg = 1, .flag = &mmap_file_flag, .val = 1},
 			{ .name = "mmap-offset",	.has_arg = 1, .flag = &mmap_offset_flag, .val = 1},
 			{ .name = "ipv6",		.has_arg = 0, .flag = &ipv6_flag, .val = 1},
+			#ifdef HAVE_IPV6
+			{ .name = "raw_ipv6",		.has_arg = 0, .flag = &raw_ipv6_flag, .val = 1},
+			#endif
 			{ .name = "report-per-port",	.has_arg = 0, .flag = &report_per_port_flag, .val = 1},
 			{ .name = "odp",		.has_arg = 0, .flag = &odp_flag, .val = 1},
+			{ .name = "use_hugepages",		.has_arg = 0, .flag = &hugepages_flag, .val = 1},
 			{ .name = "promiscuous",	.has_arg = 0, .flag = &use_promiscuous_flag, .val = 1},
+			#if defined HAVE_SNIFFER || defined HAVE_SNIFFER_EXP
+			{ .name = "sniffer",		.has_arg = 0, .flag = &use_sniffer_flag, .val = 1},
+			#endif
 			{ .name = "raw_mcast",		.has_arg = 0, .flag = &raw_mcast_flag, .val = 1},
 			#ifdef HAVE_VERBS_EXP
 			{ .name = "use_exp",		.has_arg = 0, .flag = &use_exp_flag, .val = 1},
@@ -1626,6 +1832,8 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 			#endif
 			{ .name = "flows",		.has_arg = 1, .flag = &flows_flag, .val = 1},
 			{ .name = "flows_burst",	.has_arg = 1, .flag = &flows_burst_flag, .val = 1},
+			{ .name = "reply_every",	.has_arg = 1, .flag = &reply_every_flag, .val = 1},
+			{ .name = "perform_warm_up",	.has_arg = 0, .flag = &perform_warm_up_flag, .val = 1},
 			{ 0 }
 		};
 		c = getopt_long(argc,argv,"w:y:p:d:i:m:s:n:t:u:S:x:c:q:I:o:M:r:Q:A:l:D:f:B:T:E:J:j:K:k:aFegzRvhbNVCHUOZP",long_options,NULL);
@@ -1654,10 +1862,9 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 			case 'x': CHECK_VALUE(user_param->gid_index, uint8_t, MIN_GID_IX, MAX_GID_IX, "Gid index");
 				  user_param->use_gid_user = 1; break;
 			case 'c': change_conn_type(&user_param->connection_type,user_param->verb,optarg); break;
-			case 'q':
-				  if (user_param->tst != BW) {
-					  fprintf(stderr," Multiple QPs only available on bw tests\n");
-					  return 1;
+			case 'q': if (user_param->tst != BW) {
+					fprintf(stderr," Multiple QPs only available on bw tests\n");
+					return 1;
 				  }
 				  CHECK_VALUE(user_param->num_of_qps,int,MIN_QP_NUM,MAX_QP_NUM,"num of Qps");
 				  break;
@@ -1767,44 +1974,43 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 					  return 1;
 				  } break;
 			case 'H':
-				  if (user_param->tst != LAT) {
-					  fprintf(stderr," Availible only on Latency tests\n");
+				  if (user_param->tst == BW) {
+					  fprintf(stderr," Available only on Latency tests\n");
 					  return 1;
 				  }
 				  user_param->r_flag->histogram = ON;
 				  break;
 			case 'U':
-				  if (user_param->tst != LAT) {
-					  fprintf(stderr," Availible only on Latency tests\n");
+				  if (user_param->tst == BW) {
+					fprintf(stderr," is Available only on Latency tests\n");
 					  return 1;
 				  }
 				  user_param->r_flag->unsorted = ON;
 				  break;
 			case 'B':
+				  user_param->is_old_raw_eth_param = 1;
 				  user_param->is_source_mac = ON;
 				  if(parse_mac_from_str(optarg, user_param->source_mac))
 					  return FAILURE;
 				  break;
 			case 'E':
+				  user_param->is_old_raw_eth_param = 1;
 				  user_param->is_dest_mac = ON;
 				  if(parse_mac_from_str(optarg, user_param->dest_mac))
 					  return FAILURE;
 				  break;
 			case 'J':
+				  user_param->is_old_raw_eth_param = 1;
 				  user_param->is_server_ip = ON;
-				  if(1 != parse_ip_from_str(optarg, &(user_param->server_ip))) {
-					  fprintf(stderr," Invalid server IP address\n");
-					  return FAILURE;
-				  }
+				  server_ip = optarg;
 				  break;
 			case 'j':
+				  user_param->is_old_raw_eth_param = 1;
 				  user_param->is_client_ip = ON;
-				  if(1 != parse_ip_from_str(optarg, &(user_param->client_ip))) {
-					  fprintf(stderr," Invalid client IP address\n");
-					  return FAILURE;
-				  }
+				  client_ip = optarg;
 				  break;
 			case 'K':
+				  user_param->is_old_raw_eth_param = 1;
 				  user_param->is_server_port = ON;
 				  user_param->server_port = strtol(optarg, NULL, 0);
 				  if(OFF == check_if_valid_udp_port(user_param->server_port)) {
@@ -1813,6 +2019,7 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 				  }
 				  break;
 			case 'k':
+				  user_param->is_old_raw_eth_param = 1;
 				  user_param->is_client_port = ON;
 				  user_param->client_port = strtol(optarg, NULL, 0);
 				  if(OFF == check_if_valid_udp_port(user_param->client_port)) {
@@ -1896,8 +2103,10 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 						user_param->rate_limit_type = SW_RATE_LIMIT;
 					else if(strcmp("HW",optarg) == 0)
 						user_param->rate_limit_type = HW_RATE_LIMIT;
+					else if(strcmp("PP",optarg) == 0)
+						user_param->rate_limit_type = PP_RATE_LIMIT;
 					else {
-						fprintf(stderr, " Invalid HW limit type  flag. Please use HW, SW \n");
+						fprintf(stderr, " Invalid rate limit type flag. Please use HW, SW or PP.\n");
 						return FAILURE;
 					}
 					rate_limit_type_flag = 0;
@@ -1923,6 +2132,14 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 					}
 					latency_gap_flag = 0;
 				}
+				if (flow_label_flag) {
+					user_param->flow_label = strtol(optarg,NULL,0);
+					if (user_param->flow_label < 0) {
+						fprintf(stderr, "flow label must be non-negative\n");
+						return FAILURE;
+					}
+					flow_label_flag = 0;
+				}
 				if (retry_count_flag) {
 					user_param->retry_count = strtol(optarg,NULL,0);
 					if (user_param->retry_count < 0) {
@@ -1979,6 +2196,64 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 					flows_burst_flag = 0;
 
 				}
+				if (force_link_flag) {
+					user_param->link_type = str_link_layer(optarg);
+					if (user_param->link_type == LINK_FAILURE) {
+						fprintf(stderr, "Invalid link layer value should be IB or ETHERNET.\n");
+						return FAILURE;
+					}
+					force_link_flag = 0;
+				}
+				if (remote_mac_flag) {
+					user_param->is_new_raw_eth_param = 1;
+					user_param->is_dest_mac = 1;
+					if(parse_mac_from_str(optarg, user_param->remote_mac))
+						return FAILURE;
+					remote_mac_flag = 0;
+				}
+				if (local_mac_flag) {
+					user_param->is_new_raw_eth_param = 1;
+					user_param->is_source_mac = 1;
+					if(parse_mac_from_str(optarg, user_param->local_mac))
+						return FAILURE;
+					local_mac_flag = 0;
+				}
+				if (remote_ip_flag) {
+					user_param->is_new_raw_eth_param = 1;
+					user_param->is_client_ip = 1;
+					remote_ip = optarg;
+					remote_ip_flag = 0;
+				}
+				if (local_ip_flag) {
+					user_param->is_new_raw_eth_param = 1;
+					user_param->is_server_ip = 1;
+					local_ip = optarg;
+					local_ip_flag = 0;
+				}
+				if (remote_port_flag) {
+					user_param->is_new_raw_eth_param = 1;
+					user_param->is_client_port = 1;
+					user_param->remote_port = strtol(optarg, NULL, 0);
+					if(OFF == check_if_valid_udp_port(user_param->remote_port)) {
+						fprintf(stderr," Invalid remote UDP port\n");
+						return FAILURE;
+					}
+					remote_port_flag = 0;
+				}
+				if (local_port_flag) {
+					user_param->is_new_raw_eth_param = 1;
+					user_param->is_server_port = 1;
+					user_param->local_port = strtol(optarg, NULL, 0);
+					if(OFF == check_if_valid_udp_port(user_param->local_port)) {
+						fprintf(stderr," Invalid local UDP port\n");
+						return FAILURE;
+					}
+					local_port_flag = 0;
+				}
+				if (reply_every_flag) {
+					user_param->reply_every = strtol(optarg, NULL, 0);
+					reply_every_flag = 0;
+				}
 				break;
 
 			default:
@@ -2042,14 +2317,89 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 		user_param->ipv6 = 1;
 	}
 
+	if (raw_ipv6_flag) {
+		if (user_param->is_new_raw_eth_param) {
+			if (user_param->is_server_ip) {
+				if(1 != parse_ip6_from_str(local_ip,
+							  (struct in6_addr *)&(user_param->local_ip6))) {
+					fprintf(stderr," Invalid local IP address\n");
+					return FAILURE;
+				}
+			}
+			if (user_param->is_client_ip) {
+				if(1 != parse_ip6_from_str(remote_ip,
+							  (struct in6_addr *)&(user_param->remote_ip6))) {
+					fprintf(stderr," Invalid remote IP address\n");
+					return FAILURE;
+				}
+			}
+		} else {
+			if (user_param->is_server_ip) {
+				if(1 != parse_ip6_from_str(server_ip,
+							  (struct in6_addr *)&(user_param->server_ip6))) {
+					fprintf(stderr," Invalid server IP address\n");
+					return FAILURE;
+				}
+			}
+			if (user_param->is_client_ip) {
+				if(1 != parse_ip6_from_str(client_ip,
+							  (struct in6_addr *)&(user_param->client_ip6))) {
+					fprintf(stderr," Invalid client IP address\n");
+					return FAILURE;
+				}
+			}
+		}
+		user_param->raw_ipv6 = 1;
+	} else {
+		if (user_param->is_new_raw_eth_param) {
+			if (user_param->is_server_ip) {
+				if(1 != parse_ip_from_str(local_ip,
+							  &(user_param->local_ip))) {
+					fprintf(stderr," Invalid local IP address\n");
+					return FAILURE;
+				}
+			}
+			if (user_param->is_client_ip) {
+				if(1 != parse_ip_from_str(remote_ip,
+							  &(user_param->remote_ip))) {
+					fprintf(stderr," Invalid remote IP address\n");
+					return FAILURE;
+				}
+			}
+		} else {
+			if (user_param->is_server_ip) {
+				if(1 != parse_ip_from_str(server_ip,
+							  &(user_param->server_ip))) {
+					fprintf(stderr," Invalid server IP address\n");
+					return FAILURE;
+				}
+			}
+			if (user_param->is_client_ip) {
+				if(1 != parse_ip_from_str(client_ip,
+							  &(user_param->client_ip))) {
+					fprintf(stderr," Invalid client IP address\n");
+					return FAILURE;
+				}
+			}
+		}
+	}
+
 	if(odp_flag) {
 		user_param->use_odp = 1;
 	}
 
+	if(hugepages_flag) {
+		user_param->use_hugepages = 1;
+	}
+
 	if (use_promiscuous_flag) {
 		user_param->use_promiscuous = 1;
 	}
 
+	if (use_sniffer_flag) {
+		user_param->use_sniffer = 1;
+	}
+
 	if (raw_mcast_flag) {
 		user_param->raw_mcast = 1;
 	}
@@ -2061,7 +2411,9 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 	if (disable_fcs_flag) {
 		user_param->disable_fcs = 1;
 	}
-
+	if (perform_warm_up_flag) {
+		user_param->perform_warm_up = 1;
+	}
 	if (optind == argc - 1) {
 		GET_STRING(user_param->servername,strdupa(argv[optind]));
 
@@ -2080,7 +2432,7 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 		else
 			user_param->machine = SERVER;
 	}
-
+	set_raw_eth_parameters(user_param);
 	force_dependecies(user_param);
 	return 0;
 }
@@ -2091,9 +2443,8 @@ int parser(struct perftest_parameters *user_param,char *argv[], int argc)
 int check_link_and_mtu(struct ibv_context *context,struct perftest_parameters *user_param)
 {
 	user_param->transport_type = context->device->transport_type;
-	user_param->link_type = set_link_layer(context,user_param->ib_port);
 
-	if (user_param->link_type == LINK_FAILURE) {
+	if (set_link_layer(context, user_param) == FAILURE) {
 		fprintf(stderr, " Couldn't set the link layer\n");
 		return FAILURE;
 	}
@@ -2119,14 +2470,9 @@ int check_link_and_mtu(struct ibv_context *context,struct perftest_parameters *u
 
 	if (user_param->dualport==ON) {
 
-		user_param->link_type2 = set_link_layer(context,user_param->ib_port2);
 		if (user_param->link_type2 == IBV_LINK_LAYER_ETHERNET &&  user_param->gid_index2 == -1) {
 			user_param->gid_index2 = 1;
 		}
-		if (user_param->link_type2 == LINK_FAILURE) {
-			fprintf(stderr, " Couldn't set the link layer\n");
-			return FAILURE;
-		}
 	}
 
 	/* Compute Max inline size with pre found statistics values */
@@ -2173,9 +2519,8 @@ int check_link_and_mtu(struct ibv_context *context,struct perftest_parameters *u
 int check_link(struct ibv_context *context,struct perftest_parameters *user_param)
 {
 	user_param->transport_type = context->device->transport_type;
-	user_param->link_type = set_link_layer(context,user_param->ib_port);
 
-	if (user_param->link_type == LINK_FAILURE) {
+	if (set_link_layer(context, user_param) == FAILURE){
 		fprintf(stderr, " Couldn't set the link layer\n");
 		return FAILURE;
 	}
@@ -2194,14 +2539,9 @@ int check_link(struct ibv_context *context,struct perftest_parameters *user_para
 
 	/* in case of dual-port mode */
 	if (user_param->dualport==ON) {
-		user_param->link_type2 = set_link_layer(context,user_param->ib_port2);
 		if (user_param->link_type2 == IBV_LINK_LAYER_ETHERNET &&  user_param->gid_index2 == -1) {
 			user_param->gid_index2 = 1;
 		}
-		if (user_param->link_type2 == LINK_FAILURE) {
-			fprintf(stderr, " Couldn't set the link layer\n");
-			return FAILURE;
-		}
 	}
 
 	/* Compute Max inline size with pre found statistics values */
@@ -2518,22 +2858,23 @@ static int cycles_compare(const void *aptr, const void *bptr)
 /******************************************************************************
  *
  ******************************************************************************/
-#define cycles_to_usec(sample, cycles_to_units, factor) ((((sample) / (cycles_to_units)) / (factor)))
 
 void print_report_lat (struct perftest_parameters *user_param)
 {
 
 	int i;
 	int rtt_factor;
-	double cycles_to_units, temp_var, pow_var;
+	double cycles_to_units, cycles_rtt_quotient, temp_var, pow_var;
 	cycles_t median ;
 	cycles_t *delta = NULL;
 	const char* units;
 	double latency, stdev, average_sum = 0 , average, stdev_sum = 0;
-	int iters_99,iters_99_9;
+	int iters_99, iters_99_9;
+	int measure_cnt;
 
+	measure_cnt = (user_param->tst == LAT) ? user_param->iters : (user_param->iters) / user_param->reply_every;
 	rtt_factor = (user_param->verb == READ || user_param->verb == ATOMIC) ? 1 : 2;
-	ALLOCATE(delta,cycles_t,user_param->iters - 1);
+	ALLOCATE(delta, cycles_t, measure_cnt);
 
 	if (user_param->r_flag->cycles) {
 		cycles_to_units = 1;
@@ -2543,40 +2884,48 @@ void print_report_lat (struct perftest_parameters *user_param)
 		units = "usec";
 	}
 
-	for (i = 0; i < user_param->iters - 1; ++i)
-		delta[i] = user_param->tposted[i + 1] - user_param->tposted[i];
+	if (user_param->tst == LAT) {
+		for (i = 0; i < measure_cnt - 1; ++i) {
+			delta[i] = user_param->tposted[i + 1] - user_param->tposted[i];
+		}
+	} else if (user_param->tst == LAT_BY_BW) {
+		for (i = 0; i < measure_cnt; ++i) {
+			delta[i] = user_param->tcompleted[i] - user_param->tposted[i];
+		}
+	}
+	else {
+		fprintf(stderr,"print report LAT is support in LAT and LAT_BY_BW tests only\n");
+		exit(1);
+	}
 
+	cycles_rtt_quotient = cycles_to_units / rtt_factor;
 	if (user_param->r_flag->unsorted) {
 		printf("#, %s\n", units);
-		for (i = 0; i < user_param->iters - 1; ++i)
-			printf("%d, %g\n", i + 1, cycles_to_usec(delta[i], cycles_to_units, rtt_factor));
+		for (i = 0; i < measure_cnt; ++i)
+			printf("%d, %g\n", i + 1, delta[i] / cycles_rtt_quotient);
 	}
 
-	qsort(delta, user_param->iters - 1, sizeof *delta, cycles_compare);
+	qsort(delta, measure_cnt, sizeof *delta, cycles_compare);
 
-	median = get_median(user_param->iters - 1, delta);
-
-	iters_99 = ceil((user_param->iters - 1 )*0.99);
-	iters_99_9 = ceil((user_param->iters - 1)*0.999);
+	median = get_median(measure_cnt, delta);
 
 	/* calcualte average sum on sorted array*/
-	for (i = 0; i < user_param->iters - 1; ++i)
-		average_sum += cycles_to_usec(delta[i], cycles_to_units, rtt_factor);
+	for (i = 0; i < measure_cnt; ++i)
+		average_sum += (delta[i] / cycles_rtt_quotient);
 
-	average = average_sum / (user_param->iters - 1);
+	average = average_sum / measure_cnt;
 
 	/* Calculate stdev by variance*/
-	for (i = 0; i < user_param->iters - 1; ++i) {
-		temp_var = average - cycles_to_usec(delta[i], cycles_to_units, rtt_factor);
+	for (i = 0; i < measure_cnt; ++i) {
+		temp_var = average - (delta[i] / cycles_rtt_quotient);
 		pow_var = pow(temp_var, 2 );
 		stdev_sum += pow_var;
 	}
-	stdev = sqrt(stdev_sum / (user_param->iters));
 
 	if (user_param->r_flag->histogram) {
 		printf("#, %s\n", units);
-		for (i = 0; i < user_param->iters - 1; ++i)
-			printf("%d, %g\n", i + 1, cycles_to_usec(delta[i], cycles_to_units, rtt_factor));
+		for (i = 0; i < measure_cnt; ++i)
+			printf("%d, %g\n", i + 1, delta[i] / cycles_rtt_quotient);
 	}
 
 	if (user_param->r_flag->unsorted || user_param->r_flag->histogram) {
@@ -2587,7 +2936,11 @@ void print_report_lat (struct perftest_parameters *user_param)
 		}
 	}
 
-	latency = cycles_to_usec(median, cycles_to_units, rtt_factor);
+	latency = median / cycles_rtt_quotient;
+	stdev = sqrt(stdev_sum / measure_cnt);
+	iters_99 = ceil((measure_cnt - 1 ) * 0.99);
+	iters_99_9 = ceil((measure_cnt - 1) * 0.999);
+
 
 	if (user_param->output == OUTPUT_LAT)
 		printf("%lf\n",average);
@@ -2595,13 +2948,13 @@ void print_report_lat (struct perftest_parameters *user_param)
 		printf(REPORT_FMT_LAT,
 				(unsigned long)user_param->size,
 				user_param->iters,
-				cycles_to_usec(delta[0], cycles_to_units, rtt_factor),
-				cycles_to_usec(delta[user_param->iters - 2], cycles_to_units, rtt_factor),
+				delta[0] / cycles_rtt_quotient,
+				delta[user_param->iters - 2] / cycles_rtt_quotient,
 				latency,
 				average,
 				stdev,
-				cycles_to_usec(delta[iters_99], cycles_to_units, rtt_factor),
-				cycles_to_usec(delta[iters_99_9], cycles_to_units, rtt_factor));
+				delta[iters_99] / cycles_rtt_quotient,
+				delta[iters_99_9] / cycles_rtt_quotient);
 		printf( user_param->cpu_util_data.enable ? REPORT_EXT_CPU_UTIL : REPORT_EXT , calc_cpu_util(user_param));
 	}
 
diff --git a/src/perftest_parameters.h b/src/perftest_parameters.h
index faea8c3..c676d69 100755
--- a/src/perftest_parameters.h
+++ b/src/perftest_parameters.h
@@ -89,7 +89,8 @@
 #define HELP_EXIT	 (11)
 #define MTU_FIX	     (7)
 #define MAX_SIZE     (8388608)
-#define LINK_FAILURE (4)
+#define LINK_FAILURE (-1)
+#define LINK_UNSPEC (-2)
 #define MAX_OUT_READ_HERMON (16)
 #define MAX_OUT_READ        (4)
 #define UD_ADDITION         (40)
@@ -135,7 +136,7 @@
 
 /* Max and Min allowed values for perftest parameters. */
 #define MIN_TOS		(0)
-#define MAX_TOS		(256)
+#define MAX_TOS		(255)
 #define MIN_IB_PORT   (1)
 #define MAX_IB_PORT   (3)
 #define MIN_ITER      (5)
@@ -230,7 +231,7 @@
 typedef enum { SEND , WRITE, READ, ATOMIC } VerbType;
 
 /* The type of the test */
-typedef enum { LAT , BW } TestType;
+typedef enum { LAT , BW , LAT_BY_BW } TestType;
 
 /* The type of the machine ( server or client actually). */
 typedef enum { SERVER , CLIENT , UNCHOSEN} MachineType;
@@ -269,14 +270,16 @@ enum ctx_device {
 	CONNECTX4		= 10,
 	CONNECTX4LX		= 11,
 	QLOGIC_E4		= 12,
-	QLOGIC_AH		= 13
+	QLOGIC_AH		= 13,
+	CONNECTX5		= 14,
+	CONNECTX5EX		= 15
 };
 
 /* Units for rate limiter */
 enum rate_limiter_units {MEGA_BYTE_PS, GIGA_BIT_PS, PACKET_PS};
 
 /*Types rate limit*/
-enum rate_limiter_types {HW_RATE_LIMIT, SW_RATE_LIMIT, DISABLE_RATE_LIMIT};
+enum rate_limiter_types {HW_RATE_LIMIT, SW_RATE_LIMIT, PP_RATE_LIMIT, DISABLE_RATE_LIMIT};
 
 /* Verbosity Levels for test report */
 enum verbosity_level {FULL_VERBOSITY=-1, OUTPUT_BW=0, OUTPUT_MR, OUTPUT_LAT };
@@ -325,15 +328,27 @@ struct perftest_parameters {
 	uint8_t				dest_mac[6];
 	int				is_source_mac;
 	int				is_dest_mac;
-	uint32_t			server_ip;
+	uint8_t				server_ip6[16];
+	uint8_t				client_ip6[16];
+	uint8_t				local_ip6[16];
+	uint8_t				remote_ip6[16];
+	uint8_t				local_mac[6];
+	uint8_t				remote_mac[6];
 	uint32_t			client_ip;
+	uint32_t			server_ip;
 	int				is_server_ip;
 	int				is_client_ip;
+	uint32_t			local_ip;
+	uint32_t			remote_ip;
 	int				server_port;
 	int				client_port;
 	int				tcp;
 	int				is_server_port;
 	int				is_client_port;
+	int				local_port;
+	int				remote_port;
+	int 				is_old_raw_eth_param;
+	int 				is_new_raw_eth_param;
 	uint16_t			ethertype;
 	int				is_ethertype;
 	int				cpu_freq_f;
@@ -365,8 +380,8 @@ struct perftest_parameters {
 	float				limit_msgrate;
 	uint32_t			rem_ud_qpn;
 	uint32_t			rem_ud_qkey;
-	uint8_t				link_type;
-	uint8_t				link_type2;
+	int8_t				link_type;
+	int8_t				link_type2;
 	MachineType			machine;
 	PrintDataSide			side;
 	VerbType			verb;
@@ -412,13 +427,17 @@ struct perftest_parameters {
 	int 				cpu_util;
 	struct cpu_util_data 		cpu_util_data;
 	int 				latency_gap;
+	int 				flow_label;
 	int 				retry_count;
 	int 				dont_xchg_versions;
 	int 				use_exp;
 	int 				ipv6;
+	int 				raw_ipv6;
 	int 				report_per_port;
 	int 				use_odp;
+	int				use_hugepages;
 	int				use_promiscuous;
+	int				use_sniffer;
 	int				check_alive_exited;
 	int				raw_mcast;
 	int				masked_atomics;
@@ -435,6 +454,8 @@ struct perftest_parameters {
 	int				disable_fcs;
 	int				flows;
 	int				flows_burst;
+	uint32_t			reply_every;
+	int				perform_warm_up;
 };
 
 struct report_options {
@@ -498,7 +519,20 @@ static const struct rate_gbps_string RATE_VALUES[RATE_VALUES_COUNT] = {
  *
  * Return Value :"IB", "Etherent" or "Unknown".
  */
-const char *link_layer_str(uint8_t link_layer);
+const char *link_layer_str(int8_t link_layer);
+
+/* str_link_layer
+ *
+ * Description : Try to parse a string into a verbs link layer type.
+ *
+ * link_layer   : (According to verbs.h) :
+ *      "IB"       -> IBV_LINK_LAYER_INFINIBAND.
+ *      "Ethernet" -> IBV_LINK_LAYER_ETHERNET.
+ *      otherwise  -> LINK_FAILURE.
+ *
+ * Return Value : IBV_LINK_LAYER or LINK_FAILURE
+ */
+const int str_link_layer(const char *str);
 
 /* parser
  *
diff --git a/src/perftest_resources.c b/src/perftest_resources.c
index afae5f2..7d03442 100755
--- a/src/perftest_resources.c
+++ b/src/perftest_resources.c
@@ -12,6 +12,8 @@
 #include <string.h>
 #include <ctype.h>
 #include <sys/mman.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
 #if defined(__FreeBSD__)
 #include <sys/stat.h>
 #endif
@@ -641,7 +643,6 @@ void alloc_ctx(struct pingpong_context *ctx,struct perftest_parameters *user_par
 {
 	uint64_t tarr_size;
 	int num_of_qps_factor;
-
 	ctx->cycle_buffer = user_param->cycle_buffer;
 	ctx->cache_line_size = user_param->cache_line_size;
 
@@ -650,7 +651,6 @@ void alloc_ctx(struct pingpong_context *ctx,struct perftest_parameters *user_par
 	tarr_size = (user_param->noPeak) ? 1 : user_param->iters*user_param->num_of_qps;
 	ALLOCATE(user_param->tposted, cycles_t, tarr_size);
 	memset(user_param->tposted, 0, sizeof(cycles_t)*tarr_size);
-
 	if (user_param->tst == LAT && user_param->test_type == DURATION)
 		ALLOCATE(user_param->tcompleted, cycles_t, 1);
 
@@ -672,11 +672,10 @@ void alloc_ctx(struct pingpong_context *ctx,struct perftest_parameters *user_par
 	}
 	#endif
 
-	if ((user_param->tst == BW ) && (user_param->machine == CLIENT || user_param->duplex)) {
+	if ((user_param->tst == BW || user_param->tst == LAT_BY_BW) && (user_param->machine == CLIENT || user_param->duplex)) {
 
 		ALLOCATE(user_param->tcompleted,cycles_t,tarr_size);
 		memset(user_param->tcompleted, 0, sizeof(cycles_t)*tarr_size);
-
 		ALLOCATE(ctx->my_addr,uint64_t,user_param->num_of_qps);
 		ALLOCATE(ctx->rem_addr,uint64_t,user_param->num_of_qps);
 		ALLOCATE(ctx->scnt,uint64_t,user_param->num_of_qps);
@@ -684,7 +683,7 @@ void alloc_ctx(struct pingpong_context *ctx,struct perftest_parameters *user_par
 		memset(ctx->scnt, 0, user_param->num_of_qps * sizeof (uint64_t));
 		memset(ctx->ccnt, 0, user_param->num_of_qps * sizeof (uint64_t));
 
-	} else if ((user_param->tst == BW ) && user_param->verb == SEND && user_param->machine == SERVER) {
+	} else if ((user_param->tst == BW || user_param->tst == LAT_BY_BW ) && user_param->verb == SEND && user_param->machine == SERVER) {
 
 		ALLOCATE(ctx->my_addr,uint64_t,user_param->num_of_qps);
 		ALLOCATE(user_param->tcompleted,cycles_t,1);
@@ -714,8 +713,15 @@ void alloc_ctx(struct pingpong_context *ctx,struct perftest_parameters *user_par
 	ctx->size = user_param->size;
 
 	num_of_qps_factor = (user_param->mr_per_qp) ? 1 : user_param->num_of_qps;
-	ctx->buff_size = BUFF_SIZE(ctx->size, ctx->cycle_buffer) * 2 * num_of_qps_factor * user_param->flows;
 
+	/* holds the size of maximum between msg size and cycle buffer,
+	* aligned to cache line,
+	* it is multiply by 2 for send and receive
+	* with reference to number of flows and number of QPs */
+	ctx->buff_size = INC(BUFF_SIZE(ctx->size, ctx->cycle_buffer),
+				 ctx->cache_line_size) * 2 * num_of_qps_factor * user_param->flows;
+	ctx->send_qp_buff_size = ctx->buff_size / num_of_qps_factor / 2;
+	ctx->flow_buff_size = ctx->send_qp_buff_size / user_param->flows;
 	user_param->buff_size = ctx->buff_size;
 	if (user_param->connection_type == UD)
 		ctx->buff_size += ctx->cache_line_size;
@@ -761,7 +767,7 @@ int destroy_ctx(struct pingpong_context *ctx,
 							|| ((user_param->duplex || user_param->tst == LAT) && (i >= num_of_qps)))) ||
 					user_param->connection_type == UD) && (user_param->tst == LAT || user_param->machine == CLIENT || user_param->duplex)) {
 			if (ibv_destroy_ah(ctx->ah[i])) {
-				fprintf(stderr, "failed to destroy AH\n");
+				fprintf(stderr, "Failed to destroy AH\n");
 				test_result = 1;
 			}
 		}
@@ -769,7 +775,7 @@ int destroy_ctx(struct pingpong_context *ctx,
 		if (user_param->connection_type == DC && ((!(user_param->duplex || user_param->tst == LAT)
 						&& (user_param->machine == SERVER)) || ((user_param->duplex || user_param->tst == LAT) && (i >= num_of_qps)))) {
 			if (ibv_exp_destroy_dct(ctx->dct[i])) {
-				fprintf(stderr, "failed to destroy dct\n");
+				fprintf(stderr, "Failed to destroy dct\n");
 				test_result = 1;
 			}
 			if ( i == user_param->num_of_qps -1 )
@@ -777,7 +783,7 @@ int destroy_ctx(struct pingpong_context *ctx,
 		} else
 		#endif
 		if (ibv_destroy_qp(ctx->qp[i])) {
-			fprintf(stderr, " Couldn't destroy QP - %s\n",strerror(errno));
+			fprintf(stderr, "Couldn't destroy QP - %s\n", strerror(errno));
 			test_result = 1;
 		}
 	}
@@ -785,13 +791,13 @@ int destroy_ctx(struct pingpong_context *ctx,
 	if (user_param->use_rss) {
 		if (user_param->connection_type == UD && (user_param->tst == LAT || user_param->machine == CLIENT || user_param->duplex)) {
 			if (ibv_destroy_ah(ctx->ah[0])) {
-				fprintf(stderr, "failed to destroy AH\n");
+				fprintf(stderr, "Failed to destroy AH\n");
 				test_result = 1;
 			}
 		}
 
 		if (ibv_destroy_qp(ctx->qp[0])) {
-			fprintf(stderr, " Couldn't destroy QP - %s\n",strerror(errno));
+			fprintf(stderr, "Couldn't destroy QP - %s\n", strerror(errno));
 			test_result = 1;
 		}
 	}
@@ -819,14 +825,14 @@ int destroy_ctx(struct pingpong_context *ctx,
 	#endif
 
 	if (ibv_destroy_cq(ctx->send_cq)) {
-		fprintf(stderr, "failed to destroy CQ\n");
+		fprintf(stderr, "Failed to destroy CQ - %s\n", strerror(errno));
 		test_result = 1;
 	}
 
 	if (user_param->verb == SEND && (user_param->tst == LAT || user_param->machine == SERVER || user_param->duplex || (ctx->channel)) ) {
 		if (!(user_param->connection_type == DC && user_param->machine == SERVER)) {
 			if (ibv_destroy_cq(ctx->recv_cq)) {
-				fprintf(stderr, "failed to destroy CQ\n");
+				fprintf(stderr, "Failed to destroy CQ - %s\n", strerror(errno));
 				test_result = 1;
 			}
 		}
@@ -834,7 +840,7 @@ int destroy_ctx(struct pingpong_context *ctx,
 
 	for (i = 0; i < dereg_counter; i++) {
 		if (ibv_dereg_mr(ctx->mr[i])) {
-			fprintf(stderr, "failed to deregister MR #%d\n", i+1);
+			fprintf(stderr, "Failed to deregister MR #%d\n", i+1);
 			test_result = 1;
 		}
 	}
@@ -850,20 +856,20 @@ int destroy_ctx(struct pingpong_context *ctx,
 	}
 
 	if (ibv_dealloc_pd(ctx->pd)) {
-		fprintf(stderr, "failed to deallocate PD\n");
+		fprintf(stderr, "Failed to deallocate PD - %s\n", strerror(errno));
 		test_result = 1;
 	}
 
 	if (ctx->channel) {
 		if (ibv_destroy_comp_channel(ctx->channel)) {
-			fprintf(stderr, "failed to close event channel\n");
+			fprintf(stderr, "Failed to close event channel\n");
 			test_result = 1;
 		}
 	}
 	if (user_param->use_rdma_cm == OFF) {
 
 		if (ibv_close_device(ctx->context)) {
-			fprintf(stderr, "failed to close device context\n");
+			fprintf(stderr, "Failed to close device context\n");
 			test_result = 1;
 		}
 	}
@@ -878,12 +884,16 @@ int destroy_ctx(struct pingpong_context *ctx,
 		pp_free_mmap(ctx);
 	} else if (ctx->is_contig_supported == FAILURE) {
 		for (i = 0; i < dereg_counter; i++) {
-			free(ctx->buf[i]);
+			if (user_param->use_hugepages) {
+				shmdt(ctx->buf[i]);
+			} else {
+				free(ctx->buf[i]);
+			}
 		}
 	}
 	free(ctx->qp);
 
-	if ((user_param->tst == BW ) && (user_param->machine == CLIENT || user_param->duplex)) {
+	if ((user_param->tst == BW || user_param->tst == LAT_BY_BW ) && (user_param->machine == CLIENT || user_param->duplex)) {
 
 		free(user_param->tposted);
 		free(user_param->tcompleted);
@@ -892,7 +902,7 @@ int destroy_ctx(struct pingpong_context *ctx,
 		free(ctx->scnt);
 		free(ctx->ccnt);
 	}
-	else if ((user_param->tst == BW ) && user_param->verb == SEND && user_param->machine == SERVER) {
+	else if ((user_param->tst == BW || user_param->tst == LAT_BY_BW ) && user_param->verb == SEND && user_param->machine == SERVER) {
 
 		free(user_param->tposted);
 		free(user_param->tcompleted);
@@ -948,25 +958,30 @@ static int check_inline_recv_support(struct pingpong_context *ctx,
 /******************************************************************************
  *
  ******************************************************************************/
-#ifdef HAVE_ODP
+#if defined HAVE_EX_ODP || defined HAVE_EXP_ODP
 static int check_odp_support(struct pingpong_context *ctx)
 {
+	#ifdef HAVE_EX_ODP
+	struct ibv_device_attr_ex dattr;
+	int odp_support_send = IBV_ODP_SUPPORT_SEND;
+	int odp_support_recv = IBV_ODP_SUPPORT_RECV;
+	int ret = ibv_query_device_ex(ctx->context, NULL, &dattr);
+	#elif defined  HAVE_EXP_ODP
 	struct ibv_exp_device_attr dattr;
 	int ret = ibv_exp_query_device(ctx->context, &dattr);
+	int odp_support_send = IBV_EXP_ODP_SUPPORT_SEND;
+	int odp_support_recv = IBV_EXP_ODP_SUPPORT_RECV;
+	#endif
 	if (ret) {
 		fprintf(stderr, " Couldn't query device for on-demand paging capabilities.\n");
 		return 0;
-	} else if (!(dattr.comp_mask & IBV_EXP_DEVICE_ATTR_ODP)) {
-		fprintf(stderr, " On-demand paging not supported by driver.\n");
-		return 0;
-	} else if (!(dattr.odp_caps.per_transport_caps.rc_odp_caps & IBV_EXP_ODP_SUPPORT_SEND)) {
+	} else if (!(dattr.odp_caps.per_transport_caps.rc_odp_caps & odp_support_send)) {
 		fprintf(stderr, " Send is not supported for RC transport.\n");
 		return 0;
-	} else if (!(dattr.odp_caps.per_transport_caps.rc_odp_caps & IBV_EXP_ODP_SUPPORT_RECV)) {
+	} else if (!(dattr.odp_caps.per_transport_caps.rc_odp_caps & odp_support_recv)) {
 		fprintf(stderr, " Receive is not supported for RC transport.\n");
 		return 0;
 	}
-
 	return 1;
 }
 #endif
@@ -1143,14 +1158,18 @@ int create_single_mr(struct pingpong_context *ctx, struct perftest_parameters *u
 	#endif
 
 	/* ODP */
-	#ifdef HAVE_ODP
+	#if defined HAVE_EX_ODP || defined HAVE_EXP_ODP
 	if (user_param->use_odp) {
 		if ( !check_odp_support(ctx) )
-			return 1;
+			return FAILURE;
 
 		/* ODP does not support contig pages */
 		ctx->is_contig_supported = FAILURE;
+		#ifdef HAVE_EX_ODP
+		flags |= IBV_ACCESS_ON_DEMAND;
+		#elif defined  HAVE_EXP_ODP
 		exp_flags |= IBV_EXP_ACCESS_ON_DEMAND;
+		#endif
 	}
 	#endif
 
@@ -1159,7 +1178,7 @@ int create_single_mr(struct pingpong_context *ctx, struct perftest_parameters *u
 		ctx->is_contig_supported = FAILURE;
 		if(pp_init_gpu(ctx, ctx->buff_size)) {
 			fprintf(stderr, "Couldn't allocate work buf.\n");
-			return 1;
+			return FAILURE;
 		}
 	} else
 	#endif
@@ -1174,7 +1193,7 @@ int create_single_mr(struct pingpong_context *ctx, struct perftest_parameters *u
 				 user_param->mmap_offset))
 		{
 			fprintf(stderr, "Couldn't allocate work buf.\n");
-			return 1;
+			return FAILURE;
 		}
 
 	} else {
@@ -1183,11 +1202,19 @@ int create_single_mr(struct pingpong_context *ctx, struct perftest_parameters *u
 			#if defined(__FreeBSD__)
 			posix_memalign(ctx->buf[qp_index], user_param->cycle_buffer, ctx->buff_size);
 			#else
-			ctx->buf[qp_index] = memalign(user_param->cycle_buffer, ctx->buff_size);
+			if (user_param->use_hugepages) {
+				if (alloc_hugepage_region(ctx) != SUCCESS){
+					fprintf(stderr, "Failed to allocate hugepage region.\n");
+					return FAILURE;
+				}
+				memset(ctx->buf[qp_index], 0, ctx->buff_size);
+			} else if  (ctx->is_contig_supported == FAILURE) {
+				ctx->buf[qp_index] = memalign(user_param->cycle_buffer, ctx->buff_size);
+			}
 			#endif
 			if (!ctx->buf[qp_index]) {
 				fprintf(stderr, "Couldn't allocate work buf.\n");
-				return 1;
+				return FAILURE;
 			}
 
 			memset(ctx->buf[qp_index], 0, ctx->buff_size);
@@ -1242,7 +1269,7 @@ int create_single_mr(struct pingpong_context *ctx, struct perftest_parameters *u
 
 	if (!ctx->mr[qp_index]) {
 		fprintf(stderr, "Couldn't allocate MR\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (ctx->is_contig_supported == SUCCESS)
@@ -1250,12 +1277,14 @@ int create_single_mr(struct pingpong_context *ctx, struct perftest_parameters *u
 
 
 	/* Initialize buffer with random numbers */
-	srand(time(NULL));
-	for (i = 0; i < ctx->buff_size; i++) {
-		((char*)ctx->buf[qp_index])[i] = (char)rand();
+	if (!user_param->use_cuda) {
+		srand(time(NULL));
+		for (i = 0; i < ctx->buff_size; i++) {
+			((char*)ctx->buf[qp_index])[i] = (char)rand();
+		}
 	}
 
-	return 0;
+	return SUCCESS;
 }
 
 /******************************************************************************
@@ -1292,6 +1321,40 @@ int create_mr(struct pingpong_context *ctx, struct perftest_parameters *user_par
 /******************************************************************************
  *
  ******************************************************************************/
+#define HUGEPAGE_ALIGN  (2*1024*1024)
+#define SHMAT_ADDR (void *)(0x0UL)
+#define SHMAT_FLAGS (0)
+
+int alloc_hugepage_region (struct pingpong_context *ctx)
+{
+    int buf_size;
+    int alignment = (((ctx->cycle_buffer + HUGEPAGE_ALIGN -1) / HUGEPAGE_ALIGN) * HUGEPAGE_ALIGN);
+    buf_size = (((ctx->buff_size + alignment -1 ) / alignment ) * alignment);
+
+    /* create hugepage shared region */
+    ctx->huge_shmid = shmget(IPC_PRIVATE, buf_size,
+                        SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W);
+    if (ctx->huge_shmid < 0) {
+        fprintf(stderr, "Failed to allocate hugepages. Please configure hugepages\n");
+        return FAILURE;
+    }
+
+    /* attach shared memory */
+    ctx->buf = (void *) shmat(ctx->huge_shmid, SHMAT_ADDR, SHMAT_FLAGS);
+    if (ctx->buf == (void *) -1) {
+	fprintf(stderr, "Failed to attach shared memory region\n");
+	return FAILURE;
+    }
+
+    /* Mark shmem for removal */
+    if (shmctl(ctx->huge_shmid, IPC_RMID, 0) != 0) {
+	fprintf(stderr, "Failed to mark shm for removal\n");
+	return FAILURE;
+    }
+
+     return SUCCESS;
+}
+
 int ctx_init(struct pingpong_context *ctx, struct perftest_parameters *user_param)
 {
 	int i;
@@ -1310,6 +1373,9 @@ int ctx_init(struct pingpong_context *ctx, struct perftest_parameters *user_para
 
 	ctx->is_contig_supported  = check_for_contig_pages_support(ctx->context);
 
+	if (user_param->use_hugepages)
+		ctx->is_contig_supported = FAILURE;
+
 	/* Allocating an event channel if requested. */
 	if (user_param->use_event) {
 		ctx->channel = ibv_create_comp_channel(ctx->context);
@@ -1338,10 +1404,13 @@ int ctx_init(struct pingpong_context *ctx, struct perftest_parameters *user_para
 
 	if (create_mr(ctx, user_param)) {
 		fprintf(stderr, "Failed to create MR\n");
+		return FAILURE;
 	}
 
 	if (create_cqs(ctx, user_param)) {
 		fprintf(stderr, "Failed to create CQs\n");
+		return FAILURE;
+
 	}
 
 	#ifdef HAVE_XRCD
@@ -1626,6 +1695,7 @@ struct ibv_qp* ctx_exp_qp_create(struct pingpong_context *ctx,
 
 		attr.comp_mask |= IBV_EXP_QP_INIT_ATTR_INL_RECV;
 		attr.max_inl_recv = user_param->inline_recv_size;
+		attr.sq_sig_all = (1 == user_param->cq_mod) ? 1 : 0; //inline receive on requestor must QP's sq_sig_all to be applied
 	}
 
 	#ifdef HAVE_ACCL_VERBS
@@ -2032,6 +2102,7 @@ static int ctx_modify_qp_to_rtr(struct ibv_qp *qp,
 	int num_of_qps_per_port = user_param->num_of_qps / 2;
 
 	int flags = IBV_QP_STATE;
+
 	attr->qp_state = IBV_QPS_RTR;
 	attr->ah_attr.src_path_bits = 0;
 
@@ -2071,7 +2142,6 @@ static int ctx_modify_qp_to_rtr(struct ibv_qp *qp,
 			attr->ah_attr.grh.hop_limit = 0xFF;
 			attr->ah_attr.grh.traffic_class = user_param->traffic_class;
 		}
-
 		if (user_param->connection_type != UD) {
 
 			attr->path_mtu = user_param->curr_mtu;
@@ -2092,7 +2162,8 @@ static int ctx_modify_qp_to_rtr(struct ibv_qp *qp,
 		attr->ah_attr.sl = user_param->sl;
 		flags |= IBV_QP_AV;
 	}
-	return ibv_modify_qp(qp,attr,flags);
+
+	return ibv_modify_qp(qp, attr, flags);
 }
 
 #ifdef HAVE_DC
@@ -2136,13 +2207,18 @@ static int ctx_modify_dc_qp_to_rts(struct ibv_qp *qp,
  *
  ******************************************************************************/
 static int ctx_modify_qp_to_rts(struct ibv_qp *qp,
-		struct ibv_qp_attr *attr,
+		void *_attr,
 		struct perftest_parameters *user_param,
 		struct pingpong_dest *dest,
 		struct pingpong_dest *my_dest)
 {
-
+	#ifdef HAVE_PACKET_PACING_EXP
+	uint64_t flags = IBV_QP_STATE;
+	#else
 	int flags = IBV_QP_STATE;
+	#endif
+	struct ibv_qp_attr *attr = (struct ibv_qp_attr*)_attr;
+
 	attr->qp_state = IBV_QPS_RTS;
 
 	if (user_param->connection_type != RawEth) {
@@ -2156,12 +2232,24 @@ static int ctx_modify_qp_to_rts(struct ibv_qp *qp,
 			attr->retry_cnt = 7;
 			attr->rnr_retry = 7;
 			attr->max_rd_atomic  = dest->out_reads;
-
 			flags |= (IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT | IBV_QP_RNR_RETRY | IBV_QP_MAX_QP_RD_ATOMIC);
 		}
 	}
 
-	return ibv_modify_qp(qp,attr,flags);
+	#ifdef HAVE_PACKET_PACING_EXP
+	if (user_param->rate_limit_type == PP_RATE_LIMIT) {
+		((struct ibv_exp_qp_attr*)_attr)->rate_limit = user_param->rate_limit;
+		flags |= IBV_EXP_QP_RATE_LIMIT;
+		return ibv_exp_modify_qp(qp, (struct ibv_exp_qp_attr*)_attr, flags);
+	}
+	#elif HAVE_PACKET_PACING
+	if (user_param->rate_limit_type == PP_RATE_LIMIT) {
+		attr->rate_limit = user_param->rate_limit;
+		flags |= IBV_QP_RATE_LIMIT;
+	}
+	#endif
+
+	return ibv_modify_qp(qp, attr, flags);
 }
 
 /******************************************************************************
@@ -2179,6 +2267,8 @@ int ctx_connect(struct pingpong_context *ctx,
 	#else
 	struct ibv_qp_attr_ex attr_ex;
 	#endif
+	#elif HAVE_PACKET_PACING_EXP
+	struct ibv_exp_qp_attr attr_ex;
 	#endif
 	struct ibv_qp_attr attr;
 	int xrc_offset = 0;
@@ -2194,7 +2284,7 @@ int ctx_connect(struct pingpong_context *ctx,
 				continue;
 			}
 		}
-		#ifdef HAVE_DC
+		#if defined (HAVE_DC) || defined (HAVE_PACKET_PACING_EXP)
 		memset(&attr_ex, 0, sizeof attr_ex);
 		#endif
 		memset(&attr, 0, sizeof attr);
@@ -2202,6 +2292,13 @@ int ctx_connect(struct pingpong_context *ctx,
 		if (user_param->rate_limit_type == HW_RATE_LIMIT)
 			attr.ah_attr.static_rate = user_param->valid_hw_rate_limit;
 
+		#if defined (HAVE_PACKET_PACING_EXP) || defined (HAVE_PACKET_PACING)
+		if (user_param->rate_limit_type == PP_RATE_LIMIT && (check_packet_pacing_support(ctx) == FAILURE)) {
+			fprintf(stderr, "Packet Pacing isn't supported.\n");
+			return FAILURE;
+		}
+		#endif
+
 		if ((i >= xrc_offset) && (user_param->use_xrc || user_param->connection_type == DC) && (user_param->duplex || user_param->tst == LAT))
 			xrc_offset = -1*xrc_offset;
 
@@ -2213,7 +2310,7 @@ int ctx_connect(struct pingpong_context *ctx,
 			}
 			#endif
 		} else {
-			if(ctx_modify_qp_to_rtr(ctx->qp[i],&attr,user_param,&dest[xrc_offset + i],&my_dest[i],i)) {
+			if(ctx_modify_qp_to_rtr(ctx->qp[i], &attr, user_param, &dest[xrc_offset + i], &my_dest[i], i)) {
 				fprintf(stderr, "Failed to modify QP %d to RTR\n",ctx->qp[i]->qp_num);
 				return FAILURE;
 			}
@@ -2221,16 +2318,27 @@ int ctx_connect(struct pingpong_context *ctx,
 		if (user_param->tst == LAT || user_param->machine == CLIENT || user_param->duplex) {
 			if(user_param->connection_type == DC) {
 				#ifdef HAVE_DC
-				if(ctx_modify_dc_qp_to_rts(ctx->qp[i],&attr_ex,user_param,&dest[xrc_offset + i],&my_dest[i])) {
+				if(ctx_modify_dc_qp_to_rts(ctx->qp[i], &attr_ex, user_param, &dest[xrc_offset + i], &my_dest[i])) {
 					fprintf(stderr, "Failed to modify QP to RTS\n");
 					return FAILURE;
 				}
 				#endif
 			} else {
-				if(ctx_modify_qp_to_rts(ctx->qp[i],&attr,user_param,&dest[xrc_offset + i],&my_dest[i])) {
-					fprintf(stderr, "Failed to modify QP to RTS\n");
-					return FAILURE;
+				#ifdef HAVE_PACKET_PACING_EXP
+				if (user_param->rate_limit_type == PP_RATE_LIMIT) {
+					if(ctx_modify_qp_to_rts(ctx->qp[i], &attr_ex, user_param, &dest[xrc_offset + i], &my_dest[i])) {
+						fprintf(stderr, "Failed to modify QP %x to RTS\n", ctx->qp[i]->qp_num);
+						return FAILURE;
+					}
+				} else {
+				#endif
+					if(ctx_modify_qp_to_rts(ctx->qp[i], &attr, user_param, &dest[xrc_offset + i], &my_dest[i])) {
+						fprintf(stderr, "Failed to modify QP to RTS\n");
+						return FAILURE;
+					}
+				#ifdef HAVE_PACKET_PACING_EXP
 				}
+				#endif
 			}
 		}
 
@@ -2341,7 +2449,7 @@ void ctx_set_send_exp_wqes(struct pingpong_context *ctx,
 		else if (user_param->verb == ATOMIC)
 			ctx->exp_wr[i*user_param->post_list].wr.atomic.remote_addr = rem_dest[xrc_offset + i].vaddr;
 
-		if (user_param->tst == BW ) {
+		if (user_param->tst == BW || user_param->tst == LAT_BY_BW ) {
 
 			ctx->scnt[i] = 0;
 			ctx->ccnt[i] = 0;
@@ -2361,7 +2469,7 @@ void ctx_set_send_exp_wqes(struct pingpong_context *ctx,
 
 				ctx->sge_list[i*user_param->post_list +j].addr = ctx->sge_list[i*user_param->post_list + (j-1)].addr;
 
-				if ((user_param->tst == BW ) && user_param->size <= (ctx->cycle_buffer / 2))
+				if ((user_param->tst == BW || user_param->tst == LAT_BY_BW) && user_param->size <= (ctx->cycle_buffer / 2))
 					increase_loc_addr(&ctx->sge_list[i*user_param->post_list +j],user_param->size,
 							j-1,ctx->my_addr[i],0,ctx->cache_line_size,ctx->cycle_buffer);
 			}
@@ -2400,7 +2508,7 @@ void ctx_set_send_exp_wqes(struct pingpong_context *ctx,
 
 					ctx->exp_wr[i*user_param->post_list + j].wr.rdma.remote_addr = ctx->exp_wr[i*user_param->post_list + (j-1)].wr.rdma.remote_addr;
 
-					if ((user_param->tst == BW) && user_param->size <= (ctx->cycle_buffer / 2))
+					if ((user_param->tst == BW || user_param->tst == LAT_BY_BW) && user_param->size <= (ctx->cycle_buffer / 2))
 						increase_exp_rem_addr(&ctx->exp_wr[i*user_param->post_list + j],user_param->size,
 								j-1,ctx->rem_addr[i],WRITE,ctx->cache_line_size,ctx->cycle_buffer);
 				}
@@ -2412,7 +2520,7 @@ void ctx_set_send_exp_wqes(struct pingpong_context *ctx,
 				if (j > 0) {
 
 					ctx->exp_wr[i*user_param->post_list + j].wr.atomic.remote_addr = ctx->exp_wr[i*user_param->post_list + j-1].wr.atomic.remote_addr;
-					if (user_param->tst == BW)
+					if (user_param->tst == BW || user_param->tst == LAT_BY_BW)
 						increase_exp_rem_addr(&ctx->exp_wr[i*user_param->post_list + j],user_param->size,
 								j-1,ctx->rem_addr[i],ATOMIC,ctx->cache_line_size,ctx->cycle_buffer);
 				}
@@ -2504,7 +2612,7 @@ void ctx_set_send_reg_wqes(struct pingpong_context *ctx,
 		else if (user_param->verb == ATOMIC)
 			ctx->wr[i*user_param->post_list].wr.atomic.remote_addr = rem_dest[xrc_offset + i].vaddr;
 
-		if (user_param->tst == BW ) {
+		if (user_param->tst == BW || user_param->tst == LAT_BY_BW) {
 
 			ctx->scnt[i] = 0;
 			ctx->ccnt[i] = 0;
@@ -2524,7 +2632,7 @@ void ctx_set_send_reg_wqes(struct pingpong_context *ctx,
 
 				ctx->sge_list[i*user_param->post_list +j].addr = ctx->sge_list[i*user_param->post_list + (j-1)].addr;
 
-				if ((user_param->tst == BW ) && user_param->size <= (ctx->cycle_buffer / 2))
+				if ((user_param->tst == BW || user_param->tst == LAT_BY_BW) && user_param->size <= (ctx->cycle_buffer / 2))
 					increase_loc_addr(&ctx->sge_list[i*user_param->post_list +j],user_param->size,
 							j-1,ctx->my_addr[i],0,ctx->cache_line_size,ctx->cycle_buffer);
 			}
@@ -2558,7 +2666,7 @@ void ctx_set_send_reg_wqes(struct pingpong_context *ctx,
 					ctx->wr[i*user_param->post_list + j].wr.rdma.remote_addr =
 						ctx->wr[i*user_param->post_list + (j-1)].wr.rdma.remote_addr;
 
-					if ((user_param->tst == BW) && user_param->size <= (ctx->cycle_buffer / 2))
+					if ((user_param->tst == BW || user_param->tst == LAT_BY_BW ) && user_param->size <= (ctx->cycle_buffer / 2))
 						increase_rem_addr(&ctx->wr[i*user_param->post_list + j],user_param->size,
 								j-1,ctx->rem_addr[i],WRITE,ctx->cache_line_size,ctx->cycle_buffer);
 				}
@@ -2571,7 +2679,7 @@ void ctx_set_send_reg_wqes(struct pingpong_context *ctx,
 
 					ctx->wr[i*user_param->post_list + j].wr.atomic.remote_addr =
 						ctx->wr[i*user_param->post_list + j-1].wr.atomic.remote_addr;
-					if (user_param->tst == BW)
+					if (user_param->tst == BW || user_param->tst == LAT_BY_BW)
 						increase_rem_addr(&ctx->wr[i*user_param->post_list + j],user_param->size,
 								j-1,ctx->rem_addr[i],ATOMIC,ctx->cache_line_size,ctx->cycle_buffer);
 				}
@@ -2638,7 +2746,7 @@ int ctx_set_recv_wqes(struct pingpong_context *ctx,struct perftest_parameters *u
 	for (k = 0; i < user_param->num_of_qps; i++,k++) {
 		if (!user_param->mr_per_qp) {
 			ctx->recv_sge_list[i].addr  = (uintptr_t)ctx->buf[0] +
-				(num_of_qps + k)*BUFF_SIZE(ctx->size,ctx->cycle_buffer);
+				(num_of_qps + k) * ctx->send_qp_buff_size;
 		} else {
 			ctx->recv_sge_list[i].addr  = (uintptr_t)ctx->buf[i];
 		}
@@ -2654,8 +2762,7 @@ int ctx_set_recv_wqes(struct pingpong_context *ctx,struct perftest_parameters *u
 		ctx->rwr[i].next    = NULL;
 		ctx->rwr[i].num_sge	= MAX_RECV_SGE;
 
-		if (user_param->tst == BW)
-			ctx->rx_buffer_addr[i] = ctx->recv_sge_list[i].addr;
+		ctx->rx_buffer_addr[i] = ctx->recv_sge_list[i].addr;
 
 		for (j = 0; j < size_per_qp ; ++j) {
 
@@ -2674,7 +2781,7 @@ int ctx_set_recv_wqes(struct pingpong_context *ctx,struct perftest_parameters *u
 				}
 			}
 
-			if ((user_param->tst == BW) && user_param->size <= (ctx->cycle_buffer / 2)) {
+			if ((user_param->tst == BW || user_param->tst == LAT_BY_BW) && user_param->size <= (ctx->cycle_buffer / 2)) {
 
 				increase_loc_addr(&ctx->recv_sge_list[i],
 						user_param->size,
@@ -2683,6 +2790,7 @@ int ctx_set_recv_wqes(struct pingpong_context *ctx,struct perftest_parameters *u
 						user_param->connection_type,ctx->cache_line_size,ctx->cycle_buffer);
 			}
 		}
+		ctx->recv_sge_list[i].addr = ctx->rx_buffer_addr[i];
 	}
 	return 0;
 }
@@ -2758,7 +2866,7 @@ static int clean_scq_credit(int send_cnt,struct pingpong_context *ctx,struct per
 				if (swc[i].status != IBV_WC_SUCCESS) {
 					fprintf(stderr, "Poll send CQ error status=%u qp %d\n",
 							swc[i].status,(int)swc[i].wr_id);
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 				}
 				send_cnt--;
@@ -2766,7 +2874,7 @@ static int clean_scq_credit(int send_cnt,struct pingpong_context *ctx,struct per
 
 		} else if (sne < 0) {
 			fprintf(stderr, "Poll send CQ to clean credit failed ne=%d\n",sne);
-			return_value = 1;
+			return_value = FAILURE;
 			goto cleaning;
 		}
 	} while(send_cnt > 0);
@@ -2817,7 +2925,7 @@ int perform_warm_up(struct pingpong_context *ctx,struct perftest_parameters *use
 
 			if (err) {
 				fprintf(stderr,"Couldn't post send during warm up: qp %d scnt=%d \n",index,warmindex);
-				return_value = 1;
+				return_value = FAILURE;
 				goto cleaning;
 			}
 		}
@@ -2828,14 +2936,14 @@ int perform_warm_up(struct pingpong_context *ctx,struct perftest_parameters *use
 			if (ne > 0) {
 
 				if (wc.status != IBV_WC_SUCCESS) {
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 				}
 
 				warmindex -= user_param->post_list;
 
 			} else if (ne < 0) {
-				return_value = 1;
+				return_value = FAILURE;
 				goto cleaning;
 			}
 
@@ -2868,7 +2976,6 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 	struct ibv_send_wr 	*bad_wr = NULL;
 	struct ibv_wc 	   	*wc = NULL;
 	int 			num_of_qps = user_param->num_of_qps;
-
 	/* Rate Limiter*/
 	int 			rate_limit_pps = 0;
 	double 			gap_time = 0;	/* in usec */
@@ -2882,8 +2989,8 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 	int			wc_id;
 	int			send_flows_index = 0;
 	uintptr_t		primary_send_addr = ctx->sge_list[0].addr;
-	int			flows_burst_iter = 0;
 	int			address_offset = 0;
+	int			flows_burst_iter = 0;
 
 	ALLOCATE(wc ,struct ibv_wc ,CTX_POLL_BATCH);
 
@@ -2908,7 +3015,7 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 	if (user_param->test_type == DURATION && user_param->state != START_STATE && user_param->margin > 0) {
 		fprintf(stderr, "Failed: margin is not long enough (taking samples before warmup ends)\n");
 		fprintf(stderr, "Please increase margin or decrease tx_depth\n");
-		return_value = 1;
+		return_value = FAILURE;
 		goto cleaning;
 	}
 
@@ -2930,7 +3037,7 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 				break;
 			default:
 				fprintf(stderr, " Failed: Unknown rate limit units\n");
-				return_value = 1;
+				return_value = FAILURE;
 				goto cleaning;
 		}
 		cpu_mhz = get_cpu_mhz(user_param->cpu_freq_f);
@@ -3018,43 +3125,45 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 				#endif
 				if (err) {
 					fprintf(stderr,"Couldn't post send: qp %d scnt=%lu \n",index,ctx->scnt[index]);
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 				}
-
+				/* if we have more than single flow and the burst iter is the last one */
 				if (user_param->flows != DEF_FLOWS) {
-				/*we inc the address after we post_send , maybe need to skip next If*/
-					if(++flows_burst_iter == user_param->flows_burst) {
-                                                flows_burst_iter = 0;
-                                                if (++send_flows_index == user_param->flows)
-                                                        send_flows_index = 0;
-						address_offset = send_flows_index * ctx->cycle_buffer;
+					if (++flows_burst_iter == user_param->flows_burst) {
+						flows_burst_iter = 0;
+						/* inc the send_flows_index and update the address */
+						if (++send_flows_index == user_param->flows)
+							send_flows_index = 0;
+						address_offset = send_flows_index * ctx->flow_buff_size;
 						ctx->sge_list[0].addr = primary_send_addr + address_offset;
-                                        }
-                                }
+					}
+				}
 
 				/* in multiple flow scenarios we will go to next cycle buffer address in the main buffer*/
 				if (user_param->post_list == 1 && user_param->size <= (ctx->cycle_buffer / 2)) {
 					#ifdef HAVE_VERBS_EXP
 					if (user_param->use_exp == 1)
 						increase_loc_addr(ctx->exp_wr[index].sg_list,user_param->size,
-								ctx->scnt[index],ctx->my_addr[index] + address_offset,0,ctx->cache_line_size,ctx->cycle_buffer);
+								ctx->scnt[index], ctx->my_addr[index] + address_offset, 0,
+									ctx->cache_line_size, ctx->cycle_buffer);
 					else
 					#endif
-						increase_loc_addr(ctx->wr[index].sg_list,user_param->size,ctx->scnt[index],
-								ctx->my_addr[index] + address_offset ,0,ctx->cache_line_size,ctx->cycle_buffer);
+						increase_loc_addr(ctx->wr[index].sg_list,user_param->size, ctx->scnt[index],
+								ctx->my_addr[index] + address_offset , 0, ctx->cache_line_size,
+								ctx->cycle_buffer);
 
 					if (user_param->verb != SEND) {
 						#ifdef HAVE_VERBS_EXP
 						if (user_param->use_exp == 1)
-							increase_exp_rem_addr(&ctx->exp_wr[index],user_param->size,
-									ctx->scnt[index],ctx->rem_addr[index],user_param->verb,ctx->cache_line_size,
-									ctx->cycle_buffer);
+							increase_exp_rem_addr(&ctx->exp_wr[index], user_param->size,
+									ctx->scnt[index], ctx->rem_addr[index], user_param->verb,
+									ctx->cache_line_size, ctx->cycle_buffer);
 						else
 						#endif
-							increase_rem_addr(&ctx->wr[index],user_param->size,
-									ctx->scnt[index],ctx->rem_addr[index],user_param->verb,ctx->cache_line_size,
-									ctx->cycle_buffer);
+							increase_rem_addr(&ctx->wr[index], user_param->size,
+									ctx->scnt[index], ctx->rem_addr[index], user_param->verb,
+									ctx->cache_line_size, ctx->cycle_buffer);
 					}
 				}
 
@@ -3093,7 +3202,7 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 				if (user_param->use_event) {
 					if (ctx_notify_events(ctx->channel)) {
 						fprintf(stderr, "Couldn't request CQ notification\n");
-						return_value = 1;
+						return_value = FAILURE;
 						goto cleaning;
 					}
 				}
@@ -3113,7 +3222,7 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 						if (user_param->verb_type != ACCL_INTF) {
 							if (wc[i].status != IBV_WC_SUCCESS) {
 								NOTIFY_COMP_ERROR_SEND(wc[i],totscnt,totccnt);
-								return_value = 1;
+								return_value = FAILURE;
 								goto cleaning;
 							}
 						}
@@ -3138,7 +3247,7 @@ int run_iter_bw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 
 				} else if (ne < 0) {
 					fprintf(stderr, "poll CQ failed %d\n",ne);
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 					}
 		}
@@ -3179,7 +3288,8 @@ static inline void set_on_first_rx_packet(struct perftest_parameters *user_param
 int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters *user_param)
 {
 	uint64_t		rcnt = 0;
-	int 			ne,i;
+	int 			ne = 0;
+	int			i;
 	uint64_t		tot_iters;
 	uint64_t                *rcnt_for_qp = NULL;
 	struct ibv_wc 		*wc          = NULL;
@@ -3219,17 +3329,20 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
 
 	check_alive_data.g_total_iters = tot_iters;
 
-	while (rcnt < tot_iters || (user_param->test_type == DURATION && user_param->state != END_STATE)) {	
+	while (rcnt < tot_iters || (user_param->test_type == DURATION && user_param->state != END_STATE)) {
 
 		if (user_param->use_event) {
 			if (ctx_notify_events(ctx->channel)) {
 				fprintf(stderr ," Failed to notify events to CQ");
-				return_value = 1;
+				return_value = FAILURE;
 				goto cleaning;
 			}
 		}
 
 		do {
+			if (user_param->test_type == DURATION && user_param->state == END_STATE)
+				break;
+
 			#ifdef HAVE_ACCL_VERBS
 			if (user_param->verb_type == ACCL_INTF)
 				ne = ctx->recv_cq_family->poll_cnt(ctx->recv_cq, CTX_POLL_BATCH);
@@ -3257,11 +3370,10 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
 						if (wc[i].status != IBV_WC_SUCCESS) {
 
 							NOTIFY_COMP_ERROR_RECV(wc[i],rcnt_for_qp[wc_id]);
-							return_value = 1;
+							return_value = FAILURE;
 							goto cleaning;
 						}
 					}
-
 					rcnt_for_qp[wc_id]++;
 					rcnt++;
 					check_alive_data.current_totrcnt = rcnt;
@@ -3272,13 +3384,12 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
 						}
 						user_param->iters++;
 					}
-
 					if (user_param->test_type==DURATION || rcnt_for_qp[wc_id] + size_per_qp <= user_param->iters) {
 						#ifdef HAVE_ACCL_VERBS
 						if (user_param->verb_type == ACCL_INTF) {
 							if (ctx->qp_burst_family[wc_id]->recv_burst(ctx->qp[wc_id], ctx->rwr[wc_id].sg_list, 1)) {
 								fprintf(stderr, "Couldn't post recv burst (accelerated verbs).\n");
-								return_value = 1;
+								return_value = FAILURE;
 								goto cleaning;
 							}
 						} else {
@@ -3286,7 +3397,7 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
 							if (user_param->use_srq) {
 								if (ibv_post_srq_recv(ctx->srq, &ctx->rwr[wc_id],&bad_wr_recv)) {
 									fprintf(stderr, "Couldn't post recv SRQ. QP = %d: counter=%lu\n", wc_id,rcnt);
-									return_value = 1;
+									return_value = FAILURE;
 									goto cleaning;
 								}
 
@@ -3298,7 +3409,6 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
 								}
 
 							}
-
 							if (user_param->flows != DEF_FLOWS) {
 								if (++recv_flows_burst == user_param->flows_burst) {
 									recv_flows_burst = 0;
@@ -3336,7 +3446,7 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
 											fprintf(stderr, "Poll send CQ error status=%u qp %d credit=%lu scredit=%lu\n",
 													swc[j].status,(int)swc[j].wr_id,
 													rcnt_for_qp[swc[j].wr_id],scredit_for_qp[swc[j].wr_id]);
-											return_value = 1;
+											return_value = FAILURE;
 											goto cleaning;
 										}
 										scredit_for_qp[swc[j].wr_id]--;
@@ -3344,14 +3454,14 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
 									}
 								} else if (sne < 0) {
 									fprintf(stderr, "Poll send CQ failed ne=%d\n",sne);
-									return_value = 1;
+									return_value = FAILURE;
 									goto cleaning;
 								}
 							}
 							if (ibv_post_send(ctx->qp[wc_id],&ctx->ctrl_wr[wc_id],&bad_wr)) {
 								fprintf(stderr,"Couldn't post send qp %d credit = %lu\n",
 										wc_id,rcnt_for_qp[wc_id]);
-								return_value = 1;
+								return_value = FAILURE;
 								goto cleaning;
 							}
 							scredit_for_qp[wc_id]++;
@@ -3365,13 +3475,13 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
 
 		if (ne < 0) {
 			fprintf(stderr, "Poll Receive CQ failed %d\n", ne);
-			return_value = 1;
+			return_value = FAILURE;
 			goto cleaning;
 		}
 		else if (ne == 0) {
 			if (check_alive_data.to_exit) {
 				user_param->check_alive_exited = 1;
-				return_value = 0;
+				return_value = FAILURE;
 				goto cleaning;
 			}
 		}
@@ -3383,7 +3493,7 @@ int run_iter_bw_server(struct pingpong_context *ctx, struct perftest_parameters
 cleaning:
 	if (ctx->send_rcredit) {
 		if (clean_scq_credit(tot_scredit, ctx, user_param))
-			return_value = 1;
+			return_value = FAILURE;
 	}
 
 	check_alive_data.last_totrcnt=0;
@@ -3459,7 +3569,7 @@ int run_iter_bw_infinitely(struct pingpong_context *ctx,struct perftest_paramete
 				#endif
 				if (err) {
 					fprintf(stderr,"Couldn't post send: %d scnt=%lu \n",index,ctx->scnt[index]);
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 				}
 				ctx->scnt[index] += user_param->post_list;
@@ -3475,7 +3585,7 @@ int run_iter_bw_infinitely(struct pingpong_context *ctx,struct perftest_paramete
 			for (i = 0; i < ne; i++) {
 				if (wc[i].status != IBV_WC_SUCCESS) {
 					NOTIFY_COMP_ERROR_SEND(wc[i],ctx->scnt[(int)wc[i].wr_id],ctx->scnt[(int)wc[i].wr_id]);
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 				}
 				ctx->scnt[(int)wc[i].wr_id]--;
@@ -3484,7 +3594,7 @@ int run_iter_bw_infinitely(struct pingpong_context *ctx,struct perftest_paramete
 
 		} else if (ne < 0) {
 			fprintf(stderr, "poll CQ failed %d\n",ne);
-			return_value = 1;
+			return_value = FAILURE;
 			goto cleaning;
 		}
 	}
@@ -3531,7 +3641,7 @@ int run_iter_bw_infinitely_server(struct pingpong_context *ctx, struct perftest_
 
 				if (wc[i].status != IBV_WC_SUCCESS) {
 					fprintf(stderr,"A completion with Error in run_infinitely_bw_server function");
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 				}
 
@@ -3539,7 +3649,7 @@ int run_iter_bw_infinitely_server(struct pingpong_context *ctx, struct perftest_
 
 					if (ibv_post_srq_recv(ctx->srq, &ctx->rwr[wc[i].wr_id],&bad_wr_recv)) {
 						fprintf(stderr, "Couldn't post recv SRQ. QP = %d:\n",(int)wc[i].wr_id);
-						return_value = 1;
+						return_value = FAILURE;
 						goto cleaning;
 					}
 
@@ -3568,7 +3678,7 @@ int run_iter_bw_infinitely_server(struct pingpong_context *ctx, struct perftest_
 											fprintf(stderr, "Poll send CQ error status=%u qp %d credit=%lu scredit=%lu\n",
 													swc[j].status,(int)swc[j].wr_id,
 													rcnt_for_qp[swc[j].wr_id],ccnt_for_qp[swc[j].wr_id]);
-											return_value = 1;
+											return_value = FAILURE;
 											goto cleaning;
 										}
 										ccnt_for_qp[swc[j].wr_id]--;
@@ -3576,14 +3686,14 @@ int run_iter_bw_infinitely_server(struct pingpong_context *ctx, struct perftest_
 
 								} else if (sne < 0) {
 									fprintf(stderr, "Poll send CQ failed ne=%d\n",sne);
-									return_value = 1;
+									return_value = FAILURE;
 									goto cleaning;
 								}
 							}
 							if (ibv_post_send(ctx->qp[wc[i].wr_id],&ctx->ctrl_wr[wc[i].wr_id],&bad_wr)) {
 								fprintf(stderr,"Couldn't post send qp %d credit=%lu\n",
 										(int)wc[i].wr_id,rcnt_for_qp[wc[i].wr_id]);
-								return_value = 1;
+								return_value = FAILURE;
 								goto cleaning;
 							}
 							ccnt_for_qp[wc[i].wr_id]++;
@@ -3595,7 +3705,7 @@ int run_iter_bw_infinitely_server(struct pingpong_context *ctx, struct perftest_
 
 		} else if (ne < 0) {
 			fprintf(stderr, "Poll Recieve CQ failed %d\n", ne);
-			return_value = 1;
+			return_value = FAILURE;
 			goto cleaning;
 		}
 	}
@@ -3721,7 +3831,7 @@ int run_iter_bi(struct pingpong_context *ctx,
 				#endif
 				if (err) {
 					fprintf(stderr,"Couldn't post send: qp %d scnt=%lu \n",index,ctx->scnt[index]);
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 				}
 
@@ -3756,7 +3866,7 @@ int run_iter_bi(struct pingpong_context *ctx,
 
 			if (ctx_notify_events(ctx->channel)) {
 				fprintf(stderr,"Failed to notify events to CQ");
-				return_value = 1;
+				return_value = FAILURE;
 				goto cleaning;
 			}
 		}
@@ -3781,7 +3891,7 @@ int run_iter_bi(struct pingpong_context *ctx,
 			for (i = 0; i < ne; i++) {
 				if (wc[i].status != IBV_WC_SUCCESS) {
 					NOTIFY_COMP_ERROR_RECV(wc[i],totrcnt);
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 				}
 
@@ -3800,7 +3910,7 @@ int run_iter_bi(struct pingpong_context *ctx,
 					if (user_param->use_srq) {
 						if (ibv_post_srq_recv(ctx->srq, &ctx->rwr[wc[i].wr_id],&bad_wr_recv)) {
 							fprintf(stderr, "Couldn't post recv SRQ. QP = %d: counter=%d\n",(int)wc[i].wr_id,(int)totrcnt);
-							return_value = 1;
+							return_value = FAILURE;
 							goto cleaning;
 						}
 
@@ -3837,7 +3947,7 @@ int run_iter_bi(struct pingpong_context *ctx,
 									fprintf(stderr, "Poll send CQ error status=%u qp %d credit=%lu scredit=%d\n",
 											credit_wc.status,(int)credit_wc.wr_id,
 											rcnt_for_qp[credit_wc.wr_id],scredit_for_qp[credit_wc.wr_id]);
-									return_value = 1;
+									return_value = FAILURE;
 									goto cleaning;
 								}
 
@@ -3859,13 +3969,13 @@ int run_iter_bi(struct pingpong_context *ctx,
 								}
 							} else if (sne < 0) {
 								fprintf(stderr, "Poll send CQ ne=%d\n",sne);
-								return_value = 1;
+								return_value = FAILURE;
 								goto cleaning;
 							}
 						}
 						if (ibv_post_send(ctx->qp[wc[i].wr_id],&ctx->ctrl_wr[wc[i].wr_id],&bad_wr)) {
 							fprintf(stderr,"Couldn't post send: qp%lu credit=%lu\n",wc[i].wr_id,rcnt_for_qp[wc[i].wr_id]);
-							return_value = 1;
+							return_value = FAILURE;
 							goto cleaning;
 						}
 						scredit_for_qp[wc[i].wr_id]++;
@@ -3882,7 +3992,7 @@ int run_iter_bi(struct pingpong_context *ctx,
 		else if (ne == 0) {
 			if (check_alive_data.to_exit) {
 				user_param->check_alive_exited = 1;
-				return_value = 0;
+				return_value = FAILURE;
 				goto cleaning;
 			}
 		}
@@ -3893,14 +4003,14 @@ int run_iter_bi(struct pingpong_context *ctx,
 			for (i = 0; i < ne; i++) {
 				if (wc_tx[i].status != IBV_WC_SUCCESS) {
 					NOTIFY_COMP_ERROR_SEND(wc_tx[i],totscnt,totccnt);
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 				}
 
 				if (wc_tx[i].opcode == IBV_WC_RDMA_WRITE) {
 					if (!ctx->send_rcredit) {
 						fprintf(stderr, "Polled RDMA_WRITE completion without recv credit request\n");
-						return_value = 1;
+						return_value = FAILURE;
 						goto cleaning;
 					}
 					scredit_for_qp[wc_tx[i].wr_id]--;
@@ -3939,7 +4049,7 @@ int run_iter_bi(struct pingpong_context *ctx,
 
 	if (ctx->send_rcredit) {
 		if (clean_scq_credit(tot_scredit, ctx, user_param)) {
-			return_value = 1;
+			return_value = FAILURE;
 			goto cleaning;
 		}
 	}
@@ -4115,7 +4225,6 @@ int run_iter_lat(struct pingpong_context *ctx,struct perftest_parameters *user_p
 		else
 			catch_alarm(0);
 	}
-
 	while (scnt < user_param->iters || (user_param->test_type == DURATION && user_param->state != END_STATE)) {
 		if (user_param->latency_gap) {
 			start_gap = get_cycles();
@@ -4152,7 +4261,6 @@ int run_iter_lat(struct pingpong_context *ctx,struct perftest_parameters *user_p
 
 		do {
 			ne = ibv_poll_cq(ctx->send_cq, 1, &wc);
-
 			if(ne > 0) {
 				if (wc.status != IBV_WC_SUCCESS) {
 					NOTIFY_COMP_ERROR_SEND(wc,scnt,scnt);
@@ -4198,7 +4306,6 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
 	cycles_t 		end_cycle, start_gap=0;
 	uintptr_t		primary_send_addr = ctx->sge_list[0].addr;
 	uintptr_t		primary_recv_addr = ctx->recv_sge_list[0].addr;
-
 	if (user_param->connection_type != RawEth) {
 		#ifdef HAVE_VERBS_EXP
 		if (user_param->use_exp == 1) {
@@ -4213,7 +4320,6 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
 		#endif
 
 	}
-
 	if (user_param->size <= user_param->inline_size) {
 		#ifdef HAVE_VERBS_EXP
 		if (user_param->use_exp == 1)
@@ -4231,22 +4337,18 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
 		 * server will enter here first and wait for a packet to arrive (from the client)
 		 */
 		if ((rcnt < user_param->iters || user_param->test_type == DURATION) && !(scnt < 1 && user_param->machine == CLIENT)) {
-
 			if (user_param->use_event) {
 				if (ctx_notify_events(ctx->channel)) {
 					fprintf(stderr , " Failed to notify events to CQ");
 					return 1;
 				}
 			}
-
 			do {
 				ne = ibv_poll_cq(ctx->recv_cq,1,&wc);
-
 				if (user_param->test_type == DURATION && user_param->state == END_STATE)
 					break;
 
 				if (ne > 0) {
-
 					if (firstRx) {
 						set_on_first_rx_packet(user_param);
 						firstRx = 0;
@@ -4259,28 +4361,27 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
 
 					rcnt++;
 
-					if (user_param->test_type==DURATION && user_param->state == SAMPLE_STATE)
+					if (user_param->test_type == DURATION && user_param->state == SAMPLE_STATE)
 						user_param->iters++;
 
 					/*if we're in duration mode or there
 					 * is enough space in the rx_depth,
 					 * post that you received a packet.
 					 */
-					if (user_param->test_type==DURATION || (rcnt + size_per_qp  <= user_param->iters)) {
+					if (user_param->test_type == DURATION || (rcnt + size_per_qp <= user_param->iters)) {
 						if (user_param->use_srq) {
 
-							if (ibv_post_srq_recv(ctx->srq,&ctx->rwr[wc.wr_id],&bad_wr_recv)) {
-								fprintf(stderr, "Couldn't post recv SRQ. QP = %d: counter=%lu\n",(int)wc.wr_id,rcnt);
+							if (ibv_post_srq_recv(ctx->srq, &ctx->rwr[wc.wr_id], &bad_wr_recv)) {
+								fprintf(stderr, "Couldn't post recv SRQ. QP = %d: counter=%lu\n",(int)wc.wr_id, rcnt);
 								return 1;
 							}
 
 						} else {
-							if (ibv_post_recv(ctx->qp[wc.wr_id],&ctx->rwr[wc.wr_id],&bad_wr_recv)) {
-								fprintf(stderr, "Couldn't post recv: rcnt=%lu\n",rcnt);
+							if (ibv_post_recv(ctx->qp[wc.wr_id], &ctx->rwr[wc.wr_id], &bad_wr_recv)) {
+								fprintf(stderr, "Couldn't post recv: rcnt=%lu\n", rcnt);
 								return 15;
 							}
 						}
-
 						if (user_param->flows != DEF_FLOWS) {
 							if (++recv_flows_index == user_param->flows) {
 								recv_flows_index = 0;
@@ -4339,16 +4440,14 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
 				fprintf(stderr,"Couldn't post send: scnt=%lu \n",scnt);
 				return 1;
 			}
-
 			if (user_param->flows != DEF_FLOWS) {
 				if (++send_flows_index == user_param->flows) {
 					send_flows_index = 0;
 					ctx->sge_list[0].addr = primary_send_addr;
 				} else {
-					ctx->sge_list[0].addr += INC(user_param->size, ctx->cache_line_size);
+					ctx->sge_list[0].addr = primary_send_addr + (ctx->flow_buff_size * send_flows_index);
 				}
 			}
-
 			if (poll == 1) {
 
 				struct ibv_wc s_wc;
@@ -4366,8 +4465,6 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
 					s_ne = ibv_poll_cq(ctx->send_cq, 1, &s_wc);
 				} while (!user_param->use_event && s_ne == 0);
 
-
-
 				if (s_ne < 0) {
 					fprintf(stderr, "poll on Send CQ failed %d\n", s_ne);
 					return FAILURE;
@@ -4391,7 +4488,232 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
 
 	return 0;
 }
+/******************************************************************************
+ *Server
+ ******************************************************************************/
+int run_iter_lat_burst_server(struct pingpong_context *ctx, struct perftest_parameters *user_param)
+{
+	int i;
+	int ne = 0;
+	int err = 0;
+	uint64_t scnt = 0;
+	uint64_t rcnt = 0;
+	uint64_t ccnt = 0;
+	struct ibv_wc		*wc = NULL;
+	struct ibv_send_wr	*bad_wr;
+	struct ibv_recv_wr      *bad_wr_recv = NULL;
+	int wc_id;
 
+	ALLOCATE(wc, struct ibv_wc, user_param->burst_size);
+
+	/* main loop for polling */
+	while (rcnt < user_param->iters) {
+
+		ne = ibv_poll_cq(ctx->recv_cq, user_param->burst_size, wc);
+		if (ne > 0) {
+			for (i = 0; i < ne; i++) {
+				wc_id = (int)wc[i].wr_id;
+				if (wc[i].status != IBV_WC_SUCCESS) {
+					NOTIFY_COMP_ERROR_RECV(wc[i], rcnt);
+					return FAILURE;
+				}
+				rcnt++;
+				if (rcnt%user_param->reply_every == 0 && scnt - ccnt < user_param->tx_depth) {
+					err = ibv_post_send(ctx->qp[0], &ctx->wr[0], &bad_wr);
+					if (err) {
+						fprintf(stderr, "Couldn't post send: scnt=%lu\n", scnt);
+						return FAILURE;
+					}
+					scnt++;
+				}
+
+				if (ibv_post_recv(ctx->qp[wc_id], &ctx->rwr[wc_id], &bad_wr_recv)) {
+					fprintf(stderr, "Couldn't post recv Qp=%d rcnt=%ld\n", wc_id, rcnt);
+					return FAILURE;
+				}
+			}
+		} else if (ne < 0) {
+			fprintf(stderr, "poll CQ failed %d\n", ne);
+			return FAILURE;
+		}
+		ne = ibv_poll_cq(ctx->send_cq, CTX_POLL_BATCH, wc);
+		if (ne > 0) {
+			for (i = 0; i < ne; i++) {
+				if (wc[i].status != IBV_WC_SUCCESS) {
+					NOTIFY_COMP_ERROR_SEND(wc[i], scnt, ccnt);
+					return FAILURE;
+				}
+				ccnt++;
+			}
+
+		} else if (ne < 0) {
+			fprintf(stderr, "poll CQ failed %d\n", ne);
+			return FAILURE;
+		}
+	}
+	free(wc);
+	return SUCCESS;
+}
+/******************************************************************************
+ *Client
+ ******************************************************************************/
+int run_iter_lat_burst(struct pingpong_context *ctx, struct perftest_parameters *user_param)
+{
+	uint64_t		totscnt = 0; /* sent packets counter */
+	uint64_t		totccnt = 0; /* complete sent packets counter */
+	uint64_t		totrcnt = 0; /* received packets counter */
+	uint64_t	   	tot_iters;
+	uint64_t		pong_cnt = 0; /* counts how many pongs arrived */
+	int			ne, ns;
+	int			err = 0;
+	int			i = 0;
+	int			wc_id;
+	struct ibv_wc		*wc;
+	#ifdef HAVE_VERBS_EXP
+	struct ibv_exp_send_wr	*bad_exp_wr;
+	#endif
+	struct ibv_send_wr	*bad_wr;
+	int			cpu_mhz;
+	int			return_value = 0;
+	/* Rate Limiter*/
+	int			rate_limit_pps = 0;
+	double			gap_time = 0;   /* in usec */
+	cycles_t		gap_cycles = 0; /* in cycles */
+	cycles_t		gap_deadline = 0;
+	unsigned int		number_of_bursts = 0;
+	int			burst_iter = 0;
+	int			is_sending_burst = 0;
+	struct ibv_recv_wr      *bad_wr_recv = NULL;
+	ALLOCATE(wc, struct ibv_wc, user_param->burst_size);
+
+	tot_iters = (uint64_t)user_param->iters;
+
+	/* If using rate limiter, calculate gap time between bursts */
+	cpu_mhz = get_cpu_mhz(user_param->cpu_freq_f);
+	if (cpu_mhz <= 0) {
+		fprintf(stderr, "Failed: couldn't acquire cpu frequency for rate limiter.\n");
+		return_value = FAILURE;
+		goto cleaning;
+	}
+	if (user_param->rate_limit > 0 ) {
+		if (user_param->rate_limit_type == SW_RATE_LIMIT) {
+			switch (user_param->rate_units) {
+				case MEGA_BYTE_PS:
+					rate_limit_pps = ((double)(user_param->rate_limit) / user_param->size) * 1048576;
+					break;
+				case GIGA_BIT_PS:
+					rate_limit_pps = ((double)(user_param->rate_limit) / (user_param->size * 8)) * 1000000000;
+					break;
+				case PACKET_PS:
+					rate_limit_pps = user_param->rate_limit;
+					break;
+				default:
+					fprintf(stderr, " Failed: Unknown rate limit units\n");
+					return_value = FAILURE;
+					goto cleaning;
+			}
+			number_of_bursts = rate_limit_pps / user_param->burst_size;
+			gap_time = 1000000 * (1.0 / number_of_bursts);
+		}
+	}
+
+	gap_cycles = cpu_mhz * gap_time;
+
+	/* main loop for posting */
+	while (totrcnt < (totscnt / user_param->reply_every) || totccnt < tot_iters) {
+
+		if (is_sending_burst == 0) {
+			if (gap_deadline > get_cycles() && user_param->rate_limit_type == SW_RATE_LIMIT) {
+				/* Go right to cq polling until gap time is over. */
+				goto polling;
+			}
+			gap_deadline = get_cycles() + gap_cycles;
+			is_sending_burst = 1;
+			burst_iter = 0;
+		}
+		while ((totscnt < user_param->iters)
+			&& (totscnt - totccnt) < (user_param->tx_depth) && !(is_sending_burst == 0 )) {
+			#ifdef HAVE_VERBS_EXP
+			if (user_param->use_exp == 1)
+				err = (ctx->exp_post_send_func_pointer)(ctx->qp[0],
+					&ctx->exp_wr[0], &bad_exp_wr);
+			else
+				err = (ctx->post_send_func_pointer)(ctx->qp[0],&ctx->wr[0],&bad_wr);
+			#else
+			err = ibv_post_send(ctx->qp[0],&ctx->wr[0],&bad_wr);
+                        #endif
+			if (err) {
+				fprintf(stderr, "Couldn't post send: scnt=%lu\n", totscnt);
+				return 1;
+			}
+			if (user_param->post_list == 1 && user_param->size <= (ctx->cycle_buffer / 2)) {
+				#ifdef HAVE_VERBS_EXP
+				if (user_param->use_exp == 1)
+					increase_loc_addr(ctx->exp_wr[0].sg_list, user_param->size,
+								totscnt, ctx->my_addr[0], 0, ctx->cache_line_size, ctx->cycle_buffer);
+				else
+				#endif
+					increase_loc_addr(ctx->wr[0].sg_list, user_param->size, totscnt,
+							ctx->my_addr[0], 0, ctx->cache_line_size, ctx->cycle_buffer);
+			}
+			totscnt += user_param->post_list;
+			if (totscnt % user_param->reply_every == 0 && totscnt != 0) {
+				user_param->tposted[pong_cnt] = get_cycles();
+				pong_cnt++;
+			}
+			if (++burst_iter == user_param->burst_size) {
+				is_sending_burst = 0;
+			}
+		}
+polling:
+		do {
+			ne = ibv_poll_cq(ctx->recv_cq, CTX_POLL_BATCH, wc);
+			if (ne > 0) {
+				for (i = 0; i < ne; i++) {
+					wc_id = (user_param->verb_type == ACCL_INTF) ?
+							0 : (int)wc[i].wr_id;
+					user_param->tcompleted[totrcnt] = get_cycles();
+					totrcnt++;
+					if (wc[i].status != IBV_WC_SUCCESS) {
+						NOTIFY_COMP_ERROR_SEND(wc[i], totscnt, totccnt);
+						return_value = FAILURE;
+						goto cleaning;
+					}
+					if (ibv_post_recv(ctx->qp[wc_id], &ctx->rwr[wc_id], &bad_wr_recv)) {
+						fprintf(stderr, "Couldn't post recv Qp=%d rcnt=%ld\n", wc_id, totrcnt);
+						return FAILURE;
+					}
+				}
+			} else if (ne < 0) {
+				fprintf(stderr, "poll CQ failed %d\n", ne);
+				return_value = 1;
+				goto cleaning;
+			}
+			ns = ibv_poll_cq(ctx->send_cq, user_param->burst_size, wc);
+			if (ns > 0) {
+				for (i = 0; i < ns; i++) {
+					wc_id = (user_param->verb_type == ACCL_INTF) ?
+						0 : (int)wc[i].wr_id;
+					if (wc[i].status != IBV_WC_SUCCESS) {
+						NOTIFY_COMP_ERROR_SEND(wc[i], totscnt, totccnt);
+						return_value = FAILURE ;
+						goto cleaning;
+					}
+					totccnt += user_param->cq_mod;
+				}
+			} else if (ns < 0) {
+				fprintf(stderr, "poll CQ failed %d\n", ne);
+				return_value = 1;
+				goto cleaning;
+			}
+		} while (ne != 0);
+	}
+
+	return SUCCESS;
+cleaning:
+	free(wc);
+	return return_value;
+}
 /******************************************************************************
  *
  ******************************************************************************/
@@ -4446,7 +4768,7 @@ void check_alive(int sig)
 		if (check_alive_data.is_events) {
 			/* Can't report BW, as we are stuck in event_loop */
 			fprintf(stderr," Due to this issue, Perftest cannot produce a report when in event mode.\n");
-			exit(0);
+			exit(FAILURE);
 		}
 		else {
 			/* exit nice from run_iter function and report known bw/mr */
@@ -4489,8 +4811,40 @@ int check_masked_atomics_support(struct pingpong_context *ctx)
 }
 #endif
 
+/******************************************************************************
+ *
+ ******************************************************************************/
+#ifdef HAVE_PACKET_PACING_EXP
+int check_packet_pacing_support(struct pingpong_context *ctx)
+{
+	struct ibv_exp_device_attr attr;
+	memset(&attr, 0, sizeof (struct ibv_exp_device_attr));
+
+	attr.comp_mask = IBV_EXP_DEVICE_ATTR_PACKET_PACING_CAPS;
 
+	if (ibv_exp_query_device(ctx->context, &attr)) {
+		fprintf(stderr, "ibv_exp_query_device failed\n");
+		return FAILURE;
+	}
+
+	return MASK_IS_SET(IBV_EXP_DEVICE_ATTR_PACKET_PACING_CAPS, attr.comp_mask) ?
+		SUCCESS : FAILURE;
+}
+#elif HAVE_PACKET_PACING
+int check_packet_pacing_support(struct pingpong_context *ctx)
+{
+	struct ibv_device_attr_ex attr;
+	memset(&attr, 0, sizeof (struct ibv_device_attr_ex));
+
+	if (ibv_query_device_ex(ctx->context, NULL, &attr)) {
+		fprintf(stderr, "ibv_query_device_ex failed\n");
+		return FAILURE;
+	}
+
+	/* qp_rate_limit_max > 0 if PP is supported */
+	return attr.packet_pacing_caps.qp_rate_limit_max > 0 ? SUCCESS : FAILURE;
+}
+#endif
 /******************************************************************************
  * End
  ******************************************************************************/
-
diff --git a/src/perftest_resources.h b/src/perftest_resources.h
index 1b2343b..4532c61 100755
--- a/src/perftest_resources.h
+++ b/src/perftest_resources.h
@@ -149,7 +149,10 @@ struct pingpong_context {
 	uint64_t				*rx_buffer_addr;
 	uint64_t				*rem_addr;
 	uint64_t				buff_size;
+	uint64_t				send_qp_buff_size;
+	uint64_t				flow_buff_size;
 	int					tx_depth;
+	int					huge_shmid;
 	uint64_t				*scnt;
 	uint64_t				*ccnt;
 	int					is_contig_supported;
@@ -198,17 +201,6 @@ struct pingpong_context {
  * Perftest resources Methods and interface utilitizes.
  ******************************************************************************/
 
-/* link_layer_str
- *
- * Description : Determines the link layer type (IB or ETH).
- *
- * Parameters :
- *  link_layer - The link layer
-
- * Return Value : 0 upon success. -1 if it fails.
- */
-const char *link_layer_str(uint8_t link_layer);
-
 /* check_add_port
  *
  * Description : Creating a service struct from a given port and servername.
@@ -570,7 +562,35 @@ int run_iter_lat(struct pingpong_context *ctx,struct perftest_parameters *user_p
  *  ctx     - Test Context.
  *  user_param  - user_parameters struct for this test.
  */
-int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *user_param);
+int run_iter_lat_send(struct pingpong_context *ctx, struct perftest_parameters *user_param);
+
+/* run_iter_lat_burst
+ *
+ * Description :
+ *
+ *  This is the latency test function for SEND verb latency test in burst mode
+ *
+ * Parameters :
+ *
+ *  ctx     - Test Context.
+ *  user_param  - user_parameters struct for this test.
+ */
+
+int run_iter_lat_burst(struct pingpong_context *ctx, struct perftest_parameters *user_param);
+
+/* run_iter_lat_burst_server
+ *
+ * Description :
+ *
+ *  This is the latency test function for server side latency test in burst mode
+ *
+ * Parameters :
+ *
+ *  ctx     - Test Context.
+ *  user_param  - user_parameters struct for this test.
+ */
+
+int run_iter_lat_burst_server(struct pingpong_context *ctx, struct perftest_parameters *user_param);
 
 /* ctx_get_local_lid .
  *
@@ -586,7 +606,7 @@ int run_iter_lat_send(struct pingpong_context *ctx,struct perftest_parameters *u
  *
  * Return Value : The Lid itself. (No error values).
  */
-uint16_t ctx_get_local_lid(struct ibv_context *context,int ib_port);
+uint16_t ctx_get_local_lid(struct ibv_context *context, int ib_port);
 
 /* ctx_notify_events
  *
@@ -725,6 +745,10 @@ struct ibv_qp* ctx_atomic_qp_create(struct pingpong_context *ctx,
 int check_masked_atomics_support(struct pingpong_context *ctx);
 #endif
 
+#if defined (HAVE_PACKET_PACING_EXP) || defined (HAVE_PACKET_PACING)
+int check_packet_pacing_support(struct pingpong_context *ctx);
+#endif
+
 #ifdef HAVE_ACCL_VERBS
 struct ibv_exp_res_domain* create_res_domain(struct pingpong_context *ctx,
 						struct perftest_parameters *user_param);
@@ -783,4 +807,19 @@ int create_single_mr(struct pingpong_context *ctx,
  */
 int create_mr(struct pingpong_context *ctx,
 		struct perftest_parameters *user_param);
+
+/* alloc_hugapage_region
+ *
+ * Description :
+ *
+ *	Creates hugepage memory Regions for the test.
+ *
+ *	Parameters :
+ *      	ctx - Resources sructure.
+ *
+ * Return Value : SUCCESS, FAILURE.
+ *
+ */
+int alloc_hugepage_region (struct pingpong_context *ctx);
+
 #endif /* PERFTEST_RESOURCES_H */
diff --git a/src/raw_ethernet_resources.c b/src/raw_ethernet_resources.c
index be3b607..3bc54b7 100755
--- a/src/raw_ethernet_resources.c
+++ b/src/raw_ethernet_resources.c
@@ -114,11 +114,35 @@ static uint16_t ip_checksum	(void * buf,size_t 	  hdr_len)
 	return(~sum);
 }
 
+void gen_ipv6_header(void* ip_header_buffer, uint8_t* saddr, uint8_t* daddr,
+		     uint8_t protocol, int pkt_size, int tos, int is_l4, int
+		     is_tcp)
+{
+	struct IP_V6_header ip_header;
+
+	memset(&ip_header,0,sizeof(struct IP_V6_header));
+
+	ip_header.version = 6;
+	ip_header.nexthdr = protocol ? protocol : DEFAULT_IPV6_NEXT_HDR;
+	ip_header.hop_limit = DEFAULT_TTL;
+	ip_header.payload_len = htons(pkt_size - sizeof(struct IP_V6_header));
+	if (is_l4) {
+		if (is_tcp)
+			ip_header.payload_len -= sizeof(struct TCP_header);
+		else
+			ip_header.payload_len -= sizeof(struct UDP_header);
+	}
+	memcpy(&ip_header.saddr, saddr, sizeof(ip_header.saddr));
+	memcpy(&ip_header.daddr, daddr, sizeof(ip_header.daddr));
+
+	memcpy(ip_header_buffer, &ip_header, sizeof(struct IP_V6_header));
+}
+
 /******************************************************************************
  *
  ******************************************************************************/
-void gen_ip_header(void* ip_header_buffer, uint32_t* saddr, uint32_t* daddr,
-		   uint8_t protocol, int pkt_size, int tos, int flows_offset)
+void gen_ipv4_header(void* ip_header_buffer, uint32_t* saddr, uint32_t* daddr,
+		     uint8_t protocol, int pkt_size, int tos, int flows_offset)
 {
 	struct IP_V4_header ip_header;
 
@@ -185,6 +209,32 @@ void gen_eth_header(struct ETH_header* eth_header,uint8_t* src_mac,
 
 }
 
+static int get_ip_size(int is_ipv6)
+{
+#ifdef HAVE_IPV6
+	if (is_ipv6)
+#ifdef HAVE_RAW_ETH_EXP
+		return sizeof(struct ibv_exp_flow_spec_ipv6_ext);
+#else
+		return sizeof(struct ibv_flow_spec_ipv6);
+#endif
+#endif /* HAVE_IPV6 */
+
+#ifdef HAVE_RAW_ETH_EXP
+#ifdef HAVE_IPV4_EXT
+		return sizeof(struct ibv_exp_flow_spec_ipv4_ext);
+#else
+		return sizeof(struct ibv_exp_flow_spec_ipv4);
+#endif /* HAVE_IPV4_EXT */
+#else
+#ifdef HAVE_IPV4_EXT
+		return sizeof(struct ibv_flow_spec_ipv4_ext);
+#else
+		return sizeof(struct ibv_flow_spec_ipv4);
+#endif /* HAVE_IPV4_EXT */
+#endif
+}
+
 /******************************************************************************
  * print test specification
  ******************************************************************************/
@@ -192,12 +242,19 @@ void gen_eth_header(struct ETH_header* eth_header,uint8_t* src_mac,
 void print_spec(struct ibv_exp_flow_attr* flow_rules,struct perftest_parameters* user_param)
 {
 	struct ibv_exp_flow_spec* spec_info = NULL;
+	#ifdef HAVE_IPV6
+	struct ibv_exp_flow_spec_ipv6_ext *ipv6_spec;
+	#endif
 #else
 void print_spec(struct ibv_flow_attr* flow_rules,struct perftest_parameters* user_param)
 {
 		struct ibv_flow_spec* spec_info = NULL;
+		#ifdef HAVE_IPV6
+		struct ibv_flow_spec_ipv6 *ipv6_spec;
+		#endif
 #endif
 		void* header_buff = (void*)flow_rules;
+		int ip_size = get_ip_size(user_param->raw_ipv6);
 
 		if (user_param->output != FULL_VERBOSITY) {
 			return;
@@ -226,35 +283,61 @@ void print_spec(struct ibv_flow_attr* flow_rules,struct perftest_parameters* use
 		if (user_param->is_server_ip && user_param->is_client_ip) {
 			char str_ip_s[INET_ADDRSTRLEN] = {0};
 			char str_ip_d[INET_ADDRSTRLEN] = {0};
+			#ifdef HAVE_IPV6
+			char str_ip6_s[INET6_ADDRSTRLEN] = {0};
+			char str_ip6_d[INET6_ADDRSTRLEN] = {0};
+			#endif
 			#ifdef HAVE_RAW_ETH_EXP
 			header_buff = header_buff + sizeof(struct ibv_exp_flow_spec_eth);
 			spec_info = (struct ibv_exp_flow_spec*)header_buff;
+			#ifdef HAVE_IPV6
+			ipv6_spec = &spec_info->ipv6_ext;
+			#endif
 			#else
 			header_buff = header_buff + sizeof(struct ibv_flow_spec_eth);
 			spec_info = (struct ibv_flow_spec*)header_buff;
+			#ifdef HAVE_IPV6
+			ipv6_spec = &spec_info->ipv6;
 			#endif
-			uint32_t dst_ip = spec_info->ipv4.val.dst_ip;
-			uint32_t src_ip = spec_info->ipv4.val.src_ip;
-			inet_ntop(AF_INET, &dst_ip, str_ip_d, INET_ADDRSTRLEN);
-			printf("spec_info - dst_ip   : %s\n",str_ip_d);
-			inet_ntop(AF_INET, &src_ip, str_ip_s, INET_ADDRSTRLEN);
-			printf("spec_info - src_ip   : %s\n",str_ip_s);
+			#endif
+			if (!user_param->raw_ipv6) {
+				uint32_t dst_ip = spec_info->ipv4.val.dst_ip;
+				uint32_t src_ip = spec_info->ipv4.val.src_ip;
+				inet_ntop(AF_INET, &dst_ip, str_ip_d, INET_ADDRSTRLEN);
+				printf("spec_info - dst_ip   : %s\n",str_ip_d);
+				inet_ntop(AF_INET, &src_ip, str_ip_s, INET_ADDRSTRLEN);
+				printf("spec_info - src_ip   : %s\n",str_ip_s);
+			}
+			else {
+				#ifdef HAVE_IPV6
+				void *dst_ip = ipv6_spec->val.dst_ip;
+				void *src_ip = ipv6_spec->val.src_ip;
+				inet_ntop(AF_INET6, dst_ip, str_ip6_d, INET6_ADDRSTRLEN);
+				printf("spec_info - dst_ip   : %s\n",str_ip6_d);
+				inet_ntop(AF_INET6, src_ip, str_ip6_s, INET6_ADDRSTRLEN);
+				printf("spec_info - src_ip   : %s\n",str_ip6_s);
+				#endif
+			}
 		}
 
 		if (user_param->is_server_port && user_param->is_client_port) {
-			#ifdef HAVE_RAW_ETH_EXP
-			header_buff = header_buff + sizeof(struct ibv_exp_flow_spec_ipv4);
-			spec_info = (struct ibv_exp_flow_spec*)header_buff;
-			#else
-			header_buff = header_buff + sizeof(struct ibv_flow_spec_ipv4);
-			spec_info = (struct ibv_flow_spec*)header_buff;
-			#endif
+			header_buff = header_buff + ip_size;
+			spec_info = header_buff;
 			printf("spec_info - dst_port : %d\n",ntohs(spec_info->tcp_udp.val.dst_port));
 			printf("spec_info - src_port : %d\n",ntohs(spec_info->tcp_udp.val.src_port));
 		}
 
 	}
 
+static char *etype_str(uint16_t etype)
+{
+	if (etype == IP_ETHER_TYPE)
+		return "IPv4";
+	else if (etype == IP6_ETHER_TYPE)
+		return "IPv6";
+	else return "DEFAULT";
+}
+
 /******************************************************************************
  *
  ******************************************************************************/
@@ -286,7 +369,7 @@ void print_ethernet_header(struct ETH_header* p_ethernet_header)
 			p_ethernet_header->src_mac[4],
 			p_ethernet_header->src_mac[5]);
 	printf("|");
-	char* eth_type = (ntohs(p_ethernet_header->eth_type) ==  IP_ETHER_TYPE ? "IP" : "DEFAULT");
+	char* eth_type = etype_str((ntohs(p_ethernet_header->eth_type)));
 	printf("%-22s|\n",eth_type);
 	printf("|------------------------------------------------------------|\n\n");
 
@@ -329,6 +412,35 @@ void print_ip_header(struct IP_V4_header* ip_header)
 /******************************************************************************
  *
  ******************************************************************************/
+void print_ip6_header(struct IP_V6_header* ip_header)
+{
+	char str_ip_s[INET6_ADDRSTRLEN];
+	char str_ip_d[INET6_ADDRSTRLEN];
+
+	if (NULL == ip_header) {
+		fprintf(stderr, "IP_V6_header pointer is Null\n");
+		return;
+	}
+
+	printf("***************IPv6 header*************\n");
+	printf("|-------------------------------------|\n");
+	printf("|Version   |%-26d|\n",ip_header->version);
+	printf("|Hop Limit |%-26d|\n",ip_header->hop_limit);
+
+	if (ip_header->nexthdr)
+		printf("|protocol  |%-26s|\n",ip_header->nexthdr == UDP_PROTOCOL ? "UDP" : "TCP");
+	else
+		printf("|protocol  |%-26s|\n","EMPTY");
+	inet_ntop(AF_INET6, &ip_header->saddr, str_ip_s, INET6_ADDRSTRLEN);
+	printf("|Source IP |%-26s|\n",str_ip_s);
+	inet_ntop(AF_INET6, &ip_header->daddr, str_ip_d, INET6_ADDRSTRLEN);
+	printf("|Dest IP   |%-26s|\n",str_ip_d);
+	printf("|-------------------------------------|\n\n");
+}
+
+/******************************************************************************
+ *
+ ******************************************************************************/
 void print_udp_header(struct UDP_header* udp_header)
 {
 	if(NULL == udp_header) {
@@ -380,11 +492,17 @@ void print_pkt(void* pkt,struct perftest_parameters *user_param)
 	print_ethernet_header((struct ETH_header*)pkt);
 	if(user_param->is_client_ip || user_param->is_server_ip) {
 		pkt = (void*)pkt + sizeof(struct ETH_header);
-		print_ip_header((struct IP_V4_header*)pkt);
+		if (user_param->raw_ipv6)
+			print_ip6_header((struct IP_V6_header*)pkt);
+		else
+			print_ip_header((struct IP_V4_header*)pkt);
 	}
 
 	if(user_param->is_client_port && user_param->is_server_port) {
-		pkt = pkt + sizeof(struct IP_V4_header);
+		if (user_param->raw_ipv6)
+			pkt = pkt + sizeof(struct IP_V6_header);
+		else
+			pkt = pkt + sizeof(struct IP_V4_header);
 		if (user_param->tcp)
 			print_tcp_header((struct TCP_header*)pkt);
 		else
@@ -411,12 +529,21 @@ void build_pkt_on_buffer(struct ETH_header* eth_header,
 		int offset = is_udp_or_tcp ? 0 : flows_offset;
 
 		header_buff = (void*)eth_header + sizeof(struct ETH_header);
-		gen_ip_header(header_buff, &my_dest_info->ip, &rem_dest_info->ip,
-			      ip_next_protocol, pkt_size, user_param->tos, offset);
+		if (user_param->raw_ipv6)
+			gen_ipv6_header(header_buff, my_dest_info->ip6,
+					rem_dest_info->ip6, ip_next_protocol,
+					pkt_size, user_param->tos,
+					is_udp_or_tcp, user_param->tcp);
+		else
+			gen_ipv4_header(header_buff, &my_dest_info->ip, &rem_dest_info->ip,
+					ip_next_protocol, pkt_size, user_param->tos, offset);
 	}
 
 	if(is_udp_or_tcp) {
-		header_buff = header_buff + sizeof(struct IP_V4_header);
+		if (user_param->raw_ipv6)
+			header_buff = header_buff + sizeof(struct IP_V6_header);
+		else
+			header_buff = header_buff + sizeof(struct IP_V4_header);
 		if (user_param->tcp)
 			gen_tcp_header(header_buff, my_dest_info->port + flows_offset,
 				       rem_dest_info->port + flows_offset);
@@ -432,52 +559,59 @@ void build_pkt_on_buffer(struct ETH_header* eth_header,
 }
 
 /******************************************************************************
- *create_raw_eth_pkt - build raw Ethernet packet by user arguments
- *on bw test, build one packet and duplicate it on the buffer
- *on lat test, build only one packet on the buffer (for the ping pong method)
+ *Create_raw_eth_pkt - build raw Ethernet packet by user arguments.
+ *On bw test, build one packet and duplicate it on the buffer per QP.
+ *Alternatively, build multiple packets according to number of flows,
+ * again per QP
+ *On lat test, build only one packet on the buffer (for the ping pong method)
  ******************************************************************************/
 void create_raw_eth_pkt( struct perftest_parameters *user_param,
-		struct pingpong_context 	*ctx ,
+		struct pingpong_context 	*ctx,
+		void		 		*buf,
 		struct raw_ethernet_info	*my_dest_info,
 		struct raw_ethernet_info	*rem_dest_info)
 {
-	int offset = 0;
+	int pkt_offset = 0;
+	int flow_limit = 0;
 	int i, print_flag = 0;
 	struct ETH_header* eth_header;
 	uint16_t ip_next_protocol = 0;
 	uint16_t eth_type = user_param->is_ethertype ? user_param->ethertype :
-		(user_param->is_client_ip || user_param->is_server_ip ? IP_ETHER_TYPE : (ctx->size-RAWETH_ADDITION));
+		(user_param->is_client_ip || user_param->is_server_ip ?
+		 (user_param->raw_ipv6) ? IP6_ETHER_TYPE :
+		 IP_ETHER_TYPE : (ctx->size-RAWETH_ADDITION));
 	if(user_param->is_client_port && user_param->is_server_port)
 		ip_next_protocol = (user_param->tcp ? TCP_PROTOCOL : UDP_PROTOCOL);
 
 	DEBUG_LOG(TRACE,">>>>>>%s",__FUNCTION__);
 
-	eth_header = (void*)ctx->buf[0];
+	eth_header = buf;
 
-	if (user_param->tst == BW) {
+	if (user_param->tst == BW || user_param->tst == LAT_BY_BW) {
 		/* fill ctx buffer with different packets according to flows_offset */
 		for (i = 0; i < user_param->flows; i++) {
 			print_flag = PRINT_ON;
-			offset = (ctx->cycle_buffer) * i; /* update the offset to next flow */
-			eth_header = (void*)ctx->buf[0] + offset;/* update the eth_header to next flow */
+			pkt_offset = ctx->flow_buff_size * i; /* update the offset to next flow */
+			flow_limit = ctx->flow_buff_size * (i + 1);
+			eth_header = (void*)buf + pkt_offset;/* update the eth_header to next flow */
 			/* fill ctx buffer with same packets */
-			while (offset-(ctx->cycle_buffer * i) < ctx->cycle_buffer-INC(ctx->size,ctx->cache_line_size)) {
+			while ((flow_limit - INC(ctx->size, ctx->cache_line_size)) >= pkt_offset) {
 				build_pkt_on_buffer(eth_header, my_dest_info, rem_dest_info,
 						    user_param, eth_type, ip_next_protocol,
-						    print_flag , ctx->size - RAWETH_ADDITION, i);
+						    print_flag, ctx->size - RAWETH_ADDITION, i);
 				print_flag = PRINT_OFF;
-				offset += INC(ctx->size, ctx->cache_line_size);/* update the offset to next packet in same flow */
-				eth_header = (void*)ctx->buf[0] + offset;/* update the eth_header to next packet in same flow */
+				pkt_offset += INC(ctx->size, ctx->cache_line_size);/* update the offset to next packet in same flow */
+				eth_header = (void*)buf + pkt_offset;/* update the eth_header to next packet in same flow */
 			}
 		}
 	} else if (user_param->tst == LAT) {
 		/* fill ctx buffer with different packets according to flows_offset */
 		for (i = 0; i < user_param->flows; i++) {
+			pkt_offset = ctx->flow_buff_size * i;
+			eth_header = (void*)buf + pkt_offset;
 			build_pkt_on_buffer(eth_header, my_dest_info, rem_dest_info,
 					    user_param, eth_type, ip_next_protocol,
-					    PRINT_ON ,ctx->size - RAWETH_ADDITION, i);
-			offset += INC(ctx->size, ctx->cache_line_size);
-			eth_header = (void*)ctx->buf[0] + offset;
+					    PRINT_ON, ctx->size - RAWETH_ADDITION, i);
 
 		}
 	}
@@ -488,20 +622,20 @@ void create_raw_eth_pkt( struct perftest_parameters *user_param,
 /******************************************************************************
   calc_flow_rules_size
  ******************************************************************************/
-int calc_flow_rules_size(int is_ip_header,int is_udp_header)
+int calc_flow_rules_size(struct perftest_parameters *user_param, int is_ip_header,int is_udp_header)
 {
 	#ifdef HAVE_RAW_ETH_EXP
 	int tot_size = sizeof(struct ibv_exp_flow_attr);
 	tot_size += sizeof(struct ibv_exp_flow_spec_eth);
 	if (is_ip_header)
-		tot_size += sizeof(struct ibv_exp_flow_spec_ipv4);
+		tot_size += get_ip_size(user_param->raw_ipv6);
 	if (is_udp_header)
 		tot_size += sizeof(struct ibv_exp_flow_spec_tcp_udp);
 	#else
 	int tot_size = sizeof(struct ibv_flow_attr);
 	tot_size += sizeof(struct ibv_flow_spec_eth);
 	if (is_ip_header)
-		tot_size += sizeof(struct ibv_flow_spec_ipv4);
+		tot_size += get_ip_size(user_param->raw_ipv6);
 	if (is_udp_header)
 		tot_size += sizeof(struct ibv_flow_spec_tcp_udp);
 	#endif
@@ -509,6 +643,115 @@ int calc_flow_rules_size(int is_ip_header,int is_udp_header)
 	return tot_size;
 }
 
+#ifdef HAVE_RAW_ETH_EXP
+static void fill_ip_common(struct ibv_exp_flow_spec* spec_info,
+			   struct perftest_parameters *user_param)
+{
+	#ifdef HAVE_IPV6
+	struct ibv_exp_flow_spec_ipv6_ext *ipv6_spec = &spec_info->ipv6_ext;
+	static const char ipv6_mask[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+					 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+	#endif
+	#ifdef HAVE_IPV4_EXT
+	struct ibv_exp_flow_spec_ipv4_ext *ipv4_spec = &spec_info->ipv4_ext;
+	#else
+	struct ibv_exp_flow_spec_ipv4 *ipv4_spec = &spec_info->ipv4;
+	#endif /* HAVE_IPV4_EXT */
+#else
+static void fill_ip_common(struct ibv_flow_spec* spec_info,
+			   struct perftest_parameters *user_param)
+{
+	#ifdef HAVE_IPV6
+	struct ibv_flow_spec_ipv6 *ipv6_spec = &spec_info->ipv6;
+	static const char ipv6_mask[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+					 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+	#endif
+	#ifdef HAVE_IPV4_EXT
+	struct ibv_flow_spec_ipv4_ext *ipv4_spec = &spec_info->ipv4_ext;
+	#else
+	struct ibv_flow_spec_ipv4 *ipv4_spec = &spec_info->ipv4;
+	#endif
+#endif
+
+	if(user_param->machine == SERVER) {
+		if (user_param->raw_ipv6) {
+			#ifdef HAVE_IPV6
+			memcpy(ipv6_spec->val.dst_ip,
+			       user_param->server_ip6, 16);
+			memcpy(ipv6_spec->val.src_ip,
+			       user_param->client_ip6, 16);
+			if (user_param->tos != DEF_TOS) {
+				ipv6_spec->val.traffic_class =
+					user_param->tos;
+				ipv6_spec->mask.traffic_class =
+					0xff;
+			}
+			if (user_param->flow_label) {
+				ipv6_spec->val.flow_label =
+					htonl(user_param->flow_label);
+				ipv6_spec->mask.flow_label =
+					htonl(0xfffff);
+			}
+			memcpy((void*)&ipv6_spec->mask.dst_ip, ipv6_mask, 16);
+			memcpy((void*)&ipv6_spec->mask.src_ip, ipv6_mask, 16);
+			#endif
+		} else {
+			ipv4_spec->val.dst_ip = user_param->server_ip;
+			ipv4_spec->val.src_ip = user_param->client_ip;
+			memset((void*)&ipv4_spec->mask.dst_ip, 0xFF,sizeof(ipv4_spec->mask.dst_ip));
+			memset((void*)&ipv4_spec->mask.src_ip, 0xFF,sizeof(ipv4_spec->mask.src_ip));
+			#ifdef HAVE_IPV4_EXT
+			if (user_param->tos != DEF_TOS) {
+				ipv4_spec->val.tos = user_param->tos;
+				ipv4_spec->mask.tos = 0xff;
+			}
+			#endif
+		}
+	}
+}
+
+#ifdef HAVE_RAW_ETH_EXP
+static void fill_exp_ip_spec(struct ibv_exp_flow_spec* spec_info,
+			     struct perftest_parameters *user_param)
+{
+	if (user_param->raw_ipv6) {
+		#ifdef HAVE_IPV6
+		spec_info->ipv6.type = IBV_EXP_FLOW_SPEC_IPV6_EXT;
+		spec_info->ipv6.size = sizeof(struct ibv_exp_flow_spec_ipv6_ext);
+		#endif
+	} else {
+		#ifdef HAVE_IPV4_EXT
+		spec_info->ipv4.type = IBV_EXP_FLOW_SPEC_IPV4_EXT;
+		spec_info->ipv4.size = sizeof(struct ibv_exp_flow_spec_ipv4_ext);
+		#else
+		spec_info->ipv4.type = IBV_EXP_FLOW_SPEC_IPV4;
+		spec_info->ipv4.size = sizeof(struct ibv_exp_flow_spec_ipv4);
+		#endif
+	}
+	fill_ip_common(spec_info, user_param);
+}
+#else
+static void fill_ip_spec(struct ibv_flow_spec* spec_info,
+			 struct perftest_parameters *user_param)
+{
+	if (user_param->raw_ipv6) {
+		#ifdef HAVE_IPV6
+		spec_info->ipv6.type = IBV_FLOW_SPEC_IPV6;
+		spec_info->ipv6.size = sizeof(struct ibv_flow_spec_ipv6);
+		#endif
+	} else {
+		#ifdef HAVE_IPV4_EXT
+		spec_info->ipv4.type = IBV_FLOW_SPEC_IPV4_EXT;
+		spec_info->ipv4.size = sizeof(struct ibv_flow_spec_ipv4_ext);
+		#else
+		spec_info->ipv4.type = IBV_FLOW_SPEC_IPV4;
+		spec_info->ipv4.size = sizeof(struct ibv_flow_spec_ipv4);
+		#endif
+	}
+	fill_ip_common(spec_info, user_param);
+}
+#endif
+
 static int set_up_flow_rules(
 		#ifdef HAVE_RAW_ETH_EXP
 		struct ibv_exp_flow_attr **flow_rules,
@@ -533,7 +776,7 @@ static int set_up_flow_rules(
 	int is_ip = user_param->is_server_ip || user_param->is_client_ip;
 	int is_port = user_param->is_server_port || user_param->is_client_port;
 
-	flow_rules_size = calc_flow_rules_size(is_ip, is_port);
+	flow_rules_size = calc_flow_rules_size(user_param, is_ip,is_port);
 
 	ALLOCATE(header_buff, uint8_t, flow_rules_size);
 
@@ -576,38 +819,21 @@ static int set_up_flow_rules(
 		#ifdef HAVE_RAW_ETH_EXP
 		header_buff = header_buff + sizeof(struct ibv_exp_flow_spec_eth);
 		spec_info = (struct ibv_exp_flow_spec*)header_buff;
-		spec_info->ipv4.type = IBV_EXP_FLOW_SPEC_IPV4;
-		spec_info->ipv4.size = sizeof(struct ibv_exp_flow_spec_ipv4);
+		fill_exp_ip_spec(spec_info, user_param);
 		#else
 		header_buff = header_buff + sizeof(struct ibv_flow_spec_eth);
 		spec_info = (struct ibv_flow_spec*)header_buff;
-		spec_info->ipv4.type = IBV_FLOW_SPEC_IPV4;
-		spec_info->ipv4.size = sizeof(struct ibv_flow_spec_ipv4);
+		fill_ip_spec(spec_info, user_param);
 		#endif
-
-		if(user_param->machine == SERVER) {
-
-			spec_info->ipv4.val.dst_ip = user_param->server_ip;
-			spec_info->ipv4.val.src_ip = user_param->client_ip;
-
-		} else{
-
-			spec_info->ipv4.val.dst_ip = user_param->client_ip;
-			spec_info->ipv4.val.src_ip = user_param->server_ip;
-		}
-
-		memset((void*)&spec_info->ipv4.mask.dst_ip, 0xFF,sizeof(spec_info->ipv4.mask.dst_ip));
-		memset((void*)&spec_info->ipv4.mask.src_ip, 0xFF,sizeof(spec_info->ipv4.mask.src_ip));
 	}
 
 	if(user_param->is_server_port && user_param->is_client_port) {
+		header_buff = header_buff + get_ip_size(user_param->raw_ipv6);
 		#ifdef HAVE_RAW_ETH_EXP
-		header_buff = header_buff + sizeof(struct ibv_exp_flow_spec_ipv4);
 		spec_info = (struct ibv_exp_flow_spec*)header_buff;
 		spec_info->tcp_udp.type = (user_param->tcp) ? IBV_EXP_FLOW_SPEC_TCP : IBV_EXP_FLOW_SPEC_UDP;
 		spec_info->tcp_udp.size = sizeof(struct ibv_exp_flow_spec_tcp_udp);
 		#else
-		header_buff = header_buff + sizeof(struct ibv_flow_spec_ipv4);
 		spec_info = (struct ibv_flow_spec*)header_buff;
 		spec_info->tcp_udp.type = (user_param->tcp) ? IBV_FLOW_SPEC_TCP : IBV_FLOW_SPEC_UDP;
 		spec_info->tcp_udp.size = sizeof(struct ibv_flow_spec_tcp_udp);
@@ -645,12 +871,12 @@ int send_set_up_connection(
 		#endif
 		struct pingpong_context *ctx,
 		struct perftest_parameters *user_param,
-		struct raw_ethernet_info* my_dest_info,
-		struct raw_ethernet_info* rem_dest_info)
+		struct raw_ethernet_info *my_dest_info,
+		struct raw_ethernet_info *rem_dest_info)
 {
 
 	union ibv_gid temp_gid;
-	int i;
+	int flow_index;
 
 	if (user_param->gid_index != -1) {
 		if (ibv_query_gid(ctx->context,user_param->ib_port,user_param->gid_index,&temp_gid)) {
@@ -660,8 +886,8 @@ int send_set_up_connection(
 	}
 
 	if (user_param->machine == SERVER || user_param->duplex) {
-		for (i = 0; i < user_param->flows; i++)
-			set_up_flow_rules(&flow_rules[i], ctx, user_param, i);
+		for (flow_index = 0; flow_index < user_param->flows; flow_index++)
+			set_up_flow_rules(&flow_rules[flow_index], ctx, user_param, flow_index);
 	}
 
 	if (user_param->machine == CLIENT || user_param->duplex) {
@@ -674,20 +900,41 @@ int send_set_up_connection(
 
 		if(user_param->is_client_ip) {
 			if(user_param->machine == CLIENT) {
-				my_dest_info->ip = user_param->client_ip;
+				if (!user_param->raw_ipv6)
+					my_dest_info->ip = user_param->client_ip;
+				else
+					memcpy(my_dest_info->ip6,
+					       &(user_param->client_ip6[0]),
+					       sizeof(user_param->client_ip6));
 			} else {
-				my_dest_info->ip = user_param->server_ip;
+				if (!user_param->raw_ipv6)
+					my_dest_info->ip = user_param->server_ip;
+				else
+					memcpy(my_dest_info->ip6,
+					       &(user_param->server_ip6[0]),
+					       sizeof(user_param->server_ip6));
 			}
 		}
 
 		if(user_param->machine == CLIENT) {
-			rem_dest_info->ip = user_param->server_ip;
+			if (!user_param->raw_ipv6)
+				rem_dest_info->ip = user_param->server_ip;
+			else {
+				memcpy(rem_dest_info->ip6,
+				       &(user_param->server_ip6[0]),
+				       sizeof(user_param->server_ip6));
+			}
 			my_dest_info->port = user_param->client_port;
 			rem_dest_info->port = user_param->server_port;
 		}
 
 		if(user_param->machine == SERVER && user_param->duplex) {
-			rem_dest_info->ip = user_param->client_ip;
+			if (!user_param->raw_ipv6)
+				rem_dest_info->ip = user_param->client_ip;
+			else
+				memcpy(rem_dest_info->ip6,
+				       &(user_param->client_ip6[0]),
+				       sizeof(user_param->client_ip6));
 			my_dest_info->port = user_param->server_port;
 			rem_dest_info->port = user_param->client_port;
 		}
@@ -747,7 +994,7 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 
 	while ((user_param->test_type == DURATION && user_param->state != END_STATE) || totccnt < tot_iters || totrcnt < tot_iters) {
 
-		for (index=0; index < user_param->num_of_qps; index++) {
+		for (index = 0; index < user_param->num_of_qps; index++) {
 
 			while (((ctx->scnt[index] < iters) || ((firstRx == OFF) && (user_param->test_type == DURATION))) &&
 					((ctx->scnt[index] - ctx->ccnt[index]) < user_param->tx_depth) && (rcnt_for_qp[index] - ctx->scnt[index] > 0)) {
@@ -799,7 +1046,7 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 				#endif
 				if(err) {
 					fprintf(stderr, "Couldn't post send: qp %d scnt=%lu \n", index, ctx->scnt[index]);
-					return_value = 1;
+					return_value = FAILURE;
 					goto cleaning;
 				}
 
@@ -843,7 +1090,7 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 
 			if (ctx_notify_events(ctx->channel)) {
 				fprintf(stderr, "Failed to notify events to CQ");
-				return_value = 1;
+				return_value = FAILURE;
 				goto cleaning;
 			}
 		}
@@ -882,7 +1129,7 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 				}
 			} else if (ne < 0) {
 				fprintf(stderr, "poll CQ failed %d\n", ne);
-				return_value = 1;
+				return_value = FAILURE;
 				goto cleaning;
 			}
 		}
@@ -920,7 +1167,7 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 				}
 			} else if (ne < 0) {
 				fprintf(stderr, "poll CQ failed %d\n", ne);
-				return_value = 1;
+				return_value = FAILURE;
 				goto cleaning;
 			}
 			while (rwqe_sent - totccnt < user_param->rx_depth) {    /* Post more than buffer_size */
@@ -930,7 +1177,7 @@ int run_iter_fw(struct pingpong_context *ctx,struct perftest_parameters *user_pa
 					if (user_param->verb_type == ACCL_INTF) {
 						if (ctx->qp_burst_family[0]->recv_burst(ctx->qp[0], ctx->rwr[0].sg_list, 1)) {
 							fprintf(stderr, "Couldn't post recv burst (accelerated verbs).\n");
-							return_value = 1;
+							return_value = FAILURE;
 							goto cleaning;
 						}
 					} else {
diff --git a/src/raw_ethernet_resources.h b/src/raw_ethernet_resources.h
index c8bdc69..6370099 100755
--- a/src/raw_ethernet_resources.h
+++ b/src/raw_ethernet_resources.h
@@ -37,16 +37,19 @@
 #define PERF_MAC_FMT " %02X:%02X:%02X:%02X:%02X:%02X"
 
 #define IP_ETHER_TYPE (0x800)
+#define IP6_ETHER_TYPE (0x86DD)
 #define PRINT_ON (1)
 #define PRINT_OFF (0)
 #define UDP_PROTOCOL (0x11)
 #define TCP_PROTOCOL (0x06)
 #define IP_HEADER_LEN (20)
 #define DEFAULT_TTL (128)
+#define DEFAULT_IPV6_NEXT_HDR (0x3b)
 
 struct raw_ethernet_info {
 	uint8_t mac[6];
 	uint32_t ip;
+	uint8_t ip6[16];
 	int port;
 };
 
@@ -82,6 +85,24 @@ struct ETH_header {
 #endif
 #endif
 
+struct IP_V6_header {
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8			priority:4,
+				version:4;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+	__u8			version:4,
+				priority:4;
+#endif
+	__u8			flow_lbl[3];
+
+	__be16			payload_len;
+	__u8			nexthdr;
+	__u8			hop_limit;
+
+	struct	in6_addr	saddr;
+	struct	in6_addr	daddr;
+}__attribute__((packed));
+
 struct IP_V4_header{
 	#if defined(__LITTLE_ENDIAN_BITFIELD)
 	uint8_t		ihl:4;
@@ -166,11 +187,13 @@ void build_pkt_on_buffer(struct ETH_header* eth_header,
  *	Parameters:
  *				user_param - user_parameters struct for this test
  *				ctx - Test Context.
+ *				buf - The QP's packet buffer.
  *				my_dest_info - ethernet information of me
  *				rem_dest_info - ethernet information of the remote
  */
 void create_raw_eth_pkt( struct perftest_parameters *user_param,
 		struct pingpong_context 	*ctx ,
+		void		 		*eth_header,
 		struct raw_ethernet_info	*my_dest_info,
 		struct raw_ethernet_info	*rem_dest_info);
 
@@ -181,7 +204,7 @@ void create_raw_eth_pkt( struct perftest_parameters *user_param,
  *				is_udp_header - if udp header is exist, count the header's size
  *
  */
-int calc_flow_rules_size(int is_ip_header,int is_udp_header);
+int calc_flow_rules_size(struct perftest_parameters *user_param, int is_ip_header,int is_udp_header);
 
 /* send_set_up_connection
  * Description: init raw_ethernet_info and ibv_flow_spec to user args
diff --git a/src/raw_ethernet_send_lat.c b/src/raw_ethernet_send_burst_lat.c
similarity index 82%
copy from src/raw_ethernet_send_lat.c
copy to src/raw_ethernet_send_burst_lat.c
index 4663714..b4b7812 100755
--- a/src/raw_ethernet_send_lat.c
+++ b/src/raw_ethernet_send_burst_lat.c
@@ -72,6 +72,7 @@ int main(int argc, char *argv[])
 	#else
 	struct ibv_flow			**flow_create_result;
 	struct ibv_flow_attr		**flow_rules;
+	struct ibv_flow 		*flow_promisc = NULL;
 	#endif
 	struct report_options		report;
 	int				i;
@@ -86,7 +87,7 @@ int main(int argc, char *argv[])
 	 * Raw Ethernet Send Latency Test
 	 */
 	user_param.verb    = SEND;
-	user_param.tst     = LAT;
+	user_param.tst     = LAT_BY_BW;
 	strncpy(user_param.version, VERSION, sizeof(user_param.version));
 	user_param.connection_type = RawEth;
 	user_param.r_flag  = &report;
@@ -101,7 +102,7 @@ int main(int argc, char *argv[])
 		if (ret_parser != VERSION_EXIT && ret_parser != HELP_EXIT)
 			fprintf(stderr," Parser function exited with Error\n");
 		DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 	#ifdef HAVE_RAW_ETH_EXP
 	ALLOCATE(flow_create_result, struct ibv_exp_flow*, user_param.flows);
@@ -122,12 +123,12 @@ int main(int argc, char *argv[])
 	if (!ib_dev) {
 		fprintf(stderr," Unable to find the Infiniband/RoCE device\n");
 		DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 	GET_STRING(user_param.ib_devname, ibv_get_device_name(ib_dev));
 
 	if (check_flow_steering_support(user_param.ib_devname)) {
-		return 1;
+		return FAILURE;
 	}
 
 	/* Getting the relevant context from the device */
@@ -135,7 +136,7 @@ int main(int argc, char *argv[])
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
 		DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 
 	/* See if MTU and link type are valid and supported. */
@@ -153,7 +154,7 @@ int main(int argc, char *argv[])
 	 */
 	if (send_set_up_connection(flow_rules, &ctx, &user_param, &my_dest_info, &rem_dest_info)) {
 		fprintf(stderr," Unable to set up socket connection\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* Print basic test information. */
@@ -162,35 +163,10 @@ int main(int argc, char *argv[])
 	for (i = 0; i < user_param.flows; i++)
 		print_spec(flow_rules[i], &user_param);
 
-	/* Create (if necessary) the rdma_cm ids and channel. */
-	if (user_param.work_rdma_cm == ON) {
-
-		if (create_rdma_resources(&ctx, &user_param)) {
-			fprintf(stderr," Unable to create the rdma_resources\n");
-			return FAILURE;
-		}
-
-		if (user_param.machine == CLIENT) {
-
-			/* Connects the client to a QP on the other machine with rdma_cm */
-			if (rdma_client_connect(&ctx, &user_param)) {
-				fprintf(stderr,"Unable to perform rdma_client function\n");
-				return FAILURE;
-			}
-
-		} else if (rdma_server_connect(&ctx, &user_param)) {
-			/* Assigning a server to listen on rdma_cm port and connect to it. */
-			fprintf(stderr,"Unable to perform rdma_server function\n");
-			return FAILURE;
-		}
-
-	} else {
-
-		/* initalize IB resources (data buffer, PD, MR, CQ and events channel) */
-		if (ctx_init(&ctx, &user_param)) {
-			fprintf(stderr, " Couldn't create IB resources\n");
-			return FAILURE;
-		}
+	/* initalize IB resources (data buffer, PD, MR, CQ and events channel) */
+	if (ctx_init(&ctx, &user_param)) {
+		fprintf(stderr, " Couldn't create IB resources\n");
+		return FAILURE;
 	}
 
 
@@ -209,8 +185,8 @@ int main(int argc, char *argv[])
 		}
 	}
 
-	#ifdef HAVE_RAW_ETH_EXP
 	if (user_param.use_promiscuous) {
+		#ifdef HAVE_RAW_ETH_EXP
 		struct ibv_exp_flow_attr attr = {
 			.type = IBV_EXP_FLOW_ATTR_ALL_DEFAULT,
 			.num_of_specs = 0,
@@ -220,13 +196,25 @@ int main(int argc, char *argv[])
 
 		if ((flow_promisc = ibv_exp_create_flow(ctx.qp[0], &attr)) == NULL) {
 			perror("error");
-			fprintf(stderr, "Couldn't attach promiscous rule QP\n");
+			fprintf(stderr, "Couldn't attach promiscuous rule QP\n");
+		}
+		#else
+		struct ibv_flow_attr attr = {
+			.type = IBV_FLOW_ATTR_ALL_DEFAULT,
+			.num_of_specs = 0,
+			.port = user_param.ib_port,
+			.flags = 0
+		};
+
+		if ((flow_promisc = ibv_create_flow(ctx.qp[0], &attr)) == NULL) {
+			perror("error");
+			fprintf(stderr, "Couldn't attach promiscuous rule QP\n");
 		}
+		#endif
 	}
-	#endif
 
 	/* build ONE Raw Ethernet packets on ctx buffer */
-	create_raw_eth_pkt(&user_param,&ctx, &my_dest_info , &rem_dest_info);
+	create_raw_eth_pkt(&user_param, &ctx, (void*)ctx.buf[0], &my_dest_info , &rem_dest_info);
 
 	if (user_param.output == FULL_VERBOSITY) {
 		printf(RESULT_LINE);
@@ -235,42 +223,47 @@ int main(int argc, char *argv[])
 	}
 
 	/* modify QPs to rtr/rts */
-	if (user_param.work_rdma_cm == OFF) {
-		if (ctx_connect(&ctx, NULL, &user_param, NULL)) {
-			fprintf(stderr," Unable to Connect the HCA's through the link\n");
-			DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-			return 1;
-		}
+	if (ctx_connect(&ctx, NULL, &user_param, NULL)) {
+		fprintf(stderr," Unable to Connect the HCA's through the link\n");
+		DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
+		return FAILURE;
 	}
 
 	ctx_set_send_wqes(&ctx,&user_param,NULL);
 
 	if (ctx_set_recv_wqes(&ctx,&user_param)) {
 		fprintf(stderr," Failed to post receive recv_wqes\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* latency test function for SEND verb latency test. */
-	if (run_iter_lat_send(&ctx, &user_param)) {
-		return 17;
+	if (user_param.machine == CLIENT) {
+		if (run_iter_lat_burst(&ctx, &user_param))
+			return FAILURE;
+	}
+	else {
+		if (run_iter_lat_burst_server(&ctx, &user_param))
+			return FAILURE;
 	}
 
 	/* print report (like print_report_bw) in the correct format
 	 * (as set before: FMT_LAT or FMT_LAT_DUR)
 	 */
-	user_param.test_type == ITERATIONS ? print_report_lat(&user_param) :
-		print_report_lat_duration(&user_param);
+	if (user_param.machine == CLIENT)
+		print_report_lat(&user_param);
 
 	/* destory promisc flow */
-	#ifdef HAVE_RAW_ETH_EXP
 	if (user_param.use_promiscuous) {
+		#ifdef HAVE_RAW_ETH_EXP
 		if (ibv_exp_destroy_flow(flow_promisc)) {
+		#else
+		if (ibv_destroy_flow(flow_promisc)) {
+		#endif
 			perror("error");
 			fprintf(stderr, "Couldn't Destory promisc flow\n");
 			return FAILURE;
 		}
 	}
-	#endif
 
 	/* destroy flow */
 	for (i = 0; i < user_param.flows; i++) {
@@ -291,13 +284,12 @@ int main(int argc, char *argv[])
 	if (destroy_ctx(&ctx, &user_param)) {
 		fprintf(stderr,"Failed to destroy_ctx\n");
 		DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY)
 		printf(RESULT_LINE);
 
 	DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-	return 0;
-
+	return SUCCESS;
 }
diff --git a/src/raw_ethernet_send_bw.c b/src/raw_ethernet_send_bw.c
index 30bd171..b65a5ef 100755
--- a/src/raw_ethernet_send_bw.c
+++ b/src/raw_ethernet_send_bw.c
@@ -62,26 +62,32 @@ int main(int argc, char *argv[])
 {
 	struct ibv_device		*ib_dev = NULL;
 	struct pingpong_context		ctx;
-	struct raw_ethernet_info	my_dest_info,rem_dest_info;
+	struct raw_ethernet_info	*my_dest_info = NULL;
+	struct raw_ethernet_info	*rem_dest_info = NULL;
 	int				ret_parser;
 	struct perftest_parameters	user_param;
 
 	#ifdef HAVE_RAW_ETH_EXP
 	struct ibv_exp_flow		**flow_create_result;
 	struct ibv_exp_flow_attr	**flow_rules;
-	struct ibv_exp_flow 		*flow_promisc = NULL ;
+	struct ibv_exp_flow 		**flow_promisc = NULL ;
+	#ifdef HAVE_SNIFFER_EXP
+	struct ibv_exp_flow 		**flow_sniffer = NULL;
+	#endif
 	#else
 	struct ibv_flow			**flow_create_result;
 	struct ibv_flow_attr		**flow_rules;
+	struct ibv_flow 		**flow_promisc = NULL ;
+	#ifdef HAVE_SNIFFER
+	struct ibv_flow 		**flow_sniffer = NULL;
+	#endif
 	#endif
-	int 				i;
+	int 				flow_index, qp_index;
 	union ibv_gid mgid;
 
 	/* init default values to user's parameters */
 	memset(&ctx, 0, sizeof(struct pingpong_context));
 	memset(&user_param, 0 , sizeof(struct perftest_parameters));
-	memset(&my_dest_info, 0 , sizeof(struct raw_ethernet_info));
-	memset(&rem_dest_info, 0 , sizeof(struct raw_ethernet_info));
 
 	user_param.verb    = SEND;
 	user_param.tst     = BW;
@@ -95,15 +101,29 @@ int main(int argc, char *argv[])
 			fprintf(stderr, " Parser function exited with Error\n");
 		}
 		DEBUG_LOG(TRACE,"<<<<<<%s", __FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 
+	/* Allocate user input dependable structs */
+	ALLOCATE(my_dest_info, struct raw_ethernet_info, user_param.num_of_qps);
+	memset(my_dest_info, 0, sizeof(struct raw_ethernet_info) * user_param.num_of_qps);
+	ALLOCATE(rem_dest_info, struct raw_ethernet_info, user_param.num_of_qps);
+	memset(rem_dest_info, 0, sizeof(struct raw_ethernet_info) * user_param.num_of_qps);
+
 	#ifdef HAVE_RAW_ETH_EXP
-        ALLOCATE(flow_create_result, struct ibv_exp_flow*, user_param.flows);
-        ALLOCATE(flow_rules, struct ibv_exp_flow_attr*, user_param.flows);
-        #else
-        ALLOCATE(flow_create_result, struct ibv_flow*, user_param.flows);
-        ALLOCATE(flow_rules, struct ibv_flow_attr*, user_param.flows);
+        ALLOCATE(flow_create_result, struct ibv_exp_flow*, user_param.flows * user_param.num_of_qps);
+        ALLOCATE(flow_rules, struct ibv_exp_flow_attr*, user_param.flows * user_param.num_of_qps);
+	#ifdef HAVE_SNIFFER_EXP
+	ALLOCATE(flow_sniffer, struct ibv_exp_flow*, user_param.num_of_qps);
+	#endif
+	ALLOCATE(flow_promisc, struct ibv_exp_flow*, user_param.num_of_qps);
+	#else
+        ALLOCATE(flow_create_result, struct ibv_flow*, user_param.flows * user_param.num_of_qps);
+        ALLOCATE(flow_rules, struct ibv_flow_attr*, user_param.flows * user_param.num_of_qps);
+	#ifdef HAVE_SNIFFER
+	ALLOCATE(flow_sniffer, struct ibv_flow*, user_param.num_of_qps);
+	#endif
+        ALLOCATE(flow_promisc, struct ibv_flow*, user_param.num_of_qps);
         #endif
 
 	if (user_param.raw_mcast) {
@@ -138,12 +158,12 @@ int main(int argc, char *argv[])
 	if (!ib_dev) {
 		fprintf(stderr," Unable to find the Infiniband/RoCE device\n");
 		DEBUG_LOG(TRACE, "<<<<<<%s", __FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 	GET_STRING(user_param.ib_devname, ibv_get_device_name(ib_dev));
 
 	if (check_flow_steering_support(user_param.ib_devname)) {
-		return 1;
+		return FAILURE;
 	}
 
 	/* Getting the relevant context from the device */
@@ -151,7 +171,7 @@ int main(int argc, char *argv[])
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
 		DEBUG_LOG(TRACE, "<<<<<<%s", __FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 
 	/* See if MTU and link type are valid and supported. */
@@ -165,72 +185,59 @@ int main(int argc, char *argv[])
 	alloc_ctx(&ctx, &user_param);
 
 	/* set mac address by user choose */
-	if (send_set_up_connection(flow_rules, &ctx, &user_param, &my_dest_info, &rem_dest_info)) {
-		fprintf(stderr, " Unable to set up socket connection\n");
-		return 1;
+	for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+		if (send_set_up_connection(&flow_rules[qp_index * user_param.flows],
+						&ctx, &user_param, &my_dest_info[qp_index], &rem_dest_info[qp_index])) {
+			fprintf(stderr, " Unable to set up socket connection\n");
+			return FAILURE;
+		}
 	}
 
 	/* Print basic test information. */
 	ctx_print_test_info(&user_param);
 
 	if ( !user_param.raw_mcast && (user_param.machine == SERVER || user_param.duplex)) {
-		for (i = 0; i < user_param.flows; i++)
-			print_spec(flow_rules[i], &user_param);
+		for (flow_index = 0; flow_index < user_param.flows; flow_index++)
+			print_spec(flow_rules[flow_index], &user_param);
 	}
 
-	/* Create (if necessary) the rdma_cm ids and channel. */
-	if (user_param.work_rdma_cm == ON) {
-
-		if (create_rdma_resources(&ctx, &user_param)) {
-			fprintf(stderr, " Unable to create the rdma_resources\n");
-			return FAILURE;
-		}
-
-		if (user_param.machine == CLIENT) {
-			if (rdma_client_connect(&ctx, &user_param)) {
-				fprintf(stderr, "Unable to perform rdma_client function\n");
-				return FAILURE;
-			}
-
-		} else if (rdma_server_connect(&ctx, &user_param)) {
-			fprintf(stderr, "Unable to perform rdma_client function\n");
-			return FAILURE;
-		}
-
-	} else {
-
-		/* create all the basic IB resources (data buffer, PD, MR, CQ and events channel) */
-		if (ctx_init(&ctx, &user_param)) {
-			fprintf(stderr, " Couldn't create IB resources\n");
-			return FAILURE;
-		}
+	/* create all the basic IB resources (data buffer, PD, MR, CQ and events channel) */
+	if (ctx_init(&ctx, &user_param)) {
+		fprintf(stderr, " Couldn't create IB resources\n");
+		return FAILURE;
 	}
 
 	/* build raw Ethernet packets on ctx buffer */
-	if((user_param.machine == CLIENT || user_param.duplex) && !user_param.mac_fwd) {
-		create_raw_eth_pkt(&user_param, &ctx, &my_dest_info, &rem_dest_info);
+	if ((user_param.machine == CLIENT || user_param.duplex) && !user_param.mac_fwd) {
+		for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+			create_raw_eth_pkt(&user_param, &ctx, (void*)ctx.buf[qp_index], &my_dest_info[qp_index], &rem_dest_info[qp_index]);
+		}
 	}
 
 	/* create flow rules for servers/duplex clients ,  that not test raw_mcast */
-	if ( !user_param.raw_mcast && (user_param.machine == SERVER || user_param.duplex)) {
+	if (!user_param.raw_mcast && (user_param.machine == SERVER || user_param.duplex)) {
 
 		/* attaching the qp to the spec */
-		for (i = 0; i < user_param.flows; i++) {
-			#ifdef HAVE_RAW_ETH_EXP
-			flow_create_result[i] = ibv_exp_create_flow(ctx.qp[0], flow_rules[i]);
-			#else
-			flow_create_result[i] = ibv_create_flow(ctx.qp[0], flow_rules[i]);
-			#endif
-
-			if (!flow_create_result[i]){
-				perror("error");
-				fprintf(stderr, "Couldn't attach QP\n");
-				return FAILURE;
+		for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+			for (flow_index = 0; flow_index < user_param.flows; flow_index++) {
+				#ifdef HAVE_RAW_ETH_EXP
+				flow_create_result[flow_index + qp_index * user_param.flows] =
+					ibv_exp_create_flow(ctx.qp[qp_index], flow_rules[flow_index]);
+				#else
+				flow_create_result[flow_index + qp_index * user_param.flows] =
+					ibv_create_flow(ctx.qp[qp_index], flow_rules[(qp_index * user_param.flows) + flow_index]);
+				#endif
+
+				if (!flow_create_result[flow_index + qp_index * user_param.flows]){
+					perror("error");
+					fprintf(stderr, "Couldn't attach QP\n");
+					return FAILURE;
+				}
 			}
 		}
 
-		#ifdef HAVE_RAW_ETH_EXP
 		if (user_param.use_promiscuous) {
+			#ifdef HAVE_RAW_ETH_EXP
 			struct ibv_exp_flow_attr attr = {
 				.type = IBV_EXP_FLOW_ATTR_ALL_DEFAULT,
 				.num_of_specs = 0,
@@ -238,35 +245,82 @@ int main(int argc, char *argv[])
 				.flags = 0
 			};
 
-			if ((flow_promisc = ibv_exp_create_flow(ctx.qp[0], &attr)) == NULL) {
-				perror("error");
-				fprintf(stderr, "Couldn't attach promiscous rule QP\n");
+			for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+				if ((flow_promisc[qp_index] = ibv_exp_create_flow(ctx.qp[qp_index], &attr)) == NULL) {
+					perror("error");
+					fprintf(stderr, "Couldn't attach promiscuous rule QP\n");
+				}
+			}
+			#else
+			struct ibv_flow_attr attr = {
+				.type = IBV_FLOW_ATTR_ALL_DEFAULT,
+				.num_of_specs = 0,
+				.port = user_param.ib_port,
+				.flags = 0
+			};
+
+			for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+				if ((flow_promisc[qp_index] = ibv_create_flow(ctx.qp[qp_index], &attr)) == NULL) {
+					perror("error");
+					fprintf(stderr, "Couldn't attach promiscuous rule QP\n");
+				}
+			}
+			#endif
+		}
+		#if defined HAVE_SNIFFER || defined HAVE_SNIFFER_EXP
+		if (user_param.use_sniffer) {
+			#ifdef HAVE_RAW_ETH_EXP
+			struct ibv_exp_flow_attr attr = {
+				.type = IBV_EXP_FLOW_ATTR_SNIFFER,
+				.num_of_specs = 0,
+				.port = user_param.ib_port,
+				.flags = 0
+			};
+			#else
+			struct ibv_flow_attr attr = {
+				.type = IBV_FLOW_ATTR_SNIFFER,
+				.num_of_specs = 0,
+				.port = user_param.ib_port,
+				.flags = 0
+			};
+			#endif
+
+			for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+				#ifdef HAVE_RAW_ETH_EXP
+				if ((flow_sniffer[qp_index] = ibv_exp_create_flow(ctx.qp[qp_index], &attr)) == NULL) {
+				#else
+				if ((flow_sniffer[qp_index] = ibv_create_flow(ctx.qp[qp_index], &attr)) == NULL) {
+				#endif
+					perror("error");
+					fprintf(stderr, "Couldn't attach SNIFFER rule QP\n");
+				}
 			}
 		}
-		#endif
+		#endif /* HAVE_SNIFFER */
 	}
+
 	/* Prepare IB resources for rtr/rts. */
-	if (user_param.work_rdma_cm == OFF) {
-		if (ctx_connect(&ctx, NULL, &user_param, NULL)) {
-			fprintf(stderr, " Unable to Connect the HCA's through the link\n");
-			DEBUG_LOG(TRACE, "<<<<<<%s", __FUNCTION__);
-			return 1;
-		}
+	if (ctx_connect(&ctx, NULL, &user_param, NULL)) {
+		fprintf(stderr, " Unable to Connect the HCA's through the link\n");
+		DEBUG_LOG(TRACE, "<<<<<<%s", __FUNCTION__);
+		return FAILURE;
 	}
 
 	if (user_param.raw_mcast) {
 		if (user_param.machine == SERVER) {
 			/* join Multicast group by MGID */
-			ibv_attach_mcast(ctx.qp[0], &mgid, 0);
-			printf(PERF_RAW_MGID_FMT, "MGID",
-					mgid.raw[0], mgid.raw[1],
-					mgid.raw[2], mgid.raw[3],
-					mgid.raw[4], mgid.raw[5],
-					mgid.raw[6], mgid.raw[7],
-					mgid.raw[8], mgid.raw[9],
-					mgid.raw[10],mgid.raw[11],
-					mgid.raw[12],mgid.raw[13],
-					mgid.raw[14],mgid.raw[15]);
+			for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+				ibv_attach_mcast(ctx.qp[qp_index], &mgid, 0);
+				printf(PERF_RAW_MGID_FMT, "MGID",
+						mgid.raw[0], mgid.raw[1],
+						mgid.raw[2], mgid.raw[3],
+						mgid.raw[4], mgid.raw[5],
+						mgid.raw[6], mgid.raw[7],
+						mgid.raw[8], mgid.raw[9],
+						mgid.raw[10],mgid.raw[11],
+						mgid.raw[12],mgid.raw[13],
+						mgid.raw[14],mgid.raw[15]);
+			}
 		}
 	}
 
@@ -288,7 +342,7 @@ int main(int argc, char *argv[])
 			if (ctx_set_recv_wqes(&ctx, &user_param)) {
 				fprintf(stderr," Failed to post receive recv_wqes\n");
 				DEBUG_LOG(TRACE, "<<<<<<%s", __FUNCTION__);
-				return 1;
+				return FAILURE;
 			}
 		}
 
@@ -317,7 +371,7 @@ int main(int argc, char *argv[])
 
 			if(run_iter_bw_server(&ctx, &user_param)) {
 				DEBUG_LOG(TRACE, "<<<<<<%s", __FUNCTION__);
-				return 17;
+				return FAILURE;
 			}
 		}
 
@@ -331,7 +385,7 @@ int main(int argc, char *argv[])
 
 			if (ctx_set_recv_wqes(&ctx, &user_param)) {
 				fprintf(stderr, "Failed to post receive recv_wqes\n");
-				return 1;
+				return FAILURE;
 			}
 		}
 
@@ -339,39 +393,73 @@ int main(int argc, char *argv[])
 
 			if(run_iter_bw_infinitely(&ctx, &user_param)) {
 				fprintf(stderr, " Error occured while running infinitely! aborting ...\n");
-				return 1;
+				return FAILURE;
 			}
 
 		} else if (user_param.machine == SERVER) {
 
 			if(run_iter_bw_infinitely_server(&ctx, &user_param)) {
 				fprintf(stderr, " Error occured while running infinitely on server! aborting ...\n");
-				return 1;
+				return FAILURE;
 			}
 		}
 	}
+
 	if(user_param.machine == SERVER || user_param.duplex) {
-		/* destroy flow */
-		for (i = 0; i < user_param.flows; i++) {
-			#ifdef HAVE_RAW_ETH_EXP
-			if (ibv_exp_destroy_flow(flow_create_result[i])) {
-			#else
-			if (ibv_destroy_flow(flow_create_result[i])) {
-			#endif
-				perror("error");
-				fprintf(stderr, "Couldn't Destory flow\n");
-				return FAILURE;
+		/* destroy open flows */
+		for (flow_index = 0; flow_index < user_param.flows; flow_index++) {
+			for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+				#ifdef HAVE_RAW_ETH_EXP
+				if (ibv_exp_destroy_flow(flow_create_result[flow_index + qp_index * user_param.flows])) {
+				#else
+				if (ibv_destroy_flow(flow_create_result[flow_index + qp_index * user_param.flows])) {
+				#endif
+					perror("error");
+					fprintf(stderr, "Couldn't Destory flow\n");
+					return FAILURE;
+				}
 			}
+		}
+		free(flow_rules);
 
-			free(flow_rules[i]);
+		if (user_param.use_promiscuous) {
+			for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+				#ifdef HAVE_RAW_ETH_EXP
+				if (ibv_exp_destroy_flow(flow_promisc[qp_index])) {
+				#else
+				if (ibv_destroy_flow(flow_promisc[qp_index])) {
+				#endif
+					perror("error");
+					fprintf(stderr, "Couldn't Destory flow\n");
+					return FAILURE;
+				}
+			}
+			free(flow_promisc);
 		}
-	}
-	if(user_param.machine == SERVER || user_param.duplex) {
+
+		#if defined HAVE_SNIFFER || defined HAVE_SNIFFER_EXP
+		if (user_param.use_sniffer) {
+			for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+				#ifdef HAVE_RAW_ETH_EXP
+				if (ibv_exp_destroy_flow(flow_sniffer[qp_index])) {
+				#else
+				if (ibv_destroy_flow(flow_sniffer[qp_index])) {
+				#endif
+					perror("error");
+					fprintf(stderr, "Couldn't Destory sniffer flow\n");
+					return FAILURE;
+				}
+			}
+			free(flow_sniffer);
+		}
+		#endif
 
 		if (user_param.raw_mcast) {
-			if (ibv_detach_mcast(ctx.qp[0], &mgid, 0)) {
-				perror("error");
-				fprintf(stderr, "Couldn't leave multicast group\n");
+			for (qp_index = 0; qp_index < user_param.num_of_qps; qp_index++) {
+				if (ibv_detach_mcast(ctx.qp[qp_index], &mgid, 0)) {
+					perror("error");
+					fprintf(stderr, "Couldn't leave multicast group\n");
+				}
 			}
 		}
 	}
@@ -379,18 +467,21 @@ int main(int argc, char *argv[])
 	if (destroy_ctx(&ctx, &user_param)) {
 		fprintf(stderr, "Failed to destroy_ctx\n");
 		DEBUG_LOG(TRACE, "<<<<<<%s", __FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 
+	free(my_dest_info);
+	free(rem_dest_info);
+
 	/* limit verifier */
 	if (!user_param.is_bw_limit_passed && (user_param.is_limit_bw == ON ) ) {
 		fprintf(stderr, "Error: BW result is below bw limit\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY)
 		printf(RESULT_LINE);
 
 	DEBUG_LOG(TRACE, "<<<<<<%s", __FUNCTION__);
-	return 0;
+	return SUCCESS;
 }
diff --git a/src/raw_ethernet_send_lat.c b/src/raw_ethernet_send_lat.c
index 4663714..9871671 100755
--- a/src/raw_ethernet_send_lat.c
+++ b/src/raw_ethernet_send_lat.c
@@ -72,6 +72,7 @@ int main(int argc, char *argv[])
 	#else
 	struct ibv_flow			**flow_create_result;
 	struct ibv_flow_attr		**flow_rules;
+	struct ibv_flow 		*flow_promisc = NULL;
 	#endif
 	struct report_options		report;
 	int				i;
@@ -101,7 +102,7 @@ int main(int argc, char *argv[])
 		if (ret_parser != VERSION_EXIT && ret_parser != HELP_EXIT)
 			fprintf(stderr," Parser function exited with Error\n");
 		DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 	#ifdef HAVE_RAW_ETH_EXP
 	ALLOCATE(flow_create_result, struct ibv_exp_flow*, user_param.flows);
@@ -122,12 +123,12 @@ int main(int argc, char *argv[])
 	if (!ib_dev) {
 		fprintf(stderr," Unable to find the Infiniband/RoCE device\n");
 		DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 	GET_STRING(user_param.ib_devname, ibv_get_device_name(ib_dev));
 
 	if (check_flow_steering_support(user_param.ib_devname)) {
-		return 1;
+		return FAILURE;
 	}
 
 	/* Getting the relevant context from the device */
@@ -135,7 +136,7 @@ int main(int argc, char *argv[])
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
 		DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 
 	/* See if MTU and link type are valid and supported. */
@@ -153,7 +154,7 @@ int main(int argc, char *argv[])
 	 */
 	if (send_set_up_connection(flow_rules, &ctx, &user_param, &my_dest_info, &rem_dest_info)) {
 		fprintf(stderr," Unable to set up socket connection\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* Print basic test information. */
@@ -162,38 +163,12 @@ int main(int argc, char *argv[])
 	for (i = 0; i < user_param.flows; i++)
 		print_spec(flow_rules[i], &user_param);
 
-	/* Create (if necessary) the rdma_cm ids and channel. */
-	if (user_param.work_rdma_cm == ON) {
-
-		if (create_rdma_resources(&ctx, &user_param)) {
-			fprintf(stderr," Unable to create the rdma_resources\n");
-			return FAILURE;
-		}
-
-		if (user_param.machine == CLIENT) {
-
-			/* Connects the client to a QP on the other machine with rdma_cm */
-			if (rdma_client_connect(&ctx, &user_param)) {
-				fprintf(stderr,"Unable to perform rdma_client function\n");
-				return FAILURE;
-			}
-
-		} else if (rdma_server_connect(&ctx, &user_param)) {
-			/* Assigning a server to listen on rdma_cm port and connect to it. */
-			fprintf(stderr,"Unable to perform rdma_server function\n");
-			return FAILURE;
-		}
-
-	} else {
-
-		/* initalize IB resources (data buffer, PD, MR, CQ and events channel) */
-		if (ctx_init(&ctx, &user_param)) {
-			fprintf(stderr, " Couldn't create IB resources\n");
-			return FAILURE;
-		}
+	/* initalize IB resources (data buffer, PD, MR, CQ and events channel) */
+	if (ctx_init(&ctx, &user_param)) {
+		fprintf(stderr, " Couldn't create IB resources\n");
+		return FAILURE;
 	}
 
-
 	/* attaching the qp to the spec */
 	for (i = 0; i < user_param.flows; i++) {
 		#ifdef HAVE_RAW_ETH_EXP
@@ -209,8 +184,8 @@ int main(int argc, char *argv[])
 		}
 	}
 
-	#ifdef HAVE_RAW_ETH_EXP
 	if (user_param.use_promiscuous) {
+		#ifdef HAVE_RAW_ETH_EXP
 		struct ibv_exp_flow_attr attr = {
 			.type = IBV_EXP_FLOW_ATTR_ALL_DEFAULT,
 			.num_of_specs = 0,
@@ -220,13 +195,25 @@ int main(int argc, char *argv[])
 
 		if ((flow_promisc = ibv_exp_create_flow(ctx.qp[0], &attr)) == NULL) {
 			perror("error");
-			fprintf(stderr, "Couldn't attach promiscous rule QP\n");
+			fprintf(stderr, "Couldn't attach promiscuous rule QP\n");
+		}
+		#else
+		struct ibv_flow_attr attr = {
+			.type = IBV_FLOW_ATTR_ALL_DEFAULT,
+			.num_of_specs = 0,
+			.port = user_param.ib_port,
+			.flags = 0
+		};
+
+		if ((flow_promisc = ibv_create_flow(ctx.qp[0], &attr)) == NULL) {
+			perror("error");
+			fprintf(stderr, "Couldn't attach promiscuous rule QP\n");
 		}
+		#endif
 	}
-	#endif
 
 	/* build ONE Raw Ethernet packets on ctx buffer */
-	create_raw_eth_pkt(&user_param,&ctx, &my_dest_info , &rem_dest_info);
+	create_raw_eth_pkt(&user_param, &ctx, ctx.buf[0], &my_dest_info , &rem_dest_info);
 
 	if (user_param.output == FULL_VERBOSITY) {
 		printf(RESULT_LINE);
@@ -235,24 +222,23 @@ int main(int argc, char *argv[])
 	}
 
 	/* modify QPs to rtr/rts */
-	if (user_param.work_rdma_cm == OFF) {
-		if (ctx_connect(&ctx, NULL, &user_param, NULL)) {
-			fprintf(stderr," Unable to Connect the HCA's through the link\n");
-			DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-			return 1;
-		}
+	if (ctx_connect(&ctx, NULL, &user_param, NULL)) {
+		fprintf(stderr," Unable to Connect the HCA's through the link\n");
+		DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
+		return FAILURE;
 	}
 
+
 	ctx_set_send_wqes(&ctx,&user_param,NULL);
 
 	if (ctx_set_recv_wqes(&ctx,&user_param)) {
 		fprintf(stderr," Failed to post receive recv_wqes\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* latency test function for SEND verb latency test. */
 	if (run_iter_lat_send(&ctx, &user_param)) {
-		return 17;
+		return FAILURE;
 	}
 
 	/* print report (like print_report_bw) in the correct format
@@ -262,15 +248,17 @@ int main(int argc, char *argv[])
 		print_report_lat_duration(&user_param);
 
 	/* destory promisc flow */
-	#ifdef HAVE_RAW_ETH_EXP
 	if (user_param.use_promiscuous) {
+		#ifdef HAVE_RAW_ETH_EXP
 		if (ibv_exp_destroy_flow(flow_promisc)) {
+		#else
+		if (ibv_destroy_flow(flow_promisc)) {
+		#endif
 			perror("error");
 			fprintf(stderr, "Couldn't Destory promisc flow\n");
 			return FAILURE;
 		}
 	}
-	#endif
 
 	/* destroy flow */
 	for (i = 0; i < user_param.flows; i++) {
@@ -291,13 +279,12 @@ int main(int argc, char *argv[])
 	if (destroy_ctx(&ctx, &user_param)) {
 		fprintf(stderr,"Failed to destroy_ctx\n");
 		DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY)
 		printf(RESULT_LINE);
 
 	DEBUG_LOG(TRACE,"<<<<<<%s",__FUNCTION__);
-	return 0;
-
+	return SUCCESS;
 }
diff --git a/src/read_bw.c b/src/read_bw.c
index 47afcdb..c5bff56 100755
--- a/src/read_bw.c
+++ b/src/read_bw.c
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
 	if (ret_parser) {
 		if (ret_parser != VERSION_EXIT && ret_parser != HELP_EXIT)
 			fprintf(stderr," Parser function exited with Error\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if((user_param.connection_type == DC || user_param.use_xrc) && user_param.duplex) {
@@ -84,7 +84,7 @@ int main(int argc, char *argv[])
 	ctx.context = ibv_open_device(ib_dev);
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* See if MTU and link type are valid and supported. */
@@ -96,7 +96,7 @@ int main(int argc, char *argv[])
 	/* copy the relevant user parameters to the comm struct + creating rdma_cm resources. */
 	if (create_comm_struct(&user_comm,&user_param)) {
 		fprintf(stderr," Unable to create RDMA_CM resources\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY && user_param.machine == SERVER) {
@@ -177,7 +177,7 @@ int main(int argc, char *argv[])
 		/* shaking hands and gather the other side info. */
 		if (ctx_hand_shake(&user_comm,&my_dest[i],&rem_dest[i])) {
 			fprintf(stderr,"Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 		ctx_print_pingpong_data(&rem_dest[i],&user_comm);
 	}
@@ -186,7 +186,7 @@ int main(int argc, char *argv[])
 		if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0])) {
 			fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
 			fprintf(stderr," Please Try to use a different IP version.\n\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -194,14 +194,14 @@ int main(int argc, char *argv[])
 
 		if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
 			fprintf(stderr," Unable to Connect the HCA's through the link\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	/* An additional handshake is required after moving qp to RTR. */
 	if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 		fprintf(stderr,"Failed to exchange data between server and clients\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY) {
@@ -229,7 +229,7 @@ int main(int argc, char *argv[])
 
 		if (ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0])) {
 			fprintf(stderr,"Failed to close connection between server and client\n");
-			return 1;
+			return FAILURE;
 		}
 		if (user_param.output == FULL_VERBOSITY) {
 			if (user_param.report_per_port)
@@ -241,7 +241,7 @@ int main(int argc, char *argv[])
 		if (user_param.work_rdma_cm == ON) {
 			if (destroy_ctx(&ctx,&user_param)) {
 				fprintf(stderr, "Failed to destroy resources\n");
-				return 1;
+				return FAILURE;
 			}
 			user_comm.rdma_params->work_rdma_cm = ON;
 			return destroy_ctx(user_comm.rdma_ctx,user_comm.rdma_params);
@@ -254,7 +254,7 @@ int main(int argc, char *argv[])
 	if (user_param.use_event) {
 		if (ibv_req_notify_cq(ctx.send_cq, 0)) {
 			fprintf(stderr, "Couldn't request CQ notification\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -265,15 +265,17 @@ int main(int argc, char *argv[])
 			user_param.size = (uint64_t)1 << i;
 			ctx_set_send_wqes(&ctx,&user_param,rem_dest);
 
-			if(perform_warm_up(&ctx,&user_param)) {
-				fprintf(stderr,"Problems with warm up\n");
-				return 1;
+			if (user_param.perform_warm_up) {
+				if(perform_warm_up(&ctx, &user_param)) {
+					fprintf(stderr, "Problems with warm up\n");
+					return FAILURE;
+				}
 			}
 
 			if(user_param.duplex) {
 				if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 					fprintf(stderr,"Failed to sync between server and client between different msg sizes\n");
-					return 1;
+					return FAILURE;
 				}
 			}
 
@@ -283,7 +285,7 @@ int main(int argc, char *argv[])
 			if (user_param.duplex && (atof(user_param.version) >= 4.6)) {
 				if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 					fprintf(stderr,"Failed to sync between server and client between different msg sizes\n");
-					return 1;
+					return FAILURE;
 				}
 			}
 
@@ -298,22 +300,23 @@ int main(int argc, char *argv[])
 	} else if (user_param.test_method == RUN_REGULAR) {
 
 		ctx_set_send_wqes(&ctx,&user_param,rem_dest);
-
-		if(perform_warm_up(&ctx,&user_param)) {
-			fprintf(stderr,"Problems with warm up\n");
-			return 1;
+		if (user_param.perform_warm_up) {
+			if(perform_warm_up(&ctx, &user_param)) {
+				fprintf(stderr, "Problems with warm up\n");
+				return FAILURE;
+			}
 		}
 
 		if(user_param.duplex) {
 			if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 				fprintf(stderr,"Failed to sync between server and client between different msg sizes\n");
-				return 1;
+				return FAILURE;
 			}
 		}
 
 		if(run_iter_bw(&ctx,&user_param)) {
 			fprintf(stderr," Failed to complete run_iter_bw function successfully\n");
-			return 1;
+			return FAILURE;
 		}
 
 		print_report_bw(&user_param,&my_bw_rep);
@@ -344,7 +347,7 @@ int main(int argc, char *argv[])
 
 		if(run_iter_bw_infinitely(&ctx,&user_param)) {
 			fprintf(stderr," Error occured while running! aborting ...\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -368,23 +371,23 @@ int main(int argc, char *argv[])
 
 	if (ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0])) {
 		fprintf(stderr,"Failed to close connection between server and client\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (!user_param.is_bw_limit_passed && (user_param.is_limit_bw == ON ) ) {
 		fprintf(stderr,"Error: BW result is below bw limit\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (!user_param.is_msgrate_limit_passed && (user_param.is_limit_bw == ON )) {
 		fprintf(stderr,"Error: Msg rate  is below msg_rate limit\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.work_rdma_cm == ON) {
 		if (destroy_ctx(&ctx,&user_param)) {
 			fprintf(stderr, "Failed to destroy resources\n");
-			return 1;
+			return FAILURE;
 		}
 		user_comm.rdma_params->work_rdma_cm = ON;
 		return destroy_ctx(user_comm.rdma_ctx,user_comm.rdma_params);
diff --git a/src/read_lat.c b/src/read_lat.c
index 247c70d..c27d8e2 100755
--- a/src/read_lat.c
+++ b/src/read_lat.c
@@ -95,7 +95,7 @@ int main(int argc, char *argv[])
 	ctx.context = ibv_open_device(ib_dev);
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* See if MTU and link type are valid and supported. */
@@ -107,7 +107,7 @@ int main(int argc, char *argv[])
 	/* copy the relevant user parameters to the comm struct + creating rdma_cm resources. */
 	if (create_comm_struct(&user_comm,&user_param)) {
 		fprintf(stderr," Unable to create RDMA_CM resources\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY && user_param.machine == SERVER) {
@@ -172,7 +172,7 @@ int main(int argc, char *argv[])
 	/* Set up the Connection. */
 	if (set_up_connection(&ctx,&user_param,my_dest)) {
 		fprintf(stderr," Unable to set up socket connection\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* Print basic test information. */
@@ -184,7 +184,7 @@ int main(int argc, char *argv[])
 	/*  shaking hands and gather the other side info. */
 	if (ctx_hand_shake(&user_comm,my_dest,rem_dest)) {
 		fprintf(stderr,"Failed to exchange data between server and clients\n");
-		return 1;
+		return FAILURE;
 	}
 
 	user_comm.rdma_params->side = REMOTE;
@@ -193,7 +193,7 @@ int main(int argc, char *argv[])
 		/* shaking hands and gather the other side info. */
 		if (ctx_hand_shake(&user_comm,&my_dest[i],&rem_dest[i])) {
 			fprintf(stderr,"Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 
 		ctx_print_pingpong_data(&rem_dest[i],&user_comm);
@@ -203,7 +203,7 @@ int main(int argc, char *argv[])
 		if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0])) {
 			fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
 			fprintf(stderr," Please Try to use a different IP version.\n\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -211,14 +211,14 @@ int main(int argc, char *argv[])
 
 		if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
 			fprintf(stderr," Unable to Connect the HCA's through the link\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	/* An additional handshake is required after moving qp to RTR. */
 	if (ctx_hand_shake(&user_comm,my_dest,rem_dest)) {
 		fprintf(stderr,"Failed to exchange data between server and clients\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* Only Client post read request. */
@@ -226,7 +226,7 @@ int main(int argc, char *argv[])
 
 		if (ctx_close_connection(&user_comm,my_dest,rem_dest)) {
 			fprintf(stderr,"Failed to close connection between server and client\n");
-			return 1;
+			return FAILURE;
 		}
 		if (user_param.output == FULL_VERBOSITY) {
 			printf(RESULT_LINE);
@@ -238,7 +238,7 @@ int main(int argc, char *argv[])
 	if (user_param.use_event) {
 		if (ibv_req_notify_cq(ctx.send_cq, 0)) {
 			fprintf(stderr, "Couldn't request CQ notification\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -267,7 +267,7 @@ int main(int argc, char *argv[])
 
 	if (ctx_close_connection(&user_comm,my_dest,rem_dest)) {
 		fprintf(stderr,"Failed to close connection between server and client\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY) {
diff --git a/src/send_bw.c b/src/send_bw.c
index b018aa1..4d8899b 100755
--- a/src/send_bw.c
+++ b/src/send_bw.c
@@ -53,15 +53,15 @@ static int set_mcast_group(struct pingpong_context *ctx,
 	struct ibv_port_attr port_attr;
 
 	if (ibv_query_gid(ctx->context,user_param->ib_port,user_param->gid_index,&mcg_params->port_gid)) {
-		return 1;
+		return FAILURE;
 	}
 
 	if (ibv_query_pkey(ctx->context,user_param->ib_port,DEF_PKEY_IDX,&mcg_params->pkey)) {
-		return 1;
+		return FAILURE;
 	}
 
 	if (ibv_query_port(ctx->context,user_param->ib_port,&port_attr)) {
-		return 1;
+		return FAILURE;
 	}
 	mcg_params->sm_lid  = port_attr.sm_lid;
 	mcg_params->sm_sl   = port_attr.sm_sl;
@@ -71,7 +71,7 @@ static int set_mcast_group(struct pingpong_context *ctx,
 		/* Request for Mcast group create registery in SM. */
 		if (join_multicast_group(SUBN_ADM_METHOD_SET,mcg_params)) {
 			fprintf(stderr,"Couldn't Register the Mcast group on the SM\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 	return 0;
@@ -98,13 +98,13 @@ static int send_set_up_connection(struct pingpong_context *ctx,
 		mcg_params->user_mgid = user_param->user_mgid;
 		set_multicast_gid(mcg_params,ctx->qp[0]->qp_num,(int)user_param->machine);
 		if (set_mcast_group(ctx,user_param,mcg_params)) {
-			return 1;
+			return FAILURE;
 		}
 
 		for (i=0; i < user_param->num_of_qps; i++) {
 			if (ibv_attach_mcast(ctx->qp[i],&mcg_params->mgid,mcg_params->mlid)) {
 				fprintf(stderr, "Couldn't attach QP to MultiCast group");
-				return 1;
+				return FAILURE;
 			}
 		}
 
@@ -178,7 +178,7 @@ int main(int argc, char *argv[])
 	if (ret_parser) {
 		if (ret_parser != VERSION_EXIT && ret_parser != HELP_EXIT)
 			fprintf(stderr," Parser function exited with Error\n");
-		return 1;
+		return FAILURE;
 	}
 	if((user_param.connection_type == DC || user_param.use_xrc) && user_param.duplex) {
 		user_param.num_of_qps *= 2;
@@ -194,7 +194,7 @@ int main(int argc, char *argv[])
 	ib_dev = ctx_find_dev(user_param.ib_devname);
 	if (!ib_dev) {
 		fprintf(stderr," Unable to find the Infiniband/RoCE device\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.use_mcg)
@@ -204,7 +204,7 @@ int main(int argc, char *argv[])
 	ctx.context = ibv_open_device(ib_dev);
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
-		return 1;
+		return FAILURE;
 	}
 
 
@@ -217,7 +217,7 @@ int main(int argc, char *argv[])
 	/* copy the relevant user parameters to the comm struct + creating rdma_cm resources. */
 	if (create_comm_struct(&user_comm,&user_param)) {
 		fprintf(stderr," Unable to create RDMA_CM resources\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY && user_param.machine == SERVER) {
@@ -242,9 +242,9 @@ int main(int argc, char *argv[])
 		return FAILURE;
 	}
 
-	ALLOCATE(my_dest , struct pingpong_dest , user_param.num_of_qps);
+	ALLOCATE(my_dest, struct pingpong_dest, user_param.num_of_qps);
 	memset(my_dest, 0, sizeof(struct pingpong_dest)*user_param.num_of_qps);
-	ALLOCATE(rem_dest , struct pingpong_dest , user_param.num_of_qps);
+	ALLOCATE(rem_dest, struct pingpong_dest, user_param.num_of_qps);
 	memset(rem_dest, 0, sizeof(struct pingpong_dest)*user_param.num_of_qps);
 
 	if (user_param.transport_type == IBV_TRANSPORT_IWARP)
@@ -285,7 +285,7 @@ int main(int argc, char *argv[])
 	/* Set up the Connection. */
 	if (send_set_up_connection(&ctx,&user_param,my_dest,&mcg_params,&user_comm)) {
 		fprintf(stderr," Unable to set up socket connection\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* Print basic test information. */
@@ -303,7 +303,7 @@ int main(int argc, char *argv[])
 		/* shaking hands and gather the other side info. */
 		if (ctx_hand_shake(&user_comm,&my_dest[i],&rem_dest[i])) {
 			fprintf(stderr,"Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 
 		ctx_print_pingpong_data(&rem_dest[i],&user_comm);
@@ -313,7 +313,7 @@ int main(int argc, char *argv[])
 		if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0])) {
 			fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
 			fprintf(stderr," Please Try to use a different IP version.\n\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -330,7 +330,7 @@ int main(int argc, char *argv[])
 		memcpy(mcg_params.mgid.raw, rem_dest[0].gid.raw, 16);
 		if (set_mcast_group(&ctx,&user_param,&mcg_params)) {
 			fprintf(stderr," Unable to Join Sender to Mcast gid\n");
-			return 1;
+			return FAILURE;
 		}
 		/*
 		 * The next stall in code (50 ms sleep) is a work around for fixing the
@@ -349,26 +349,26 @@ int main(int argc, char *argv[])
 		/* Prepare IB resources for rtr/rts. */
 		if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
 			fprintf(stderr," Unable to Connect the HCA's through the link\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	/* shaking hands and gather the other side info. */
 	if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 		fprintf(stderr,"Failed to exchange data between server and clients\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.use_event) {
 
 		if (ibv_req_notify_cq(ctx.send_cq, 0)) {
 			fprintf(stderr, " Couldn't request CQ notification\n");
-			return 1;
+			return FAILURE;
 		}
 
 		if (ibv_req_notify_cq(ctx.recv_cq, 0)) {
 			fprintf(stderr, " Couldn't request CQ notification\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -399,13 +399,13 @@ int main(int argc, char *argv[])
 			if (user_param.machine == SERVER || user_param.duplex) {
 				if (ctx_set_recv_wqes(&ctx,&user_param)) {
 					fprintf(stderr," Failed to post receive recv_wqes\n");
-					return 1;
+					return FAILURE;
 				}
 			}
 
 			if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 				fprintf(stderr,"Failed to exchange data between server and clients\n");
-				return 1;
+				return FAILURE;
 			}
 
 			if (ctx.send_rcredit) {
@@ -439,7 +439,7 @@ int main(int argc, char *argv[])
 			}
 			if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 				fprintf(stderr,"Failed to exchange data between server and clients\n");
-				return 1;
+				return FAILURE;
 			}
 
 			/* Check if last iteration ended well in UC/UD */
@@ -456,13 +456,13 @@ int main(int argc, char *argv[])
 		if (user_param.machine == SERVER || user_param.duplex) {
 			if (ctx_set_recv_wqes(&ctx,&user_param)) {
 				fprintf(stderr," Failed to post receive recv_wqes\n");
-				return 1;
+				return FAILURE;
 			}
 		}
 
 		if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 			fprintf(stderr,"Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 
 		if (user_param.duplex) {
@@ -512,27 +512,27 @@ int main(int argc, char *argv[])
 
 			if (ctx_set_recv_wqes(&ctx,&user_param)) {
 				fprintf(stderr," Failed to post receive recv_wqes\n");
-				return 1;
+				return FAILURE;
 			}
 		}
 
 		if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 			fprintf(stderr,"Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 
 		if (user_param.machine == CLIENT) {
 
 			if(run_iter_bw_infinitely(&ctx,&user_param)) {
 				fprintf(stderr," Error occured while running infinitely! aborting ...\n");
-				return 1;
+				return FAILURE;
 			}
 
 		} else if (user_param.machine == SERVER) {
 
 			if(run_iter_bw_infinitely_server(&ctx,&user_param)) {
 				fprintf(stderr," Error occured while running infinitely on server! aborting ...\n");
-				return 1;
+				return FAILURE;
 			}
 		}
 	}
@@ -558,18 +558,18 @@ int main(int argc, char *argv[])
 		user_comm.rdma_params->work_rdma_cm = ON;
 		if (destroy_ctx(user_comm.rdma_ctx,user_comm.rdma_params)) {
 			fprintf(stderr,"Failed to destroy resources\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	if (!user_param.is_bw_limit_passed && (user_param.is_limit_bw == ON ) ) {
 		fprintf(stderr,"Error: BW result is below bw limit\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (!user_param.is_msgrate_limit_passed && (user_param.is_limit_bw == ON )) {
 		fprintf(stderr,"Error: Msg rate  is below msg_rate limit\n");
-		return 1;
+		return FAILURE;
 	}
 
 	return 0;
diff --git a/src/send_lat.c b/src/send_lat.c
index 282cf11..eb6b48d 100755
--- a/src/send_lat.c
+++ b/src/send_lat.c
@@ -61,15 +61,15 @@ static int set_mcast_group(struct pingpong_context *ctx,
 	struct ibv_port_attr port_attr;
 
 	if (ibv_query_gid(ctx->context,user_param->ib_port,user_param->gid_index,&mcg_params->port_gid)) {
-		return 1;
+		return FAILURE;
 	}
 
 	if (ibv_query_pkey(ctx->context,user_param->ib_port,DEF_PKEY_IDX,&mcg_params->pkey)) {
-		return 1;
+		return FAILURE;
 	}
 
 	if (ibv_query_port(ctx->context,user_param->ib_port,&port_attr)) {
-		return 1;
+		return FAILURE;
 	}
 	mcg_params->sm_lid  = port_attr.sm_lid;
 	mcg_params->sm_sl   = port_attr.sm_sl;
@@ -81,7 +81,7 @@ static int set_mcast_group(struct pingpong_context *ctx,
 		/* Request for Mcast group create registery in SM. */
 		if (join_multicast_group(SUBN_ADM_METHOD_SET,mcg_params)) {
 			fprintf(stderr," Failed to Join Mcast request\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -89,7 +89,7 @@ static int set_mcast_group(struct pingpong_context *ctx,
 
 		if (ibv_attach_mcast(ctx->qp[i],&mcg_params->mgid,mcg_params->mlid)) {
 			fprintf(stderr, "Couldn't attach QP to MultiCast group");
-			return 1;
+			return FAILURE;
 		}
 	}
 	mcg_params->mcast_state |= MCAST_IS_ATTACHED;
@@ -118,13 +118,13 @@ static int send_set_up_connection(struct pingpong_context *ctx,
 		mcg_params->user_mgid = user_param->user_mgid;
 		set_multicast_gid(mcg_params,ctx->qp[0]->qp_num,(int)user_param->machine);
 		if (set_mcast_group(ctx,user_param,mcg_params)) {
-			return 1;
+			return FAILURE;
 		}
 
 		for (i=0; i < user_param->num_of_qps; i++) {
 			if (ibv_attach_mcast(ctx->qp[i],&mcg_params->mgid,mcg_params->mlid)) {
 				fprintf(stderr, "Couldn't attach QP to MultiCast group");
-				return 1;
+				return FAILURE;
 			}
 		}
 
@@ -205,7 +205,7 @@ int main(int argc, char *argv[])
 	if (ret_val) {
 		if (ret_val != VERSION_EXIT && ret_val != HELP_EXIT)
 			fprintf(stderr," Parser function exited with Error\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if(user_param.use_xrc || user_param.connection_type == DC) {
@@ -222,7 +222,7 @@ int main(int argc, char *argv[])
 	ib_dev = ctx_find_dev(user_param.ib_devname);
 	if (!ib_dev) {
 		fprintf(stderr," Unable to find the Infiniband/RoCE device\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.use_mcg)
@@ -232,7 +232,7 @@ int main(int argc, char *argv[])
 	ctx.context = ibv_open_device(ib_dev);
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* See if MTU and link type are valid and supported. */
@@ -244,7 +244,7 @@ int main(int argc, char *argv[])
 	/* copy the relevant user parameters to the comm struct + creating rdma_cm resources. */
 	if (create_comm_struct(&user_comm,&user_param)) {
 		fprintf(stderr," Unable to create RDMA_CM resources\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY && user_param.machine == SERVER) {
@@ -309,7 +309,7 @@ int main(int argc, char *argv[])
 	/* Set up the Connection. */
 	if (send_set_up_connection(&ctx,&user_param,my_dest,&mcg_params,&user_comm)) {
 		fprintf(stderr," Unable to set up socket connection\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* Print basic test information. */
@@ -324,7 +324,7 @@ int main(int argc, char *argv[])
 		/* shaking hands and gather the other side info. */
 		if (ctx_hand_shake(&user_comm,&my_dest[i],&rem_dest[i])) {
 			fprintf(stderr,"Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 
 		ctx_print_pingpong_data(&rem_dest[i],&user_comm);
@@ -334,7 +334,7 @@ int main(int argc, char *argv[])
 		if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0])) {
 			fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
 			fprintf(stderr," Please Try to use a different IP version.\n\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -348,7 +348,7 @@ int main(int argc, char *argv[])
 			/* Request for Mcast group create registery in SM. */
 			if (join_multicast_group(SUBN_ADM_METHOD_SET,&mcg_params)) {
 				fprintf(stderr," Failed to Join Mcast request\n");
-				return 1;
+				return FAILURE;
 			}
 		}
 
@@ -369,26 +369,26 @@ int main(int argc, char *argv[])
 		/* Prepare IB resources for rtr/rts. */
 		if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
 			fprintf(stderr," Unable to Connect the HCA's through the link\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	/* shaking hands and gather the other side info. */
 	if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 		fprintf(stderr,"Failed to exchange data between server and clients\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.use_event) {
 
 		if (ibv_req_notify_cq(ctx.send_cq, 0)) {
 			fprintf(stderr, "Couldn't request RCQ notification\n");
-			return 1;
+			return FAILURE;
 		}
 
 		if (ibv_req_notify_cq(ctx.recv_cq, 0)) {
 			fprintf(stderr, "Couldn't request RCQ notification\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 	if (user_param.output == FULL_VERBOSITY) {
@@ -411,7 +411,7 @@ int main(int argc, char *argv[])
 			/* Post receive recv_wqes fo current message size */
 			if (ctx_set_recv_wqes(&ctx,&user_param)) {
 				fprintf(stderr," Failed to post receive recv_wqes\n");
-				return 1;
+				return FAILURE;
 			}
 
 			/* Sync between the client and server so the client won't send packets
@@ -420,7 +420,7 @@ int main(int argc, char *argv[])
 
 			if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 				fprintf(stderr,"Failed to exchange data between server and clients\n");
-				return 1;
+				return FAILURE;
 			}
 
 			if(run_iter_lat_send(&ctx, &user_param))
@@ -434,7 +434,7 @@ int main(int argc, char *argv[])
 		/* Post recevie recv_wqes fo current message size */
 		if (ctx_set_recv_wqes(&ctx,&user_param)) {
 			fprintf(stderr," Failed to post receive recv_wqes\n");
-			return 1;
+			return FAILURE;
 		}
 
 		/* Sync between the client and server so the client won't send packets
@@ -443,7 +443,7 @@ int main(int argc, char *argv[])
 
 		if (ctx_hand_shake(&user_comm,my_dest,rem_dest)) {
 			fprintf(stderr,"Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 
 		if(run_iter_lat_send(&ctx, &user_param))
diff --git a/src/write_bw.c b/src/write_bw.c
index 63422a8..98f6f9b 100755
--- a/src/write_bw.c
+++ b/src/write_bw.c
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
 	if (ret_parser) {
 		if (ret_parser != VERSION_EXIT && ret_parser != HELP_EXIT)
 			fprintf(stderr," Parser function exited with Error\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if((user_param.connection_type == DC || user_param.use_xrc) && user_param.duplex) {
@@ -80,14 +80,14 @@ int main(int argc, char *argv[])
 	ib_dev = ctx_find_dev(user_param.ib_devname);
 	if (!ib_dev) {
 		fprintf(stderr," Unable to find the Infiniband/RoCE device\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* Getting the relevant context from the device */
 	ctx.context = ibv_open_device(ib_dev);
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* See if MTU and link type are valid and supported. */
@@ -99,7 +99,7 @@ int main(int argc, char *argv[])
 	/* copy the relevant user parameters to the comm struct + creating rdma_cm resources. */
 	if (create_comm_struct(&user_comm,&user_param)) {
 		fprintf(stderr," Unable to create RDMA_CM resources\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY && user_param.machine == SERVER) {
@@ -181,7 +181,7 @@ int main(int argc, char *argv[])
 
 		if (ctx_hand_shake(&user_comm,&my_dest[i],&rem_dest[i])) {
 			fprintf(stderr," Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 
 		ctx_print_pingpong_data(&rem_dest[i],&user_comm);
@@ -191,7 +191,7 @@ int main(int argc, char *argv[])
 		if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0])) {
 			fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
 			fprintf(stderr," Please Try to use a different IP version.\n\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -234,7 +234,7 @@ int main(int argc, char *argv[])
 
 		if (ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0])) {
 			fprintf(stderr,"Failed to close connection between server and client\n");
-			return 1;
+			return FAILURE;
 		}
 
 		if (user_param.output == FULL_VERBOSITY) {
@@ -247,7 +247,7 @@ int main(int argc, char *argv[])
 		if (user_param.work_rdma_cm == ON) {
 			if (destroy_ctx(&ctx,&user_param)) {
 				fprintf(stderr, "Failed to destroy resources\n");
-				return 1;
+				return FAILURE;
 			}
 			user_comm.rdma_params->work_rdma_cm = ON;
 			return destroy_ctx(user_comm.rdma_ctx,user_comm.rdma_params);
@@ -263,27 +263,29 @@ int main(int argc, char *argv[])
 			user_param.size = (uint64_t)1 << i;
 			ctx_set_send_wqes(&ctx,&user_param,rem_dest);
 
-			if(perform_warm_up(&ctx,&user_param)) {
-				fprintf(stderr,"Problems with warm up\n");
-				return 1;
+			if (user_param.perform_warm_up) {
+				if(perform_warm_up(&ctx, &user_param)) {
+					fprintf(stderr, "Problems with warm up\n");
+					return FAILURE;
+				}
 			}
 
 			if(user_param.duplex) {
 				if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 					fprintf(stderr,"Failed to sync between server and client between different msg sizes\n");
-					return 1;
+					return FAILURE;
 				}
 			}
 
 			if(run_iter_bw(&ctx,&user_param)) {
 				fprintf(stderr," Failed to complete run_iter_bw function successfully\n");
-				return 1;
+				return FAILURE;
 			}
 
 			if (user_param.duplex && (atof(user_param.version) >= 4.6)) {
 				if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 					fprintf(stderr,"Failed to sync between server and client between different msg sizes\n");
-					return 1;
+					return FAILURE;
 				}
 			}
 
@@ -300,22 +302,25 @@ int main(int argc, char *argv[])
 		ctx_set_send_wqes(&ctx,&user_param,rem_dest);
 
 		if (user_param.verb != SEND) {
-			if(perform_warm_up(&ctx,&user_param)) {
-				fprintf(stderr,"Problems with warm up\n");
-				return 1;
+
+			if (user_param.perform_warm_up) {
+				if(perform_warm_up(&ctx, &user_param)) {
+					fprintf(stderr, "Problems with warm up\n");
+					return FAILURE;
+				}
 			}
 		}
 
 		if(user_param.duplex) {
 			if (ctx_hand_shake(&user_comm,&my_dest[0],&rem_dest[0])) {
 				fprintf(stderr,"Failed to sync between server and client between different msg sizes\n");
-				return 1;
+				return FAILURE;
 			}
 		}
 
 		if(run_iter_bw(&ctx,&user_param)) {
 			fprintf(stderr," Failed to complete run_iter_bw function successfully\n");
-			return 1;
+			return FAILURE;
 		}
 
 		print_report_bw(&user_param,&my_bw_rep);
@@ -346,7 +351,7 @@ int main(int argc, char *argv[])
 
 		if(run_iter_bw_infinitely(&ctx,&user_param)) {
 			fprintf(stderr," Error occured while running infinitely! aborting ...\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
@@ -371,17 +376,17 @@ int main(int argc, char *argv[])
 	/* Closing connection. */
 	if (ctx_close_connection(&user_comm,&my_dest[0],&rem_dest[0])) {
 		fprintf(stderr,"Failed to close connection between server and client\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (!user_param.is_bw_limit_passed && (user_param.is_limit_bw == ON ) ) {
 		fprintf(stderr,"Error: BW result is below bw limit\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (!user_param.is_msgrate_limit_passed && (user_param.is_limit_bw == ON )) {
 		fprintf(stderr,"Error: Msg rate  is below msg_rate limit\n");
-		return 1;
+		return FAILURE;
 	}
 
 	free(my_dest);
@@ -390,7 +395,7 @@ int main(int argc, char *argv[])
 	if (user_param.work_rdma_cm == ON) {
 		if (destroy_ctx(&ctx,&user_param)) {
 			fprintf(stderr, "Failed to destroy resources\n");
-			return 1;
+			return FAILURE;
 		}
 		user_comm.rdma_params->work_rdma_cm = ON;
 		return destroy_ctx(user_comm.rdma_ctx,user_comm.rdma_params);
diff --git a/src/write_lat.c b/src/write_lat.c
index 4cb3e36..03d6610 100755
--- a/src/write_lat.c
+++ b/src/write_lat.c
@@ -95,7 +95,7 @@ int main(int argc, char *argv[])
 	ctx.context = ibv_open_device(ib_dev);
 	if (!ctx.context) {
 		fprintf(stderr, " Couldn't get context for the device\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* See if MTU and link type are valid and supported. */
@@ -107,7 +107,7 @@ int main(int argc, char *argv[])
 	/* copy the relevant user parameters to the comm struct + creating rdma_cm resources. */
 	if (create_comm_struct(&user_comm,&user_param)) {
 		fprintf(stderr," Unable to create RDMA_CM resources\n");
-		return 1;
+		return FAILURE;
 	}
 
 	if (user_param.output == FULL_VERBOSITY && user_param.machine == SERVER) {
@@ -172,7 +172,7 @@ int main(int argc, char *argv[])
 	/* Set up the Connection. */
 	if (set_up_connection(&ctx,&user_param,my_dest)) {
 		fprintf(stderr," Unable to set up socket connection\n");
-		return 1;
+		return FAILURE;
 	}
 
 	/* Print basic test information. */
@@ -184,7 +184,7 @@ int main(int argc, char *argv[])
 	/* shaking hands and gather the other side info. */
 	if (ctx_hand_shake(&user_comm,my_dest,rem_dest)) {
 		fprintf(stderr,"Failed to exchange data between server and clients\n");
-		return 1;
+		return FAILURE;
 	}
 
 	user_comm.rdma_params->side = REMOTE;
@@ -193,7 +193,7 @@ int main(int argc, char *argv[])
 		/* shaking hands and gather the other side info. */
 		if (ctx_hand_shake(&user_comm,&my_dest[i],&rem_dest[i])) {
 			fprintf(stderr,"Failed to exchange data between server and clients\n");
-			return 1;
+			return FAILURE;
 		}
 
 		ctx_print_pingpong_data(&rem_dest[i],&user_comm);
@@ -203,21 +203,21 @@ int main(int argc, char *argv[])
 		if (ctx_check_gid_compatibility(&my_dest[0], &rem_dest[0])) {
 			fprintf(stderr,"\n Found Incompatibility issue with GID types.\n");
 			fprintf(stderr," Please Try to use a different IP version.\n\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	if (user_param.work_rdma_cm == OFF) {
 		if (ctx_connect(&ctx,rem_dest,&user_param,my_dest)) {
 			fprintf(stderr," Unable to Connect the HCA's through the link\n");
-			return 1;
+			return FAILURE;
 		}
 	}
 
 	/* An additional handshake is required after moving qp to RTR. */
 	if (ctx_hand_shake(&user_comm,my_dest,rem_dest)) {
 		fprintf(stderr,"Failed to exchange data between server and clients\n");
-		return 1;
+		return FAILURE;
 	}
 
 	ctx_set_send_wqes(&ctx,&user_param,rem_dest);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ofed/perftest.git



More information about the Pkg-ofed-commits mailing list