Integer type name change.
[silc.git] / apps / silcd / route.c
index dad5ae3b8e9d6d3b8c3a64988f375e5cdc4127e3..a762edfa63828cb84c810ece51a556907016eee6 100644 (file)
  * routes. If route entry doesn't exist for a specific destination, server
  * uses primary route (default route).
  */
-/*
- * $Id$
- * $Log$
- * Revision 1.1  2000/06/27 11:36:56  priikone
- * Initial revision
- *
- *
- */
+/* XXX Adding two ID's with same IP number replaces the old entry thus
+   gives wrong route. Thus, now disabled until figured out a better way
+   to do this or when removed the whole thing. This could be removed
+   because entry->router->connection gives always the most optimal route
+   for the ID anyway (unless new routes (faster perhaps) are established
+   after receiving this ID, this we don't know however). */
+/* $Id$ */
 
 #include "serverincludes.h"
+#include "server_internal.h"
 #include "route.h"
 
 /* Route cache hash table */
@@ -40,8 +40,8 @@ SilcServerRouteTable silc_route_cache[SILC_SERVER_ROUTE_SIZE];
 /* Adds new route to the route cache. The argument `index' is the
    index value generated by silc_server_route_hash. */
 
-void silc_server_route_add(unsigned int index, unsigned int dest,
-                          SilcServerList *router)
+void silc_server_route_add(SilcUInt32 index, unsigned int dest,
+                          SilcServerEntry router)
 {
   silc_route_cache[index].dest = dest;
   silc_route_cache[index].router = router;
@@ -50,10 +50,10 @@ void silc_server_route_add(unsigned int index, unsigned int dest,
 /* Checksk whether destination has a specific router. Returns the
    router data if found, NULL otherwise. */
 
-SilcServerList *silc_server_route_check(unsigned int dest, 
-                                       unsigned short port)
+SilcServerEntry silc_server_route_check(SilcUInt32 dest, 
+                                       SilcUInt16 port)
 {
-  unsigned int index;
+  SilcUInt32 index;
 
   index = silc_server_route_hash(dest, port);
 
@@ -63,3 +63,45 @@ SilcServerList *silc_server_route_check(unsigned int dest,
 
   return NULL;
 }
+
+/* Returns the connection object for the fastest route for the given ID.
+   If we are normal server then this just returns our primary route. If
+   we are router we will do route lookup. */
+
+SilcSocketConnection silc_server_route_get(SilcServer server, void *id,
+                                          SilcIdType id_type)
+{
+  if (server->server_type == SILC_ROUTER) {
+    SilcUInt32 dest = 0;
+    SilcUInt16 port = 0;
+    SilcServerEntry router = NULL;
+#if 0
+
+    switch(id_type) {
+    case SILC_ID_CLIENT:
+      dest = ((SilcClientID *)id)->ip.s_addr;
+      port = server->id->port;
+      break;
+    case SILC_ID_SERVER:
+      dest = ((SilcServerID *)id)->ip.s_addr;
+      port = ((SilcServerID *)id)->port;
+      break;
+    case SILC_ID_CHANNEL:
+      dest = ((SilcChannelID *)id)->ip.s_addr;
+      port = ((SilcChannelID *)id)->port;
+      break;
+    default:
+      return NULL;
+    }
+
+#endif
+
+    router = silc_server_route_check(dest, port);
+    if (!router)
+      return (SilcSocketConnection)server->id_entry->router->connection;
+
+    return (SilcSocketConnection)router->connection;
+  }
+
+  return (SilcSocketConnection)server->id_entry->router->connection;
+}