| 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 |