From: Matthias Wachs Date: Wed, 14 Dec 2011 08:53:29 +0000 (+0000) Subject: removing ats functions from plugins, instead provide callback function X-Git-Tag: initial-import-from-subversion-38251~15646 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=2a46bac24eaca8ce16d12359e88f4a9d3cf49c28;p=oweals%2Fgnunet.git removing ats functions from plugins, instead provide callback function --- diff --git a/src/include/gnunet_transport_plugin.h b/src/include/gnunet_transport_plugin.h index 84f1b1f4a..705886d53 100644 --- a/src/include/gnunet_transport_plugin.h +++ b/src/include/gnunet_transport_plugin.h @@ -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; - }; diff --git a/src/transport/gnunet-service-transport.c b/src/transport/gnunet-service-transport.c index 644d27e24..8294f35dc 100644 --- a/src/transport/gnunet-service-transport.c +++ b/src/transport/gnunet-service-transport.c @@ -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); diff --git a/src/transport/gnunet-service-transport_plugins.c b/src/transport/gnunet-service-transport_plugins.c index 61bbd22c2..fc14b6e76 100644 --- a/src/transport/gnunet-service-transport_plugins.c +++ b/src/transport/gnunet-service-transport_plugins.c @@ -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); diff --git a/src/transport/gnunet-service-transport_plugins.h b/src/transport/gnunet-service-transport_plugins.h index 3cca3ce10..04bb5ea22 100644 --- a/src/transport/gnunet-service-transport_plugins.h +++ b/src/transport/gnunet-service-transport_plugins.h @@ -42,12 +42,13 @@ * @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 diff --git a/src/transport/plugin_transport_tcp.c b/src/transport/plugin_transport_tcp.c index bfe1dc805..dfd4ccee0 100644 --- a/src/transport/plugin_transport_tcp.c +++ b/src/transport/plugin_transport_tcp.c @@ -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