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 |