Send SERVER_SIGNOFF to local backup routers from primary router.
authorPekka Riikonen <priikone@silcnet.org>
Sun, 8 Sep 2002 10:38:25 +0000 (10:38 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 8 Sep 2002 10:38:25 +0000 (10:38 +0000)
Handle the disconnection of locally connected server correctly
on backup router; the server is really originated from the primary
router.

CHANGES
apps/silcd/packet_receive.c
apps/silcd/server.c
apps/silcd/server_util.c
doc/draft-riikonen-silc-pp-06.nroff

diff --git a/CHANGES b/CHANGES
index 8884906448b7aa201dc6686ef5e2dbe71f8668b7..e6e65d8f967dec39078861a74469e722e313abc1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,17 @@
+Sun Sep  8 13:13:44 EEST 2002  Pekka Riikonen <priikone@silcnet.org>
+
+       * Distribute the SERVER_SIGNOFF notify also to local backup
+         routers from the primary router.  The backup router may not
+         have the signing of local server directly connected and need
+         to know about the signoff.  Affected file silcd/server_util.c.
+
+       * Use the primary router as the origin of the locally connected
+         server when it is disconnecting from the backup router since
+         that's where it really is coming from.  Now the clients from
+         the disconnecting server are removed correctly and "shadow"
+         clients are not left to the backup router.  Affected file
+         silcd/server.c.
+
 Sat Sep  7 22:26:50 EEST 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * If normal server is standalone and found existing but disabled
 Sat Sep  7 22:26:50 EEST 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * If normal server is standalone and found existing but disabled
index d3f03aae0bca0667e643715008640924f39f2955..b3828beb1a4b392db9fdfa1f1ea8c17b1f3904de 100644 (file)
@@ -1233,7 +1233,7 @@ void silc_server_notify(SilcServer server,
     /* Get server entry */
     server_entry = silc_idlist_find_server_by_id(server->global_list, 
                                                 server_id, TRUE, NULL);
     /* Get server entry */
     server_entry = silc_idlist_find_server_by_id(server->global_list, 
                                                 server_id, TRUE, NULL);
-    local = TRUE;
+    local = FALSE;
     if (!server_entry) {
       server_entry = silc_idlist_find_server_by_id(server->local_list, 
                                                   server_id, TRUE, NULL);
     if (!server_entry) {
       server_entry = silc_idlist_find_server_by_id(server->local_list, 
                                                   server_id, TRUE, NULL);
index 10c72d22b511a8148d188dd76fe7aecce0b385b6..3126c396bc38d07897fac43d42eb5fe1932c9876 100644 (file)
@@ -3152,9 +3152,16 @@ void silc_server_free_sock_user_data(SilcServer server,
        silc_server_remove_servers_by_server(server, user_data, TRUE);
 
        /* Remove the clients that this server owns as they will become
        silc_server_remove_servers_by_server(server, user_data, TRUE);
 
        /* Remove the clients that this server owns as they will become
-          invalid now too. */
-       silc_server_remove_clients_by_server(server, user_data,
-                                            user_data, TRUE);
+          invalid now too.  For backup router the server is actually
+          coming from the primary router, so mark that as the owner
+          of this entry. */
+       if (server->server_type == SILC_BACKUP_ROUTER &&
+           sock->type == SILC_SOCKET_TYPE_SERVER)
+         silc_server_remove_clients_by_server(server, server->router,
+                                              user_data, TRUE);
+       else
+         silc_server_remove_clients_by_server(server, user_data,
+                                              user_data, TRUE);
 
        /* Remove channels owned by this server */
        if (server->server_type == SILC_SERVER)
 
        /* Remove channels owned by this server */
        if (server->server_type == SILC_SERVER)
index 59102d13b1f81fedbf7b2e7585eedac037ce9f98..93f2d5bd4687cb29bf7144c295953e469e5ab070 100644 (file)
@@ -332,6 +332,10 @@ bool silc_server_remove_clients_by_server(SilcServer server,
                                    SILC_PACKET_NOTIFY, 0, FALSE,
                                    not->data, not->len, FALSE);
 
                                    SILC_PACKET_NOTIFY, 0, FALSE,
                                    not->data, not->len, FALSE);
 
+    /* Send notify also to local backup routers */
+    silc_server_backup_send(server, NULL, SILC_PACKET_NOTIFY, 0,
+                           not->data, not->len, FALSE, TRUE);
+
     silc_buffer_free(args);
     silc_buffer_free(not);
     for (i = 0; i < argc; i++)
     silc_buffer_free(args);
     silc_buffer_free(not);
     for (i = 0; i < argc; i++)
index 776912ec2c81f06bb02f451c14b6a084f6ecc07b..4acfccd97f3de3cd2fccecc72760379424b352dc 100644 (file)
@@ -1418,7 +1418,7 @@ UTF-8 [RFC2279] encoded.
       Sent when server quits SILC network.  Those clients from this
       server that are on channels must be removed from the channel.
 
       Sent when server quits SILC network.  Those clients from this
       server that are on channels must be removed from the channel.
 
-      Max Arguments:  2000
+      Max Arguments:  256
           Arguments:  (1) <Server ID>   (n) [<Client ID>]   [...]
 
       The <Server ID> is the server's ID.  The rest of the arguments
           Arguments:  (1) <Server ID>   (n) [<Client ID>]   [...]
 
       The <Server ID> is the server's ID.  The rest of the arguments