* Fri Mar 5 2004 David Parrish <david@dparrish.com> 1.1.0

- Change all strcpy() calls to strncpy() to avoid buffer overflow potential
- Add ICMP host unreachable support
- Logging to syslog if log_file = "syslog:facility"
- Now requires libcli 1.5
- All configuration moves to a config structure
- Ability to modify and write config on the fly through command-line interface
- Config file support is removed, and now handled by the cli
- Show hostname in cli prompt
- Keep current state type for tunnels
- Add uptime command do CLI, which also shows real-time bandwidth utilisation
- Add goodbye command to cluster master, which forces droppping a slave
- Cache IP address allocation, so that reconnecting users get the same address
- Fix tunnel resend timeouts, so that dead tunnels will be cleaned up
- Allocate tunnels and radius without using a linked list which had issues
- Fix some off-by-one errors in tunnel and session and radius arrays
- Save and reload ip address pool when dieing
- Check version and size of reloaded data when restarting
- Remove plugin_config support
- Remove old support for TBF which didn't work anyway. HTB is required to do throttling now.
- Add COPYING and Changes files
This commit is contained in:
fred_nerk 2004-03-05 00:09:03 +00:00
parent b8ae54f127
commit b43583c01d
22 changed files with 1731 additions and 1248 deletions

View file

@ -1,5 +1,5 @@
// L2TPNS Cluster Master
// $Id: cluster_slave.c,v 1.1 2003/12/16 07:07:39 fred_nerk Exp $
// $Id: cluster_slave.c,v 1.2 2004/03/05 00:09:03 fred_nerk Exp $
#include <stdio.h>
#include <netinet/in.h>
@ -19,16 +19,13 @@
#include "ll.h"
#include "util.h"
// vim: sw=4 ts=8
extern int cluster_sockfd;
extern tunnelt *tunnel;
extern sessiont *session;
extern uint32_t cluster_address;
extern char hostname[1000];
extern int debug;
extern ippoolt *ip_address_pool;
extern uint32_t vip_address;
extern tunnelidt tunnelfree;
extern sessionidt sessionfree;
extern struct configt *config;
int handle_tunnel(char *buf, int l);
int handle_session(char *buf, int l);
@ -78,6 +75,13 @@ int handle_tunnel(char *buf, int l)
{
int t;
// Ignore tunnel message if NOSTATEFILE exists
if (config->ignore_cluster_updates)
{
log(1, 0, 0, 0, "Discarding tunnel message from cluster master.\n", l, sizeof(tunnelt));
return 0;
}
t = *(int *)buf;
log(1, 0, 0, t, "Receiving tunnel %d from cluster master (%d bytes)\n", t, l);
buf += sizeof(int); l -= sizeof(int);
@ -94,16 +98,6 @@ int handle_tunnel(char *buf, int l)
return 0;
}
if (t > 1)
{
tunnel[t-1].next = tunnel[t].next;
}
if (tunnelfree == t)
{
tunnelfree = tunnel[t].next;
}
memcpy(&tunnel[t], buf, l);
log(3, 0, 0, t, "Cluster master sent tunnel for %s\n", tunnel[t].hostname);
@ -117,6 +111,13 @@ int handle_session(char *buf, int l)
{
int s;
// Ignore tunnel message if NOSTATEFILE exists
if (config->ignore_cluster_updates)
{
log(1, 0, 0, 0, "Discarding session message from cluster master.\n", l, sizeof(tunnelt));
return 0;
}
s = *(int *)buf;
log(1, 0, s, 0, "Receiving session %d from cluster master (%d bytes)\n", s, l);
buf += sizeof(int); l -= sizeof(int);
@ -163,6 +164,10 @@ int handle_session(char *buf, int l)
}
}
}
/*
if (session[s].servicenet)
servicenet_session(s, 1);
*/
return 0;
}
@ -214,7 +219,7 @@ int cluster_send_session(int s)
memcpy((char *)(packet + len), &session[s], sizeof(sessiont));
len += sizeof(sessiont);
cluster_send_message(cluster_address, vip_address, C_SESSION, packet, len);
cluster_send_message(config->cluster_address, vip_address, C_SESSION, packet, len);
free(packet);
return 1;
@ -241,7 +246,27 @@ int cluster_send_tunnel(int t)
memcpy((char *)(packet + len), &tunnel[t], sizeof(tunnelt));
len += sizeof(tunnelt);
cluster_send_message(cluster_address, vip_address, C_TUNNEL, packet, len);
cluster_send_message(config->cluster_address, vip_address, C_TUNNEL, packet, len);
free(packet);
return 1;
}
int cluster_send_goodbye()
{
char *packet;
int len = 0;
packet = malloc(4096);
log(2, 0, 0, 0, "Sending goodbye to cluster master\n");
// Hostname
len = strlen(hostname);
*(char *)packet = len;
memcpy((char *)(packet + 1), hostname, len);
len++;
cluster_send_message(config->cluster_address, vip_address, C_GOODBYE, packet, len);
free(packet);
return 1;