Integer type name change.
[silc.git] / apps / silcd / serverconfig.c
index 16866fd2f941d17204bfc485667cef8cfb7e0aaa..09fde6070f8fdab3de3aa6accfd0e64efb627e97 100644 (file)
     tmp = (void *) di->next;
 
 /* Set EDOUBLE error value and bail out if necessary */
-#define CONFIG_IS_DOUBLE(x)                    \
- if ((x)) {                                    \
-   got_errno = SILC_CONFIG_EDOUBLE;            \
-   goto got_err;                               \
- }
+#define CONFIG_IS_DOUBLE(__x__)                                                \
+  if ((__x__)) {                                                       \
+    got_errno = SILC_CONFIG_EDOUBLE;                                   \
+    goto got_err;                                                      \
+  }
+
+/* Free the authentication fields in the specified struct
+ * Expands to two instructions */
+#define CONFIG_FREE_AUTH(__section__)                                  \
+  silc_free(__section__->passphrase);                                  \
+  silc_pkcs_public_key_free(__section__->publickey)
+
+/* Set default values to those parameters that have not been defined */
+static void 
+my_set_param_defaults(SilcServerConfigConnParams *params,
+                     SilcServerConfigConnParams *defaults)
+{
+#define SET_PARAM_DEFAULT(p, d)                                                \
+  (params->p ? params->p : (defaults && defaults->p ? defaults->p : d))
+
+  params->connections_max = 
+    SET_PARAM_DEFAULT(connections_max, SILC_SERVER_MAX_CONNECTIONS);
+  params->connections_max_per_host = 
+    SET_PARAM_DEFAULT(connections_max_per_host, 
+                     SILC_SERVER_MAX_CONNECTIONS_SINGLE);
+  params->keepalive_secs = 
+    SET_PARAM_DEFAULT(keepalive_secs, SILC_SERVER_KEEPALIVE);
+  params->reconnect_count = 
+    SET_PARAM_DEFAULT(reconnect_count, SILC_SERVER_RETRY_COUNT);
+  params->reconnect_interval = 
+    SET_PARAM_DEFAULT(reconnect_interval, SILC_SERVER_RETRY_INTERVAL_MIN);
+  params->reconnect_interval_max = 
+    SET_PARAM_DEFAULT(reconnect_interval_max, SILC_SERVER_RETRY_INTERVAL_MAX);
+  params->key_exchange_rekey = 
+    SET_PARAM_DEFAULT(key_exchange_rekey, SILC_SERVER_REKEY);
+}
 
 /* Find connection parameters by the parameter block name. */
-static SilcServerConfigSectionConnectionParam *
-my_find_param(SilcServerConfig config, const char *name)
+static SilcServerConfigConnParams *
+my_find_param(SilcServerConfig config, const char *name, SilcUInt32 line)
 {
-  SilcServerConfigSectionConnectionParam *param;
-
-  if (!name)
-    return NULL;
+  SilcServerConfigConnParams *param;
 
   for (param = config->conn_params; param; param = param->next) {
     if (!strcasecmp(param->name, name))
       return param;
   }
 
-  return NULL;
-}
+  fprintf(stderr, "\nError while parsing config file at line %lu: "
+         "Cannot find Param \"%s\".\n", line, name);
 
-/* free an authdata according to its auth method */
-static void my_free_authdata(char *passphrase, void *public_key)
-{
-  silc_free(passphrase);
-  if (public_key)
-    silc_pkcs_public_key_free((SilcPublicKey) public_key);
+  return NULL;
 }
 
 /* parse an authdata according to its auth method */
-static bool my_parse_authdata(SilcAuthMethod auth_meth, char *p, uint32 line,
-                             void **auth_data, uint32 *auth_data_len)
+static bool my_parse_authdata(SilcAuthMethod auth_meth, char *p, SilcUInt32 line,
+                             void **auth_data, SilcUInt32 *auth_data_len)
 {
   if (auth_meth == SILC_AUTH_PASSWORD) {
     /* p is a plain text password */
     if (auth_data)
       *auth_data = (void *) strdup(p);
     if (auth_data_len)
-      *auth_data_len = (uint32) strlen(p);
+      *auth_data_len = (SilcUInt32) strlen(p);
   } else if (auth_meth == SILC_AUTH_PUBLIC_KEY) {
     /* p is a public key */
     SilcPublicKey public_key;
@@ -108,7 +131,7 @@ static bool my_parse_authdata(SilcAuthMethod auth_meth, char *p, uint32 line,
       *auth_data_len = 0;
   } else {
     fprintf(stderr, "\nError while parsing config file at line %lu: "
-           "Unkonwn authentication method\n", line);
+           "Unknown authentication method.\n", line);
     return FALSE;
   }
   return TRUE;
@@ -131,21 +154,42 @@ SILC_CONFIG_CALLBACK(fetch_generic)
   else if (!strcmp(name, "require_reverse_lookup")) {
     config->require_reverse_lookup = *(bool *)val;
   }
+  else if (!strcmp(name, "connections_max")) {
+    config->param.connections_max = (SilcUInt32) *(int *)val;
+  }
+  else if (!strcmp(name, "connections_max_per_host")) {
+    config->param.connections_max_per_host = (SilcUInt32) *(int *)val;
+  }
   else if (!strcmp(name, "keepalive_secs")) {
-    config->param.keepalive_secs = *(uint32 *)val;
+    config->param.keepalive_secs = (SilcUInt32) *(int *)val;
   }
   else if (!strcmp(name, "reconnect_count")) {
-    config->param.reconnect_count = *(uint32 *)val;
+    config->param.reconnect_count = (SilcUInt32) *(int *)val;
   }
   else if (!strcmp(name, "reconnect_interval")) {
-    config->param.reconnect_interval = *(uint32 *)val;
+    config->param.reconnect_interval = (SilcUInt32) *(int *)val;
   }
   else if (!strcmp(name, "reconnect_interval_max")) {
-    config->param.reconnect_interval_max = *(uint32 *)val;
+    config->param.reconnect_interval_max = (SilcUInt32) *(int *)val;
   }
   else if (!strcmp(name, "reconnect_keep_trying")) {
     config->param.reconnect_keep_trying = *(bool *)val;
   }
+  else if (!strcmp(name, "key_exchange_rekey")) {
+    config->param.key_exchange_rekey = (SilcUInt32) *(int *)val;
+  }
+  else if (!strcmp(name, "key_exchange_pfs")) {
+    config->param.key_exchange_pfs = *(bool *)val;
+  }
+  else if (!strcmp(name, "channel_rekey_secs")) {
+    config->channel_rekey_secs = (SilcUInt32) *(int *)val;
+  }
+  else if (!strcmp(name, "key_exchange_timeout")) {
+    config->key_exchange_timeout = (SilcUInt32) *(int *)val;
+  }
+  else if (!strcmp(name, "conn_auth_timeout")) {
+    config->conn_auth_timeout = (SilcUInt32) *(int *)val;
+  }
   else
     return SILC_CONFIG_EINTERNAL;
 
@@ -157,9 +201,9 @@ SILC_CONFIG_CALLBACK(fetch_generic)
 
 SILC_CONFIG_CALLBACK(fetch_cipher)
 {
-  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigSectionCipher);
+  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigCipher);
 
-  SERVER_CONFIG_DEBUG(("Received CIPHER type=%d name=\"%s\" (val=%x)", 
+  SERVER_CONFIG_DEBUG(("Received CIPHER type=%d name=\"%s\" (val=%x)",
                       type, name, context));
   if (type == SILC_CONFIG_ARG_BLOCK) {
     /* check the temporary struct's fields */
@@ -177,7 +221,7 @@ SILC_CONFIG_CALLBACK(fetch_cipher)
   /* if there isn't a temporary struct alloc one */
   if (!tmp) {
     config->tmp = silc_calloc(1, sizeof(*findtmp));
-    tmp = (SilcServerConfigSectionCipher *) config->tmp;
+    tmp = (SilcServerConfigCipher *) config->tmp;
   }
 
   /* Identify and save this value */
@@ -190,10 +234,10 @@ SILC_CONFIG_CALLBACK(fetch_cipher)
     tmp->module = (*(char *)val ? strdup((char *) val) : NULL);
   }
   else if (!strcmp(name, "keylength")) {
-    tmp->key_length = *(uint32 *)val;
+    tmp->key_length = *(SilcUInt32 *)val;
   }
   else if (!strcmp(name, "blocklength")) {
-    tmp->block_length = *(uint32 *)val;
+    tmp->block_length = *(SilcUInt32 *)val;
   }
   else
     return SILC_CONFIG_EINTERNAL;
@@ -209,9 +253,9 @@ SILC_CONFIG_CALLBACK(fetch_cipher)
 
 SILC_CONFIG_CALLBACK(fetch_hash)
 {
-  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigSectionHash);
+  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigHash);
 
-  SERVER_CONFIG_DEBUG(("Received HASH type=%d name=%s (val=%x)", 
+  SERVER_CONFIG_DEBUG(("Received HASH type=%d name=%s (val=%x)",
                       type, name, context));
   if (type == SILC_CONFIG_ARG_BLOCK) {
     /* check the temporary struct's fields */
@@ -230,7 +274,7 @@ SILC_CONFIG_CALLBACK(fetch_hash)
   /* if there isn't a temporary struct alloc one */
   if (!tmp) {
     config->tmp = silc_calloc(1, sizeof(*findtmp));
-    tmp = (SilcServerConfigSectionHash *) config->tmp;
+    tmp = (SilcServerConfigHash *) config->tmp;
   }
 
   /* Identify and save this value */
@@ -262,9 +306,9 @@ SILC_CONFIG_CALLBACK(fetch_hash)
 
 SILC_CONFIG_CALLBACK(fetch_hmac)
 {
-  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigSectionHmac);
+  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigHmac);
 
-  SERVER_CONFIG_DEBUG(("Received HMAC type=%d name=\"%s\" (val=%x)", 
+  SERVER_CONFIG_DEBUG(("Received HMAC type=%d name=\"%s\" (val=%x)",
                       type, name, context));
   if (type == SILC_CONFIG_ARG_BLOCK) {
     /* check the temporary struct's fields */
@@ -282,7 +326,7 @@ SILC_CONFIG_CALLBACK(fetch_hmac)
   /* if there isn't a temporary struct alloc one */
   if (!tmp) {
     config->tmp = silc_calloc(1, sizeof(*findtmp));
-    tmp = (SilcServerConfigSectionHmac *) config->tmp;
+    tmp = (SilcServerConfigHmac *) config->tmp;
   }
 
   /* Identify and save this value */
@@ -311,7 +355,7 @@ SILC_CONFIG_CALLBACK(fetch_hmac)
 
 SILC_CONFIG_CALLBACK(fetch_pkcs)
 {
-  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigSectionPkcs);
+  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigPkcs);
 
   SERVER_CONFIG_DEBUG(("Received PKCS type=%d name=\"%s\" (val=%x)", 
                       type, name, context));
@@ -331,7 +375,7 @@ SILC_CONFIG_CALLBACK(fetch_pkcs)
   /* if there isn't a temporary struct alloc one */
   if (!tmp) {
     config->tmp = silc_calloc(1, sizeof(*findtmp));
-    tmp = (SilcServerConfigSectionPkcs *) config->tmp;
+    tmp = (SilcServerConfigPkcs *) config->tmp;
   }
 
   /* Identify and save this value */
@@ -353,12 +397,12 @@ SILC_CONFIG_CALLBACK(fetch_pkcs)
 SILC_CONFIG_CALLBACK(fetch_serverinfo)
 {
   SilcServerConfig config = (SilcServerConfig) context;
-  SilcServerConfigSectionServerInfo *server_info = config->server_info;
+  SilcServerConfigServerInfo *server_info = config->server_info;
   int got_errno = 0;
 
   /* if there isn't the struct alloc it */
   if (!server_info)
-    config->server_info = server_info = (SilcServerConfigSectionServerInfo *)
+    config->server_info = server_info = (SilcServerConfigServerInfo *)
                silc_calloc(1, sizeof(*server_info));
 
   if (type == SILC_CONFIG_ARG_BLOCK) {
@@ -379,7 +423,7 @@ SILC_CONFIG_CALLBACK(fetch_serverinfo)
       fprintf(stderr, "Invalid port number!\n");
       return SILC_CONFIG_ESILENT;
     }
-    server_info->port = (uint16) port;
+    server_info->port = (SilcUInt16) port;
   }
   else if (!strcmp(name, "servertype")) {
     CONFIG_IS_DOUBLE(server_info->server_type);
@@ -450,8 +494,8 @@ SILC_CONFIG_CALLBACK(fetch_serverinfo)
 SILC_CONFIG_CALLBACK(fetch_logging)
 {
   SilcServerConfig config = (SilcServerConfig) context;
-  SilcServerConfigSectionLogging *tmp =
-       (SilcServerConfigSectionLogging *) config->tmp;
+  SilcServerConfigLogging *tmp =
+       (SilcServerConfigLogging *) config->tmp;
   int got_errno;
 
   if (!strcmp(name, "quicklogs")) {
@@ -483,7 +527,7 @@ SILC_CONFIG_CALLBACK(fetch_logging)
   else if (!strcmp(name, "file")) {
     if (!tmp) { /* FIXME: what the fuck is this? */
       config->tmp = silc_calloc(1, sizeof(*tmp));
-      tmp = (SilcServerConfigSectionLogging *) config->tmp;
+      tmp = (SilcServerConfigLogging *) config->tmp;
     }
     if (tmp->file) {
       got_errno = SILC_CONFIG_EMISSFIELDS; goto got_err;
@@ -493,9 +537,9 @@ SILC_CONFIG_CALLBACK(fetch_logging)
   else if (!strcmp(name, "size")) {
     if (!tmp) {
       config->tmp = silc_calloc(1, sizeof(*tmp));
-      tmp = (SilcServerConfigSectionLogging *) config->tmp;
+      tmp = (SilcServerConfigLogging *) config->tmp;
     }
-    tmp->maxsize = *(uint32 *) val;
+    tmp->maxsize = *(SilcUInt32 *) val;
   }
   else
     return SILC_CONFIG_EINTERNAL;
@@ -510,7 +554,7 @@ SILC_CONFIG_CALLBACK(fetch_logging)
 
 SILC_CONFIG_CALLBACK(fetch_connparam)
 {
-  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigSectionConnectionParam);
+  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigConnParams);
 
   SERVER_CONFIG_DEBUG(("Received CONNPARAM type=%d name=\"%s\" (val=%x)", 
                       type, name, context));
@@ -519,6 +563,14 @@ SILC_CONFIG_CALLBACK(fetch_connparam)
     if (!tmp)
       return SILC_CONFIG_OK;
 
+    if (!tmp->name) {
+      got_errno = SILC_CONFIG_EMISSFIELDS;
+      goto got_err;
+    }
+
+    /* Set defaults */
+    my_set_param_defaults(tmp, &config->param);
+
     SILC_SERVER_CONFIG_LIST_APPENDTMP(config->conn_params);
     config->tmp = NULL;
     return SILC_CONFIG_OK;
@@ -527,28 +579,40 @@ SILC_CONFIG_CALLBACK(fetch_connparam)
   /* if there isn't a temporary struct alloc one */
   if (!tmp) {
     config->tmp = silc_calloc(1, sizeof(*findtmp));
-    tmp = (SilcServerConfigSectionConnectionParam *) config->tmp;
+    tmp = (SilcServerConfigConnParams *) config->tmp;
   }
 
   if (!strcmp(name, "name")) {
     CONFIG_IS_DOUBLE(tmp->name);
     tmp->name = (*(char *)val ? strdup((char *) val) : NULL);
   }
+  else if (!strcmp(name, "connections_max")) {
+    tmp->connections_max = *(SilcUInt32 *)val;
+  }
+  else if (!strcmp(name, "connections_max_per_host")) {
+    tmp->connections_max_per_host = *(SilcUInt32 *)val;
+  }
   else if (!strcmp(name, "keepalive_secs")) {
-    tmp->keepalive_secs = *(uint32 *)val;
+    tmp->keepalive_secs = *(SilcUInt32 *)val;
   }
   else if (!strcmp(name, "reconnect_count")) {
-    tmp->reconnect_count = *(uint32 *)val;
+    tmp->reconnect_count = *(SilcUInt32 *)val;
   }
   else if (!strcmp(name, "reconnect_interval")) {
-    tmp->reconnect_interval = *(uint32 *)val;
+    tmp->reconnect_interval = *(SilcUInt32 *)val;
   }
   else if (!strcmp(name, "reconnect_interval_max")) {
-    tmp->reconnect_interval_max = *(uint32 *)val;
+    tmp->reconnect_interval_max = *(SilcUInt32 *)val;
   }
   else if (!strcmp(name, "reconnect_keep_trying")) {
     tmp->reconnect_keep_trying = *(bool *)val;
   }
+  else if (!strcmp(name, "key_exchange_rekey")) {
+    tmp->key_exchange_rekey = *(SilcUInt32 *)val;
+  }
+  else if (!strcmp(name, "key_exchange_pfs")) {
+    tmp->key_exchange_pfs = *(bool *)val;
+  }
   else
     return SILC_CONFIG_EINTERNAL;
 
@@ -563,38 +627,24 @@ SILC_CONFIG_CALLBACK(fetch_connparam)
 
 SILC_CONFIG_CALLBACK(fetch_client)
 {
-  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigSectionClient);
+  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigClient);
 
-  SERVER_CONFIG_DEBUG(("Received CLIENT type=%d name=\"%s\" (val=%x)", 
+  SERVER_CONFIG_DEBUG(("Received CLIENT type=%d name=\"%s\" (val=%x)",
                       type, name, context));
 
-  if (type == SILC_CONFIG_ARG_BLOCK) {
-    if (!tmp) /* empty sub-block? */
-      return SILC_CONFIG_OK;
-
-    /* Find connection parameter block */
-    if (tmp->param_name) {
-      tmp->param = my_find_param(config, tmp->param_name);
-      if (!tmp->param) {
-       fprintf(stderr, "Unknown ConnectionParam: %s\n", tmp->param_name);
-       silc_free(tmp->param_name);
-       got_errno = SILC_CONFIG_ESILENT;
-       goto got_err;
-      }
-      silc_free(tmp->param_name);
-    }
+  /* alloc tmp before block checking (empty sub-blocks are welcome here) */
+  if (!tmp) {
+    config->tmp = silc_calloc(1, sizeof(*findtmp));
+    tmp = (SilcServerConfigClient *) config->tmp;
+  }
 
+  if (type == SILC_CONFIG_ARG_BLOCK) {
+    /* closing the block */
     SILC_SERVER_CONFIG_LIST_APPENDTMP(config->clients);
     config->tmp = NULL;
     return SILC_CONFIG_OK;
   }
 
-  /* if there isn't a temporary struct alloc one */
-  if (!tmp) {
-    config->tmp = silc_calloc(1, sizeof(*findtmp));
-    tmp = (SilcServerConfigSectionClient *) config->tmp;
-  }
-
   /* Identify and save this value */
   if (!strcmp(name, "host")) {
     CONFIG_IS_DOUBLE(tmp->host);
@@ -602,7 +652,7 @@ SILC_CONFIG_CALLBACK(fetch_client)
   }
   else if (!strcmp(name, "passphrase")) {
     if (!my_parse_authdata(SILC_AUTH_PASSWORD, (char *) val, line,
-                          (void **)&tmp->passphrase, 
+                          (void **)&tmp->passphrase,
                           &tmp->passphrase_len)) {
       got_errno = SILC_CONFIG_ESILENT;
       goto got_err;
@@ -615,18 +665,13 @@ SILC_CONFIG_CALLBACK(fetch_client)
       goto got_err;
     }
   }
-  else if (!strcmp(name, "port")) {
-    int port = *(int *)val;
-    if ((port <= 0) || (port > 65535)) {
-      fprintf(stderr, "Invalid port number!\n");
-      got_errno = SILC_CONFIG_ESILENT; 
+  else if (!strcmp(name, "params")) {
+    CONFIG_IS_DOUBLE(tmp->param);
+    tmp->param = my_find_param(config, (char *) val, line);
+    if (!tmp->param) { /* error already output */
+      got_errno = SILC_CONFIG_ESILENT;
       goto got_err;
     }
-    tmp->port = (uint16) port;
-  }
-  else if (!strcmp(name, "param")) {
-    CONFIG_IS_DOUBLE(tmp->param_name);
-    tmp->param_name = (*(char *)val ? strdup((char *) val) : NULL);
   }
   else
     return SILC_CONFIG_EINTERNAL;
@@ -634,7 +679,7 @@ SILC_CONFIG_CALLBACK(fetch_client)
 
  got_err:
   silc_free(tmp->host);
-  my_free_authdata(tmp->passphrase, tmp->publickey);
+  CONFIG_FREE_AUTH(tmp);
   silc_free(tmp);
   config->tmp = NULL;
   return got_errno;
@@ -642,9 +687,9 @@ SILC_CONFIG_CALLBACK(fetch_client)
 
 SILC_CONFIG_CALLBACK(fetch_admin)
 {
-  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigSectionAdmin);
+  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigAdmin);
 
-  SERVER_CONFIG_DEBUG(("Received CLIENT type=%d name=\"%s\" (val=%x)", 
+  SERVER_CONFIG_DEBUG(("Received CLIENT type=%d name=\"%s\" (val=%x)",
                       type, name, context));
 
   if (type == SILC_CONFIG_ARG_BLOCK) {
@@ -660,7 +705,7 @@ SILC_CONFIG_CALLBACK(fetch_admin)
   /* if there isn't a temporary struct alloc one */
   if (!tmp) {
     config->tmp = silc_calloc(1, sizeof(*findtmp));
-    tmp = (SilcServerConfigSectionAdmin *) config->tmp;
+    tmp = (SilcServerConfigAdmin *) config->tmp;
   }
 
   /* Identify and save this value */
@@ -678,7 +723,7 @@ SILC_CONFIG_CALLBACK(fetch_admin)
   }
   else if (!strcmp(name, "passphrase")) {
     if (!my_parse_authdata(SILC_AUTH_PASSWORD, (char *) val, line,
-                          (void **)&tmp->passphrase, 
+                          (void **)&tmp->passphrase,
                           &tmp->passphrase_len)) {
       got_errno = SILC_CONFIG_ESILENT;
       goto got_err;
@@ -699,7 +744,7 @@ SILC_CONFIG_CALLBACK(fetch_admin)
   silc_free(tmp->host);
   silc_free(tmp->user);
   silc_free(tmp->nick);
-  my_free_authdata(tmp->passphrase, tmp->publickey);
+  CONFIG_FREE_AUTH(tmp);
   silc_free(tmp);
   config->tmp = NULL;
   return got_errno;
@@ -707,9 +752,9 @@ SILC_CONFIG_CALLBACK(fetch_admin)
 
 SILC_CONFIG_CALLBACK(fetch_deny)
 {
-  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigSectionDeny);
+  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigDeny);
 
-  SERVER_CONFIG_DEBUG(("Received DENY type=%d name=\"%s\" (val=%x)", 
+  SERVER_CONFIG_DEBUG(("Received DENY type=%d name=\"%s\" (val=%x)",
                       type, name, context));
   if (type == SILC_CONFIG_ARG_BLOCK) {
     /* check the temporary struct's fields */
@@ -726,7 +771,7 @@ SILC_CONFIG_CALLBACK(fetch_deny)
   /* if there isn't a temporary struct alloc one */
   if (!tmp) {
     config->tmp = silc_calloc(1, sizeof(*findtmp));
-    tmp = (SilcServerConfigSectionDeny *) config->tmp;
+    tmp = (SilcServerConfigDeny *) config->tmp;
   }
 
   /* Identify and save this value */
@@ -734,14 +779,6 @@ SILC_CONFIG_CALLBACK(fetch_deny)
     CONFIG_IS_DOUBLE(tmp->host);
     tmp->host = (*(char *)val ? strdup((char *) val) : strdup("*"));
   }
-  else if (!strcmp(name, "port")) {
-    int port = *(int *)val;
-    if ((port <= 0) || (port > 65535)) {
-      fprintf(stderr, "Invalid port number!\n");
-      got_errno = SILC_CONFIG_ESILENT; goto got_err;
-    }
-    tmp->port = (uint16) port;
-  }
   else if (!strcmp(name, "reason")) {
     CONFIG_IS_DOUBLE(tmp->reason);
     tmp->reason = strdup((char *) val);
@@ -760,9 +797,9 @@ SILC_CONFIG_CALLBACK(fetch_deny)
 
 SILC_CONFIG_CALLBACK(fetch_server)
 {
-  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigSectionServer);
+  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigServer);
 
-  SERVER_CONFIG_DEBUG(("Received SERVER type=%d name=\"%s\" (val=%x)", 
+  SERVER_CONFIG_DEBUG(("Received SERVER type=%d name=\"%s\" (val=%x)",
                       type, name, context));
 
   if (type == SILC_CONFIG_ARG_BLOCK) {
@@ -770,18 +807,6 @@ SILC_CONFIG_CALLBACK(fetch_server)
     if (!tmp) /* empty sub-block? */
       return SILC_CONFIG_OK;
 
-    /* Find connection parameter block */
-    if (tmp->param_name) {
-      tmp->param = my_find_param(config, tmp->param_name);
-      if (!tmp->param) {
-       fprintf(stderr, "Unknown ConnectionParam: %s\n", tmp->param_name);
-       silc_free(tmp->param_name);
-       got_errno = SILC_CONFIG_ESILENT;
-       goto got_err;
-      }
-      silc_free(tmp->param_name);
-    }
-
     /* the temporary struct is ok, append it to the list */
     SILC_SERVER_CONFIG_LIST_APPENDTMP(config->servers);
     config->tmp = NULL;
@@ -791,7 +816,7 @@ SILC_CONFIG_CALLBACK(fetch_server)
   /* if there isn't a temporary struct alloc one */
   if (!tmp) {
     config->tmp = silc_calloc(1, sizeof(*findtmp));
-    tmp = (SilcServerConfigSectionServer *) config->tmp;
+    tmp = (SilcServerConfigServer *) config->tmp;
   }
 
   /* Identify and save this value */
@@ -801,7 +826,7 @@ SILC_CONFIG_CALLBACK(fetch_server)
   }
   else if (!strcmp(name, "passphrase")) {
     if (!my_parse_authdata(SILC_AUTH_PASSWORD, (char *) val, line,
-                          (void **)&tmp->passphrase, 
+                          (void **)&tmp->passphrase,
                           &tmp->passphrase_len)) {
       got_errno = SILC_CONFIG_ESILENT;
       goto got_err;
@@ -818,9 +843,13 @@ SILC_CONFIG_CALLBACK(fetch_server)
     CONFIG_IS_DOUBLE(tmp->version);
     tmp->version = strdup((char *) val);
   }
-  else if (!strcmp(name, "param")) {
-    CONFIG_IS_DOUBLE(tmp->param_name);
-    tmp->param_name = (*(char *)val ? strdup((char *) val) : NULL);
+  else if (!strcmp(name, "params")) {
+    CONFIG_IS_DOUBLE(tmp->param);
+    tmp->param = my_find_param(config, (char *) val, line);
+    if (!tmp->param) { /* error already output */
+      got_errno = SILC_CONFIG_ESILENT;
+      goto got_err;
+    }
   }
   else if (!strcmp(name, "backup")) {
     tmp->backup_router = *(bool *)val;
@@ -833,7 +862,7 @@ SILC_CONFIG_CALLBACK(fetch_server)
  got_err:
   silc_free(tmp->host);
   silc_free(tmp->version);
-  my_free_authdata(tmp->passphrase, tmp->publickey);
+  CONFIG_FREE_AUTH(tmp);
   silc_free(tmp);
   config->tmp = NULL;
   return got_errno;
@@ -841,27 +870,15 @@ SILC_CONFIG_CALLBACK(fetch_server)
 
 SILC_CONFIG_CALLBACK(fetch_router)
 {
-  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigSectionRouter);
+  SILC_SERVER_CONFIG_SECTION_INIT(SilcServerConfigRouter);
 
-  SERVER_CONFIG_DEBUG(("Received ROUTER type=%d name=\"%s\" (val=%x)", 
+  SERVER_CONFIG_DEBUG(("Received ROUTER type=%d name=\"%s\" (val=%x)",
                       type, name, context));
 
   if (type == SILC_CONFIG_ARG_BLOCK) {
     if (!tmp) /* empty sub-block? */
       return SILC_CONFIG_OK;
 
-    /* Find connection parameter block */
-    if (tmp->param_name) {
-      tmp->param = my_find_param(config, tmp->param_name);
-      if (!tmp->param) {
-       fprintf(stderr, "Unknown ConnectionParam: %s\n", tmp->param_name);
-       silc_free(tmp->param_name);
-       got_errno = SILC_CONFIG_ESILENT;
-       goto got_err;
-      }
-      silc_free(tmp->param_name);
-    }
-
     /* the temporary struct is ok, append it to the list */
     SILC_SERVER_CONFIG_LIST_APPENDTMP(config->routers);
     config->tmp = NULL;
@@ -871,7 +888,7 @@ SILC_CONFIG_CALLBACK(fetch_router)
   /* if there isn't a temporary struct alloc one */
   if (!tmp) {
     config->tmp = silc_calloc(1, sizeof(*findtmp));
-    tmp = (SilcServerConfigSectionRouter *) config->tmp;
+    tmp = (SilcServerConfigRouter *) config->tmp;
   }
 
   /* Identify and save this value */
@@ -885,11 +902,11 @@ SILC_CONFIG_CALLBACK(fetch_router)
       fprintf(stderr, "Invalid port number!\n");
       return SILC_CONFIG_ESILENT;
     }
-    tmp->port = (uint16) port;
+    tmp->port = (SilcUInt16) port;
   }
   else if (!strcmp(name, "passphrase")) {
     if (!my_parse_authdata(SILC_AUTH_PASSWORD, (char *) val, line,
-                          (void **)&tmp->passphrase, 
+                          (void **)&tmp->passphrase,
                           &tmp->passphrase_len)) {
       got_errno = SILC_CONFIG_ESILENT;
       goto got_err;
@@ -906,18 +923,33 @@ SILC_CONFIG_CALLBACK(fetch_router)
     CONFIG_IS_DOUBLE(tmp->version);
     tmp->version = strdup((char *) val);
   }
-  else if (!strcmp(name, "param")) {
-    CONFIG_IS_DOUBLE(tmp->param_name);
-    tmp->param_name = (*(char *)val ? strdup((char *) val) : NULL);
+  else if (!strcmp(name, "params")) {
+    CONFIG_IS_DOUBLE(tmp->param);
+    tmp->param = my_find_param(config, (char *) val, line);
+    if (!tmp->param) { /* error already output */
+      got_errno = SILC_CONFIG_ESILENT;
+      goto got_err;
+    }
   }
   else if (!strcmp(name, "initiator")) {
     tmp->initiator = *(bool *)val;
   }
   else if (!strcmp(name, "backuphost")) {
     CONFIG_IS_DOUBLE(tmp->backup_replace_ip);
-    tmp->backup_replace_ip = (*(char *)val ? strdup((char *) val) : 
+    tmp->backup_replace_ip = (*(char *)val ? strdup((char *) val) :
                              strdup("*"));
   }
+  else if (!strcmp(name, "backupport")) {
+    int port = *(int *)val;
+    if ((port <= 0) || (port > 65535)) {
+      fprintf(stderr, "Invalid port number!\n");
+      return SILC_CONFIG_ESILENT;
+    }
+    tmp->backup_replace_port = (SilcUInt16) port;
+  }
+  else if (!strcmp(name, "backuplocal")) {
+    tmp->backup_local = *(bool *)val;
+  }
   else
     return SILC_CONFIG_EINTERNAL;
 
@@ -927,7 +959,7 @@ SILC_CONFIG_CALLBACK(fetch_router)
   silc_free(tmp->host);
   silc_free(tmp->version);
   silc_free(tmp->backup_replace_ip);
-  my_free_authdata(tmp->passphrase, tmp->publickey);
+  CONFIG_FREE_AUTH(tmp);
   silc_free(tmp);
   config->tmp = NULL;
   return got_errno;
@@ -938,11 +970,18 @@ static const SilcConfigTable table_general[] = {
   { "module_path",             SILC_CONFIG_ARG_STRE,   fetch_generic,  NULL },
   { "prefer_passphrase_auth",  SILC_CONFIG_ARG_TOGGLE, fetch_generic,  NULL },
   { "require_reverse_lookup",  SILC_CONFIG_ARG_TOGGLE, fetch_generic,  NULL },
+  { "connections_max",         SILC_CONFIG_ARG_INT,    fetch_generic,  NULL },
+  { "connections_max_per_host", SILC_CONFIG_ARG_INT,    fetch_generic, NULL },
   { "keepalive_secs",          SILC_CONFIG_ARG_INT,    fetch_generic,  NULL },
   { "reconnect_count",         SILC_CONFIG_ARG_INT,    fetch_generic,  NULL },
   { "reconnect_interval",              SILC_CONFIG_ARG_INT,    fetch_generic,  NULL },
   { "reconnect_interval_max",   SILC_CONFIG_ARG_INT,   fetch_generic,  NULL },
   { "reconnect_keep_trying",   SILC_CONFIG_ARG_TOGGLE, fetch_generic,  NULL },
+  { "key_exchange_rekey",      SILC_CONFIG_ARG_INT,    fetch_generic,  NULL },
+  { "key_exchange_pfs",                SILC_CONFIG_ARG_TOGGLE, fetch_generic,  NULL },
+  { "channel_rekey_secs",      SILC_CONFIG_ARG_INT,    fetch_generic,  NULL },
+  { "key_exchange_timeout",    SILC_CONFIG_ARG_INT,    fetch_generic,  NULL },
+  { "conn_auth_timeout",       SILC_CONFIG_ARG_INT,    fetch_generic,  NULL },
   { 0, 0, 0, 0 }
 };
 
@@ -1011,11 +1050,15 @@ static const SilcConfigTable table_logging[] = {
 static const SilcConfigTable table_connparam[] = {
   { "name",                   SILC_CONFIG_ARG_STR,    fetch_connparam, NULL },
   { "require_reverse_lookup",  SILC_CONFIG_ARG_TOGGLE, fetch_connparam,        NULL },
+  { "connections_max",        SILC_CONFIG_ARG_INT,    fetch_connparam, NULL },
+  { "connections_max_per_host",SILC_CONFIG_ARG_INT,    fetch_connparam, NULL },
   { "keepalive_secs",         SILC_CONFIG_ARG_INT,    fetch_connparam, NULL },
   { "reconnect_count",        SILC_CONFIG_ARG_INT,    fetch_connparam, NULL },
   { "reconnect_interval",      SILC_CONFIG_ARG_INT,    fetch_connparam,        NULL },
   { "reconnect_interval_max",  SILC_CONFIG_ARG_INT,    fetch_connparam,        NULL },
   { "reconnect_keep_trying",   SILC_CONFIG_ARG_TOGGLE, fetch_connparam,        NULL },
+  { "key_exchange_rekey",      SILC_CONFIG_ARG_INT,    fetch_connparam,        NULL },
+  { "key_exchange_pfs",               SILC_CONFIG_ARG_TOGGLE, fetch_connparam, NULL },
   { 0, 0, 0, 0 }
 };
 
@@ -1023,8 +1066,7 @@ static const SilcConfigTable table_client[] = {
   { "host",            SILC_CONFIG_ARG_STRE,   fetch_client,   NULL },
   { "passphrase",      SILC_CONFIG_ARG_STR,    fetch_client,   NULL },
   { "publickey",       SILC_CONFIG_ARG_STR,    fetch_client,   NULL },
-  { "port",            SILC_CONFIG_ARG_INT,    fetch_client,   NULL },
-  { "param",           SILC_CONFIG_ARG_STR,    fetch_client,   NULL },
+  { "params",          SILC_CONFIG_ARG_STR,    fetch_client,   NULL },
   { 0, 0, 0, 0 }
 };
 
@@ -1035,13 +1077,12 @@ static const SilcConfigTable table_admin[] = {
   { "passphrase",      SILC_CONFIG_ARG_STR,    fetch_admin,    NULL },
   { "publickey",       SILC_CONFIG_ARG_STR,    fetch_admin,    NULL },
   { "port",            SILC_CONFIG_ARG_INT,    fetch_admin,    NULL },
-  { "param",           SILC_CONFIG_ARG_STR,    fetch_admin,    NULL },
+  { "params",          SILC_CONFIG_ARG_STR,    fetch_admin,    NULL },
   { 0, 0, 0, 0 }
 };
 
 static const SilcConfigTable table_deny[] = {
   { "host",            SILC_CONFIG_ARG_STRE,   fetch_deny,     NULL },
-  { "port",            SILC_CONFIG_ARG_INT,    fetch_deny,     NULL },
   { "reason",          SILC_CONFIG_ARG_STR,    fetch_deny,     NULL },
   { 0, 0, 0, 0 }
 };
@@ -1051,7 +1092,7 @@ static const SilcConfigTable table_serverconn[] = {
   { "passphrase",      SILC_CONFIG_ARG_STR,    fetch_server,   NULL },
   { "publickey",       SILC_CONFIG_ARG_STR,    fetch_server,   NULL },
   { "versionid",       SILC_CONFIG_ARG_STR,    fetch_server,   NULL },
-  { "param",           SILC_CONFIG_ARG_STR,    fetch_server,   NULL },
+  { "params",          SILC_CONFIG_ARG_STR,    fetch_server,   NULL },
   { "backup",          SILC_CONFIG_ARG_TOGGLE, fetch_server,   NULL },
   { 0, 0, 0, 0 }
 };
@@ -1062,11 +1103,11 @@ static const SilcConfigTable table_routerconn[] = {
   { "passphrase",      SILC_CONFIG_ARG_STR,    fetch_router,   NULL },
   { "publickey",       SILC_CONFIG_ARG_STR,    fetch_router,   NULL },
   { "versionid",       SILC_CONFIG_ARG_STR,    fetch_router,   NULL },
-  { "param",           SILC_CONFIG_ARG_STR,    fetch_router,   NULL },
+  { "params",          SILC_CONFIG_ARG_STR,    fetch_router,   NULL },
   { "initiator",       SILC_CONFIG_ARG_TOGGLE, fetch_router,   NULL },
   { "backuphost",      SILC_CONFIG_ARG_STRE,   fetch_router,   NULL },
   { "backupport",      SILC_CONFIG_ARG_INT,    fetch_router,   NULL },
-  { "localbackup",     SILC_CONFIG_ARG_TOGGLE, fetch_router,   NULL },
+  { "backuplocal",     SILC_CONFIG_ARG_TOGGLE, fetch_router,   NULL },
   { 0, 0, 0, 0 }
 };
 
@@ -1078,7 +1119,7 @@ static const SilcConfigTable table_main[] = {
   { "pkcs",            SILC_CONFIG_ARG_BLOCK,  fetch_pkcs,    table_pkcs },
   { "serverinfo",      SILC_CONFIG_ARG_BLOCK,  fetch_serverinfo, table_serverinfo },
   { "logging",         SILC_CONFIG_ARG_BLOCK,  NULL,          table_logging },
-  { "connectionparam", SILC_CONFIG_ARG_BLOCK,  fetch_connparam, table_connparam },
+  { "connectionparams",        SILC_CONFIG_ARG_BLOCK,  fetch_connparam, table_connparam },
   { "client",          SILC_CONFIG_ARG_BLOCK,  fetch_client,  table_client },
   { "admin",           SILC_CONFIG_ARG_BLOCK,  fetch_admin,   table_admin },
   { "deny",            SILC_CONFIG_ARG_BLOCK,  fetch_deny,    table_deny },
@@ -1114,14 +1155,15 @@ SilcServerConfig silc_server_config_alloc(char *filename)
   /* enter the main parsing loop.  When this returns, we have the parsing
    * result and the object filled (or partially, in case of errors). */
   ret = silc_config_main(ent);
-  SILC_LOG_DEBUG(("Parser returned [ret=%d]: %s", ret, silc_config_strerror(ret)));
+  SILC_LOG_DEBUG(("Parser returned [ret=%d]: %s", ret, 
+                 silc_config_strerror(ret)));
 
   /* Check if the parser returned errors */
   if (ret) {
     /* handle this special error return which asks to quietly return */
     if (ret != SILC_CONFIG_ESILENT) {
       char *linebuf, *filename = silc_config_get_filename(file);
-      uint32 line = silc_config_get_line(file);
+      SilcUInt32 line = silc_config_get_line(file);
       fprintf(stderr, "\nError while parsing config file: %s.\n",
                silc_config_strerror(ret));
       linebuf = silc_config_read_line(file, line);
@@ -1160,7 +1202,7 @@ void silc_server_config_destroy(SilcServerConfig config)
 
   /* Destroy the ServerInfo struct */
   if (config->server_info) {
-    register SilcServerConfigSectionServerInfo *si = config->server_info;
+    register SilcServerConfigServerInfo *si = config->server_info;
     silc_free(si->server_name);
     silc_free(si->server_ip);
     silc_free(si->server_type);
@@ -1175,57 +1217,57 @@ void silc_server_config_destroy(SilcServerConfig config)
 
   /* Now let's destroy the lists */
 
-  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigSectionCipher,
+  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigCipher,
                                  config->cipher)
     silc_free(di->name);
     silc_free(di->module);
     silc_free(di);
   }
-  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigSectionHash, config->hash)
+  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigHash, config->hash)
     silc_free(di->name);
     silc_free(di->module);
     silc_free(di);
   }
-  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigSectionHmac, config->hmac)
+  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigHmac, config->hmac)
     silc_free(di->name);
     silc_free(di->hash);
     silc_free(di);
   }
-  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigSectionPkcs, config->pkcs)
+  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigPkcs, config->pkcs)
     silc_free(di->name);
     silc_free(di);
   }
-  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigSectionClient,
+  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigClient,
                                  config->clients)
     silc_free(di->host);
-    my_free_authdata(di->passphrase, di->publickey);
+    CONFIG_FREE_AUTH(di);
     silc_free(di);
   }
-  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigSectionAdmin, config->admins)
+  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigAdmin, config->admins)
     silc_free(di->host);
     silc_free(di->user);
     silc_free(di->nick);
-    my_free_authdata(di->passphrase, di->publickey);
+    CONFIG_FREE_AUTH(di);
     silc_free(di);
   }
-  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigSectionDeny, config->denied)
+  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigDeny, config->denied)
     silc_free(di->host);
     silc_free(di->reason);
     silc_free(di);
   }
-  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigSectionServer,
+  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigServer,
                                  config->servers)
     silc_free(di->host);
     silc_free(di->version);
-    my_free_authdata(di->passphrase, di->publickey);
+    CONFIG_FREE_AUTH(di);
     silc_free(di);
   }
-  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigSectionRouter,
+  SILC_SERVER_CONFIG_LIST_DESTROY(SilcServerConfigRouter,
                                  config->routers)
     silc_free(di->host);
     silc_free(di->version);
     silc_free(di->backup_replace_ip);
-    my_free_authdata(di->passphrase, di->publickey);
+    CONFIG_FREE_AUTH(di);
     silc_free(di);
   }
 }
@@ -1236,7 +1278,7 @@ void silc_server_config_destroy(SilcServerConfig config)
 bool silc_server_config_register_ciphers(SilcServer server)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionCipher *cipher = config->cipher;
+  SilcServerConfigCipher *cipher = config->cipher;
   char *module_path = config->module_path;
 
   SILC_LOG_DEBUG(("Registering configured ciphers"));
@@ -1288,9 +1330,11 @@ bool silc_server_config_register_ciphers(SilcServer server)
                                                SILC_CIPHER_SIM_SET_KEY));
        SILC_LOG_DEBUG(("set_key=%p", cipher_obj.set_key));
        cipher_obj.set_key_with_string =
-         silc_sim_getsym(sim, silc_sim_symname(alg_name,
-                                               SILC_CIPHER_SIM_SET_KEY_WITH_STRING));
-       SILC_LOG_DEBUG(("set_key_with_string=%p", cipher_obj.set_key_with_string));
+         silc_sim_getsym(sim, 
+           silc_sim_symname(alg_name,
+             SILC_CIPHER_SIM_SET_KEY_WITH_STRING));
+       SILC_LOG_DEBUG(("set_key_with_string=%p", 
+         cipher_obj.set_key_with_string));
        cipher_obj.encrypt =
          silc_sim_getsym(sim, silc_sim_symname(alg_name,
                                                SILC_CIPHER_SIM_ENCRYPT_CBC));
@@ -1335,7 +1379,7 @@ bool silc_server_config_register_ciphers(SilcServer server)
 bool silc_server_config_register_hashfuncs(SilcServer server)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionHash *hash = config->hash;
+  SilcServerConfigHash *hash = config->hash;
   char *module_path = config->module_path;
 
   SILC_LOG_DEBUG(("Registering configured hash functions"));
@@ -1420,7 +1464,7 @@ bool silc_server_config_register_hashfuncs(SilcServer server)
 bool silc_server_config_register_hmacs(SilcServer server)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionHmac *hmac = config->hmac;
+  SilcServerConfigHmac *hmac = config->hmac;
 
   SILC_LOG_DEBUG(("Registering configured HMACs"));
 
@@ -1451,7 +1495,7 @@ bool silc_server_config_register_hmacs(SilcServer server)
 bool silc_server_config_register_pkcs(SilcServer server)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionPkcs *pkcs = config->pkcs;
+  SilcServerConfigPkcs *pkcs = config->pkcs;
 
   SILC_LOG_DEBUG(("Registering configured PKCS"));
 
@@ -1481,7 +1525,7 @@ bool silc_server_config_register_pkcs(SilcServer server)
 void silc_server_config_setlogfiles(SilcServer server)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionLogging *this;
+  SilcServerConfigLogging *this;
 
   SILC_LOG_DEBUG(("Setting configured log file names"));
 
@@ -1502,26 +1546,18 @@ void silc_server_config_setlogfiles(SilcServer server)
 /* Returns client authentication information from configuration file by host
    (name or ip) */
 
-SilcServerConfigSectionClient *
-silc_server_config_find_client(SilcServer server, char *host, int port)
+SilcServerConfigClient *
+silc_server_config_find_client(SilcServer server, char *host)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionClient *client;
+  SilcServerConfigClient *client;
 
-  if (!config || !port) {
-    SILC_LOG_WARNING(("Bogus: config_find_client(config=0x%08x, "
-                     "host=0x%08x \"%s\", port=%hu)",
-                     (uint32) config, (uint32) host, host, port));
-    return NULL;
-  }
-  if (!host)
+  if (!config || !host)
     return NULL;
 
   for (client = config->clients; client; client = client->next) {
     if (client->host && !silc_string_compare(client->host, host))
       continue;
-    if (client->port && (client->port != port))
-      continue;
     break;
   }
 
@@ -1532,12 +1568,12 @@ silc_server_config_find_client(SilcServer server, char *host, int port)
 /* Returns admin connection configuration by host, username and/or
    nickname. */
 
-SilcServerConfigSectionAdmin *
+SilcServerConfigAdmin *
 silc_server_config_find_admin(SilcServer server, char *host, char *user, 
                              char *nick)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionAdmin *admin;
+  SilcServerConfigAdmin *admin;
 
   /* make sure we have a value for the matching parameters */
   if (!host)
@@ -1562,22 +1598,16 @@ silc_server_config_find_admin(SilcServer server, char *host, char *user,
   return admin;
 }
 
-/* Returns the denied connection configuration entry by host and port. */
+/* Returns the denied connection configuration entry by host. */
 
-SilcServerConfigSectionDeny *
-silc_server_config_find_denied(SilcServer server, char *host, uint16 port)
+SilcServerConfigDeny *
+silc_server_config_find_denied(SilcServer server, char *host)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionDeny *deny;
+  SilcServerConfigDeny *deny;
 
   /* make sure we have a value for the matching parameters */
-  if (!config || !port) {
-    SILC_LOG_WARNING(("Bogus: config_find_denied(config=0x%08x, "
-                     "host=0x%08x \"%s\", port=%hu)",
-                     (uint32) config, (uint32) host, host, port));
-    return NULL;
-  }
-  if (!host)
+  if (!config || !host)
     return NULL;
 
   for (deny = config->denied; deny; deny = deny->next) {
@@ -1593,11 +1623,11 @@ silc_server_config_find_denied(SilcServer server, char *host, uint16 port)
 /* Returns server connection info from server configuartion by host
    (name or ip). */
 
-SilcServerConfigSectionServer *
+SilcServerConfigServer *
 silc_server_config_find_server_conn(SilcServer server, char *host)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionServer *serv = NULL;
+  SilcServerConfigServer *serv = NULL;
 
   if (!host)
     return NULL;
@@ -1617,11 +1647,11 @@ silc_server_config_find_server_conn(SilcServer server, char *host)
 /* Returns router connection info from server configuration by
    host (name or ip). */
 
-SilcServerConfigSectionRouter *
+SilcServerConfigRouter *
 silc_server_config_find_router_conn(SilcServer server, char *host, int port)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionRouter *serv = NULL;
+  SilcServerConfigRouter *serv = NULL;
 
   if (!host)
     return NULL;
@@ -1646,7 +1676,7 @@ silc_server_config_find_router_conn(SilcServer server, char *host, int port)
 bool silc_server_config_is_primary_route(SilcServer server)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionRouter *serv = NULL;
+  SilcServerConfigRouter *serv = NULL;
   int i;
   bool found = FALSE;
 
@@ -1666,11 +1696,11 @@ bool silc_server_config_is_primary_route(SilcServer server)
 /* Returns our primary connection configuration or NULL if we do not
    have primary router configured. */
 
-SilcServerConfigSectionRouter *
+SilcServerConfigRouter *
 silc_server_config_get_primary_router(SilcServer server)
 {
   SilcServerConfig config = server->config;
-  SilcServerConfigSectionRouter *serv = NULL;
+  SilcServerConfigRouter *serv = NULL;
   int i;
 
   serv = config->routers;
@@ -1689,19 +1719,17 @@ bool silc_server_config_set_defaults(SilcServer server)
 {
   SilcServerConfig config = server->config;
 
-  config->param.keepalive_secs = (config->param.keepalive_secs ? 
-                                 config->param.keepalive_secs :
-                                 SILC_SERVER_KEEPALIVE);
-  config->param.reconnect_count = (config->param.reconnect_count ? 
-                                  config->param.reconnect_count :
-                                  SILC_SERVER_RETRY_COUNT);
-  config->param.reconnect_interval = (config->param.reconnect_interval ? 
-                                     config->param.reconnect_interval :
-                                     SILC_SERVER_RETRY_INTERVAL_MIN);
-  config->param.reconnect_interval_max = 
-    (config->param.reconnect_interval_max ? 
-     config->param.reconnect_interval_max :
-     SILC_SERVER_RETRY_INTERVAL_MAX);
+  my_set_param_defaults(&config->param, NULL);
+
+  config->channel_rekey_secs = (config->channel_rekey_secs ? 
+                               config->channel_rekey_secs :
+                               SILC_SERVER_CHANNEL_REKEY);
+  config->key_exchange_timeout = (config->key_exchange_timeout ? 
+                                 config->key_exchange_timeout :
+                                 SILC_SERVER_SKE_TIMEOUT);
+  config->conn_auth_timeout = (config->conn_auth_timeout ? 
+                              config->conn_auth_timeout :
+                              SILC_SERVER_CONNAUTH_TIMEOUT);
 
   return TRUE;
 }