aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-communicator-udp.c
diff options
context:
space:
mode:
authorMartin Schanzenbach <schanzen@gnunet.org>2023-07-28 23:09:21 +0200
committerMartin Schanzenbach <schanzen@gnunet.org>2023-07-28 23:09:21 +0200
commitaa2c53087ae6eab738a93abfa8401be03ad923d7 (patch)
treefe6f573c967415edeccb132d7ddfa5376100285f /src/transport/gnunet-communicator-udp.c
parentd9d1e7b861aae0c5f72152faa41da0a7feabc6f0 (diff)
downloadgnunet-aa2c53087ae6eab738a93abfa8401be03ad923d7.tar.gz
gnunet-aa2c53087ae6eab738a93abfa8401be03ad923d7.zip
TNG: Various fixed in UDP communicator to enable UDPBox usage.
Diffstat (limited to 'src/transport/gnunet-communicator-udp.c')
-rw-r--r--src/transport/gnunet-communicator-udp.c79
1 files changed, 43 insertions, 36 deletions
diff --git a/src/transport/gnunet-communicator-udp.c b/src/transport/gnunet-communicator-udp.c
index c100194af..5a6d8f1f9 100644
--- a/src/transport/gnunet-communicator-udp.c
+++ b/src/transport/gnunet-communicator-udp.c
@@ -93,7 +93,7 @@
93 */ 93 */
94#define GCM_TAG_SIZE (128 / 8) 94#define GCM_TAG_SIZE (128 / 8)
95 95
96#define GENERATE_AT_ONCE 2 96#define GENERATE_AT_ONCE 100
97 97
98/** 98/**
99 * If we fall below this number of available KCNs, 99 * If we fall below this number of available KCNs,
@@ -1605,7 +1605,7 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
1605 "%u > %u (%u %u) for rekey secrect %s\n", allowed, 1605 "%u > %u (%u %u) for rekey secrect %s\n", allowed,
1606 receiver->ss_rekey->sequence_allowed, 1606 receiver->ss_rekey->sequence_allowed,
1607 receiver->acks_available, 1607 receiver->acks_available,
1608 ack->acks_available, 1608 ntohl (ack->acks_available),
1609 GNUNET_h2s (&receiver->ss_rekey->master)); 1609 GNUNET_h2s (&receiver->ss_rekey->master));
1610 1610
1611 receiver->ss_rekey->sequence_allowed = allowed; 1611 receiver->ss_rekey->sequence_allowed = allowed;
@@ -1631,10 +1631,10 @@ handle_ack (void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
1631 if (allowed > ss->sequence_allowed) 1631 if (allowed > ss->sequence_allowed)
1632 { 1632 {
1633 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1633 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1634 "%u > %u (%u %u) for secrect %s\n", allowed, 1634 "%u > %u (%u %u) for secret %s\n", allowed,
1635 ss->sequence_allowed, 1635 ss->sequence_allowed,
1636 receiver->acks_available, 1636 receiver->acks_available,
1637 ack->acks_available, 1637 ntohl (ack->acks_available),
1638 GNUNET_h2s (&ss->master)); 1638 GNUNET_h2s (&ss->master));
1639 acks_to_add = (allowed - ss->sequence_allowed); 1639 acks_to_add = (allowed - ss->sequence_allowed);
1640 if ((GNUNET_NO == receiver->rekeying) && 1640 if ((GNUNET_NO == receiver->rekeying) &&
@@ -1742,7 +1742,8 @@ kce_generate_cb (void *cls)
1742 { 1742 {
1743 1743
1744 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1744 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1745 "Precomputing keys for master %s\n", 1745 "Precomputing %u keys for master %s\n",
1746 GENERATE_AT_ONCE,
1746 GNUNET_h2s (&(ss->master))); 1747 GNUNET_h2s (&(ss->master)));
1747 1748
1748 for (int i = 0; i < GENERATE_AT_ONCE; i++) 1749 for (int i = 0; i < GENERATE_AT_ONCE; i++)
@@ -1862,10 +1863,11 @@ consider_ss_ack (struct SharedSecret *ss, int initial)
1862 ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK); 1863 ack.header.type = htons (GNUNET_MESSAGE_TYPE_COMMUNICATOR_UDP_ACK);
1863 ack.header.size = htons (sizeof(ack)); 1864 ack.header.size = htons (sizeof(ack));
1864 ack.sequence_max = htonl (ss_tell->sequence_allowed); 1865 ack.sequence_max = htonl (ss_tell->sequence_allowed);
1865 ack.acks_available = ss->sender->acks_available; 1866 ack.acks_available = htonl (ss->sender->acks_available);
1866 ack.cmac = ss_tell->cmac; 1867 ack.cmac = ss_tell->cmac;
1867 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1868 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1868 "Notifying transport of UDPAck %s with initial %u and master %s\n", 1869 "Notifying transport of %u acks with UDPAck %s and initial %u and master %s\n",
1870 ack.acks_available,
1869 GNUNET_i2s_full (&ss_tell->sender->target), 1871 GNUNET_i2s_full (&ss_tell->sender->target),
1870 initial, 1872 initial,
1871 GNUNET_h2s (&(ss_tell->master))); 1873 GNUNET_h2s (&(ss_tell->master)));
@@ -1879,17 +1881,20 @@ consider_ss_ack (struct SharedSecret *ss, int initial)
1879 ss->sender->kce_task_finished = GNUNET_NO; 1881 ss->sender->kce_task_finished = GNUNET_NO;
1880 } 1882 }
1881 } 1883 }
1882 else if ((NULL == kce_task) && ((KCN_THRESHOLD > 1884 else if ((NULL == ss->sender->kce_task) && ((KCN_THRESHOLD >
1883 ss->sender->acks_available) || 1885 ss->sender->acks_available) ||
1884 (GNUNET_YES == ss->sender->rekeying) || 1886 (GNUNET_YES ==
1885 (ss->sender->num_secrets > MAX_SECRETS) )) 1887 ss->sender->rekeying) ||
1888 (ss->sender->num_secrets >
1889 MAX_SECRETS) ))
1886 { 1890 {
1887 1891
1888 // 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. 1892 // 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.
1889 kce_task = GNUNET_SCHEDULER_add_delayed (WORKING_QUEUE_INTERVALL, 1893 ss->sender->kce_task = GNUNET_SCHEDULER_add_delayed (
1890 kce_generate_cb, 1894 WORKING_QUEUE_INTERVALL,
1891 ss); 1895 kce_generate_cb,
1892 kce_task_finished = GNUNET_NO; 1896 ss);
1897 ss->sender->kce_task_finished = GNUNET_NO;
1893 1898
1894 } 1899 }
1895 else if ((NULL == kce_task_rekey) && (GNUNET_YES == 1900 else if ((NULL == kce_task_rekey) && (GNUNET_YES ==
@@ -1953,7 +1958,7 @@ decrypt_box (const struct UDPBox *box,
1953 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1958 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1954 "Receiver stopped rekeying.\n"); 1959 "Receiver stopped rekeying.\n");
1955 } 1960 }
1956 else 1961 else if (GNUNET_YES == rekeying)
1957 { 1962 {
1958 ss->sender->rekeying = GNUNET_YES; 1963 ss->sender->rekeying = GNUNET_YES;
1959 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1964 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -2270,6 +2275,9 @@ sock_read (void *cls)
2270 kce = GNUNET_CONTAINER_multishortmap_get (key_cache, &box->kid); 2275 kce = GNUNET_CONTAINER_multishortmap_get (key_cache, &box->kid);
2271 if (NULL != kce) 2276 if (NULL != kce)
2272 { 2277 {
2278 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2279 "Found KCE with kid %s\n",
2280 GNUNET_sh2s (&box->kid));
2273 decrypt_box (box, (size_t) rcvd, kce); 2281 decrypt_box (box, (size_t) rcvd, kce);
2274 continue; 2282 continue;
2275 } 2283 }
@@ -2755,22 +2763,7 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct SharedSecret *ss)
2755 2763
2756 char rekey_dgram[sizeof(struct UDPRekey) + receiver->d_mtu]; 2764 char rekey_dgram[sizeof(struct UDPRekey) + receiver->d_mtu];
2757 2765
2758 if (NULL != receiver->ss_rekey) 2766 if (NULL == receiver->ss_rekey)
2759 {
2760 not_below = (receiver->rekey_acks_available
2761 - (receiver->rekey_acks_available % 3)) / 3;
2762 is_ss_rekey_sequence_allowed_zero = (0 ==
2763 receiver->ss_rekey->sequence_allowed);
2764 is_acks_available_below = (receiver->acks_available >= not_below);
2765 send_rekey = (0 == (receiver->acks_available - not_below) % not_below) &&
2766 is_acks_available_below && is_ss_rekey_sequence_allowed_zero;
2767 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2768 "send_rekey: %u, %u, %u\n",
2769 send_rekey,
2770 receiver->rekey_acks_available,
2771 receiver->acks_available);
2772 }
2773 else if (NULL == receiver->ss_rekey)
2774 { 2767 {
2775 /* setup key material */ 2768 /* setup key material */
2776 receiver->ss_rekey = setup_shared_secret_ephemeral (&ephemeral_pubkey, 2769 receiver->ss_rekey = setup_shared_secret_ephemeral (&ephemeral_pubkey,
@@ -2783,6 +2776,18 @@ send_UDPRekey (struct ReceiverAddress *receiver, struct SharedSecret *ss)
2783 "Setup secret with master %s.\n", 2776 "Setup secret with master %s.\n",
2784 GNUNET_h2s (&(receiver->ss_rekey->master))); 2777 GNUNET_h2s (&(receiver->ss_rekey->master)));
2785 } 2778 }
2779 not_below = (receiver->rekey_acks_available
2780 - (receiver->rekey_acks_available % 3)) / 3;
2781 is_ss_rekey_sequence_allowed_zero = (0 ==
2782 receiver->ss_rekey->sequence_allowed);
2783 is_acks_available_below = (receiver->acks_available >= not_below);
2784 send_rekey = (0 == (receiver->acks_available - not_below) % not_below) &&
2785 is_acks_available_below && is_ss_rekey_sequence_allowed_zero;
2786 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2787 "send_rekey: %u, %u, %u\n",
2788 send_rekey,
2789 receiver->rekey_acks_available,
2790 receiver->acks_available);
2786 2791
2787 if (send_rekey) 2792 if (send_rekey)
2788 { 2793 {
@@ -2952,10 +2957,12 @@ mq_send_d (struct GNUNET_MQ_Handle *mq,
2952 sequence_allowed) ) 2957 sequence_allowed) )
2953 add_acks_rekey (receiver); 2958 add_acks_rekey (receiver);
2954 } 2959 }
2955 } 2960 else
2956 else if ((GNUNET_YES == receiver->rekeying) ) 2961 {
2957 { 2962 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2958 send_UDPRekey (receiver, ss); 2963 "rekeying\n");
2964 send_UDPRekey (receiver, ss);
2965 }
2959 } 2966 }
2960 2967
2961 return; 2968 return;