updates.
[silc.git] / apps / silcd / server.c
1 /*
2
3   server.c
4
5   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
6
7   Copyright (C) 1997 - 2001 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13   
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19 */
20 /*
21  * This is the actual SILC server than handles everything relating to
22  * servicing the SILC connections. This is also a SILC router as a router 
23  * is also normal server.
24  */
25 /* $Id$ */
26
27 #include "serverincludes.h"
28 #include "server_internal.h"
29
30 /* Static prototypes */
31 SILC_TASK_CALLBACK(silc_server_connect_router);
32 SILC_TASK_CALLBACK(silc_server_connect_to_router);
33 SILC_TASK_CALLBACK(silc_server_connect_to_router_second);
34 SILC_TASK_CALLBACK(silc_server_connect_to_router_final);
35 SILC_TASK_CALLBACK(silc_server_accept_new_connection);
36 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second);
37 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final);
38 SILC_TASK_CALLBACK(silc_server_packet_process);
39 SILC_TASK_CALLBACK(silc_server_packet_parse_real);
40 SILC_TASK_CALLBACK(silc_server_timeout_remote);
41 SILC_TASK_CALLBACK(silc_server_failure_callback);
42 SILC_TASK_CALLBACK(silc_server_rekey_callback);
43
44 /* Allocates a new SILC server object. This has to be done before the server
45    can be used. After allocation one must call silc_server_init to initialize
46    the server. The new allocated server object is returned to the new_server
47    argument. */
48
49 int silc_server_alloc(SilcServer *new_server)
50 {
51   SilcServer server;
52
53   SILC_LOG_DEBUG(("Allocating new server object"));
54
55   server = silc_calloc(1, sizeof(*server));
56   server->server_type = SILC_SERVER;
57   server->standalone = TRUE;
58   server->local_list = silc_calloc(1, sizeof(*server->local_list));
59   server->global_list = silc_calloc(1, sizeof(*server->global_list));
60   server->pending_commands = silc_dlist_init();
61 #ifdef SILC_SIM
62   server->sim = silc_dlist_init();
63 #endif
64
65   *new_server = server;
66
67   return TRUE;
68 }
69
70 /* Free's the SILC server object. This is called at the very end before
71    the program ends. */
72
73 void silc_server_free(SilcServer server)
74 {
75   if (server) {
76 #ifdef SILC_SIM
77     SilcSimContext *sim;
78 #endif
79
80     if (server->local_list)
81       silc_free(server->local_list);
82     if (server->global_list)
83       silc_free(server->global_list);
84     if (server->rng)
85       silc_rng_free(server->rng);
86
87 #ifdef SILC_SIM
88     while ((sim = silc_dlist_get(server->sim)) != SILC_LIST_END) {
89       silc_dlist_del(server->sim, sim);
90       silc_sim_free(sim);
91     }
92     silc_dlist_uninit(server->sim);
93 #endif
94
95     if (server->params)
96       silc_free(server->params);
97
98     if (server->pending_commands)
99       silc_dlist_uninit(server->pending_commands);
100
101     silc_free(server);
102   }
103 }
104
105 /* Initializes the entire SILC server. This is called always before running
106    the server. This is called only once at the initialization of the program.
107    This binds the server to its listenning port. After this function returns 
108    one should call silc_server_run to start the server. This returns TRUE 
109    when everything is ok to run the server. Configuration file must be
110    read and parsed before calling this. */
111
112 int silc_server_init(SilcServer server)
113 {
114   int *sock = NULL, sock_count = 0, i;
115   SilcServerID *id;
116   SilcServerEntry id_entry;
117   SilcIDListPurge purge;
118
119   SILC_LOG_DEBUG(("Initializing server"));
120   assert(server);
121   assert(server->config);
122
123   /* XXX After server is made as Silc Server Library this can be given
124      as argument, for now this is hard coded */
125   server->params = silc_calloc(1, sizeof(*server->params));
126   server->params->retry_count = SILC_SERVER_RETRY_COUNT;
127   server->params->retry_interval_min = SILC_SERVER_RETRY_INTERVAL_MIN;
128   server->params->retry_interval_max = SILC_SERVER_RETRY_INTERVAL_MAX;
129   server->params->retry_keep_trying = FALSE;
130   server->params->protocol_timeout = 60;
131   server->params->require_reverse_mapping = FALSE;
132
133   /* Set log files where log message should be saved. */
134   server->config->server = server;
135   silc_server_config_setlogfiles(server->config);
136  
137   /* Register all configured ciphers, PKCS and hash functions. */
138   silc_server_config_register_ciphers(server->config);
139   silc_server_config_register_pkcs(server->config);
140   silc_server_config_register_hashfuncs(server->config);
141   silc_server_config_register_hmacs(server->config);
142
143   /* Initialize random number generator for the server. */
144   server->rng = silc_rng_alloc();
145   silc_rng_init(server->rng);
146   silc_rng_global_init(server->rng);
147
148   /* Initialize hash functions for server to use */
149   silc_hash_alloc("md5", &server->md5hash);
150   silc_hash_alloc("sha1", &server->sha1hash);
151
152   /* Initialize none cipher */
153   silc_cipher_alloc("none", &server->none_cipher);
154
155   /* XXXXX Generate RSA key pair */
156   {
157     unsigned char *public_key;
158     unsigned char *private_key;
159     uint32 pk_len, prv_len;
160     struct stat st;
161
162     if (stat("pubkey.pub", &st) < 0 && stat("privkey.prv", &st) < 0) {
163
164       if (silc_pkcs_alloc("rsa", &server->pkcs) == FALSE) {
165         SILC_LOG_ERROR(("Could not create RSA key pair"));
166         goto err0;
167       }
168       
169       if (server->pkcs->pkcs->init(server->pkcs->context, 
170                                    1024, server->rng) == FALSE) {
171         SILC_LOG_ERROR(("Could not generate RSA key pair"));
172         goto err0;
173       }
174       
175       public_key = server->pkcs->pkcs->get_public_key(server->pkcs->context,
176                                                       &pk_len);
177       private_key = server->pkcs->pkcs->get_private_key(server->pkcs->context,
178                                                         &prv_len);
179       
180       SILC_LOG_HEXDUMP(("public key"), public_key, pk_len);
181       SILC_LOG_HEXDUMP(("private key"), private_key, prv_len);
182       
183       server->public_key = 
184         silc_pkcs_public_key_alloc("rsa", "UN=root, HN=dummy",
185                                    public_key, pk_len);
186       server->private_key = 
187         silc_pkcs_private_key_alloc("rsa", private_key, prv_len);
188       
189       /* XXX Save keys */
190       silc_pkcs_save_public_key("pubkey.pub", server->public_key,
191                                 SILC_PKCS_FILE_PEM);
192       silc_pkcs_save_private_key("privkey.prv", server->private_key, NULL,
193                                  SILC_PKCS_FILE_BIN);
194
195       memset(public_key, 0, pk_len);
196       memset(private_key, 0, prv_len);
197       silc_free(public_key);
198       silc_free(private_key);
199     } else {
200       silc_pkcs_load_public_key("pubkey.pub", &server->public_key,
201                                 SILC_PKCS_FILE_PEM);
202       silc_pkcs_load_private_key("privkey.prv", &server->private_key,
203                                  SILC_PKCS_FILE_BIN);
204     }
205   }
206
207   /* Create a listening server. Note that our server can listen on
208      multiple ports. All listeners are created here and now. */
209   /* XXX Still check this whether to use server_info or listen_port. */
210   sock_count = 0;
211   while(server->config->listen_port) {
212     int tmp;
213
214     tmp = silc_net_create_server(server->config->listen_port->port,
215                                  server->config->listen_port->host);
216     if (tmp < 0)
217       goto err0;
218
219     sock = silc_realloc(sock, (sizeof(int *) * (sock_count + 1)));
220     sock[sock_count] = tmp;
221     server->config->listen_port = server->config->listen_port->next;
222     sock_count++;
223   }
224
225   /* Initialize ID caches */
226   server->local_list->clients = 
227     silc_idcache_alloc(0, silc_idlist_client_destructor);
228   server->local_list->servers = silc_idcache_alloc(0, NULL);
229   server->local_list->channels = silc_idcache_alloc(0, NULL);
230
231   /* These are allocated for normal server as well as these hold some 
232      global information that the server has fetched from its router. For 
233      router these are used as they are supposed to be used on router. */
234   server->global_list->clients = 
235     silc_idcache_alloc(0, silc_idlist_client_destructor);
236   server->global_list->servers = silc_idcache_alloc(0, NULL);
237   server->global_list->channels = silc_idcache_alloc(0, NULL);
238
239   /* Allocate the entire socket list that is used in server. Eventually 
240      all connections will have entry in this table (it is a table of 
241      pointers to the actual object that is allocated individually 
242      later). */
243   server->sockets = silc_calloc(SILC_SERVER_MAX_CONNECTIONS,
244                                 sizeof(*server->sockets));
245
246   for (i = 0; i < sock_count; i++) {
247     SilcSocketConnection newsocket = NULL;
248
249     /* Set socket to non-blocking mode */
250     silc_net_set_socket_nonblock(sock[i]);
251     server->sock = sock[i];
252     
253     /* Create a Server ID for the server. */
254     silc_id_create_server_id(sock[i], server->rng, &id);
255     if (!id) {
256       goto err0;
257     }
258     
259     server->id = id;
260     server->id_string = silc_id_id2str(id, SILC_ID_SERVER);
261     server->id_string_len = silc_id_get_len(SILC_ID_SERVER);
262     server->id_type = SILC_ID_SERVER;
263     server->server_name = server->config->server_info->server_name;
264
265     /* Add ourselves to the server list. We don't have a router yet 
266        beacuse we haven't established a route yet. It will be done later. 
267        For now, NULL is sent as router. This allocates new entry to
268        the ID list. */
269     id_entry = 
270       silc_idlist_add_server(server->local_list,
271                              server->config->server_info->server_name,
272                              server->server_type, server->id, NULL, NULL);
273     if (!id_entry) {
274       SILC_LOG_ERROR(("Could not add ourselves to cache"));
275       goto err0;
276     }
277     
278     /* Add ourselves also to the socket table. The entry allocated above
279        is sent as argument for fast referencing in the future. */
280     silc_socket_alloc(sock[i], SILC_SOCKET_TYPE_SERVER, id_entry, 
281                       &newsocket);
282
283     server->sockets[sock[i]] = newsocket;
284
285     /* Put the allocated socket pointer also to the entry allocated above 
286        for fast back-referencing to the socket list. */
287     id_entry->connection = (void *)server->sockets[sock[i]];
288     server->id_entry = id_entry;
289   }
290
291   /* Register the task queues. In SILC we have by default three task queues. 
292      One task queue for non-timeout tasks which perform different kind of 
293      I/O on file descriptors, timeout task queue for timeout tasks, and,
294      generic non-timeout task queue whose tasks apply to all connections. */
295   silc_task_queue_alloc(&server->io_queue, TRUE);
296   if (!server->io_queue) {
297     goto err0;
298   }
299   silc_task_queue_alloc(&server->timeout_queue, TRUE);
300   if (!server->timeout_queue) {
301     goto err1;
302   }
303   silc_task_queue_alloc(&server->generic_queue, TRUE);
304   if (!server->generic_queue) {
305     goto err1;
306   }
307
308   /* Register protocols */
309   silc_server_protocols_register();
310
311   /* Initialize the scheduler */
312   silc_schedule_init(&server->io_queue, &server->timeout_queue, 
313                      &server->generic_queue, 
314                      SILC_SERVER_MAX_CONNECTIONS);
315   
316   /* Add the first task to the queue. This is task that is executed by
317      timeout. It expires as soon as the caller calls silc_server_run. This
318      task performs authentication protocol and key exchange with our
319      primary router. */
320   silc_task_register(server->timeout_queue, sock[0], 
321                      silc_server_connect_to_router,
322                      (void *)server, 0, 1,
323                      SILC_TASK_TIMEOUT,
324                      SILC_TASK_PRI_NORMAL);
325
326   /* Add listener task to the queue. This task receives new connections to the 
327      server. This task remains on the queue until the end of the program. */
328   silc_task_register(server->io_queue, sock[0],
329                      silc_server_accept_new_connection,
330                      (void *)server, 0, 0, 
331                      SILC_TASK_FD,
332                      SILC_TASK_PRI_NORMAL);
333   server->listenning = TRUE;
334
335   /* If server connections has been configured then we must be router as
336      normal server cannot have server connections, only router connections. */
337   if (server->config->servers)
338     server->server_type = SILC_ROUTER;
339
340   /* Register the ID Cache purge task. This periodically purges the ID cache
341      and removes the expired cache entries. */
342
343   /* Clients local list */
344   purge = silc_calloc(1, sizeof(*purge));
345   purge->cache = server->local_list->clients;
346   purge->timeout_queue = server->timeout_queue;
347   silc_task_register(purge->timeout_queue, 0, 
348                      silc_idlist_purge,
349                      (void *)purge, 600, 0,
350                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
351
352   /* Clients global list */
353   purge = silc_calloc(1, sizeof(*purge));
354   purge->cache = server->global_list->clients;
355   purge->timeout_queue = server->timeout_queue;
356   silc_task_register(purge->timeout_queue, 0, 
357                      silc_idlist_purge,
358                      (void *)purge, 300, 0,
359                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
360
361   SILC_LOG_DEBUG(("Server initialized"));
362
363   /* We are done here, return succesfully */
364   return TRUE;
365
366   silc_task_queue_free(server->timeout_queue);
367  err1:
368   silc_task_queue_free(server->io_queue);
369  err0:
370   for (i = 0; i < sock_count; i++)
371     silc_net_close_server(sock[i]);
372
373   return FALSE;
374 }
375
376 /* Fork server to background and set gid+uid to non-root.
377    Silcd will not run as root, so trying to set either user or group to
378    root will cause silcd to exit. */
379
380 void silc_server_daemonise(SilcServer server)
381 {
382   /* Are we executing silcd as root or a regular user? */
383   if (geteuid()==0) {
384     
385     struct passwd *pw;
386     struct group *gr;
387     char *user, *group;
388     
389     if (!server->config->identity || !server->config->identity->user || 
390         !server->config->identity->group) {
391       fprintf(stderr, "Error:"
392        "\tSILC server must not be run as root.  For the security of your\n"
393        "\tsystem it is strongly suggested that you run SILC under dedicated\n"
394        "\tuser account.  Modify the [Identity] configuration section to run\n"
395        "\tthe server as non-root user.\n");
396       exit(1);
397     }
398     
399     /* Get the values given for user and group in configuration file */
400     user=server->config->identity->user;
401     group=server->config->identity->group;
402     
403     /* Check whether the user/group information is text */ 
404     if (atoi(user)!=0 || atoi(group)!=0) {
405       SILC_LOG_DEBUG(("Invalid user and/or group information"));
406       SILC_LOG_DEBUG(("User and/or group given as number"));
407       fprintf(stderr, "Invalid user and/or group information\n");
408       fprintf(stderr, "Please assign them as names, not numbers\n");
409       exit(1);
410     }
411     
412     /* Catch the nasty incident of string "0" returning 0 from atoi */
413     if (strcmp("0", user)==0 || strcmp("0", group)==0) {
414       SILC_LOG_DEBUG(("User and/or group configured to 0. Unacceptable"));
415       fprintf(stderr, "User and/or group configured to 0. Exiting\n");
416       exit(1);
417     }
418     
419     pw=getpwnam(user);
420     gr=getgrnam(group);
421
422     if (!pw) {
423       fprintf(stderr, "No such user %s found\n", user);
424       exit(1);
425     }
426
427     if (!gr) {
428       fprintf(stderr, "No such group %s found\n", group);
429       exit(1);
430     }
431     
432     /* Check whether user and/or group is set to root. If yes, exit
433        immediately. Otherwise, setgid and setuid server to user.group */
434     if (gr->gr_gid==0 || pw->pw_uid==0) {
435       fprintf(stderr, "Error:"
436        "\tSILC server must not be run as root.  For the security of your\n"
437        "\tsystem it is strongly suggested that you run SILC under dedicated\n"
438        "\tuser account.  Modify the [Identity] configuration section to run\n"
439        "\tthe server as non-root user.\n");
440       exit(1);
441     } else {
442       /* Fork server to background, making it a daemon */
443       if (fork()) {
444         SILC_LOG_DEBUG(("Server started as root. Dropping privileges."));
445         SILC_LOG_DEBUG(("Forking SILC server to background"));
446         exit(0);
447       } 
448       setsid();
449       
450       SILC_LOG_DEBUG(("Changing to group %s", group));
451       if(setgid(gr->gr_gid)==0) {
452         SILC_LOG_DEBUG(("Setgid to %s", group));
453       } else {
454         SILC_LOG_DEBUG(("Setgid to %s failed", group));
455         fprintf(stderr, "Tried to setgid %s but no such group. Exiting\n",
456                 group);
457         exit(1);
458       }
459       SILC_LOG_DEBUG(("Changing to user nobody"));
460       if(setuid(pw->pw_uid)==0) {
461         SILC_LOG_DEBUG(("Setuid to %s", user));
462       } else {
463         SILC_LOG_DEBUG(("Setuid to %s failed", user));
464         fprintf(stderr, "Tried to setuid %s but no such user. Exiting\n",
465                 user);
466         exit(1);
467       }
468     }
469   } else {
470     /* Fork server to background, making it a daemon */
471     if (fork()) {
472       SILC_LOG_DEBUG(("Server started as user")); 
473       SILC_LOG_DEBUG(("Forking SILC server to background"));
474       exit(0);
475     }
476     setsid();
477   }
478 }
479
480 /* Stops the SILC server. This function is used to shutdown the server. 
481    This is usually called after the scheduler has returned. After stopping 
482    the server one should call silc_server_free. */
483
484 void silc_server_stop(SilcServer server)
485 {
486   SILC_LOG_DEBUG(("Stopping server"));
487
488   /* Stop the scheduler, although it might be already stopped. This
489      doesn't hurt anyone. This removes all the tasks and task queues,
490      as well. */
491   silc_schedule_stop();
492   silc_schedule_uninit();
493
494   silc_server_protocols_unregister();
495
496   SILC_LOG_DEBUG(("Server stopped"));
497 }
498
499 /* The heart of the server. This runs the scheduler thus runs the server. 
500    When this returns the server has been stopped and the program will
501    be terminated. */
502
503 void silc_server_run(SilcServer server)
504 {
505   SILC_LOG_DEBUG(("Running server"));
506
507   /* Start the scheduler, the heart of the SILC server. When this returns
508      the program will be terminated. */
509   silc_schedule();
510 }
511
512 /* Timeout callback that will be called to retry connecting to remote
513    router. This is used by both normal and router server. This will wait
514    before retrying the connecting. The timeout is generated by exponential
515    backoff algorithm. */
516
517 SILC_TASK_CALLBACK(silc_server_connect_to_router_retry)
518 {
519   SilcServerConnection sconn = (SilcServerConnection)context;
520   SilcServer server = sconn->server;
521
522   SILC_LOG_INFO(("Retrying connecting to a router"));
523
524   /* Calculate next timeout */
525   if (sconn->retry_count >= 1) {
526     sconn->retry_timeout = sconn->retry_timeout * SILC_SERVER_RETRY_MULTIPLIER;
527     if (sconn->retry_timeout > SILC_SERVER_RETRY_INTERVAL_MAX)
528       sconn->retry_timeout = SILC_SERVER_RETRY_INTERVAL_MAX;
529   } else {
530     sconn->retry_timeout = server->params->retry_interval_min;
531   }
532   sconn->retry_count++;
533   sconn->retry_timeout = sconn->retry_timeout +
534     silc_rng_get_rn32(server->rng) % SILC_SERVER_RETRY_RANDOMIZER;
535
536   /* If we've reached max retry count, give up. */
537   if (sconn->retry_count > server->params->retry_count && 
538       server->params->retry_keep_trying == FALSE) {
539     SILC_LOG_ERROR(("Could not connect to router, giving up"));
540     return;
541   }
542
543   /* Wait one before retrying */
544   silc_task_register(server->timeout_queue, fd, silc_server_connect_router,
545                      context, sconn->retry_timeout, 
546                      server->params->retry_interval_min_usec,
547                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
548 }
549
550 /* Generic routine to use connect to a router. */
551
552 SILC_TASK_CALLBACK(silc_server_connect_router)
553 {    
554   SilcServerConnection sconn = (SilcServerConnection)context;
555   SilcServer server = sconn->server;
556   SilcSocketConnection newsocket;
557   SilcProtocol protocol;
558   SilcServerKEInternalContext *proto_ctx;
559   int sock;
560
561   /* Connect to remote host */
562   sock = silc_net_create_connection(sconn->remote_port, 
563                                     sconn->remote_host);
564   if (sock < 0) {
565     SILC_LOG_ERROR(("Could not connect to router"));
566     silc_task_register(server->timeout_queue, fd, 
567                        silc_server_connect_to_router_retry,
568                        context, 0, 1, SILC_TASK_TIMEOUT, 
569                        SILC_TASK_PRI_NORMAL);
570     return;
571   }
572
573   /* Set socket options */
574   silc_net_set_socket_nonblock(sock);
575   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
576
577   /* Create socket connection for the connection. Even though we
578      know that we are connecting to a router we will mark the socket
579      to be unknown connection until we have executed authentication
580      protocol. */
581   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
582   server->sockets[sock] = newsocket;
583   newsocket->hostname = strdup(sconn->remote_host);
584   newsocket->ip = strdup(sconn->remote_host);
585   newsocket->port = sconn->remote_port;
586   sconn->sock = newsocket;
587
588   /* Allocate internal protocol context. This is sent as context
589      to the protocol. */
590   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
591   proto_ctx->server = (void *)server;
592   proto_ctx->context = (void *)sconn;
593   proto_ctx->sock = newsocket;
594   proto_ctx->rng = server->rng;
595   proto_ctx->responder = FALSE;
596       
597   /* Perform key exchange protocol. silc_server_connect_to_router_second
598      will be called after the protocol is finished. */
599   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
600                       &protocol, proto_ctx,
601                       silc_server_connect_to_router_second);
602   newsocket->protocol = protocol;
603       
604   /* Register a timeout task that will be executed if the protocol
605      is not executed within set limit. */
606   proto_ctx->timeout_task = 
607     silc_task_register(server->timeout_queue, sock, 
608                        silc_server_timeout_remote,
609                        server, server->params->protocol_timeout,
610                        server->params->protocol_timeout_usec,
611                        SILC_TASK_TIMEOUT,
612                        SILC_TASK_PRI_LOW);
613
614   /* Register the connection for network input and output. This sets
615      that scheduler will listen for incoming packets for this connection 
616      and sets that outgoing packets may be sent to this connection as 
617      well. However, this doesn't set the scheduler for outgoing traffic,
618      it will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
619      later when outgoing data is available. */
620   context = (void *)server;
621   SILC_REGISTER_CONNECTION_FOR_IO(sock);
622   
623   /* Run the protocol */
624   protocol->execute(server->timeout_queue, 0, protocol, sock, 0, 0);
625 }
626   
627 /* This function connects to our primary router or if we are a router this
628    establishes all our primary routes. This is called at the start of the
629    server to do authentication and key exchange with our router - called
630    from schedule. */
631
632 SILC_TASK_CALLBACK(silc_server_connect_to_router)
633 {
634   SilcServer server = (SilcServer)context;
635   SilcServerConnection sconn;
636
637   SILC_LOG_DEBUG(("Connecting to router(s)"));
638
639   /* If we are normal SILC server we need to connect to our cell's
640      router. */
641   if (server->server_type == SILC_SERVER) {
642     SILC_LOG_DEBUG(("We are normal server"));
643
644     /* Create connection to the router, if configured. */
645     if (server->config->routers) {
646
647       /* Allocate connection object for hold connection specific stuff. */
648       sconn = silc_calloc(1, sizeof(*sconn));
649       sconn->server = server;
650       sconn->remote_host = strdup(server->config->routers->host);
651       sconn->remote_port = server->config->routers->port;
652
653       silc_task_register(server->timeout_queue, fd, 
654                          silc_server_connect_router,
655                          (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
656                          SILC_TASK_PRI_NORMAL);
657       return;
658     }
659   }
660
661   /* If we are a SILC router we need to establish all of our primary
662      routes. */
663   if (server->server_type == SILC_ROUTER) {
664     SilcServerConfigSectionServerConnection *ptr;
665
666     SILC_LOG_DEBUG(("We are router"));
667
668     /* Create the connections to all our routes */
669     ptr = server->config->routers;
670     while (ptr) {
671
672       SILC_LOG_DEBUG(("Router connection [%s] %s:%d",
673                       ptr->initiator ? "Initiator" : "Responder",
674                       ptr->host, ptr->port));
675
676       if (ptr->initiator) {
677         /* Allocate connection object for hold connection specific stuff. */
678         sconn = silc_calloc(1, sizeof(*sconn));
679         sconn->server = server;
680         sconn->remote_host = strdup(ptr->host);
681         sconn->remote_port = ptr->port;
682
683         silc_task_register(server->timeout_queue, fd, 
684                            silc_server_connect_router,
685                            (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
686                            SILC_TASK_PRI_NORMAL);
687       }
688
689       if (!ptr->next)
690         return;
691
692       ptr = ptr->next;
693     }
694   }
695
696   SILC_LOG_DEBUG(("No router(s), server will be standalone"));
697   
698   /* There wasn't a configured router, we will continue but we don't
699      have a connection to outside world.  We will be standalone server. */
700   server->standalone = TRUE;
701 }
702
703 /* Second part of connecting to router(s). Key exchange protocol has been
704    executed and now we will execute authentication protocol. */
705
706 SILC_TASK_CALLBACK(silc_server_connect_to_router_second)
707 {
708   SilcProtocol protocol = (SilcProtocol)context;
709   SilcServerKEInternalContext *ctx = 
710     (SilcServerKEInternalContext *)protocol->context;
711   SilcServer server = (SilcServer)ctx->server;
712   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
713   SilcSocketConnection sock = server->sockets[fd];
714   SilcServerConnAuthInternalContext *proto_ctx;
715   SilcServerConfigSectionServerConnection *conn = NULL;
716
717   SILC_LOG_DEBUG(("Start"));
718
719   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
720       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
721     /* Error occured during protocol */
722     silc_protocol_free(protocol);
723     sock->protocol = NULL;
724     silc_ske_free_key_material(ctx->keymat);
725     if (ctx->packet)
726       silc_packet_context_free(ctx->packet);
727     if (ctx->ske)
728       silc_ske_free(ctx->ske);
729     if (ctx->dest_id)
730       silc_free(ctx->dest_id);
731     silc_free(ctx);
732     silc_task_unregister_by_callback(server->timeout_queue,
733                                      silc_server_failure_callback);
734     silc_server_disconnect_remote(server, sock, "Server closed connection: "
735                                   "Key exchange failed");
736     return;
737   }
738   
739   /* We now have the key material as the result of the key exchange
740      protocol. Take the key material into use. Free the raw key material
741      as soon as we've set them into use. */
742   if (!silc_server_protocol_ke_set_keys(ctx->ske, ctx->sock, ctx->keymat,
743                                         ctx->ske->prop->cipher,
744                                         ctx->ske->prop->pkcs,
745                                         ctx->ske->prop->hash,
746                                         ctx->ske->prop->hmac,
747                                         ctx->responder)) {
748     silc_protocol_free(protocol);
749     sock->protocol = NULL;
750     silc_ske_free_key_material(ctx->keymat);
751     if (ctx->packet)
752       silc_packet_context_free(ctx->packet);
753     if (ctx->ske)
754       silc_ske_free(ctx->ske);
755     if (ctx->dest_id)
756       silc_free(ctx->dest_id);
757     silc_free(ctx);
758     silc_task_unregister_by_callback(server->timeout_queue,
759                                      silc_server_failure_callback);
760     silc_server_disconnect_remote(server, sock, "Server closed connection: "
761                                   "Key exchange failed");
762     return;
763   }    
764   silc_ske_free_key_material(ctx->keymat);
765
766   /* Allocate internal context for the authentication protocol. This
767      is sent as context for the protocol. */
768   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
769   proto_ctx->server = (void *)server;
770   proto_ctx->context = (void *)sconn;
771   proto_ctx->sock = sock;
772   proto_ctx->ske = ctx->ske;       /* Save SKE object from previous protocol */
773   proto_ctx->dest_id_type = ctx->dest_id_type;
774   proto_ctx->dest_id = ctx->dest_id;
775
776   /* Resolve the authentication method used in this connection. Check if 
777      we find a match from user configured connections */
778   conn = silc_server_config_find_router_conn(server->config,
779                                              sock->hostname,
780                                              sock->port);
781   if (conn) {
782     /* Match found. Use the configured authentication method */
783     proto_ctx->auth_meth = conn->auth_meth;
784     if (conn->auth_data) {
785       proto_ctx->auth_data = strdup(conn->auth_data);
786       proto_ctx->auth_data_len = strlen(conn->auth_data);
787     }
788   } else {
789     SILC_LOG_ERROR(("Could not find connection data for %s (%s) on port",
790                     sock->hostname, sock->ip, sock->port));
791     silc_protocol_free(protocol);
792     sock->protocol = NULL;
793     if (ctx->packet)
794       silc_packet_context_free(ctx->packet);
795     if (ctx->ske)
796       silc_ske_free(ctx->ske);
797     if (ctx->dest_id)
798       silc_free(ctx->dest_id);
799     silc_free(ctx);
800     silc_task_unregister_by_callback(server->timeout_queue,
801                                      silc_server_failure_callback);
802     silc_server_disconnect_remote(server, sock, "Server closed connection: "
803                                   "Key exchange failed");
804     return;
805   }
806
807   /* Free old protocol as it is finished now */
808   silc_protocol_free(protocol);
809   if (ctx->packet)
810     silc_packet_context_free(ctx->packet);
811   silc_free(ctx);
812   sock->protocol = NULL;
813
814   /* Allocate the authentication protocol. This is allocated here
815      but we won't start it yet. We will be receiving party of this
816      protocol thus we will wait that connecting party will make
817      their first move. */
818   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
819                       &sock->protocol, proto_ctx, 
820                       silc_server_connect_to_router_final);
821
822   /* Register timeout task. If the protocol is not executed inside
823      this timelimit the connection will be terminated. Currently
824      this is 15 seconds and is hard coded limit (XXX). */
825   proto_ctx->timeout_task = 
826     silc_task_register(server->timeout_queue, sock->sock, 
827                        silc_server_timeout_remote,
828                        (void *)server, 15, 0,
829                        SILC_TASK_TIMEOUT,
830                        SILC_TASK_PRI_LOW);
831
832   /* Run the protocol */
833   sock->protocol->execute(server->timeout_queue, 0, 
834                           sock->protocol, sock->sock, 0, 0);
835 }
836
837 /* Finalizes the connection to router. Registers a server task to the
838    queue so that we can accept new connections. */
839
840 SILC_TASK_CALLBACK(silc_server_connect_to_router_final)
841 {
842   SilcProtocol protocol = (SilcProtocol)context;
843   SilcServerConnAuthInternalContext *ctx = 
844     (SilcServerConnAuthInternalContext *)protocol->context;
845   SilcServer server = (SilcServer)ctx->server;
846   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
847   SilcSocketConnection sock = ctx->sock;
848   SilcServerEntry id_entry;
849   SilcBuffer packet;
850   SilcServerHBContext hb_context;
851   SilcServerRekeyContext rekey;
852   unsigned char *id_string;
853
854   SILC_LOG_DEBUG(("Start"));
855
856   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
857       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
858     /* Error occured during protocol */
859     if (ctx->dest_id)
860       silc_free(ctx->dest_id);
861     silc_server_disconnect_remote(server, sock, "Server closed connection: "
862                                   "Authentication failed");
863     goto out;
864   }
865
866   /* Add a task to the queue. This task receives new connections to the 
867      server. This task remains on the queue until the end of the program. */
868   if (!server->listenning) {
869     silc_task_register(server->io_queue, server->sock, 
870                        silc_server_accept_new_connection,
871                        (void *)server, 0, 0, 
872                        SILC_TASK_FD,
873                        SILC_TASK_PRI_NORMAL);
874     server->listenning = TRUE;
875   }
876
877   /* Send NEW_SERVER packet to the router. We will become registered
878      to the SILC network after sending this packet. */
879   id_string = silc_id_id2str(server->id, SILC_ID_SERVER);
880   packet = silc_buffer_alloc(2 + 2 + SILC_ID_SERVER_LEN + 
881                              strlen(server->server_name));
882   silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
883   silc_buffer_format(packet,
884                      SILC_STR_UI_SHORT(SILC_ID_SERVER_LEN),
885                      SILC_STR_UI_XNSTRING(id_string, SILC_ID_SERVER_LEN),
886                      SILC_STR_UI_SHORT(strlen(server->server_name)),
887                      SILC_STR_UI_XNSTRING(server->server_name,
888                                           strlen(server->server_name)),
889                      SILC_STR_END);
890
891   /* Send the packet */
892   silc_server_packet_send(server, ctx->sock, SILC_PACKET_NEW_SERVER, 0,
893                           packet->data, packet->len, TRUE);
894   silc_buffer_free(packet);
895   silc_free(id_string);
896
897   SILC_LOG_DEBUG(("Connected to router %s", sock->hostname));
898
899   /* Add the connected router to local server list */
900   server->standalone = FALSE;
901   id_entry = silc_idlist_add_server(server->local_list, sock->hostname,
902                                     SILC_ROUTER, ctx->dest_id, NULL, sock);
903   if (!id_entry) {
904     if (ctx->dest_id)
905       silc_free(ctx->dest_id);
906     silc_server_disconnect_remote(server, sock, "Server closed connection: "
907                                   "Authentication failed");
908     goto out;
909   }
910
911   silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
912   silc_free(sock->user_data);
913   sock->user_data = (void *)id_entry;
914   sock->type = SILC_SOCKET_TYPE_ROUTER;
915   server->id_entry->router = id_entry;
916   server->router = id_entry;
917   server->router->data.registered = TRUE;
918
919   /* Perform keepalive. The `hb_context' will be freed automatically
920      when finally calling the silc_socket_free function. XXX hardcoded 
921      timeout!! */
922   hb_context = silc_calloc(1, sizeof(*hb_context));
923   hb_context->server = server;
924   silc_socket_set_heartbeat(sock, 600, hb_context,
925                             silc_server_perform_heartbeat,
926                             server->timeout_queue);
927
928   /* Register re-key timeout */
929   /* XXX this leaks memory as this is not freed anywhere, currently */
930   rekey = silc_calloc(1, sizeof(*rekey));
931   rekey->server = server;
932   rekey->sock = sock;
933   rekey->timeout = 3600; /* XXX hardcoded */
934   silc_task_register(server->timeout_queue, sock->sock, 
935                      silc_server_rekey_callback,
936                      (void *)rekey, rekey->timeout, 0,
937                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
938
939   /* If we are router then announce our possible servers. */
940   if (server->server_type == SILC_ROUTER)
941     silc_server_announce_servers(server);
942
943   /* Announce our clients and channels to the router */
944   silc_server_announce_clients(server);
945   silc_server_announce_channels(server);
946
947  out:
948   /* Free the temporary connection data context */
949   if (sconn) {
950     silc_free(sconn->remote_host);
951     silc_free(sconn);
952   }
953
954   /* Free the protocol object */
955   silc_protocol_free(protocol);
956   if (ctx->packet)
957     silc_packet_context_free(ctx->packet);
958   if (ctx->ske)
959     silc_ske_free(ctx->ske);
960   silc_free(ctx);
961   sock->protocol = NULL;
962 }
963
964 /* Accepts new connections to the server. Accepting new connections are
965    done in three parts to make it async. */
966
967 SILC_TASK_CALLBACK(silc_server_accept_new_connection)
968 {
969   SilcServer server = (SilcServer)context;
970   SilcSocketConnection newsocket;
971   SilcServerKEInternalContext *proto_ctx;
972   int sock;
973
974   SILC_LOG_DEBUG(("Accepting new connection"));
975
976   server->stat.conn_attempts++;
977
978   sock = silc_net_accept_connection(server->sock);
979   if (sock < 0) {
980     SILC_LOG_ERROR(("Could not accept new connection: %s", strerror(errno)));
981     server->stat.conn_failures++;
982     return;
983   }
984
985   /* Check max connections */
986   if (sock > SILC_SERVER_MAX_CONNECTIONS) {
987     SILC_LOG_ERROR(("Refusing connection, server is full"));
988     server->stat.conn_failures++;
989     return;
990   }
991
992   /* Set socket options */
993   silc_net_set_socket_nonblock(sock);
994   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
995
996   /* We don't create a ID yet, since we don't know what type of connection
997      this is yet. But, we do add the connection to the socket table. */
998   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
999   server->sockets[sock] = newsocket;
1000
1001   /* XXX This MUST be done async as this will block the entire server
1002      process. Either we have to do our own resolver stuff or in the future
1003      we can use threads. */
1004   /* Perform name and address lookups for the remote host. */
1005   silc_net_check_host_by_sock(sock, &newsocket->hostname, &newsocket->ip);
1006   if ((server->params->require_reverse_mapping && !newsocket->hostname) ||
1007       !newsocket->ip) {
1008     SILC_LOG_ERROR(("IP/DNS lookup failed"));
1009     server->stat.conn_failures++;
1010     return;
1011   }
1012   if (!newsocket->hostname)
1013     newsocket->hostname = strdup(newsocket->ip);
1014   newsocket->port = silc_net_get_remote_port(sock);
1015
1016   SILC_LOG_INFO(("Incoming connection from %s (%s)", newsocket->hostname,
1017                  newsocket->ip));
1018
1019   /* Allocate internal context for key exchange protocol. This is
1020      sent as context for the protocol. */
1021   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
1022   proto_ctx->server = context;
1023   proto_ctx->sock = newsocket;
1024   proto_ctx->rng = server->rng;
1025   proto_ctx->responder = TRUE;
1026
1027   /* Prepare the connection for key exchange protocol. We allocate the
1028      protocol but will not start it yet. The connector will be the
1029      initiator of the protocol thus we will wait for initiation from 
1030      there before we start the protocol. */
1031   server->stat.auth_attempts++;
1032   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
1033                       &newsocket->protocol, proto_ctx, 
1034                       silc_server_accept_new_connection_second);
1035
1036   /* Register a timeout task that will be executed if the connector
1037      will not start the key exchange protocol within 60 seconds. For
1038      now, this is a hard coded limit. After 60 secs the connection will
1039      be closed if the key exchange protocol has not been started. */
1040   proto_ctx->timeout_task = 
1041     silc_task_register(server->timeout_queue, newsocket->sock, 
1042                        silc_server_timeout_remote,
1043                        context, 60, 0,
1044                        SILC_TASK_TIMEOUT,
1045                        SILC_TASK_PRI_LOW);
1046
1047   /* Register the connection for network input and output. This sets
1048      that scheduler will listen for incoming packets for this connection 
1049      and sets that outgoing packets may be sent to this connection as well.
1050      However, this doesn't set the scheduler for outgoing traffic, it
1051      will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
1052      later when outgoing data is available. */
1053   SILC_REGISTER_CONNECTION_FOR_IO(sock);
1054 }
1055
1056 /* Second part of accepting new connection. Key exchange protocol has been
1057    performed and now it is time to do little connection authentication
1058    protocol to figure out whether this connection is client or server
1059    and whether it has right to access this server (especially server
1060    connections needs to be authenticated). */
1061
1062 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second)
1063 {
1064   SilcProtocol protocol = (SilcProtocol)context;
1065   SilcServerKEInternalContext *ctx = 
1066     (SilcServerKEInternalContext *)protocol->context;
1067   SilcServer server = (SilcServer)ctx->server;
1068   SilcSocketConnection sock = server->sockets[fd];
1069   SilcServerConnAuthInternalContext *proto_ctx;
1070
1071   SILC_LOG_DEBUG(("Start"));
1072
1073   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
1074       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
1075     /* Error occured during protocol */
1076     silc_protocol_free(protocol);
1077     sock->protocol = NULL;
1078     silc_ske_free_key_material(ctx->keymat);
1079     if (ctx->packet)
1080       silc_packet_context_free(ctx->packet);
1081     if (ctx->ske)
1082       silc_ske_free(ctx->ske);
1083     if (ctx->dest_id)
1084       silc_free(ctx->dest_id);
1085     silc_free(ctx);
1086     silc_task_unregister_by_callback(server->timeout_queue,
1087                                      silc_server_failure_callback);
1088     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1089                                   "Key exchange failed");
1090     server->stat.auth_failures++;
1091     return;
1092   }
1093
1094   /* We now have the key material as the result of the key exchange
1095      protocol. Take the key material into use. Free the raw key material
1096      as soon as we've set them into use. */
1097   if (!silc_server_protocol_ke_set_keys(ctx->ske, ctx->sock, ctx->keymat,
1098                                         ctx->ske->prop->cipher,
1099                                         ctx->ske->prop->pkcs,
1100                                         ctx->ske->prop->hash,
1101                                         ctx->ske->prop->hmac,
1102                                         ctx->responder)) {
1103     silc_protocol_free(protocol);
1104     sock->protocol = NULL;
1105     silc_ske_free_key_material(ctx->keymat);
1106     if (ctx->packet)
1107       silc_packet_context_free(ctx->packet);
1108     if (ctx->ske)
1109       silc_ske_free(ctx->ske);
1110     if (ctx->dest_id)
1111       silc_free(ctx->dest_id);
1112     silc_free(ctx);
1113     silc_task_unregister_by_callback(server->timeout_queue,
1114                                      silc_server_failure_callback);
1115     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1116                                   "Key exchange failed");
1117     server->stat.auth_failures++;
1118     return;
1119   }    
1120   silc_ske_free_key_material(ctx->keymat);
1121
1122   /* Allocate internal context for the authentication protocol. This
1123      is sent as context for the protocol. */
1124   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
1125   proto_ctx->server = (void *)server;
1126   proto_ctx->sock = sock;
1127   proto_ctx->ske = ctx->ske;    /* Save SKE object from previous protocol */
1128   proto_ctx->responder = TRUE;
1129   proto_ctx->dest_id_type = ctx->dest_id_type;
1130   proto_ctx->dest_id = ctx->dest_id;
1131
1132   /* Free old protocol as it is finished now */
1133   silc_protocol_free(protocol);
1134   if (ctx->packet)
1135     silc_packet_context_free(ctx->packet);
1136   silc_free(ctx);
1137   sock->protocol = NULL;
1138
1139   /* Allocate the authentication protocol. This is allocated here
1140      but we won't start it yet. We will be receiving party of this
1141      protocol thus we will wait that connecting party will make
1142      their first move. */
1143   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
1144                       &sock->protocol, proto_ctx, 
1145                       silc_server_accept_new_connection_final);
1146
1147   /* Register timeout task. If the protocol is not executed inside
1148      this timelimit the connection will be terminated. Currently
1149      this is 60 seconds and is hard coded limit (XXX). */
1150   proto_ctx->timeout_task = 
1151     silc_task_register(server->timeout_queue, sock->sock, 
1152                        silc_server_timeout_remote,
1153                        (void *)server, 60, 0,
1154                        SILC_TASK_TIMEOUT,
1155                        SILC_TASK_PRI_LOW);
1156 }
1157
1158 /* Final part of accepting new connection. The connection has now
1159    been authenticated and keys has been exchanged. We also know whether
1160    this is client or server connection. */
1161
1162 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final)
1163 {
1164   SilcProtocol protocol = (SilcProtocol)context;
1165   SilcServerConnAuthInternalContext *ctx = 
1166     (SilcServerConnAuthInternalContext *)protocol->context;
1167   SilcServer server = (SilcServer)ctx->server;
1168   SilcSocketConnection sock = ctx->sock;
1169   SilcServerHBContext hb_context;
1170   void *id_entry = NULL;
1171
1172   SILC_LOG_DEBUG(("Start"));
1173
1174   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
1175       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
1176     /* Error occured during protocol */
1177     silc_protocol_free(protocol);
1178     sock->protocol = NULL;
1179     if (ctx->packet)
1180       silc_packet_context_free(ctx->packet);
1181     if (ctx->ske)
1182       silc_ske_free(ctx->ske);
1183     if (ctx->dest_id)
1184       silc_free(ctx->dest_id);
1185     silc_free(ctx);
1186     if (sock)
1187       sock->protocol = NULL;
1188     silc_task_unregister_by_callback(server->timeout_queue,
1189                                      silc_server_failure_callback);
1190     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1191                                   "Authentication failed");
1192     server->stat.auth_failures++;
1193     return;
1194   }
1195
1196   sock->type = ctx->conn_type;
1197   switch(sock->type) {
1198   case SILC_SOCKET_TYPE_CLIENT:
1199     {
1200       SilcClientEntry client;
1201
1202       SILC_LOG_DEBUG(("Remote host is client"));
1203       SILC_LOG_INFO(("Connection from %s (%s) is client", sock->hostname,
1204                      sock->ip));
1205
1206       /* Add the client to the client ID cache. The nickname and Client ID
1207          and other information is created after we have received NEW_CLIENT
1208          packet from client. */
1209       client = silc_idlist_add_client(server->local_list, 
1210                                       NULL, 0, NULL, NULL, NULL, NULL, sock);
1211       if (!client) {
1212         SILC_LOG_ERROR(("Could not add new client to cache"));
1213         silc_free(sock->user_data);
1214         break;
1215       }
1216
1217       /* Statistics */
1218       server->stat.my_clients++;
1219       server->stat.clients++;
1220       if (server->server_type == SILC_ROUTER)
1221         server->stat.cell_clients++;
1222
1223       id_entry = (void *)client;
1224       break;
1225     }
1226   case SILC_SOCKET_TYPE_SERVER:
1227   case SILC_SOCKET_TYPE_ROUTER:
1228     {
1229       SilcServerEntry new_server;
1230
1231       SILC_LOG_DEBUG(("Remote host is %s", 
1232                       sock->type == SILC_SOCKET_TYPE_SERVER ? 
1233                       "server" : "router"));
1234       SILC_LOG_INFO(("Connection from %s (%s) is %s", sock->hostname,
1235                      sock->ip, sock->type == SILC_SOCKET_TYPE_SERVER ? 
1236                      "server" : "router"));
1237
1238       /* Add the server into server cache. The server name and Server ID
1239          is updated after we have received NEW_SERVER packet from the
1240          server. We mark ourselves as router for this server if we really
1241          are router. */
1242       new_server = 
1243         silc_idlist_add_server(server->local_list, NULL,
1244                                sock->type == SILC_SOCKET_TYPE_SERVER ?
1245                                SILC_SERVER : SILC_ROUTER, NULL, 
1246                                sock->type == SILC_SOCKET_TYPE_SERVER ?
1247                                server->id_entry : NULL, sock);
1248       if (!new_server) {
1249         SILC_LOG_ERROR(("Could not add new server to cache"));
1250         silc_free(sock->user_data);
1251         break;
1252       }
1253
1254       /* Statistics */
1255       if (sock->type == SILC_SOCKET_TYPE_SERVER)
1256         server->stat.my_servers++;
1257       else
1258         server->stat.my_routers++;
1259       server->stat.servers++;
1260
1261       id_entry = (void *)new_server;
1262       
1263       /* There is connection to other server now, if it is router then
1264          we will have connection to outside world.  If we are router but
1265          normal server connected to us then we will remain standalone,
1266          if we are standlone. */
1267       if (server->standalone && sock->type == SILC_SOCKET_TYPE_ROUTER) {
1268         SILC_LOG_DEBUG(("We are not standalone server anymore"));
1269         server->standalone = FALSE;
1270         if (!server->id_entry->router) {
1271           server->id_entry->router = id_entry;
1272           server->router = id_entry;
1273         }
1274       }
1275       break;
1276     }
1277   default:
1278     break;
1279   }
1280
1281   /* Add the common data structure to the ID entry. */
1282   if (id_entry)
1283     silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
1284       
1285   /* Add to sockets internal pointer for fast referencing */
1286   silc_free(sock->user_data);
1287   sock->user_data = id_entry;
1288
1289   /* Connection has been fully established now. Everything is ok. */
1290   SILC_LOG_DEBUG(("New connection authenticated"));
1291
1292   /* Perform keepalive. The `hb_context' will be freed automatically
1293      when finally calling the silc_socket_free function. XXX hardcoded 
1294      timeout!! */
1295   hb_context = silc_calloc(1, sizeof(*hb_context));
1296   hb_context->server = server;
1297   silc_socket_set_heartbeat(sock, 600, hb_context,
1298                             silc_server_perform_heartbeat,
1299                             server->timeout_queue);
1300
1301   silc_task_unregister_by_callback(server->timeout_queue,
1302                                    silc_server_failure_callback);
1303   silc_protocol_free(protocol);
1304   if (ctx->packet)
1305     silc_packet_context_free(ctx->packet);
1306   if (ctx->ske)
1307     silc_ske_free(ctx->ske);
1308   if (ctx->dest_id)
1309     silc_free(ctx->dest_id);
1310   silc_free(ctx);
1311   sock->protocol = NULL;
1312 }
1313
1314 /* This function is used to read packets from network and send packets to
1315    network. This is usually a generic task. */
1316
1317 SILC_TASK_CALLBACK(silc_server_packet_process)
1318 {
1319   SilcServer server = (SilcServer)context;
1320   SilcSocketConnection sock = server->sockets[fd];
1321   SilcIDListData idata;
1322   SilcCipher cipher = NULL;
1323   SilcHmac hmac = NULL;
1324   int ret;
1325
1326   if (!sock)
1327     return;
1328
1329   SILC_LOG_DEBUG(("Processing packet"));
1330
1331   /* Packet sending */
1332
1333   if (type == SILC_TASK_WRITE) {
1334     /* Do not send data to disconnected connection */
1335     if (SILC_IS_DISCONNECTED(sock))
1336       return;
1337
1338     server->stat.packets_sent++;
1339
1340     if (sock->outbuf->data - sock->outbuf->head)
1341      silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
1342
1343     ret = silc_server_packet_send_real(server, sock, TRUE);
1344
1345     /* If returned -2 could not write to connection now, will do
1346        it later. */
1347     if (ret == -2)
1348       return;
1349
1350     if (ret == -1)
1351       return;
1352     
1353     /* The packet has been sent and now it is time to set the connection
1354        back to only for input. When there is again some outgoing data 
1355        available for this connection it will be set for output as well. 
1356        This call clears the output setting and sets it only for input. */
1357     SILC_SET_CONNECTION_FOR_INPUT(fd);
1358     SILC_UNSET_OUTBUF_PENDING(sock);
1359
1360     silc_buffer_clear(sock->outbuf);
1361     return;
1362   }
1363
1364   /* Packet receiving */
1365
1366   /* Read some data from connection */
1367   ret = silc_packet_receive(sock);
1368   if (ret < 0)
1369     return;
1370     
1371   /* EOF */
1372   if (ret == 0) {
1373     SILC_LOG_DEBUG(("Read EOF"));
1374       
1375     /* If connection is disconnecting already we will finally
1376        close the connection */
1377     if (SILC_IS_DISCONNECTING(sock)) {
1378       if (sock->user_data)
1379         silc_server_free_sock_user_data(server, sock);
1380       silc_server_close_connection(server, sock);
1381       return;
1382     }
1383       
1384     SILC_LOG_DEBUG(("Premature EOF from connection %d", sock->sock));
1385     SILC_SET_DISCONNECTING(sock);
1386
1387     /* If the closed connection was our primary router connection the
1388        start re-connecting phase. */
1389     if (!server->standalone && sock->type == SILC_SOCKET_TYPE_ROUTER && 
1390         sock == server->router->connection)
1391       silc_task_register(server->timeout_queue, 0, 
1392                          silc_server_connect_to_router,
1393                          context, 1, 0,
1394                          SILC_TASK_TIMEOUT,
1395                          SILC_TASK_PRI_NORMAL);
1396
1397     if (sock->user_data)
1398       silc_server_free_sock_user_data(server, sock);
1399     silc_server_close_connection(server, sock);
1400     return;
1401   }
1402
1403   /* If connection is disconnecting or disconnected we will ignore
1404      what we read. */
1405   if (SILC_IS_DISCONNECTING(sock) || SILC_IS_DISCONNECTED(sock)) {
1406     SILC_LOG_DEBUG(("Ignoring read data from disonnected connection"));
1407     return;
1408   }
1409
1410   server->stat.packets_received++;
1411
1412   /* Get keys and stuff from ID entry */
1413   idata = (SilcIDListData)sock->user_data;
1414   if (idata) {
1415     idata->last_receive = time(NULL);
1416     cipher = idata->receive_key;
1417     hmac = idata->hmac;
1418   }
1419  
1420   /* Process the packet. This will call the parser that will then
1421      decrypt and parse the packet. */
1422   silc_packet_receive_process(sock, cipher, hmac, silc_server_packet_parse, 
1423                               server);
1424 }
1425
1426 /* Callback function that the silc_packet_decrypt will call to make the
1427    decision whether the packet is normal or special packet. We will 
1428    return TRUE if it is normal and FALSE if it is special */
1429
1430 static int silc_server_packet_decrypt_check(SilcPacketType packet_type,
1431                                             SilcBuffer buffer,
1432                                             SilcPacketContext *packet,
1433                                             void *context)
1434 {
1435   SilcPacketParserContext *parse_ctx = (SilcPacketParserContext *)context;
1436   SilcServer server = (SilcServer)parse_ctx->context;
1437
1438   /* Packet is normal packet, if: 
1439
1440      1) packet is private message packet and does not have private key set
1441      2) is other packet than channel message packet
1442      3) is channel message packet and remote is router and we are router 
1443
1444      all other packets are special packets 
1445   */
1446
1447   if (packet_type == SILC_PACKET_PRIVATE_MESSAGE &&
1448       (buffer->data[2] & SILC_PACKET_FLAG_PRIVMSG_KEY))
1449     return FALSE;
1450
1451   if (packet_type != SILC_PACKET_CHANNEL_MESSAGE || 
1452       (packet_type == SILC_PACKET_CHANNEL_MESSAGE &&
1453        parse_ctx->sock->type == SILC_SOCKET_TYPE_ROUTER &&
1454        server->server_type == SILC_ROUTER))
1455     return TRUE;
1456
1457   return FALSE;
1458 }
1459
1460 /* Parses whole packet, received earlier. */
1461
1462 SILC_TASK_CALLBACK(silc_server_packet_parse_real)
1463 {
1464   SilcPacketParserContext *parse_ctx = (SilcPacketParserContext *)context;
1465   SilcServer server = (SilcServer)parse_ctx->context;
1466   SilcSocketConnection sock = parse_ctx->sock;
1467   SilcPacketContext *packet = parse_ctx->packet;
1468   int ret;
1469
1470   SILC_LOG_DEBUG(("Start"));
1471
1472   /* Decrypt the received packet */
1473   ret = silc_packet_decrypt(parse_ctx->cipher, parse_ctx->hmac, 
1474                             packet->buffer, packet,
1475                             silc_server_packet_decrypt_check, parse_ctx);
1476   if (ret < 0)
1477     goto out;
1478
1479   if (ret == 0) {
1480     /* Parse the packet. Packet type is returned. */
1481     ret = silc_packet_parse(packet);
1482   } else {
1483     /* Parse the packet header in special way as this is "special"
1484        packet type. */
1485     ret = silc_packet_parse_special(packet);
1486   }
1487
1488   if (ret == SILC_PACKET_NONE)
1489     goto out;
1490
1491   /* Check that the the current client ID is same as in the client's packet. */
1492   if (sock->type == SILC_SOCKET_TYPE_CLIENT) {
1493     SilcClientEntry client = (SilcClientEntry)sock->user_data;
1494     if (client && client->id) {
1495       void *id = silc_id_str2id(packet->src_id, packet->src_id_len,
1496                                 packet->src_id_type);
1497       if (SILC_ID_CLIENT_COMPARE(client->id, id)) {
1498         silc_free(id);
1499         goto out;
1500       }
1501       silc_free(id);
1502     }
1503   }
1504
1505   if (server->server_type == SILC_ROUTER) {
1506     /* Route the packet if it is not destined to us. Other ID types but
1507        server are handled separately after processing them. */
1508     if (packet->dst_id_type == SILC_ID_SERVER && 
1509         sock->type != SILC_SOCKET_TYPE_CLIENT &&
1510         SILC_ID_SERVER_COMPARE(packet->dst_id, server->id_string)) {
1511       
1512       /* Route the packet to fastest route for the destination ID */
1513       void *id = silc_id_str2id(packet->dst_id, packet->dst_id_len, 
1514                                 packet->dst_id_type);
1515       if (!id)
1516         goto out;
1517       silc_server_packet_route(server,
1518                                silc_server_route_get(server, id,
1519                                                      packet->dst_id_type),
1520                                packet);
1521       silc_free(id);
1522       goto out;
1523     }
1524     
1525     /* Broadcast packet if it is marked as broadcast packet and it is
1526        originated from router and we are router. */
1527     if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
1528         packet->flags & SILC_PACKET_FLAG_BROADCAST) {
1529       silc_server_packet_broadcast(server, server->router->connection, packet);
1530     }
1531   }
1532
1533   /* Parse the incoming packet type */
1534   silc_server_packet_parse_type(server, sock, packet);
1535
1536  out:
1537   /*  silc_buffer_clear(sock->inbuf); */
1538   silc_packet_context_free(packet);
1539   silc_free(parse_ctx);
1540 }
1541
1542 /* Parser callback called by silc_packet_receive_process. This merely
1543    registers timeout that will handle the actual parsing when appropriate. */
1544
1545 void silc_server_packet_parse(SilcPacketParserContext *parser_context)
1546 {
1547   SilcServer server = (SilcServer)parser_context->context;
1548   SilcSocketConnection sock = parser_context->sock;
1549
1550   switch (sock->type) {
1551   case SILC_SOCKET_TYPE_CLIENT:
1552   case SILC_SOCKET_TYPE_UNKNOWN:
1553     /* Parse the packet with timeout */
1554     silc_task_register(server->timeout_queue, sock->sock,
1555                        silc_server_packet_parse_real,
1556                        (void *)parser_context, 0, 100000,
1557                        SILC_TASK_TIMEOUT,
1558                        SILC_TASK_PRI_NORMAL);
1559     break;
1560   case SILC_SOCKET_TYPE_SERVER:
1561   case SILC_SOCKET_TYPE_ROUTER:
1562     /* Packets from servers are parsed as soon as possible */
1563     silc_task_register(server->timeout_queue, sock->sock,
1564                        silc_server_packet_parse_real,
1565                        (void *)parser_context, 0, 1,
1566                        SILC_TASK_TIMEOUT,
1567                        SILC_TASK_PRI_NORMAL);
1568     break;
1569   default:
1570     return;
1571   }
1572 }
1573
1574 /* Parses the packet type and calls what ever routines the packet type
1575    requires. This is done for all incoming packets. */
1576
1577 void silc_server_packet_parse_type(SilcServer server, 
1578                                    SilcSocketConnection sock,
1579                                    SilcPacketContext *packet)
1580 {
1581   SilcPacketType type = packet->type;
1582
1583   SILC_LOG_DEBUG(("Parsing packet type %d", type));
1584
1585   /* Parse the packet type */
1586   switch(type) {
1587   case SILC_PACKET_DISCONNECT:
1588     SILC_LOG_DEBUG(("Disconnect packet"));
1589     if (packet->flags & SILC_PACKET_FLAG_LIST)
1590       break;
1591     break;
1592
1593   case SILC_PACKET_SUCCESS:
1594     /*
1595      * Success received for something. For now we can have only
1596      * one protocol for connection executing at once hence this
1597      * success message is for whatever protocol is executing currently.
1598      */
1599     SILC_LOG_DEBUG(("Success packet"));
1600     if (packet->flags & SILC_PACKET_FLAG_LIST)
1601       break;
1602     if (sock->protocol) {
1603       sock->protocol->execute(server->timeout_queue, 0,
1604                               sock->protocol, sock->sock, 0, 0);
1605     }
1606     break;
1607
1608   case SILC_PACKET_FAILURE:
1609     /*
1610      * Failure received for something. For now we can have only
1611      * one protocol for connection executing at once hence this
1612      * failure message is for whatever protocol is executing currently.
1613      */
1614     SILC_LOG_DEBUG(("Failure packet"));
1615     if (packet->flags & SILC_PACKET_FLAG_LIST)
1616       break;
1617     if (sock->protocol) {
1618       SilcServerFailureContext f;
1619       f = silc_calloc(1, sizeof(*f));
1620       f->server = server;
1621       f->sock = sock;
1622       
1623       /* We will wait 5 seconds to process this failure packet */
1624       silc_task_register(server->timeout_queue, sock->sock,
1625                          silc_server_failure_callback, (void *)f, 5, 0,
1626                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
1627     }
1628     break;
1629
1630   case SILC_PACKET_REJECT:
1631     SILC_LOG_DEBUG(("Reject packet"));
1632     if (packet->flags & SILC_PACKET_FLAG_LIST)
1633       break;
1634     return;
1635     break;
1636
1637   case SILC_PACKET_NOTIFY:
1638     /*
1639      * Received notify packet. Server can receive notify packets from
1640      * router. Server then relays the notify messages to clients if needed.
1641      */
1642     SILC_LOG_DEBUG(("Notify packet"));
1643     if (packet->flags & SILC_PACKET_FLAG_LIST)
1644       silc_server_notify_list(server, sock, packet);
1645     else
1646       silc_server_notify(server, sock, packet);
1647     break;
1648
1649     /* 
1650      * Channel packets
1651      */
1652   case SILC_PACKET_CHANNEL_MESSAGE:
1653     /*
1654      * Received channel message. Channel messages are special packets
1655      * (although probably most common ones) thus they are handled
1656      * specially.
1657      */
1658     SILC_LOG_DEBUG(("Channel Message packet"));
1659     if (packet->flags & SILC_PACKET_FLAG_LIST)
1660       break;
1661     silc_server_channel_message(server, sock, packet);
1662     break;
1663
1664   case SILC_PACKET_CHANNEL_KEY:
1665     /*
1666      * Received key for channel. As channels are created by the router
1667      * the keys are as well. We will distribute the key to all of our
1668      * locally connected clients on the particular channel. Router
1669      * never receives this channel and thus is ignored.
1670      */
1671     SILC_LOG_DEBUG(("Channel Key packet"));
1672     if (packet->flags & SILC_PACKET_FLAG_LIST)
1673       break;
1674     silc_server_channel_key(server, sock, packet);
1675     break;
1676
1677     /*
1678      * Command packets
1679      */
1680   case SILC_PACKET_COMMAND:
1681     /*
1682      * Recived command. Processes the command request and allocates the
1683      * command context and calls the command.
1684      */
1685     SILC_LOG_DEBUG(("Command packet"));
1686     if (packet->flags & SILC_PACKET_FLAG_LIST)
1687       break;
1688     silc_server_command_process(server, sock, packet);
1689     break;
1690
1691   case SILC_PACKET_COMMAND_REPLY:
1692     /*
1693      * Received command reply packet. Received command reply to command. It
1694      * may be reply to command sent by us or reply to command sent by client
1695      * that we've routed further.
1696      */
1697     SILC_LOG_DEBUG(("Command Reply packet"));
1698     if (packet->flags & SILC_PACKET_FLAG_LIST)
1699       break;
1700     silc_server_command_reply(server, sock, packet);
1701     break;
1702
1703     /*
1704      * Private Message packets
1705      */
1706   case SILC_PACKET_PRIVATE_MESSAGE:
1707     /*
1708      * Received private message packet. The packet is coming from either
1709      * client or server.
1710      */
1711     SILC_LOG_DEBUG(("Private Message packet"));
1712     if (packet->flags & SILC_PACKET_FLAG_LIST)
1713       break;
1714     silc_server_private_message(server, sock, packet);
1715     break;
1716
1717   case SILC_PACKET_PRIVATE_MESSAGE_KEY:
1718     /*
1719      * Private message key packet.
1720      */
1721     if (packet->flags & SILC_PACKET_FLAG_LIST)
1722       break;
1723     silc_server_private_message_key(server, sock, packet);
1724     break;
1725
1726     /*
1727      * Key Exchange protocol packets
1728      */
1729   case SILC_PACKET_KEY_EXCHANGE:
1730     SILC_LOG_DEBUG(("KE packet"));
1731     if (packet->flags & SILC_PACKET_FLAG_LIST)
1732       break;
1733
1734     if (sock->protocol && sock->protocol->protocol &&
1735         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1736
1737       SilcServerKEInternalContext *proto_ctx = 
1738         (SilcServerKEInternalContext *)sock->protocol->context;
1739
1740       proto_ctx->packet = silc_packet_context_dup(packet);
1741
1742       /* Let the protocol handle the packet */
1743       sock->protocol->execute(server->timeout_queue, 0, 
1744                               sock->protocol, sock->sock, 0, 100000);
1745     } else {
1746       SILC_LOG_ERROR(("Received Key Exchange packet but no key exchange "
1747                       "protocol active, packet dropped."));
1748
1749       /* XXX Trigger KE protocol?? Rekey actually, maybe. */
1750     }
1751     break;
1752
1753   case SILC_PACKET_KEY_EXCHANGE_1:
1754     SILC_LOG_DEBUG(("KE 1 packet"));
1755     if (packet->flags & SILC_PACKET_FLAG_LIST)
1756       break;
1757
1758     if (sock->protocol && sock->protocol->protocol &&
1759         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1760
1761       SilcServerKEInternalContext *proto_ctx = 
1762         (SilcServerKEInternalContext *)sock->protocol->context;
1763
1764       if (proto_ctx->packet)
1765         silc_packet_context_free(proto_ctx->packet);
1766
1767       proto_ctx->packet = silc_packet_context_dup(packet);
1768       proto_ctx->dest_id_type = packet->src_id_type;
1769       proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1770                                           packet->src_id_type);
1771       if (!proto_ctx->dest_id)
1772         break;
1773
1774       /* Let the protocol handle the packet */
1775       sock->protocol->execute(server->timeout_queue, 0, 
1776                               sock->protocol, sock->sock,
1777                               0, 100000);
1778     } else {
1779       SILC_LOG_ERROR(("Received Key Exchange 1 packet but no key exchange "
1780                       "protocol active, packet dropped."));
1781     }
1782     break;
1783
1784   case SILC_PACKET_KEY_EXCHANGE_2:
1785     SILC_LOG_DEBUG(("KE 2 packet"));
1786     if (packet->flags & SILC_PACKET_FLAG_LIST)
1787       break;
1788
1789     if (sock->protocol && sock->protocol->protocol &&
1790         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1791
1792       SilcServerKEInternalContext *proto_ctx = 
1793         (SilcServerKEInternalContext *)sock->protocol->context;
1794
1795       if (proto_ctx->packet)
1796         silc_packet_context_free(proto_ctx->packet);
1797
1798       proto_ctx->packet = silc_packet_context_dup(packet);
1799       proto_ctx->dest_id_type = packet->src_id_type;
1800       proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1801                                           packet->src_id_type);
1802       if (!proto_ctx->dest_id)
1803         break;
1804
1805       /* Let the protocol handle the packet */
1806       sock->protocol->execute(server->timeout_queue, 0, 
1807                               sock->protocol, sock->sock,
1808                               0, 100000);
1809     } else {
1810       SILC_LOG_ERROR(("Received Key Exchange 2 packet but no key exchange "
1811                       "protocol active, packet dropped."));
1812     }
1813     break;
1814
1815   case SILC_PACKET_CONNECTION_AUTH_REQUEST:
1816     /*
1817      * Connection authentication request packet. When we receive this packet
1818      * we will send to the other end information about our mandatory
1819      * authentication method for the connection. This packet maybe received
1820      * at any time. 
1821      */
1822     SILC_LOG_DEBUG(("Connection authentication request packet"));
1823     if (packet->flags & SILC_PACKET_FLAG_LIST)
1824       break;
1825     silc_server_connection_auth_request(server, sock, packet);
1826     break;
1827
1828     /*
1829      * Connection Authentication protocol packets
1830      */
1831   case SILC_PACKET_CONNECTION_AUTH:
1832     /* Start of the authentication protocol. We receive here the 
1833        authentication data and will verify it. */
1834     SILC_LOG_DEBUG(("Connection auth packet"));
1835     if (packet->flags & SILC_PACKET_FLAG_LIST)
1836       break;
1837
1838     if (sock->protocol && sock->protocol->protocol->type 
1839         == SILC_PROTOCOL_SERVER_CONNECTION_AUTH) {
1840
1841       SilcServerConnAuthInternalContext *proto_ctx = 
1842         (SilcServerConnAuthInternalContext *)sock->protocol->context;
1843
1844       proto_ctx->packet = silc_packet_context_dup(packet);
1845
1846       /* Let the protocol handle the packet */
1847       sock->protocol->execute(server->timeout_queue, 0, 
1848                               sock->protocol, sock->sock, 0, 0);
1849     } else {
1850       SILC_LOG_ERROR(("Received Connection Auth packet but no authentication "
1851                       "protocol active, packet dropped."));
1852     }
1853     break;
1854
1855   case SILC_PACKET_NEW_ID:
1856     /*
1857      * Received New ID packet. This includes some new ID that has been
1858      * created. It may be for client, server or channel. This is the way
1859      * to distribute information about new registered entities in the
1860      * SILC network.
1861      */
1862     SILC_LOG_DEBUG(("New ID packet"));
1863     if (packet->flags & SILC_PACKET_FLAG_LIST)
1864       silc_server_new_id_list(server, sock, packet);
1865     else
1866       silc_server_new_id(server, sock, packet);
1867     break;
1868
1869   case SILC_PACKET_NEW_CLIENT:
1870     /*
1871      * Received new client packet. This includes client information that
1872      * we will use to create initial client ID. After creating new
1873      * ID we will send it to the client.
1874      */
1875     SILC_LOG_DEBUG(("New Client packet"));
1876     if (packet->flags & SILC_PACKET_FLAG_LIST)
1877       break;
1878     silc_server_new_client(server, sock, packet);
1879     break;
1880
1881   case SILC_PACKET_NEW_SERVER:
1882     /*
1883      * Received new server packet. This includes Server ID and some other
1884      * information that we may save. This is received after server has 
1885      * connected to us.
1886      */
1887     SILC_LOG_DEBUG(("New Server packet"));
1888     if (packet->flags & SILC_PACKET_FLAG_LIST)
1889       break;
1890     silc_server_new_server(server, sock, packet);
1891     break;
1892
1893   case SILC_PACKET_NEW_CHANNEL:
1894     /*
1895      * Received new channel packet. Information about new channel in the
1896      * network are distributed using this packet.
1897      */
1898     SILC_LOG_DEBUG(("New Channel packet"));
1899     if (packet->flags & SILC_PACKET_FLAG_LIST)
1900       silc_server_new_channel_list(server, sock, packet);
1901     else
1902       silc_server_new_channel(server, sock, packet);
1903     break;
1904
1905   case SILC_PACKET_HEARTBEAT:
1906     /*
1907      * Received heartbeat.
1908      */
1909     SILC_LOG_DEBUG(("Heartbeat packet"));
1910     if (packet->flags & SILC_PACKET_FLAG_LIST)
1911       break;
1912     break;
1913
1914   case SILC_PACKET_KEY_AGREEMENT:
1915     /*
1916      * Received heartbeat.
1917      */
1918     SILC_LOG_DEBUG(("Key agreement packet"));
1919     if (packet->flags & SILC_PACKET_FLAG_LIST)
1920       break;
1921     silc_server_key_agreement(server, sock, packet);
1922     break;
1923
1924   case SILC_PACKET_REKEY:
1925     /*
1926      * Received re-key packet. The sender wants to regenerate the session
1927      * keys.
1928      */
1929     SILC_LOG_DEBUG(("Re-key packet"));
1930     if (packet->flags & SILC_PACKET_FLAG_LIST)
1931       break;
1932     silc_server_rekey(server, sock, packet);
1933     break;
1934
1935   case SILC_PACKET_REKEY_DONE:
1936     /*
1937      * The re-key is done.
1938      */
1939     SILC_LOG_DEBUG(("Re-key done packet"));
1940     if (packet->flags & SILC_PACKET_FLAG_LIST)
1941       break;
1942
1943     if (sock->protocol && sock->protocol->protocol &&
1944         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
1945
1946       SilcServerRekeyInternalContext *proto_ctx = 
1947         (SilcServerRekeyInternalContext *)sock->protocol->context;
1948
1949       if (proto_ctx->packet)
1950         silc_packet_context_free(proto_ctx->packet);
1951
1952       proto_ctx->packet = silc_packet_context_dup(packet);
1953
1954       /* Let the protocol handle the packet */
1955       sock->protocol->execute(server->timeout_queue, 0, 
1956                               sock->protocol, sock->sock,
1957                               0, 100000);
1958     } else {
1959       SILC_LOG_ERROR(("Received Re-key done packet but no re-key "
1960                       "protocol active, packet dropped."));
1961     }
1962     break;
1963
1964   default:
1965     SILC_LOG_ERROR(("Incorrect packet type %d, packet dropped", type));
1966     break;
1967   }
1968   
1969 }
1970
1971 /* Creates connection to a remote router. */
1972
1973 void silc_server_create_connection(SilcServer server,
1974                                    char *remote_host, uint32 port)
1975 {
1976   SilcServerConnection sconn;
1977
1978   /* Allocate connection object for hold connection specific stuff. */
1979   sconn = silc_calloc(1, sizeof(*sconn));
1980   sconn->server = server;
1981   sconn->remote_host = strdup(remote_host);
1982   sconn->remote_port = port;
1983
1984   silc_task_register(server->timeout_queue, 0, 
1985                      silc_server_connect_router,
1986                      (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
1987                      SILC_TASK_PRI_NORMAL);
1988 }
1989
1990 SILC_TASK_CALLBACK(silc_server_close_connection_final)
1991 {
1992   silc_socket_free((SilcSocketConnection)context);
1993 }
1994
1995 /* Closes connection to socket connection */
1996
1997 void silc_server_close_connection(SilcServer server,
1998                                   SilcSocketConnection sock)
1999 {
2000   SILC_LOG_DEBUG(("Closing connection %d", sock->sock));
2001
2002   /* We won't listen for this connection anymore */
2003   silc_schedule_unset_listen_fd(sock->sock);
2004
2005   /* Unregister all tasks */
2006   silc_task_unregister_by_fd(server->io_queue, sock->sock);
2007   silc_task_unregister_by_fd(server->timeout_queue, sock->sock);
2008
2009   /* Close the actual connection */
2010   silc_net_close_connection(sock->sock);
2011   server->sockets[sock->sock] = NULL;
2012
2013   silc_task_register(server->timeout_queue, 0, 
2014                      silc_server_close_connection_final,
2015                      (void *)sock, 0, 1, SILC_TASK_TIMEOUT, 
2016                      SILC_TASK_PRI_NORMAL);
2017 }
2018
2019 /* Sends disconnect message to remote connection and disconnects the 
2020    connection. */
2021
2022 void silc_server_disconnect_remote(SilcServer server,
2023                                    SilcSocketConnection sock,
2024                                    const char *fmt, ...)
2025 {
2026   va_list ap;
2027   unsigned char buf[4096];
2028
2029   if (!sock)
2030     return;
2031
2032   memset(buf, 0, sizeof(buf));
2033   va_start(ap, fmt);
2034   vsprintf(buf, fmt, ap);
2035   va_end(ap);
2036
2037   SILC_LOG_DEBUG(("Disconnecting remote host"));
2038
2039   SILC_LOG_INFO(("Disconnecting %s:%d [%s]", sock->hostname,
2040                   sock->port,
2041                   (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
2042                    sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
2043                    sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
2044                    "Router")));
2045
2046   /* Notify remote end that the conversation is over. The notify message
2047      is tried to be sent immediately. */
2048   silc_server_packet_send(server, sock, SILC_PACKET_DISCONNECT, 0,  
2049                           buf, strlen(buf), TRUE);
2050
2051   /* Mark the connection to be disconnected */
2052   SILC_SET_DISCONNECTED(sock);
2053   silc_server_close_connection(server, sock);
2054 }
2055
2056 typedef struct {
2057   SilcServer server;
2058   SilcClientEntry client;
2059 } *FreeClientInternal;
2060
2061 SILC_TASK_CALLBACK(silc_server_free_client_data_timeout)
2062 {
2063   FreeClientInternal i = (FreeClientInternal)context;
2064
2065   silc_idlist_del_data(i->client);
2066   silc_idcache_purge_by_context(i->server->local_list->clients, i->client);
2067   silc_free(i);
2068 }
2069
2070 /* Frees client data and notifies about client's signoff. */
2071
2072 void silc_server_free_client_data(SilcServer server, 
2073                                   SilcSocketConnection sock,
2074                                   SilcClientEntry client, 
2075                                   int notify,
2076                                   char *signoff)
2077 {
2078   FreeClientInternal i = silc_calloc(1, sizeof(*i));
2079
2080   /* If there is pending outgoing data for the client then purge it
2081      to the network before removing the client entry. */
2082   if (sock && SILC_IS_OUTBUF_PENDING(sock) && 
2083       (SILC_IS_DISCONNECTED(sock) == FALSE)) {
2084     server->stat.packets_sent++;
2085
2086     if (sock->outbuf->data - sock->outbuf->head)
2087      silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
2088
2089     silc_server_packet_send_real(server, sock, TRUE);
2090
2091     SILC_SET_CONNECTION_FOR_INPUT(sock->sock);
2092     SILC_UNSET_OUTBUF_PENDING(sock);
2093     silc_buffer_clear(sock->outbuf);
2094   }
2095
2096   /* Send SIGNOFF notify to routers. */
2097   if (notify && !server->standalone && server->router)
2098     silc_server_send_notify_signoff(server, server->router->connection,
2099                                     server->server_type == SILC_SERVER ?
2100                                     FALSE : TRUE, client->id, 
2101                                     SILC_ID_CLIENT_LEN, signoff);
2102
2103   /* Remove client from all channels */
2104   if (notify)
2105     silc_server_remove_from_channels(server, NULL, client, 
2106                                      TRUE, signoff, TRUE);
2107   else
2108     silc_server_remove_from_channels(server, NULL, client, 
2109                                      FALSE, NULL, FALSE);
2110
2111   /* We will not delete the client entry right away. We will take it
2112      into history (for WHOWAS command) for 5 minutes */
2113   i->server = server;
2114   i->client = client;
2115   silc_task_register(server->timeout_queue, 0, 
2116                      silc_server_free_client_data_timeout,
2117                      (void *)i, 300, 0,
2118                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
2119   client->data.registered = FALSE;
2120
2121   /* Free the client entry and everything in it */
2122   server->stat.my_clients--;
2123   server->stat.clients--;
2124   if (server->server_type == SILC_ROUTER)
2125     server->stat.cell_clients--;
2126 }
2127
2128 /* Frees user_data pointer from socket connection object. This also sends
2129    appropriate notify packets to the network to inform about leaving
2130    entities. */
2131
2132 void silc_server_free_sock_user_data(SilcServer server, 
2133                                      SilcSocketConnection sock)
2134 {
2135   SILC_LOG_DEBUG(("Start"));
2136
2137   switch(sock->type) {
2138   case SILC_SOCKET_TYPE_CLIENT:
2139     {
2140       SilcClientEntry user_data = (SilcClientEntry)sock->user_data;
2141       silc_server_free_client_data(server, sock, user_data, TRUE, NULL);
2142       break;
2143     }
2144   case SILC_SOCKET_TYPE_SERVER:
2145   case SILC_SOCKET_TYPE_ROUTER:
2146     {
2147       SilcServerEntry user_data = (SilcServerEntry)sock->user_data;
2148
2149       /* Free all client entries that this server owns as they will
2150          become invalid now as well. */
2151       silc_server_remove_clients_by_server(server, user_data, TRUE);
2152
2153       /* If this was our primary router connection then we're lost to
2154          the outside world. */
2155       if (server->router == user_data) {
2156         server->id_entry->router = NULL;
2157         server->router = NULL;
2158         server->standalone = TRUE;
2159       }
2160
2161       /* Free the server entry */
2162       silc_idlist_del_data(user_data);
2163       silc_idlist_del_server(server->local_list, user_data);
2164       server->stat.my_servers--;
2165       server->stat.servers--;
2166       if (server->server_type == SILC_ROUTER)
2167         server->stat.cell_servers--;
2168       break;
2169     }
2170   default:
2171     {
2172       SilcUnknownEntry user_data = (SilcUnknownEntry)sock->user_data;
2173
2174       silc_idlist_del_data(user_data);
2175       silc_free(user_data);
2176       break;
2177     }
2178   }
2179
2180   sock->user_data = NULL;
2181 }
2182
2183 /* This function is used to remove all client entries by the server `entry'.
2184    This is called when the connection is lost to the server. In this case
2185    we must invalidate all the client entries owned by the server `entry'. 
2186    If the `server_signoff' is TRUE then the SERVER_SIGNOFF notify is
2187    distributed to our local clients. */
2188
2189 int silc_server_remove_clients_by_server(SilcServer server, 
2190                                          SilcServerEntry entry,
2191                                          int server_signoff)
2192 {
2193   SilcIDCacheList list = NULL;
2194   SilcIDCacheEntry id_cache = NULL;
2195   SilcClientEntry client = NULL;
2196   SilcBuffer idp;
2197   SilcClientEntry *clients = NULL;
2198   uint32 clients_c = 0;
2199   unsigned char **argv = NULL;
2200   uint32 *argv_lens = NULL, *argv_types = NULL, argc = 0;
2201   int i;
2202
2203   SILC_LOG_DEBUG(("Start"));
2204
2205   if (server_signoff) {
2206     idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
2207     argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
2208     argv_lens = silc_realloc(argv_lens,  sizeof(*argv_lens) * (argc + 1));
2209     argv_types = silc_realloc(argv_types, sizeof(*argv_types) * (argc + 1));
2210     argv[argc] = idp->data;
2211     argv_lens[argc] = idp->len;
2212     argv_types[argc] = argc + 1;
2213     argc++;
2214     silc_buffer_free(idp);
2215   }
2216
2217   if (silc_idcache_find_by_id(server->local_list->clients, 
2218                               SILC_ID_CACHE_ANY, SILC_ID_CLIENT, &list)) {
2219
2220     if (silc_idcache_list_first(list, &id_cache)) {
2221       while (id_cache) {
2222         client = (SilcClientEntry)id_cache->context;
2223         if (client->data.registered == FALSE) {
2224           if (!silc_idcache_list_next(list, &id_cache))
2225             break;
2226           else
2227             continue;
2228         }
2229
2230         if (client->router != entry) {
2231           if (server_signoff && client->connection) {
2232             clients = silc_realloc(clients, 
2233                                    sizeof(*clients) * (clients_c + 1));
2234             clients[clients_c] = client;
2235             clients_c++;
2236           }
2237
2238           if (!silc_idcache_list_next(list, &id_cache))
2239             break;
2240           else
2241             continue;
2242         }
2243
2244         if (server_signoff) {
2245           idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2246           argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
2247           argv_lens = silc_realloc(argv_lens, sizeof(*argv_lens) *
2248                                    (argc + 1));
2249           argv_types = silc_realloc(argv_types, sizeof(*argv_types) *
2250                                     (argc + 1));
2251           argv[argc] = silc_calloc(idp->len, sizeof(*argv[0]));
2252           memcpy(argv[argc], idp->data, idp->len);
2253           argv_lens[argc] = idp->len;
2254           argv_types[argc] = argc + 1;
2255           argc++;
2256           silc_buffer_free(idp);
2257         }
2258
2259         /* Remove the client entry */
2260         silc_server_remove_from_channels(server, NULL, client, FALSE, 
2261                                          NULL, FALSE);
2262         silc_idlist_del_client(server->local_list, client);
2263
2264         if (!silc_idcache_list_next(list, &id_cache))
2265           break;
2266       }
2267     }
2268     silc_idcache_list_free(list);
2269   }
2270   
2271   if (silc_idcache_find_by_id(server->global_list->clients, 
2272                               SILC_ID_CACHE_ANY, SILC_ID_CLIENT, &list)) {
2273
2274     if (silc_idcache_list_first(list, &id_cache)) {
2275       while (id_cache) {
2276         client = (SilcClientEntry)id_cache->context;
2277         if (client->data.registered == FALSE) {
2278           if (!silc_idcache_list_next(list, &id_cache))
2279             break;
2280           else
2281             continue;
2282         }
2283         
2284         if (client->router != entry) {
2285           if (server_signoff && client->connection) {
2286             clients = silc_realloc(clients, 
2287                                    sizeof(*clients) * (clients_c + 1));
2288             clients[clients_c] = client;
2289             clients_c++;
2290           }
2291
2292           if (!silc_idcache_list_next(list, &id_cache))
2293             break;
2294           else
2295             continue;
2296         }
2297
2298         if (server_signoff) {
2299           idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2300           argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
2301           argv_lens = silc_realloc(argv_lens, sizeof(*argv_lens) *
2302                                    (argc + 1));
2303           argv_types = silc_realloc(argv_types, sizeof(*argv_types) *
2304                                     (argc + 1));
2305           argv[argc] = silc_calloc(idp->len, sizeof(*argv[0]));
2306           memcpy(argv[argc], idp->data, idp->len);
2307           argv_lens[argc] = idp->len;
2308           argv_types[argc] = argc + 1;
2309           argc++;
2310           silc_buffer_free(idp);
2311         }
2312
2313         /* Remove the client entry */
2314         silc_server_remove_from_channels(server, NULL, client, FALSE,
2315                                          NULL, FALSE);
2316         silc_idlist_del_client(server->global_list, client);
2317
2318         if (!silc_idcache_list_next(list, &id_cache))
2319           break;
2320       }
2321     }
2322     silc_idcache_list_free(list);
2323   }
2324
2325   /* Send the SERVER_SIGNOFF notify */
2326   if (server_signoff) {
2327     SilcBuffer args;
2328
2329     /* Send SERVER_SIGNOFF notify to our primary router */
2330     if (!server->standalone && server->router) {
2331       args = silc_argument_payload_encode(1, argv, argv_lens,
2332                                           argv_types);
2333       silc_server_send_notify_args(server, 
2334                                    server->router->connection,
2335                                    server->server_type == 
2336                                    SILC_SERVER ? FALSE : TRUE, 
2337                                    SILC_NOTIFY_TYPE_SERVER_SIGNOFF,
2338                                    argc, args);
2339       silc_buffer_free(args);
2340     }
2341
2342     args = silc_argument_payload_encode(argc, argv, argv_lens,
2343                                         argv_types);
2344     /* Send to local clients */
2345     for (i = 0; i < clients_c; i++) {
2346       silc_server_send_notify_args(server, clients[i]->connection,
2347                                    FALSE, SILC_NOTIFY_TYPE_SERVER_SIGNOFF,
2348                                    argc, args);
2349     }
2350
2351     silc_free(clients);
2352     silc_buffer_free(args);
2353     silc_free(argv);
2354     silc_free(argv_lens);
2355     silc_free(argv_types);
2356   }
2357
2358   return TRUE;
2359 }
2360
2361 /* Checks whether given channel has global users.  If it does this returns
2362    TRUE and FALSE if there is only locally connected clients on the channel. */
2363
2364 int silc_server_channel_has_global(SilcChannelEntry channel)
2365 {
2366   SilcChannelClientEntry chl;
2367
2368   silc_list_start(channel->user_list);
2369   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2370     if (chl->client->router)
2371       return TRUE;
2372   }
2373
2374   return FALSE;
2375 }
2376
2377 /* Checks whether given channel has locally connected users.  If it does this
2378    returns TRUE and FALSE if there is not one locally connected client. */
2379
2380 int silc_server_channel_has_local(SilcChannelEntry channel)
2381 {
2382   SilcChannelClientEntry chl;
2383
2384   silc_list_start(channel->user_list);
2385   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2386     if (!chl->client->router)
2387       return TRUE;
2388   }
2389
2390   return FALSE;
2391 }
2392
2393 /* Removes client from all channels it has joined. This is used when client
2394    connection is disconnected. If the client on a channel is last, the
2395    channel is removed as well. This sends the SIGNOFF notify types. */
2396
2397 void silc_server_remove_from_channels(SilcServer server, 
2398                                       SilcSocketConnection sock,
2399                                       SilcClientEntry client,
2400                                       int notify,
2401                                       char *signoff_message,
2402                                       int keygen)
2403 {
2404   SilcChannelEntry channel;
2405   SilcChannelClientEntry chl;
2406   SilcBuffer clidp;
2407
2408   SILC_LOG_DEBUG(("Start"));
2409
2410   if (!client || !client->id)
2411     return;
2412
2413   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2414
2415   /* Remove the client from all channels. The client is removed from
2416      the channels' user list. */
2417   silc_list_start(client->channels);
2418   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
2419     channel = chl->channel;
2420
2421     /* Remove channel from client's channel list */
2422     silc_list_del(client->channels, chl);
2423
2424     /* Remove channel if there is no users anymore */
2425     if (server->server_type == SILC_ROUTER &&
2426         silc_list_count(channel->user_list) < 2) {
2427       server->stat.my_channels--;
2428
2429       if (channel->rekey)
2430         silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2431
2432       if (channel->founder_key) {
2433         /* The founder auth data exists, do not remove the channel entry */
2434         SilcChannelClientEntry chl2;
2435
2436         channel->id = NULL;
2437
2438         silc_list_start(channel->user_list);
2439         while ((chl2 = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2440           silc_list_del(chl2->client->channels, chl2);
2441           silc_list_del(channel->user_list, chl2);
2442           silc_free(chl2);
2443         }
2444         continue;
2445       }
2446
2447       if (!silc_idlist_del_channel(server->local_list, channel))
2448         silc_idlist_del_channel(server->global_list, channel);
2449       continue;
2450     }
2451
2452     /* Remove client from channel's client list */
2453     silc_list_del(channel->user_list, chl);
2454     silc_free(chl);
2455     server->stat.my_chanclients--;
2456
2457     /* If there is no global users on the channel anymore mark the channel
2458        as local channel. */
2459     if (server->server_type == SILC_SERVER &&
2460         !silc_server_channel_has_global(channel))
2461       channel->global_users = FALSE;
2462
2463     /* If there is not at least one local user on the channel then we don't
2464        need the channel entry anymore, we can remove it safely. */
2465     if (server->server_type == SILC_SERVER &&
2466         !silc_server_channel_has_local(channel)) {
2467       /* Notify about leaving client if this channel has global users. */
2468       if (notify && channel->global_users)
2469         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2470                                            SILC_NOTIFY_TYPE_SIGNOFF, 
2471                                            signoff_message ? 2 : 1,
2472                                            clidp->data, clidp->len,
2473                                            signoff_message, signoff_message ?
2474                                            strlen(signoff_message) : 0);
2475
2476       server->stat.my_channels--;
2477
2478       if (channel->rekey)
2479         silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2480
2481       if (channel->founder_key) {
2482         /* The founder auth data exists, do not remove the channel entry */
2483         SilcChannelClientEntry chl2;
2484
2485         channel->id = NULL;
2486
2487         silc_list_start(channel->user_list);
2488         while ((chl2 = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2489           silc_list_del(chl2->client->channels, chl2);
2490           silc_list_del(channel->user_list, chl2);
2491           silc_free(chl2);
2492         }
2493         continue;
2494       }
2495
2496       if (!silc_idlist_del_channel(server->local_list, channel))
2497         silc_idlist_del_channel(server->global_list, channel);
2498       continue;
2499     }
2500
2501     /* Send notify to channel about client leaving SILC and thus
2502        the entire channel. */
2503     if (notify)
2504       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2505                                          SILC_NOTIFY_TYPE_SIGNOFF, 
2506                                          signoff_message ? 2 : 1,
2507                                          clidp->data, clidp->len,
2508                                          signoff_message, signoff_message ?
2509                                          strlen(signoff_message) : 0);
2510
2511     if (keygen && !(channel->mode & SILC_CHANNEL_MODE_PRIVKEY)) {
2512       /* Re-generate channel key */
2513       silc_server_create_channel_key(server, channel, 0);
2514       
2515       /* Send the channel key to the channel. The key of course is not sent
2516          to the client who was removed from the channel. */
2517       silc_server_send_channel_key(server, client->connection, channel, 
2518                                    server->server_type == SILC_ROUTER ? 
2519                                    FALSE : !server->standalone);
2520     }
2521   }
2522
2523   silc_buffer_free(clidp);
2524 }
2525
2526 /* Removes client from one channel. This is used for example when client
2527    calls LEAVE command to remove itself from the channel. Returns TRUE
2528    if channel still exists and FALSE if the channel is removed when
2529    last client leaves the channel. If `notify' is FALSE notify messages
2530    are not sent. */
2531
2532 int silc_server_remove_from_one_channel(SilcServer server, 
2533                                         SilcSocketConnection sock,
2534                                         SilcChannelEntry channel,
2535                                         SilcClientEntry client,
2536                                         int notify)
2537 {
2538   SilcChannelEntry ch;
2539   SilcChannelClientEntry chl;
2540   SilcBuffer clidp;
2541
2542   SILC_LOG_DEBUG(("Start"));
2543
2544   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2545
2546   /* Remove the client from the channel. The client is removed from
2547      the channel's user list. */
2548   silc_list_start(client->channels);
2549   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
2550     if (chl->channel != channel)
2551       continue;
2552
2553     ch = chl->channel;
2554
2555     /* Remove channel from client's channel list */
2556     silc_list_del(client->channels, chl);
2557
2558     /* Remove channel if there is no users anymore */
2559     if (server->server_type == SILC_ROUTER &&
2560         silc_list_count(channel->user_list) < 2) {
2561       if (channel->rekey)
2562         silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2563       if (!silc_idlist_del_channel(server->local_list, channel))
2564         silc_idlist_del_channel(server->global_list, channel);
2565       silc_buffer_free(clidp);
2566       server->stat.my_channels--;
2567       return FALSE;
2568     }
2569
2570     /* Remove client from channel's client list */
2571     silc_list_del(channel->user_list, chl);
2572     silc_free(chl);
2573     server->stat.my_chanclients--;
2574
2575     /* If there is no global users on the channel anymore mark the channel
2576        as local channel. */
2577     if (server->server_type == SILC_SERVER &&
2578         !silc_server_channel_has_global(channel))
2579       channel->global_users = FALSE;
2580
2581     /* If there is not at least one local user on the channel then we don't
2582        need the channel entry anymore, we can remove it safely. */
2583     if (server->server_type == SILC_SERVER &&
2584         !silc_server_channel_has_local(channel)) {
2585       /* Notify about leaving client if this channel has global users. */
2586       if (notify && channel->global_users)
2587         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2588                                            SILC_NOTIFY_TYPE_LEAVE, 1,
2589                                            clidp->data, clidp->len);
2590
2591       server->stat.my_channels--;
2592       silc_buffer_free(clidp);
2593
2594       if (channel->rekey)
2595         silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2596
2597       if (channel->founder_key) {
2598         /* The founder auth data exists, do not remove the channel entry */
2599         SilcChannelClientEntry chl2;
2600
2601         channel->id = NULL;
2602
2603         silc_list_start(channel->user_list);
2604         while ((chl2 = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2605           silc_list_del(chl2->client->channels, chl2);
2606           silc_list_del(channel->user_list, chl2);
2607           silc_free(chl2);
2608         }
2609         return FALSE;
2610       }
2611
2612       if (!silc_idlist_del_channel(server->local_list, channel))
2613         silc_idlist_del_channel(server->global_list, channel);
2614       return FALSE;
2615     }
2616
2617     /* Send notify to channel about client leaving the channel */
2618     if (notify)
2619       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2620                                          SILC_NOTIFY_TYPE_LEAVE, 1,
2621                                          clidp->data, clidp->len);
2622     break;
2623   }
2624
2625   silc_buffer_free(clidp);
2626   return TRUE;
2627 }
2628
2629 /* Returns TRUE if the given client is on the channel.  FALSE if not. 
2630    This works because we assure that the user list on the channel is
2631    always in up to date thus we can only check the channel list from 
2632    `client' which is faster than checking the user list from `channel'. */
2633
2634 int silc_server_client_on_channel(SilcClientEntry client,
2635                                   SilcChannelEntry channel)
2636 {
2637   SilcChannelClientEntry chl;
2638
2639   if (!client || !channel)
2640     return FALSE;
2641
2642   silc_list_start(client->channels);
2643   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END)
2644     if (chl->channel == channel)
2645       return TRUE;
2646
2647   return FALSE;
2648 }
2649
2650 /* Timeout callback. This is called if connection is idle or for some
2651    other reason is not responding within some period of time. This 
2652    disconnects the remote end. */
2653
2654 SILC_TASK_CALLBACK(silc_server_timeout_remote)
2655 {
2656   SilcServer server = (SilcServer)context;
2657   SilcSocketConnection sock = server->sockets[fd];
2658
2659   if (!sock)
2660     return;
2661
2662   if (sock->user_data)
2663     silc_server_free_sock_user_data(server, sock);
2664
2665   silc_server_disconnect_remote(server, sock, 
2666                                 "Server closed connection: "
2667                                 "Connection timeout");
2668 }
2669
2670 /* Creates new channel. Sends NEW_CHANNEL packet to primary route. This
2671    function may be used only by router. In real SILC network all channels
2672    are created by routers thus this function is never used by normal
2673    server. */
2674
2675 SilcChannelEntry silc_server_create_new_channel(SilcServer server, 
2676                                                 SilcServerID *router_id,
2677                                                 char *cipher, 
2678                                                 char *hmac,
2679                                                 char *channel_name,
2680                                                 int broadcast)
2681 {
2682   SilcChannelID *channel_id;
2683   SilcChannelEntry entry;
2684   SilcCipher key;
2685   SilcHmac newhmac;
2686
2687   SILC_LOG_DEBUG(("Creating new channel"));
2688
2689   if (!cipher)
2690     cipher = "aes-256-cbc";
2691   if (!hmac)
2692     hmac = "hmac-sha1-96";
2693
2694   /* Allocate cipher */
2695   if (!silc_cipher_alloc(cipher, &key))
2696     return NULL;
2697
2698   /* Allocate hmac */
2699   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2700     silc_cipher_free(key);
2701     return NULL;
2702   }
2703
2704   channel_name = strdup(channel_name);
2705
2706   /* Create the channel */
2707   silc_id_create_channel_id(router_id, server->rng, &channel_id);
2708   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2709                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2710                                   NULL, key, newhmac);
2711   if (!entry) {
2712     silc_free(channel_name);
2713     return NULL;
2714   }
2715
2716   entry->cipher = strdup(cipher);
2717   entry->hmac_name = strdup(hmac);
2718
2719   /* Now create the actual key material */
2720   silc_server_create_channel_key(server, entry, 
2721                                  silc_cipher_get_key_len(key) / 8);
2722
2723   /* Notify other routers about the new channel. We send the packet
2724      to our primary route. */
2725   if (broadcast && server->standalone == FALSE)
2726     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2727                                  channel_name, entry->id, SILC_ID_CHANNEL_LEN,
2728                                  entry->mode);
2729
2730   server->stat.my_channels++;
2731
2732   return entry;
2733 }
2734
2735 /* Same as above but creates the channel with Channel ID `channel_id. */
2736
2737 SilcChannelEntry 
2738 silc_server_create_new_channel_with_id(SilcServer server, 
2739                                        char *cipher, 
2740                                        char *hmac,
2741                                        char *channel_name,
2742                                        SilcChannelID *channel_id,
2743                                        int broadcast)
2744 {
2745   SilcChannelEntry entry;
2746   SilcCipher key;
2747   SilcHmac newhmac;
2748
2749   SILC_LOG_DEBUG(("Creating new channel"));
2750
2751   if (!cipher)
2752     cipher = "aes-256-cbc";
2753   if (!hmac)
2754     hmac = "hmac-sha1-96";
2755
2756   /* Allocate cipher */
2757   if (!silc_cipher_alloc(cipher, &key))
2758     return NULL;
2759
2760   /* Allocate hmac */
2761   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2762     silc_cipher_free(key);
2763     return NULL;
2764   }
2765
2766   channel_name = strdup(channel_name);
2767
2768   /* Create the channel */
2769   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2770                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2771                                   NULL, key, newhmac);
2772   if (!entry) {
2773     silc_free(channel_name);
2774     return NULL;
2775   }
2776
2777   /* Now create the actual key material */
2778   silc_server_create_channel_key(server, entry, 
2779                                  silc_cipher_get_key_len(key) / 8);
2780
2781   /* Notify other routers about the new channel. We send the packet
2782      to our primary route. */
2783   if (broadcast && server->standalone == FALSE)
2784     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2785                                  channel_name, entry->id, SILC_ID_CHANNEL_LEN,
2786                                  entry->mode);
2787
2788   server->stat.my_channels++;
2789
2790   return entry;
2791 }
2792
2793 /* Channel's key re-key timeout callback. */
2794
2795 SILC_TASK_CALLBACK(silc_server_channel_key_rekey)
2796 {
2797   SilcServerChannelRekey rekey = (SilcServerChannelRekey)context;
2798   SilcServer server = (SilcServer)rekey->context;
2799
2800   silc_server_create_channel_key(server, rekey->channel, rekey->key_len);
2801   silc_server_send_channel_key(server, NULL, rekey->channel, FALSE);
2802
2803   silc_task_register(server->timeout_queue, 0, 
2804                      silc_server_channel_key_rekey,
2805                      (void *)rekey, 3600, 0,
2806                      SILC_TASK_TIMEOUT,
2807                      SILC_TASK_PRI_NORMAL);
2808 }
2809
2810 /* Generates new channel key. This is used to create the initial channel key
2811    but also to re-generate new key for channel. If `key_len' is provided
2812    it is the bytes of the key length. */
2813
2814 void silc_server_create_channel_key(SilcServer server, 
2815                                     SilcChannelEntry channel,
2816                                     uint32 key_len)
2817 {
2818   int i;
2819   unsigned char channel_key[32], hash[32];
2820   uint32 len;
2821
2822   SILC_LOG_DEBUG(("Generating channel key"));
2823
2824   if (channel->mode & SILC_CHANNEL_MODE_PRIVKEY) {
2825     SILC_LOG_DEBUG(("Channel has private keys, will not generate new key"));
2826     return;
2827   }
2828
2829   if (!channel->channel_key)
2830     if (!silc_cipher_alloc("aes-256-cbc", &channel->channel_key))
2831       return;
2832
2833   if (key_len)
2834     len = key_len;
2835   else if (channel->key_len)
2836     len = channel->key_len / 8;
2837   else
2838     len = silc_cipher_get_key_len(channel->channel_key) / 8;
2839
2840   /* Create channel key */
2841   for (i = 0; i < len; i++) channel_key[i] = silc_rng_get_byte(server->rng);
2842   
2843   /* Set the key */
2844   silc_cipher_set_key(channel->channel_key, channel_key, len * 8);
2845
2846   /* Remove old key if exists */
2847   if (channel->key) {
2848     memset(channel->key, 0, channel->key_len / 8);
2849     silc_free(channel->key);
2850   }
2851
2852   /* Save the key */
2853   channel->key_len = len * 8;
2854   channel->key = silc_calloc(len, sizeof(*channel->key));
2855   memcpy(channel->key, channel_key, len);
2856   memset(channel_key, 0, sizeof(channel_key));
2857
2858   /* Generate HMAC key from the channel key data and set it */
2859   if (!channel->hmac)
2860     silc_hmac_alloc("hmac-sha1-96", NULL, &channel->hmac);
2861   silc_hash_make(channel->hmac->hash, channel->key, len, hash);
2862   silc_hmac_set_key(channel->hmac, hash, silc_hash_len(channel->hmac->hash));
2863   memset(hash, 0, sizeof(hash));
2864
2865   if (server->server_type == SILC_ROUTER) {
2866     if (!channel->rekey)
2867       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
2868     channel->rekey->context = (void *)server;
2869     channel->rekey->channel = channel;
2870     channel->rekey->key_len = key_len;
2871
2872     silc_task_unregister_by_callback(server->timeout_queue,
2873                                      silc_server_channel_key_rekey);
2874     silc_task_register(server->timeout_queue, 0, 
2875                        silc_server_channel_key_rekey,
2876                        (void *)channel->rekey, 3600, 0,
2877                        SILC_TASK_TIMEOUT,
2878                        SILC_TASK_PRI_NORMAL);
2879   }
2880 }
2881
2882 /* Saves the channel key found in the encoded `key_payload' buffer. This 
2883    function is used when we receive Channel Key Payload and also when we're
2884    processing JOIN command reply. Returns entry to the channel. */
2885
2886 SilcChannelEntry silc_server_save_channel_key(SilcServer server,
2887                                               SilcBuffer key_payload,
2888                                               SilcChannelEntry channel)
2889 {
2890   SilcChannelKeyPayload payload = NULL;
2891   SilcChannelID *id = NULL;
2892   unsigned char *tmp, hash[32];
2893   uint32 tmp_len;
2894   char *cipher;
2895
2896   SILC_LOG_DEBUG(("Start"));
2897
2898   /* Decode channel key payload */
2899   payload = silc_channel_key_payload_parse(key_payload);
2900   if (!payload) {
2901     SILC_LOG_ERROR(("Bad channel key payload, dropped"));
2902     channel = NULL;
2903     goto out;
2904   }
2905
2906   /* Get the channel entry */
2907   if (!channel) {
2908
2909     /* Get channel ID */
2910     tmp = silc_channel_key_get_id(payload, &tmp_len);
2911     id = silc_id_str2id(tmp, tmp_len, SILC_ID_CHANNEL);
2912     if (!id) {
2913       channel = NULL;
2914       goto out;
2915     }
2916
2917     channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
2918     if (!channel) {
2919       channel = silc_idlist_find_channel_by_id(server->global_list, id, NULL);
2920       if (!channel) {
2921         SILC_LOG_ERROR(("Received key for non-existent channel"));
2922         goto out;
2923       }
2924     }
2925   }
2926
2927   tmp = silc_channel_key_get_key(payload, &tmp_len);
2928   if (!tmp) {
2929     channel = NULL;
2930     goto out;
2931   }
2932
2933   cipher = silc_channel_key_get_cipher(payload, NULL);
2934   if (!cipher) {
2935     channel = NULL;
2936     goto out;
2937   }
2938
2939   /* Remove old key if exists */
2940   if (channel->key) {
2941     memset(channel->key, 0, channel->key_len / 8);
2942     silc_free(channel->key);
2943     silc_cipher_free(channel->channel_key);
2944   }
2945
2946   /* Create new cipher */
2947   if (!silc_cipher_alloc(cipher, &channel->channel_key)) {
2948     channel = NULL;
2949     goto out;
2950   }
2951
2952   if (channel->cipher)
2953     silc_free(channel->cipher);
2954   channel->cipher = strdup(cipher);
2955
2956   /* Save the key */
2957   channel->key_len = tmp_len * 8;
2958   channel->key = silc_calloc(tmp_len, sizeof(unsigned char));
2959   memcpy(channel->key, tmp, tmp_len);
2960   silc_cipher_set_key(channel->channel_key, tmp, channel->key_len);
2961
2962   /* Generate HMAC key from the channel key data and set it */
2963   if (!channel->hmac)
2964     silc_hmac_alloc("hmac-sha1-96", NULL, &channel->hmac);
2965   silc_hash_make(channel->hmac->hash, tmp, tmp_len, hash);
2966   silc_hmac_set_key(channel->hmac, hash, silc_hash_len(channel->hmac->hash));
2967
2968   memset(hash, 0, sizeof(hash));
2969   memset(tmp, 0, tmp_len);
2970
2971   if (server->server_type == SILC_ROUTER) {
2972     if (!channel->rekey)
2973       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
2974     channel->rekey->context = (void *)server;
2975     channel->rekey->channel = channel;
2976
2977     silc_task_unregister_by_callback(server->timeout_queue,
2978                                      silc_server_channel_key_rekey);
2979     silc_task_register(server->timeout_queue, 0, 
2980                        silc_server_channel_key_rekey,
2981                        (void *)channel->rekey, 3600, 0,
2982                        SILC_TASK_TIMEOUT,
2983                        SILC_TASK_PRI_NORMAL);
2984   }
2985
2986  out:
2987   if (id)
2988     silc_free(id);
2989   if (payload)
2990     silc_channel_key_payload_free(payload);
2991
2992   return channel;
2993 }
2994
2995 /* Heartbeat callback. This function is set as argument for the
2996    silc_socket_set_heartbeat function. The library will call this function
2997    at the set time interval. */
2998
2999 void silc_server_perform_heartbeat(SilcSocketConnection sock,
3000                                    void *hb_context)
3001 {
3002   SilcServerHBContext hb = (SilcServerHBContext)hb_context;
3003
3004   SILC_LOG_DEBUG(("Sending heartbeat to %s (%s)", sock->hostname,
3005                   sock->ip));
3006
3007   /* Send the heartbeat */
3008   silc_server_send_heartbeat(hb->server, sock);
3009 }
3010
3011 /* Returns assembled of all servers in the given ID list. The packet's
3012    form is dictated by the New ID payload. */
3013
3014 static void silc_server_announce_get_servers(SilcServer server,
3015                                              SilcIDList id_list,
3016                                              SilcBuffer *servers)
3017 {
3018   SilcIDCacheList list;
3019   SilcIDCacheEntry id_cache;
3020   SilcServerEntry entry;
3021   SilcBuffer idp;
3022
3023   /* Go through all clients in the list */
3024   if (silc_idcache_find_by_id(id_list->clients, SILC_ID_CACHE_ANY, 
3025                               SILC_ID_SERVER, &list)) {
3026     if (silc_idcache_list_first(list, &id_cache)) {
3027       while (id_cache) {
3028         entry = (SilcServerEntry)id_cache->context;
3029
3030         idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
3031
3032         *servers = silc_buffer_realloc(*servers, 
3033                                        (*servers ? 
3034                                         (*servers)->truelen + idp->len : 
3035                                         idp->len));
3036         silc_buffer_pull_tail(*servers, ((*servers)->end - (*servers)->data));
3037         silc_buffer_put(*servers, idp->data, idp->len);
3038         silc_buffer_pull(*servers, idp->len);
3039         silc_buffer_free(idp);
3040
3041         if (!silc_idcache_list_next(list, &id_cache))
3042           break;
3043       }
3044     }
3045
3046     silc_idcache_list_free(list);
3047   }
3048 }
3049
3050 /* This function is used by router to announce existing servers to our
3051    primary router when we've connected to it. */
3052
3053 void silc_server_announce_servers(SilcServer server)
3054 {
3055   SilcBuffer servers = NULL;
3056
3057   SILC_LOG_DEBUG(("Announcing servers"));
3058
3059   /* Get servers in local list */
3060   silc_server_announce_get_servers(server, server->local_list, &servers);
3061
3062   /* Get servers in global list */
3063   silc_server_announce_get_servers(server, server->global_list, &servers);
3064
3065   if (servers) {
3066     silc_buffer_push(servers, servers->data - servers->head);
3067     SILC_LOG_HEXDUMP(("servers"), servers->data, servers->len);
3068
3069     /* Send the packet */
3070     silc_server_packet_send(server, server->router->connection,
3071                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3072                             servers->data, servers->len, TRUE);
3073
3074     silc_buffer_free(servers);
3075   }
3076 }
3077
3078 /* Returns assembled packet of all clients in the given ID list. The
3079    packet's form is dictated by the New ID Payload. */
3080
3081 static void silc_server_announce_get_clients(SilcServer server,
3082                                              SilcIDList id_list,
3083                                              SilcBuffer *clients)
3084 {
3085   SilcIDCacheList list;
3086   SilcIDCacheEntry id_cache;
3087   SilcClientEntry client;
3088   SilcBuffer idp;
3089
3090   /* Go through all clients in the list */
3091   if (silc_idcache_find_by_id(id_list->clients, SILC_ID_CACHE_ANY, 
3092                               SILC_ID_CLIENT, &list)) {
3093     if (silc_idcache_list_first(list, &id_cache)) {
3094       while (id_cache) {
3095         client = (SilcClientEntry)id_cache->context;
3096
3097         idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
3098
3099         *clients = silc_buffer_realloc(*clients, 
3100                                        (*clients ? 
3101                                         (*clients)->truelen + idp->len : 
3102                                         idp->len));
3103         silc_buffer_pull_tail(*clients, ((*clients)->end - (*clients)->data));
3104         silc_buffer_put(*clients, idp->data, idp->len);
3105         silc_buffer_pull(*clients, idp->len);
3106         silc_buffer_free(idp);
3107
3108         if (!silc_idcache_list_next(list, &id_cache))
3109           break;
3110       }
3111     }
3112
3113     silc_idcache_list_free(list);
3114   }
3115 }
3116
3117 /* This function is used to announce our existing clients to our router
3118    when we've connected to it. */
3119
3120 void silc_server_announce_clients(SilcServer server)
3121 {
3122   SilcBuffer clients = NULL;
3123
3124   SILC_LOG_DEBUG(("Announcing clients"));
3125
3126   /* Get clients in local list */
3127   silc_server_announce_get_clients(server, server->local_list,
3128                                    &clients);
3129
3130   /* As router we announce our global list as well */
3131   if (server->server_type == SILC_ROUTER)
3132     silc_server_announce_get_clients(server, server->global_list,
3133                                      &clients);
3134
3135   if (clients) {
3136     silc_buffer_push(clients, clients->data - clients->head);
3137     SILC_LOG_HEXDUMP(("clients"), clients->data, clients->len);
3138
3139     /* Send the packet */
3140     silc_server_packet_send(server, server->router->connection,
3141                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3142                             clients->data, clients->len, TRUE);
3143
3144     silc_buffer_free(clients);
3145   }
3146 }
3147
3148 static SilcBuffer 
3149 silc_server_announce_encode_join(uint32 argc, ...)
3150 {
3151   va_list ap;
3152
3153   va_start(ap, argc);
3154   return silc_notify_payload_encode(SILC_NOTIFY_TYPE_JOIN, argc, ap);
3155 }
3156
3157 /* Returns assembled packets for channel users of the `channel'. */
3158
3159 void silc_server_announce_get_channel_users(SilcServer server,
3160                                             SilcChannelEntry channel,
3161                                             SilcBuffer *channel_users)
3162 {
3163   SilcChannelClientEntry chl;
3164   SilcBuffer chidp, clidp;
3165   SilcBuffer tmp;
3166   int len;
3167
3168   SILC_LOG_DEBUG(("Start"));
3169
3170   /* Now find all users on the channel */
3171   chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
3172   silc_list_start(channel->user_list);
3173   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
3174     clidp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3175     tmp = silc_server_announce_encode_join(2, clidp->data, clidp->len,
3176                                            chidp->data, chidp->len);
3177     len = tmp->len;
3178     *channel_users = 
3179       silc_buffer_realloc(*channel_users, 
3180                           (*channel_users ? 
3181                            (*channel_users)->truelen + len : len));
3182     silc_buffer_pull_tail(*channel_users, 
3183                           ((*channel_users)->end - 
3184                            (*channel_users)->data));
3185     
3186     silc_buffer_put(*channel_users, tmp->data, tmp->len);
3187     silc_buffer_pull(*channel_users, len);
3188     silc_buffer_free(clidp);
3189     silc_buffer_free(tmp);
3190   }
3191   silc_buffer_free(chidp);
3192 }
3193
3194 /* Returns assembled packets for all channels and users on those channels
3195    from the given ID List. The packets are in the form dictated by the
3196    New Channel and New Channel User payloads. */
3197
3198 void silc_server_announce_get_channels(SilcServer server,
3199                                        SilcIDList id_list,
3200                                        SilcBuffer *channels,
3201                                        SilcBuffer *channel_users)
3202 {
3203   SilcIDCacheList list;
3204   SilcIDCacheEntry id_cache;
3205   SilcChannelEntry channel;
3206   unsigned char *cid;
3207   uint16 name_len;
3208   int len;
3209
3210   SILC_LOG_DEBUG(("Start"));
3211
3212   /* Go through all channels in the list */
3213   if (silc_idcache_find_by_id(id_list->channels, SILC_ID_CACHE_ANY, 
3214                               SILC_ID_CHANNEL, &list)) {
3215     if (silc_idcache_list_first(list, &id_cache)) {
3216       while (id_cache) {
3217         channel = (SilcChannelEntry)id_cache->context;
3218         
3219         cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3220         name_len = strlen(channel->channel_name);
3221
3222         len = 4 + name_len + SILC_ID_CHANNEL_LEN + 4;
3223         *channels = 
3224           silc_buffer_realloc(*channels, 
3225                               (*channels ? (*channels)->truelen + len : len));
3226         silc_buffer_pull_tail(*channels, 
3227                               ((*channels)->end - (*channels)->data));
3228         silc_buffer_format(*channels,
3229                            SILC_STR_UI_SHORT(name_len),
3230                            SILC_STR_UI_XNSTRING(channel->channel_name, 
3231                                                 name_len),
3232                            SILC_STR_UI_SHORT(SILC_ID_CHANNEL_LEN),
3233                            SILC_STR_UI_XNSTRING(cid, SILC_ID_CHANNEL_LEN),
3234                            SILC_STR_UI_INT(channel->mode),
3235                            SILC_STR_END);
3236         silc_buffer_pull(*channels, len);
3237
3238         silc_server_announce_get_channel_users(server, channel,
3239                                                channel_users);
3240
3241         silc_free(cid);
3242
3243         if (!silc_idcache_list_next(list, &id_cache))
3244           break;
3245       }
3246     }
3247
3248     silc_idcache_list_free(list);
3249   }
3250 }
3251
3252 /* This function is used to announce our existing channels to our router
3253    when we've connected to it. This also announces the users on the
3254    channels to the router. */
3255
3256 void silc_server_announce_channels(SilcServer server)
3257 {
3258   SilcBuffer channels = NULL, channel_users = NULL;
3259
3260   SILC_LOG_DEBUG(("Announcing channels and channel users"));
3261
3262   /* Get channels and channel users in local list */
3263   silc_server_announce_get_channels(server, server->local_list,
3264                                     &channels, &channel_users);
3265
3266   /* Get channels and channel users in global list */
3267   silc_server_announce_get_channels(server, server->global_list,
3268                                     &channels, &channel_users);
3269
3270   if (channels) {
3271     silc_buffer_push(channels, channels->data - channels->head);
3272     SILC_LOG_HEXDUMP(("channels"), channels->data, channels->len);
3273
3274     /* Send the packet */
3275     silc_server_packet_send(server, server->router->connection,
3276                             SILC_PACKET_NEW_CHANNEL, SILC_PACKET_FLAG_LIST,
3277                             channels->data, channels->len,
3278                             FALSE);
3279
3280     silc_buffer_free(channels);
3281   }
3282
3283   if (channel_users) {
3284     silc_buffer_push(channel_users, channel_users->data - channel_users->head);
3285     SILC_LOG_HEXDUMP(("channel users"), channel_users->data, 
3286                      channel_users->len);
3287
3288     /* Send the packet */
3289     silc_server_packet_send(server, server->router->connection,
3290                             SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3291                             channel_users->data, channel_users->len,
3292                             FALSE);
3293
3294     silc_buffer_free(channel_users);
3295   }
3296 }
3297
3298 /* Failure timeout callback. If this is called then we will immediately
3299    process the received failure. We always process the failure with timeout
3300    since we do not want to blindly trust to received failure packets. 
3301    This won't be called (the timeout is cancelled) if the failure was
3302    bogus (it is bogus if remote does not close the connection after sending
3303    the failure). */
3304
3305 SILC_TASK_CALLBACK(silc_server_failure_callback)
3306 {
3307   SilcServerFailureContext f = (SilcServerFailureContext)context;
3308
3309   if (f->sock->protocol) {
3310     f->sock->protocol->state = SILC_PROTOCOL_STATE_FAILURE;
3311     f->sock->protocol->execute(f->server->timeout_queue, 0,
3312                                f->sock->protocol, f->sock->sock, 0, 0);
3313   }
3314
3315   silc_free(f);
3316 }
3317
3318 /* Assembles user list and users mode list from the `channel'. */
3319
3320 void silc_server_get_users_on_channel(SilcServer server,
3321                                       SilcChannelEntry channel,
3322                                       SilcBuffer *user_list,
3323                                       SilcBuffer *mode_list,
3324                                       uint32 *user_count)
3325 {
3326   SilcChannelClientEntry chl;
3327   SilcBuffer client_id_list;
3328   SilcBuffer client_mode_list;
3329   SilcBuffer idp;
3330   uint32 list_count = 0;
3331
3332   client_id_list = silc_buffer_alloc((SILC_ID_CLIENT_LEN + 4) * 
3333                                      silc_list_count(channel->user_list));
3334   client_mode_list = silc_buffer_alloc(4 * 
3335                                        silc_list_count(channel->user_list));
3336   silc_buffer_pull_tail(client_id_list, SILC_BUFFER_END(client_id_list));
3337   silc_buffer_pull_tail(client_mode_list, SILC_BUFFER_END(client_mode_list));
3338   silc_list_start(channel->user_list);
3339   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
3340     /* Client ID */
3341     idp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3342     silc_buffer_put(client_id_list, idp->data, idp->len);
3343     silc_buffer_pull(client_id_list, idp->len);
3344     silc_buffer_free(idp);
3345
3346     /* Client's mode on channel */
3347     SILC_PUT32_MSB(chl->mode, client_mode_list->data);
3348     silc_buffer_pull(client_mode_list, 4);
3349
3350     list_count++;
3351   }
3352   silc_buffer_push(client_id_list, 
3353                    client_id_list->data - client_id_list->head);
3354   silc_buffer_push(client_mode_list, 
3355                    client_mode_list->data - client_mode_list->head);
3356
3357   *user_list = client_id_list;
3358   *mode_list = client_mode_list;
3359   *user_count = list_count;
3360 }
3361
3362 /* Saves users and their modes to the `channel'. */
3363
3364 void silc_server_save_users_on_channel(SilcServer server,
3365                                        SilcSocketConnection sock,
3366                                        SilcChannelEntry channel,
3367                                        SilcClientID *noadd,
3368                                        SilcBuffer user_list,
3369                                        SilcBuffer mode_list,
3370                                        uint32 user_count)
3371 {
3372   int i;
3373
3374   /* Cache the received Client ID's and modes. This cache expires
3375      whenever server sends notify message to channel. It means two things;
3376      some user has joined or leaved the channel. XXX TODO! */
3377   for (i = 0; i < user_count; i++) {
3378     uint16 idp_len;
3379     uint32 mode;
3380     SilcClientID *client_id;
3381     SilcClientEntry client;
3382
3383     /* Client ID */
3384     SILC_GET16_MSB(idp_len, user_list->data + 2);
3385     idp_len += 4;
3386     client_id = silc_id_payload_parse_id(user_list->data, idp_len);
3387     silc_buffer_pull(user_list, idp_len);
3388     if (!client_id)
3389       continue;
3390
3391     /* Mode */
3392     SILC_GET32_MSB(mode, mode_list->data);
3393     silc_buffer_pull(mode_list, 4);
3394
3395     if (noadd && !SILC_ID_CLIENT_COMPARE(client_id, noadd)) {
3396       silc_free(client_id);
3397       continue;
3398     }
3399     
3400     /* Check if we have this client cached already. */
3401     client = silc_idlist_find_client_by_id(server->local_list, client_id,
3402                                            NULL);
3403     if (!client)
3404       client = silc_idlist_find_client_by_id(server->global_list, 
3405                                              client_id, NULL);
3406     if (!client) {
3407       /* If router did not find such Client ID in its lists then this must
3408          be bogus client or some router in the net is buggy. */
3409       if (server->server_type == SILC_ROUTER) {
3410         silc_free(client_id);
3411         continue;
3412       }
3413
3414       /* We don't have that client anywhere, add it. The client is added
3415          to global list since server didn't have it in the lists so it must be 
3416          global. */
3417       client = silc_idlist_add_client(server->global_list, NULL, 0, NULL, 
3418                                       NULL, 
3419                                       silc_id_dup(client_id, SILC_ID_CLIENT), 
3420                                       sock->user_data, NULL);
3421       if (!client) {
3422         silc_free(client_id);
3423         continue;
3424       }
3425
3426       client->data.registered = TRUE;
3427     }
3428
3429     silc_free(client_id);
3430
3431     if (!silc_server_client_on_channel(client, channel)) {
3432       /* Client was not on the channel, add it. */
3433       SilcChannelClientEntry chl = silc_calloc(1, sizeof(*chl));
3434       chl->client = client;
3435       chl->mode = mode;
3436       chl->channel = channel;
3437       silc_list_add(channel->user_list, chl);
3438       silc_list_add(client->channels, chl);
3439     }
3440   }
3441 }
3442
3443 /* Lookups route to the client indicated by `id' client ID. The connection
3444    object and internal data object is returned. Returns NULL if route
3445    could not be found to the client. If the `client_id' is specified then
3446    it is used and the `id_data' is ignored. */
3447
3448 SilcSocketConnection silc_server_get_client_route(SilcServer server,
3449                                                   unsigned char *id_data,
3450                                                   uint32 id_len,
3451                                                   SilcClientID *client_id,
3452                                                   SilcIDListData *idata)
3453 {
3454   SilcClientID *id;
3455   SilcClientEntry client;
3456
3457   SILC_LOG_DEBUG(("Start"));
3458
3459   /* Decode destination Client ID */
3460   if (!client_id) {
3461     id = silc_id_str2id(id_data, id_len, SILC_ID_CLIENT);
3462     if (!id) {
3463       SILC_LOG_ERROR(("Could not decode destination Client ID, dropped"));
3464       return NULL;
3465     }
3466   } else {
3467     id = silc_id_dup(client_id, SILC_ID_CLIENT);
3468   }
3469
3470   /* If the destination belongs to our server we don't have to route
3471      the packet anywhere but to send it to the local destination. */
3472   client = silc_idlist_find_client_by_id(server->local_list, id, NULL);
3473   if (client) {
3474     silc_free(id);
3475
3476     if (client && client->data.registered == FALSE)
3477       return NULL;
3478
3479     /* If we are router and the client has router then the client is in
3480        our cell but not directly connected to us. */
3481     if (server->server_type == SILC_ROUTER && client->router) {
3482       /* We are of course in this case the client's router thus the real
3483          "router" of the client is the server who owns the client. Thus
3484          we will send the packet to that server. */
3485       *idata = (SilcIDListData)client->router;
3486       return client->router->connection;
3487     }
3488
3489     /* Seems that client really is directly connected to us */
3490     *idata = (SilcIDListData)client;
3491     return client->connection;
3492   }
3493
3494   /* Destination belongs to someone not in this server. If we are normal
3495      server our action is to send the packet to our router. */
3496   if (server->server_type == SILC_SERVER && !server->standalone) {
3497     silc_free(id);
3498     *idata = (SilcIDListData)server->router;
3499     return server->router->connection;
3500   }
3501
3502   /* We are router and we will perform route lookup for the destination 
3503      and send the packet to fastest route. */
3504   if (server->server_type == SILC_ROUTER && !server->standalone) {
3505     /* Check first that the ID is valid */
3506     client = silc_idlist_find_client_by_id(server->global_list, id, NULL);
3507     if (client) {
3508       SilcSocketConnection dst_sock;
3509
3510       dst_sock = silc_server_route_get(server, id, SILC_ID_CLIENT);
3511
3512       silc_free(id);
3513       *idata = (SilcIDListData)dst_sock->user_data;
3514       return dst_sock;
3515     }
3516   }
3517
3518   silc_free(id);
3519   return NULL;
3520 }
3521
3522 /* Encodes and returns channel list of channels the `client' has joined.
3523    Secret channels are not put to the list. */
3524
3525 SilcBuffer silc_server_get_client_channel_list(SilcServer server,
3526                                                SilcClientEntry client)
3527 {
3528   SilcBuffer buffer = NULL;
3529   SilcChannelEntry channel;
3530   SilcChannelClientEntry chl;
3531   unsigned char *cid;
3532   uint16 name_len;
3533   int len;
3534
3535   silc_list_start(client->channels);
3536   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
3537     channel = chl->channel;
3538
3539     if (channel->mode & SILC_CHANNEL_MODE_SECRET)
3540       continue;
3541
3542     cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3543     name_len = strlen(channel->channel_name);
3544     
3545     len = 4 + name_len + SILC_ID_CHANNEL_LEN + 4;
3546     buffer = silc_buffer_realloc(buffer, 
3547                                  (buffer ? (buffer)->truelen + len : len));
3548     silc_buffer_pull_tail(buffer, ((buffer)->end - (buffer)->data));
3549     silc_buffer_format(buffer,
3550                        SILC_STR_UI_SHORT(name_len),
3551                        SILC_STR_UI_XNSTRING(channel->channel_name, 
3552                                             name_len),
3553                        SILC_STR_UI_SHORT(SILC_ID_CHANNEL_LEN),
3554                        SILC_STR_UI_XNSTRING(cid, SILC_ID_CHANNEL_LEN),
3555                        SILC_STR_UI_INT(chl->mode), /* Client's mode */
3556                        SILC_STR_END);
3557     silc_buffer_pull(buffer, len);
3558     silc_free(cid);
3559   }
3560
3561   if (buffer)
3562     silc_buffer_push(buffer, buffer->data - buffer->head);
3563
3564   return buffer;
3565 }
3566
3567 /* Finds client entry by Client ID and if it is not found then resolves
3568    it using WHOIS command. */
3569
3570 SilcClientEntry silc_server_get_client_resolve(SilcServer server,
3571                                                SilcClientID *client_id)
3572 {
3573   SilcClientEntry client;
3574
3575   client = silc_idlist_find_client_by_id(server->local_list, client_id, NULL);
3576   if (!client) {
3577     client = silc_idlist_find_client_by_id(server->global_list, 
3578                                            client_id, NULL);
3579     if (!client && server->server_type == SILC_ROUTER)
3580       return NULL;
3581   }
3582
3583   if (!client && server->standalone)
3584     return NULL;
3585
3586   if (!client || !client->nickname || !client->username) {
3587     SilcBuffer buffer, idp;
3588
3589     idp = silc_id_payload_encode(client_id, SILC_ID_CLIENT);
3590     buffer = silc_command_payload_encode_va(SILC_COMMAND_WHOIS,
3591                                             ++server->cmd_ident, 1,
3592                                             3, idp->data, idp->len);
3593     silc_server_packet_send(server, client ? client->router->connection :
3594                             server->router->connection,
3595                             SILC_PACKET_COMMAND, 0,
3596                             buffer->data, buffer->len, FALSE);
3597     silc_buffer_free(idp);
3598     silc_buffer_free(buffer);
3599   }
3600
3601   return client;
3602 }
3603
3604 /* A timeout callback for the re-key. We will be the initiator of the
3605    re-key protocol. */
3606
3607 SILC_TASK_CALLBACK(silc_server_rekey_callback)
3608 {
3609   SilcServerRekeyContext rekey = (SilcServerRekeyContext)context;
3610   SilcServer server = rekey->server;
3611   SilcProtocol protocol;
3612   SilcServerRekeyInternalContext *proto_ctx;
3613
3614   SILC_LOG_DEBUG(("Start"));
3615
3616   /* Allocate internal protocol context. This is sent as context
3617      to the protocol. */
3618   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
3619   proto_ctx->server = (void *)server;
3620   proto_ctx->context = context;
3621   proto_ctx->sock = rekey->sock;
3622   proto_ctx->responder = FALSE;
3623       
3624   /* Perform rekey protocol. Will call the final callback after the
3625      protocol is over. */
3626   silc_protocol_alloc(SILC_PROTOCOL_SERVER_REKEY, 
3627                       &protocol, proto_ctx, silc_server_rekey_final);
3628   rekey->sock->protocol = protocol;
3629       
3630   /* Run the protocol */
3631   protocol->execute(server->timeout_queue, 0, protocol, 
3632                     rekey->sock->sock, 0, 0);
3633
3634   /* Re-register re-key timeout */
3635   silc_task_register(server->timeout_queue, 0, 
3636                      silc_server_rekey_callback,
3637                      context, rekey->timeout, 0,
3638                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
3639 }
3640
3641 /* The final callback for the REKEY protocol. This will actually take the
3642    new key material into use. */
3643
3644 SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final)
3645 {
3646   SilcProtocol protocol = (SilcProtocol)context;
3647   SilcServerRekeyInternalContext *ctx =
3648     (SilcServerRekeyInternalContext *)protocol->context;
3649   SilcServer server = (SilcServer)ctx->server;
3650   SilcSocketConnection sock = ctx->sock;
3651
3652   SILC_LOG_DEBUG(("Start"));
3653
3654   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
3655       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
3656     /* Error occured during protocol */
3657     silc_protocol_free(protocol);
3658     sock->protocol = NULL;
3659     if (ctx->keymat)
3660       silc_ske_free_key_material(ctx->keymat);
3661     if (ctx->packet)
3662       silc_packet_context_free(ctx->packet);
3663     if (ctx->ske)
3664       silc_ske_free(ctx->ske);
3665     silc_free(ctx);
3666     return;
3667   }
3668
3669   /* Take the keys into use */
3670   if (ctx->pfs == TRUE) {
3671
3672   } else {
3673     /* Then just generate the new keys and take them into use */
3674     silc_server_protocol_rekey_generate(server, ctx);
3675   }
3676
3677   /* Cleanup */
3678   silc_protocol_free(protocol);
3679   sock->protocol = NULL;
3680   if (ctx->keymat)
3681     silc_ske_free_key_material(ctx->keymat);
3682   if (ctx->packet)
3683     silc_packet_context_free(ctx->packet);
3684   if (ctx->ske)
3685     silc_ske_free(ctx->ske);
3686   silc_free(ctx);
3687 }