diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/gnunet-service-core.c | 56 | ||||
-rw-r--r-- | src/core/gnunet-service-core_kx.c | 4 |
2 files changed, 54 insertions, 6 deletions
diff --git a/src/core/gnunet-service-core.c b/src/core/gnunet-service-core.c index 52c6f72ab..31b91f12f 100644 --- a/src/core/gnunet-service-core.c +++ b/src/core/gnunet-service-core.c | |||
@@ -32,11 +32,19 @@ | |||
32 | #include "gnunet-service-core_typemap.h" | 32 | #include "gnunet-service-core_typemap.h" |
33 | 33 | ||
34 | /** | 34 | /** |
35 | * How many messages do we queue up at most for optional | 35 | * How many messages do we queue up at most for any client? This can |
36 | * notifications to a client? (this can cause notifications | 36 | * cause messages to be dropped if clients do not process them fast |
37 | * about outgoing messages to be dropped). | 37 | * enough! Note that this is a soft limit; we try |
38 | * to keep a few larger messages above the limit. | ||
38 | */ | 39 | */ |
39 | #define MAX_NOTIFY_QUEUE 1024 | 40 | #define SOFT_MAX_QUEUE 128 |
41 | |||
42 | /** | ||
43 | * How many messages do we queue up at most for any client? This can | ||
44 | * cause messages to be dropped if clients do not process them fast | ||
45 | * enough! Note that this is the hard limit. | ||
46 | */ | ||
47 | #define HARD_MAX_QUEUE 256 | ||
40 | 48 | ||
41 | 49 | ||
42 | /** | 50 | /** |
@@ -819,6 +827,7 @@ GSC_CLIENTS_deliver_message (const struct GNUNET_PeerIdentity *sender, | |||
819 | struct GNUNET_MQ_Envelope *env; | 827 | struct GNUNET_MQ_Envelope *env; |
820 | struct NotifyTrafficMessage *ntm; | 828 | struct NotifyTrafficMessage *ntm; |
821 | uint16_t mtype; | 829 | uint16_t mtype; |
830 | unsigned int qlen; | ||
822 | int tm; | 831 | int tm; |
823 | 832 | ||
824 | tm = type_match (ntohs (msg->type), | 833 | tm = type_match (ntohs (msg->type), |
@@ -834,6 +843,45 @@ GSC_CLIENTS_deliver_message (const struct GNUNET_PeerIdentity *sender, | |||
834 | if ( (0 != (options & GNUNET_CORE_OPTION_SEND_HDR_OUTBOUND)) && | 843 | if ( (0 != (options & GNUNET_CORE_OPTION_SEND_HDR_OUTBOUND)) && |
835 | (0 != (c->options & GNUNET_CORE_OPTION_SEND_FULL_OUTBOUND)) ) | 844 | (0 != (c->options & GNUNET_CORE_OPTION_SEND_FULL_OUTBOUND)) ) |
836 | continue; | 845 | continue; |
846 | |||
847 | /* Drop messages if: | ||
848 | 1) We are above the hard limit, or | ||
849 | 2) We are above the soft limit, and a coin toss limited | ||
850 | to the message size (giving larger messages a | ||
851 | proportionally higher chance of being queued) falls | ||
852 | below the threshold. The threshold is based on where | ||
853 | we are between the soft and the hard limit, scaled | ||
854 | to match the range of message sizes we usually encounter | ||
855 | (i.e. up to 32k); so a 64k message has a 50% chance of | ||
856 | being kept if we are just barely below the hard max, | ||
857 | and a 99% chance of being kept if we are at the soft max. | ||
858 | The reason is to make it more likely to drop control traffic | ||
859 | (ACK, queries) which may be cummulative or highly redundant, | ||
860 | and cheap to drop than data traffic. */ | ||
861 | qlen = GNUNET_MQ_get_length (c->mq); | ||
862 | if ( (qlen >= HARD_MAX_QUEUE) || | ||
863 | ( (qlen > SOFT_MAX_QUEUE) && | ||
864 | ( (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, | ||
865 | ntohs (msg->size)) ) < | ||
866 | (qlen - SOFT_MAX_QUEUE) * 0x8000 / | ||
867 | (HARD_MAX_QUEUE - SOFT_MAX_QUEUE) ) ) ) | ||
868 | { | ||
869 | char buf[1024]; | ||
870 | |||
871 | GNUNET_log (GNUNET_ERROR_TYPE_INFO | GNUNET_ERROR_TYPE_BULK, | ||
872 | "Dropping decrypted message of type %u as client is too busy (queue full)\n", | ||
873 | (unsigned int) ntohs (msg->type)); | ||
874 | GNUNET_snprintf (buf, | ||
875 | sizeof (buf), | ||
876 | gettext_noop ("# messages of type %u discarded (client busy)"), | ||
877 | (unsigned int) ntohs (msg->type)); | ||
878 | GNUNET_STATISTICS_update (GSC_stats, | ||
879 | buf, | ||
880 | 1, | ||
881 | GNUNET_NO); | ||
882 | continue; | ||
883 | } | ||
884 | |||
837 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 885 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
838 | "Sending %u message with %u bytes to client interested in messages of type %u.\n", | 886 | "Sending %u message with %u bytes to client interested in messages of type %u.\n", |
839 | options, | 887 | options, |
diff --git a/src/core/gnunet-service-core_kx.c b/src/core/gnunet-service-core_kx.c index a0c343737..906898512 100644 --- a/src/core/gnunet-service-core_kx.c +++ b/src/core/gnunet-service-core_kx.c | |||
@@ -319,7 +319,7 @@ struct GSC_KeyExchangeInfo | |||
319 | * last were received (good for accepting out-of-order packets and | 319 | * last were received (good for accepting out-of-order packets and |
320 | * estimating reliability of the connection) | 320 | * estimating reliability of the connection) |
321 | */ | 321 | */ |
322 | unsigned int last_packets_bitmap; | 322 | uint32_t last_packets_bitmap; |
323 | 323 | ||
324 | /** | 324 | /** |
325 | * last sequence number received on this connection (highest) | 325 | * last sequence number received on this connection (highest) |
@@ -1573,7 +1573,7 @@ handle_encrypted (void *cls, | |||
1573 | } | 1573 | } |
1574 | if (kx->last_sequence_number_received > snum) | 1574 | if (kx->last_sequence_number_received > snum) |
1575 | { | 1575 | { |
1576 | unsigned int rotbit = 1 << (kx->last_sequence_number_received - snum - 1); | 1576 | uint32_t rotbit = 1U << (kx->last_sequence_number_received - snum - 1); |
1577 | 1577 | ||
1578 | if ((kx->last_packets_bitmap & rotbit) != 0) | 1578 | if ((kx->last_packets_bitmap & rotbit) != 0) |
1579 | { | 1579 | { |