| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" | 5 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" |
| 6 | 6 |
| 7 #include <limits> |
| 8 |
| 7 #include "base/rand_util.h" | 9 #include "base/rand_util.h" |
| 8 #include "net/tools/quic/quic_epoll_connection_helper.h" | 10 #include "net/tools/quic/quic_epoll_connection_helper.h" |
| 9 #include "net/tools/quic/quic_socket_utils.h" | 11 #include "net/tools/quic/quic_socket_utils.h" |
| 10 | 12 |
| 11 using net::test::QuicTestWriter; | 13 using net::test::QuicTestWriter; |
| 12 | 14 |
| 13 namespace net { | 15 namespace net { |
| 14 namespace tools { | 16 namespace tools { |
| 15 namespace test { | 17 namespace test { |
| 16 | 18 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 42 return writer_->ReleaseNextPacket(); | 44 return writer_->ReleaseNextPacket(); |
| 43 } | 45 } |
| 44 | 46 |
| 45 private: | 47 private: |
| 46 PacketDroppingTestWriter* writer_; | 48 PacketDroppingTestWriter* writer_; |
| 47 }; | 49 }; |
| 48 | 50 |
| 49 PacketDroppingTestWriter::PacketDroppingTestWriter() | 51 PacketDroppingTestWriter::PacketDroppingTestWriter() |
| 50 : clock_(NULL), | 52 : clock_(NULL), |
| 51 blocked_writer_(NULL), | 53 blocked_writer_(NULL), |
| 54 config_mutex_(), |
| 52 fake_packet_loss_percentage_(0), | 55 fake_packet_loss_percentage_(0), |
| 53 fake_blocked_socket_percentage_(0), | 56 fake_blocked_socket_percentage_(0), |
| 54 fake_packet_reorder_percentage_(0), | 57 fake_packet_reorder_percentage_(0), |
| 55 fake_packet_delay_(QuicTime::Delta::Zero()) { | 58 fake_packet_delay_(QuicTime::Delta::Zero()) { |
| 56 int64 seed = base::RandUint64(); | 59 uint32 seed = base::RandInt(0, std::numeric_limits<int32>::max()); |
| 57 LOG(INFO) << "Seeding packet loss with " << seed; | 60 LOG(INFO) << "Seeding packet loss with " << seed; |
| 58 simple_random_.set_seed(seed); | 61 simple_random_.set_seed(seed); |
| 59 } | 62 } |
| 60 | 63 |
| 61 PacketDroppingTestWriter::~PacketDroppingTestWriter() { } | 64 PacketDroppingTestWriter::~PacketDroppingTestWriter() { } |
| 62 | 65 |
| 63 void PacketDroppingTestWriter::SetConnectionHelper( | 66 void PacketDroppingTestWriter::SetConnectionHelper( |
| 64 QuicEpollConnectionHelper* helper) { | 67 QuicEpollConnectionHelper* helper) { |
| 65 clock_ = helper->GetClock(); | 68 clock_ = helper->GetClock(); |
| 66 write_unblocked_alarm_.reset( | 69 write_unblocked_alarm_.reset( |
| 67 helper->CreateAlarm(new WriteUnblockedAlarm(this))); | 70 helper->CreateAlarm(new WriteUnblockedAlarm(this))); |
| 68 delay_alarm_.reset( | 71 delay_alarm_.reset( |
| 69 helper->CreateAlarm(new DelayAlarm(this))); | 72 helper->CreateAlarm(new DelayAlarm(this))); |
| 70 } | 73 } |
| 71 | 74 |
| 72 WriteResult PacketDroppingTestWriter::WritePacket( | 75 WriteResult PacketDroppingTestWriter::WritePacket( |
| 73 const char* buffer, size_t buf_len, | 76 const char* buffer, size_t buf_len, |
| 74 const net::IPAddressNumber& self_address, | 77 const net::IPAddressNumber& self_address, |
| 75 const net::IPEndPoint& peer_address, | 78 const net::IPEndPoint& peer_address, |
| 76 QuicBlockedWriterInterface* blocked_writer) { | 79 QuicBlockedWriterInterface* blocked_writer) { |
| 80 base::AutoLock locked(config_mutex_); |
| 77 if (fake_packet_loss_percentage_ > 0 && | 81 if (fake_packet_loss_percentage_ > 0 && |
| 78 simple_random_.RandUint64() % 100 < | 82 simple_random_.RandUint64() % 100 < |
| 79 static_cast<uint64>(fake_packet_loss_percentage_)) { | 83 static_cast<uint64>(fake_packet_loss_percentage_)) { |
| 80 DLOG(INFO) << "Dropping packet."; | 84 DLOG(INFO) << "Dropping packet."; |
| 81 return WriteResult(WRITE_STATUS_OK, buf_len); | 85 return WriteResult(WRITE_STATUS_OK, buf_len); |
| 82 } | 86 } |
| 83 if (fake_blocked_socket_percentage_ > 0 && | 87 if (fake_blocked_socket_percentage_ > 0 && |
| 84 simple_random_.RandUint64() % 100 < | 88 simple_random_.RandUint64() % 100 < |
| 85 static_cast<uint64>(fake_blocked_socket_percentage_)) { | 89 static_cast<uint64>(fake_blocked_socket_percentage_)) { |
| 86 DLOG(INFO) << "Blocking socket."; | 90 DLOG(INFO) << "Blocking socket."; |
| 87 if (!write_unblocked_alarm_->IsSet()) { | 91 if (!write_unblocked_alarm_->IsSet()) { |
| 88 blocked_writer_ = blocked_writer; | 92 blocked_writer_ = blocked_writer; |
| 89 // Set the alarm for 1ms in the future. | 93 // Set the alarm for 1ms in the future. |
| 90 write_unblocked_alarm_->Set( | 94 write_unblocked_alarm_->Set( |
| 91 clock_->ApproximateNow().Add( | 95 clock_->ApproximateNow().Add( |
| 92 QuicTime::Delta::FromMilliseconds(1))); | 96 QuicTime::Delta::FromMilliseconds(1))); |
| 93 } | 97 } |
| 94 return WriteResult(WRITE_STATUS_BLOCKED, EAGAIN); | 98 return WriteResult(WRITE_STATUS_BLOCKED, EAGAIN); |
| 95 } | 99 } |
| 96 | 100 |
| 97 if (!fake_packet_delay_.IsZero()) { | 101 if (!fake_packet_delay_.IsZero()) { |
| 98 // Queue it to be sent. | 102 // Queue it to be sent. |
| 99 QuicTime send_time = clock_->ApproximateNow().Add(fake_packet_delay_); | 103 QuicTime send_time = clock_->ApproximateNow().Add(fake_packet_delay_); |
| 100 delayed_packets_.push_back(DelayedWrite(buffer, buf_len, self_address, | 104 delayed_packets_.push_back(DelayedWrite(buffer, buf_len, self_address, |
| 101 peer_address, send_time)); | 105 peer_address, send_time)); |
| 102 // Set the alarm if it's not yet set. | 106 // Set the alarm if it's not yet set. |
| 103 if (!delay_alarm_->IsSet()) { | 107 if (!delay_alarm_->IsSet()) { |
| 104 delay_alarm_->Set(send_time); | 108 delay_alarm_->Set(send_time); |
| 105 } | 109 } |
| 106 | 110 |
| 107 return WriteResult(WRITE_STATUS_OK, buf_len); | 111 return WriteResult(WRITE_STATUS_OK, buf_len); |
| 108 } | 112 } |
| 109 | 113 |
| 110 return writer()->WritePacket(buffer, buf_len, self_address, peer_address, | 114 return writer()->WritePacket(buffer, buf_len, self_address, peer_address, |
| 111 blocked_writer); | 115 blocked_writer); |
| 112 } | 116 } |
| 113 | 117 |
| 114 bool PacketDroppingTestWriter::IsWriteBlockedDataBuffered() const { | 118 bool PacketDroppingTestWriter::IsWriteBlockedDataBuffered() const { |
| 115 return false; | 119 return false; |
| 116 } | 120 } |
| 117 | 121 |
| 118 QuicTime PacketDroppingTestWriter::ReleaseNextPacket() { | 122 QuicTime PacketDroppingTestWriter::ReleaseNextPacket() { |
| 119 if (delayed_packets_.empty()) { | 123 if (delayed_packets_.empty()) { |
| 120 return QuicTime::Zero(); | 124 return QuicTime::Zero(); |
| 121 } | 125 } |
| 126 base::AutoLock locked(config_mutex_); |
| 122 DelayedPacketList::iterator iter = delayed_packets_.begin(); | 127 DelayedPacketList::iterator iter = delayed_packets_.begin(); |
| 123 // Determine if we should re-order. | 128 // Determine if we should re-order. |
| 124 if (delayed_packets_.size() > 1 && fake_packet_reorder_percentage_ > 0 && | 129 if (delayed_packets_.size() > 1 && fake_packet_reorder_percentage_ > 0 && |
| 125 simple_random_.RandUint64() % 100 < | 130 simple_random_.RandUint64() % 100 < |
| 126 static_cast<uint64>(fake_packet_reorder_percentage_)) { | 131 static_cast<uint64>(fake_packet_reorder_percentage_)) { |
| 127 DLOG(INFO) << "Reordering packets."; | 132 DLOG(INFO) << "Reordering packets."; |
| 128 ++iter; | 133 ++iter; |
| 129 // Swap the send times when re-ordering packets. | 134 // Swap the send times when re-ordering packets. |
| 130 delayed_packets_.begin()->send_time = iter->send_time; | 135 delayed_packets_.begin()->send_time = iter->send_time; |
| 131 } | 136 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 154 self_address(self_address), | 159 self_address(self_address), |
| 155 peer_address(peer_address), | 160 peer_address(peer_address), |
| 156 send_time(send_time) { | 161 send_time(send_time) { |
| 157 } | 162 } |
| 158 | 163 |
| 159 PacketDroppingTestWriter::DelayedWrite::~DelayedWrite() {} | 164 PacketDroppingTestWriter::DelayedWrite::~DelayedWrite() {} |
| 160 | 165 |
| 161 } // namespace test | 166 } // namespace test |
| 162 } // namespace tools | 167 } // namespace tools |
| 163 } // namespace net | 168 } // namespace net |
| OLD | NEW |