Add ``ExternalIp'' config directive to ServerInfo tag in
authorSkywing <skywing@valhallalegends.com>
Fri, 27 Jun 2008 05:16:37 +0000 (00:16 -0500)
committerKp <kp@valhallalegends.com>
Sun, 9 Nov 2008 07:06:45 +0000 (02:06 -0500)
silcd.conf.  This allows server linking with a server
behind a NAT connecting out to a router.

apps/silcd/server.c
apps/silcd/serverconfig.c
apps/silcd/serverconfig.h

index 0e1cffb084ddac0918c65e38d35bcd17a0e4c0ef..05deee4b61613878979e263954dff52bc3c73eee 100644 (file)
@@ -767,6 +767,7 @@ SilcBool silc_server_init(SilcServer server)
   SilcNetListener listener;
   SilcUInt16 *port;
   char **ip;
+  char *external_ip;
 
   SILC_LOG_DEBUG(("Initializing server"));
 
@@ -870,8 +871,11 @@ SilcBool silc_server_init(SilcServer server)
   /* Create a Server ID for the server. */
   port = silc_net_listener_get_port(listener, NULL);
   ip = silc_net_listener_get_ip(listener, NULL);
-  silc_id_create_server_id(server->config->server_info->primary->public_ip ?
-                          server->config->server_info->primary->public_ip :
+  external_ip = server->config->server_info->external_ip ?
+               server->config->server_info->external_ip :
+               server->config->server_info->primary->public_ip;
+  silc_id_create_server_id(external_ip ?
+                          external_ip :
                           ip[0], port[0], server->rng, &id);
   if (!id)
     goto err;
index 30d76af3516cae4c81cbb60a718e938cc66fadf3..6e49475a682adbcc02942c8ff467e8710a0899dc 100644 (file)
@@ -595,6 +595,10 @@ SILC_CONFIG_CALLBACK(fetch_serverinfo)
     CONFIG_IS_DOUBLE(server_info->server_type);
     server_info->server_type = strdup((char *) val);
   }
+  else if (!strcmp(name, "externalip")) {
+    CONFIG_IS_DOUBLE(server_info->external_ip);
+    server_info->external_ip = strdup((char *) val);
+  }
   else if (!strcmp(name, "admin")) {
     CONFIG_IS_DOUBLE(server_info->admin);
     server_info->admin = strdup((char *) val);
@@ -1256,6 +1260,7 @@ static const SilcConfigTable table_serverinfo[] = {
   { "primary",         SILC_CONFIG_ARG_BLOCK,  fetch_serverinfo, table_serverinfo_c},
   { "secondary",       SILC_CONFIG_ARG_BLOCK,  fetch_serverinfo, table_serverinfo_c},
   { "servertype",      SILC_CONFIG_ARG_STR,    fetch_serverinfo, NULL},
+  { "externalip",      SILC_CONFIG_ARG_STR,    fetch_serverinfo, NULL},
   { "location",                SILC_CONFIG_ARG_STR,    fetch_serverinfo, NULL},
   { "admin",           SILC_CONFIG_ARG_STR,    fetch_serverinfo, NULL},
   { "adminemail",      SILC_CONFIG_ARG_STR,    fetch_serverinfo, NULL},
@@ -1639,6 +1644,7 @@ void silc_server_config_destroy(SilcServerConfig config)
       silc_free(di);
     }
     silc_free(si->server_type);
+    silc_free(si->external_ip);
     silc_free(si->location);
     silc_free(si->admin);
     silc_free(si->email);
index 183f6501634cc1263bf8be9dc56265b61370a66f..5c77b8d26feeedeed03b8c64b1f049c8db6397fd 100644 (file)
@@ -59,6 +59,7 @@ typedef struct SilcServerConfigServerInfoStruct {
   char *server_name;
   SilcServerConfigServerInfoInterface *primary;
   SilcServerConfigServerInfoInterface *secondary;
+  char *external_ip;    /* E.g. public IP if we're in a NAT */
   char *server_type;   /* E.g. "Test Server" */
   char *location;      /* geographic location */
   char *admin;         /* admin full name */