From 76ae461853c7ac6e101704f6e6fd41dc520e9921 Mon Sep 17 00:00:00 2001 From: Fernando Alves Date: Mon, 20 Feb 2012 20:50:57 +0100 Subject: [PATCH] Add a echo_timeout configuration option. Add a idle_echo_timeout configuration option. --- Docs/manual.html | 11 +++++++++++ debian/changelog | 7 +++++++ etc/startup-config.default | 5 +++++ l2tpns.c | 17 +++++++++++------ l2tpns.h | 6 +++++- ppp.c | 11 +++++++---- 6 files changed, 46 insertions(+), 11 deletions(-) diff --git a/Docs/manual.html b/Docs/manual.html index 5c830f2..e3e19db 100644 --- a/Docs/manual.html +++ b/Docs/manual.html @@ -357,6 +357,17 @@ from the master. Determines the minumum number of up to date slaves required before the master will drop routes (default: 1). + +
  • echo_timeout (int)
    +Time between last packet sent and LCP ECHO generation +(default: 10 (seconds)). +
  • + +
  • idle_echo_timeout (int)
    +Drop sessions who have not responded within idle_echo_timeout seconds +(default: 240 (seconds)) +
  • +

    BGP routing configuration is entered by the command: diff --git a/debian/changelog b/debian/changelog index b2a890f..6753f07 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +l2tpns (2.2.1-2fdn1.4) unstable; urgency=low + + * Add a echo_timeout configuration option. + * Add a idle_echo_timeout configuration option. + + -- Fernando Alves Mon, 20 Feb 2012 20:47:52 +0100 + l2tpns (2.2.1-2fdn1.3) unstable; urgency=low * Fix: Sends small packets in the MPPPP frame (for reorder). diff --git a/etc/startup-config.default b/etc/startup-config.default index f86e2aa..f253f57 100644 --- a/etc/startup-config.default +++ b/etc/startup-config.default @@ -112,6 +112,11 @@ set accounting_dir "/var/run/l2tpns/acct" #set nexthop 10.0.1.1 #set nexthop6 2001:db8::1 +# Time between last packet sent and LCP ECHO generation (default 10 seconds) +#set echo_timeout 10 +# Drop sessions who have not responded within idle_echo_timeout seconds (default 240 seconds) +#set idle_echo_timeout 240 + # Drop/kill sessions #load plugin "sessionctl" diff --git a/l2tpns.c b/l2tpns.c index d8bedee..8640c8b 100644 --- a/l2tpns.c +++ b/l2tpns.c @@ -162,6 +162,8 @@ config_descriptt config_values[] = { CONFIG("hostname", hostname, STRING), CONFIG("nexthop_address", nexthop_address, IPv4), CONFIG("nexthop6_address", nexthop6_address, IPv6), + CONFIG("echo_timeout", echo_timeout, INT), + CONFIG("idle_echo_timeout", idle_echo_timeout, INT), { NULL, 0, 0, 0 }, }; @@ -244,7 +246,7 @@ static clockt now(double *f) // Time in milliseconds time_now_ms = (t.tv_sec * 1000) + (t.tv_usec/1000); - + return (t.tv_sec - basetime) * 10 + t.tv_usec / 100000 + 1; } @@ -1498,7 +1500,7 @@ static void processipout(uint8_t *buf, int len) t = session[s].tunnel; sp = &session[s]; LOG(4, s, t, "MPPP: (1)Session number becomes: %d\n", s); - + if (num_of_links > 1) { if(len > MINFRAGLEN) @@ -1523,7 +1525,7 @@ static void processipout(uint8_t *buf, int len) remain -= fraglen; while (remain > last_fraglen) - { + { b->current_ses = (b->current_ses + 1) % num_of_links; s = members[b->current_ses]; t = session[s].tunnel; @@ -3481,8 +3483,8 @@ static void regular_cleanups(double period) } } - // Drop sessions who have not responded within IDLE_TIMEOUT seconds - if (session[s].last_packet && (time_now - session[s].last_packet >= IDLE_TIMEOUT)) + // Drop sessions who have not responded within IDLE_ECHO_TIMEOUT seconds + if (session[s].last_packet && (time_now - session[s].last_packet >= config->idle_echo_timeout)) { sessionshutdown(s, "No response to LCP ECHO requests.", CDN_ADMIN_DISC, TERM_LOST_SERVICE); STAT(session_timeout); @@ -3491,7 +3493,7 @@ static void regular_cleanups(double period) } // No data in ECHO_TIMEOUT seconds, send LCP ECHO - if (session[s].ppp.phase >= Establish && (time_now - session[s].last_packet >= ECHO_TIMEOUT) && + if (session[s].ppp.phase >= Establish && (time_now - session[s].last_packet >= config->echo_timeout) && (time_now - sess_local[s].last_echo >= ECHO_TIMEOUT)) { uint8_t b[MAXETHER]; @@ -4267,6 +4269,9 @@ static void initdata(int optdebug, char *optconfig) config->ppp_max_failure = 5; config->kill_timedout_sessions = 1; strcpy(config->random_device, RANDOMDEVICE); + // Set default value echo_timeout and idle_echo_timeout + config->echo_timeout = ECHO_TIMEOUT; + config->idle_echo_timeout = IDLE_ECHO_TIMEOUT; log_stream = stderr; diff --git a/l2tpns.h b/l2tpns.h index 285e643..8ac2583 100644 --- a/l2tpns.h +++ b/l2tpns.h @@ -49,7 +49,7 @@ #define RINGBUFFER_SIZE 10000 // Number of ringbuffer entries to allocate #define MAX_LOG_LENGTH 512 // Maximum size of log message #define ECHO_TIMEOUT 10 // Time between last packet sent and LCP ECHO generation -#define IDLE_TIMEOUT 240 // Time between last packet seen and session shutdown +#define IDLE_ECHO_TIMEOUT 240 // Time between last packet seen and session shutdown #define BUSY_WAIT_TIME 3000 // 5 minutes in 1/10th seconds to wait for radius to cleanup on shutdown #define MP_BEGIN 0x80 // This value is used when (b)egin bit is set in MP header @@ -746,6 +746,10 @@ typedef struct in_addr_t nexthop_address; struct in6_addr nexthop6_address; #endif + + int echo_timeout; // Time between last packet sent and LCP ECHO generation + int idle_echo_timeout; // Time between last packet seen and + // Drop sessions who have not responded within IDLE_ECHO_TIMEOUT seconds } configt; enum config_typet { INT, STRING, UNSIGNED_LONG, SHORT, BOOL, IPv4, IPv6 }; diff --git a/ppp.c b/ppp.c index 7251e94..f9a60ac 100644 --- a/ppp.c +++ b/ppp.c @@ -1879,9 +1879,12 @@ void processmpin(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l) // calculate the jitter average uint32_t ljitter = time_now_ms - sess_local[s].prev_time; - sess_local[s].jitteravg = (sess_local[s].jitteravg + ljitter)>>1; - sess_local[s].prev_time = time_now_ms; - + if (ljitter > 0) + { + sess_local[s].jitteravg = (sess_local[s].jitteravg + ljitter)>>1; + sess_local[s].prev_time = time_now_ms; + } + uint32_t Mmin; if (seq_num < this_fragmentation->M) @@ -2084,7 +2087,7 @@ find_frame: } assembling_frame: - // try to assemble the frame that has the received fragment as a member + // try to assemble the frame that has the received fragment as a member // get the beginning of this frame begin_index = end_index = this_fragmentation->start_index; if (this_fragmentation->fragment[begin_index].length) -- 2.20.1