- coverity
[oweals/gnunet.git] / src / transport / plugin_transport_wlan.c
index 2d786e2a915ee2bf060f0c51ddaeeaa347a4618b..ccf5d587cb86b7117f019b5bafa4bb274d515ed3 100644 (file)
@@ -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,