new operation queue for limiting overlay connects
[oweals/gnunet.git] / src / transport / plugin_transport_wlan.c
index ae1c9f9726506bbeee8c9bc8ac593d10b85b3f66..ab0309cedcbc5710f58df84973e9f843b79e1bbb 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);
   }
 }
 
@@ -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,6 +852,8 @@ 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;
@@ -1063,10 +1085,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 +1127,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 +1193,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);
@@ -1477,7 +1510,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);
 }
 
 
@@ -1674,11 +1707,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) &&
@@ -1694,10 +1725,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;    
   }