15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class to track the rate data can leave the buffer for pacing. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A leaky bucket drains the data at a constant rate regardless of fullness of 72385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// the buffer. 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// See http://en.wikipedia.org/wiki/Leaky_bucket for more details. 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_QUIC_CONGESTION_CONTROL_LEAKY_BUCKET_H_ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_QUIC_CONGESTION_CONTROL_LEAKY_BUCKET_H_ 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/basictypes.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_export.h" 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/quic/quic_bandwidth.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_protocol.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_time.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace net { 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE LeakyBucket { 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch explicit LeakyBucket(QuicBandwidth draining_rate); 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set the rate at which the bytes leave the buffer. 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetDrainingRate(QuicTime now, QuicBandwidth draining_rate); 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add data to the buffer. 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Add(QuicTime now, QuicByteCount bytes); 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Time until the buffer is empty. 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch QuicTime::Delta TimeRemaining(QuicTime now) const; 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Number of bytes in the buffer. 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch QuicByteCount BytesPending(QuicTime now); 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Update(QuicTime now); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicByteCount bytes_; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicTime time_last_updated_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicBandwidth draining_rate_; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LeakyBucket); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace net 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_QUIC_CONGESTION_CONTROL_LEAKY_BUCKET_H_ 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)