168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/browser/renderer_host/p2p/socket_host_throttler.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/webrtc/base/ratelimiter.h" 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/webrtc/base/timing.h" 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace content { 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace { 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int kMaxIceMessageBandwidth = 256 * 1024; 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)P2PMessageThrottler::P2PMessageThrottler() 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : timing_(new rtc::Timing()), 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rate_limiter_(new rtc::RateLimiter(kMaxIceMessageBandwidth, 1.0)) { 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)P2PMessageThrottler::~P2PMessageThrottler() { 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void P2PMessageThrottler::SetTiming(scoped_ptr<rtc::Timing> timing) { 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) timing_ = timing.Pass(); 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void P2PMessageThrottler::SetSendIceBandwidth(int bandwidth_kbps) { 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rate_limiter_.reset(new rtc::RateLimiter(bandwidth_kbps, 1.0)); 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool P2PMessageThrottler::DropNextPacket(size_t packet_len) { 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) double now = timing_->TimerNow(); 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!rate_limiter_->CanUse(packet_len, now)) { 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Exceeding the send rate, this packet should be dropped. 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) rate_limiter_->Use(packet_len, now); 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace content 46