{
int i;
- for (i = 0 ; i < config->cluster_num_changes ; ++i)
- if ( cluster_changes[i].id == id &&
- cluster_changes[i].type == type)
- return 0; // Already marked for change.
-
- cluster_changes[i].type = type;
- cluster_changes[i].id = id;
- ++config->cluster_num_changes;
-
- if (config->cluster_num_changes > MAX_CHANGES)
- cluster_heartbeat(); // flush now
-
- 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 ( cluster_changes[i].id == id && cluster_changes[i].type == type)
{
- if (session[i].tunnel != T_FREE)
- inew = i;
- else
- return 0; // This a free session no invert.
-
+ // 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;
}
}
- 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;
- }
- }
+ cluster_changes[config->cluster_num_changes].type = type;
+ cluster_changes[config->cluster_num_changes].id = id;
+ ++config->cluster_num_changes;
- return 0;
+ if (config->cluster_num_changes > MAX_CHANGES)
+ cluster_heartbeat(); // flush now
+
+ return 1;
}
// A particular session has been changed!
int cluster_init(void);
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_bundle(int bid);
int cluster_send_tunnel(int tid);
if (ip == session[i].ip)
{
- sessionkill(i, "Duplicate IP address");
- cluster_listinvert_session(s, i);
+ sessionshutdown(i, "Duplicate IP address", CDN_ADMIN_DISC, TERM_ADMIN_RESET); // close radius/routes, etc.
continue;
}
// Drop the new session in case of duplicate sessionss, not the old one.
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.
}
}