20
20
#include "network_traffic_filter.h"
21
21
#include "edge_utils_win32.h"
22
22
23
- /* heap allocation for compression as per lzo example doc */
24
- #define HEAP_ALLOC (var ,size ) lzo_align_t __LZO_MMODEL var [ ((size) + (sizeof(lzo_align_t) - 1)) / sizeof(lzo_align_t) ]
25
- static HEAP_ALLOC (wrkmem , LZO1X_1_MEM_COMPRESS ) ;
26
23
27
24
/* ************************************** */
28
25
@@ -391,13 +388,12 @@ n2n_edge_t* edge_init (const n2n_edge_conf_t *conf, int *rv) {
391
388
392
389
pearson_hash_init ();
393
390
394
- if (eee -> conf .compression == N2N_COMPRESSION_ID_LZO )
395
- if (lzo_init () != LZO_E_OK ) {
396
- traceEvent (TRACE_ERROR , "LZO compression error" );
397
- goto edge_init_error ;
398
- }
399
- #ifdef N2N_HAVE_ZSTD
400
- // zstd does not require initialization. if it were required, this would be a good place
391
+ // always initialize compression transforms so we can at least decompress
392
+ rc = n2n_transop_lzo_init (& eee -> conf , & eee -> transop_lzo );
393
+ if (rc ) goto edge_init_error ; /* error message is printed in lzo_init */
394
+ #ifdef HAVE_ZSTD
395
+ rc = n2n_transop_zstd_init (& eee -> conf , & eee -> transop_zstd );
396
+ if (rc ) goto edge_init_error ; /* error message is printed in zstd_init */
401
397
#endif
402
398
403
399
traceEvent (TRACE_NORMAL , "number of supernodes in the list: %d\n" , HASH_COUNT (eee -> conf .supernodes ));
@@ -1665,7 +1661,8 @@ static int handle_PACKET (n2n_edge_t * eee,
1665
1661
1666
1662
/* Handle transform. */
1667
1663
{
1668
- uint8_t decodebuf [N2N_PKT_BUF_SIZE ];
1664
+ uint8_t decode_buf [N2N_PKT_BUF_SIZE ];
1665
+ uint8_t deflate_buf [N2N_PKT_BUF_SIZE ];
1669
1666
size_t eth_size ;
1670
1667
n2n_transform_t rx_transop_id ;
1671
1668
uint8_t rx_compression_id ;
@@ -1675,35 +1672,31 @@ static int handle_PACKET (n2n_edge_t * eee,
1675
1672
1676
1673
if (rx_transop_id == eee -> conf .transop_id ) {
1677
1674
uint8_t is_multicast ;
1678
- eth_payload = decodebuf ;
1679
- eh = ( ether_hdr_t * ) eth_payload ;
1675
+ // decrypt
1676
+ eth_payload = decode_buf ;
1680
1677
eth_size = eee -> transop .rev (& eee -> transop ,
1681
1678
eth_payload , N2N_PKT_BUF_SIZE ,
1682
1679
payload , psize , pkt -> srcMac );
1683
1680
++ (eee -> transop .rx_cnt ); /* stats */
1684
1681
1685
1682
/* decompress if necessary */
1686
- uint8_t * deflation_buffer = 0 ;
1687
- lzo_uint deflated_len ;
1683
+ size_t deflate_len ;
1684
+
1688
1685
switch (rx_compression_id ) {
1689
1686
case N2N_COMPRESSION_ID_NONE :
1690
1687
break ; // continue afterwards
1691
1688
1692
1689
case N2N_COMPRESSION_ID_LZO :
1693
- deflation_buffer = malloc (N2N_PKT_BUF_SIZE );
1694
- lzo1x_decompress (eth_payload , eth_size , deflation_buffer , & deflated_len , NULL );
1690
+ deflate_len = eee -> transop_lzo .rev (& eee -> transop_lzo ,
1691
+ deflate_buf , N2N_PKT_BUF_SIZE ,
1692
+ decode_buf , eth_size , pkt -> srcMac );
1695
1693
break ;
1696
- #ifdef N2N_HAVE_ZSTD
1694
+
1695
+ #ifdef HAVE_ZSTD
1697
1696
case N2N_COMPRESSION_ID_ZSTD :
1698
- deflated_len = N2N_PKT_BUF_SIZE ;
1699
- deflation_buffer = malloc (deflated_len );
1700
- deflated_len = ZSTD_decompress (deflation_buffer , deflated_len , eth_payload , eth_size );
1701
- if (ZSTD_isError (deflated_len )) {
1702
- traceEvent (TRACE_WARNING , "payload decompression failed with zstd error '%s'." ,
1703
- ZSTD_getErrorName (deflated_len ));
1704
- free (deflation_buffer );
1705
- return (-1 ); // cannot help it
1706
- }
1697
+ deflate_len = eee -> transop_zstd .rev (& eee -> transop_zstd ,
1698
+ deflate_buf , N2N_PKT_BUF_SIZE ,
1699
+ decode_buf , eth_size , pkt -> srcMac );
1707
1700
break ;
1708
1701
#endif
1709
1702
default :
@@ -1714,11 +1707,11 @@ static int handle_PACKET (n2n_edge_t * eee,
1714
1707
1715
1708
if (rx_compression_id != N2N_COMPRESSION_ID_NONE ) {
1716
1709
traceEvent (TRACE_DEBUG , "payload decompression %s: deflated %u bytes to %u bytes" ,
1717
- compression_str (rx_compression_id ), eth_size , (int )deflated_len );
1718
- memcpy (eth_payload ,deflation_buffer , deflated_len );
1719
- eth_size = deflated_len ;
1720
- free (deflation_buffer );
1710
+ compression_str (rx_compression_id ), eth_size , (int )deflate_len );
1711
+ eth_payload = deflate_buf ;
1712
+ eth_size = deflate_len ;
1721
1713
}
1714
+ eh = (ether_hdr_t * )eth_payload ;
1722
1715
1723
1716
is_multicast = (is_ip6_discovery (eth_payload , eth_size ) || is_ethMulticast (eth_payload , eth_size ));
1724
1717
@@ -1729,6 +1722,7 @@ static int handle_PACKET (n2n_edge_t * eee,
1729
1722
/* Check if it is a routed packet */
1730
1723
1731
1724
if ((ntohs (eh -> type ) == 0x0800 ) && (eth_size >= ETH_FRAMESIZE + IP4_MIN_SIZE )) {
1725
+
1732
1726
uint32_t * dst = (uint32_t * )& eth_payload [ETH_FRAMESIZE + IP4_DSTOFFSET ];
1733
1727
uint8_t * dst_mac = (uint8_t * )eth_payload ;
1734
1728
@@ -1964,6 +1958,9 @@ void edge_send_packet2net (n2n_edge_t * eee,
1964
1958
n2n_mac_t destMac ;
1965
1959
n2n_common_t cmn ;
1966
1960
n2n_PACKET_t pkt ;
1961
+ uint8_t * enc_src = tap_pkt ;
1962
+ size_t enc_len = len ;
1963
+ uint8_t compression_buf [N2N_PKT_BUF_SIZE ];
1967
1964
uint8_t pktbuf [N2N_PKT_BUF_SIZE ];
1968
1965
size_t idx = 0 ;
1969
1966
n2n_transform_t tx_transop_idx = eee -> transop .transform_id ;
@@ -2013,49 +2010,42 @@ void edge_send_packet2net (n2n_edge_t * eee,
2013
2010
pkt .compression = N2N_COMPRESSION_ID_NONE ;
2014
2011
2015
2012
if (eee -> conf .compression ) {
2016
- uint8_t * compression_buffer = NULL ;
2017
2013
int32_t compression_len ;
2018
2014
2019
2015
switch (eee -> conf .compression ) {
2020
2016
case N2N_COMPRESSION_ID_LZO :
2021
- compression_buffer = malloc (len + len / 16 + 64 + 3 );
2022
- if (lzo1x_1_compress (tap_pkt , len , compression_buffer , (lzo_uint * )& compression_len , wrkmem ) == LZO_E_OK ) {
2023
- if (compression_len < len ) {
2024
- pkt .compression = N2N_COMPRESSION_ID_LZO ;
2025
- }
2017
+ compression_len = eee -> transop_lzo .fwd (& eee -> transop_lzo ,
2018
+ compression_buf , sizeof (compression_buf ),
2019
+ tap_pkt , len ,
2020
+ pkt .dstMac );
2021
+
2022
+ if ((compression_len > 0 ) && (compression_len < len )) {
2023
+ pkt .compression = N2N_COMPRESSION_ID_LZO ;
2026
2024
}
2027
2025
break ;
2028
- #ifdef N2N_HAVE_ZSTD
2026
+
2027
+ #ifdef HAVE_ZSTD
2029
2028
case N2N_COMPRESSION_ID_ZSTD :
2030
- compression_len = N2N_PKT_BUF_SIZE + 128 ;
2031
- compression_buffer = malloc (compression_len ); // leaves enough room, for exact size call compression_len = ZSTD_compressBound (len); (slower)
2032
- compression_len = (int32_t )ZSTD_compress (compression_buffer , compression_len , tap_pkt , len , ZSTD_COMPRESSION_LEVEL );
2033
- if (!ZSTD_isError (compression_len )) {
2034
- if (compression_len < len ) {
2035
- pkt .compression = N2N_COMPRESSION_ID_ZSTD ;
2036
- }
2037
- } else {
2038
- traceEvent (TRACE_ERROR , "payload compression failed with zstd error '%s'." ,
2039
- ZSTD_getErrorName (compression_len ));
2040
- free (compression_buffer );
2041
- // continue with unset without pkt.compression --> will send uncompressed
2029
+ compression_len = eee -> transop_zstd .fwd (& eee -> transop_zstd ,
2030
+ compression_buf , sizeof (compression_buf ),
2031
+ tap_pkt , len ,
2032
+ pkt .dstMac );
2033
+
2034
+ if ((compression_len > 0 ) && (compression_len < len )) {
2035
+ pkt .compression = N2N_COMPRESSION_ID_ZSTD ;
2042
2036
}
2043
2037
break ;
2044
2038
#endif
2039
+
2045
2040
default :
2046
2041
break ;
2047
2042
}
2048
2043
2049
2044
if (pkt .compression != N2N_COMPRESSION_ID_NONE ) {
2050
2045
traceEvent (TRACE_DEBUG , "payload compression [%s]: compressed %u bytes to %u bytes\n" ,
2051
2046
compression_str (pkt .compression ), len , compression_len );
2052
-
2053
- memcpy (tap_pkt , compression_buffer , compression_len );
2054
- len = compression_len ;
2055
- }
2056
-
2057
- if (compression_buffer ) {
2058
- free (compression_buffer );
2047
+ enc_src = compression_buf ;
2048
+ enc_len = compression_len ;
2059
2049
}
2060
2050
}
2061
2051
@@ -2066,7 +2056,7 @@ void edge_send_packet2net (n2n_edge_t * eee,
2066
2056
2067
2057
idx += eee -> transop .fwd (& eee -> transop ,
2068
2058
pktbuf + idx , N2N_PKT_BUF_SIZE - idx ,
2069
- tap_pkt , len , pkt .dstMac );
2059
+ enc_src , enc_len , pkt .dstMac );
2070
2060
2071
2061
traceEvent (TRACE_DEBUG , "encode PACKET of %u bytes, %u bytes data, %u bytes overhead, transform %u" ,
2072
2062
(u_int )idx , (u_int )len , (u_int )(idx - len ), tx_transop_idx );
@@ -2999,6 +2989,10 @@ void edge_term (n2n_edge_t * eee) {
2999
2989
clear_peer_list (& eee -> known_peers );
3000
2990
3001
2991
eee -> transop .deinit (& eee -> transop );
2992
+ eee -> transop_lzo .deinit (& eee -> transop_lzo );
2993
+ #ifdef HAVE_ZSTD
2994
+ eee -> transop_zstd .deinit (& eee -> transop_zstd );
2995
+ #endif
3002
2996
3003
2997
edge_cleanup_routes (eee );
3004
2998
0 commit comments