From 7a438fbe3fef1e86c970d0c86c01156b587ecd3e Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Tue, 13 Dec 2011 16:20:08 +0000 Subject: [PATCH] changes: 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 | 4 +-- .../gnunet-service-transport_plugins.c | 1 + src/transport/plugin_transport_tcp.c | 33 +++++++++++++++++-- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/transport/gnunet-service-transport.c b/src/transport/gnunet-service-transport.c index 6c068bec9..644d27e24 100644 --- a/src/transport/gnunet-service-transport.c +++ b/src/transport/gnunet-service-transport.c @@ -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); diff --git a/src/transport/gnunet-service-transport_plugins.c b/src/transport/gnunet-service-transport_plugins.c index 4b3dd455d..61bbd22c2 100644 --- a/src/transport/gnunet-service-transport_plugins.c +++ b/src/transport/gnunet-service-transport_plugins.c @@ -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); diff --git a/src/transport/plugin_transport_tcp.c b/src/transport/plugin_transport_tcp.c index 1f5327c93..bfe1dc805 100644 --- a/src/transport/plugin_transport_tcp.c +++ b/src/transport/plugin_transport_tcp.c @@ -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, -- 2.25.1