buy back from patch 2972369 (debian 339364)

This commit is contained in:
mtbishop 2012-07-07 07:14:17 +00:00
parent 868b4f7745
commit 408c943518
9 changed files with 86 additions and 54 deletions

View File

@ -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)

View File

@ -152,3 +152,7 @@ Dragos Vingarzan <dragos.vingarzan@gmail.com>
Sergey Popov (Pinkbyte) <@pinkbyte.ru>
Parallel make Makefile.in race condition (rfe3540779)
Eugene Berdnikov
Link timeout in UDP mode (deb339364)
Types cleanup

View File

@ -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;
}
}

View File

@ -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:

View File

@ -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);

4
main.c
View File

@ -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 */

4
vtun.h
View File

@ -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;

View File

@ -6,7 +6,7 @@
# Ted Rolle <ted@acacia.datacomm.com>
#
# 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.
#

View File

@ -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.