From e4e72a9897e687d4452765dfca282794ac18435e Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Thu, 19 Apr 2001 16:29:20 +0000 Subject: [PATCH] updates. --- CHANGES | 5 +++ TODO | 12 +++---- apps/silcd/packet_receive.c | 9 ++--- apps/silcd/protocol.c | 6 ++-- apps/silcd/protocol.h | 12 ++++--- apps/silcd/server.c | 66 ++++++++++++++++++++----------------- 6 files changed, 62 insertions(+), 48 deletions(-) diff --git a/CHANGES b/CHANGES index f9f60f10..ff6ffe78 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +Thu Apr 19 19:52:46 EEST 2001 Pekka Riikonen + + * Fixed the configuration data fetching when accepting new + connections in the server. Affected file silcd/server.c. + Thu Apr 19 11:40:20 EEST 2001 Pekka Riikonen * Added `sender_entry' argument to the function diff --git a/TODO b/TODO index 04454233..319c9826 100644 --- a/TODO +++ b/TODO @@ -40,6 +40,12 @@ TODO/bugs In SILC Server own resolver stuff (through scheduler, if possible without writing too much own stuff) or use threads. + o The ID List must be optimized. When the lists grow the searching + becomes a lot slower and is some cases the lists are searched many + times, like with channel messages (twice at least). Some sort of + hash tables should replace the lists. Thus, the ID cache should be + rewritten to use hash tables internally. + o [DenyConnection] config section is not implemented. o The backup router support described in the protocol specification @@ -73,12 +79,6 @@ TODO/bugs In SILC Libraries does not want to register them one by one (if for example SILC client is run without config files at all). - o The ID List must be optimized. When the lists grow the searching - becomes a lot slower and is some cases the lists are searched many - times, like with channel messages (twice at least). Some sort of - hash tables should replace the lists. Thus, the ID cache should be - rewritten to use hash tables internally. - o Compression routines are missing. The protocol supports packet compression thus it must be implemented. SILC Comp API must be defined. zlib package is already included into the lib dir (in CVS, diff --git a/apps/silcd/packet_receive.c b/apps/silcd/packet_receive.c index e4c3bd35..50111068 100644 --- a/apps/silcd/packet_receive.c +++ b/apps/silcd/packet_receive.c @@ -1537,9 +1537,9 @@ static void silc_server_new_id_real(SilcServer server, else id_list = server->global_list; - /* If the packet is coming from router then use the sender as the + /* If the packet is coming from server then use the sender as the origin of the the packet. If it came from router then check the real - sender of the packet and use that as he origin. */ + sender of the packet and use that as the origin. */ if (sock->type == SILC_SOCKET_TYPE_SERVER) { router_sock = sock; router = sock->user_data; @@ -1551,9 +1551,10 @@ static void silc_server_new_id_real(SilcServer server, if (!router) router = silc_idlist_find_server_by_id(server->local_list, sender_id, NULL); - assert(router != NULL); - router_sock = sock; silc_free(sender_id); + if (!router) + goto out; + router_sock = sock; } switch(id_type) { diff --git a/apps/silcd/protocol.c b/apps/silcd/protocol.c index 10e74a9d..b6b17007 100644 --- a/apps/silcd/protocol.c +++ b/apps/silcd/protocol.c @@ -665,7 +665,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_connection_auth) /* Remote end is client */ if (conn_type == SILC_SOCKET_TYPE_CLIENT) { - SilcServerConfigSectionClientConnection *client = ctx->config; + SilcServerConfigSectionClientConnection *client = ctx->cconfig; if (client) { switch(client->auth_meth) { @@ -727,7 +727,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_connection_auth) /* Remote end is server */ if (conn_type == SILC_SOCKET_TYPE_SERVER) { - SilcServerConfigSectionServerConnection *serv = ctx->config; + SilcServerConfigSectionServerConnection *serv = ctx->sconfig; if (serv) { switch(serv->auth_meth) { @@ -789,7 +789,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_connection_auth) /* Remote end is router */ if (conn_type == SILC_SOCKET_TYPE_ROUTER) { - SilcServerConfigSectionServerConnection *serv = ctx->config; + SilcServerConfigSectionServerConnection *serv = ctx->rconfig; if (serv) { switch(serv->auth_meth) { diff --git a/apps/silcd/protocol.h b/apps/silcd/protocol.h index f5ab3c5b..09e2aac3 100644 --- a/apps/silcd/protocol.h +++ b/apps/silcd/protocol.h @@ -43,8 +43,10 @@ typedef struct { void *dest_id; SilcIdType dest_id_type; - /* Pointer to the configuration. */ - void *config; + /* Pointer to the configurations. */ + void *cconfig; + void *sconfig; + void *rconfig; SilcTask timeout_task; SilcPacketContext *packet; @@ -79,8 +81,10 @@ typedef struct { void *dest_id; SilcIdType dest_id_type; - /* Pointer to the configuration. */ - void *config; + /* Pointer to the configurations. */ + void *cconfig; + void *sconfig; + void *rconfig; SilcTask timeout_task; SilcPacketContext *packet; diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 7a88cad3..4892cd06 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -947,7 +947,7 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection) SilcSocketConnection newsocket; SilcServerKEInternalContext *proto_ctx; int sock, port; - void *config; + void *cconfig, *sconfig, *rconfig; SILC_LOG_DEBUG(("Accepting new connection")); @@ -1007,30 +1007,29 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection) have to check all configurations since we don't know what type of connection this is. */ port = server->sockets[fd]->port; /* Listenning port */ - if (!(config = silc_server_config_find_client_conn(server->config, + if (!(cconfig = silc_server_config_find_client_conn(server->config, + newsocket->ip, port))) + cconfig = silc_server_config_find_client_conn(server->config, + newsocket->hostname, + port); + if (!(sconfig = silc_server_config_find_server_conn(server->config, + newsocket->ip, + port))) + sconfig = silc_server_config_find_server_conn(server->config, + newsocket->hostname, + port); + if (!(rconfig = silc_server_config_find_router_conn(server->config, newsocket->ip, port))) - if (!(config = silc_server_config_find_client_conn(server->config, - newsocket->hostname, - port))) - if (!(config = silc_server_config_find_server_conn(server->config, - newsocket->ip, - port))) - if (!(config = silc_server_config_find_server_conn(server->config, - newsocket->hostname, - port))) - if (!(config = - silc_server_config_find_router_conn(server->config, - newsocket->ip, port))) - if (!(config = - silc_server_config_find_router_conn(server->config, - newsocket->hostname, - port))) { - silc_server_disconnect_remote(server, newsocket, - "Server closed connection: " - "Connection refused"); - server->stat.conn_failures++; - return; - } + rconfig = silc_server_config_find_router_conn(server->config, + newsocket->hostname, + port); + if (!cconfig && !sconfig && !rconfig) { + silc_server_disconnect_remote(server, newsocket, + "Server closed connection: " + "Connection refused"); + server->stat.conn_failures++; + return; + } /* The connection is allowed */ @@ -1044,7 +1043,9 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection) proto_ctx->sock = newsocket; proto_ctx->rng = server->rng; proto_ctx->responder = TRUE; - proto_ctx->config = config; + proto_ctx->cconfig = cconfig; + proto_ctx->sconfig = sconfig; + proto_ctx->rconfig = rconfig; /* Prepare the connection for key exchange protocol. We allocate the protocol but will not start it yet. The connector will be the @@ -1143,7 +1144,9 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection_second) proto_ctx->responder = TRUE; proto_ctx->dest_id_type = ctx->dest_id_type; proto_ctx->dest_id = ctx->dest_id; - proto_ctx->config = ctx->config; + proto_ctx->cconfig = ctx->cconfig; + proto_ctx->sconfig = ctx->sconfig; + proto_ctx->rconfig = ctx->rconfig; /* Free old protocol as it is finished now */ silc_protocol_free(protocol); @@ -1243,7 +1246,8 @@ SILC_TASK_CALLBACK(silc_server_accept_new_connection_final) case SILC_SOCKET_TYPE_ROUTER: { SilcServerEntry new_server; - SilcServerConfigSectionServerConnection *conn = ctx->config; + SilcServerConfigSectionServerConnection *conn = + sock->type == SILC_SOCKET_TYPE_SERVER ? ctx->sconfig : ctx->rconfig; SILC_LOG_DEBUG(("Remote host is %s", sock->type == SILC_SOCKET_TYPE_SERVER ? @@ -2209,7 +2213,8 @@ void silc_server_free_sock_user_data(SilcServer server, /* Free all client entries that this server owns as they will become invalid now as well. */ - silc_server_remove_clients_by_server(server, user_data, TRUE); + if (user_data->id) + silc_server_remove_clients_by_server(server, user_data, TRUE); /* If this was our primary router connection then we're lost to the outside world. */ @@ -2534,8 +2539,6 @@ void silc_server_remove_from_channels(SilcServer server, signoff_message, signoff_message ? strlen(signoff_message) : 0); - server->stat.my_channels--; - if (channel->rekey) silc_task_unregister_by_context(server->timeout_queue, channel->rekey); @@ -2556,6 +2559,7 @@ void silc_server_remove_from_channels(SilcServer server, if (!silc_idlist_del_channel(server->local_list, channel)) silc_idlist_del_channel(server->global_list, channel); + server->stat.my_channels--; continue; } @@ -2649,7 +2653,6 @@ int silc_server_remove_from_one_channel(SilcServer server, SILC_NOTIFY_TYPE_LEAVE, 1, clidp->data, clidp->len); - server->stat.my_channels--; silc_buffer_free(clidp); if (channel->rekey) @@ -2672,6 +2675,7 @@ int silc_server_remove_from_one_channel(SilcServer server, if (!silc_idlist_del_channel(server->local_list, channel)) silc_idlist_del_channel(server->global_list, channel); + server->stat.my_channels--; return FALSE; } -- 2.24.0