commit aa2c53087ae6eab738a93abfa8401be03ad923d7
parent d9d1e7b861aae0c5f72152faa41da0a7feabc6f0
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Fri, 28 Jul 2023 23:09:21 +0200
TNG: Various fixed in UDP communicator to enable UDPBox usage.
Diffstat:
4 files changed, 46 insertions(+), 39 deletions(-)
diff --git a/src/transport/gnunet-communicator-udp.c b/src/transport/gnunet-communicator-udp.c
@@ -93,7 +93,7 @@
*/
#define GCM_TAG_SIZE (128 / 8)
-#define GENERATE_AT_ONCE 2
+#define GENERATE_AT_ONCE 100
/**
* If we fall below this number of available KCNs,
@@ -1605,7 +1605,7 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
"%u > %u (%u %u) for rekey secrect %s\n", allowed,
receiver->ss_rekey->sequence_allowed,
receiver->acks_available,
- ack->acks_available,
+ ntohl (ack->acks_available),
GNUNET_h2s (&receiver->ss_rekey->master));
receiver->ss_rekey->sequence_allowed = allowed;
@@ -1631,10 +1631,10 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
if (allowed > ss->sequence_allowed)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "%u > %u (%u %u) for secrect %s\n", allowed,
+ "%u > %u (%u %u) for secret %s\n", allowed,
ss->sequence_allowed,
receiver->acks_available,
- ack->acks_available,
+ ntohl (ack->acks_available),
GNUNET_h2s (&ss->master));
acks_to_add = (allowed - ss->sequence_allowed);
if ((GNUNET_NO == receiver->rekeying) &&
@@ -1742,7 +1742,8 @@ kce_generate_cb (void *cls)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Precomputing keys for master %s\n",
+ "Precomputing %u keys for master %s\n",
+ GENERATE_AT_ONCE,
GNUNET_h2s (&(ss->master)));
for (int i = 0; i < GENERATE_AT_ONCE; i++)
@@ -1862,10 +1863,11 @@ consider_ss_ack (struct SharedSecret *ss, int initial)
ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK);
ack.header.size = htons (sizeof(ack));
ack.sequence_max = htonl (ss_tell->sequence_allowed);
- ack.acks_available = ss->sender->acks_available;
+ ack.acks_available = htonl (ss->sender->acks_available);
ack.cmac = ss_tell->cmac;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Notifying transport of UDPAck %s with initial %u and master %s\n",
+ "Notifying transport of %u acks with UDPAck %s and initial %u and master %s\n",
+ ack.acks_available,
GNUNET_i2s_full (&ss_tell->sender->target),
initial,
GNUNET_h2s (&(ss_tell->master)));
@@ -1879,17 +1881,20 @@ consider_ss_ack (struct SharedSecret *ss, int initial)
ss->sender->kce_task_finished = GNUNET_NO;
}
}
- else if ((NULL == kce_task) && ((KCN_THRESHOLD >
- ss->sender->acks_available) ||
- (GNUNET_YES == ss->sender->rekeying) ||
- (ss->sender->num_secrets > MAX_SECRETS) ))
+ else if ((NULL == ss->sender->kce_task) && ((KCN_THRESHOLD >
+ ss->sender->acks_available) ||
+ (GNUNET_YES ==
+ ss->sender->rekeying) ||
+ (ss->sender->num_secrets >
+ MAX_SECRETS) ))
{
// TODO This task must be per sender! FIXME: This is a nice todo, but I do not know what must be done here to fix.
- kce_task = GNUNET_SCHEDULER_add_delayed (WORKING_QUEUE_INTERVALL,
- kce_generate_cb,
- ss);
- kce_task_finished = GNUNET_NO;
+ ss->sender->kce_task = GNUNET_SCHEDULER_add_delayed (
+ WORKING_QUEUE_INTERVALL,
+ kce_generate_cb,
+ ss);
+ ss->sender->kce_task_finished = GNUNET_NO;
}
else if ((NULL == kce_task_rekey) && (GNUNET_YES ==
@@ -1953,7 +1958,7 @@ decrypt_box (const struct UDPBox *box,
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Receiver stopped rekeying.\n");
}
- else
+ else if (GNUNET_YES == rekeying)
{
ss->sender->rekeying = GNUNET_YES;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -2270,6 +2275,9 @@ sock_read (void *cls)
kce = GNUNET_CONTAINER_multishortmap_get (key_cache, &box->kid);
if (NULL != kce)
{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Found KCE with kid %s\n",
+ GNUNET_sh2s (&box->kid));
decrypt_box (box, (size_t) rcvd, kce);
continue;
}
@@ -2755,22 +2763,7 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct SharedSecret *ss)
char rekey_dgram[sizeof(struct UDPRekey) + receiver->d_mtu];
- if (NULL != receiver->ss_rekey)
- {
- not_below = (receiver->rekey_acks_available
- - (receiver->rekey_acks_available % 3)) / 3;
- is_ss_rekey_sequence_allowed_zero = (0 ==
- receiver->ss_rekey->sequence_allowed);
- is_acks_available_below = (receiver->acks_available >= not_below);
- send_rekey = (0 == (receiver->acks_available - not_below) % not_below) &&
- is_acks_available_below && is_ss_rekey_sequence_allowed_zero;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "send_rekey: %u, %u, %u\n",
- send_rekey,
- receiver->rekey_acks_available,
- receiver->acks_available);
- }
- else if (NULL == receiver->ss_rekey)
+ if (NULL == receiver->ss_rekey)
{
/* setup key material */
receiver->ss_rekey = setup_shared_secret_ephemeral (&ephemeral_pubkey,
@@ -2783,6 +2776,18 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct SharedSecret *ss)
"Setup secret with master %s.\n",
GNUNET_h2s (&(receiver->ss_rekey->master)));
}
+ not_below = (receiver->rekey_acks_available
+ - (receiver->rekey_acks_available % 3)) / 3;
+ is_ss_rekey_sequence_allowed_zero = (0 ==
+ receiver->ss_rekey->sequence_allowed);
+ is_acks_available_below = (receiver->acks_available >= not_below);
+ send_rekey = (0 == (receiver->acks_available - not_below) % not_below) &&
+ is_acks_available_below && is_ss_rekey_sequence_allowed_zero;
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "send_rekey: %u, %u, %u\n",
+ send_rekey,
+ receiver->rekey_acks_available,
+ receiver->acks_available);
if (send_rekey)
{
@@ -2952,10 +2957,12 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
sequence_allowed) )
add_acks_rekey (receiver);
}
- }
- else if ((GNUNET_YES == receiver->rekeying) )
- {
- send_UDPRekey (receiver, ss);
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "rekeying\n");
+ send_UDPRekey (receiver, ss);
+ }
}
return;
diff --git a/src/transport/test_communicator_basic.c b/src/transport/test_communicator_basic.c
@@ -91,7 +91,7 @@ static struct GNUNET_STATISTICS_GetHandle *rekey_stats[NUM_PEERS];
#define ALLOWED_PACKET_LOSS 91
-#define BURST_PACKETS 5000
+#define BURST_PACKETS 15000
#define TOTAL_ITERATIONS 1
diff --git a/src/transport/test_communicator_udp_rekey_peer1.conf b/src/transport/test_communicator_udp_rekey_peer1.conf
@@ -45,7 +45,7 @@ REKEY_INTERVAL = 100ms
BINDTO = 60002
DISABLE_V6 = YES
MAX_QUEUE_LENGTH=5000
-# REKEY_INTERVAL = 100ms
+REKEY_INTERVAL = 100ms
REKEY_MAX_BYTES=9MiB
[communicator-test]
diff --git a/src/transport/test_communicator_udp_rekey_peer2.conf b/src/transport/test_communicator_udp_rekey_peer2.conf
@@ -45,7 +45,7 @@ REKEY_INTERVAL = 100ms
BINDTO = 60003
DISABLE_V6 = YES
MAX_QUEUE_LENGTH=5000
-#REKEY_INTERVAL = 100ms
+REKEY_INTERVAL = 100ms
REKEY_MAX_BYTES=9MiB
[communicator-test]