aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2009-06-10 05:57:55 +0000
committerChristian Grothoff <christian@grothoff.org>2009-06-10 05:57:55 +0000
commitd5e4648c1a755af9d9b47d446e750d228ce66f99 (patch)
tree562a0b5f17ede06d961b113e951eef16d790c2bd /src
parent18bd5e0a920729f0baf414311130e0a92e775bbb (diff)
downloadgnunet-d5e4648c1a755af9d9b47d446e750d228ce66f99.tar.gz
gnunet-d5e4648c1a755af9d9b47d446e750d228ce66f99.zip
timeout code
Diffstat (limited to 'src')
-rw-r--r--src/core/core.h2
-rw-r--r--src/core/core_api.c4
-rw-r--r--src/core/gnunet-service-core.c223
-rw-r--r--src/core/test_core_api.c2
-rw-r--r--src/include/Makefile.am1
-rw-r--r--src/include/gnunet_constants.h60
-rw-r--r--src/include/gnunet_core_service.h4
-rw-r--r--src/transport/gnunet-service-transport.c55
-rw-r--r--src/transport/transport_api.c2
9 files changed, 267 insertions, 86 deletions
diff --git a/src/core/core.h b/src/core/core.h
index fe8bcf9cc..ebdac0aaa 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -198,7 +198,7 @@ struct RequestConfigureMessage
198 * the specified amont. The traffic preference is used to determine 198 * the specified amont. The traffic preference is used to determine
199 * the share of bandwidth this peer will typcially be assigned. 199 * the share of bandwidth this peer will typcially be assigned.
200 */ 200 */
201 double preference_change GNUNET_PACKED; 201 uint64_t preference_change GNUNET_PACKED;
202 202
203 /** 203 /**
204 * Identity of the peer being configured. 204 * Identity of the peer being configured.
diff --git a/src/core/core_api.c b/src/core/core_api.c
index 02379e36e..931ffe97e 100644
--- a/src/core/core_api.c
+++ b/src/core/core_api.c
@@ -904,7 +904,7 @@ GNUNET_CORE_peer_configure (struct GNUNET_CORE_Handle *handle,
904 struct GNUNET_TIME_Relative timeout, 904 struct GNUNET_TIME_Relative timeout,
905 unsigned int bpm_out, 905 unsigned int bpm_out,
906 int amount, 906 int amount,
907 double preference, 907 unsigned long long preference,
908 GNUNET_CORE_PeerConfigurationInfoCallback info, 908 GNUNET_CORE_PeerConfigurationInfoCallback info,
909 void *info_cls) 909 void *info_cls)
910{ 910{
@@ -938,7 +938,7 @@ GNUNET_CORE_peer_configure (struct GNUNET_CORE_Handle *handle,
938 rcm->reserved = htonl (0); 938 rcm->reserved = htonl (0);
939 rcm->limit_outbound_bpm = htonl (bpm_out); 939 rcm->limit_outbound_bpm = htonl (bpm_out);
940 rcm->reserve_inbound = htonl (amount); 940 rcm->reserve_inbound = htonl (amount);
941 rcm->preference_change = preference; 941 rcm->preference_change = GNUNET_htonll(preference);
942 rcm->peer = *peer; 942 rcm->peer = *peer;
943 if (handle->pending_head == th) 943 if (handle->pending_head == th)
944 trigger_next_request (handle); 944 trigger_next_request (handle);
diff --git a/src/core/gnunet-service-core.c b/src/core/gnunet-service-core.c
index 5996a81bf..0d714be3f 100644
--- a/src/core/gnunet-service-core.c
+++ b/src/core/gnunet-service-core.c
@@ -25,11 +25,7 @@
25 * 25 *
26 * POST-TESTING: 26 * POST-TESTING:
27 * - revisit API (which arguments are used, needed)? 27 * - revisit API (which arguments are used, needed)?
28 * - add code to re-transmit key if first attempt failed 28 * - add code to send PINGs if we are about to time-out otherwise (?)
29 * + timeout on connect / key exchange, etc.
30 * + timeout for automatic re-try, etc.
31 * - add code to give up re-transmission of key if many attempts fail
32 * - add code to send PINGs if we are about to time-out otherwise
33 * ? add heuristic to do another send_key in "handle_set_key" 29 * ? add heuristic to do another send_key in "handle_set_key"
34 * in case previous attempt failed / didn't work / persist 30 * in case previous attempt failed / didn't work / persist
35 * (but don't do it always to avoid storm of SET_KEY's going 31 * (but don't do it always to avoid storm of SET_KEY's going
@@ -47,6 +43,7 @@
47 * could ideally be changed to O(1) hash map lookups) 43 * could ideally be changed to O(1) hash map lookups)
48 */ 44 */
49#include "platform.h" 45#include "platform.h"
46#include "gnunet_constants.h"
50#include "gnunet_util_lib.h" 47#include "gnunet_util_lib.h"
51#include "gnunet_hello_lib.h" 48#include "gnunet_hello_lib.h"
52#include "gnunet_peerinfo_service.h" 49#include "gnunet_peerinfo_service.h"
@@ -63,14 +60,18 @@
63 */ 60 */
64#define MAX_WINDOW_TIME (5 * 60 * 1000) 61#define MAX_WINDOW_TIME (5 * 60 * 1000)
65 62
66
67/** 63/**
68 * Amount of bytes per minute (in/out) to assume initially 64 * Minimum of bytes per minute (out) to assign to any connected peer.
69 * (before either peer has communicated any particular 65 * Should be rather low; values larger than DEFAULT_BPM_IN_OUT make no
70 * preference). Should be rather low. 66 * sense.
71 */ 67 */
72#define DEFAULT_BPM_IN_OUT 2048 68#define MIN_BPM_PER_PEER GNUNET_CONSTANTS_DEFAULT_BPM_IN_OUT
73 69
70/**
71 * What is the smallest change (in number of bytes per minute)
72 * that we consider significant enough to bother triggering?
73 */
74#define MIN_BPM_CHANGE 32
74 75
75/** 76/**
76 * After how much time past the "official" expiration time do 77 * After how much time past the "official" expiration time do
@@ -81,61 +82,56 @@
81 */ 82 */
82#define PAST_EXPIRATION_DISCARD_TIME GNUNET_TIME_UNIT_SECONDS 83#define PAST_EXPIRATION_DISCARD_TIME GNUNET_TIME_UNIT_SECONDS
83 84
84
85/** 85/**
86 * What is the maximum delay for a SET_KEY message? 86 * What is the maximum delay for a SET_KEY message?
87 */ 87 */
88#define MAX_SET_KEY_DELAY GNUNET_TIME_UNIT_SECONDS 88#define MAX_SET_KEY_DELAY GNUNET_TIME_UNIT_SECONDS
89 89
90
91/** 90/**
92 * What how long do we wait for SET_KEY confirmation initially? 91 * What how long do we wait for SET_KEY confirmation initially?
93 */ 92 */
94#define INITIAL_SET_KEY_RETRY_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3) 93#define INITIAL_SET_KEY_RETRY_FREQUENCY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3)
95 94
96
97/** 95/**
98 * What is the maximum delay for a PING message? 96 * What is the maximum delay for a PING message?
99 */ 97 */
100#define MAX_PING_DELAY GNUNET_TIME_UNIT_SECONDS 98#define MAX_PING_DELAY GNUNET_TIME_UNIT_SECONDS
101 99
102
103/** 100/**
104 * What is the maximum delay for a PONG message? 101 * What is the maximum delay for a PONG message?
105 */ 102 */
106#define MAX_PONG_DELAY GNUNET_TIME_UNIT_SECONDS 103#define MAX_PONG_DELAY GNUNET_TIME_UNIT_SECONDS
107 104
105/**
106 * How often do we recalculate bandwidth quotas?
107 */
108#define QUOTA_UPDATE_FREQUENCY GNUNET_TIME_UNIT_SECONDS
108 109
109/** 110/**
110 * What is the priority for a SET_KEY message? 111 * What is the priority for a SET_KEY message?
111 */ 112 */
112#define SET_KEY_PRIORITY 0xFFFFFF 113#define SET_KEY_PRIORITY 0xFFFFFF
113 114
114
115/** 115/**
116 * What is the priority for a PING message? 116 * What is the priority for a PING message?
117 */ 117 */
118#define PING_PRIORITY 0xFFFFFF 118#define PING_PRIORITY 0xFFFFFF
119 119
120
121/** 120/**
122 * What is the priority for a PONG message? 121 * What is the priority for a PONG message?
123 */ 122 */
124#define PONG_PRIORITY 0xFFFFFF 123#define PONG_PRIORITY 0xFFFFFF
125 124
126
127/** 125/**
128 * How many messages do we queue per peer at most? 126 * How many messages do we queue per peer at most?
129 */ 127 */
130#define MAX_PEER_QUEUE_SIZE 16 128#define MAX_PEER_QUEUE_SIZE 16
131 129
132
133/** 130/**
134 * How many non-mandatory messages do we queue per client at most? 131 * How many non-mandatory messages do we queue per client at most?
135 */ 132 */
136#define MAX_CLIENT_QUEUE_SIZE 32 133#define MAX_CLIENT_QUEUE_SIZE 32
137 134
138
139/** 135/**
140 * What is the maximum age of a message for us to consider 136 * What is the maximum age of a message for us to consider
141 * processing it? Note that this looks at the timestamp used 137 * processing it? Note that this looks at the timestamp used
@@ -146,7 +142,6 @@
146 */ 142 */
147#define MAX_MESSAGE_AGE GNUNET_TIME_UNIT_DAYS 143#define MAX_MESSAGE_AGE GNUNET_TIME_UNIT_DAYS
148 144
149
150/** 145/**
151 * What is the maximum size for encrypted messages? Note that this 146 * What is the maximum size for encrypted messages? Note that this
152 * number imposes a clear limit on the maximum size of any message. 147 * number imposes a clear limit on the maximum size of any message.
@@ -179,6 +174,7 @@ enum PeerStateMachine
179 */ 174 */
180#define ENCRYPTED_HEADER_SIZE (sizeof(struct GNUNET_MessageHeader) + sizeof(uint32_t) + sizeof(GNUNET_HashCode)) 175#define ENCRYPTED_HEADER_SIZE (sizeof(struct GNUNET_MessageHeader) + sizeof(uint32_t) + sizeof(GNUNET_HashCode))
181 176
177
182/** 178/**
183 * Encapsulation for encrypted messages exchanged between 179 * Encapsulation for encrypted messages exchanged between
184 * peers. Followed by the actual encrypted data. 180 * peers. Followed by the actual encrypted data.
@@ -403,6 +399,11 @@ struct Neighbour
403 GNUNET_SCHEDULER_TaskIdentifier retry_set_key_task; 399 GNUNET_SCHEDULER_TaskIdentifier retry_set_key_task;
404 400
405 /** 401 /**
402 * ID of task used for updating bandwidth quota for this neighbour.
403 */
404 GNUNET_SCHEDULER_TaskIdentifier quota_update_task;
405
406 /**
406 * At what time did we generate our encryption key? 407 * At what time did we generate our encryption key?
407 */ 408 */
408 struct GNUNET_TIME_Absolute encrypt_key_created; 409 struct GNUNET_TIME_Absolute encrypt_key_created;
@@ -430,7 +431,7 @@ struct Neighbour
430 struct GNUNET_TIME_Relative last_latency; 431 struct GNUNET_TIME_Relative last_latency;
431 432
432 /** 433 /**
433 * At what frequency are we currently re-trying SET KEY messages? 434 * At what frequency are we currently re-trying SET_KEY messages?
434 */ 435 */
435 struct GNUNET_TIME_Relative set_key_retry_frequency; 436 struct GNUNET_TIME_Relative set_key_retry_frequency;
436 437
@@ -465,7 +466,7 @@ struct Neighbour
465 /** 466 /**
466 * How valueable were the messages of this peer recently? 467 * How valueable were the messages of this peer recently?
467 */ 468 */
468 double current_preference; 469 unsigned long long current_preference;
469 470
470 /** 471 /**
471 * Bit map indicating which of the 32 sequence numbers before the last 472 * Bit map indicating which of the 32 sequence numbers before the last
@@ -501,7 +502,7 @@ struct Neighbour
501 502
502 /** 503 /**
503 * Internal bandwidth limit set for this peer (initially 504 * Internal bandwidth limit set for this peer (initially
504 * typcially set to "-1"). "bpm_out" is MAX of 505 * typically set to "-1"). "bpm_out" is MAX of
505 * "bpm_out_internal_limit" and "bpm_out_external_limit". 506 * "bpm_out_internal_limit" and "bpm_out_external_limit".
506 */ 507 */
507 uint32_t bpm_out_internal_limit; 508 uint32_t bpm_out_internal_limit;
@@ -641,14 +642,63 @@ static struct GNUNET_SERVER_Handle *server;
641static struct GNUNET_TRANSPORT_Handle *transport; 642static struct GNUNET_TRANSPORT_Handle *transport;
642 643
643/** 644/**
645 * Linked list of our clients.
646 */
647static struct Client *clients;
648
649/**
644 * We keep neighbours in a linked list (for now). 650 * We keep neighbours in a linked list (for now).
645 */ 651 */
646static struct Neighbour *neighbours; 652static struct Neighbour *neighbours;
647 653
648/** 654/**
649 * Linked list of our clients. 655 * Sum of all preferences among all neighbours.
650 */ 656 */
651static struct Client *clients; 657static unsigned long long preference_sum;
658
659/**
660 * Total number of neighbours we have.
661 */
662static unsigned int neighbour_count;
663
664/**
665 * How much inbound bandwidth are we supposed to be using?
666 */
667static unsigned long long bandwidth_target_in;
668
669/**
670 * How much outbound bandwidth are we supposed to be using?
671 */
672static unsigned long long bandwidth_target_out;
673
674
675
676/**
677 * A preference value for a neighbour was update. Update
678 * the preference sum accordingly.
679 *
680 * @param inc how much was a preference value increased?
681 */
682static void
683update_preference_sum (unsigned long long inc)
684{
685 struct Neighbour *n;
686 unsigned long long os;
687
688 os = preference_sum;
689 preference_sum += inc;
690 if (preference_sum >= os)
691 return; /* done! */
692 /* overflow! compensate by cutting all values in half! */
693 preference_sum = 0;
694 n = neighbours;
695 while (n != NULL)
696 {
697 n->current_preference /= 2;
698 preference_sum += n->current_preference;
699 n = n->next;
700 }
701}
652 702
653 703
654/** 704/**
@@ -1010,6 +1060,7 @@ handle_client_request_configure (void *cls,
1010 struct ConfigurationInfoMessage cim; 1060 struct ConfigurationInfoMessage cim;
1011 struct Client *c; 1061 struct Client *c;
1012 int reserv; 1062 int reserv;
1063 unsigned long long old_preference;
1013 1064
1014#if DEBUG_CORE_CLIENT 1065#if DEBUG_CORE_CLIENT
1015 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1066 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -1036,9 +1087,14 @@ handle_client_request_configure (void *cls,
1036 reserv = n->available_recv_window; 1087 reserv = n->available_recv_window;
1037 n->available_recv_window -= reserv; 1088 n->available_recv_window -= reserv;
1038 } 1089 }
1039 n->current_preference += rcm->preference_change; 1090 old_preference = n->current_preference;
1040 if (n->current_preference < 0) 1091 n->current_preference += GNUNET_ntohll(rcm->preference_change);
1041 n->current_preference = 0; 1092 if (old_preference > n->current_preference)
1093 {
1094 /* overflow; cap at maximum value */
1095 n->current_preference = (unsigned long long) -1;
1096 }
1097 update_preference_sum (n->current_preference - old_preference);
1042 cim.reserved_amount = htonl (reserv); 1098 cim.reserved_amount = htonl (reserv);
1043 cim.bpm_in = htonl (n->bpm_in); 1099 cim.bpm_in = htonl (n->bpm_in);
1044 cim.bpm_out = htonl (n->bpm_out); 1100 cim.bpm_out = htonl (n->bpm_out);
@@ -2800,6 +2856,87 @@ handle_transport_receive (void *cls,
2800 2856
2801 2857
2802/** 2858/**
2859 * Function that recalculates the bandwidth quota for the
2860 * given neighbour and transmits it to the transport service.
2861 *
2862 * @param cls neighbour for the quota update
2863 * @param tc context
2864 */
2865static void
2866neighbour_quota_update (void *cls,
2867 const struct GNUNET_SCHEDULER_TaskContext *tc);
2868
2869
2870/**
2871 * Schedule the task that will recalculate the bandwidth
2872 * quota for this peer (and possibly force a disconnect of
2873 * idle peers by calculating a bandwidth of zero).
2874 */
2875static void
2876schedule_quota_update (struct Neighbour *n)
2877{
2878 GNUNET_assert (n->quota_update_task ==
2879 GNUNET_SCHEDULER_NO_PREREQUISITE_TASK);
2880 n->quota_update_task
2881 = GNUNET_SCHEDULER_add_delayed (sched,
2882 GNUNET_NO,
2883 GNUNET_SCHEDULER_PRIORITY_IDLE,
2884 GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
2885 QUOTA_UPDATE_FREQUENCY,
2886 &neighbour_quota_update,
2887 n);
2888}
2889
2890
2891/**
2892 * Function that recalculates the bandwidth quota for the
2893 * given neighbour and transmits it to the transport service.
2894 *
2895 * @param cls neighbour for the quota update
2896 * @param tc context
2897 */
2898static void
2899neighbour_quota_update (void *cls,
2900 const struct GNUNET_SCHEDULER_TaskContext *tc)
2901{
2902 struct Neighbour *n = cls;
2903 uint32_t q_in;
2904 double pref_rel;
2905 double share;
2906 unsigned long long distributable;
2907
2908 n->quota_update_task = GNUNET_SCHEDULER_NO_PREREQUISITE_TASK;
2909 /* calculate relative preference among all neighbours;
2910 divides by a bit more to avoid division by zero AND to
2911 account for possibility of new neighbours joining any time
2912 AND to convert to double... */
2913 pref_rel = n->current_preference / (1.0 + preference_sum);
2914 share = 0;
2915 distributable = 0;
2916 if (bandwidth_target_out > neighbour_count * MIN_BPM_PER_PEER)
2917 distributable = bandwidth_target_out - neighbour_count * MIN_BPM_PER_PEER;
2918 share = distributable * pref_rel;
2919 q_in = MIN_BPM_PER_PEER + (unsigned long long) share;
2920 /* check if we want to disconnect for good due to inactivity */
2921 if ( (GNUNET_TIME_absolute_get_duration (n->last_activity).value > GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.value) &&
2922 (GNUNET_TIME_absolute_get_duration (n->time_established).value > GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.value) )
2923 q_in = 0; /* force disconnect */
2924 if ( (n->bpm_in + MIN_BPM_CHANGE < q_in) ||
2925 (n->bpm_in - MIN_BPM_CHANGE > q_in) )
2926 {
2927 n->bpm_in = q_in;
2928 GNUNET_TRANSPORT_set_quota (transport,
2929 &n->peer,
2930 n->bpm_in,
2931 n->bpm_out,
2932 GNUNET_TIME_UNIT_FOREVER_REL,
2933 NULL, NULL);
2934 }
2935 schedule_quota_update (n);
2936}
2937
2938
2939/**
2803 * Function called by transport to notify us that 2940 * Function called by transport to notify us that
2804 * a peer connected to us (on the network level). 2941 * a peer connected to us (on the network level).
2805 * 2942 *
@@ -2827,6 +2964,7 @@ handle_transport_notify_connect (void *cls,
2827 n = GNUNET_malloc (sizeof (struct Neighbour)); 2964 n = GNUNET_malloc (sizeof (struct Neighbour));
2828 n->next = neighbours; 2965 n->next = neighbours;
2829 neighbours = n; 2966 neighbours = n;
2967 neighbour_count++;
2830 n->peer = *peer; 2968 n->peer = *peer;
2831 n->last_latency = latency; 2969 n->last_latency = latency;
2832 GNUNET_CRYPTO_aes_create_session_key (&n->encrypt_key); 2970 GNUNET_CRYPTO_aes_create_session_key (&n->encrypt_key);
@@ -2834,10 +2972,10 @@ handle_transport_notify_connect (void *cls,
2834 n->set_key_retry_frequency = INITIAL_SET_KEY_RETRY_FREQUENCY; 2972 n->set_key_retry_frequency = INITIAL_SET_KEY_RETRY_FREQUENCY;
2835 n->last_asw_update = now; 2973 n->last_asw_update = now;
2836 n->last_arw_update = now; 2974 n->last_arw_update = now;
2837 n->bpm_in = DEFAULT_BPM_IN_OUT; 2975 n->bpm_in = GNUNET_CONSTANTS_DEFAULT_BPM_IN_OUT;
2838 n->bpm_out = DEFAULT_BPM_IN_OUT; 2976 n->bpm_out = GNUNET_CONSTANTS_DEFAULT_BPM_IN_OUT;
2839 n->bpm_out_internal_limit = (uint32_t) - 1; 2977 n->bpm_out_internal_limit = (uint32_t) - 1;
2840 n->bpm_out_external_limit = DEFAULT_BPM_IN_OUT; 2978 n->bpm_out_external_limit = GNUNET_CONSTANTS_DEFAULT_BPM_IN_OUT;
2841 n->ping_challenge = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 2979 n->ping_challenge = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
2842 (uint32_t) - 1); 2980 (uint32_t) - 1);
2843#if DEBUG_CORE 2981#if DEBUG_CORE
@@ -2845,9 +2983,10 @@ handle_transport_notify_connect (void *cls,
2845 "Received connection from `%4s'.\n", 2983 "Received connection from `%4s'.\n",
2846 GNUNET_i2s (&n->peer)); 2984 GNUNET_i2s (&n->peer));
2847#endif 2985#endif
2986 schedule_quota_update (n);
2848 cnm.header.size = htons (sizeof (struct ConnectNotifyMessage)); 2987 cnm.header.size = htons (sizeof (struct ConnectNotifyMessage));
2849 cnm.header.type = htons (GNUNET_MESSAGE_TYPE_CORE_NOTIFY_CONNECT); 2988 cnm.header.type = htons (GNUNET_MESSAGE_TYPE_CORE_NOTIFY_CONNECT);
2850 cnm.bpm_available = htonl (DEFAULT_BPM_IN_OUT); 2989 cnm.bpm_available = htonl (n->bpm_out);
2851 cnm.peer = *peer; 2990 cnm.peer = *peer;
2852 cnm.last_activity = GNUNET_TIME_absolute_hton (now); 2991 cnm.last_activity = GNUNET_TIME_absolute_hton (now);
2853 send_to_all_clients (&cnm.header, GNUNET_YES); 2992 send_to_all_clients (&cnm.header, GNUNET_YES);
@@ -2857,6 +2996,7 @@ handle_transport_notify_connect (void *cls,
2857/** 2996/**
2858 * Free the given entry for the neighbour (it has 2997 * Free the given entry for the neighbour (it has
2859 * already been removed from the list at this point). 2998 * already been removed from the list at this point).
2999 *
2860 * @param n neighbour to free 3000 * @param n neighbour to free
2861 */ 3001 */
2862static void 3002static void
@@ -2880,6 +3020,8 @@ free_neighbour (struct Neighbour *n)
2880 GNUNET_SCHEDULER_cancel (sched, n->retry_plaintext_task); 3020 GNUNET_SCHEDULER_cancel (sched, n->retry_plaintext_task);
2881 if (n->retry_set_key_task != GNUNET_SCHEDULER_NO_PREREQUISITE_TASK) 3021 if (n->retry_set_key_task != GNUNET_SCHEDULER_NO_PREREQUISITE_TASK)
2882 GNUNET_SCHEDULER_cancel (sched, n->retry_set_key_task); 3022 GNUNET_SCHEDULER_cancel (sched, n->retry_set_key_task);
3023 if (n->quota_update_task != GNUNET_SCHEDULER_NO_PREREQUISITE_TASK)
3024 GNUNET_SCHEDULER_cancel (sched, n->quota_update_task);
2883 GNUNET_free_non_null (n->public_key); 3025 GNUNET_free_non_null (n->public_key);
2884 GNUNET_free_non_null (n->pending_ping); 3026 GNUNET_free_non_null (n->pending_ping);
2885 GNUNET_free (n); 3027 GNUNET_free (n);
@@ -2922,6 +3064,8 @@ handle_transport_notify_disconnect (void *cls,
2922 neighbours = n->next; 3064 neighbours = n->next;
2923 else 3065 else
2924 p->next = n->next; 3066 p->next = n->next;
3067 GNUNET_assert (neighbour_count > 0);
3068 neighbour_count--;
2925 cnm.header.size = htons (sizeof (struct ConnectNotifyMessage)); 3069 cnm.header.size = htons (sizeof (struct ConnectNotifyMessage));
2926 cnm.header.type = htons (GNUNET_MESSAGE_TYPE_CORE_NOTIFY_DISCONNECT); 3070 cnm.header.type = htons (GNUNET_MESSAGE_TYPE_CORE_NOTIFY_DISCONNECT);
2927 cnm.bpm_available = htonl (0); 3071 cnm.bpm_available = htonl (0);
@@ -2952,6 +3096,8 @@ cleaning_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
2952 while (NULL != (n = neighbours)) 3096 while (NULL != (n = neighbours))
2953 { 3097 {
2954 neighbours = n->next; 3098 neighbours = n->next;
3099 GNUNET_assert (neighbour_count > 0);
3100 neighbour_count--;
2955 free_neighbour (n); 3101 free_neighbour (n);
2956 } 3102 }
2957 while (NULL != (c = clients)) 3103 while (NULL != (c = clients))
@@ -2983,12 +3129,17 @@ run (void *cls,
2983 cfg = c; 3129 cfg = c;
2984 /* parse configuration */ 3130 /* parse configuration */
2985 if ( 3131 if (
2986#if 0
2987 (GNUNET_OK != 3132 (GNUNET_OK !=
2988 GNUNET_CONFIGURATION_get_value_number (c, 3133 GNUNET_CONFIGURATION_get_value_number (c,
2989 "CORE", 3134 "CORE",
2990 "XX", 3135 "TOTAL_QUOTA_IN",
2991 &qin)) || 3136 &bandwidth_target_in)) ||
3137 (GNUNET_OK !=
3138 GNUNET_CONFIGURATION_get_value_number (c,
3139 "CORE",
3140 "TOTAL_QUOTA_OUT",
3141 &bandwidth_target_out)) ||
3142#if 0
2992 (GNUNET_OK != 3143 (GNUNET_OK !=
2993 GNUNET_CONFIGURATION_get_value_number (c, 3144 GNUNET_CONFIGURATION_get_value_number (c,
2994 "CORE", 3145 "CORE",
@@ -3052,8 +3203,6 @@ run (void *cls,
3052static void 3203static void
3053cleanup (void *cls, struct GNUNET_CONFIGURATION_Handle *cfg) 3204cleanup (void *cls, struct GNUNET_CONFIGURATION_Handle *cfg)
3054{ 3205{
3055
3056
3057 if (my_private_key != NULL) 3206 if (my_private_key != NULL)
3058 GNUNET_CRYPTO_rsa_key_free (my_private_key); 3207 GNUNET_CRYPTO_rsa_key_free (my_private_key);
3059} 3208}
diff --git a/src/core/test_core_api.c b/src/core/test_core_api.c
index 8e572a583..d52b24a4f 100644
--- a/src/core/test_core_api.c
+++ b/src/core/test_core_api.c
@@ -34,7 +34,7 @@
34#include "gnunet_scheduler_lib.h" 34#include "gnunet_scheduler_lib.h"
35#include "gnunet_transport_service.h" 35#include "gnunet_transport_service.h"
36 36
37#define VERBOSE GNUNET_YES 37#define VERBOSE GNUNET_NO
38 38
39#define START_ARM GNUNET_YES 39#define START_ARM GNUNET_YES
40 40
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index 8c49690e7..bc832c444 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -15,6 +15,7 @@ gnunetinclude_HEADERS = \
15 gnunet_arm_service.h \ 15 gnunet_arm_service.h \
16 gnunet_client_lib.h \ 16 gnunet_client_lib.h \
17 gnunet_common.h \ 17 gnunet_common.h \
18 gnunet_constants.h \
18 gnunet_configuration_lib.h \ 19 gnunet_configuration_lib.h \
19 gnunet_container_lib.h \ 20 gnunet_container_lib.h \
20 gnunet_core_service.h \ 21 gnunet_core_service.h \
diff --git a/src/include/gnunet_constants.h b/src/include/gnunet_constants.h
new file mode 100644
index 000000000..99ed77537
--- /dev/null
+++ b/src/include/gnunet_constants.h
@@ -0,0 +1,60 @@
1/*
2 This file is part of GNUnet.
3 (C) 2009 Christian Grothoff (and other contributing authors)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 2, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20
21/**
22 * @file include/gnunet_constants.h
23 * @brief "global" constants for performance tuning
24 * @author Christian Grothoff
25 */
26
27#ifndef GNUNET_CONSTANTS_H
28#define GNUNET_CONSTANTS_H
29
30#ifdef __cplusplus
31extern "C"
32{
33#if 0 /* keep Emacsens' auto-indent happy */
34}
35#endif
36#endif
37
38/**
39 * Amount of bytes per minute (in/out) to assume initially (before
40 * either peer has communicated any particular preference). Should be
41 * rather low; set so that at least one maximum-size message can be
42 * send each minute.
43 */
44#define GNUNET_CONSTANTS_DEFAULT_BPM_IN_OUT GNUNET_SERVER_MAX_MESSAGE_SIZE
45
46/**
47 * After how long do we consider a connection to a peer dead
48 * if we don't receive messages from the peer?
49 */
50#define GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5)
51
52
53#if 0 /* keep Emacsens' auto-indent happy */
54{
55#endif
56#ifdef __cplusplus
57}
58#endif
59
60#endif
diff --git a/src/include/gnunet_core_service.h b/src/include/gnunet_core_service.h
index 8b75271b9..be8f4baa0 100644
--- a/src/include/gnunet_core_service.h
+++ b/src/include/gnunet_core_service.h
@@ -219,7 +219,7 @@ typedef void
219 unsigned int bpm_out, 219 unsigned int bpm_out,
220 struct GNUNET_TIME_Relative 220 struct GNUNET_TIME_Relative
221 latency, int amount, 221 latency, int amount,
222 double preference); 222 unsigned long long preference);
223 223
224 224
225/** 225/**
@@ -251,7 +251,7 @@ GNUNET_CORE_peer_configure (struct GNUNET_CORE_Handle *handle,
251 struct GNUNET_TIME_Relative timeout, 251 struct GNUNET_TIME_Relative timeout,
252 unsigned int bpm_out, 252 unsigned int bpm_out,
253 int amount, 253 int amount,
254 double preference, 254 unsigned long long preference,
255 GNUNET_CORE_PeerConfigurationInfoCallback info, 255 GNUNET_CORE_PeerConfigurationInfoCallback info,
256 void *info_cls); 256 void *info_cls);
257 257
diff --git a/src/transport/gnunet-service-transport.c b/src/transport/gnunet-service-transport.c
index da6ee9df8..f689b54c0 100644
--- a/src/transport/gnunet-service-transport.c
+++ b/src/transport/gnunet-service-transport.c
@@ -29,6 +29,7 @@
29 */ 29 */
30#include "platform.h" 30#include "platform.h"
31#include "gnunet_client_lib.h" 31#include "gnunet_client_lib.h"
32#include "gnunet_constants.h"
32#include "gnunet_getopt_lib.h" 33#include "gnunet_getopt_lib.h"
33#include "gnunet_hello_lib.h" 34#include "gnunet_hello_lib.h"
34#include "gnunet_os_lib.h" 35#include "gnunet_os_lib.h"
@@ -82,12 +83,6 @@
82 */ 83 */
83#define HELLO_ADDRESS_EXPIRATION GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 12) 84#define HELLO_ADDRESS_EXPIRATION GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_HOURS, 12)
84 85
85/**
86 * After how long do we consider a connection to a peer dead
87 * if we don't receive messages from the peer?
88 */
89#define IDLE_CONNECTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5)
90
91 86
92/** 87/**
93 * Entry in linked list of network addresses. 88 * Entry in linked list of network addresses.
@@ -356,7 +351,7 @@ struct NeighbourList
356 uint64_t last_received; 351 uint64_t last_received;
357 352
358 /** 353 /**
359 * Global quota for outbound traffic for the neighbour in bytes/ms. 354 * Global quota for inbound traffic for the neighbour in bytes/ms.
360 */ 355 */
361 uint32_t quota_in; 356 uint32_t quota_in;
362 357
@@ -641,16 +636,6 @@ static struct GNUNET_SERVER_Handle *server;
641static struct NeighbourList *neighbours; 636static struct NeighbourList *neighbours;
642 637
643/** 638/**
644 * Default bandwidth quota for receiving for new peers in bytes/ms.
645 */
646static uint32_t default_quota_in;
647
648/**
649 * Default bandwidth quota for sending for new peers in bytes/ms.
650 */
651static uint32_t default_quota_out;
652
653/**
654 * Number of neighbours we'd like to have. 639 * Number of neighbours we'd like to have.
655 */ 640 */
656static uint32_t max_connect_per_transport; 641static uint32_t max_connect_per_transport;
@@ -930,7 +915,7 @@ transmit_send_continuation (void *cls,
930 } 915 }
931 if (result == GNUNET_OK) 916 if (result == GNUNET_OK)
932 { 917 {
933 rl->timeout = GNUNET_TIME_relative_to_absolute (IDLE_CONNECTION_TIMEOUT); 918 rl->timeout = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
934 } 919 }
935 else 920 else
936 { 921 {
@@ -1139,7 +1124,7 @@ try_transmission_to_peer (struct NeighbourList *neighbour)
1139 rl, 1124 rl,
1140 &neighbour->id, 1125 &neighbour->id,
1141 mq->message, 1126 mq->message,
1142 IDLE_CONNECTION_TIMEOUT, 1127 GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
1143 &transmit_send_continuation, mq); 1128 &transmit_send_continuation, mq);
1144} 1129}
1145 1130
@@ -1510,7 +1495,7 @@ notify_clients_connect (const struct GNUNET_PeerIdentity *peer,
1510#endif 1495#endif
1511 cim.header.size = htons (sizeof (struct ConnectInfoMessage)); 1496 cim.header.size = htons (sizeof (struct ConnectInfoMessage));
1512 cim.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT); 1497 cim.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT);
1513 cim.quota_out = htonl (default_quota_out); 1498 cim.quota_out = htonl (GNUNET_CONSTANTS_DEFAULT_BPM_IN_OUT / (60*1000));
1514 cim.latency = GNUNET_TIME_relative_hton (latency); 1499 cim.latency = GNUNET_TIME_relative_hton (latency);
1515 memcpy (&cim.id, peer, sizeof (struct GNUNET_PeerIdentity)); 1500 memcpy (&cim.id, peer, sizeof (struct GNUNET_PeerIdentity));
1516 cpos = clients; 1501 cpos = clients;
@@ -2196,15 +2181,15 @@ setup_new_neighbour (const struct GNUNET_PeerIdentity *peer)
2196 n->id = *peer; 2181 n->id = *peer;
2197 n->last_quota_update = GNUNET_TIME_absolute_get (); 2182 n->last_quota_update = GNUNET_TIME_absolute_get ();
2198 n->peer_timeout = 2183 n->peer_timeout =
2199 GNUNET_TIME_relative_to_absolute (IDLE_CONNECTION_TIMEOUT); 2184 GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
2200 n->quota_in = default_quota_in; 2185 n->quota_in = (GNUNET_CONSTANTS_DEFAULT_BPM_IN_OUT + 59999) / (60 * 1000);
2201 add_plugins (n); 2186 add_plugins (n);
2202 n->hello_version_sent = our_hello_version; 2187 n->hello_version_sent = our_hello_version;
2203 n->timeout_task = GNUNET_SCHEDULER_add_delayed (sched, 2188 n->timeout_task = GNUNET_SCHEDULER_add_delayed (sched,
2204 GNUNET_NO, 2189 GNUNET_NO,
2205 GNUNET_SCHEDULER_PRIORITY_IDLE, 2190 GNUNET_SCHEDULER_PRIORITY_IDLE,
2206 GNUNET_SCHEDULER_NO_PREREQUISITE_TASK, 2191 GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
2207 IDLE_CONNECTION_TIMEOUT, 2192 GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
2208 &neighbour_timeout_task, n); 2193 &neighbour_timeout_task, n);
2209 transmit_to_peer (NULL, 2194 transmit_to_peer (NULL,
2210 (const struct GNUNET_MessageHeader *) our_hello, 2195 (const struct GNUNET_MessageHeader *) our_hello,
@@ -2297,7 +2282,7 @@ plugin_env_receive (void *cls,
2297 service_context->connect_attempts++; 2282 service_context->connect_attempts++;
2298 } 2283 }
2299 service_context->timeout 2284 service_context->timeout
2300 = GNUNET_TIME_relative_to_absolute (IDLE_CONNECTION_TIMEOUT); 2285 = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
2301 service_context->plugin_handle = plugin_context; 2286 service_context->plugin_handle = plugin_context;
2302 service_context->latency = latency; 2287 service_context->latency = latency;
2303 } 2288 }
@@ -2306,12 +2291,12 @@ plugin_env_receive (void *cls,
2306 n->last_received += msize; 2291 n->last_received += msize;
2307 GNUNET_SCHEDULER_cancel (sched, n->timeout_task); 2292 GNUNET_SCHEDULER_cancel (sched, n->timeout_task);
2308 n->peer_timeout = 2293 n->peer_timeout =
2309 GNUNET_TIME_relative_to_absolute (IDLE_CONNECTION_TIMEOUT); 2294 GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
2310 n->timeout_task = 2295 n->timeout_task =
2311 GNUNET_SCHEDULER_add_delayed (sched, GNUNET_NO, 2296 GNUNET_SCHEDULER_add_delayed (sched, GNUNET_NO,
2312 GNUNET_SCHEDULER_PRIORITY_IDLE, 2297 GNUNET_SCHEDULER_PRIORITY_IDLE,
2313 GNUNET_SCHEDULER_NO_PREREQUISITE_TASK, 2298 GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
2314 IDLE_CONNECTION_TIMEOUT, 2299 GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
2315 &neighbour_timeout_task, n); 2300 &neighbour_timeout_task, n);
2316 update_quota (n); 2301 update_quota (n);
2317 if (n->quota_violation_count > QUOTA_VIOLATION_DROP_THRESHOLD) 2302 if (n->quota_violation_count > QUOTA_VIOLATION_DROP_THRESHOLD)
@@ -2426,7 +2411,7 @@ handle_start (void *cls,
2426 /* tell new client about all existing connections */ 2411 /* tell new client about all existing connections */
2427 cim.header.size = htons (sizeof (struct ConnectInfoMessage)); 2412 cim.header.size = htons (sizeof (struct ConnectInfoMessage));
2428 cim.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT); 2413 cim.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT);
2429 cim.quota_out = htonl (default_quota_out); 2414 cim.quota_out = htonl (GNUNET_CONSTANTS_DEFAULT_BPM_IN_OUT / (60 * 1000));
2430 cim.latency = GNUNET_TIME_relative_hton (GNUNET_TIME_UNIT_ZERO); /* FIXME? */ 2415 cim.latency = GNUNET_TIME_relative_hton (GNUNET_TIME_UNIT_ZERO); /* FIXME? */
2431 im = GNUNET_malloc (sizeof (struct InboundMessage) + 2416 im = GNUNET_malloc (sizeof (struct InboundMessage) +
2432 sizeof (struct GNUNET_MessageHeader)); 2417 sizeof (struct GNUNET_MessageHeader));
@@ -2639,7 +2624,7 @@ create_environment (struct TransportPlugin *plug)
2639 plug->env.receive = &plugin_env_receive; 2624 plug->env.receive = &plugin_env_receive;
2640 plug->env.lookup = &plugin_env_lookup_address; 2625 plug->env.lookup = &plugin_env_lookup_address;
2641 plug->env.notify_address = &plugin_env_notify_address; 2626 plug->env.notify_address = &plugin_env_notify_address;
2642 plug->env.default_quota_in = default_quota_in; 2627 plug->env.default_quota_in = (GNUNET_CONSTANTS_DEFAULT_BPM_IN_OUT + 59999) / (60 * 1000);
2643 plug->env.max_connections = max_connect_per_transport; 2628 plug->env.max_connections = max_connect_per_transport;
2644} 2629}
2645 2630
@@ -2738,8 +2723,6 @@ run (void *cls,
2738 char *plugs; 2723 char *plugs;
2739 char *pos; 2724 char *pos;
2740 int no_transports; 2725 int no_transports;
2741 unsigned long long qin;
2742 unsigned long long qout;
2743 unsigned long long tneigh; 2726 unsigned long long tneigh;
2744 char *keyfile; 2727 char *keyfile;
2745 2728
@@ -2749,16 +2732,6 @@ run (void *cls,
2749 if ((GNUNET_OK != 2732 if ((GNUNET_OK !=
2750 GNUNET_CONFIGURATION_get_value_number (c, 2733 GNUNET_CONFIGURATION_get_value_number (c,
2751 "TRANSPORT", 2734 "TRANSPORT",
2752 "DEFAULT_QUOTA_IN",
2753 &qin)) ||
2754 (GNUNET_OK !=
2755 GNUNET_CONFIGURATION_get_value_number (c,
2756 "TRANSPORT",
2757 "DEFAULT_QUOTA_OUT",
2758 &qout)) ||
2759 (GNUNET_OK !=
2760 GNUNET_CONFIGURATION_get_value_number (c,
2761 "TRANSPORT",
2762 "NEIGHBOUR_LIMIT", 2735 "NEIGHBOUR_LIMIT",
2763 &tneigh)) || 2736 &tneigh)) ||
2764 (GNUNET_OK != 2737 (GNUNET_OK !=
@@ -2773,8 +2746,6 @@ run (void *cls,
2773 return; 2746 return;
2774 } 2747 }
2775 max_connect_per_transport = (uint32_t) tneigh; 2748 max_connect_per_transport = (uint32_t) tneigh;
2776 default_quota_in = (uint32_t) qin;
2777 default_quota_out = (uint32_t) qout;
2778 my_private_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile); 2749 my_private_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile);
2779 GNUNET_free (keyfile); 2750 GNUNET_free (keyfile);
2780 if (my_private_key == NULL) 2751 if (my_private_key == NULL)
diff --git a/src/transport/transport_api.c b/src/transport/transport_api.c
index fb2451447..d38954445 100644
--- a/src/transport/transport_api.c
+++ b/src/transport/transport_api.c
@@ -92,7 +92,7 @@ struct NeighbourList
92 uint64_t last_sent; 92 uint64_t last_sent;
93 93
94 /** 94 /**
95 * Global quota for outbound traffic to the neighbour in bytes/ms. 95 * Quota for outbound traffic to the neighbour in bytes/ms.
96 */ 96 */
97 uint32_t quota_out; 97 uint32_t quota_out;
98 98