From 408c943518a335f3c5ccc1d55acc6e0654f5317d Mon Sep 17 00:00:00 2001 From: mtbishop Date: Sat, 7 Jul 2012 07:14:17 +0000 Subject: [PATCH] buy back from patch 2972369 (debian 339364) --- ChangeLog | 7 +++- Credits | 4 +++ cfg_file.y | 4 +-- lfd_lzo.c | 5 +-- linkfd.c | 95 +++++++++++++++++++++++++++++++--------------------- main.c | 4 +-- vtun.h | 4 +-- vtund.conf | 6 +++- vtund.conf.5 | 11 +++--- 9 files changed, 86 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index ed75979..1b32397 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,7 +3,12 @@ rfe2149137 - makefile ignores LDFLAGS (sbk) rfe2405993 - mem leak in config parser (frY) rfe1685781 - vtun3 server should offer vtun2-compatible encryption (if) - rfe3540779 - Parallel make Makefile.in race condition (pb) + pat3540779 - Parallel make Makefile.in race condition (pb) + pat2972369 - link timeout in UDP mode (Eugene Berdnikov - deb339364) + Minor fixes in lfd_lzo.c to ensure correct type casting + Add description of "keepalive timeout:count;" syntax + to man page and vtund.conf sample. + Remove doubled if(send_a_file){...} block in linkfd.c. 3.0.2: rfe1685781 - vtun3 client should parse vtun2 server encr directives (hch) diff --git a/Credits b/Credits index 9718ad2..c7a5e5c 100644 --- a/Credits +++ b/Credits @@ -152,3 +152,7 @@ Dragos Vingarzan Sergey Popov (Pinkbyte) <@pinkbyte.ru> Parallel make Makefile.in race condition (rfe3540779) + +Eugene Berdnikov + Link timeout in UDP mode (deb339364) + Types cleanup diff --git a/cfg_file.y b/cfg_file.y index d79c8cc..c308220 100644 --- a/cfg_file.y +++ b/cfg_file.y @@ -18,7 +18,7 @@ */ /* - * $Id: cfg_file.y,v 1.8.2.4 2010/04/14 08:48:09 mtbishop Exp $ + * $Id: cfg_file.y,v 1.8.2.5 2012/07/07 07:14:17 mtbishop Exp $ */ #include "config.h" @@ -377,7 +377,7 @@ keepalive: if( yylval.dnum.num1 ){ parse_host->flags |= VTUN_KEEP_ALIVE; parse_host->ka_interval = yylval.dnum.num1; - parse_host->ka_failure = yylval.dnum.num2; + parse_host->ka_maxfail = yylval.dnum.num2; } } diff --git a/lfd_lzo.c b/lfd_lzo.c index ce223d1..62186f2 100644 --- a/lfd_lzo.c +++ b/lfd_lzo.c @@ -17,7 +17,7 @@ */ /* - * $Id: lfd_lzo.c,v 1.5.2.3 2008/01/07 22:35:35 mtbishop Exp $ + * $Id: lfd_lzo.c,v 1.5.2.4 2012/07/07 07:14:17 mtbishop Exp $ */ /* LZO compression module */ @@ -35,6 +35,7 @@ #ifdef HAVE_LZO +#include "lzoutil.h" #include "lzo1x.h" #include "lzoutil.h" @@ -54,7 +55,7 @@ int (*lzo1x_compress)(const lzo_byte *src, lzo_uint src_len, int alloc_lzo(struct vtun_host *host) { int zlevel = host->zlevel ? host->zlevel : 1; - int mem; + lzo_uint mem; switch( zlevel ){ case 9: diff --git a/linkfd.c b/linkfd.c index d33bd49..ec39a08 100644 --- a/linkfd.c +++ b/linkfd.c @@ -17,7 +17,7 @@ */ /* - * $Id: linkfd.c,v 1.13.2.4 2009/03/29 10:08:54 mtbishop Exp $ + * $Id: linkfd.c,v 1.13.2.5 2012/07/07 07:14:17 mtbishop Exp $ */ #include "config.h" @@ -175,20 +175,38 @@ static void sig_hup(int sig) linker_term = VTUN_SIG_HUP; } -/* Statistic dump */ +/* Statistic dump and keep-alive monitor */ +static volatile sig_atomic_t ka_need_verify = 0; +static time_t stat_timer = 0, ka_timer = 0; + void sig_alarm(int sig) { - static time_t tm; + static time_t tm_old, tm = 0; static char stm[20]; - + + tm_old = tm; tm = time(NULL); - strftime(stm, sizeof(stm)-1, "%b %d %H:%M:%S", localtime(&tm)); - fprintf(lfd_host->stat.file,"%s %lu %lu %lu %lu\n", stm, - lfd_host->stat.byte_in, lfd_host->stat.byte_out, - lfd_host->stat.comp_in, lfd_host->stat.comp_out); - - alarm(VTUN_STAT_IVAL); -} + + if( (lfd_host->flags & VTUN_KEEP_ALIVE) && (ka_timer -= tm-tm_old) <= 0){ + ka_need_verify = 1; + ka_timer = lfd_host->ka_interval + + 1; /* We have to complete select() on idle */ + } + + if( (lfd_host->flags & VTUN_STAT) && (stat_timer -= tm-tm_old) <= 0){ + strftime(stm, sizeof(stm)-1, "%b %d %H:%M:%S", localtime(&tm)); + fprintf(lfd_host->stat.file,"%s %lu %lu %lu %lu\n", stm, + lfd_host->stat.byte_in, lfd_host->stat.byte_out, + lfd_host->stat.comp_in, lfd_host->stat.comp_out); + stat_timer = VTUN_STAT_IVAL; + } + + if ( ka_timer*stat_timer ){ + alarm( (ka_timer < stat_timer) ? ka_timer : stat_timer ); + } else { + alarm( (ka_timer) ? ka_timer : stat_timer ); + } +} static void sig_usr1(int sig) { @@ -238,6 +256,21 @@ int lfd_linker(void) else continue; } + + if( ka_need_verify ){ + if( idle > lfd_host->ka_maxfail ){ + vtun_syslog(LOG_INFO,"Session %s network timeout", lfd_host->host); + break; + } + if (idle++ > 0) { /* No input frames, check connection with ECHO */ + if( proto_write(fd1, buf, VTUN_ECHO_REQ) < 0 ){ + vtun_syslog(LOG_ERR,"Failed to send ECHO_REQ"); + break; + } + } + ka_need_verify = 0; + } + if (send_a_packet) { send_a_packet = 0; @@ -249,35 +282,11 @@ int lfd_linker(void) break; lfd_host->stat.comp_out += tmplen; } - if( !len ){ - if (send_a_packet) - { - send_a_packet = 0; - tmplen = 1; - lfd_host->stat.byte_out += tmplen; - if( (tmplen=lfd_run_down(tmplen,buf,&out)) == -1 ) - break; - if( tmplen && proto_write(fd1, out, tmplen) < 0 ) - break; - lfd_host->stat.comp_out += tmplen; - } - /* We are idle, lets check connection */ - if( lfd_host->flags & VTUN_KEEP_ALIVE ){ - if( ++idle > lfd_host->ka_failure ){ - vtun_syslog(LOG_INFO,"Session %s network timeout", lfd_host->host); - break; - } - /* Send ECHO request */ - if( proto_write(fd1, buf, VTUN_ECHO_REQ) < 0 ) - break; - } - continue; - } /* Read frames from network(fd1), decode and pass them to * the local device (fd2) */ if( FD_ISSET(fd1, &fdset) && lfd_check_up() ){ - idle = 0; + idle = 0; ka_need_verify = 0; if( (len=proto_read(fd1, buf)) <= 0 ) break; @@ -296,7 +305,7 @@ int lfd_linker(void) continue; } if( fl==VTUN_ECHO_REP ){ - /* Just ignore ECHO reply */ + /* Just ignore ECHO reply, ka_need_verify==0 already */ continue; } if( fl==VTUN_CONN_CLOSE ){ @@ -388,6 +397,15 @@ int linkfd(struct vtun_host *host) sa.sa_handler=sig_hup; sigaction(SIGHUP,&sa,&sa_oldhup); + /* Initialize keep-alive timer */ + if( host->flags & (VTUN_STAT|VTUN_KEEP_ALIVE) ){ + sa.sa_handler=sig_alarm; + sigaction(SIGALRM,&sa,NULL); + + alarm( (host->ka_interval < VTUN_STAT_IVAL) ? + host->ka_interval : VTUN_STAT_IVAL ); + } + /* Initialize statstic dumps */ if( host->flags & VTUN_STAT ){ char file[40]; @@ -400,7 +418,6 @@ int linkfd(struct vtun_host *host) sprintf(file,"%s/%.20s", VTUN_STAT_DIR, host->host); if( (host->stat.file=fopen(file, "a")) ){ setvbuf(host->stat.file, NULL, _IOLBF, 0); - alarm(VTUN_STAT_IVAL); } else vtun_syslog(LOG_ERR, "Can't open stats file %s", file); } @@ -409,7 +426,7 @@ int linkfd(struct vtun_host *host) lfd_linker(); - if( host->flags & VTUN_STAT ){ + if( host->flags & (VTUN_STAT|VTUN_KEEP_ALIVE) ){ alarm(0); if (host->stat.file) fclose(host->stat.file); diff --git a/main.c b/main.c index f828e50..33232c0 100644 --- a/main.c +++ b/main.c @@ -17,7 +17,7 @@ */ /* - * $Id: main.c,v 1.9.2.3 2009/03/29 10:08:57 mtbishop Exp $ + * $Id: main.c,v 1.9.2.4 2012/07/07 07:14:17 mtbishop Exp $ */ #include "config.h" @@ -86,7 +86,7 @@ int main(int argc, char *argv[], char *env[]) default_host.multi = VTUN_MULTI_ALLOW; default_host.timeout = VTUN_CONNECT_TIMEOUT; default_host.ka_interval = 30; - default_host.ka_failure = 4; + default_host.ka_maxfail = 4; default_host.loc_fd = default_host.rmt_fd = -1; /* Start logging to syslog and stderr */ diff --git a/vtun.h b/vtun.h index 132655a..f3d3cc9 100644 --- a/vtun.h +++ b/vtun.h @@ -17,7 +17,7 @@ */ /* - * $Id: vtun.h,v 1.12.2.4 2009/03/29 10:09:11 mtbishop Exp $ + * $Id: vtun.h,v 1.12.2.5 2012/07/07 07:14:17 mtbishop Exp $ */ #ifndef _VTUN_H @@ -107,7 +107,7 @@ struct vtun_host { /* Keep Alive */ int ka_interval; - int ka_failure; + int ka_maxfail; /* Source address */ struct vtun_addr src_addr; diff --git a/vtund.conf b/vtund.conf index bb5e359..31558f6 100644 --- a/vtund.conf +++ b/vtund.conf @@ -6,7 +6,7 @@ # Ted Rolle # # Configuration file example -# $Id: vtund.conf,v 1.4.2.4 2009/04/24 09:15:38 mtbishop Exp $ +# $Id: vtund.conf,v 1.4.2.5 2012/07/07 07:14:17 mtbishop Exp $ # # # Lines which begin with '#' are comments @@ -130,6 +130,10 @@ # keepalive - Enable 'yes' or disable 'no' connection # keep-alive. Ignored by the client. # +# May be in the form 'interval:count', where 'interval' is the +# period of connection checks and 'count' is the maximum number +# of retries. 'yes' is equivalent to '30:4'. +# # ----------- # timeout - Connect timeout. # diff --git a/vtund.conf.5 b/vtund.conf.5 index 55db911..9c1a729 100644 --- a/vtund.conf.5 +++ b/vtund.conf.5 @@ -1,5 +1,5 @@ .\" Manual page for vtund.conf -.\" $Id: vtund.conf.5,v 1.4.2.3 2009/04/24 09:15:41 mtbishop Exp $ +.\" $Id: vtund.conf.5,v 1.4.2.4 2012/07/07 07:14:17 mtbishop Exp $ .TH VTUND.CONF 5 .SH NAME @@ -237,10 +237,11 @@ AES cipher, 256 bit key, mode OFB .RE .IP This option is ignored by the client. - -.IP \fBkeepalive\ \fByes\fR|\fBno\fR -enable or disable connection keep-alive. -This option is ignored by the client. +.IP \fBkeepalive\ \fByes\fR|\fBno\fR|\fIinterval\fB:\fIcount\fR +enable or disable connection keep-alive. Time \fIinterval\fR is a period +between connection checks, in seconds, and \fIcount\fR is the maximum number +of retries (\fByes\fR = \fI30\fB:\fI4\fR). +This option is ignored by the server. .IP \fBstat\ \fByes\fR|\fBno\fR enable or disable statistics. If enabled \fBvtund\fR(8) will log statistic counters to /var/log/vtund/session_X every 5 minutes.