From: Christian Grothoff Date: Fri, 5 Mar 2010 19:04:38 +0000 (+0000) Subject: update-api X-Git-Tag: initial-import-from-subversion-38251~22552 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=78a3d311f2c3c82affe6003b9bd3c17c0b2d200b;p=oweals%2Fgnunet.git update-api --- diff --git a/src/include/gnunet_bandwidth_lib.h b/src/include/gnunet_bandwidth_lib.h index 2dbe6e562..7dfbb1543 100644 --- a/src/include/gnunet_bandwidth_lib.h +++ b/src/include/gnunet_bandwidth_lib.h @@ -21,7 +21,6 @@ /** * @file include/gnunet_bandwidth_lib.h * @brief functions related to bandwidth (unit) - * * @author Christian Grothoff */ @@ -94,6 +93,33 @@ struct GNUNET_BANDWIDTH_Value32NBO GNUNET_BANDWIDTH_value_init (uint32_t bytes_per_second); +/** + * At the given bandwidth, calculate how much traffic will be + * available until the given deadline. + * + * @param bps bandwidth + * @param deadline when is the deadline + * @return number of bytes available at bps until deadline + */ +uint64_t +GNUNET_BANDWIDTH_value_get_available_until (struct GNUNET_BANDWIDTH_Value32NBO bps, + struct GNUNET_TIME_Relative deadline); + + +/** + * At the given bandwidth, calculate how long it would take for + * 'size' bytes to be transmitted. + * + * @param bps bandwidth + * @param size number of bytes we want to have available + * @return how long it would take + */ +struct GNUNET_TIME_Relative +GNUNET_BANDWIDTH_value_get_delay_for (struct GNUNET_BANDWIDTH_Value32NBO bps, + uint64_t size); + + + /** * Compute the MIN of two bandwidth values. * @@ -135,10 +161,11 @@ GNUNET_BANDWIDTH_tracker_init (struct GNUNET_BANDWIDTH_Tracker *av, * * @param av tracker to update * @param size number of bytes consumed + * @return GNUNET_YES if this consumption is above the limit */ -void +int GNUNET_BANDWIDTH_tracker_consume (struct GNUNET_BANDWIDTH_Tracker *av, - size_t size); + ssize_t size); /** @@ -155,6 +182,17 @@ GNUNET_BANDWIDTH_tracker_get_delay (struct GNUNET_BANDWIDTH_Tracker *av, size_t size); +/** + * Compute how many bytes are available for consumption right now. + * quota. + * + * @param av tracker to query + * @return number of bytes available for consumption right now + */ +int64_t +GNUNET_BANDWIDTH_tracker_get_available (struct GNUNET_BANDWIDTH_Tracker *av); + + /** * Update quota of bandwidth tracker. * diff --git a/src/util/bandwidth.c b/src/util/bandwidth.c index aaf57619f..099c7d080 100644 --- a/src/util/bandwidth.c +++ b/src/util/bandwidth.c @@ -59,6 +59,48 @@ GNUNET_BANDWIDTH_value_min (struct GNUNET_BANDWIDTH_Value32NBO b1, } +/** + * At the given bandwidth, calculate how much traffic will be + * available until the given deadline. + * + * @param bps bandwidth + * @param deadline when is the deadline + * @return number of bytes available at bps until deadline + */ +uint64_t +GNUNET_BANDWIDTH_value_get_available_until (struct GNUNET_BANDWIDTH_Value32NBO bps, + struct GNUNET_TIME_Relative deadline) +{ + uint64_t b; + + b = ntohl (bps.value__); + return b * deadline.value / 1000LL; +} + + +/** + * At the given bandwidth, calculate how long it would take for + * 'size' bytes to be transmitted. + * + * @param bps bandwidth + * @param size number of bytes we want to have available + * @return how long it would take + */ +struct GNUNET_TIME_Relative +GNUNET_BANDWIDTH_value_get_delay_for (struct GNUNET_BANDWIDTH_Value32NBO bps, + uint64_t size) +{ + uint64_t b; + struct GNUNET_TIME_Relative ret; + + b = ntohl (bps.value__); + if (b == 0) + return GNUNET_TIME_UNIT_FOREVER_REL; + ret.value = size * 1000LL / b; + return ret; +} + + /** * Initialize bandwidth tracker. Note that in addition to the * 'max_carry_s' limit, we also always allow at least @@ -135,7 +177,6 @@ update_tracker (struct GNUNET_BANDWIDTH_Tracker *av) } - /** * Notify the tracker that a certain number of bytes of bandwidth have * been consumed. Note that it is legal to consume bytes even if not @@ -145,21 +186,33 @@ update_tracker (struct GNUNET_BANDWIDTH_Tracker *av) * * @param av tracker to update * @param size number of bytes consumed + * @return GNUNET_YES if this consumption is above the limit */ -void +int GNUNET_BANDWIDTH_tracker_consume (struct GNUNET_BANDWIDTH_Tracker *av, - size_t size) + ssize_t size) { uint64_t nc; - nc = av->consumption_since_last_update__ + size; - if (nc < av->consumption_since_last_update__) + if (size > 0) { - GNUNET_break (0); - return; + nc = av->consumption_since_last_update__ + size; + if (nc < av->consumption_since_last_update__) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + av->consumption_since_last_update__ = nc; + update_tracker (av); + if (av->consumption_since_last_update__ > 0) + return GNUNET_YES; } - av->consumption_since_last_update__ += size; - update_tracker (av); + else + { + av->last_update__.value -= (size * av->available_bytes_per_s__) / 1000LL; + update_tracker (av); + } + return GNUNET_NO; } @@ -196,6 +249,29 @@ GNUNET_BANDWIDTH_tracker_get_delay (struct GNUNET_BANDWIDTH_Tracker *av, } +/** + * Compute how many bytes are available for consumption right now. + * quota. + * + * @param av tracker to query + * @return number of bytes available for consumption right now + */ +int64_t +GNUNET_BANDWIDTH_tracker_get_available (struct GNUNET_BANDWIDTH_Tracker *av) +{ + struct GNUNET_BANDWIDTH_Value32NBO bps; + uint64_t avail; + uint64_t used; + + update_tracker (av); + bps = GNUNET_BANDWIDTH_value_init (av->available_bytes_per_s__); + avail = GNUNET_BANDWIDTH_value_get_available_until (bps, + GNUNET_TIME_absolute_get_duration (av->last_update__)); + used = av->consumption_since_last_update__; + return (int64_t) (avail - used); +} + + /** * Update quota of bandwidth tracker. *