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/core/quic_framer.h" | 5 #include "net/quic/core/quic_framer.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <map> | 10 #include <map> |
(...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1189 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | 1189 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) |
1190 : arraysize(packet_34), | 1190 : arraysize(packet_34), |
1191 false); | 1191 false); |
1192 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 1192 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
1193 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1193 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1194 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_)); | 1194 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_)); |
1195 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_)); | 1195 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_)); |
1196 } | 1196 } |
1197 | 1197 |
1198 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) { | 1198 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) { |
1199 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); | 1199 if (FLAGS_quic_packet_numbers_largest_received) { |
| 1200 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); |
| 1201 } else { |
| 1202 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); |
| 1203 } |
1200 | 1204 |
1201 // clang-format off | 1205 // clang-format off |
1202 unsigned char packet[] = { | 1206 unsigned char packet[] = { |
1203 // public flags (8 byte connection_id and 4 byte packet number) | 1207 // public flags (8 byte connection_id and 4 byte packet number) |
1204 0x28, | 1208 0x28, |
1205 // connection_id | 1209 // connection_id |
1206 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 1210 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1207 // packet number | 1211 // packet number |
1208 0xBC, 0x9A, 0x78, 0x56, | 1212 0xBC, 0x9A, 0x78, 0x56, |
1209 // private flags | 1213 // private flags |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1260 expected_error = "Unable to read packet number."; | 1264 expected_error = "Unable to read packet number."; |
1261 } | 1265 } |
1262 } | 1266 } |
1263 CheckProcessingFails( | 1267 CheckProcessingFails( |
1264 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | 1268 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, |
1265 expected_error, QUIC_INVALID_PACKET_HEADER); | 1269 expected_error, QUIC_INVALID_PACKET_HEADER); |
1266 } | 1270 } |
1267 } | 1271 } |
1268 | 1272 |
1269 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) { | 1273 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) { |
1270 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); | 1274 if (FLAGS_quic_packet_numbers_largest_received) { |
| 1275 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); |
| 1276 } else { |
| 1277 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); |
| 1278 } |
1271 | 1279 |
1272 // clang-format off | 1280 // clang-format off |
1273 unsigned char packet[] = { | 1281 unsigned char packet[] = { |
1274 // public flags (8 byte connection_id and 2 byte packet number) | 1282 // public flags (8 byte connection_id and 2 byte packet number) |
1275 0x18, | 1283 0x18, |
1276 // connection_id | 1284 // connection_id |
1277 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 1285 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1278 // packet number | 1286 // packet number |
1279 0xBC, 0x9A, | 1287 0xBC, 0x9A, |
1280 // private flags | 1288 // private flags |
(...skipping 14 matching lines...) Expand all Loading... |
1295 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | 1303 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) |
1296 : arraysize(packet_34), | 1304 : arraysize(packet_34), |
1297 false); | 1305 false); |
1298 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 1306 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
1299 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 1307 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
1300 ASSERT_TRUE(visitor_.header_.get()); | 1308 ASSERT_TRUE(visitor_.header_.get()); |
1301 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 1309 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
1302 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); | 1310 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); |
1303 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 1311 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
1304 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 1312 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 1313 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, |
| 1314 visitor_.header_->public_header.packet_number_length); |
1305 EXPECT_FALSE(visitor_.header_->fec_flag); | 1315 EXPECT_FALSE(visitor_.header_->fec_flag); |
1306 EXPECT_FALSE(visitor_.header_->entropy_flag); | 1316 EXPECT_FALSE(visitor_.header_->entropy_flag); |
1307 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 1317 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
1308 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 1318 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
1309 | 1319 |
1310 // Now test framing boundaries. | 1320 // Now test framing boundaries. |
1311 for (size_t i = 0; | 1321 for (size_t i = 0; |
1312 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 1322 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
1313 !kIncludeVersion, !kIncludePathId, | 1323 !kIncludeVersion, !kIncludePathId, |
1314 !kIncludeDiversificationNonce, | 1324 !kIncludeDiversificationNonce, |
(...skipping 16 matching lines...) Expand all Loading... |
1331 expected_error = "Unable to read packet number."; | 1341 expected_error = "Unable to read packet number."; |
1332 } | 1342 } |
1333 } | 1343 } |
1334 CheckProcessingFails( | 1344 CheckProcessingFails( |
1335 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | 1345 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, |
1336 expected_error, QUIC_INVALID_PACKET_HEADER); | 1346 expected_error, QUIC_INVALID_PACKET_HEADER); |
1337 } | 1347 } |
1338 } | 1348 } |
1339 | 1349 |
1340 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) { | 1350 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) { |
1341 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); | 1351 if (FLAGS_quic_packet_numbers_largest_received) { |
| 1352 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); |
| 1353 } else { |
| 1354 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); |
| 1355 } |
1342 | 1356 |
1343 // clang-format off | 1357 // clang-format off |
1344 unsigned char packet[] = { | 1358 unsigned char packet[] = { |
1345 // public flags (8 byte connection_id and 1 byte packet number) | 1359 // public flags (8 byte connection_id and 1 byte packet number) |
1346 0x08, | 1360 0x08, |
1347 // connection_id | 1361 // connection_id |
1348 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 1362 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1349 // packet number | 1363 // packet number |
1350 0xBC, | 1364 0xBC, |
1351 // private flags | 1365 // private flags |
(...skipping 14 matching lines...) Expand all Loading... |
1366 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | 1380 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) |
1367 : arraysize(packet_34), | 1381 : arraysize(packet_34), |
1368 false); | 1382 false); |
1369 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 1383 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
1370 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 1384 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
1371 ASSERT_TRUE(visitor_.header_.get()); | 1385 ASSERT_TRUE(visitor_.header_.get()); |
1372 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 1386 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
1373 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); | 1387 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); |
1374 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 1388 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
1375 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 1389 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 1390 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
| 1391 visitor_.header_->public_header.packet_number_length); |
1376 EXPECT_FALSE(visitor_.header_->fec_flag); | 1392 EXPECT_FALSE(visitor_.header_->fec_flag); |
1377 EXPECT_FALSE(visitor_.header_->entropy_flag); | 1393 EXPECT_FALSE(visitor_.header_->entropy_flag); |
1378 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 1394 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
1379 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 1395 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
1380 | 1396 |
1381 // Now test framing boundaries. | 1397 // Now test framing boundaries. |
1382 for (size_t i = 0; | 1398 for (size_t i = 0; |
1383 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 1399 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
1384 !kIncludeVersion, !kIncludePathId, | 1400 !kIncludeVersion, !kIncludePathId, |
1385 !kIncludeDiversificationNonce, | 1401 !kIncludeDiversificationNonce, |
(...skipping 15 matching lines...) Expand all Loading... |
1401 } else { | 1417 } else { |
1402 expected_error = "Unable to read packet number."; | 1418 expected_error = "Unable to read packet number."; |
1403 } | 1419 } |
1404 } | 1420 } |
1405 CheckProcessingFails( | 1421 CheckProcessingFails( |
1406 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | 1422 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, |
1407 expected_error, QUIC_INVALID_PACKET_HEADER); | 1423 expected_error, QUIC_INVALID_PACKET_HEADER); |
1408 } | 1424 } |
1409 } | 1425 } |
1410 | 1426 |
| 1427 TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) { |
| 1428 FLAGS_quic_packet_numbers_largest_received = true; |
| 1429 // Test the case when a packet is received from the past and future packet |
| 1430 // numbers are still calculated relative to the largest received packet. |
| 1431 QuicPacketHeader header; |
| 1432 header.public_header.connection_id = kConnectionId; |
| 1433 header.public_header.reset_flag = false; |
| 1434 header.public_header.version_flag = false; |
| 1435 header.fec_flag = false; |
| 1436 header.entropy_flag = false; |
| 1437 header.packet_number = kPacketNumber - 2; |
| 1438 |
| 1439 QuicPaddingFrame padding_frame; |
| 1440 QuicFrames frames; |
| 1441 frames.push_back(QuicFrame(padding_frame)); |
| 1442 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 1443 ASSERT_TRUE(data != nullptr); |
| 1444 |
| 1445 QuicEncryptedPacket encrypted(data->data(), data->length(), false); |
| 1446 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1447 ASSERT_TRUE(visitor_.header_.get()); |
| 1448 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1449 EXPECT_EQ(PACKET_6BYTE_PACKET_NUMBER, |
| 1450 visitor_.header_->public_header.packet_number_length); |
| 1451 EXPECT_EQ(kPacketNumber - 2, visitor_.header_->packet_number); |
| 1452 |
| 1453 // Receive a 1 byte packet number. |
| 1454 header.packet_number = kPacketNumber; |
| 1455 header.public_header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER; |
| 1456 data.reset(BuildDataPacket(header, frames)); |
| 1457 QuicEncryptedPacket encrypted1(data->data(), data->length(), false); |
| 1458 EXPECT_TRUE(framer_.ProcessPacket(encrypted1)); |
| 1459 ASSERT_TRUE(visitor_.header_.get()); |
| 1460 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1461 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
| 1462 visitor_.header_->public_header.packet_number_length); |
| 1463 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
| 1464 |
| 1465 // Process a 2 byte packet number 256 packets ago. |
| 1466 header.packet_number = kPacketNumber - 256; |
| 1467 header.public_header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER; |
| 1468 data.reset(BuildDataPacket(header, frames)); |
| 1469 QuicEncryptedPacket encrypted2(data->data(), data->length(), false); |
| 1470 EXPECT_TRUE(framer_.ProcessPacket(encrypted2)); |
| 1471 ASSERT_TRUE(visitor_.header_.get()); |
| 1472 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1473 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, |
| 1474 visitor_.header_->public_header.packet_number_length); |
| 1475 EXPECT_EQ(kPacketNumber - 256, visitor_.header_->packet_number); |
| 1476 |
| 1477 // Process another 1 byte packet number and ensure it works. |
| 1478 header.packet_number = kPacketNumber - 1; |
| 1479 header.public_header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER; |
| 1480 data.reset(BuildDataPacket(header, frames)); |
| 1481 QuicEncryptedPacket encrypted3(data->data(), data->length(), false); |
| 1482 EXPECT_TRUE(framer_.ProcessPacket(encrypted3)); |
| 1483 ASSERT_TRUE(visitor_.header_.get()); |
| 1484 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1485 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
| 1486 visitor_.header_->public_header.packet_number_length); |
| 1487 EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number); |
| 1488 } |
| 1489 |
1411 TEST_P(QuicFramerTest, InvalidPublicFlag) { | 1490 TEST_P(QuicFramerTest, InvalidPublicFlag) { |
1412 if (framer_.version() > QUIC_VERSION_33) { | 1491 if (framer_.version() > QUIC_VERSION_33) { |
1413 return; | 1492 return; |
1414 } | 1493 } |
1415 // clang-format off | 1494 // clang-format off |
1416 unsigned char packet[] = { | 1495 unsigned char packet[] = { |
1417 // public flags: all flags set but the public reset flag and version flag. | 1496 // public flags: all flags set but the public reset flag and version flag. |
1418 0xF8, | 1497 0xF8, |
1419 // connection_id | 1498 // connection_id |
1420 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 1499 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
(...skipping 5767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7188 'o', ' ', 'w', 'o', | 7267 'o', ' ', 'w', 'o', |
7189 'r', 'l', 'd', '!', | 7268 'r', 'l', 'd', '!', |
7190 }; | 7269 }; |
7191 // clang-format on | 7270 // clang-format on |
7192 | 7271 |
7193 QuicFramerFuzzFunc(packet, arraysize(packet)); | 7272 QuicFramerFuzzFunc(packet, arraysize(packet)); |
7194 } | 7273 } |
7195 | 7274 |
7196 } // namespace test | 7275 } // namespace test |
7197 } // namespace net | 7276 } // namespace net |
OLD | NEW |