// L2TPNS Clustering Stuff
-char const *cvs_id_cluster = "$Id: cluster.c,v 1.10 2004/08/02 06:06:28 fred_nerk Exp $";
+char const *cvs_id_cluster = "$Id: cluster.c,v 1.15 2004/11/02 04:35:03 bodea Exp $";
#include <stdio.h>
#include <sys/file.h>
memcpy(&interface_addr, &ifr.ifr_addr, sizeof(interface_addr));
my_address = interface_addr.sin_addr.s_addr;
- // Join multicast group.
+ // Join multicast group.
mreq.imr_multiaddr.s_addr = config->cluster_address;
mreq.imr_interface = interface_addr.sin_addr;
- opt = 0; // Turn off multicast loopback.
+ opt = 0; // Turn off multicast loopback.
setsockopt(cluster_sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &opt, sizeof(opt));
if (setsockopt(cluster_sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
if (!config->cluster_address) return 0;
if (!peer) // Odd??
- return -1;
+ return -1;
addr.sin_addr.s_addr = peer;
addr.sin_port = htons(CLUSTERPORT);
// Forward a state changing packet to the master.
//
// The master just processes the payload as if it had
-// received it off the tap device.
+// received it off the tun device.
//
-int master_forward_packet(char * data, int size, u32 addr, int port)
+int master_forward_packet(char *data, int size, u32 addr, int port)
{
char buf[65536]; // Vast overkill.
- char * p = buf;
+ char *p = buf;
if (!config->cluster_master_address) // No election has been held yet. Just skip it.
return -1;
// token bucket queue, and lets normal processing take care
// of it.
//
-int master_throttle_packet(int tbfid, char * data, int size)
+int master_throttle_packet(int tbfid, char *data, int size)
{
char buf[65536]; // Vast overkill.
- char * p = buf;
+ char *p = buf;
if (!config->cluster_master_address) // No election has been held yet. Just skip it.
return -1;
//
// Walk the session counters looking for non-zero ones to send
-// to the master. We send up to 100 of them at one time.
-// We examine a maximum of 2000 sessions.
+// to the master. We send up to 600 of them at one time.
+// We examine a maximum of 3000 sessions.
// (50k max session should mean that we normally
// examine the entire session table every 25 seconds).
-#define MAX_B_RECS (400)
+#define MAX_B_RECS (600)
void master_update_counts(void)
{
int i, c;
//
void cluster_check_master(void)
{
- int i, count, tcount, high_sid = 0;
+ int i, count, tcount, high_unique_id = 0;
int last_free = 0;
clockt t = TIME;
static int probed = 0;
// Re-string the free list.
// Find the ID of the highest session.
last_free = 0;
- high_sid = 0;
+ high_unique_id = 0;
config->cluster_highest_sessionid = 0;
for (i = 0, count = 0; i < MAXSESSION; ++i) {
if (session[i].tunnel == T_UNDEF) {
session[i].radius = 0; // Reset authentication as the radius blocks aren't up to date.
- if (session[i].sid >= high_sid) // This is different to the index into the session table!!!
- high_sid = session[i].sid+1;
+ if (session[i].unique_id >= high_unique_id) // This is different to the index into the session table!!!
+ high_unique_id = session[i].unique_id+1;
session[i].tbf_in = session[i].tbf_out = 0; // Remove stale pointers from old master.
- throttle_session(i, session[i].throttle);
-
-// I'm unsure about this. --mo
-// It's potentially a good thing, but it could send a
-// LOT of packets.
-// if (session[i].throttle)
-// cluster_send_session(s); // Tell the slaves about the new tbf indexes.
+ throttle_session(i, session[i].throttle_in, session[i].throttle_out);
if (session[i].tunnel != T_FREE && i > config->cluster_highest_sessionid)
config->cluster_highest_sessionid = i;
-
}
session[last_free].next = 0; // End of chain.
- last_sid = high_sid; // Keep track of the highest used session ID.
+ last_id = high_unique_id; // Keep track of the highest used session ID.
become_master();
exit(1);
}
- log(3,0,0,0, "Sending heartbeat #%d with %d changes (%d x-sess, %d x-tunnels, %d highsess, %d hightun size %d)\n",
+ log(3,0,0,0, "Sending heartbeat #%d with %d changes (%d x-sess, %d x-tunnels, %d highsess, %d hightun, size %d)\n",
h.seq, config->cluster_num_changes, count, tcount, config->cluster_highest_sessionid,
config->cluster_highest_tunnelid, (p-buff));
return 0;
shortpacket:
- log(0,0,0,0, "I got an cluster heartbeat packet! This means I'm probably out of sync!!\n");
+ log(0,0,0,0, "I got a _short_ cluster heartbeat packet! This means I'm probably out of sync!!\n");
return -1;
}