X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Fplugin_transport_wlan.c;h=ccf5d587cb86b7117f019b5bafa4bb274d515ed3;hb=a03f3a1884c6f423cde604ba5b0bba86f43a7113;hp=2d786e2a915ee2bf060f0c51ddaeeaa347a4618b;hpb=717bd5e03fbc05b7bb1f621033eabb785750d03f;p=oweals%2Fgnunet.git diff --git a/src/transport/plugin_transport_wlan.c b/src/transport/plugin_transport_wlan.c index 2d786e2a9..ccf5d587c 100644 --- a/src/transport/plugin_transport_wlan.c +++ b/src/transport/plugin_transport_wlan.c @@ -260,6 +260,16 @@ struct FragmentMessage */ void *cont_cls; + /** + * Size of original message + */ + size_t size_payload; + + /** + * Number of bytes used to transmit message + */ + size_t size_on_wire; + }; @@ -706,6 +716,7 @@ fragment_transmission_done (void *cls, { struct FragmentMessage *fm = cls; + fm->sh = NULL; GNUNET_FRAGMENT_context_transmission_done (fm->fragcontext); } @@ -744,11 +755,18 @@ transmit_fragment (void *cls, &radio_header->header, GNUNET_NO, &fragment_transmission_done, fm); + fm->size_on_wire += size; if (NULL != fm->sh) GNUNET_STATISTICS_update (endpoint->plugin->env->stats, _("# WLAN message fragments sent"), 1, GNUNET_NO); else GNUNET_FRAGMENT_context_transmission_done (fm->fragcontext); + GNUNET_STATISTICS_update (endpoint->plugin->env->stats, + "# bytes currently in WLAN buffers", + -msize, GNUNET_NO); + GNUNET_STATISTICS_update (endpoint->plugin->env->stats, + "# bytes transmitted via WLAN", + msize, GNUNET_NO); } } @@ -772,7 +790,7 @@ free_fragment_message (struct FragmentMessage *fm) GNUNET_HELPER_send_cancel (fm->sh); fm->sh = NULL; } - GNUNET_FRAGMENT_context_destroy (fm->fragcontext); + GNUNET_FRAGMENT_context_destroy (fm->fragcontext, NULL, NULL); if (fm->timeout_task != GNUNET_SCHEDULER_NO_TASK) { GNUNET_SCHEDULER_cancel (fm->timeout_task); @@ -797,7 +815,7 @@ fragmentmessage_timeout (void *cls, fm->timeout_task = GNUNET_SCHEDULER_NO_TASK; if (NULL != fm->cont) { - fm->cont (fm->cont_cls, &fm->target, GNUNET_SYSERR); + fm->cont (fm->cont_cls, &fm->target, GNUNET_SYSERR, fm->size_payload, fm->size_on_wire); fm->cont = NULL; } free_fragment_message (fm); @@ -811,6 +829,7 @@ fragmentmessage_timeout (void *cls, * @param timeout how long can the message wait? * @param target peer that should receive the message * @param msg message to transmit + * @param payload_size bytes of payload * @param cont continuation to call once the message has * been transmitted (or if the transport is ready * for the next transmission call; or if the @@ -822,6 +841,7 @@ send_with_fragmentation (struct MacEndpoint *endpoint, struct GNUNET_TIME_Relative timeout, const struct GNUNET_PeerIdentity *target, const struct GNUNET_MessageHeader *msg, + size_t payload_size, GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls) { @@ -832,13 +852,18 @@ send_with_fragmentation (struct MacEndpoint *endpoint, fm = GNUNET_malloc (sizeof (struct FragmentMessage)); fm->macendpoint = endpoint; fm->target = *target; + fm->size_payload = payload_size; + fm->size_on_wire = 0; fm->timeout = GNUNET_TIME_relative_to_absolute (timeout); fm->cont = cont; fm->cont_cls = cont_cls; + /* 1 MBit/s typical data rate, 1430 byte fragments => ~100 ms per message */ fm->fragcontext = GNUNET_FRAGMENT_context_create (plugin->env->stats, WLAN_MTU, &plugin->tracker, GNUNET_TIME_UNIT_SECONDS, + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, + 100), msg, &transmit_fragment, fm); fm->timeout_task = @@ -1063,10 +1088,16 @@ wlan_plugin_send (void *cls, wlanheader->target = session->target; wlanheader->crc = htonl (GNUNET_CRYPTO_crc32_n (msgbuf, msgbuf_size)); memcpy (&wlanheader[1], msgbuf, msgbuf_size); + + GNUNET_STATISTICS_update (plugin->env->stats, + "# bytes currently in WLAN buffers", + msgbuf_size, GNUNET_NO); + send_with_fragmentation (session->mac, to, &session->target, &wlanheader->header, + msgbuf_size, cont, cont_cls); return size; } @@ -1099,6 +1130,11 @@ process_data (void *cls, void *client, const struct GNUNET_MessageHeader *hdr) ats[1].type = htonl (GNUNET_ATS_NETWORK_TYPE); ats[1].value = htonl (GNUNET_ATS_NET_WLAN); msize = ntohs (hdr->size); + + GNUNET_STATISTICS_update (plugin->env->stats, + "# bytes received via WLAN", + msize, GNUNET_NO); + switch (ntohs (hdr->type)) { case GNUNET_MESSAGE_TYPE_HELLO: @@ -1160,7 +1196,7 @@ process_data (void *cls, void *client, const struct GNUNET_MessageHeader *hdr) mas->endpoint->timeout = GNUNET_TIME_relative_to_absolute (MACENDPOINT_TIMEOUT); if (NULL != fm->cont) { - fm->cont (fm->cont_cls, &fm->target, GNUNET_OK); + fm->cont (fm->cont_cls, &fm->target, GNUNET_OK, fm->size_payload, fm->size_on_wire); fm->cont = NULL; } free_fragment_message (fm); @@ -1285,7 +1321,8 @@ handle_helper_message (void *cls, void *client, /* remove old address */ plugin->env->notify_address (plugin->env->cls, GNUNET_NO, &plugin->mac_address, - sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)); + sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress), + "wlan"); } plugin->mac_address = cm->mac; plugin->have_mac = GNUNET_YES; @@ -1295,7 +1332,8 @@ handle_helper_message (void *cls, void *client, GNUNET_i2s (plugin->env->my_identity)); plugin->env->notify_address (plugin->env->cls, GNUNET_YES, &plugin->mac_address, - sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)); + sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress), + "wlan"); break; case GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER: LOG (GNUNET_ERROR_TYPE_DEBUG, @@ -1475,7 +1513,7 @@ wlan_plugin_address_to_string (void *cls, const void *addr, size_t addrlen) return NULL; } mac = addr; - return GNUNET_strdup (mac_to_string (mac)); + return mac_to_string (mac); } @@ -1537,6 +1575,16 @@ libgnunet_plugin_transport_wlan_done (void *cls) GNUNET_free (api); return NULL; } + + if (GNUNET_YES == plugin->have_mac) + { + plugin->env->notify_address (plugin->env->cls, GNUNET_NO, + &plugin->mac_address, + sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress), + "wlan"); + plugin->have_mac = GNUNET_NO; + } + if (GNUNET_SCHEDULER_NO_TASK != plugin->beacon_task) { GNUNET_SCHEDULER_cancel (plugin->beacon_task); @@ -1662,11 +1710,9 @@ libgnunet_plugin_transport_wlan_init (void *cls) GNUNET_CONFIGURATION_get_value_number (env->cfg, "transport-wlan", "TESTMODE", &testmode)) || (testmode > 2) ) ) - { - LOG (GNUNET_ERROR_TYPE_ERROR, - _("Invalid configuration option `%s' in section `%s'\n"), - "TESTMODE", - "transport-wlan"); + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + "transport-wlan", "TESTMODE"); return NULL; } if ( (0 == testmode) && @@ -1682,10 +1728,8 @@ libgnunet_plugin_transport_wlan_init (void *cls) (env->cfg, "transport-wlan", "INTERFACE", &interface)) { - LOG (GNUNET_ERROR_TYPE_ERROR, - _("Missing configuration option `%s' in section `%s'\n"), - "INTERFACE", - "transport-wlan"); + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + "transport-wlan", "INTERFACE"); return NULL; } @@ -1704,13 +1748,15 @@ libgnunet_plugin_transport_wlan_init (void *cls) plugin->helper_payload_tokenizer = GNUNET_SERVER_mst_create (&process_data, plugin); plugin->beacon_task = GNUNET_SCHEDULER_add_now (&send_hello_beacon, plugin); - switch (testmode) + /* some compilers do not like switch on 'long long'... */ + switch ((unsigned int) testmode) { case 0: /* normal */ plugin->helper_argv[0] = (char *) "gnunet-helper-transport-wlan"; plugin->helper_argv[1] = interface; plugin->helper_argv[2] = NULL; - plugin->suid_helper = GNUNET_HELPER_start ("gnunet-helper-transport-wlan", + plugin->suid_helper = GNUNET_HELPER_start (GNUNET_NO, + "gnunet-helper-transport-wlan", plugin->helper_argv, &handle_helper_message, NULL, @@ -1720,7 +1766,8 @@ libgnunet_plugin_transport_wlan_init (void *cls) plugin->helper_argv[0] = (char *) "gnunet-helper-transport-wlan-dummy"; plugin->helper_argv[1] = (char *) "1"; plugin->helper_argv[2] = NULL; - plugin->suid_helper = GNUNET_HELPER_start ("gnunet-helper-transport-wlan-dummy", + plugin->suid_helper = GNUNET_HELPER_start (GNUNET_NO, + "gnunet-helper-transport-wlan-dummy", plugin->helper_argv, &handle_helper_message, NULL, @@ -1730,7 +1777,8 @@ libgnunet_plugin_transport_wlan_init (void *cls) plugin->helper_argv[0] = (char *) "gnunet-helper-transport-wlan-dummy"; plugin->helper_argv[1] = (char *) "2"; plugin->helper_argv[2] = NULL; - plugin->suid_helper = GNUNET_HELPER_start ("gnunet-helper-transport-wlan-dummy", + plugin->suid_helper = GNUNET_HELPER_start (GNUNET_NO, + "gnunet-helper-transport-wlan-dummy", plugin->helper_argv, &handle_helper_message, NULL,