Fix: inverted delete/add routes in cluster mode
[l2tpns.git] / cluster.c
index cf65972..78de01b 100644 (file)
--- a/cluster.c
+++ b/cluster.c
@@ -1018,54 +1018,27 @@ static int type_changed(int type, int id)
 {
        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!