remove unmaintained "save_state" option
This commit is contained in:
parent
bdb517e525
commit
be29ef6cb2
7 changed files with 11 additions and 215 deletions
6
Changes
6
Changes
|
|
@ -1,11 +1,11 @@
|
||||||
* Tue Jan 25 2005 Brendan O'Dea <bod@optusnet.com.au> 2.1.0
|
* Wed Feb 9 2005 Brendan O'Dea <bod@optusnet.com.au> 2.1.0
|
||||||
- Add IPv6 support from Jonathan McDowell.
|
- Add IPv6 support from Jonathan McDowell.
|
||||||
- Add CHAP support from Jordan Hrycaj (work in progress).
|
- Add CHAP support from Jordan Hrycaj (work in progress).
|
||||||
- Sanity check that cluster_send_session is not called from a child
|
- Sanity check that cluster_send_session is not called from a child
|
||||||
process.
|
process.
|
||||||
- Throttle outgoing LASTSEEN packets to at most one per second for a
|
- Throttle outgoing LASTSEEN packets to at most one per second for a
|
||||||
given seq#.
|
given seq#.
|
||||||
- More DoS prevention: add packet_limit option to apply a hard limit
|
- More DoS prevention: add packet_limit option to apply a hard limit
|
||||||
to downstream packets per session.
|
to downstream packets per session.
|
||||||
- Use bounds-checking lookup functions for string constants.
|
- Use bounds-checking lookup functions for string constants.
|
||||||
- Add enum for RADIUS codes.
|
- Add enum for RADIUS codes.
|
||||||
|
|
@ -15,6 +15,8 @@
|
||||||
- Log "Accepted connection to CLI" at 4 when connection is from localhost
|
- Log "Accepted connection to CLI" at 4 when connection is from localhost
|
||||||
to reduce noise in logs.
|
to reduce noise in logs.
|
||||||
- Show time since last counter reset in "show counters".
|
- Show time since last counter reset in "show counters".
|
||||||
|
- Remove "save_state" option. Not maintained anymore; use clustering
|
||||||
|
to retain state across restarts.
|
||||||
|
|
||||||
* Fri Dec 17 2004 Brendan O'Dea <bod@optusnet.com.au> 2.0.13
|
* Fri Dec 17 2004 Brendan O'Dea <bod@optusnet.com.au> 2.0.13
|
||||||
- Better cluster master collision resolution: keep a counter of state
|
- Better cluster master collision resolution: keep a counter of state
|
||||||
|
|
|
||||||
|
|
@ -191,14 +191,6 @@ user, both a primary and a secondary. If either is set to 0.0.0.0, then that
|
||||||
one will not be sent.
|
one will not be sent.
|
||||||
</LI>
|
</LI>
|
||||||
|
|
||||||
<LI><B>save_state</B> (boolean)<BR>
|
|
||||||
When l2tpns receives a STGTERM it will write out its current
|
|
||||||
ip_address_pool, session and tunnel tables to disk prior to exiting to
|
|
||||||
be re-loaded at startup. The validity of this data is obviously quite
|
|
||||||
short and the intent is to allow an sessions to be retained over a
|
|
||||||
software upgrade.
|
|
||||||
</LI>
|
|
||||||
|
|
||||||
<LI><B>primary_radius</B> (ip address)
|
<LI><B>primary_radius</B> (ip address)
|
||||||
<LI><B>secondary_radius</B> (ip address)<BR>
|
<LI><B>secondary_radius</B> (ip address)<BR>
|
||||||
Sets the RADIUS servers used for both authentication and accounting.
|
Sets the RADIUS servers used for both authentication and accounting.
|
||||||
|
|
@ -692,14 +684,10 @@ killall -HUP l2tpns
|
||||||
|
|
||||||
The signals understood are:
|
The signals understood are:
|
||||||
<UL>
|
<UL>
|
||||||
<LI>SIGHUP - Reload the config from disk and re-open log file<P></LI>
|
<LI>SIGHUP - Reload the config from disk and re-open log file</LI>
|
||||||
<LI>SIGTERM / SIGINT - Shut down for a restart. This will dump the current
|
<LI>SIGTERM / SIGINT - Shut down.</LI>
|
||||||
state to disk (if <EM>save_state</EM> is set to true). Upon restart, the
|
|
||||||
process will read this saved state to resume active sessions.<P>
|
|
||||||
<LI>SIGQUIT - Shut down cleanly. This will send a disconnect message for
|
<LI>SIGQUIT - Shut down cleanly. This will send a disconnect message for
|
||||||
every active session and tunnel before shutting down. This is a good idea
|
every active session and tunnel before shutting down.</LI>
|
||||||
when upgrading the code, as no sessions will be left with the remote end
|
|
||||||
thinking they are open.</LI>
|
|
||||||
</UL>
|
</UL>
|
||||||
|
|
||||||
<H2 ID="Throttling">Throttling</H2>
|
<H2 ID="Throttling">Throttling</H2>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
.de Id
|
.de Id
|
||||||
.ds Dt \\$4 \\$5
|
.ds Dt \\$4 \\$5
|
||||||
..
|
..
|
||||||
.Id $Id: startup-config.5,v 1.4 2005-01-10 07:17:37 bodea Exp $
|
.Id $Id: startup-config.5,v 1.5 2005-02-09 00:16:21 bodea Exp $
|
||||||
.TH STARTUP-CONFIG 5 "\*(Dt" L2TPNS "File Formats and Conventions"
|
.TH STARTUP-CONFIG 5 "\*(Dt" L2TPNS "File Formats and Conventions"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
startup\-config \- configuration file for l2tpns
|
startup\-config \- configuration file for l2tpns
|
||||||
|
|
@ -63,14 +63,6 @@ Whenever a PPP connection is established, DNS servers will be sent to the
|
||||||
user, both a primary and a secondary. If either is set to 0.0.0.0, then that
|
user, both a primary and a secondary. If either is set to 0.0.0.0, then that
|
||||||
one will not be sent.
|
one will not be sent.
|
||||||
.TP
|
.TP
|
||||||
.B save_state
|
|
||||||
When
|
|
||||||
.B l2tpns
|
|
||||||
receives a STGTERM it will write out its current ip_address_pool,
|
|
||||||
session and tunnel tables to disk prior to exiting to be re-loaded at
|
|
||||||
startup. The validity of this data is obviously quite short and the
|
|
||||||
intent is to allow an sessions to be retained over a software upgrade.
|
|
||||||
.TP
|
|
||||||
.BR primary_radius , " secondary_radius"
|
.BR primary_radius , " secondary_radius"
|
||||||
Sets the RADIUS servers used for both authentication and accounting.
|
Sets the RADIUS servers used for both authentication and accounting.
|
||||||
If the primary server does not respond, then the secondary RADIUS
|
If the primary server does not respond, then the secondary RADIUS
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ set pid_file "/var/run/l2tpns.pid"
|
||||||
set l2tp_secret "secret"
|
set l2tp_secret "secret"
|
||||||
set primary_dns 1.2.3.4
|
set primary_dns 1.2.3.4
|
||||||
set secondary_dns 1.2.3.5
|
set secondary_dns 1.2.3.5
|
||||||
set save_state yes
|
|
||||||
set primary_radius 1.2.3.6
|
set primary_radius 1.2.3.6
|
||||||
set secondary_radius 1.2.3.7
|
set secondary_radius 1.2.3.7
|
||||||
set radius_accounting yes
|
set radius_accounting yes
|
||||||
|
|
|
||||||
186
l2tpns.c
186
l2tpns.c
|
|
@ -4,7 +4,7 @@
|
||||||
// Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced
|
// Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced
|
||||||
// vim: sw=8 ts=8
|
// vim: sw=8 ts=8
|
||||||
|
|
||||||
char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.81 2005-02-08 01:20:38 bodea Exp $";
|
char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.82 2005-02-09 00:16:17 bodea Exp $";
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
@ -106,7 +106,6 @@ config_descriptt config_values[] = {
|
||||||
CONFIG("l2tp_secret", l2tpsecret, STRING),
|
CONFIG("l2tp_secret", l2tpsecret, STRING),
|
||||||
CONFIG("primary_dns", default_dns1, IPv4),
|
CONFIG("primary_dns", default_dns1, IPv4),
|
||||||
CONFIG("secondary_dns", default_dns2, IPv4),
|
CONFIG("secondary_dns", default_dns2, IPv4),
|
||||||
CONFIG("save_state", save_state, BOOL),
|
|
||||||
CONFIG("primary_radius", radiusserver[0], IPv4),
|
CONFIG("primary_radius", radiusserver[0], IPv4),
|
||||||
CONFIG("secondary_radius", radiusserver[1], IPv4),
|
CONFIG("secondary_radius", radiusserver[1], IPv4),
|
||||||
CONFIG("primary_radius_port", radiusport[0], SHORT),
|
CONFIG("primary_radius_port", radiusport[0], SHORT),
|
||||||
|
|
@ -179,8 +178,6 @@ static void sigalrm_handler(int sig);
|
||||||
static void sigterm_handler(int sig);
|
static void sigterm_handler(int sig);
|
||||||
static void sigquit_handler(int sig);
|
static void sigquit_handler(int sig);
|
||||||
static void sigchild_handler(int sig);
|
static void sigchild_handler(int sig);
|
||||||
static void read_state(void);
|
|
||||||
static void dump_state(void);
|
|
||||||
static void build_chap_response(char *challenge, uint8_t id, uint16_t challenge_length, char **challenge_response);
|
static void build_chap_response(char *challenge, uint8_t id, uint16_t challenge_length, char **challenge_response);
|
||||||
static void update_config(void);
|
static void update_config(void);
|
||||||
static void read_config_file(void);
|
static void read_config_file(void);
|
||||||
|
|
@ -3637,8 +3634,6 @@ int main(int argc, char *argv[])
|
||||||
initrad();
|
initrad();
|
||||||
initippool();
|
initippool();
|
||||||
|
|
||||||
read_state();
|
|
||||||
|
|
||||||
signal(SIGHUP, sighup_handler);
|
signal(SIGHUP, sighup_handler);
|
||||||
signal(SIGTERM, sigterm_handler);
|
signal(SIGTERM, sigterm_handler);
|
||||||
signal(SIGINT, sigterm_handler);
|
signal(SIGINT, sigterm_handler);
|
||||||
|
|
@ -3730,9 +3725,6 @@ static void sigalrm_handler(int sig)
|
||||||
static void sigterm_handler(int sig)
|
static void sigterm_handler(int sig)
|
||||||
{
|
{
|
||||||
LOG(1, 0, 0, "Shutting down cleanly\n");
|
LOG(1, 0, 0, "Shutting down cleanly\n");
|
||||||
if (config->save_state)
|
|
||||||
dump_state();
|
|
||||||
|
|
||||||
main_quit++;
|
main_quit++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3765,182 +3757,6 @@ static void sigchild_handler(int sig)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void read_state()
|
|
||||||
{
|
|
||||||
struct stat sb;
|
|
||||||
int i;
|
|
||||||
ippoolt itmp;
|
|
||||||
FILE *f;
|
|
||||||
char magic[sizeof(DUMP_MAGIC) - 1];
|
|
||||||
uint32_t buf[2];
|
|
||||||
|
|
||||||
if (!config->save_state)
|
|
||||||
{
|
|
||||||
unlink(STATEFILE);
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stat(STATEFILE, &sb) < 0)
|
|
||||||
{
|
|
||||||
unlink(STATEFILE);
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sb.st_mtime < (time(NULL) - 60))
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "State file is too old to read, ignoring\n");
|
|
||||||
unlink(STATEFILE);
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
|
|
||||||
f = fopen(STATEFILE, "r");
|
|
||||||
unlink(STATEFILE);
|
|
||||||
|
|
||||||
if (!f)
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "Can't read state file: %s\n", strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fread(magic, sizeof(magic), 1, f) != 1 || strncmp(magic, DUMP_MAGIC, sizeof(magic)))
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "Bad state file magic\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG(1, 0, 0, "Reading state information\n");
|
|
||||||
if (fread(buf, sizeof(buf), 1, f) != 1 || buf[0] > MAXIPPOOL || buf[1] != sizeof(ippoolt))
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "Error/mismatch reading ip pool header from state file\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buf[0] > ip_pool_size)
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "ip pool has shrunk! state = %d, current = %d\n", buf[0], ip_pool_size);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG(2, 0, 0, "Loading %u ip addresses\n", buf[0]);
|
|
||||||
for (i = 0; i < buf[0]; i++)
|
|
||||||
{
|
|
||||||
if (fread(&itmp, sizeof(itmp), 1, f) != 1)
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "Error reading ip %d from state file: %s\n", i, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (itmp.address != ip_address_pool[i].address)
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "Mismatched ip %d from state file: pool may only be extended\n", i);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&ip_address_pool[i], &itmp, sizeof(itmp));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fread(buf, sizeof(buf), 1, f) != 1 || buf[0] != MAXTUNNEL || buf[1] != sizeof(tunnelt))
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "Error/mismatch reading tunnel header from state file\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG(2, 0, 0, "Loading %u tunnels\n", MAXTUNNEL);
|
|
||||||
if (fread(tunnel, sizeof(tunnelt), MAXTUNNEL, f) != MAXTUNNEL)
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "Error reading tunnel data from state file\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < MAXTUNNEL; i++)
|
|
||||||
{
|
|
||||||
tunnel[i].controlc = 0;
|
|
||||||
tunnel[i].controls = NULL;
|
|
||||||
tunnel[i].controle = NULL;
|
|
||||||
if (*tunnel[i].hostname)
|
|
||||||
LOG(3, 0, 0, "Created tunnel for %s\n", tunnel[i].hostname);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fread(buf, sizeof(buf), 1, f) != 1 || buf[0] != MAXSESSION || buf[1] != sizeof(sessiont))
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "Error/mismatch reading session header from state file\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG(2, 0, 0, "Loading %u sessions\n", MAXSESSION);
|
|
||||||
if (fread(session, sizeof(sessiont), MAXSESSION, f) != MAXSESSION)
|
|
||||||
{
|
|
||||||
LOG(0, 0, 0, "Error reading session data from state file\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < MAXSESSION; i++)
|
|
||||||
{
|
|
||||||
session[i].tbf_in = 0;
|
|
||||||
session[i].tbf_out = 0;
|
|
||||||
if (session[i].opened)
|
|
||||||
{
|
|
||||||
LOG(2, i, 0, "Loaded active session for user %s\n", session[i].user);
|
|
||||||
if (session[i].ip)
|
|
||||||
sessionsetup(session[i].tunnel, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(f);
|
|
||||||
LOG(0, 0, 0, "Loaded saved state information\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump_state()
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
uint32_t buf[2];
|
|
||||||
|
|
||||||
if (!config->save_state)
|
|
||||||
return;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if (!(f = fopen(STATEFILE, "w")))
|
|
||||||
break;
|
|
||||||
|
|
||||||
LOG(1, 0, 0, "Dumping state information\n");
|
|
||||||
|
|
||||||
if (fwrite(DUMP_MAGIC, sizeof(DUMP_MAGIC) - 1, 1, f) != 1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
LOG(2, 0, 0, "Dumping %u ip addresses\n", ip_pool_size);
|
|
||||||
buf[0] = ip_pool_size;
|
|
||||||
buf[1] = sizeof(ippoolt);
|
|
||||||
if (fwrite(buf, sizeof(buf), 1, f) != 1)
|
|
||||||
break;
|
|
||||||
if (fwrite(ip_address_pool, sizeof(ippoolt), ip_pool_size, f) != ip_pool_size)
|
|
||||||
break;
|
|
||||||
|
|
||||||
LOG(2, 0, 0, "Dumping %u tunnels\n", MAXTUNNEL);
|
|
||||||
buf[0] = MAXTUNNEL;
|
|
||||||
buf[1] = sizeof(tunnelt);
|
|
||||||
if (fwrite(buf, sizeof(buf), 1, f) != 1)
|
|
||||||
break;
|
|
||||||
if (fwrite(tunnel, sizeof(tunnelt), MAXTUNNEL, f) != MAXTUNNEL)
|
|
||||||
break;
|
|
||||||
|
|
||||||
LOG(2, 0, 0, "Dumping %u sessions\n", MAXSESSION);
|
|
||||||
buf[0] = MAXSESSION;
|
|
||||||
buf[1] = sizeof(sessiont);
|
|
||||||
if (fwrite(buf, sizeof(buf), 1, f) != 1)
|
|
||||||
break;
|
|
||||||
if (fwrite(session, sizeof(sessiont), MAXSESSION, f) != MAXSESSION)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (fclose(f) == 0)
|
|
||||||
return ; // OK
|
|
||||||
}
|
|
||||||
while (0);
|
|
||||||
|
|
||||||
LOG(0, 0, 0, "Can't write state information: %s\n", strerror(errno));
|
|
||||||
unlink(STATEFILE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void build_chap_response(char *challenge, uint8_t id, uint16_t challenge_length, char **challenge_response)
|
static void build_chap_response(char *challenge, uint8_t id, uint16_t challenge_length, char **challenge_response)
|
||||||
{
|
{
|
||||||
MD5_CTX ctx;
|
MD5_CTX ctx;
|
||||||
|
|
|
||||||
3
l2tpns.h
3
l2tpns.h
|
|
@ -1,5 +1,5 @@
|
||||||
// L2TPNS Global Stuff
|
// L2TPNS Global Stuff
|
||||||
// $Id: l2tpns.h,v 1.54 2005-01-25 04:19:05 bodea Exp $
|
// $Id: l2tpns.h,v 1.55 2005-02-09 00:16:19 bodea Exp $
|
||||||
|
|
||||||
#ifndef __L2TPNS_H__
|
#ifndef __L2TPNS_H__
|
||||||
#define __L2TPNS_H__
|
#define __L2TPNS_H__
|
||||||
|
|
@ -470,7 +470,6 @@ typedef struct
|
||||||
unsigned long rl_rate; // default throttle rate
|
unsigned long rl_rate; // default throttle rate
|
||||||
int num_tbfs; // number of throttle buckets
|
int num_tbfs; // number of throttle buckets
|
||||||
|
|
||||||
int save_state;
|
|
||||||
char accounting_dir[128];
|
char accounting_dir[128];
|
||||||
in_addr_t bind_address;
|
in_addr_t bind_address;
|
||||||
in_addr_t peer_address;
|
in_addr_t peer_address;
|
||||||
|
|
|
||||||
|
|
@ -43,5 +43,5 @@ rm -rf %{buildroot}
|
||||||
%attr(644,root,root) /usr/share/man/man[58]/*
|
%attr(644,root,root) /usr/share/man/man[58]/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Tue Jan 25 2005 Brendan O'Dea <bod@optusnet.com.au> 2.1.0-1
|
* Wed Feb 9 2005 Brendan O'Dea <bod@optusnet.com.au> 2.1.0-1
|
||||||
- 2.1.0 release, see /usr/share/doc/l2tpns-2.1.0/Changes
|
- 2.1.0 release, see /usr/share/doc/l2tpns-2.1.0/Changes
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue