gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] branch master updated: TRANSPORT(udp): Improve handling and loo


From: gnunet
Subject: [gnunet] branch master updated: TRANSPORT(udp): Improve handling and lookup of existing connections similar to TCP communicator fix wrt Queue handling.
Date: Thu, 14 Mar 2024 22:00:20 +0100

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

martin-schanzenbach pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new bfe72f857 TRANSPORT(udp): Improve handling and lookup of existing 
connections similar to TCP communicator fix wrt Queue handling.
bfe72f857 is described below

commit bfe72f857072846102e031e4064100921399624b
Author: Martin Schanzenbach <schanzen@gnunet.org>
AuthorDate: Thu Mar 14 21:59:32 2024 +0100

    TRANSPORT(udp): Improve handling and lookup of existing connections similar 
to TCP communicator fix wrt Queue handling.
---
 src/service/transport/gnunet-communicator-udp.c | 160 ++++++++++++++----------
 1 file changed, 92 insertions(+), 68 deletions(-)

diff --git a/src/service/transport/gnunet-communicator-udp.c 
b/src/service/transport/gnunet-communicator-udp.c
index c8c7e8bf9..70528d7ec 100644
--- a/src/service/transport/gnunet-communicator-udp.c
+++ b/src/service/transport/gnunet-communicator-udp.c
@@ -526,6 +526,11 @@ struct SenderAddress
    */
   socklen_t address_len;
 
+  /**
+   * The address key for this entry.
+   */
+  struct GNUNET_HashCode key;
+
   /**
    * Timeout for this sender.
    */
@@ -585,6 +590,11 @@ struct ReceiverAddress
    */
   struct GNUNET_PeerIdentity target;
 
+  /**
+   * The address key for this entry.
+   */
+  struct GNUNET_HashCode key;
+
   /**
    * Shared secrets we received from @e target, first used is head.
    */
@@ -768,12 +778,12 @@ static struct GNUNET_TRANSPORT_CommunicatorHandle *ch;
 /**
  * Receivers (map from peer identity to `struct ReceiverAddress`)
  */
-static struct GNUNET_CONTAINER_MultiPeerMap *receivers;
+static struct GNUNET_CONTAINER_MultiHashMap *receivers;
 
 /**
  * Senders (map from peer identity to `struct SenderAddress`)
  */
-static struct GNUNET_CONTAINER_MultiPeerMap *senders;
+static struct GNUNET_CONTAINER_MultiHashMap *senders;
 
 /**
  * Expiration heap for senders (contains `struct SenderAddress`)
@@ -895,13 +905,13 @@ receiver_destroy (struct ReceiverAddress *receiver)
     receiver->d_qh = NULL;
   }
   GNUNET_assert (GNUNET_YES ==
-                 GNUNET_CONTAINER_multipeermap_remove (receivers,
-                                                       &receiver->target,
+                 GNUNET_CONTAINER_multihashmap_remove (receivers,
+                                                       &receiver->key,
                                                        receiver));
   GNUNET_assert (receiver == GNUNET_CONTAINER_heap_remove_node (receiver->hn));
   GNUNET_STATISTICS_set (stats,
                          "# receivers active",
-                         GNUNET_CONTAINER_multipeermap_size (receivers),
+                         GNUNET_CONTAINER_multihashmap_size (receivers),
                          GNUNET_NO);
   GNUNET_free (receiver->address);
   GNUNET_free (receiver->foreign_addr);
@@ -1053,11 +1063,11 @@ sender_destroy (struct SenderAddress *sender)
   sender->sender_destroy_called = GNUNET_YES;
   GNUNET_assert (
     GNUNET_YES ==
-    GNUNET_CONTAINER_multipeermap_remove (senders, &sender->target, sender));
+    GNUNET_CONTAINER_multihashmap_remove (senders, &sender->key, sender));
   GNUNET_assert (sender == GNUNET_CONTAINER_heap_remove_node (sender->hn));
   GNUNET_STATISTICS_set (stats,
                          "# senders active",
-                         GNUNET_CONTAINER_multipeermap_size (senders),
+                         GNUNET_CONTAINER_multihashmap_size (senders),
                          GNUNET_NO);
   GNUNET_free (sender->address);
   GNUNET_free (sender);
@@ -1507,7 +1517,7 @@ add_acks (struct SharedSecret *ss, int acks_to_add)
  * @return #GNUNET_YES to continue to iterate
  */
 static int
-handle_ack (void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
+handle_ack (void *cls, const struct GNUNET_HashCode *key, void *value)
 {
   const struct UDPAck *ack = cls;
   struct ReceiverAddress *receiver = value;
@@ -1518,7 +1528,7 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity 
*pid, void *value)
               "in handle ack with cmac %s\n",
               GNUNET_h2s (&ack->cmac));
 
-  (void) pid;
+  (void) key;
   for (struct SharedSecret *ss = receiver->ss_head; NULL != ss; ss = ss->next)
   {
     if (0 == memcmp (&ack->cmac, &ss->cmac, sizeof(struct GNUNET_HashCode)))
@@ -1722,8 +1732,8 @@ try_handle_plaintext (struct SenderAddress *sender,
   case GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK:
     /* lookup master secret by 'cmac', then update sequence_max */
     ack = (struct UDPAck*) buf_pos;
-    GNUNET_CONTAINER_multipeermap_get_multiple (receivers,
-                                                &sender->target,
+    GNUNET_CONTAINER_multihashmap_get_multiple (receivers,
+                                                &sender->key,
                                                 &handle_ack,
                                                 (void *) ack);
     /* There could be more messages after the ACK, handle those as well */
@@ -1853,32 +1863,6 @@ struct SearchContext
 };
 
 
-/**
- * Find existing `struct SenderAddress` by matching addresses.
- *
- * @param cls a `struct SearchContext`
- * @param key ignored, must match already
- * @param value a `struct SenderAddress`
- * @return #GNUNET_YES if not found (continue to search), #GNUNET_NO if found
- */
-static int
-find_sender_by_address (void *cls,
-                        const struct GNUNET_PeerIdentity *key,
-                        void *value)
-{
-  struct SearchContext *sc = cls;
-  struct SenderAddress *sender = value;
-
-  if ((sender->address_len == sc->address_len) &&
-      (0 == memcmp (sender->address, sc->address, sender->address_len)))
-  {
-    sc->sender = sender;
-    return GNUNET_NO;   /* stop iterating! */
-  }
-  return GNUNET_YES;
-}
-
-
 /**
  * Create sender address for @a target.  Note that we
  * might already have one, so a fresh one is only allocated
@@ -1896,31 +1880,33 @@ setup_sender (const struct GNUNET_PeerIdentity *target,
               socklen_t address_len)
 {
   struct SenderAddress *sender;
-  struct SearchContext sc = { .address = address,
-                              .address_len = address_len,
-                              .sender = NULL };
+  struct GNUNET_HashContext *hsh;
+  struct GNUNET_HashCode sender_key;
 
-  GNUNET_CONTAINER_multipeermap_get_multiple (senders,
-                                              target,
-                                              &find_sender_by_address,
-                                              &sc);
-  if (NULL != sc.sender)
+  hsh = GNUNET_CRYPTO_hash_context_start ();
+  GNUNET_CRYPTO_hash_context_read (hsh, address, address_len);
+  GNUNET_CRYPTO_hash_context_read (hsh, target, sizeof(*target));
+  GNUNET_CRYPTO_hash_context_finish (hsh, &sender_key);
+
+  sender = GNUNET_CONTAINER_multihashmap_get (senders, &sender_key);
+  if (NULL != sender)
   {
-    reschedule_sender_timeout (sc.sender);
-    return sc.sender;
+    reschedule_sender_timeout (sender);
+    return sender;
   }
   sender = GNUNET_new (struct SenderAddress);
+  sender->key = sender_key;
   sender->target = *target;
   sender->address = GNUNET_memdup (address, address_len);
   sender->address_len = address_len;
-  (void) GNUNET_CONTAINER_multipeermap_put (
+  (void) GNUNET_CONTAINER_multihashmap_put (
     senders,
-    &sender->target,
+    &sender->key,
     sender,
     GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
   GNUNET_STATISTICS_set (stats,
                          "# senders active",
-                         GNUNET_CONTAINER_multipeermap_size (receivers),
+                         GNUNET_CONTAINER_multihashmap_size (receivers),
                          GNUNET_NO);
   sender->timeout =
     GNUNET_TIME_relative_to_absolute 
(GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
@@ -2034,7 +2020,7 @@ sock_read (void *cls)
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                   "Failed to recv from %s family %d failed sock %p\n",
                   GNUNET_a2s ((struct sockaddr*) &sa,
-                              sizeof (addr)),
+                              sizeof (*addr)),
                   addr->sa_family,
                   udp_sock);
       GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "recv");
@@ -2863,6 +2849,8 @@ static int
 mq_init (void *cls, const struct GNUNET_PeerIdentity *peer, const char 
*address)
 {
   struct ReceiverAddress *receiver;
+  struct GNUNET_HashContext *hsh;
+  struct GNUNET_HashCode receiver_key;
   const char *path;
   struct sockaddr *in;
   socklen_t in_len;
@@ -2877,14 +2865,29 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity 
*peer, const char *address)
   path = &address[strlen (COMMUNICATOR_ADDRESS_PREFIX "-")];
   in = udp_address_to_sockaddr (path, &in_len);
 
+  hsh = GNUNET_CRYPTO_hash_context_start ();
+  GNUNET_CRYPTO_hash_context_read (hsh, in, in_len);
+  GNUNET_CRYPTO_hash_context_read (hsh, peer, sizeof(*peer));
+  GNUNET_CRYPTO_hash_context_finish (hsh, &receiver_key);
+
+  receiver = GNUNET_CONTAINER_multihashmap_get (receivers, &receiver_key);
+  if (NULL != receiver)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "receiver %s already exist or is begin connected to\n",
+                address);
+    return GNUNET_SYSERR;
+  }
+
   receiver = GNUNET_new (struct ReceiverAddress);
+  receiver->key = receiver_key;
   receiver->address = in;
   receiver->address_len = in_len;
   receiver->target = *peer;
   receiver->nt = GNUNET_NT_scanner_get_type (is, in, in_len);
-  (void) GNUNET_CONTAINER_multipeermap_put (
+  (void) GNUNET_CONTAINER_multihashmap_put (
     receivers,
-    &receiver->target,
+    &receiver->key,
     receiver,
     GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -2897,7 +2900,7 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity 
*peer, const char *address)
                                                receiver->timeout.abs_value_us);
   GNUNET_STATISTICS_set (stats,
                          "# receivers active",
-                         GNUNET_CONTAINER_multipeermap_size (receivers),
+                         GNUNET_CONTAINER_multihashmap_size (receivers),
                          GNUNET_NO);
   receiver->foreign_addr =
     sockaddr_to_udpaddr_string (receiver->address, receiver->address_len);
@@ -2918,7 +2921,7 @@ mq_init (void *cls, const struct GNUNET_PeerIdentity 
*peer, const char *address)
  */
 static int
 get_receiver_delete_it (void *cls,
-                        const struct GNUNET_PeerIdentity *target,
+                        const struct GNUNET_HashCode *target,
                         void *value)
 {
   struct ReceiverAddress *receiver = value;
@@ -2940,7 +2943,7 @@ get_receiver_delete_it (void *cls,
  */
 static int
 get_sender_delete_it (void *cls,
-                      const struct GNUNET_PeerIdentity *target,
+                      const struct GNUNET_HashCode *target,
                       void *value)
 {
   struct SenderAddress *sender = value;
@@ -2992,14 +2995,14 @@ do_shutdown (void *cls)
                   GNUNET_NETWORK_socket_close (udp_sock));
     udp_sock = NULL;
   }
-  GNUNET_CONTAINER_multipeermap_iterate (receivers,
+  GNUNET_CONTAINER_multihashmap_iterate (receivers,
                                          &get_receiver_delete_it,
                                          NULL);
-  GNUNET_CONTAINER_multipeermap_destroy (receivers);
-  GNUNET_CONTAINER_multipeermap_iterate (senders,
+  GNUNET_CONTAINER_multihashmap_destroy (receivers);
+  GNUNET_CONTAINER_multihashmap_iterate (senders,
                                          &get_sender_delete_it,
                                          NULL);
-  GNUNET_CONTAINER_multipeermap_destroy (senders);
+  GNUNET_CONTAINER_multihashmap_destroy (senders);
   GNUNET_CONTAINER_multishortmap_destroy (key_cache);
   GNUNET_CONTAINER_heap_destroy (senders_heap);
   GNUNET_CONTAINER_heap_destroy (receivers_heap);
@@ -3038,6 +3041,27 @@ do_shutdown (void *cls)
 }
 
 
+struct AckInfo
+{
+  const struct UDPAck *ack;
+
+  const struct GNUNET_PeerIdentity *sender;
+};
+
+static int
+handle_ack_by_sender (void *cls, const struct GNUNET_HashCode *key, void 
*value)
+{
+  struct ReceiverAddress *receiver = value;
+  struct AckInfo *ai = cls;
+
+  if (0 != GNUNET_memcmp(ai->sender, &receiver->target))
+  {
+    return GNUNET_YES;
+  }
+  handle_ack((void*) ai->ack, key, receiver);
+  return GNUNET_YES;
+}
+
 /**
  * Function called when the transport service has received a
  * backchannel message for this communicator (!) via a different return
@@ -3052,7 +3076,7 @@ enc_notify_cb (void *cls,
                const struct GNUNET_PeerIdentity *sender,
                const struct GNUNET_MessageHeader *msg)
 {
-  const struct UDPAck *ack;
+  struct AckInfo ai;
 
   (void) cls;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -3064,11 +3088,11 @@ enc_notify_cb (void *cls,
     GNUNET_break_op (0);
     return;
   }
-  ack = (const struct UDPAck *) msg;
-  GNUNET_CONTAINER_multipeermap_get_multiple (receivers,
-                                              sender,
-                                              &handle_ack,
-                                              (void *) ack);
+  ai.ack = (const struct UDPAck *) msg;
+  ai.sender = sender;
+  GNUNET_CONTAINER_multihashmap_iterate (receivers,
+                                         &handle_ack_by_sender,
+                                         &ai);
 }
 
 
@@ -3493,8 +3517,8 @@ run (void *cls,
     my_port = 0;
   }
   stats = GNUNET_STATISTICS_create ("communicator-udp", cfg);
-  senders = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_YES);
-  receivers = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_YES);
+  senders = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_YES);
+  receivers = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_YES);
   senders_heap = GNUNET_CONTAINER_heap_create 
(GNUNET_CONTAINER_HEAP_ORDER_MIN);
   receivers_heap =
     GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);

-- 
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]