changes:
authorMatthias Wachs <wachs@net.in.tum.de>
Tue, 13 Dec 2011 16:20:08 +0000 (16:20 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Tue, 13 Dec 2011 16:20:08 +0000 (16:20 +0000)
changed order of startup since ats is now required for plugins
transport provides ATS handles for plugins
network detection for tcp

src/transport/gnunet-service-transport.c
src/transport/gnunet-service-transport_plugins.c
src/transport/plugin_transport_tcp.c

index 6c068bec9a6e2f3115cdbe826e543c27da5a6ff2..644d27e2491e364b9aef66e8f894194ea3233ff9 100644 (file)
@@ -547,11 +547,11 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
   /* start subsystems */
   GST_hello_start (&process_hello_update, NULL);
   GST_blacklist_start (server);
+  GST_ats =
+      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);
-  GST_ats =
-      GNUNET_ATS_scheduling_init (GST_cfg, &ats_request_address_change, NULL);
   GST_neighbours_start (NULL, &neighbours_connect_notification,
                         &neighbours_disconnect_notification);
   GST_clients_start (server);
index 4b3dd455de5dc1ac0b7a8cb9d1a7166ebb636c22..61bbd22c26838bdc945f24de83b1cd5441227dda 100644 (file)
@@ -132,6 +132,7 @@ GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb,
     plug->env.session_end = session_end_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 1f5327c93a32cb3d060c0b2076c282aa8718e004..bfe1dc8056eeada70886618ba90054f6e9c8b62e 100644 (file)
@@ -295,6 +295,10 @@ struct Session
    */
   int is_nat;
 
+  /**
+   * ATS network type in NBO
+   */
+  uint32_t ats_address_network_type;
 };
 
 
@@ -1122,6 +1126,15 @@ 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))
+    {
+      struct GNUNET_ATS_Information ats;
+      GNUNET_assert(plugin->env->ats != NULL);
+      ats = GNUNET_ATS_address_get_type(plugin->env->ats, sb ,sbs);
+      session->ats_address_network_type = ats.value;
+    }
+    else
+      GNUNET_break (0);
   }
   else                          /* session != NULL */
   {
@@ -1605,6 +1618,7 @@ handle_tcp_welcome (void *cls, struct GNUNET_SERVER_Client *client,
                        "Found address `%s' for incoming connection\n",
                        GNUNET_a2s (vaddr, alen));
 #endif
+
       if (alen == sizeof (struct sockaddr_in))
       {
         s4 = vaddr;
@@ -1624,6 +1638,15 @@ 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);
       GNUNET_free (vaddr);
     }
     else
@@ -1731,10 +1754,14 @@ handle_tcp_data (void *cls, struct GNUNET_SERVER_Client *client,
   GNUNET_STATISTICS_update (plugin->env->stats,
                             gettext_noop ("# bytes received via TCP"),
                             ntohs (message->size), GNUNET_NO);
-  struct GNUNET_ATS_Information distance;
+  struct GNUNET_ATS_Information distance[2];
+
+  distance[0].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
+  distance[0].value = htonl (1);
+  distance[1].type = htonl (GNUNET_ATS_NETWORK_TYPE);
+  distance[1].value = session->ats_address_network_type;
+  GNUNET_break (ntohl(session->ats_address_network_type) != GNUNET_ATS_NET_UNSPECIFIED);
 
-  distance.type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
-  distance.value = htonl (1);
   delay =
       plugin->env->receive (plugin->env->cls, &session->target, message,
                             (const struct GNUNET_ATS_Information *) &distance,