removing ats functions from plugins, instead provide callback function
authorMatthias Wachs <wachs@net.in.tum.de>
Wed, 14 Dec 2011 08:53:29 +0000 (08:53 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Wed, 14 Dec 2011 08:53:29 +0000 (08:53 +0000)
src/include/gnunet_transport_plugin.h
src/transport/gnunet-service-transport.c
src/transport/gnunet-service-transport_plugins.c
src/transport/gnunet-service-transport_plugins.h
src/transport/plugin_transport_tcp.c

index 84f1b1f4a8af0300f4ebe20bc0559d79ae13343c..705886d5382116f1abb2bf1194f1e6f6f967baa4 100644 (file)
@@ -127,6 +127,20 @@ typedef struct
                                                                     sender_address_len);
 
 
+/**
+ * Function that will be called to figure if an address is an loopback,
+ * LAN, WAN etc. address
+ *
+ * @param cls closure
+ * @param addr binary address
+ * @param addrlen length of the address
+ * @return ATS Information containing the network type
+ */
+typedef const struct GNUNET_ATS_Information
+(*GNUNET_TRANSPORT_AddressToType) (void *cls,
+                                   const struct sockaddr *addr,
+                                   size_t addrlen);
+
 /**
  * Function that will be called for each address the transport
  * is aware that it might be reachable under.
@@ -202,12 +216,6 @@ struct GNUNET_TRANSPORT_PluginEnvironment
    */
   struct GNUNET_STATISTICS_Handle *stats;
 
-  /**
-   * ATS Handle to request address type.
-   */
-  struct GNUNET_ATS_SchedulingHandle *ats;
-
-
   /**
    * Function that should be called by the transport plugin
    * whenever a message is received.
@@ -233,6 +241,13 @@ struct GNUNET_TRANSPORT_PluginEnvironment
    */
   GNUNET_TRANSPORT_SessionEnd session_end;
 
+  /**
+   * Function that will be called to figure if an address is an loopback,
+   * LAN, WAN etc. address
+   */
+  GNUNET_TRANSPORT_AddressToType get_address_type;
+
+
   /**
    * What is the maximum number of connections that this transport
    * should allow?  Transports that do not have sessions (such as
@@ -464,7 +479,6 @@ struct GNUNET_TRANSPORT_PluginFunctions
    * to a string (numeric conversion only).
    */
   GNUNET_TRANSPORT_AddressToString address_to_string;
-
 };
 
 
index 644d27e2491e364b9aef66e8f894194ea3233ff9..8294f35dc2a85c2df6e1240f5b1fa41367532b37 100644 (file)
@@ -359,6 +359,40 @@ plugin_env_session_end (void *cls, const struct GNUNET_PeerIdentity *peer,
 }
 
 
+/**
+ * Function that will be called to figure if an address is an loopback,
+ * LAN, WAN etc. address
+ *
+ * @param cls closure
+ * @param addr binary address
+ * @param addrlen length of the address
+ * @return ATS Information containing the network type
+ */
+static const struct GNUNET_ATS_Information
+plugin_env_address_to_type (void *cls,
+                            const struct sockaddr *addr,
+                            size_t addrlen)
+{
+  struct GNUNET_ATS_Information ats;
+  ats.type = htonl (GNUNET_ATS_NETWORK_TYPE);
+  ats.value = htonl (GNUNET_ATS_NET_UNSPECIFIED);
+  if (GST_ats == NULL)
+  {
+    GNUNET_break (0);
+    return ats;
+  }
+  if ((addrlen != sizeof (struct sockaddr_in)) && (addrlen != sizeof (struct sockaddr_in6)))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Malformed address with length %u `%s'\n",
+                addrlen,
+                GNUNET_a2s(addr, addrlen));
+    GNUNET_break (0);
+    return ats;
+  }
+  return GNUNET_ATS_address_get_type(GST_ats, addr, addrlen);
+}
+
+
 /**
  * Function called by ATS to notify the callee that the
  * assigned bandwidth or address for a given peer was changed.  If the
@@ -551,7 +585,8 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
       GNUNET_ATS_scheduling_init (GST_cfg, &ats_request_address_change, NULL);
   GST_plugins_load (&plugin_env_receive_callback,
                     &plugin_env_address_change_notification,
-                    &plugin_env_session_end);
+                    &plugin_env_session_end,
+                    &plugin_env_address_to_type);
   GST_neighbours_start (NULL, &neighbours_connect_notification,
                         &neighbours_disconnect_notification);
   GST_clients_start (server);
index 61bbd22c26838bdc945f24de83b1cd5441227dda..fc14b6e76ed295fbbd22d0d3b2ca9679174c5ea9 100644 (file)
@@ -88,11 +88,13 @@ static struct TransportPlugin *plugins_tail;
  * @param recv_cb function to call when data is received
  * @param address_cb function to call when our public addresses changed
  * @param session_end_cb function to call when a session was terminated
+ * @param address_type_cb function to call when a address type is requested
  */
 void
 GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb,
                   GNUNET_TRANSPORT_AddressNotification address_cb,
-                  GNUNET_TRANSPORT_SessionEnd session_end_cb)
+                  GNUNET_TRANSPORT_SessionEnd session_end_cb,
+                  GNUNET_TRANSPORT_AddressToType address_type_cb)
 {
   struct TransportPlugin *plug;
   struct TransportPlugin *next;
@@ -130,9 +132,9 @@ GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb,
     plug->env.receive = recv_cb;
     plug->env.notify_address = address_cb;
     plug->env.session_end = session_end_cb;
+    plug->env.get_address_type = address_type_cb;
     plug->env.max_connections = tneigh;
     plug->env.stats = GST_stats;
-    plug->env.ats = GST_ats;
     GNUNET_CONTAINER_DLL_insert (plugins_head, plugins_tail, plug);
   }
   GNUNET_free (plugs);
index 3cca3ce10e96b3ad767e320ed5400b14506ca561..04bb5ea22e26e3ffe1d5e34eba12a15c67d2d169 100644 (file)
  * @param recv_cb function to call when data is received
  * @param address_cb function to call when our public addresses changed
  * @param session_end_cb function to call when a session was terminated
+ * @param address_type_cb function to call when a address type is requested
  */
 void
 GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb,
                   GNUNET_TRANSPORT_AddressNotification address_cb,
-                  GNUNET_TRANSPORT_SessionEnd session_end_cb);
-
+                  GNUNET_TRANSPORT_SessionEnd session_end_cb,
+                  GNUNET_TRANSPORT_AddressToType address_type_cb);
 
 /**
  * Unload all plugins
index bfe1dc8056eeada70886618ba90054f6e9c8b62e..dfd4ccee038d45916f1dc5a781f553a11225a724 100644 (file)
@@ -1126,11 +1126,10 @@ tcp_plugin_send (void *cls, const struct GNUNET_PeerIdentity *target,
     session->connect_addr = GNUNET_malloc (addrlen);
     memcpy (session->connect_addr, addr, addrlen);
     session->connect_alen = addrlen;
-    if ((addrlen != 0) && (plugin->env->ats != NULL))
+    if (addrlen != 0)
     {
       struct GNUNET_ATS_Information ats;
-      GNUNET_assert(plugin->env->ats != NULL);
-      ats = GNUNET_ATS_address_get_type(plugin->env->ats, sb ,sbs);
+      ats = plugin->env->get_address_type (plugin->env->cls, sb ,sbs);
       session->ats_address_network_type = ats.value;
     }
     else
@@ -1638,15 +1637,10 @@ handle_tcp_welcome (void *cls, struct GNUNET_SERVER_Client *client,
         session->connect_alen = sizeof (struct IPv6TcpAddress);
       }
 
-      if (plugin->env->ats != NULL)
-      {
-        struct GNUNET_ATS_Information ats;
-        GNUNET_assert(plugin->env->ats != NULL);
-        ats = GNUNET_ATS_address_get_type(plugin->env->ats, vaddr ,alen);
-        session->ats_address_network_type = ats.value;
-      }
-      else
-        GNUNET_break (0);
+      struct GNUNET_ATS_Information ats;
+      ats = plugin->env->get_address_type (plugin->env->cls, vaddr ,alen);
+      session->ats_address_network_type = ats.value;
+
       GNUNET_free (vaddr);
     }
     else