Fix: inverted delete/add routes in cluster mode
This commit is contained in:
parent
d547c00f76
commit
caa9662496
4 changed files with 16 additions and 44 deletions
53
cluster.c
53
cluster.c
|
|
@ -1019,12 +1019,20 @@ static int type_changed(int type, int id)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0 ; i < config->cluster_num_changes ; ++i)
|
for (i = 0 ; i < config->cluster_num_changes ; ++i)
|
||||||
if ( cluster_changes[i].id == id &&
|
{
|
||||||
cluster_changes[i].type == type)
|
if ( cluster_changes[i].id == id && cluster_changes[i].type == type)
|
||||||
return 0; // Already marked for change.
|
{
|
||||||
|
// Already marked for change, remove it
|
||||||
|
--config->cluster_num_changes;
|
||||||
|
memmove(&cluster_changes[i],
|
||||||
|
&cluster_changes[i+1],
|
||||||
|
(config->cluster_num_changes - i) * sizeof(cluster_changes[i]));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cluster_changes[i].type = type;
|
cluster_changes[config->cluster_num_changes].type = type;
|
||||||
cluster_changes[i].id = id;
|
cluster_changes[config->cluster_num_changes].id = id;
|
||||||
++config->cluster_num_changes;
|
++config->cluster_num_changes;
|
||||||
|
|
||||||
if (config->cluster_num_changes > MAX_CHANGES)
|
if (config->cluster_num_changes > MAX_CHANGES)
|
||||||
|
|
@ -1033,41 +1041,6 @@ static int type_changed(int type, int id)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The deleted session, must be before the new session
|
|
||||||
int cluster_listinvert_session(int sidnew, int sidtodel)
|
|
||||||
{
|
|
||||||
int i, inew = 0;
|
|
||||||
|
|
||||||
for (i = 0 ; i < config->cluster_num_changes ; ++i)
|
|
||||||
{
|
|
||||||
if ( cluster_changes[i].id == sidtodel && cluster_changes[i].type == C_CSESSION)
|
|
||||||
return 0; // Deleted session already before the new session.
|
|
||||||
|
|
||||||
if ( cluster_changes[i].id == sidnew && cluster_changes[i].type == C_CSESSION)
|
|
||||||
{
|
|
||||||
if (session[i].tunnel != T_FREE)
|
|
||||||
inew = i;
|
|
||||||
else
|
|
||||||
return 0; // This a free session no invert.
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( ; i < config->cluster_num_changes ; ++i)
|
|
||||||
{
|
|
||||||
if ( cluster_changes[i].id == sidtodel && cluster_changes[i].type == C_CSESSION)
|
|
||||||
{
|
|
||||||
// Reverse position
|
|
||||||
cluster_changes[i].id = sidnew;
|
|
||||||
cluster_changes[inew].id = sidtodel;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// A particular session has been changed!
|
// A particular session has been changed!
|
||||||
int cluster_send_session(int sid)
|
int cluster_send_session(int sid)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,6 @@ typedef struct {
|
||||||
|
|
||||||
int cluster_init(void);
|
int cluster_init(void);
|
||||||
int processcluster(uint8_t *buf, int size, in_addr_t addr);
|
int processcluster(uint8_t *buf, int size, in_addr_t addr);
|
||||||
int cluster_listinvert_session(int sidnew, int sidtodel);
|
|
||||||
int cluster_send_session(int sid);
|
int cluster_send_session(int sid);
|
||||||
int cluster_send_bundle(int bid);
|
int cluster_send_bundle(int bid);
|
||||||
int cluster_send_tunnel(int tid);
|
int cluster_send_tunnel(int tid);
|
||||||
|
|
|
||||||
5
l2tpns.c
5
l2tpns.c
|
|
@ -5548,8 +5548,7 @@ int sessionsetup(sessionidt s, tunnelidt t)
|
||||||
|
|
||||||
if (ip == session[i].ip)
|
if (ip == session[i].ip)
|
||||||
{
|
{
|
||||||
sessionkill(i, "Duplicate IP address");
|
sessionshutdown(i, "Duplicate IP address", CDN_ADMIN_DISC, TERM_ADMIN_RESET); // close radius/routes, etc.
|
||||||
cluster_listinvert_session(s, i);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5570,7 +5569,7 @@ int sessionsetup(sessionidt s, tunnelidt t)
|
||||||
|
|
||||||
// Drop the new session in case of duplicate sessionss, not the old one.
|
// Drop the new session in case of duplicate sessionss, not the old one.
|
||||||
if (!strcasecmp(user, session[i].user))
|
if (!strcasecmp(user, session[i].user))
|
||||||
sessionkill(i, "Duplicate session for users");
|
sessionshutdown(i, "Duplicate session for users", CDN_ADMIN_DISC, TERM_ADMIN_RESET); // close radius/routes, etc.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
1
pppoe.c
1
pppoe.c
|
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Fernando ALVES 2013
|
* Fernando ALVES 2013
|
||||||
* Add functionality "server pppoe" to l2tpns.
|
* Add functionality "server pppoe" to l2tpns.
|
||||||
|
* inspiration pppoe.c of accel-ppp
|
||||||
* GPL licenced
|
* GPL licenced
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue