Index: webrtc/base/virtualsocketserver.cc |
diff --git a/webrtc/base/virtualsocketserver.cc b/webrtc/base/virtualsocketserver.cc |
index 87775cd63cc6afcd4e2dece01ec32bfde2780adf..da2cb1d741a04f28b1ae1480b44cfbb43757a376 100644 |
--- a/webrtc/base/virtualsocketserver.cc |
+++ b/webrtc/base/virtualsocketserver.cc |
@@ -528,7 +528,6 @@ VirtualSocketServer::VirtualSocketServer(SocketServer* ss) |
server_owned_(false), |
msg_queue_(NULL), |
stop_on_idle_(false), |
- network_delay_(0), |
next_ipv4_(kInitialNextIPv4), |
next_ipv6_(kInitialNextIPv6), |
next_port_(kFirstEphemeralPort), |
@@ -541,7 +540,6 @@ VirtualSocketServer::VirtualSocketServer(SocketServer* ss) |
delay_mean_(0), |
delay_stddev_(0), |
delay_samples_(NUM_SAMPLES), |
- delay_dist_(NULL), |
drop_prob_(0.0) { |
if (!server_) { |
server_ = new PhysicalSocketServer(); |
@@ -553,7 +551,6 @@ VirtualSocketServer::VirtualSocketServer(SocketServer* ss) |
VirtualSocketServer::~VirtualSocketServer() { |
delete bindings_; |
delete connections_; |
- delete delay_dist_; |
if (server_owned_) { |
delete server_; |
} |
@@ -781,7 +778,7 @@ static double Random() { |
int VirtualSocketServer::Connect(VirtualSocket* socket, |
const SocketAddress& remote_addr, |
bool use_delay) { |
- uint32_t delay = use_delay ? GetRandomTransitDelay() : 0; |
+ uint32_t delay = use_delay ? GetTransitDelay(socket) : 0; |
VirtualSocket* remote = LookupBinding(remote_addr); |
if (!CanInteractWith(socket, remote)) { |
LOG(LS_INFO) << "Address family mismatch between " |
@@ -803,7 +800,7 @@ bool VirtualSocketServer::Disconnect(VirtualSocket* socket) { |
if (socket) { |
// If we simulate packets being delayed, we should simulate the |
// equivalent of a FIN being delayed as well. |
- uint32_t delay = GetRandomTransitDelay(); |
+ uint32_t delay = GetTransitDelay(socket); |
// Remove the mapping. |
msg_queue_->PostDelayed(RTC_FROM_HERE, delay, socket, MSG_ID_DISCONNECT); |
return true; |
@@ -947,7 +944,7 @@ void VirtualSocketServer::AddPacketToNetwork(VirtualSocket* sender, |
sender->network_.push_back(entry); |
// Find the delay for crossing the many virtual hops of the network. |
- uint32_t transit_delay = GetRandomTransitDelay(); |
+ uint32_t transit_delay = GetTransitDelay(sender); |
// When the incoming packet is from a binding of the any address, translate it |
// to the default route here such that the recipient will see the default |
@@ -964,12 +961,12 @@ void VirtualSocketServer::AddPacketToNetwork(VirtualSocket* sender, |
int64_t ts = TimeAfter(send_delay + transit_delay); |
if (ordered) { |
// Ensure that new packets arrive after previous ones |
- // TODO: consider ordering on a per-socket basis, since this |
- // introduces artificial delay. |
- ts = std::max(ts, network_delay_); |
+ ts = std::max(ts, sender->last_delivery_time_); |
+ // A socket should not have both ordered and unordered delivery, so its last |
+ // delivery time only needs to be updated when it has ordered delivery. |
+ sender->last_delivery_time_ = ts; |
} |
msg_queue_->PostAt(RTC_FROM_HERE, ts, recipient, MSG_ID_PACKET, p); |
- network_delay_ = std::max(ts, network_delay_); |
} |
void VirtualSocketServer::PurgeNetworkPackets(VirtualSocket* socket, |
@@ -1016,8 +1013,7 @@ void VirtualSocketServer::UpdateDelayDistribution() { |
// We take a lock just to make sure we don't leak memory. |
{ |
CritScope cs(&delay_crit_); |
- delete delay_dist_; |
- delay_dist_ = dist; |
+ delay_dist_.reset(dist); |
} |
} |
@@ -1060,10 +1056,16 @@ VirtualSocketServer::Function* VirtualSocketServer::CreateDistribution( |
return Resample(Invert(Accumulate(f)), 0, 1, samples); |
} |
-uint32_t VirtualSocketServer::GetRandomTransitDelay() { |
+uint32_t VirtualSocketServer::GetTransitDelay(Socket* socket) { |
+ // Use the delay based on the address if it is set. |
+ auto iter = delay_by_ip_.find(socket->GetLocalAddress().ipaddr()); |
+ if (iter != delay_by_ip_.end()) { |
+ return static_cast<uint32_t>(iter->second); |
+ } |
+ // Otherwise, use the delay from the distribution distribution. |
size_t index = rand() % delay_dist_->size(); |
double delay = (*delay_dist_)[index].second; |
- //LOG_F(LS_INFO) << "random[" << index << "] = " << delay; |
+ // LOG_F(LS_INFO) << "random[" << index << "] = " << delay; |
return static_cast<uint32_t>(delay); |
} |