OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/quic/quic_fec_group.h" | 5 #include "net/quic/quic_fec_group.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 // If we're out of order, send the FEC packet in the position of the | 62 // If we're out of order, send the FEC packet in the position of the |
63 // lost packet. Otherwise send all (non-missing) packets, then FEC. | 63 // lost packet. Otherwise send all (non-missing) packets, then FEC. |
64 if (out_of_order) { | 64 if (out_of_order) { |
65 // Update the FEC state for each non-lost packet. | 65 // Update the FEC state for each non-lost packet. |
66 for (size_t packet = 0; packet < num_packets; packet++) { | 66 for (size_t packet = 0; packet < num_packets; packet++) { |
67 if (packet == lost_packet) { | 67 if (packet == lost_packet) { |
68 ASSERT_FALSE(group.IsFinished()); | 68 ASSERT_FALSE(group.IsFinished()); |
69 QuicFecData fec; | 69 QuicFecData fec; |
70 fec.fec_group = 0; | 70 fec.fec_group = 0; |
71 fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0])); | 71 fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0])); |
72 ASSERT_TRUE(group.UpdateFec(num_packets, fec)); | 72 ASSERT_TRUE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, num_packets, |
| 73 fec)); |
73 } else { | 74 } else { |
74 QuicPacketHeader header; | 75 QuicPacketHeader header; |
75 header.packet_sequence_number = packet; | 76 header.packet_sequence_number = packet; |
76 header.entropy_flag = kEntropyFlag[packet]; | 77 header.entropy_flag = kEntropyFlag[packet]; |
77 ASSERT_TRUE(group.Update(header, kData[packet])); | 78 ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, |
| 79 kData[packet])); |
78 } | 80 } |
79 ASSERT_TRUE(group.CanRevive() == (packet == num_packets - 1)); | 81 ASSERT_TRUE(group.CanRevive() == (packet == num_packets - 1)); |
80 } | 82 } |
81 } else { | 83 } else { |
82 // Update the FEC state for each non-lost packet. | 84 // Update the FEC state for each non-lost packet. |
83 for (size_t packet = 0; packet < num_packets; packet++) { | 85 for (size_t packet = 0; packet < num_packets; packet++) { |
84 if (packet == lost_packet) { | 86 if (packet == lost_packet) { |
85 continue; | 87 continue; |
86 } | 88 } |
87 | 89 |
88 QuicPacketHeader header; | 90 QuicPacketHeader header; |
89 header.packet_sequence_number = packet; | 91 header.packet_sequence_number = packet; |
90 header.entropy_flag = kEntropyFlag[packet]; | 92 header.entropy_flag = kEntropyFlag[packet]; |
91 ASSERT_TRUE(group.Update(header, kData[packet])); | 93 ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, |
| 94 kData[packet])); |
92 ASSERT_FALSE(group.CanRevive()); | 95 ASSERT_FALSE(group.CanRevive()); |
93 } | 96 } |
94 | 97 |
95 ASSERT_FALSE(group.IsFinished()); | 98 ASSERT_FALSE(group.IsFinished()); |
96 // Attempt to revive the missing packet. | 99 // Attempt to revive the missing packet. |
97 QuicFecData fec; | 100 QuicFecData fec; |
98 fec.fec_group = 0; | 101 fec.fec_group = 0; |
99 fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0])); | 102 fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0])); |
100 | 103 |
101 ASSERT_TRUE(group.UpdateFec(num_packets, fec)); | 104 ASSERT_TRUE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, num_packets, |
| 105 fec)); |
102 } | 106 } |
103 QuicPacketHeader header; | 107 QuicPacketHeader header; |
104 char recovered[kMaxPacketSize]; | 108 char recovered[kMaxPacketSize]; |
105 ASSERT_TRUE(group.CanRevive()); | 109 ASSERT_TRUE(group.CanRevive()); |
106 size_t len = group.Revive(&header, recovered, arraysize(recovered)); | 110 size_t len = group.Revive(&header, recovered, arraysize(recovered)); |
107 ASSERT_NE(0u, len) | 111 ASSERT_NE(0u, len) |
108 << "Failed to revive packet " << lost_packet << " out of " | 112 << "Failed to revive packet " << lost_packet << " out of " |
109 << num_packets; | 113 << num_packets; |
110 EXPECT_EQ(lost_packet, header.packet_sequence_number) | 114 EXPECT_EQ(lost_packet, header.packet_sequence_number) |
111 << "Failed to revive packet " << lost_packet << " out of " | 115 << "Failed to revive packet " << lost_packet << " out of " |
(...skipping 30 matching lines...) Expand all Loading... |
142 char data1[] = "abc123"; | 146 char data1[] = "abc123"; |
143 char redundancy[arraysize(data1)]; | 147 char redundancy[arraysize(data1)]; |
144 for (size_t i = 0; i < arraysize(data1); i++) { | 148 for (size_t i = 0; i < arraysize(data1); i++) { |
145 redundancy[i] = data1[i]; | 149 redundancy[i] = data1[i]; |
146 } | 150 } |
147 | 151 |
148 QuicFecGroup group; | 152 QuicFecGroup group; |
149 | 153 |
150 QuicPacketHeader header; | 154 QuicPacketHeader header; |
151 header.packet_sequence_number = 3; | 155 header.packet_sequence_number = 3; |
152 group.Update(header, data1); | 156 group.Update(ENCRYPTION_FORWARD_SECURE, header, data1); |
153 | 157 |
154 QuicFecData fec; | 158 QuicFecData fec; |
155 fec.fec_group = 1; | 159 fec.fec_group = 1; |
156 fec.redundancy = redundancy; | 160 fec.redundancy = redundancy; |
157 | 161 |
158 header.packet_sequence_number = 2; | 162 header.packet_sequence_number = 2; |
159 ASSERT_FALSE(group.UpdateFec(2, fec)); | 163 ASSERT_FALSE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, 2, fec)); |
160 } | 164 } |
161 | 165 |
162 TEST_F(QuicFecGroupTest, ProtectsPacketsBefore) { | 166 TEST_F(QuicFecGroupTest, ProtectsPacketsBefore) { |
163 QuicPacketHeader header; | 167 QuicPacketHeader header; |
164 header.packet_sequence_number = 3; | 168 header.packet_sequence_number = 3; |
165 | 169 |
166 QuicFecGroup group; | 170 QuicFecGroup group; |
167 ASSERT_TRUE(group.Update(header, kData[0])); | 171 ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0])); |
168 | 172 |
169 EXPECT_FALSE(group.ProtectsPacketsBefore(1)); | 173 EXPECT_FALSE(group.ProtectsPacketsBefore(1)); |
170 EXPECT_FALSE(group.ProtectsPacketsBefore(2)); | 174 EXPECT_FALSE(group.ProtectsPacketsBefore(2)); |
171 EXPECT_FALSE(group.ProtectsPacketsBefore(3)); | 175 EXPECT_FALSE(group.ProtectsPacketsBefore(3)); |
172 EXPECT_TRUE(group.ProtectsPacketsBefore(4)); | 176 EXPECT_TRUE(group.ProtectsPacketsBefore(4)); |
173 EXPECT_TRUE(group.ProtectsPacketsBefore(5)); | 177 EXPECT_TRUE(group.ProtectsPacketsBefore(5)); |
174 EXPECT_TRUE(group.ProtectsPacketsBefore(50)); | 178 EXPECT_TRUE(group.ProtectsPacketsBefore(50)); |
175 } | 179 } |
176 | 180 |
177 TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithSeveralPackets) { | 181 TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithSeveralPackets) { |
178 QuicPacketHeader header; | 182 QuicPacketHeader header; |
179 header.packet_sequence_number = 3; | 183 header.packet_sequence_number = 3; |
180 | 184 |
181 QuicFecGroup group; | 185 QuicFecGroup group; |
182 ASSERT_TRUE(group.Update(header, kData[0])); | 186 ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0])); |
183 | 187 |
184 header.packet_sequence_number = 7; | 188 header.packet_sequence_number = 7; |
185 ASSERT_TRUE(group.Update(header, kData[0])); | 189 ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0])); |
186 | 190 |
187 header.packet_sequence_number = 5; | 191 header.packet_sequence_number = 5; |
188 ASSERT_TRUE(group.Update(header, kData[0])); | 192 ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0])); |
189 | 193 |
190 EXPECT_FALSE(group.ProtectsPacketsBefore(1)); | 194 EXPECT_FALSE(group.ProtectsPacketsBefore(1)); |
191 EXPECT_FALSE(group.ProtectsPacketsBefore(2)); | 195 EXPECT_FALSE(group.ProtectsPacketsBefore(2)); |
192 EXPECT_FALSE(group.ProtectsPacketsBefore(3)); | 196 EXPECT_FALSE(group.ProtectsPacketsBefore(3)); |
193 EXPECT_TRUE(group.ProtectsPacketsBefore(4)); | 197 EXPECT_TRUE(group.ProtectsPacketsBefore(4)); |
194 EXPECT_TRUE(group.ProtectsPacketsBefore(5)); | 198 EXPECT_TRUE(group.ProtectsPacketsBefore(5)); |
195 EXPECT_TRUE(group.ProtectsPacketsBefore(6)); | 199 EXPECT_TRUE(group.ProtectsPacketsBefore(6)); |
196 EXPECT_TRUE(group.ProtectsPacketsBefore(7)); | 200 EXPECT_TRUE(group.ProtectsPacketsBefore(7)); |
197 EXPECT_TRUE(group.ProtectsPacketsBefore(8)); | 201 EXPECT_TRUE(group.ProtectsPacketsBefore(8)); |
198 EXPECT_TRUE(group.ProtectsPacketsBefore(9)); | 202 EXPECT_TRUE(group.ProtectsPacketsBefore(9)); |
199 EXPECT_TRUE(group.ProtectsPacketsBefore(50)); | 203 EXPECT_TRUE(group.ProtectsPacketsBefore(50)); |
200 } | 204 } |
201 | 205 |
202 TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithFecData) { | 206 TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithFecData) { |
203 QuicFecData fec; | 207 QuicFecData fec; |
204 fec.fec_group = 2; | 208 fec.fec_group = 2; |
205 fec.redundancy = kData[0]; | 209 fec.redundancy = kData[0]; |
206 | 210 |
207 QuicFecGroup group; | 211 QuicFecGroup group; |
208 ASSERT_TRUE(group.UpdateFec(3, fec)); | 212 ASSERT_TRUE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, 3, fec)); |
209 | 213 |
210 EXPECT_FALSE(group.ProtectsPacketsBefore(1)); | 214 EXPECT_FALSE(group.ProtectsPacketsBefore(1)); |
211 EXPECT_FALSE(group.ProtectsPacketsBefore(2)); | 215 EXPECT_FALSE(group.ProtectsPacketsBefore(2)); |
212 EXPECT_TRUE(group.ProtectsPacketsBefore(3)); | 216 EXPECT_TRUE(group.ProtectsPacketsBefore(3)); |
213 EXPECT_TRUE(group.ProtectsPacketsBefore(4)); | 217 EXPECT_TRUE(group.ProtectsPacketsBefore(4)); |
214 EXPECT_TRUE(group.ProtectsPacketsBefore(5)); | 218 EXPECT_TRUE(group.ProtectsPacketsBefore(5)); |
215 EXPECT_TRUE(group.ProtectsPacketsBefore(50)); | 219 EXPECT_TRUE(group.ProtectsPacketsBefore(50)); |
216 } | 220 } |
217 | 221 |
| 222 TEST_F(QuicFecGroupTest, EffectiveEncryptionLevel) { |
| 223 QuicFecGroup group; |
| 224 EXPECT_EQ(NUM_ENCRYPTION_LEVELS, group.effective_encryption_level()); |
| 225 |
| 226 QuicPacketHeader header; |
| 227 header.packet_sequence_number = 5; |
| 228 ASSERT_TRUE(group.Update(ENCRYPTION_INITIAL, header, kData[0])); |
| 229 EXPECT_EQ(ENCRYPTION_INITIAL, group.effective_encryption_level()); |
| 230 |
| 231 QuicFecData fec; |
| 232 fec.fec_group = 0; |
| 233 fec.redundancy = kData[0]; |
| 234 ASSERT_TRUE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, 7, fec)); |
| 235 EXPECT_EQ(ENCRYPTION_INITIAL, group.effective_encryption_level()); |
| 236 |
| 237 header.packet_sequence_number = 3; |
| 238 ASSERT_TRUE(group.Update(ENCRYPTION_NONE, header, kData[0])); |
| 239 EXPECT_EQ(ENCRYPTION_NONE, group.effective_encryption_level()); |
| 240 } |
| 241 |
218 } // namespace net | 242 } // namespace net |
OLD | NEW |