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
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,
SilcSocketConnection newsocket;
SilcServerKEInternalContext *proto_ctx;
int sock, port;
- void *config;
+ void *cconfig, *sconfig, *rconfig;
SILC_LOG_DEBUG(("Accepting 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 */
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
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);
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 ?
/* 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. */
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);
if (!silc_idlist_del_channel(server->local_list, channel))
silc_idlist_del_channel(server->global_list, channel);
+ server->stat.my_channels--;
continue;
}
SILC_NOTIFY_TYPE_LEAVE, 1,
clidp->data, clidp->len);
- server->stat.my_channels--;
silc_buffer_free(clidp);
if (channel->rekey)
if (!silc_idlist_del_channel(server->local_list, channel))
silc_idlist_del_channel(server->global_list, channel);
+ server->stat.my_channels--;
return FALSE;
}