Skip to contentSkip to conversation

lz4: Move towards a newer LZ4 API

PATCH Superseded David Sommerseth 5 participants 15 messages Sep 7, 2017 – Nov 6, 2017

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 lz4: Move towards a newer LZ4 API

We are using a deprecated function, LZ4_compress_limitedOutput(), which will be removed with time. The correct function to use is LZ4_compress_default(). Both function takes the same number of arguments and data types, so the change is minimal.

To ensure we still build without issues against older LZ4 libraries without this new API, a simple wrapper function have been added and will only be enabled if we don't have the proper LZ4 versions, which means versions older than v1.7.0.

This compat API wrapper is currently located in comp-lz4.c, simply because adding it to compat-lz4.h would mean adding logic to lz4-rebaser.sh to preserve this wrapper; lz4-rebaser.sh will overwrite compat-lz4.[ch]. I didn't see any other files where it would make reasonable sense to add it. And it seemed overkill to add a completely new file to support a single file which would basically carry 8 lines of code for a function only used comp-lz4.c. In addition, adding new files means Makefile.am files needs to be updated accordingly and the new header file would be required to be included in comp-lz4.c. So, placing it in comp-lz4.c seemed to be the best fit, and it is closely tied to where it is used so it won't be that easy to just ignore it later on.

This patch is a result of the discussions in this mail thread:
https://www.mail-archive.com/[email protected]/msg14135.html

---
 src/openvpn/comp-lz4.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)
src/openvpn/comp-lz4.c +12 -1
index e056caa8..ad95968a 100644
@@ -43,6 +43,17 @@
 
 #include "memdbg.h"
 
+
+#if defined(LZ4_VERSION_NUMBER) && LZ4_VERSION_NUMBER < 10700
+/* Wrapper to re-enable the old API if LZ4 is older than v1.7.0 */
+static int
+LZ4_compress_default(const char* source, char* dest, int inputSize, int maxOutputSize)
+{
+    return LZ4_compress_limitedOutput(source, dest, inputSize, maxOutputSize);
+}
+#endif
+
+
 static void
 lz4_compress_init(struct compress_context *compctx)
 {
@@ -86,7 +97,7 @@ do_lz4_compress(struct buffer *buf,
             return false;
         }
 
-        zlen = LZ4_compress_limitedOutput((const char *)BPTR(buf), (char *)BPTR(work), BLEN(buf), zlen_max );
+        zlen = LZ4_compress_default((const char *)BPTR(buf), (char *)BPTR(work), BLEN(buf), zlen_max );
 
         if (zlen <= 0)
         {
Signature · 1 line
2.13.5
#1 lore raw

HI,

Quoted 4 lines · David Sommerseth

We are using a deprecated function, LZ4_compress_limitedOutput(), which will be removed with time. The correct function to use is LZ4_compress_default(). Both function takes the same number of arguments and data types, so the change is minimal.

I wonder why we should bother to have a wrapper function here.

We can ship a lz4 library that has the new function, and if a system only provides an older version, declare it unsuitable (configure check) and use the bundled one.

Less #ifdef

gert

Signature · 4 lines
USENET is *not* the non-clickable part of WWW!
                                                           //www.muc.de/~gert/
Gert Doering - Munich, Germany                             [email protected]...
fax: +49-89-35655025                        [email protected]...
#2 lore raw

On 07/09/17 08:13, Gert Doering wrote:> HI,

Quoted 7 lines · David Sommerseth
Quoted 4 lines

We are using a deprecated function, LZ4_compress_limitedOutput(), which will be removed with time. The correct function to use is LZ4_compress_default(). Both function takes the same number of arguments and data types, so the change is minimal.

Quoted 5 lines

I wonder why we should bother to have a wrapper function here.

We can ship a lz4 library that has the new function, and if a system only provides an older version, declare it unsuitable (configure check) and use the bundled one.

Yeah, I was thinking along those lines too when working on this patch. I just remembered vaguely our IRC chat long time a go and looked back at the initial mail discussion, and there was a preference for the wrapping back then.

But I like much more that we have a defined LZ4 version which we support, and ditch the #ifdef'ed wrapper. I'll send a v2 soon.

Signature · 4 lines
kind regards,

David Sommerseth
OpenVPN Technologies, Inc
#3 lore raw

PATCH v2 1/1 lz4: Move towards a newer LZ4 API

In reply to David Sommerseth

We are using a deprecated function, LZ4_compress_limitedOutput(), which will be removed with time. The correct function to use is LZ4_compress_default(). Both function takes the same number of arguments and data types, so the change is minimal.

This patch will also enforce the system LZ4 library to be at least v1.7.1. If the system library is not found or it is older, it will be build using the bundled LZ4 library. The version number requirement is based on the LZ4 version we ship.

The changes in configure.ac for the version check is modelled around the same approach we use for OpenSSL. Plus it does a few minor reformats and improvements to comply with more recommend autoconf coding style.

This patch is a result of the discussions in this mail thread:
https://www.mail-archive.com/[email protected]/msg14135.html

---
v2 - Don't use LZ4 version based #ifdef wrapper function
Do the LZ4 version check in ./configure

---
 configure.ac           | 72 +++++++++++++++++++++++++++++++++++---------------
 src/openvpn/comp-lz4.c |  3 ++-
 2 files changed, 53 insertions(+), 22 deletions(-)
configure.ac +51 -21
index 6f1044e8..74443353 100644
@@ -1088,37 +1088,67 @@ dnl
 AC_ARG_VAR([LZ4_CFLAGS], [C compiler flags for lz4])
 AC_ARG_VAR([LZ4_LIBS], [linker flags for lz4])
 if test "$enable_lz4" = "yes" && test "$enable_comp_stub" = "no"; then
-    AC_CHECKING([for LZ4 Library and Header files])
-    havelz4lib=1
-
-    # if LZ4_LIBS is set, we assume it will work, otherwise test
-    if test -z "${LZ4_LIBS}"; then
-	AC_CHECK_LIB(lz4, LZ4_compress,
-	    [ LZ4_LIBS="-llz4" ],
-	    [
-	        AC_MSG_RESULT([LZ4 library not found.])
-	        havelz4lib=0
-	    ])
+    if test -z "${LZ4_CFLAGS}" -a -z "${LZ4_LIBS}"; then
+	# if the user did not explicitly specify flags, try to autodetect
+	PKG_CHECK_MODULES([LZ4],
+			  [liblz4 >= 1.7.1],
+			  [have_lz4="yes"],
+			  [] # If this fails, we will do another test next
+	)
     fi
 
     saved_CFLAGS="${CFLAGS}"
+    saved_LIBS="${LIBS}"
     CFLAGS="${CFLAGS} ${LZ4_CFLAGS}"
-    AC_CHECK_HEADERS(lz4.h,
-       ,
-       [
-	   AC_MSG_RESULT([LZ4 headers not found.])
-	   havelz4lib=0
-       ])
-
-    if test $havelz4lib = 0 ; then
-	AC_MSG_RESULT([LZ4 library or header not found, using version in src/compat/compat-lz4.*])
+    LIBS="${LIBS} ${LZ4_LIBS}"
+
+    # If pkgconfig check failed or LZ4_CFLAGS/LZ4_LIBS env vars
+    # are used, check the version directly in the LZ4 include file
+    if test "${have_lz4}" != "yes"; then
+	AC_CHECK_HEADERS([lz4.h],
+			 [have_lz4h="yes"],
+			 [])
+
+	if test "${have_lz4h}" = "yes" ; then
+	    AC_MSG_CHECKING([additionally if system LZ4 version >= 1.7.1])
+	    AC_COMPILE_IFELSE(
+		[AC_LANG_PROGRAM([[
+#include <lz4.h>
+				 ]],
+				 [[
+/* Version encoding: MMNNPP (Major miNor Patch) - see lz4.h for details */
+#if LZ4_VERSION_NUMBER < 10701L
+#error LZ4 is too old
+#endif
+				 ]]
+				)],
+		[
+		    AC_MSG_RESULT([ok])
+		    have_lz4="yes"
+		],
+		[AC_MSG_RESULT([system LZ4 library is too old])]
+	    )
+	fi
+    fi
+
+    # if LZ4_LIBS is set, we assume it will work, otherwise test
+    if test -z "${LZ4_LIBS}"; then
+	AC_CHECK_LIB([lz4],
+		     [LZ4_compress],
+		     [LZ4_LIBS="-llz4"],
+		     [have_lz4="no"])
+    fi
+
+    if test "${have_lz4}" != "yes" ; then
+	AC_MSG_RESULT([		usuable LZ4 library or header not found, using version in src/compat/compat-lz4.*])
 	AC_DEFINE([NEED_COMPAT_LZ4], [1], [use copy of LZ4 source in compat/])
 	LZ4_LIBS=""
     fi
     OPTIONAL_LZ4_CFLAGS="${LZ4_CFLAGS}"
     OPTIONAL_LZ4_LIBS="${LZ4_LIBS}"
-    AC_DEFINE(ENABLE_LZ4, 1, [Enable LZ4 compression library])
+    AC_DEFINE(ENABLE_LZ4, [1], [Enable LZ4 compression library])
     CFLAGS="${saved_CFLAGS}"
+    LIBS="${saved_LIBS}"
 fi
 
 
src/openvpn/comp-lz4.c +2 -1
index e056caa8..bdb3247d 100644
@@ -43,6 +43,7 @@
 
 #include "memdbg.h"
 
+
 static void
 lz4_compress_init(struct compress_context *compctx)
 {
@@ -86,7 +87,7 @@ do_lz4_compress(struct buffer *buf,
             return false;
         }
 
-        zlen = LZ4_compress_limitedOutput((const char *)BPTR(buf), (char *)BPTR(work), BLEN(buf), zlen_max );
+        zlen = LZ4_compress_default((const char *)BPTR(buf), (char *)BPTR(work), BLEN(buf), zlen_max );
 
         if (zlen <= 0)
         {
Signature · 1 line
2.13.5
#4 lore raw

Hi,

While we are at it, I found it useful to see the used LZ4 version at runtime as it is done with LZO and other libraries.

I've patched my rpms with the patch attached.

Regards,
Simon

Quoted 157 lines

We are using a deprecated function, LZ4_compress_limitedOutput(), which will be removed with time. The correct function to use is LZ4_compress_default().
Both function takes the same number of arguments and data types, so the change
is minimal.

This patch will also enforce the system LZ4 library to be at least v1.7.1.
If
the system library is not found or it is older, it will be build using the bundled
LZ4 library. The version number requirement is based on the LZ4 version we ship.

The changes in configure.ac for the version check is modelled around the same
approach we use for OpenSSL. Plus it does a few minor reformats and improvements
to comply with more recommend autoconf coding style.

This patch is a result of the discussions in this mail thread:
https://www.mail-archive.com/[email protected]/msg14135.html

---
v2 - Don't use LZ4 version based #ifdef wrapper function
Do the LZ4 version check in ./configure

---
 configure.ac           | 72
+++++++++++++++++++++++++++++++++++---------------
 src/openvpn/comp-lz4.c |  3 ++-
 2 files changed, 53 insertions(+), 22 deletions(-)
configure.ac +51 -21
index 6f1044e8..74443353 100644
@@ -1088,37 +1088,67 @@ dnl
 AC_ARG_VAR([LZ4_CFLAGS], [C compiler flags for lz4])
 AC_ARG_VAR([LZ4_LIBS], [linker flags for lz4])
 if test "$enable_lz4" = "yes" && test "$enable_comp_stub" = "no"; then
-    AC_CHECKING([for LZ4 Library and Header files])
-    havelz4lib=1
-
-    # if LZ4_LIBS is set, we assume it will work, otherwise test
-    if test -z "${LZ4_LIBS}"; then
-	AC_CHECK_LIB(lz4, LZ4_compress,
-	    [ LZ4_LIBS="-llz4" ],
-	    [
-	        AC_MSG_RESULT([LZ4 library not found.])
-	        havelz4lib=0
-	    ])
+    if test -z "${LZ4_CFLAGS}" -a -z "${LZ4_LIBS}"; then
+	# if the user did not explicitly specify flags, try to autodetect
+	PKG_CHECK_MODULES([LZ4],
+			  [liblz4 >= 1.7.1],
+			  [have_lz4="yes"],
+			  [] # If this fails, we will do another test next
+	)
     fi
 
     saved_CFLAGS="${CFLAGS}"
+    saved_LIBS="${LIBS}"
     CFLAGS="${CFLAGS} ${LZ4_CFLAGS}"
-    AC_CHECK_HEADERS(lz4.h,
-       ,
-       [
-	   AC_MSG_RESULT([LZ4 headers not found.])
-	   havelz4lib=0
-       ])
-
-    if test $havelz4lib = 0 ; then
-	AC_MSG_RESULT([LZ4 library or header not found, using version in
 src/compat/compat-lz4.*])
+    LIBS="${LIBS} ${LZ4_LIBS}"
+
+    # If pkgconfig check failed or LZ4_CFLAGS/LZ4_LIBS env vars
+    # are used, check the version directly in the LZ4 include file
+    if test "${have_lz4}" != "yes"; then
+	AC_CHECK_HEADERS([lz4.h],
+			 [have_lz4h="yes"],
+			 [])
+
+	if test "${have_lz4h}" = "yes" ; then
+	    AC_MSG_CHECKING([additionally if system LZ4 version >= 1.7.1])
+	    AC_COMPILE_IFELSE(
+		[AC_LANG_PROGRAM([[
+#include <lz4.h>
+				 ]],
+				 [[
+/* Version encoding: MMNNPP (Major miNor Patch) - see lz4.h for details
 */
+#if LZ4_VERSION_NUMBER < 10701L
+#error LZ4 is too old
+#endif
+				 ]]
+				)],
+		[
+		    AC_MSG_RESULT([ok])
+		    have_lz4="yes"
+		],
+		[AC_MSG_RESULT([system LZ4 library is too old])]
+	    )
+	fi
+    fi
+
+    # if LZ4_LIBS is set, we assume it will work, otherwise test
+    if test -z "${LZ4_LIBS}"; then
+	AC_CHECK_LIB([lz4],
+		     [LZ4_compress],
+		     [LZ4_LIBS="-llz4"],
+		     [have_lz4="no"])
+    fi
+
+    if test "${have_lz4}" != "yes" ; then
+	AC_MSG_RESULT([		usuable LZ4 library or header not found, using version
 in src/compat/compat-lz4.*])
 	AC_DEFINE([NEED_COMPAT_LZ4], [1], [use copy of LZ4 source in compat/])
 	LZ4_LIBS=""
     fi
     OPTIONAL_LZ4_CFLAGS="${LZ4_CFLAGS}"
     OPTIONAL_LZ4_LIBS="${LZ4_LIBS}"
-    AC_DEFINE(ENABLE_LZ4, 1, [Enable LZ4 compression library])
+    AC_DEFINE(ENABLE_LZ4, [1], [Enable LZ4 compression library])
     CFLAGS="${saved_CFLAGS}"
+    LIBS="${saved_LIBS}"

fi

src/openvpn/comp-lz4.c +2 -1
index e056caa8..bdb3247d 100644
@@ -43,6 +43,7 @@
 
 #include "memdbg.h"
 
+
 static void
 lz4_compress_init(struct compress_context *compctx)
 {
@@ -86,7 +87,7 @@ do_lz4_compress(struct buffer *buf,
             return false;
         }
 
-        zlen = LZ4_compress_limitedOutput((const char *)BPTR(buf), (char
 *)BPTR(work), BLEN(buf), zlen_max );
+        zlen = LZ4_compress_default((const char *)BPTR(buf), (char
 *)BPTR(work), BLEN(buf), zlen_max );
 
         if (zlen <= 0)
         {

--
2.13.5

Quoted 8 lines

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openvpn-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

src/openvpn/comp-lz4.h +4 -0
diff -Naur openvpn-2.4.0.orig/src/openvpn/comp-lz4.h openvpn-2.4.0/src/openvpn/comp-lz4.h
@@ -28,6 +28,10 @@
 
 #if defined(ENABLE_LZ4)
 
+#if defined(HAVE_LZ4_H)
+#include "lz4.h"
+#endif
+
 #include "buffer.h"
 
 extern const struct compress_alg lz4_alg;
src/openvpn/options.c +7 -1
diff -Naur openvpn-2.4.0.orig/src/openvpn/options.c openvpn-2.4.0/src/openvpn/options.c
@@ -4121,11 +4121,17 @@
 #else
 #define LZO_LIB_VER_STR "", ""
 #endif
+#ifdef ENABLE_LZ4
+#define LZ4_LIB_VER_STR ", LZ4 ", LZ4_versionString()
+#else
+#define LZ4_LIB_VER_STR "", ""
+#endif
 
-    msg(flags, "library versions: %s%s%s", SSL_LIB_VER_STR, LZO_LIB_VER_STR);
+    msg(flags, "library versions: %s%s%s%s%s", SSL_LIB_VER_STR, LZO_LIB_VER_STR, LZ4_LIB_VER_STR);
 
 #undef SSL_LIB_VER_STR
 #undef LZO_LIB_VER_STR
+#undef LZ4_LIB_VER_STR
 }
 
 static void
#5 lore raw
Quoted 6 lines · Simon Matter

Hi,

While we are at it, I found it useful to see the used LZ4 version at runtime as it is done with LZO and other libraries.

I've patched my rpms with the patch attached.

Thanks a lot! I think this makes sense. But I think we can do this stuff as a separate patch, not part of this round of patches. Lets target this after we have sorted out the current LZ4 patches have been applied. Then it is much easier to test and validate this approach.

Signature · 4 lines
kind regards,

David Sommerseth
OpenVPN Technologies, Inc
#6 lore raw
In reply to Simon Matter

Hi,

Quoted 4 lines · Simon Matter

While we are at it, I found it useful to see the used LZ4 version at runtime as it is done with LZO and other libraries.

I've patched my rpms with the patch attached.

[..]

src/openvpn/comp-lz4.h line 35

Quoted 12 lines

diff -Naur openvpn-2.4.0.orig/src/openvpn/comp-lz4.h openvpn-2.4.0/src/openvpn/comp-lz4.h

src/openvpn/comp-lz4.h +4 -0
@@ -28,6 +28,10 @@
 
 #if defined(ENABLE_LZ4)
 
+#if defined(HAVE_LZ4_H)
+#include "lz4.h"
+#endif
+
 #include "buffer.h"

Feature-ACK (I think this is a useful idea, for the same reasons we have LZO and OpenSSL versions :-) ), but that will not work if we use compat-lz4.h, so "code NAK".

comp-lz4.c currently has

#if defined(NEED_COMPAT_LZ4)
#include "compat-lz4.h"
#else
#include "lz4.h"
#endif

which might just be moved to comp-lz4.h, and then things should work.

Quoted 11 lines
src/openvpn/comp-lz4.h +0 -0
 extern const struct compress_alg lz4_alg;

diff -Naur openvpn-2.4.0.orig/src/openvpn/options.c openvpn-2.4.0/src/openvpn/options.c

src/openvpn/options.c +3 -0
@@ -4121,11 +4121,17 @@
 #else
 #define LZO_LIB_VER_STR "", ""
 #endif
+#ifdef ENABLE_LZ4
+#define LZ4_LIB_VER_STR ", LZ4 ", LZ4_versionString()
+#else

src/openvpn/options.c line 4135

Quoted 10 lines
src/openvpn/options.c +4 -1
+#define LZ4_LIB_VER_STR "", ""
+#endif
 
-    msg(flags, "library versions: %s%s%s", SSL_LIB_VER_STR, LZO_LIB_VER_STR);
+    msg(flags, "library versions: %s%s%s%s%s", SSL_LIB_VER_STR, LZO_LIB_VER_STR, LZ4_LIB_VER_STR);
 
 #undef SSL_LIB_VER_STR
 #undef LZO_LIB_VER_STR
+#undef LZ4_LIB_VER_STR
 }

That part looks good.

gert

Signature · 4 lines
USENET is *not* the non-clickable part of WWW!
                                                           //www.muc.de/~gert/
Gert Doering - Munich, Germany                             [email protected]...
fax: +49-89-35655025                        [email protected]...
#7 lore raw
Quoted 19 lines

Hi,

Quoted 4 lines · Simon Matter

While we are at it, I found it useful to see the used LZ4 version at runtime as it is done with LZO and other libraries.

I've patched my rpms with the patch attached.

[..]

Quoted 10 lines

diff -Naur openvpn-2.4.0.orig/src/openvpn/comp-lz4.h openvpn-2.4.0/src/openvpn/comp-lz4.h
--- openvpn-2.4.0.orig/src/openvpn/comp-lz4.h 2016-12-26
12:51:00.000000000 +0100
+++ openvpn-2.4.0/src/openvpn/comp-lz4.h 2017-01-17 09:11:12.000000000
+0100

src/openvpn/comp-lz4.h +0 -0
@@ -28,6 +28,10 @@
 
 #if defined(ENABLE_LZ4)
 
Quoted 9 lines

src/openvpn/comp-lz4.h line 35

Quoted 5 lines
src/openvpn/comp-lz4.h +4 -0
+#if defined(HAVE_LZ4_H)
+#include "lz4.h"
+#endif
+
 #include "buffer.h"

Feature-ACK (I think this is a useful idea, for the same reasons we have LZO and OpenSSL versions :-) ), but that will not work if we use compat-lz4.h, so "code NAK".

IIRC at the time of writing this, the embedded lz4 was too old and didn't have the LZ4_versionString() function. So the code won't work with the patch. If the embedded code has LZ4_versionString() now, it should be ok.

Regards,
Simon

Quoted 52 lines

comp-lz4.c currently has

#if defined(NEED_COMPAT_LZ4)
#include "compat-lz4.h"
#else
#include "lz4.h"
#endif

which might just be moved to comp-lz4.h, and then things should work.

Quoted 16 lines
src/openvpn/comp-lz4.h +0 -0
 extern const struct compress_alg lz4_alg;

diff -Naur openvpn-2.4.0.orig/src/openvpn/options.c openvpn-2.4.0/src/openvpn/options.c
--- openvpn-2.4.0.orig/src/openvpn/options.c 2016-12-26
12:51:00.000000000 +0100
+++ openvpn-2.4.0/src/openvpn/options.c 2017-01-17 09:11:12.000000000
+0100

src/openvpn/options.c +5 -0
@@ -4121,11 +4121,17 @@
 #else
 #define LZO_LIB_VER_STR "", ""
 #endif
+#ifdef ENABLE_LZ4
+#define LZ4_LIB_VER_STR ", LZ4 ", LZ4_versionString()
+#else
+#define LZ4_LIB_VER_STR "", ""
+#endif

src/openvpn/options.c line 4137

Quoted 10 lines
src/openvpn/options.c +2 -1
 
-    msg(flags, "library versions: %s%s%s", SSL_LIB_VER_STR,
 LZO_LIB_VER_STR);
+    msg(flags, "library versions: %s%s%s%s%s", SSL_LIB_VER_STR,
 LZO_LIB_VER_STR, LZ4_LIB_VER_STR);
 
 #undef SSL_LIB_VER_STR
 #undef LZO_LIB_VER_STR
+#undef LZ4_LIB_VER_STR
 }

That part looks good.

gert

--
USENET is *not* the non-clickable part of WWW!

                                                           //www.muc.de/~gert/

Gert Doering - Munich, Germany
[email protected]...
fax: +49-89-35655025
[email protected]...

#8 lore raw

Hi,

Quoted 7 lines · Simon Matter
Quoted 3 lines

Feature-ACK (I think this is a useful idea, for the same reasons we have LZO and OpenSSL versions :-) ), but that will not work if we use compat-lz4.h, so "code NAK".

IIRC at the time of writing this, the embedded lz4 was too old and didn't have the LZ4_versionString() function. So the code won't work with the patch. If the embedded code has LZ4_versionString() now, it should be ok.

Well, it will still lead to compile blowup if you try to include a non-existing "lz4.h" - no matter if the embedded version has LZ4_versionString() or not...

But indeed, we should upgrade bundled LZ4. We have a script for that, we just never used it. For whatever reason.

gert

Signature · 4 lines
USENET is *not* the non-clickable part of WWW!
                                                           //www.muc.de/~gert/
Gert Doering - Munich, Germany                             [email protected]...
fax: +49-89-35655025                        [email protected]...
#9 lore raw

Re: [Openvpn-devel] LZ4 library version printing

In reply to Simon Matter

Hi,

returning to this patchset about printing the LZ4 library version...

Quoted 3 lines · Simon Matter
Quoted 3 lines · Simon Matter
Quoted 2 lines

While we are at it, I found it useful to see the used LZ4 version at runtime as it is done with LZO and other libraries.

I still like this :-)

[..]

Quoted 7 lines
Quoted 3 lines

Feature-ACK (I think this is a useful idea, for the same reasons we have LZO and OpenSSL versions :-) ), but that will not work if we use compat-lz4.h, so "code NAK".

IIRC at the time of writing this, the embedded lz4 was too old and didn't have the LZ4_versionString() function. So the code won't work with the patch. If the embedded code has LZ4_versionString() now, it should be ok.

It now has... (1.7.5).

I'm not sure where LZ4_versionString() got introduced, though - their git repo does not have tags for 1.7.1 or 1.7.2, it is in the 1.7.3 tag, but not in the "last of the old numbering scheme" version.

Our configure.ac requires 1.7.1 - so if LZ4_versionString() is not in there yet, we might want to bump to 1.7.3 then.

Can you revisit this?

gert

Signature · 4 lines
USENET is *not* the non-clickable part of WWW!
                                                           //www.muc.de/~gert/
Gert Doering - Munich, Germany                             [email protected]...
fax: +49-89-35655025                        [email protected]...
#10 lore raw

Re: [Openvpn-devel] LZ4 library version printing

Quoted 23 lines

Hi,

returning to this patchset about printing the LZ4 library version...

Quoted 3 lines · Simon Matter
Quoted 3 lines · Simon Matter
Quoted 2 lines

While we are at it, I found it useful to see the used LZ4 version at runtime as it is done with LZO and other libraries.

I still like this :-)

[..]

Quoted 10 lines
Quoted 1 line

Feature-ACK (I think this is a useful idea, for the same reasons we

have

Quoted 2 lines

LZO and OpenSSL versions :-) ), but that will not work if we use compat-lz4.h, so "code NAK".

IIRC at the time of writing this, the embedded lz4 was too old and didn't
have the LZ4_versionString() function. So the code won't work with the patch. If the embedded code has LZ4_versionString() now, it should be ok.

Quoted 8 lines

It now has... (1.7.5).

I'm not sure where LZ4_versionString() got introduced, though - their git repo does not have tags for 1.7.1 or 1.7.2, it is in the 1.7.3 tag, but not in the "last of the old numbering scheme" version.

Our configure.ac requires 1.7.1 - so if LZ4_versionString() is not in there yet, we might want to bump to 1.7.3 then.

Hi Gert,

according to the NEWS file in lz4 there is no such thing as release 1.7.1 or 1.7.2, it goes from r131 -> v1.7.3. I therefore suggest to set the minimum version to 1.7.3 as I'm also unable to locate any official 1.7.1 or 1.7.2 release.

BTW, for 2.4.4 I've changed to patch to the one attached.

Regards,
Simon

src/openvpn/options.c renamed from src/openvpn/options.c.orig +11 -1
@@ -61,6 +61,10 @@
 
 #include "memdbg.h"
 
+#if defined(ENABLE_LZ4)
+#include "lz4.h"
+#endif
+
 const char title_string[] =
     PACKAGE_STRING
 #ifdef CONFIGURE_GIT_REVISION
@@ -4155,11 +4159,17 @@
 #else
 #define LZO_LIB_VER_STR "", ""
 #endif
+#ifdef ENABLE_LZ4
+#define LZ4_LIB_VER_STR ", LZ4 ", LZ4_versionString()
+#else
+#define LZ4_LIB_VER_STR "", ""
+#endif
 
-    msg(flags, "library versions: %s%s%s", SSL_LIB_VER_STR, LZO_LIB_VER_STR);
+    msg(flags, "library versions: %s%s%s%s%s", SSL_LIB_VER_STR, LZO_LIB_VER_STR, LZ4_LIB_VER_STR);
 
 #undef SSL_LIB_VER_STR
 #undef LZO_LIB_VER_STR
+#undef LZ4_LIB_VER_STR
 }
 
 static void
#11 lore raw

Re: [Openvpn-devel] LZ4 library version printing

Hi,

Quoted 6 lines · Simon Matter
Quoted 6 lines

It now has... (1.7.5).

I'm not sure where LZ4_versionString() got introduced, though - their git repo does not have tags for 1.7.1 or 1.7.2, it is in the 1.7.3 tag, but not in the "last of the old numbering scheme" version.

Quoted 7 lines
Quoted 2 lines

Our configure.ac requires 1.7.1 - so if LZ4_versionString() is not in there yet, we might want to bump to 1.7.3 then.

according to the NEWS file in lz4 there is no such thing as release 1.7.1 or 1.7.2, it goes from r131 -> v1.7.3. I therefore suggest to set the minimum version to 1.7.3 as I'm also unable to locate any official 1.7.1 or 1.7.2 release.

Sounds like a reasonable plan.

Quoted 8 lines

BTW, for 2.4.4 I've changed to patch to the one attached.

Regards,
Simon

src/openvpn/options.c line 67

Quoted 7 lines
src/openvpn/options.c renamed from src/openvpn/options.c.orig +4 -0
@@ -61,6 +61,10 @@
 
 #include "memdbg.h"
 
+#if defined(ENABLE_LZ4)
+#include "lz4.h"
+#endif
+

This will fail if we use the bundled LZ4, which has "compat-lz4.h" - so maybe we really should go back to including "comp-lz4.h" here, and move the lz4.h/compat-lz4.h including to that one.

("bundled LZ4" is what we can have right now, so we need to take that into account. If we want to drop it, that's an independent discussion)

gert

Signature · 4 lines
USENET is *not* the non-clickable part of WWW!
                                                           //www.muc.de/~gert/
Gert Doering - Munich, Germany                             [email protected]...
fax: +49-89-35655025                        [email protected]...
#12 lore raw
In reply to David Sommerseth

Hi,

On 08/09/17 01:20, David Sommerseth wrote:

[CUT]

Quoted 13 lines
src/openvpn/comp-lz4.c +1 -0
index e056caa8..bdb3247d 100644
@@ -43,6 +43,7 @@
 
 #include "memdbg.h"
 
+
 static void
 lz4_compress_init(struct compress_context *compctx)
 {

src/openvpn/comp-lz4.c do_lz4_compress(struct buffer *buf, · line 90

Quoted 5 lines
src/openvpn/comp-lz4.c +1 -1
@@ -86,7 +87,7 @@ do_lz4_compress(struct buffer *buf,
             return false;
         }
 
-        zlen = LZ4_compress_limitedOutput((const char *)BPTR(buf), (char *)BPTR(work), BLEN(buf), zlen_max );
+        zlen = LZ4_compress_default((const char *)BPTR(buf), (char *)BPTR(work), BLEN(buf), zlen_max );

while at it, could you remove the annoying space between the last argument and the closing parenthesis? (you or the committer)

Cheers,

Quoted 4 lines
src/openvpn/comp-lz4.c +0 -0
         if (zlen <= 0)
         {
 
Signature · 1 line
Antonio Quartulli
#13 lore raw
In reply to David Sommerseth

Hi,

Quoted 13 lines · David Sommerseth

We are using a deprecated function, LZ4_compress_limitedOutput(), which will be removed with time. The correct function to use is LZ4_compress_default(). Both function takes the same number of arguments and data types, so the change is minimal.

This patch will also enforce the system LZ4 library to be at least v1.7.1. If the system library is not found or it is older, it will be build using the bundled LZ4 library. The version number requirement is based on the LZ4 version we ship.

The changes in configure.ac for the version check is modelled around the same approach we use for OpenSSL. Plus it does a few minor reformats and improvements to comply with more recommend autoconf coding style.

Quoted 8 lines

This patch is a result of the discussions in this mail thread:
https://www.mail-archive.com/[email protected]/msg14135.html

---
v2 - Don't use LZ4 version based #ifdef wrapper function
Do the LZ4 version check in ./configure

This looks good to me.

I have tested on

- FreeBSD with lz4 installed, lz4.pc -> uses system lib
- FreeBSD with lz4 installed, no lz4.pc, lz4 stuff in LZ4_CFLAGS/LIBS

                                      -> uses system lib
 - FreeBSD with lz4 installed, but not in include path
                                      -> uses compat-lz4.*
 - Gentoo Linux with lz4 installed, lz4.pc 
                                      -> uses system lib
 - Gentoo Linux with lz4 installed, no lz4.pc, but lz4 in /usr/{include,lib}/
                                      -> uses system lib

- Gentoo Linux with no lz4 installed -> uses compat-lz4.*

In all cases, the system builds and produces a working openvpn binary.

The messages in case "2" and "5" are slightly weird, though...

(2)
checking lz4.h usability... yes
checking lz4.h presence... no
configure: WARNING: lz4.h: accepted by the compiler, rejected by the preprocessor!
configure: WARNING: lz4.h: proceeding with the compiler's result checking for lz4.h... yes
checking additionally if system LZ4 version >= 1.7.1... ok

(5)
checking for LZ4... no
checking lz4.h usability... yes
checking lz4.h presence... yes
checking for lz4.h... yes
checking additionally if system LZ4 version >= 1.7.1... ok checking for LZ4_compress in -llz4... yes

(but this is configure...)

There's an extra added blank line in comp-lz4.c and the bracket whitespace Antonio complained about - but those can be fixed on commit.

So, ACK. Thanks for wading through this.

gert

Signature · 4 lines
USENET is *not* the non-clickable part of WWW!
                                                           //www.muc.de/~gert/
Gert Doering - Munich, Germany                             [email protected]...
fax: +49-89-35655025                        [email protected]...
#14 lore raw
In reply to David Sommerseth

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Your patch has been applied to the following branches

commit 5f6225c32e41a922069964d9d59c2fcd6589f74c (master) commit 38da61f3cc2f06ff7d3d174576dc5c6e87d6d174 (release/2.4)

Author: David Sommerseth
Date:   Thu Sep 7 19:20:04 2017 +0200

lz4: Move towards a newer LZ4 API

Acked-by: Gert Doering
Message-Id: <[email protected]...>
URL: https://www.mail-archive.com/[email protected]/msg15396.html
Signed-off-by: David Sommerseth

- --
kind regards,

David Sommerseth

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQIcBAEBCgAGBQJZxYZaAAoJEIbPlEyWcf3ycWIQAJoQwzFc5Ic84aweeZxvUo6S Npaotm9raci/sLyhbEOIC4Evj0KdSD+B/8fiGeaX1vnNXz3lfZwAx4TKtfibwpOA /6EID82wqcwf4Bq0a979AgukZJQPcgQPMUA1JQZXJJn7tm3igP98GAJCRpQ1+eEK +rox3/7jOP0uixyLQ9dSzdv4yA6SeptDnvIKjhtoV0cJyGgcvpsowxoXHnBvpgLR 0Ix7o7WWe/YPnH4elUVV+LP4sCnpFHmbWKmnvF8Mzsp6F1ocDIR8NYrqEUpuZsoz PZknfRtde2G+0oeEGs38qotbVQFb4HigJwi8uL96qGRbkPerN7cr4mgNj9s/2vey DN21Rvrofa1WfqKUbVf3M0VGOtIO0oq+GSWex6Wf6aAZJ0WRYB6LkTFINZ9g7ENp xzkwaMLuEFpvyRgr+/rxaxpamZ6FEJWChn69gj3LhgbWWPMqMssZkisP+h7Y/MUe ZgvD8qZozPgjKo/zqazbAhOjvu5C/ouuGXis4j89dHWrO+3slFrtjXJCnkWktvi2 p7CPmENZvpLRno1FgsKlYcXuPeTJO2R18+uPr6fon2WYOsrGgZs1hzhfDoZIZbfk mRVWbQ698t/SEvmjD7VWQUzecaVVknBuBpu9F5mImnV0HcGdAxZS2x9bD+9YMNOH GMNlxvXx+rD+B1/PksYz
=ZBhF
-----END PGP SIGNATURE-----