diff options
author | Christian Grothoff <christian@grothoff.org> | 2011-10-14 09:04:56 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2011-10-14 09:04:56 +0000 |
commit | 189b63c6e861cb88583ba8fc581c5ec1aa8aaf11 (patch) | |
tree | d3f638b3159d04bd09e0dbf9e40f6a99f0154fde | |
parent | 52dc9ad9af5d242f8c80cd7f70cf5e788516e651 (diff) | |
download | gnunet-189b63c6e861cb88583ba8fc581c5ec1aa8aaf11.tar.gz gnunet-189b63c6e861cb88583ba8fc581c5ec1aa8aaf11.zip |
implementing reservations
-rw-r--r-- | src/ats/gnunet-service-ats_reservations.c | 79 |
1 files changed, 77 insertions, 2 deletions
diff --git a/src/ats/gnunet-service-ats_reservations.c b/src/ats/gnunet-service-ats_reservations.c index 8171b71f0..08764f4d1 100644 --- a/src/ats/gnunet-service-ats_reservations.c +++ b/src/ats/gnunet-service-ats_reservations.c | |||
@@ -26,6 +26,18 @@ | |||
26 | #include "platform.h" | 26 | #include "platform.h" |
27 | #include "gnunet-service-ats_reservations.h" | 27 | #include "gnunet-service-ats_reservations.h" |
28 | 28 | ||
29 | /** | ||
30 | * Number of seconds that available bandwidth carries over | ||
31 | * (can accumulate). | ||
32 | */ | ||
33 | #define MAX_BANDWIDTH_CARRY_S 5 | ||
34 | |||
35 | |||
36 | /** | ||
37 | * Map of peer identities to 'struct GNUNET_BANDWIDTH_Tracker *'s | ||
38 | */ | ||
39 | static struct GNUNET_CONTAINER_MultiHashMap *trackers; | ||
40 | |||
29 | 41 | ||
30 | /** | 42 | /** |
31 | * Reserve the given amount of incoming bandwidth (in bytes) from the | 43 | * Reserve the given amount of incoming bandwidth (in bytes) from the |
@@ -42,8 +54,22 @@ struct GNUNET_TIME_Relative | |||
42 | GAS_reservations_reserve (const struct GNUNET_PeerIdentity *peer, | 54 | GAS_reservations_reserve (const struct GNUNET_PeerIdentity *peer, |
43 | int32_t amount) | 55 | int32_t amount) |
44 | { | 56 | { |
45 | /* FIXME: implement... */ | 57 | struct GNUNET_BANDWIDTH_Tracker *tracker; |
46 | /* permit all reservations instantly for now */ | 58 | struct GNUNET_TIME_Relative ret; |
59 | |||
60 | tracker = GNUNET_CONTAINER_multihashmap_get (trackers, | ||
61 | &peer->hashPubKey); | ||
62 | if (NULL == tracker) | ||
63 | return GNUNET_TIME_UNIT_FOREVER_REL; | ||
64 | if (amount >= 0) | ||
65 | { | ||
66 | ret = GNUNET_BANDWIDTH_tracker_get_delay (tracker, | ||
67 | amount); | ||
68 | if (ret.rel_value > 0) | ||
69 | return ret; | ||
70 | } | ||
71 | GNUNET_break (GNUNET_NO == /* no == not above limit */ | ||
72 | GNUNET_BANDWIDTH_tracker_consume (tracker, amount)); | ||
47 | return GNUNET_TIME_UNIT_ZERO; | 73 | return GNUNET_TIME_UNIT_ZERO; |
48 | } | 74 | } |
49 | 75 | ||
@@ -60,6 +86,33 @@ void | |||
60 | GAS_reservations_set_bandwidth (const struct GNUNET_PeerIdentity *peer, | 86 | GAS_reservations_set_bandwidth (const struct GNUNET_PeerIdentity *peer, |
61 | struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) | 87 | struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) |
62 | { | 88 | { |
89 | struct GNUNET_BANDWIDTH_Tracker *tracker; | ||
90 | |||
91 | tracker = GNUNET_CONTAINER_multihashmap_get (trackers, | ||
92 | &peer->hashPubKey); | ||
93 | if (0 == ntohl (bandwidth_in.value__)) | ||
94 | { | ||
95 | GNUNET_assert (GNUNET_YES == | ||
96 | GNUNET_CONTAINER_multihashmap_remove (trackers, | ||
97 | &peer->hashPubKey, | ||
98 | tracker)); | ||
99 | GNUNET_free (tracker); | ||
100 | return; | ||
101 | } | ||
102 | if (NULL == tracker) | ||
103 | { | ||
104 | tracker = GNUNET_malloc (sizeof (struct GNUNET_BANDWIDTH_Tracker)); | ||
105 | GNUNET_BANDWIDTH_tracker_init (tracker, | ||
106 | bandwidth_in, | ||
107 | MAX_BANDWIDTH_CARRY_S); | ||
108 | GNUNET_CONTAINER_multihashmap_put (trackers, | ||
109 | &peer->hashPubKey, | ||
110 | tracker, | ||
111 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY); | ||
112 | return; | ||
113 | } | ||
114 | GNUNET_BANDWIDTH_tracker_update_quota (tracker, | ||
115 | bandwidth_in); | ||
63 | } | 116 | } |
64 | 117 | ||
65 | 118 | ||
@@ -70,6 +123,26 @@ GAS_reservations_set_bandwidth (const struct GNUNET_PeerIdentity *peer, | |||
70 | void | 123 | void |
71 | GAS_reservations_init () | 124 | GAS_reservations_init () |
72 | { | 125 | { |
126 | trackers = GNUNET_CONTAINER_multihashmap_create(128); | ||
127 | } | ||
128 | |||
129 | |||
130 | /** | ||
131 | * Free memory of bandwidth tracker. | ||
132 | * | ||
133 | * @param cls NULL | ||
134 | * @param key peer identity (unused) | ||
135 | * @param value the 'struct GNUNET_BANDWIDTH_Tracker' to free | ||
136 | * @return GNUNET_OK (continue to iterate) | ||
137 | */ | ||
138 | static int | ||
139 | free_tracker (void *cls, | ||
140 | const GNUNET_HashCode * key, | ||
141 | void *value) | ||
142 | { | ||
143 | struct GNUNET_BANDWIDTH_Tracker *tracker = cls; | ||
144 | GNUNET_free (tracker); | ||
145 | return GNUNET_OK; | ||
73 | } | 146 | } |
74 | 147 | ||
75 | 148 | ||
@@ -79,6 +152,8 @@ GAS_reservations_init () | |||
79 | void | 152 | void |
80 | GAS_reservations_done () | 153 | GAS_reservations_done () |
81 | { | 154 | { |
155 | GNUNET_CONTAINER_multihashmap_iterate (trackers, &free_tracker, NULL); | ||
156 | GNUNET_CONTAINER_multihashmap_destroy (trackers); | ||
82 | } | 157 | } |
83 | 158 | ||
84 | 159 | ||