12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_bandwidth.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Highest number that QuicBandwidth can hold. 13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const int64 kQuicInfiniteBandwidth = GG_INT64_C(0x7fffffffffffffff); 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicBandwidth QuicBandwidth::Zero() { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicBandwidth(0); 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicBandwidth QuicBandwidth::FromBitsPerSecond(int64 bits_per_second) { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicBandwidth(bits_per_second); 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicBandwidth QuicBandwidth::FromKBitsPerSecond(int64 k_bits_per_second) { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(k_bits_per_second < kQuicInfiniteBandwidth / 1000); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicBandwidth(k_bits_per_second * 1000); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicBandwidth QuicBandwidth::FromBytesPerSecond(int64 bytes_per_second) { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(bytes_per_second < kQuicInfiniteBandwidth / 8); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicBandwidth(bytes_per_second * 8); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicBandwidth QuicBandwidth::FromKBytesPerSecond(int64 k_bytes_per_second) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(k_bytes_per_second < kQuicInfiniteBandwidth / 8000); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicBandwidth(k_bytes_per_second * 8000); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicBandwidth QuicBandwidth::FromBytesAndTimeDelta(QuicByteCount bytes, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicTime::Delta delta) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_LT(bytes, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<uint64>(kQuicInfiniteBandwidth / 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (8 * base::Time::kMicrosecondsPerSecond))); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 bytes_per_second = (bytes * base::Time::kMicrosecondsPerSecond) / 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delta.ToMicroseconds(); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicBandwidth(bytes_per_second * 8); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicBandwidth::QuicBandwidth(int64 bits_per_second) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : bits_per_second_(bits_per_second) { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GE(bits_per_second, 0); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 QuicBandwidth::ToBitsPerSecond() const { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bits_per_second_; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 QuicBandwidth::ToKBitsPerSecond() const { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bits_per_second_ / 1000; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 QuicBandwidth::ToBytesPerSecond() const { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bits_per_second_ / 8; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 QuicBandwidth::ToKBytesPerSecond() const { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return bits_per_second_ / 8000; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicByteCount QuicBandwidth::ToBytesPerPeriod( 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicTime::Delta time_period) const { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ToBytesPerSecond() * time_period.ToMicroseconds() / 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::kMicrosecondsPerSecond; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 QuicBandwidth::ToKBytesPerPeriod(QuicTime::Delta time_period) const { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ToKBytesPerSecond() * time_period.ToMicroseconds() / 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::kMicrosecondsPerSecond; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool QuicBandwidth::IsZero() const { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (bits_per_second_ == 0); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicBandwidth QuicBandwidth::Add(const QuicBandwidth& delta) const { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicBandwidth(bits_per_second_ + delta.bits_per_second_); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicBandwidth QuicBandwidth::Subtract(const QuicBandwidth& delta) const { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicBandwidth(bits_per_second_ - delta.bits_per_second_); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicBandwidth QuicBandwidth::Scale(float scale_factor) const { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicBandwidth(bits_per_second_ * scale_factor); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)QuicTime::Delta QuicBandwidth::TransferTime(QuicByteCount bytes) const { 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return QuicTime::Delta::FromMicroseconds( 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bytes * 8 * base::Time::kMicrosecondsPerSecond / bits_per_second_); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 108