diff options
author | Martin Schanzenbach <schanzen@gnunet.org> | 2023-07-28 23:09:21 +0200 |
---|---|---|
committer | Martin Schanzenbach <schanzen@gnunet.org> | 2023-07-28 23:09:21 +0200 |
commit | aa2c53087ae6eab738a93abfa8401be03ad923d7 (patch) | |
tree | fe6f573c967415edeccb132d7ddfa5376100285f /src/transport/gnunet-communicator-udp.c | |
parent | d9d1e7b861aae0c5f72152faa41da0a7feabc6f0 (diff) | |
download | gnunet-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.c | 79 |
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; |