From 3b3c092203bf23dfe665739a9916d43415bab056 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Mon, 15 Oct 2001 18:28:14 +0000 Subject: [PATCH] updates. --- CHANGES | 9 ++++ TODO | 9 ++-- apps/silcd/packet_receive.c | 5 +- apps/silcd/server.c | 28 ++++++----- apps/silcd/server_backup.c | 1 + apps/silcd/server_util.c | 82 +++++++++++++++++++++++++++------ apps/silcd/server_util.h | 6 +++ doc/examples/cell3_server1.conf | 2 +- 8 files changed, 110 insertions(+), 32 deletions(-) diff --git a/CHANGES b/CHANGES index 0b381330..385fc821 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,15 @@ Mon Oct 15 17:42:55 EDT 2001 Pekka Riikonen 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 * Assure that router cannot reroute the same channel message diff --git a/TODO b/TODO index 0a37eb5d..ead99827 100644 --- 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. diff --git a/apps/silcd/packet_receive.c b/apps/silcd/packet_receive.c index 0717c8ca..cef91017 100644 --- a/apps/silcd/packet_receive.c +++ b/apps/silcd/packet_receive.c @@ -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; } diff --git a/apps/silcd/server.c b/apps/silcd/server.c index a9395e39..0822bec5 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -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; } diff --git a/apps/silcd/server_backup.c b/apps/silcd/server_backup.c index 31cd6efd..d782297a 100644 --- a/apps/silcd/server_backup.c +++ b/apps/silcd/server_backup.c @@ -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, diff --git a/apps/silcd/server_util.c b/apps/silcd/server_util.c index 30c9e157..8184b2e7 100644 --- a/apps/silcd/server_util.c +++ b/apps/silcd/server_util.c @@ -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. */ diff --git a/apps/silcd/server_util.h b/apps/silcd/server_util.h index 080f9600..00f740ba 100644 --- a/apps/silcd/server_util.h +++ b/apps/silcd/server_util.h @@ -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); diff --git a/doc/examples/cell3_server1.conf b/doc/examples/cell3_server1.conf index 69eb1a52..a0b6953e 100644 --- a/doc/examples/cell3_server1.conf +++ b/doc/examples/cell3_server1.conf @@ -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] -- 2.24.0