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