| // Copyright (c) 2016 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TRAFFIC_POLICER_H_ | |
| #define QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TRAFFIC_POLICER_H_ | |
| #include "absl/container/flat_hash_map.h" | |
| #include "quic/test_tools/simulator/packet_filter.h" | |
| #include "quic/test_tools/simulator/port.h" | |
| namespace quic { | |
| namespace simulator { | |
| // Traffic policer uses a token bucket to limit the bandwidth of the traffic | |
| // passing through. It wraps around an input port and exposes an output port. | |
| // Only the traffic from input to the output is policed, so in case when | |
| // bidirectional policing is desired, two policers have to be used. The flows | |
| // are hashed by the destination only. | |
| class TrafficPolicer : public PacketFilter { | |
| public: | |
| TrafficPolicer(Simulator* simulator, | |
| std::string name, | |
| QuicByteCount initial_bucket_size, | |
| QuicByteCount max_bucket_size, | |
| QuicBandwidth target_bandwidth, | |
| Endpoint* input); | |
| TrafficPolicer(const TrafficPolicer&) = delete; | |
| TrafficPolicer& operator=(const TrafficPolicer&) = delete; | |
| ~TrafficPolicer() override; | |
| protected: | |
| bool FilterPacket(const Packet& packet) override; | |
| private: | |
| // Refill the token buckets with all the tokens that have been granted since | |
| // |last_refill_time_|. | |
| void Refill(); | |
| QuicByteCount initial_bucket_size_; | |
| QuicByteCount max_bucket_size_; | |
| QuicBandwidth target_bandwidth_; | |
| // The time at which the token buckets were last refilled. | |
| QuicTime last_refill_time_; | |
| // Maps each destination to the number of tokens it has left. | |
| absl::flat_hash_map<std::string, QuicByteCount> token_buckets_; | |
| }; | |
| } // namespace simulator | |
| } // namespace quic | |
| #endif // QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TRAFFIC_POLICER_H_ |