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)