updates.
authorPekka Riikonen <priikone@silcnet.org>
Mon, 15 Oct 2001 18:28:14 +0000 (18:28 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Mon, 15 Oct 2001 18:28:14 +0000 (18:28 +0000)
CHANGES
TODO
apps/silcd/packet_receive.c
apps/silcd/server.c
apps/silcd/server_backup.c
apps/silcd/server_util.c
apps/silcd/server_util.h
doc/examples/cell3_server1.conf

diff --git a/CHANGES b/CHANGES
index 0b381330e14da63beaeb4a9f2fd724916d3cfcf4..385fc821514d9197b1d88db68be4e4f84c117a51 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -14,6 +14,15 @@ Mon Oct 15 17:42:55 EDT 2001  Pekka Riikonen <priikone@silcnet.org>
          This fixes backup router resuming protocol.  Affected file
          silcd/server_util.c.
 
+       * Decrease channel statistics count only if the channel
+         deletion worked.  Affected files are silcd/server.c and
+         silcd/server_util.c.
+
+       * Added silc_server_update_servers_by_server to update origin
+         of all server entries.  Used during backup router protocol.
+         Affected files silcd/server_util.[ch], silcd/server.c. and
+         silcd/backup_router.c.
+
 Sun Oct 14 18:28:22 EDT 2001  Pekka Riikonen <priikone@silcnet.org>
 
        * Assure that router cannot reroute the same channel message
diff --git a/TODO b/TODO
index 0a37eb5d5f6760a916d91df9050d2dd358bb234c..ead9982760eefb48e633b711adb7699db0c5075d 100644 (file)
--- a/TODO
+++ b/TODO
@@ -48,12 +48,16 @@ TODO/bugs In SILC Server
 
  o Server signoff notifys does not go to normal servers from routers.
 
- o On normal server the channel count can go negative (like -3 channels).
+ o Channel user mode changes are notified unnecessarely when switching
+   to backup router on router crash.
 
  o Change the sever to connect to another server from low ports (706)
    and not from high ports.  Currently we cannot do incoming connection
    checking by remote port because the port is not fixed.
 
+ o Announcements are incomplete: channel topics are not announced,
+   user modes (UMODE) are not announced.
+
  o Add a timeout to handling incoming JOIN commands.  It should be 
    enforced that JOIN command is executed only once in a second or two
    seconds.  Now it is possible to accept n incoming JOIN commands
@@ -84,9 +88,6 @@ TODO/bugs In SILC Server
    returns only the channels the server knows about.  The protocol spec
    does not prohibit of sending the LIST to the router.
 
- o Announcements are incomplete: channel topics are not announced,
-   user modes (UMODE) are not announced.
-
  o Incomplete IPv6 support:
 
        o silcd/serverid.c and its routines supports only IPv4.
index 0717c8ca0f6cff1ff1b729e848cf0481969d5e25..cef910174d70058077bdb206a7eed7e4719626fd 100644 (file)
@@ -1805,8 +1805,11 @@ static void silc_server_new_id_real(SilcServer server,
     router_sock = sock;
     router = sock->user_data;
 
+    /* If the sender is backup router and ID is server (and we are not
+       backup router) then switch the entry to global list. */
     if (server_entry->server_type == SILC_BACKUP_ROUTER && 
-       id_type == SILC_ID_SERVER) {
+       id_type == SILC_ID_SERVER && 
+       server->id_entry->server_type != SILC_BACKUP_ROUTER) {
       id_list = server->global_list;
       router_sock = server->router ? server->router->connection : sock;
     }
index a9395e399db27012da1c771ea50dd1b3624c017f..0822bec5ebff480bb5a517c070ff59ab3b5f1236 100644 (file)
@@ -312,6 +312,7 @@ int silc_server_init(SilcServer server)
       if (ptr->backup_router) {
        server->server_type = SILC_BACKUP_ROUTER;
        server->backup_router = TRUE;
+       server->id_entry->server_type = SILC_BACKUP_ROUTER;
        break;
       }
       ptr = ptr->next;
@@ -2401,6 +2402,7 @@ void silc_server_free_sock_user_data(SilcServer server,
           by the primary router and went down with the router.  */
        silc_server_update_clients_by_server(server, user_data, backup_router,
                                             TRUE, TRUE);
+       silc_server_update_servers_by_server(server, user_data, backup_router);
       }
 
       /* Free the server entry */
@@ -2488,8 +2490,9 @@ void silc_server_remove_from_channels(SilcServer server,
       if (channel->rekey)
        silc_schedule_task_del_by_context(server->schedule, channel->rekey);
       if (silc_idlist_del_channel(server->local_list, channel))
-      server->stat.my_channels--;
-       silc_idlist_del_channel(server->global_list, channel);
+       server->stat.my_channels--;
+      else if (silc_idlist_del_channel(server->global_list, channel))
+       server->stat.my_channels--;
       continue;
     }
 
@@ -2538,9 +2541,10 @@ void silc_server_remove_from_channels(SilcServer server,
       }
 
       /* Remove the channel entry */
-      if (!silc_idlist_del_channel(server->local_list, channel))
-       silc_idlist_del_channel(server->global_list, channel);
-      server->stat.my_channels--;
+      if (silc_idlist_del_channel(server->local_list, channel))
+       server->stat.my_channels--;
+      else if (silc_idlist_del_channel(server->global_list, channel))
+       server->stat.my_channels--;
       continue;
     }
 
@@ -2605,10 +2609,11 @@ int silc_server_remove_from_one_channel(SilcServer server,
       silc_hash_table_count(channel->user_list) < 2) {
     if (channel->rekey)
       silc_schedule_task_del_by_context(server->schedule, channel->rekey);
-    if (!silc_idlist_del_channel(server->local_list, channel))
-      silc_idlist_del_channel(server->global_list, channel);
+    if (silc_idlist_del_channel(server->local_list, channel))
+      server->stat.my_channels--;
+    else if (silc_idlist_del_channel(server->global_list, channel))
+      server->stat.my_channels--;
     silc_buffer_free(clidp);
-    server->stat.my_channels--;
     return FALSE;
   }
 
@@ -2656,9 +2661,10 @@ int silc_server_remove_from_one_channel(SilcServer server,
     }
 
     /* Remove the channel entry */
-    if (!silc_idlist_del_channel(server->local_list, channel))
-      silc_idlist_del_channel(server->global_list, channel);
-    server->stat.my_channels--;
+    if (silc_idlist_del_channel(server->local_list, channel))
+      server->stat.my_channels--;
+    else if (silc_idlist_del_channel(server->global_list, channel))
+      server->stat.my_channels--;
     return FALSE;
   }
 
index 31cd6efddb1ee0d404f84e18b5470ab410874eba..d782297a5b133a94899576fb0ec2e4ab04074e3a 100644 (file)
@@ -1106,6 +1106,7 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_protocol_backup)
           router */
        silc_server_update_clients_by_server(server, backup_router,
                                             router, TRUE, FALSE);
+       silc_server_update_servers_by_server(server, backup_router, router);
        silc_server_backup_replaced_del(server, backup_router);
        silc_server_backup_add(server, backup_router, 
                               ctx->sock->ip, ctx->sock->port,
index 30c9e157eebaebd1015ec5847fb24b8d2b825213..8184b2e728162d45bb95597144b88a3c93516830 100644 (file)
@@ -62,9 +62,10 @@ static void silc_server_remove_clients_channels(SilcServer server,
       if (channel->rekey)
        silc_schedule_task_del_by_context(server->schedule, channel->rekey);
 
-      if (!silc_idlist_del_channel(server->local_list, channel))
-       silc_idlist_del_channel(server->global_list, channel);
-      server->stat.my_channels--;
+      if (silc_idlist_del_channel(server->local_list, channel))
+       server->stat.my_channels--;
+      else if (silc_idlist_del_channel(server->global_list, channel))
+       server->stat.my_channels--;
       continue;
     }
 
@@ -108,9 +109,10 @@ static void silc_server_remove_clients_channels(SilcServer server,
       }
 
       /* Remove the channel entry */
-      if (!silc_idlist_del_channel(server->local_list, channel))
-       silc_idlist_del_channel(server->global_list, channel);
-      server->stat.my_channels--;
+      if (silc_idlist_del_channel(server->local_list, channel))
+       server->stat.my_channels--;
+      else if (silc_idlist_del_channel(server->global_list, channel))
+       server->stat.my_channels--;
       continue;
     }
 
@@ -437,11 +439,12 @@ void silc_server_update_clients_by_server(SilcServer server,
                                          SILC_ID_SERVER)));
 
 
-  local = TRUE;
-  if (silc_idcache_get_all(server->local_list->clients, &list)) {
+  local = FALSE;
+  if (silc_idcache_get_all(server->global_list->clients, &list)) {
     if (silc_idcache_list_first(list, &id_cache)) {
       while (id_cache) {
        client = (SilcClientEntry)id_cache->context;
+       
 
        if (!(client->data.status & SILC_IDLIST_STATUS_REGISTERED)) {
          if (!silc_idcache_list_next(list, &id_cache))
@@ -450,8 +453,11 @@ void silc_server_update_clients_by_server(SilcServer server,
            continue;
        }
 
-       SILC_LOG_DEBUG(("Client (local) %s", 
+       SILC_LOG_DEBUG(("Client (global) %s", 
                        silc_id_render(client->id, SILC_ID_CLIENT)));
+       if (client->router)
+         SILC_LOG_DEBUG(("Client->router (global) %s", 
+                         silc_id_render(client->router->id, SILC_ID_SERVER)));
 
        if (client->router == from) {
          /* Skip clients that are *really* owned by the `from' */
@@ -469,7 +475,7 @@ void silc_server_update_clients_by_server(SilcServer server,
              silc_server_update_clients_by_real_server(server, from, client,
                                                        local, id_cache);
            if (!client->router)
-             client->router = from; /* on local list put old from */
+             client->router = to;
          } else {
            client->router = to;
          }
@@ -482,12 +488,11 @@ void silc_server_update_clients_by_server(SilcServer server,
     silc_idcache_list_free(list);
   }
 
-  local = FALSE;
-  if (silc_idcache_get_all(server->global_list->clients, &list)) {
+  local = TRUE;
+  if (silc_idcache_get_all(server->local_list->clients, &list)) {
     if (silc_idcache_list_first(list, &id_cache)) {
       while (id_cache) {
        client = (SilcClientEntry)id_cache->context;
-       
 
        if (!(client->data.status & SILC_IDLIST_STATUS_REGISTERED)) {
          if (!silc_idcache_list_next(list, &id_cache))
@@ -496,8 +501,11 @@ void silc_server_update_clients_by_server(SilcServer server,
            continue;
        }
 
-       SILC_LOG_DEBUG(("Client (global) %s", 
+       SILC_LOG_DEBUG(("Client (local) %s", 
                        silc_id_render(client->id, SILC_ID_CLIENT)));
+       if (client->router)
+         SILC_LOG_DEBUG(("Client->router (local) %s", 
+                         silc_id_render(client->router->id, SILC_ID_SERVER)));
 
        if (client->router == from) {
          /* Skip clients that are *really* owned by the `from' */
@@ -515,7 +523,7 @@ void silc_server_update_clients_by_server(SilcServer server,
              silc_server_update_clients_by_real_server(server, from, client,
                                                        local, id_cache);
            if (!client->router)
-             client->router = to;
+             client->router = from; /* on local list put old from */
          } else {
            client->router = to;
          }
@@ -535,6 +543,50 @@ void silc_server_update_clients_by_server(SilcServer server,
     silc_server_remove_clients_by_server(server, from, TRUE);
 }
 
+/* Updates servers that are from `from' to be originated from `to'.  This
+   will also update the server's connection to `to's connection. */
+
+void silc_server_update_servers_by_server(SilcServer server, 
+                                         SilcServerEntry from,
+                                         SilcServerEntry to)
+{
+  SilcIDCacheList list = NULL;
+  SilcIDCacheEntry id_cache = NULL;
+  SilcServerEntry server_entry = NULL;
+
+  SILC_LOG_DEBUG(("Start"));
+
+  if (silc_idcache_get_all(server->local_list->servers, &list)) {
+    if (silc_idcache_list_first(list, &id_cache)) {
+      while (id_cache) {
+       server_entry = (SilcServerEntry)id_cache->context;
+       if (server_entry->router == from) {
+         server_entry->router = to;
+         server_entry->connection = to->connection;
+       }
+       if (!silc_idcache_list_next(list, &id_cache))
+         break;
+      }
+    }
+    silc_idcache_list_free(list);
+  }
+
+  if (silc_idcache_get_all(server->global_list->servers, &list)) {
+    if (silc_idcache_list_first(list, &id_cache)) {
+      while (id_cache) {
+       server_entry = (SilcServerEntry)id_cache->context;
+       if (server_entry->router == from) {
+         server_entry->router = to;
+         server_entry->connection = to->connection;
+       }
+       if (!silc_idcache_list_next(list, &id_cache))
+         break;
+      }
+    }
+    silc_idcache_list_free(list);
+  }
+}
+
 /* Checks whether given channel has global users.  If it does this returns
    TRUE and FALSE if there is only locally connected clients on the channel. */
 
index 080f9600b3da8b57bd69693d89db1224f21b2eb3..00f740baa6f25a698b07fa1117fe24f6814ad249 100644 (file)
@@ -44,6 +44,12 @@ void silc_server_update_clients_by_server(SilcServer server,
                                          bool resolve_real_server,
                                          bool remove_from);
 
+/* Updates servers that are from `from' to be originated from `to'.  This
+   will also update the server's connection to `to's connection. */
+void silc_server_update_servers_by_server(SilcServer server, 
+                                         SilcServerEntry from,
+                                         SilcServerEntry to);
+
 /* Checks whether given channel has global users.  If it does this returns
    TRUE and FALSE if there is only locally connected clients on the channel. */
 bool silc_server_channel_has_global(SilcChannelEntry channel);
index 69eb1a52e9c4f520d1fe144a9343956e3838d25f..a0b6953e6a5e25719862fac3e8665e30858b6eef 100644 (file)
@@ -1,5 +1,5 @@
 #
-# CELL 2 Server 212.146.42.150 on port 706
+# CELL 3 Server 212.146.42.150 on port 706
 #
 
 [Cipher]