Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(281)

Side by Side Diff: net/tools/quic/test_tools/packet_dropping_test_writer.cc

Issue 47283002: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix compilation error Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « net/tools/quic/test_tools/packet_dropping_test_writer.h ('k') | net/tools/quic/test_tools/quic_test_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698