gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet] branch master updated: - first attempt to fix the udp backchann


From: gnunet
Subject: [gnunet] branch master updated: - first attempt to fix the udp backchannel
Date: Tue, 06 Oct 2020 07:29:25 +0200

This is an automated email from the git hooks/post-receive script.

t3sserakt pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new 8c40115c5 - first attempt to fix the udp backchannel
     new c25c3fd24 Merge branch 'master' of ssh://gnunet.org/gnunet
8c40115c5 is described below

commit 8c40115c58f639edc17ff242ec1a79c2078dc301
Author: t3sserakt <t3ss@posteo.de>
AuthorDate: Tue Oct 6 07:20:10 2020 +0200

    - first attempt to fix the udp backchannel
---
 src/transport/gnunet-communicator-udp.c | 372 +++++++++++++++++++-------------
 src/transport/test_communicator_basic.c | 174 +++++++++++----
 2 files changed, 363 insertions(+), 183 deletions(-)

diff --git a/src/transport/gnunet-communicator-udp.c 
b/src/transport/gnunet-communicator-udp.c
index 5ca5a4e86..579f744e5 100644
--- a/src/transport/gnunet-communicator-udp.c
+++ b/src/transport/gnunet-communicator-udp.c
@@ -75,6 +75,9 @@
  */
 #define ADDRESS_VALIDITY_PERIOD GNUNET_TIME_UNIT_HOURS
 
+#define WORKING_QUEUE_INTERVALL \
+  GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MICROSECONDS,1)
+
 /**
  * AES key size.
  */
@@ -90,6 +93,8 @@
  */
 #define GCM_TAG_SIZE (128 / 8)
 
+#define GENERATE_AT_ONCE 20
+
 /**
  * If we fall below this number of available KCNs,
  * we generate additional ACKs until we reach
@@ -499,6 +504,12 @@ struct SenderAddress
    */
   unsigned int num_secrets;
 
+  /**
+   * Number of BOX keys from ACKs we have currently
+   * available for this sender.
+   */
+  unsigned int acks_available;
+
   /**
    * Which network type does this queue use?
    */
@@ -796,26 +807,15 @@ bi_destroy (struct BroadcastInterface *bi)
 static void
 receiver_destroy (struct ReceiverAddress *receiver)
 {
-  struct GNUNET_MQ_Handle *mq;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Disconnecting receiver for peer `%s'\n",
               GNUNET_i2s (&receiver->target));
-  if (NULL != (mq = receiver->kx_mq))
-  {
-    receiver->kx_mq = NULL;
-    GNUNET_MQ_destroy (mq);
-  }
   if (NULL != receiver->kx_qh)
   {
     GNUNET_TRANSPORT_communicator_mq_del (receiver->kx_qh);
     receiver->kx_qh = NULL;
   }
-  if (NULL != (mq = receiver->d_mq))
-  {
-    receiver->d_mq = NULL;
-    GNUNET_MQ_destroy (mq);
-  }
   if (NULL != receiver->d_qh)
   {
     GNUNET_TRANSPORT_communicator_mq_del (receiver->d_qh);
@@ -847,6 +847,7 @@ kce_destroy (struct KeyCacheEntry *kce)
   struct SharedSecret *ss = kce->ss;
 
   ss->active_kce_count--;
+  ss->sender->acks_available--;
   GNUNET_CONTAINER_DLL_remove (ss->kce_head, ss->kce_tail, kce);
   GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multishortmap_remove 
(key_cache,
                                                                       
&kce->kid,
@@ -902,6 +903,7 @@ kce_generate (struct SharedSecret *ss, uint32_t seq)
   get_kid (&ss->master, seq, &kce->kid);
   GNUNET_CONTAINER_DLL_insert (ss->kce_head, ss->kce_tail, kce);
   ss->active_kce_count++;
+  ss->sender->acks_available++;
   (void) GNUNET_CONTAINER_multishortmap_put (
     key_cache,
     &kce->kid,
@@ -930,12 +932,19 @@ secret_destroy (struct SharedSecret *ss)
   {
     GNUNET_CONTAINER_DLL_remove (sender->ss_head, sender->ss_tail, ss);
     sender->num_secrets--;
+    sender->acks_available -= ss->active_kce_count;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "%u acks available after secrect destroy.\n",
+                sender->acks_available);
   }
   if (NULL != (receiver = ss->receiver))
   {
     GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss);
     receiver->num_secrets--;
     receiver->acks_available -= (ss->sequence_allowed - ss->sequence_used);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "%u acks available after secrect destroy.\n",
+                receiver->acks_available);
   }
   while (NULL != (kce = ss->kce_head))
     kce_destroy (kce);
@@ -1250,6 +1259,10 @@ setup_shared_secret_enc (const struct 
GNUNET_CRYPTO_EcdhePrivateKey *ephemeral,
                             &receiver->target.public_key,
                             &ss->master);
   calculate_cmac (ss);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Created cmac %s for secret %p.\n",
+              GNUNET_h2s (&ss->cmac),
+              ss);
   ss->receiver = receiver;
   GNUNET_CONTAINER_DLL_insert (receiver->ss_head, receiver->ss_tail, ss);
   receiver->num_secrets++;
@@ -1298,12 +1311,11 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity 
*pid, void *value)
 
       allowed = ntohl (ack->sequence_max);
 
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "%u > %u (%u)\n", allowed, ss->sequence_allowed,
+                  receiver->acks_available);
       if (allowed > ss->sequence_allowed)
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                    "%u > %u (%u)\n", allowed, ss->sequence_allowed,
-                    receiver->acks_available);
-
         receiver->acks_available += (allowed - ss->sequence_allowed);
         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                     "Tell transport we have more acks!\n");
@@ -1312,6 +1324,9 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity 
*pid, void *value)
                                                  (allowed
                                                   - ss->sequence_allowed),
                                                  1);
+        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                    "%u acks made available.\n",
+                    receiver->acks_available);
         ss->sequence_allowed = allowed;
         /* move ss to head to avoid discarding it anytime soon! */
         GNUNET_CONTAINER_DLL_remove (receiver->ss_head, receiver->ss_tail, ss);
@@ -1370,6 +1385,19 @@ try_handle_plaintext (struct SenderAddress *sender,
   }
 }
 
+static void
+kce_generate_cb (void *cls)
+{
+  struct SharedSecret *ss = cls;
+
+  for (int i = 0; i < GENERATE_AT_ONCE; i++)
+    kce_generate (ss, ++ss->sequence_allowed);
+
+  /*GNUNET_SCHEDULER_add_delayed (WORKING_QUEUE_INTERVALL,
+                                kce_generate_cb,
+                                ss);*/
+
+}
 
 /**
  * We established a shared secret with a sender. We should try to send
@@ -1392,7 +1420,12 @@ consider_ss_ack (struct SharedSecret *ss)
          (MAX_SQN_DELTA <
           ss->kce_head->sequence_number - ss->kce_tail->sequence_number))
     kce_destroy (ss->kce_tail);
-  if (ss->active_kce_count < KCN_THRESHOLD)
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "%u active count and %u acks available\n",
+              ss->active_kce_count,
+              ss->sender->acks_available);
+  if ((ss->active_kce_count < KCN_THRESHOLD) && (ss->sender->acks_available <
+                                                 KCN_TARGET) )
   {
     struct UDPAck ack;
 
@@ -1403,15 +1436,19 @@ consider_ss_ack (struct SharedSecret *ss)
      * we only generate a single KCE to prevent
      * unnecessary overhead.
      */
-    if (0 < ss->active_kce_count) {
+    GNUNET_SCHEDULER_add_now (kce_generate_cb, ss);
+    /*if (0 < ss->sequence_allowed)
+    {
       while (ss->active_kce_count < KCN_TARGET)
         kce_generate (ss, ++ss->sequence_allowed);
-    } else {
-      kce_generate (ss, ++ss->sequence_allowed);
     }
+    else {*/
+    /*kce_generate (ss, ++ss->sequence_allowed);
+      kce_generate (ss, ++ss->sequence_allowed);*/
+    // }
     ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK);
     ack.header.size = htons (sizeof(ack));
-    ack.sequence_max = htonl (ss->sequence_allowed);
+    ack.sequence_max = htonl (ss->sequence_allowed + GENERATE_AT_ONCE);
     ack.cmac = ss->cmac;
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Notifying transport of UDPAck %s\n",
@@ -1452,6 +1489,10 @@ decrypt_box (const struct UDPBox *box,
                               1,
                               GNUNET_NO);
     kce_destroy (kce);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "decrypting of UDPBox with kid %s and cmac %s failed\n",
+                GNUNET_sh2s (&box->kid),
+                GNUNET_h2s (&ss->cmac));
     return;
   }
   kce_destroy (kce);
@@ -1459,6 +1500,9 @@ decrypt_box (const struct UDPBox *box,
                             "# bytes decrypted with BOX",
                             sizeof(out_buf),
                             GNUNET_NO);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "decrypted UDPBox with kid %s\n",
+              GNUNET_sh2s (&box->kid));
   try_handle_plaintext (ss->sender, out_buf, sizeof(out_buf));
   consider_ss_ack (ss);
 }
@@ -1517,7 +1561,7 @@ find_sender_by_address (void *cls,
  * might already have one, so a fresh one is only allocated
  * if one does not yet exist for @a address.
  *
- * @param target peer to generate address for
+ * @param target peer to generate address for (can be NULL, if we already have 
one).
  * @param address target address
  * @param address_len number of bytes in @a address
  * @return data structure to keep track of key material for
@@ -1530,14 +1574,14 @@ setup_sender (const struct GNUNET_PeerIdentity *target,
 {
   struct SenderAddress *sender;
   struct SearchContext sc = { .address = address,
-    .address_len = address_len,
-    .sender = NULL };
+                              .address_len = address_len,
+                              .sender = NULL };
 
   GNUNET_CONTAINER_multipeermap_get_multiple (senders,
                                               target,
                                               &find_sender_by_address,
                                               &sc);
-  if (NULL != sc.sender)
+  if ((NULL != sc.sender)||(NULL == target))
   {
     reschedule_sender_timeout (sc.sender);
     return sc.sender;
@@ -1547,10 +1591,10 @@ setup_sender (const struct GNUNET_PeerIdentity *target,
   sender->address = GNUNET_memdup (address, address_len);
   sender->address_len = address_len;
   (void) GNUNET_CONTAINER_multipeermap_put (
-                                            senders,
-                                            &sender->target,
-                                            sender,
-                                            
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+    senders,
+    &sender->target,
+    sender,
+    GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
   GNUNET_STATISTICS_set (stats,
                          "# senders active",
                          GNUNET_CONTAINER_multipeermap_size (receivers),
@@ -1587,10 +1631,10 @@ verify_confirmation (const struct 
GNUNET_CRYPTO_EcdhePublicKey *ephemeral,
   uhs.ephemeral = *ephemeral;
   uhs.monotonic_time = uc->monotonic_time;
   return GNUNET_CRYPTO_eddsa_verify (
-                                     
GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE,
-                                     &uhs,
-                                     &uc->sender_sig,
-                                     &uc->sender.public_key);
+    GNUNET_SIGNATURE_COMMUNICATOR_UDP_HANDSHAKE,
+    &uhs,
+    &uc->sender_sig,
+    &uc->sender.public_key);
 }
 
 
@@ -1610,22 +1654,22 @@ sockaddr_to_udpaddr_string (const struct sockaddr 
*address,
 
   switch (address->sa_family)
   {
-    case AF_INET:
-      GNUNET_asprintf (&ret,
-                       "%s-%s",
-                       COMMUNICATOR_ADDRESS_PREFIX,
-                       GNUNET_a2s (address, address_len));
-      break;
+  case AF_INET:
+    GNUNET_asprintf (&ret,
+                     "%s-%s",
+                     COMMUNICATOR_ADDRESS_PREFIX,
+                     GNUNET_a2s (address, address_len));
+    break;
 
-    case AF_INET6:
-      GNUNET_asprintf (&ret,
-                       "%s-%s",
-                       COMMUNICATOR_ADDRESS_PREFIX,
-                       GNUNET_a2s (address, address_len));
-      break;
+  case AF_INET6:
+    GNUNET_asprintf (&ret,
+                     "%s-%s",
+                     COMMUNICATOR_ADDRESS_PREFIX,
+                     GNUNET_a2s (address, address_len));
+    break;
 
-    default:
-      GNUNET_assert (0);
+  default:
+    GNUNET_assert (0);
   }
   return ret;
 }
@@ -1660,7 +1704,8 @@ sock_read (void *cls)
     return;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Read %lu bytes\n", rcvd);
+              "Read %lu bytes.\n",
+              rcvd);
   /* first, see if it is a UDPBox */
   if (rcvd > sizeof(struct UDPBox))
   {
@@ -1674,6 +1719,9 @@ sock_read (void *cls)
       decrypt_box (box, (size_t) rcvd, kce);
       return;
     }
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "No kid %s.\n",
+                GNUNET_sh2s (&box->kid));
   }
 
   /* next, check if it is a broadcast */
@@ -1731,7 +1779,8 @@ sock_read (void *cls)
     kx = (const struct InitialKX *) buf;
     ss = setup_shared_secret_dec (&kx->ephemeral);
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Before DEC\n");
+                "Before DEC with ephemeral %s\n",
+                GNUNET_e2s (&kx->ephemeral));
 
     if (GNUNET_OK != try_decrypt (ss,
                                   kx->gcm_tag,
@@ -1744,10 +1793,10 @@ sock_read (void *cls)
                   "Unable to decrypt tag, dropping...\n");
       GNUNET_free (ss);
       GNUNET_STATISTICS_update (
-                                stats,
-                                "# messages dropped (no kid, AEAD decryption 
failed)",
-                                1,
-                                GNUNET_NO);
+        stats,
+        "# messages dropped (no kid, AEAD decryption failed)",
+        1,
+        GNUNET_NO);
       return;
     }
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1768,6 +1817,10 @@ sock_read (void *cls)
                 "Before SETUP_SENDER\n");
 
     calculate_cmac (ss);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Got cmac %s for secret %p.\n",
+                GNUNET_h2s (&ss->cmac),
+                ss);
     sender = setup_sender (&uc->sender, (const struct sockaddr *) &sa, salen);
     ss->sender = sender;
     GNUNET_CONTAINER_DLL_insert (sender->ss_head, sender->ss_tail, ss);
@@ -1778,9 +1831,12 @@ sock_read (void *cls)
                               1,
                               GNUNET_NO);
     try_handle_plaintext (sender, &uc[1], sizeof(pbuf) - sizeof(*uc));
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "We have %u secrets\n",
+                sender->num_secrets);
+    /*if (sender->num_secrets > MAX_SECRETS)
+      secret_destroy (sender->ss_tail);*/
     consider_ss_ack (ss);
-    if (sender->num_secrets > MAX_SECRETS)
-      secret_destroy (sender->ss_tail);
   }
 }
 
@@ -1859,9 +1915,9 @@ udp_address_to_sockaddr (const char *bindto, socklen_t 
*sock_len)
     else
     {
       GNUNET_log (
-                  GNUNET_ERROR_TYPE_ERROR,
-                  "BINDTO specification `%s' invalid: last ':' not followed by 
number\n",
-                  bindto);
+        GNUNET_ERROR_TYPE_ERROR,
+        "BINDTO specification `%s' invalid: last ':' not followed by number\n",
+        bindto);
       GNUNET_free (cp);
       return NULL;
     }
@@ -1939,8 +1995,8 @@ do_pad (gcry_cipher_hd_t out_cipher, char *dgram, size_t 
pad_size)
     memcpy (pad, &hdr, sizeof(hdr));
   }
   GNUNET_assert (
-                 0 ==
-                 gcry_cipher_encrypt (out_cipher, dgram, sizeof(pad), pad, 
sizeof(pad)));
+    0 ==
+    gcry_cipher_encrypt (out_cipher, dgram, sizeof(pad), pad, sizeof(pad)));
 }
 
 
@@ -1982,6 +2038,8 @@ mq_send_kx (struct GNUNET_MQ_Handle *mq,
   GNUNET_CRYPTO_ecdhe_key_create (&epriv);
 
   ss = setup_shared_secret_enc (&epriv, receiver);
+  /*if (receiver->num_secrets > MAX_SECRETS)
+    secret_destroy (receiver->ss_tail);*/
   setup_cipher (&ss->master, 0, &out_cipher);
   /* compute 'uc' */
   uc.sender = my_identity;
@@ -2007,13 +2065,13 @@ mq_send_kx (struct GNUNET_MQ_Handle *mq,
   dpos += sizeof(uc);
   /* Append encrypted payload to dgram */
   GNUNET_assert (
-                 0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, 
msg, msize));
+    0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize));
   dpos += msize;
   do_pad (out_cipher, &dgram[dpos], sizeof(dgram) - dpos);
   /* Datagram starts with kx */
   kx.ephemeral = uhs.ephemeral;
   GNUNET_assert (
-                 0 == gcry_cipher_gettag (out_cipher, kx.gcm_tag, 
sizeof(kx.gcm_tag)));
+    0 == gcry_cipher_gettag (out_cipher, kx.gcm_tag, sizeof(kx.gcm_tag)));
   gcry_cipher_close (out_cipher);
   memcpy (dgram, &kx, sizeof(kx));
   if (-1 == GNUNET_NETWORK_socket_sendto (udp_sock,
@@ -2023,8 +2081,10 @@ mq_send_kx (struct GNUNET_MQ_Handle *mq,
                                           receiver->address_len))
     GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Sending KX to %s\n", GNUNET_a2s (receiver->address,
-                                                receiver->address_len));
+              "Sending KX to %s with ephemeral %s\n",
+              GNUNET_a2s (receiver->address,
+                          receiver->address_len),
+              GNUNET_e2s (&kx.ephemeral));
   GNUNET_MQ_impl_send_continue (mq);
 }
 
@@ -2045,6 +2105,11 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
   struct ReceiverAddress *receiver = impl_state;
   uint16_t msize = ntohs (msg->size);
 
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "sending to receiver %s with %u acks available.\n",
+              receiver->foreign_addr,
+              receiver->acks_available);
+
   GNUNET_assert (mq == receiver->d_mq);
   if ((msize > receiver->d_mtu) ||
       (0 == receiver->acks_available))
@@ -2069,12 +2134,16 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
 
     box = (struct UDPBox *) dgram;
     ss->sequence_used++;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "get kid with sequence number %u and cmac %s.\n",
+                ss->sequence_used,
+                GNUNET_h2s (&ss->cmac));
     get_kid (&ss->master, ss->sequence_used, &box->kid);
     setup_cipher (&ss->master, ss->sequence_used, &out_cipher);
     /* Append encrypted payload to dgram */
     dpos = sizeof(struct UDPBox);
     GNUNET_assert (
-                   0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, 
msg, msize));
+      0 == gcry_cipher_encrypt (out_cipher, &dgram[dpos], msize, msg, msize));
     dpos += msize;
     do_pad (out_cipher, &dgram[dpos], sizeof(dgram) - dpos);
     GNUNET_assert (0 == gcry_cipher_gettag (out_cipher,
@@ -2087,8 +2156,19 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
                                             receiver->address,
                                             receiver->address_len))
       GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "send");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Sending UDPBox to %s with shared secrect %p and kid %s\n",
+                GNUNET_a2s (
+                  receiver->address,
+                  receiver
+                  ->address_len),
+                ss,
+                GNUNET_sh2s (&box->kid));
     GNUNET_MQ_impl_send_continue (mq);
     receiver->acks_available--;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "%u acks available after sending.\n",
+                receiver->acks_available);
     if (0 == receiver->acks_available)
     {
       /* We have no more ACKs */
@@ -2205,25 +2285,25 @@ setup_receiver_mq (struct ReceiverAddress *receiver)
   // GNUNET_assert (NULL == receiver->mq);
   switch (receiver->address->sa_family)
   {
-    case AF_INET:
-      base_mtu = 1480   /* Ethernet MTU, 1500 - Ethernet header - VLAN tag */
-        - sizeof(struct GNUNET_TUN_IPv4Header)   /* 20 */
-        - sizeof(struct GNUNET_TUN_UdpHeader) /* 8 */;
-      break;
+  case AF_INET:
+    base_mtu = 1480     /* Ethernet MTU, 1500 - Ethernet header - VLAN tag */
+               - sizeof(struct GNUNET_TUN_IPv4Header) /* 20 */
+               - sizeof(struct GNUNET_TUN_UdpHeader) /* 8 */;
+    break;
 
-    case AF_INET6:
-      base_mtu = 1280   /* Minimum MTU required by IPv6 */
-        - sizeof(struct GNUNET_TUN_IPv6Header)   /* 40 */
-        - sizeof(struct GNUNET_TUN_UdpHeader) /* 8 */;
-      break;
+  case AF_INET6:
+    base_mtu = 1280     /* Minimum MTU required by IPv6 */
+               - sizeof(struct GNUNET_TUN_IPv6Header) /* 40 */
+               - sizeof(struct GNUNET_TUN_UdpHeader) /* 8 */;
+    break;
 
-    default:
-      GNUNET_assert (0);
-      break;
+  default:
+    GNUNET_assert (0);
+    break;
   }
   /* MTU based on full KX messages */
   receiver->kx_mtu = base_mtu - sizeof(struct InitialKX)   /* 48 */
-    - sizeof(struct UDPConfirmation); /* 104 */
+                     - sizeof(struct UDPConfirmation); /* 104 */
   /* MTU based on BOXed messages */
   receiver->d_mtu = base_mtu - sizeof(struct UDPBox);
 
@@ -2314,10 +2394,10 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity 
*peer, const char *address)
   receiver->target = *peer;
   receiver->nt = GNUNET_NT_scanner_get_type (is, in, in_len);
   (void) GNUNET_CONTAINER_multipeermap_put (
-                                            receivers,
-                                            &receiver->target,
-                                            receiver,
-                                            
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
+    receivers,
+    &receiver->target,
+    receiver,
+    GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Added %s to receivers\n",
               GNUNET_i2s_full (&receiver->target));
@@ -2553,55 +2633,55 @@ ifc_broadcast (void *cls)
 
   switch (bi->sa->sa_family)
   {
-    case AF_INET: {
-                    static int yes = 1;
-                    static int no = 0;
-                    ssize_t sent;
-
-                    if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt 
(udp_sock,
-                                                                       
SOL_SOCKET,
-                                                                       
SO_BROADCAST,
-                                                                       &yes,
-                                                                       
sizeof(int)))
-                      GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, 
"setsockopt");
-                    sent = GNUNET_NETWORK_socket_sendto (udp_sock,
-                                                         &bi->bcm,
-                                                         sizeof(bi->bcm),
-                                                         bi->ba,
-                                                         bi->salen);
-                    if (-1 == sent)
-                      GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, 
"sendto");
-                    if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt 
(udp_sock,
-                                                                       
SOL_SOCKET,
-                                                                       
SO_BROADCAST,
-                                                                       &no,
-                                                                       
sizeof(int)))
-                      GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, 
"setsockopt");
-                    break;
-                  }
-
-    case AF_INET6: {
-                     ssize_t sent;
-                     struct sockaddr_in6 dst;
-
-                     dst.sin6_family = AF_INET6;
-                     dst.sin6_port = htons (my_port);
-                     dst.sin6_addr = bi->mcreq.ipv6mr_multiaddr;
-                     dst.sin6_scope_id = ((struct sockaddr_in6 *) 
bi->ba)->sin6_scope_id;
-
-                     sent = GNUNET_NETWORK_socket_sendto (udp_sock,
-                                                          &bi->bcm,
-                                                          sizeof(bi->bcm),
-                                                          (const struct 
sockaddr *) &dst,
-                                                          sizeof(dst));
-                     if (-1 == sent)
-                       GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, 
"sendto");
-                     break;
-                   }
-
-    default:
-                   GNUNET_break (0);
-                   break;
+  case AF_INET: {
+      static int yes = 1;
+      static int no = 0;
+      ssize_t sent;
+
+      if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock,
+                                                         SOL_SOCKET,
+                                                         SO_BROADCAST,
+                                                         &yes,
+                                                         sizeof(int)))
+        GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt");
+      sent = GNUNET_NETWORK_socket_sendto (udp_sock,
+                                           &bi->bcm,
+                                           sizeof(bi->bcm),
+                                           bi->ba,
+                                           bi->salen);
+      if (-1 == sent)
+        GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "sendto");
+      if (GNUNET_OK != GNUNET_NETWORK_socket_setsockopt (udp_sock,
+                                                         SOL_SOCKET,
+                                                         SO_BROADCAST,
+                                                         &no,
+                                                         sizeof(int)))
+        GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "setsockopt");
+      break;
+    }
+
+  case AF_INET6: {
+      ssize_t sent;
+      struct sockaddr_in6 dst;
+
+      dst.sin6_family = AF_INET6;
+      dst.sin6_port = htons (my_port);
+      dst.sin6_addr = bi->mcreq.ipv6mr_multiaddr;
+      dst.sin6_scope_id = ((struct sockaddr_in6 *) bi->ba)->sin6_scope_id;
+
+      sent = GNUNET_NETWORK_socket_sendto (udp_sock,
+                                           &bi->bcm,
+                                           sizeof(bi->bcm),
+                                           (const struct sockaddr *) &dst,
+                                           sizeof(dst));
+      if (-1 == sent)
+        GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "sendto");
+      break;
+    }
+
+  default:
+    GNUNET_break (0);
+    break;
   }
 }
 
@@ -2683,7 +2763,7 @@ iface_proc (void *cls,
       (const struct sockaddr_in6 *) broadcast_addr;
 
     GNUNET_assert (
-                   1 == inet_pton (AF_INET6, "FF05::13B", 
&bi->mcreq.ipv6mr_multiaddr));
+      1 == inet_pton (AF_INET6, "FF05::13B", &bi->mcreq.ipv6mr_multiaddr));
 
     /* http://tools.ietf.org/html/rfc2553#section-5.2:
      *
@@ -2820,17 +2900,17 @@ run (void *cls,
               GNUNET_a2s ((const struct sockaddr *) &in_sto, sto_len));
   switch (in->sa_family)
   {
-    case AF_INET:
-      my_port = ntohs (((struct sockaddr_in *) in)->sin_port);
-      break;
+  case AF_INET:
+    my_port = ntohs (((struct sockaddr_in *) in)->sin_port);
+    break;
 
-    case AF_INET6:
-      my_port = ntohs (((struct sockaddr_in6 *) in)->sin6_port);
-      break;
+  case AF_INET6:
+    my_port = ntohs (((struct sockaddr_in6 *) in)->sin6_port);
+    break;
 
-    default:
-      GNUNET_break (0);
-      my_port = 0;
+  default:
+    GNUNET_break (0);
+    my_port = 0;
   }
   stats = GNUNET_STATISTICS_create ("C-UDP", cfg);
   senders = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_YES);
@@ -2845,9 +2925,9 @@ run (void *cls,
   if (NULL == my_private_key)
   {
     GNUNET_log (
-                GNUNET_ERROR_TYPE_ERROR,
-                _ (
-                   "Transport service is lacking key configuration settings. 
Exiting.\n"));
+      GNUNET_ERROR_TYPE_ERROR,
+      _ (
+        "Transport service is lacking key configuration settings. 
Exiting.\n"));
     GNUNET_SCHEDULER_shutdown ();
     return;
   }
@@ -2923,8 +3003,8 @@ main (int argc, char *const *argv)
                                           options,
                                           &run,
                                           NULL))
-    ? 0
-    : 1;
+        ? 0
+        : 1;
   GNUNET_free_nz ((void *) argv);
   return ret;
 }
diff --git a/src/transport/test_communicator_basic.c 
b/src/transport/test_communicator_basic.c
index e3573ac2c..2d550dc16 100644
--- a/src/transport/test_communicator_basic.c
+++ b/src/transport/test_communicator_basic.c
@@ -82,6 +82,9 @@ static struct 
GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle *my_tc;
 
 static unsigned int iterations_left = TOTAL_ITERATIONS;
 
+#define DELAY \
+  GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MICROSECONDS,1000)
+
 #define SHORT_BURST_WINDOW \
   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,2)
 
@@ -97,13 +100,21 @@ enum TestPhase
 };
 
 
-static size_t num_sent = 0;
+static size_t num_sent_short = 0;
+
+static size_t num_sent_long = 0;
+
+static size_t num_sent_size = 0;
 
 static uint32_t ack = 0;
 
 static enum TestPhase phase;
 
-static size_t num_received = 0;
+static size_t num_received_short = 0;
+
+static size_t num_received_long = 0;
+
+static size_t num_received_size = 0;
 
 static uint64_t avg_latency = 0;
 
@@ -230,6 +241,10 @@ make_payload (size_t payload_size)
 static void
 latency_timeout (void *cls)
 {
+
+  size_t num_sent = 0;
+  size_t num_received = 0;
+
   to_task = NULL;
   if (GNUNET_TIME_absolute_get_remaining (timeout).rel_value_us > 0)
   {
@@ -239,6 +254,21 @@ latency_timeout (void *cls)
     return;
   }
 
+  switch (phase)
+  {
+  case TP_BURST_SHORT:
+    num_sent = num_sent_short;
+    num_received = num_received_short;
+    break;
+  case TP_BURST_LONG:
+    num_sent = num_sent_long;
+    num_received = num_received_long;
+    break;
+  case TP_SIZE_CHECK:
+    num_sent = num_sent_size;
+    num_received = num_received_size;
+    break;
+  }
   LOG (GNUNET_ERROR_TYPE_ERROR,
        "Latency too high. Test failed. (Phase: %d. Sent: %lu, Received: 
%lu)\n",
        phase, num_sent, num_received);
@@ -246,6 +276,8 @@ latency_timeout (void *cls)
   GNUNET_SCHEDULER_shutdown ();
 }
 
+/*static void
+  size_test (void *cls);*/
 
 static void
 size_test (void *cls)
@@ -253,6 +285,9 @@ size_test (void *cls)
   char *payload;
   size_t max_size = 64000;
 
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "size_test_cb %u\n",
+       num_sent_size);
   GNUNET_assert (TP_SIZE_CHECK == phase);
   if (LONG_MESSAGE_SIZE != long_message_size)
     max_size = long_message_size;
@@ -260,7 +295,7 @@ size_test (void *cls)
     return; /* Leave some room for our protocol, so not 2^16 exactly */
   ack += 10;
   payload = make_payload (ack);
-  num_sent++;
+  num_sent_size++;
   GNUNET_TRANSPORT_TESTING_transport_communicator_send (my_tc,
                                                         (ack < max_size)
                                                         ? &size_test
@@ -272,17 +307,34 @@ size_test (void *cls)
   timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_SECONDS);
 }
 
+/*static void
+size_test (void *cls)
+{
+  GNUNET_SCHEDULER_add_delayed (DELAY,
+                                &size_test_cb,
+                                NULL);
+                                }*/
+
+static void
+long_test (void *cls);
 
 static void
-long_test (void *cls)
+long_test_cb (void *cls)
 {
   char *payload;
 
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "long_test_cb %u/%u\n",
+       num_sent_long,
+       num_received_long);
   payload = make_payload (long_message_size);
-  num_sent++;
+  num_sent_long++;
   GNUNET_TRANSPORT_TESTING_transport_communicator_send (my_tc,
-                                                        (BURST_PACKETS ==
-                                                         num_sent)
+                                                        ((BURST_PACKETS
+                                                          * 0.91 ==
+                                                          num_received_long) ||
+                                                         (BURST_PACKETS ==
+                                                          num_sent_long))
                                                         ? NULL
                                                         : &long_test,
                                                         NULL,
@@ -292,17 +344,37 @@ long_test (void *cls)
   timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_SECONDS);
 }
 
+static void
+long_test (void *cls)
+{
+  /*LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "long_test %u\n",
+       num_sent_long);*/
+  GNUNET_SCHEDULER_add_delayed (DELAY,
+                                &long_test_cb,
+                                NULL);
+}
 
 static void
-short_test (void *cls)
+short_test (void *cls);
+
+static void
+short_test_cb (void *cls)
 {
   char *payload;
 
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "short_test_cb %u/%u\n",
+       num_sent_short,
+       num_received_short);
   payload = make_payload (SHORT_MESSAGE_SIZE);
-  num_sent++;
+  num_sent_short++;
   GNUNET_TRANSPORT_TESTING_transport_communicator_send (my_tc,
-                                                        (BURST_PACKETS ==
-                                                         num_sent)
+                                                        ((BURST_PACKETS
+                                                          * 0.91 ==
+                                                          num_received_short) 
||
+                                                         (BURST_PACKETS ==
+                                                          num_sent_short))
                                                         ? NULL
                                                         : &short_test,
                                                         NULL,
@@ -312,6 +384,14 @@ short_test (void *cls)
   timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_SECONDS);
 }
 
+static void
+short_test (void *cls)
+{
+  GNUNET_SCHEDULER_add_delayed (DELAY,
+                                &short_test_cb,
+                                NULL);
+}
+
 
 static int test_prepared = GNUNET_NO;
 
@@ -388,10 +468,23 @@ update_avg_latency (const char*payload)
   struct GNUNET_TIME_AbsoluteNBO *ts_n;
   struct GNUNET_TIME_Absolute ts;
   struct GNUNET_TIME_Relative latency;
+  size_t num_received = 0;
 
   ts_n = (struct GNUNET_TIME_AbsoluteNBO *) payload;
   ts = GNUNET_TIME_absolute_ntoh (*ts_n);
   latency = GNUNET_TIME_absolute_get_duration (ts);
+  switch (phase)
+  {
+  case TP_BURST_SHORT:
+    num_received = num_received_short;
+    break;
+  case TP_BURST_LONG:
+    num_received = num_received_long;
+    break;
+  case TP_SIZE_CHECK:
+    num_received = num_received_size;
+    break;
+  }
   if (1 >= num_received)
     avg_latency = latency.rel_value_us;
   else
@@ -400,7 +493,6 @@ update_avg_latency (const char*payload)
 
 }
 
-
 /**
  * @brief Handle an incoming message
  *
@@ -412,7 +504,8 @@ update_avg_latency (const char*payload)
  */
 static void
 incoming_message_cb (void *cls,
-                     struct 
GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle
+                     struct
+                     GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle
                      *tc_h,
                      const char*payload,
                      size_t payload_len)
@@ -433,30 +526,31 @@ incoming_message_cb (void *cls,
   case TP_BURST_SHORT:
     {
       GNUNET_assert (SHORT_MESSAGE_SIZE == payload_len);
-      num_received++;
+      num_received_short++;
       duration = GNUNET_TIME_absolute_get_duration (start_short);
       update_avg_latency (payload);
-      if (num_received == BURST_PACKETS)
+      if (num_received_short == BURST_PACKETS * 0.91)
       {
         LOG (GNUNET_ERROR_TYPE_MESSAGE,
              "Short size packet test done.\n");
         char *goodput = GNUNET_STRINGS_byte_size_fancy ((SHORT_MESSAGE_SIZE
-                                                         * num_received * 1000
+                                                         * num_received_short
+                                                         * 1000
                                                          * 1000)
                                                         / 
duration.rel_value_us);
         LOG (GNUNET_ERROR_TYPE_MESSAGE,
              "%lu/%lu packets in %llu us (%s/s) -- avg latency: %llu us\n",
-             (unsigned long) num_received,
-             (unsigned long) num_sent,
+             (unsigned long) num_received_short,
+             (unsigned long) num_sent_short,
              (unsigned long long) duration.rel_value_us,
              goodput,
              (unsigned long long) avg_latency);
         GNUNET_free (goodput);
         start_long = GNUNET_TIME_absolute_get ();
         phase = TP_BURST_LONG;
-        num_sent = 0;
+        // num_sent_short = 0;
         avg_latency = 0;
-        num_received = 0;
+        // num_received = 0;
         long_test (NULL);
       }
       break;
@@ -467,32 +561,34 @@ incoming_message_cb (void *cls,
       {
         LOG (GNUNET_ERROR_TYPE_WARNING,
              "Ignoring packet with wrong length\n");
-        return; // Ignore
+        return;   // Ignore
       }
-      num_received++;
+      num_received_long++;
       duration = GNUNET_TIME_absolute_get_duration (start_long);
       update_avg_latency (payload);
-      if (num_received == BURST_PACKETS)
+      if (num_received_long == BURST_PACKETS * 0.91)
       {
         LOG (GNUNET_ERROR_TYPE_MESSAGE,
              "Long size packet test done.\n");
         char *goodput = GNUNET_STRINGS_byte_size_fancy ((long_message_size
-                                                         * num_received * 1000
+                                                         * num_received_long
+                                                         * 1000
                                                          * 1000)
-                                                        / 
duration.rel_value_us);
+                                                        / duration.
+                                                        rel_value_us);
 
         LOG (GNUNET_ERROR_TYPE_MESSAGE,
              "%lu/%lu packets in %llu us (%s/s) -- avg latency: %llu us\n",
-             (unsigned long) num_received,
-             (unsigned long) num_sent,
+             (unsigned long) num_received_long,
+             (unsigned long) num_sent_long,
              (unsigned long long) duration.rel_value_us,
              goodput,
              (unsigned long long) avg_latency);
         GNUNET_free (goodput);
         ack = 0;
         phase = TP_SIZE_CHECK;
-        num_received = 0;
-        num_sent = 0;
+        // num_received = 0;
+        // num_sent_long = 0;
         avg_latency = 0;
         size_test (NULL);
       }
@@ -505,25 +601,29 @@ incoming_message_cb (void *cls,
       GNUNET_assert (TP_SIZE_CHECK == phase);
       if (LONG_MESSAGE_SIZE != long_message_size)
         max_size = long_message_size;
-      num_received++;
+      num_received_size++;
       update_avg_latency (payload);
-      if (num_received >= (max_size) / 10)
+      if (num_received_size >= (max_size) / 10)
       {
         LOG (GNUNET_ERROR_TYPE_MESSAGE,
              "Size packet test done.\n");
         LOG (GNUNET_ERROR_TYPE_MESSAGE,
              "%lu/%lu packets -- avg latency: %llu us\n",
-             (unsigned long) num_received,
-             (unsigned long) num_sent,
+             (unsigned long) num_received_size,
+             (unsigned long) num_sent_size,
              (unsigned long long) avg_latency);
-        num_received = 0;
-        num_sent = 0;
+        num_received_size = 0;
+        num_sent_size = 0;
         avg_latency = 0;
         iterations_left--;
         if (0 != iterations_left)
         {
           start_short = GNUNET_TIME_absolute_get ();
           phase = TP_BURST_SHORT;
+          num_sent_short = 0;
+          num_sent_long = 0;
+          num_received_short = 0;
+          num_received_long = 0;
           short_test (NULL);
           break;
         }
@@ -561,8 +661,8 @@ static void
 run (void *cls)
 {
   ret = 0;
-  num_received = 0;
-  num_sent = 0;
+  // num_received = 0;
+  // num_sent = 0;
   for (unsigned int i = 0; i < NUM_PEERS; i++)
   {
     tc_hs[i] = GNUNET_TRANSPORT_TESTING_transport_communicator_service_start (

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]