[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