Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Added support for LZ4
Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
  • Loading branch information
nmav authored and David Woodhouse committed Jan 16, 2015
1 parent 3f0f078 commit 329991d
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 6 deletions.
4 changes: 2 additions & 2 deletions Makefile.am
Expand Up @@ -65,8 +65,8 @@ library_srcs += $(lib_srcs_posix)
endif

libopenconnect_la_SOURCES = version.c $(library_srcs)
libopenconnect_la_CFLAGS = $(AM_CFLAGS) $(SSL_CFLAGS) $(DTLS_SSL_CFLAGS) $(LIBXML2_CFLAGS) $(LIBPROXY_CFLAGS) $(ZLIB_CFLAGS) $(P11KIT_CFLAGS) $(TSS_CFLAGS) $(LIBSTOKEN_CFLAGS) $(LIBOATH_CFLAGS) $(LIBPSKC_CFLAGS) $(GSSAPI_CFLAGS) $(INTL_CFLAGS) $(ICONV_CFLAGS) $(LIBPCSCLITE_CFLAGS) $(LIBP11_CFLAGS)
libopenconnect_la_LIBADD = $(SSL_LIBS) $(DTLS_SSL_LIBS) $(LIBXML2_LIBS) $(LIBPROXY_LIBS) $(ZLIB_LIBS) $(P11KIT_LIBS) $(TSS_LIBS) $(LIBSTOKEN_LIBS) $(LIBOATH_LIBS) $(LIBPSKC_LIBS) $(GSSAPI_LIBS) $(INTL_LIBS) $(ICONV_LIBS) $(LIBPCSCLITE_LIBS) $(LIBP11_LIBS)
libopenconnect_la_CFLAGS = $(AM_CFLAGS) $(SSL_CFLAGS) $(DTLS_SSL_CFLAGS) $(LIBXML2_CFLAGS) $(LIBPROXY_CFLAGS) $(ZLIB_CFLAGS) $(P11KIT_CFLAGS) $(TSS_CFLAGS) $(LIBSTOKEN_CFLAGS) $(LIBOATH_CFLAGS) $(LIBPSKC_CFLAGS) $(GSSAPI_CFLAGS) $(INTL_CFLAGS) $(ICONV_CFLAGS) $(LIBPCSCLITE_CFLAGS) $(LIBP11_CFLAGS) $(LIBLZ4_CFLAGS)
libopenconnect_la_LIBADD = $(SSL_LIBS) $(DTLS_SSL_LIBS) $(LIBXML2_LIBS) $(LIBPROXY_LIBS) $(ZLIB_LIBS) $(P11KIT_LIBS) $(TSS_LIBS) $(LIBSTOKEN_LIBS) $(LIBOATH_LIBS) $(LIBPSKC_LIBS) $(GSSAPI_LIBS) $(INTL_LIBS) $(ICONV_LIBS) $(LIBPCSCLITE_LIBS) $(LIBP11_LIBS) $(LIBLZ4_LIBS)
if OPENBSD_LIBTOOL
# OpenBSD's libtool doesn't have -version-number, but its -version-info arg
# does what GNU libtool's -version-number does. Which arguably is what the
Expand Down
19 changes: 19 additions & 0 deletions configure.ac
Expand Up @@ -514,6 +514,25 @@ Add --without-openssl-version-check to configure args to avoid this check, or
perhaps consider building with GnuTLS instead.])])
fi

AC_ARG_WITH(lz4,
AS_HELP_STRING([--without-lz4], [disable support for LZ4 compression]),
test_for_lz4=$withval,
test_for_lz4=yes)

enable_lz4=no
if test "$test_for_lz4" = yes;then
PKG_CHECK_MODULES([LIBLZ4], [liblz4], [
enable_lz4=yes
AC_DEFINE([HAVE_LZ4], [], [LZ4 was found])
],
[
AC_MSG_WARN([[
***
*** lz4 not found.
*** ]])
])
fi

# For some bizarre reason now that we use AM_ICONV, the mingw32 build doesn't
# manage to set EGREP properly in the created ./libtool script. Make sure it's
# found.
Expand Down
55 changes: 51 additions & 4 deletions cstp.c
Expand Up @@ -28,6 +28,9 @@
#include <stdio.h>
#include <sys/types.h>
#include <stdarg.h>
#ifdef HAVE_LZ4
#include <lz4.h>
#endif

#include "openconnect-internal.h"

Expand Down Expand Up @@ -155,6 +158,10 @@ static void append_compr_types(struct oc_text_buf *buf, const char *proto, int a
if (avail) {
char sep = ' ';
buf_append(buf, "X-%s-Accept-Encoding:", proto);
if (avail & COMPR_LZ4) {
buf_append(buf, "%coc-lz4", sep);
sep = ',';
}
if (avail & COMPR_LZS) {
buf_append(buf, "%clzs", sep);
sep = ',';
Expand Down Expand Up @@ -365,6 +372,8 @@ static int start_cstp_connection(struct openconnect_info *vpninfo)
} else if (!strcmp(buf + 7, "Content-Encoding")) {
if (!strcmp(colon, "lzs"))
vpninfo->dtls_compr = COMPR_LZS;
else if (!strcmp(colon, "oc-lz4"))
vpninfo->dtls_compr = COMPR_LZ4;
else {
vpn_progress(vpninfo, PRG_ERR,
_("Unknown DTLS-Content-Encoding %s\n"),
Expand Down Expand Up @@ -399,6 +408,8 @@ static int start_cstp_connection(struct openconnect_info *vpninfo)
vpninfo->cstp_compr = COMPR_DEFLATE;
else if (!strcmp(colon, "lzs"))
vpninfo->cstp_compr = COMPR_LZS;
else if (!strcmp(colon, "oc-lz4"))
vpninfo->cstp_compr = COMPR_LZ4;
else {
vpn_progress(vpninfo, PRG_ERR,
_("Unknown CSTP-Content-Encoding %s\n"),
Expand Down Expand Up @@ -583,7 +594,7 @@ int openconnect_make_cstp_connection(struct openconnect_info *vpninfo)
goto out;

/* This will definitely be smaller than zlib's */
if (vpninfo->cstp_compr == COMPR_LZS)
if (vpninfo->cstp_compr == COMPR_LZS || vpninfo->cstp_compr == COMPR_LZ4)
deflate_bufsize = vpninfo->ip_info.mtu;

/* If deflate compression is enabled (which is CSTP-only), it needs its
Expand Down Expand Up @@ -685,7 +696,7 @@ int decompress_and_queue_packet(struct openconnect_info *vpninfo,
unsigned char *buf, int len)
{
struct pkt *new = malloc(sizeof(struct pkt) + vpninfo->ip_info.mtu);
const char *comprtype;
const char *comprtype = "";

if (!new)
return -ENOMEM;
Expand Down Expand Up @@ -722,16 +733,36 @@ int decompress_and_queue_packet(struct openconnect_info *vpninfo,
if (vpninfo->inflate_adler32 != pkt_sum)
vpninfo->quit_reason = "Compression (inflate) adler32 failure";

} else {
} else if (vpninfo->cstp_compr == COMPR_LZS) {
comprtype = "LZS";

new->len = lzs_decompress(new->data, vpninfo->ip_info.mtu, buf, len);
if (new->len < 0) {
len = new->len;
if (len == 0)
len = -EINVAL;
vpn_progress(vpninfo, PRG_ERR, _("LZS decompression failed: %s\n"),
strerror(-new->len));
strerror(-len));
free(new);
return len;
}
#ifdef HAVE_LZ4
} else if (vpninfo->cstp_compr == COMPR_LZ4) {
comprtype = "LZ4";
new->len = LZ4_decompress_safe((void *)buf, (void *)new->data, len, vpninfo->ip_info.mtu);
if (new->len <= 0) {
len = new->len;
if (len == 0)
len = -EINVAL;
vpn_progress(vpninfo, PRG_ERR, _("LZ4 decompression failed\n"));
free(new);
return len;
}
#endif
} else {
vpn_progress(vpninfo, PRG_ERR,
_("Unknown compression type %d\n"), (int)vpninfo->cstp_compr);
return -EINVAL;
}
vpn_progress(vpninfo, PRG_TRACE,
_("Received %s compressed data packet of %d bytes (was %d)\n"),
Expand Down Expand Up @@ -785,6 +816,22 @@ int compress_packet(struct openconnect_info *vpninfo, int compr_type, struct pkt

vpninfo->deflate_pkt->len = ret;
return 0;
#ifdef HAVE_LZ4
} else if (vpninfo->cstp_compr == COMPR_LZ4) {
if (this->len < 40)
return -EFBIG;

ret = LZ4_compress_limitedOutput((void*)this->data, (void*)vpninfo->deflate_pkt->data, this->len,
this->len);
if (ret <= 0) {
if (ret == 0)
ret = -EFBIG;
return ret;
}

vpninfo->deflate_pkt->len = ret;
return 0;
#endif
} else
return -EINVAL;

Expand Down
4 changes: 4 additions & 0 deletions main.c
Expand Up @@ -1430,11 +1430,15 @@ int main(int argc, char **argv)
compr = " + deflate";
else if (vpninfo->cstp_compr == COMPR_LZS)
compr = " + lzs";
else if (vpninfo->cstp_compr == COMPR_LZ4)
compr = " + lz4";
} else {
if (vpninfo->dtls_compr == COMPR_DEFLATE)
compr = " + deflate";
else if (vpninfo->dtls_compr == COMPR_LZS)
compr = " + lzs";
else if (vpninfo->dtls_compr == COMPR_LZ4)
compr = " + lz4";
}
vpn_progress(vpninfo, PRG_INFO,
_("Connected %s as %s%s%s, using %s%s\n"), openconnect_get_ifname(vpninfo),
Expand Down
6 changes: 6 additions & 0 deletions openconnect-internal.h
Expand Up @@ -142,7 +142,13 @@ struct pkt {

#define COMPR_DEFLATE (1<<0)
#define COMPR_LZS (1<<1)
#define COMPR_LZ4 (1<<2)

#ifdef HAVE_LZ4
#define COMPR_ALL (COMPR_DEFLATE | COMPR_LZS | COMPR_LZ4)
#else
#define COMPR_ALL (COMPR_DEFLATE | COMPR_LZS)
#endif

struct keepalive_info {
int dpd;
Expand Down

0 comments on commit 329991d

Please sign in to comment.