1 /*
2  *  OpenVPN -- An application to securely tunnel IP networks
3  *             over a single UDP port, with support for SSL/TLS-based
4  *             session authentication and key exchange,
5  *             packet encryption, packet authentication, and
6  *             packet compression.
7  *
8  *  Copyright (C) 2002-2018 OpenVPN Inc <sales@openvpn.net>
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License version 2
12  *  as published by the Free Software Foundation.
13  *
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License along
20  *  with this program; if not, write to the Free Software Foundation, Inc.,
21  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  */
23 
24 #ifndef OPENVPN_LZO_H
25 #define OPENVPN_LZO_H
26 
27 
28 /**
29  * @file
30  * Data Channel Compression module header file.
31  */
32 
33 
34 #if defined(ENABLE_LZO)
35 
36 /**
37  * @addtogroup compression
38  * @{
39  */
40 
41 #if defined(HAVE_LZO_LZOUTIL_H)
42 #include <lzo/lzoutil.h>
43 #elif defined(HAVE_LZOUTIL_H)
44 #include <lzoutil.h>
45 #endif
46 #if defined(HAVE_LZO_LZO1X_H)
47 #include <lzo/lzo1x.h>
48 #elif defined(HAVE_LZO1X_H)
49 #include <lzo1x.h>
50 #endif
51 
52 #include "buffer.h"
53 #include "mtu.h"
54 #include "common.h"
55 #include "status.h"
56 
57 extern const struct compress_alg lzo_alg;
58 
59 /**************************************************************************/
60 /** @name LZO library interface defines *//** @{ *//***********************/
61 #define LZO_COMPRESS    lzo1x_1_15_compress
62 /**< LZO library compression function.
63  *
64  *   Use \c lzo1x_1_15_compress because it
65  *   is described as faster than the
66  *   standard routine, although it does
67  *   need a bit more memory. */
68 #define LZO_WORKSPACE   LZO1X_1_15_MEM_COMPRESS
69 /**< The size in bytes of the memory
70  *   %buffer required by the LZO library
71  *   compression algorithm. */
72 #define LZO_DECOMPRESS  lzo1x_decompress_safe
73 /**< LZO library decompression function.
74  *
75  *   Use safe decompress because it
76  *   includes checks for possible %buffer
77  *   overflows. If speed is essential and
78  *   you will always be using a MAC to
79  *   verify the integrity of incoming
80  *   packets, you might want to consider
81  *   using the non-safe version. */
82 /** @} name LZO library interface *//**************************************/
83 
84 
85 /**************************************************************************/
86 /** @name Adaptive compression defines *//** @{ *//************************/
87 #define AC_SAMP_SEC    2        /**< Number of seconds in a sample period. */
88 #define AC_MIN_BYTES   1000     /**< Minimum number of bytes a sample
89                                  *   period must contain for it to be
90                                  *   evaluated. */
91 #define AC_SAVE_PCT    5        /**< Minimum size reduction percentage
92                                  *   below which compression will be
93                                  *   turned off. */
94 #define AC_OFF_SEC     60       /**< Seconds to wait after compression has
95                                  *   been turned off before retesting. */
96 /** @} name Adaptive compression defines *//*******************************/
97 
98 /**
99  * Adaptive compression state.
100  */
101 struct lzo_adaptive_compress {
102     bool compress_state;
103     time_t next;
104     int n_total;
105     int n_comp;
106 };
107 
108 
109 /**
110  * State for the compression and decompression routines.
111  *
112  * This structure contains compression module state, such as whether
113  * compression is enabled and the status of the adaptive compression
114  * routines.  It also contains an allocated working buffer.
115  *
116  * One of these compression workspace structures is maintained for each
117  * VPN tunnel.
118  */
119 struct lzo_compress_workspace
120 {
121     lzo_voidp wmem;
122     int wmem_size;
123     struct lzo_adaptive_compress ac;
124 };
125 
126 /** @} addtogroup compression */
127 
128 
129 #endif /* ENABLE_LZO && USE_COMP */
130 #endif /* ifndef OPENVPN_LZO_H */
131