| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "net/quic/quic_framer.h" | |
| 6 | |
| 7 #include "base/containers/hash_tables.h" | |
| 8 #include "base/stl_util.h" | |
| 9 #include "net/quic/crypto/crypto_framer.h" | |
| 10 #include "net/quic/crypto/crypto_handshake_message.h" | |
| 11 #include "net/quic/crypto/crypto_protocol.h" | |
| 12 #include "net/quic/crypto/quic_decrypter.h" | |
| 13 #include "net/quic/crypto/quic_encrypter.h" | |
| 14 #include "net/quic/quic_data_reader.h" | |
| 15 #include "net/quic/quic_data_writer.h" | |
| 16 #include "net/quic/quic_flags.h" | |
| 17 #include "net/quic/quic_socket_address_coder.h" | |
| 18 | |
| 19 using base::StringPiece; | |
| 20 using std::map; | |
| 21 using std::max; | |
| 22 using std::min; | |
| 23 using std::numeric_limits; | |
| 24 using std::string; | |
| 25 | |
| 26 namespace net { | |
| 27 | |
| 28 namespace { | |
| 29 | |
| 30 // Mask to select the lowest 48 bits of a sequence number. | |
| 31 const QuicPacketSequenceNumber k6ByteSequenceNumberMask = | |
| 32 GG_UINT64_C(0x0000FFFFFFFFFFFF); | |
| 33 const QuicPacketSequenceNumber k4ByteSequenceNumberMask = | |
| 34 GG_UINT64_C(0x00000000FFFFFFFF); | |
| 35 const QuicPacketSequenceNumber k2ByteSequenceNumberMask = | |
| 36 GG_UINT64_C(0x000000000000FFFF); | |
| 37 const QuicPacketSequenceNumber k1ByteSequenceNumberMask = | |
| 38 GG_UINT64_C(0x00000000000000FF); | |
| 39 | |
| 40 const QuicConnectionId k1ByteConnectionIdMask = GG_UINT64_C(0x00000000000000FF); | |
| 41 const QuicConnectionId k4ByteConnectionIdMask = GG_UINT64_C(0x00000000FFFFFFFF); | |
| 42 | |
| 43 // Number of bits the sequence number length bits are shifted from the right | |
| 44 // edge of the public header. | |
| 45 const uint8 kPublicHeaderSequenceNumberShift = 4; | |
| 46 | |
| 47 // New Frame Types, QUIC v. >= 10: | |
| 48 // There are two interpretations for the Frame Type byte in the QUIC protocol, | |
| 49 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. | |
| 50 // | |
| 51 // Regular Frame Types use the Frame Type byte simply. Currently defined | |
| 52 // Regular Frame Types are: | |
| 53 // Padding : 0b 00000000 (0x00) | |
| 54 // ResetStream : 0b 00000001 (0x01) | |
| 55 // ConnectionClose : 0b 00000010 (0x02) | |
| 56 // GoAway : 0b 00000011 (0x03) | |
| 57 // WindowUpdate : 0b 00000100 (0x04) | |
| 58 // Blocked : 0b 00000101 (0x05) | |
| 59 // | |
| 60 // Special Frame Types encode both a Frame Type and corresponding flags | |
| 61 // all in the Frame Type byte. Currently defined Special Frame Types are: | |
| 62 // Stream : 0b 1xxxxxxx | |
| 63 // Ack : 0b 01xxxxxx | |
| 64 // | |
| 65 // Semantics of the flag bits above (the x bits) depends on the frame type. | |
| 66 | |
| 67 // Masks to determine if the frame type is a special use | |
| 68 // and for specific special frame types. | |
| 69 const uint8 kQuicFrameTypeSpecialMask = 0xE0; // 0b 11100000 | |
| 70 const uint8 kQuicFrameTypeStreamMask = 0x80; | |
| 71 const uint8 kQuicFrameTypeAckMask = 0x40; | |
| 72 | |
| 73 // Stream frame relative shifts and masks for interpreting the stream flags. | |
| 74 // StreamID may be 1, 2, 3, or 4 bytes. | |
| 75 const uint8 kQuicStreamIdShift = 2; | |
| 76 const uint8 kQuicStreamIDLengthMask = 0x03; | |
| 77 | |
| 78 // Offset may be 0, 2, 3, 4, 5, 6, 7, 8 bytes. | |
| 79 const uint8 kQuicStreamOffsetShift = 3; | |
| 80 const uint8 kQuicStreamOffsetMask = 0x07; | |
| 81 | |
| 82 // Data length may be 0 or 2 bytes. | |
| 83 const uint8 kQuicStreamDataLengthShift = 1; | |
| 84 const uint8 kQuicStreamDataLengthMask = 0x01; | |
| 85 | |
| 86 // Fin bit may be set or not. | |
| 87 const uint8 kQuicStreamFinShift = 1; | |
| 88 const uint8 kQuicStreamFinMask = 0x01; | |
| 89 | |
| 90 // Sequence number size shift used in AckFrames. | |
| 91 const uint8 kQuicSequenceNumberLengthShift = 2; | |
| 92 | |
| 93 // Acks may be truncated. | |
| 94 const uint8 kQuicAckTruncatedShift = 1; | |
| 95 const uint8 kQuicAckTruncatedMask = 0x01; | |
| 96 | |
| 97 // Acks may not have any nacks. | |
| 98 const uint8 kQuicHasNacksMask = 0x01; | |
| 99 | |
| 100 // Returns the absolute value of the difference between |a| and |b|. | |
| 101 QuicPacketSequenceNumber Delta(QuicPacketSequenceNumber a, | |
| 102 QuicPacketSequenceNumber b) { | |
| 103 // Since these are unsigned numbers, we can't just return abs(a - b) | |
| 104 if (a < b) { | |
| 105 return b - a; | |
| 106 } | |
| 107 return a - b; | |
| 108 } | |
| 109 | |
| 110 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target, | |
| 111 QuicPacketSequenceNumber a, | |
| 112 QuicPacketSequenceNumber b) { | |
| 113 return (Delta(target, a) < Delta(target, b)) ? a : b; | |
| 114 } | |
| 115 | |
| 116 QuicSequenceNumberLength ReadSequenceNumberLength(uint8 flags) { | |
| 117 switch (flags & PACKET_FLAGS_6BYTE_SEQUENCE) { | |
| 118 case PACKET_FLAGS_6BYTE_SEQUENCE: | |
| 119 return PACKET_6BYTE_SEQUENCE_NUMBER; | |
| 120 case PACKET_FLAGS_4BYTE_SEQUENCE: | |
| 121 return PACKET_4BYTE_SEQUENCE_NUMBER; | |
| 122 case PACKET_FLAGS_2BYTE_SEQUENCE: | |
| 123 return PACKET_2BYTE_SEQUENCE_NUMBER; | |
| 124 case PACKET_FLAGS_1BYTE_SEQUENCE: | |
| 125 return PACKET_1BYTE_SEQUENCE_NUMBER; | |
| 126 default: | |
| 127 LOG(DFATAL) << "Unreachable case statement."; | |
| 128 return PACKET_6BYTE_SEQUENCE_NUMBER; | |
| 129 } | |
| 130 } | |
| 131 | |
| 132 } // namespace | |
| 133 | |
| 134 bool QuicFramerVisitorInterface::OnWindowUpdateFrame( | |
| 135 const QuicWindowUpdateFrame& frame) { | |
| 136 return true; | |
| 137 } | |
| 138 | |
| 139 bool QuicFramerVisitorInterface::OnBlockedFrame(const QuicBlockedFrame& frame) { | |
| 140 return true; | |
| 141 } | |
| 142 | |
| 143 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, | |
| 144 QuicTime creation_time, | |
| 145 bool is_server) | |
| 146 : visitor_(nullptr), | |
| 147 fec_builder_(nullptr), | |
| 148 entropy_calculator_(nullptr), | |
| 149 error_(QUIC_NO_ERROR), | |
| 150 last_sequence_number_(0), | |
| 151 last_serialized_connection_id_(0), | |
| 152 supported_versions_(supported_versions), | |
| 153 decrypter_level_(ENCRYPTION_NONE), | |
| 154 alternative_decrypter_level_(ENCRYPTION_NONE), | |
| 155 alternative_decrypter_latch_(false), | |
| 156 is_server_(is_server), | |
| 157 validate_flags_(true), | |
| 158 creation_time_(creation_time), | |
| 159 last_timestamp_(QuicTime::Delta::Zero()) { | |
| 160 DCHECK(!supported_versions.empty()); | |
| 161 quic_version_ = supported_versions_[0]; | |
| 162 decrypter_.reset(QuicDecrypter::Create(kNULL)); | |
| 163 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL)); | |
| 164 } | |
| 165 | |
| 166 QuicFramer::~QuicFramer() {} | |
| 167 | |
| 168 // static | |
| 169 size_t QuicFramer::GetMinStreamFrameSize(QuicStreamId stream_id, | |
| 170 QuicStreamOffset offset, | |
| 171 bool last_frame_in_packet, | |
| 172 InFecGroup is_in_fec_group) { | |
| 173 bool no_stream_frame_length = last_frame_in_packet && | |
| 174 is_in_fec_group == NOT_IN_FEC_GROUP; | |
| 175 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + | |
| 176 GetStreamOffsetSize(offset) + | |
| 177 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); | |
| 178 } | |
| 179 | |
| 180 // static | |
| 181 size_t QuicFramer::GetMinAckFrameSize( | |
| 182 QuicSequenceNumberLength sequence_number_length, | |
| 183 QuicSequenceNumberLength largest_observed_length) { | |
| 184 return kQuicFrameTypeSize + kQuicEntropyHashSize + | |
| 185 largest_observed_length + kQuicDeltaTimeLargestObservedSize; | |
| 186 } | |
| 187 | |
| 188 // static | |
| 189 size_t QuicFramer::GetStopWaitingFrameSize( | |
| 190 QuicSequenceNumberLength sequence_number_length) { | |
| 191 return kQuicFrameTypeSize + kQuicEntropyHashSize + | |
| 192 sequence_number_length; | |
| 193 } | |
| 194 | |
| 195 // static | |
| 196 size_t QuicFramer::GetMinRstStreamFrameSize() { | |
| 197 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + | |
| 198 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize + | |
| 199 kQuicErrorDetailsLengthSize; | |
| 200 } | |
| 201 | |
| 202 // static | |
| 203 size_t QuicFramer::GetMinConnectionCloseFrameSize() { | |
| 204 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize; | |
| 205 } | |
| 206 | |
| 207 // static | |
| 208 size_t QuicFramer::GetMinGoAwayFrameSize() { | |
| 209 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + | |
| 210 kQuicMaxStreamIdSize; | |
| 211 } | |
| 212 | |
| 213 // static | |
| 214 size_t QuicFramer::GetWindowUpdateFrameSize() { | |
| 215 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; | |
| 216 } | |
| 217 | |
| 218 // static | |
| 219 size_t QuicFramer::GetBlockedFrameSize() { | |
| 220 return kQuicFrameTypeSize + kQuicMaxStreamIdSize; | |
| 221 } | |
| 222 | |
| 223 // static | |
| 224 size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) { | |
| 225 // Sizes are 1 through 4 bytes. | |
| 226 for (int i = 1; i <= 4; ++i) { | |
| 227 stream_id >>= 8; | |
| 228 if (stream_id == 0) { | |
| 229 return i; | |
| 230 } | |
| 231 } | |
| 232 LOG(DFATAL) << "Failed to determine StreamIDSize."; | |
| 233 return 4; | |
| 234 } | |
| 235 | |
| 236 // static | |
| 237 size_t QuicFramer::GetStreamOffsetSize(QuicStreamOffset offset) { | |
| 238 // 0 is a special case. | |
| 239 if (offset == 0) { | |
| 240 return 0; | |
| 241 } | |
| 242 // 2 through 8 are the remaining sizes. | |
| 243 offset >>= 8; | |
| 244 for (int i = 2; i <= 8; ++i) { | |
| 245 offset >>= 8; | |
| 246 if (offset == 0) { | |
| 247 return i; | |
| 248 } | |
| 249 } | |
| 250 LOG(DFATAL) << "Failed to determine StreamOffsetSize."; | |
| 251 return 8; | |
| 252 } | |
| 253 | |
| 254 // static | |
| 255 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { | |
| 256 return kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + | |
| 257 number_versions * kQuicVersionSize; | |
| 258 } | |
| 259 | |
| 260 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { | |
| 261 for (size_t i = 0; i < supported_versions_.size(); ++i) { | |
| 262 if (version == supported_versions_[i]) { | |
| 263 return true; | |
| 264 } | |
| 265 } | |
| 266 return false; | |
| 267 } | |
| 268 | |
| 269 size_t QuicFramer::GetSerializedFrameLength( | |
| 270 const QuicFrame& frame, | |
| 271 size_t free_bytes, | |
| 272 bool first_frame, | |
| 273 bool last_frame, | |
| 274 InFecGroup is_in_fec_group, | |
| 275 QuicSequenceNumberLength sequence_number_length) { | |
| 276 if (frame.type == PADDING_FRAME) { | |
| 277 // PADDING implies end of packet. | |
| 278 return free_bytes; | |
| 279 } | |
| 280 size_t frame_len = | |
| 281 ComputeFrameLength(frame, last_frame, is_in_fec_group, | |
| 282 sequence_number_length); | |
| 283 if (frame_len <= free_bytes) { | |
| 284 // Frame fits within packet. Note that acks may be truncated. | |
| 285 return frame_len; | |
| 286 } | |
| 287 // Only truncate the first frame in a packet, so if subsequent ones go | |
| 288 // over, stop including more frames. | |
| 289 if (!first_frame) { | |
| 290 return 0; | |
| 291 } | |
| 292 bool can_truncate = frame.type == ACK_FRAME && | |
| 293 free_bytes >= GetMinAckFrameSize(PACKET_6BYTE_SEQUENCE_NUMBER, | |
| 294 PACKET_6BYTE_SEQUENCE_NUMBER); | |
| 295 if (can_truncate) { | |
| 296 // Truncate the frame so the packet will not exceed kMaxPacketSize. | |
| 297 // Note that we may not use every byte of the writer in this case. | |
| 298 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; | |
| 299 return free_bytes; | |
| 300 } | |
| 301 if (!FLAGS_quic_allow_oversized_packets_for_test) { | |
| 302 return 0; | |
| 303 } | |
| 304 LOG(DFATAL) << "Packet size too small to fit frame."; | |
| 305 return frame_len; | |
| 306 } | |
| 307 | |
| 308 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {} | |
| 309 | |
| 310 QuicFramer::AckFrameInfo::~AckFrameInfo() {} | |
| 311 | |
| 312 // static | |
| 313 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( | |
| 314 const QuicPacketHeader& header) { | |
| 315 return header.entropy_flag << (header.packet_sequence_number % 8); | |
| 316 } | |
| 317 | |
| 318 QuicPacket* QuicFramer::BuildDataPacket(const QuicPacketHeader& header, | |
| 319 const QuicFrames& frames, | |
| 320 char* buffer, | |
| 321 size_t packet_length) { | |
| 322 QuicDataWriter writer(packet_length, buffer); | |
| 323 if (!AppendPacketHeader(header, &writer)) { | |
| 324 LOG(DFATAL) << "AppendPacketHeader failed"; | |
| 325 return nullptr; | |
| 326 } | |
| 327 | |
| 328 size_t i = 0; | |
| 329 for (const QuicFrame& frame : frames) { | |
| 330 // Determine if we should write stream frame length in header. | |
| 331 const bool no_stream_frame_length = | |
| 332 (header.is_in_fec_group == NOT_IN_FEC_GROUP) && | |
| 333 (i == frames.size() - 1); | |
| 334 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { | |
| 335 LOG(DFATAL) << "AppendTypeByte failed"; | |
| 336 return nullptr; | |
| 337 } | |
| 338 | |
| 339 switch (frame.type) { | |
| 340 case PADDING_FRAME: | |
| 341 writer.WritePadding(); | |
| 342 break; | |
| 343 case STREAM_FRAME: | |
| 344 if (!AppendStreamFrame( | |
| 345 *frame.stream_frame, no_stream_frame_length, &writer)) { | |
| 346 LOG(DFATAL) << "AppendStreamFrame failed"; | |
| 347 return nullptr; | |
| 348 } | |
| 349 break; | |
| 350 case ACK_FRAME: | |
| 351 if (!AppendAckFrameAndTypeByte( | |
| 352 header, *frame.ack_frame, &writer)) { | |
| 353 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; | |
| 354 return nullptr; | |
| 355 } | |
| 356 break; | |
| 357 case STOP_WAITING_FRAME: | |
| 358 if (!AppendStopWaitingFrame( | |
| 359 header, *frame.stop_waiting_frame, &writer)) { | |
| 360 LOG(DFATAL) << "AppendStopWaitingFrame failed"; | |
| 361 return nullptr; | |
| 362 } | |
| 363 break; | |
| 364 case PING_FRAME: | |
| 365 // Ping has no payload. | |
| 366 break; | |
| 367 case RST_STREAM_FRAME: | |
| 368 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { | |
| 369 LOG(DFATAL) << "AppendRstStreamFrame failed"; | |
| 370 return nullptr; | |
| 371 } | |
| 372 break; | |
| 373 case CONNECTION_CLOSE_FRAME: | |
| 374 if (!AppendConnectionCloseFrame( | |
| 375 *frame.connection_close_frame, &writer)) { | |
| 376 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; | |
| 377 return nullptr; | |
| 378 } | |
| 379 break; | |
| 380 case GOAWAY_FRAME: | |
| 381 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) { | |
| 382 LOG(DFATAL) << "AppendGoAwayFrame failed"; | |
| 383 return nullptr; | |
| 384 } | |
| 385 break; | |
| 386 case WINDOW_UPDATE_FRAME: | |
| 387 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) { | |
| 388 LOG(DFATAL) << "AppendWindowUpdateFrame failed"; | |
| 389 return nullptr; | |
| 390 } | |
| 391 break; | |
| 392 case BLOCKED_FRAME: | |
| 393 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) { | |
| 394 LOG(DFATAL) << "AppendBlockedFrame failed"; | |
| 395 return nullptr; | |
| 396 } | |
| 397 break; | |
| 398 default: | |
| 399 RaiseError(QUIC_INVALID_FRAME_DATA); | |
| 400 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; | |
| 401 return nullptr; | |
| 402 } | |
| 403 ++i; | |
| 404 } | |
| 405 | |
| 406 QuicPacket* packet = | |
| 407 new QuicPacket(writer.data(), writer.length(), false, | |
| 408 header.public_header.connection_id_length, | |
| 409 header.public_header.version_flag, | |
| 410 header.public_header.sequence_number_length); | |
| 411 | |
| 412 if (fec_builder_) { | |
| 413 fec_builder_->OnBuiltFecProtectedPayload(header, | |
| 414 packet->FecProtectedData()); | |
| 415 } | |
| 416 | |
| 417 return packet; | |
| 418 } | |
| 419 | |
| 420 QuicPacket* QuicFramer::BuildFecPacket(const QuicPacketHeader& header, | |
| 421 const QuicFecData& fec) { | |
| 422 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); | |
| 423 DCHECK_NE(0u, header.fec_group); | |
| 424 size_t len = GetPacketHeaderSize(header); | |
| 425 len += fec.redundancy.length(); | |
| 426 | |
| 427 scoped_ptr<char[]> buffer(new char[len]); | |
| 428 QuicDataWriter writer(len, buffer.get()); | |
| 429 if (!AppendPacketHeader(header, &writer)) { | |
| 430 LOG(DFATAL) << "AppendPacketHeader failed"; | |
| 431 return nullptr; | |
| 432 } | |
| 433 | |
| 434 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { | |
| 435 LOG(DFATAL) << "Failed to add FEC"; | |
| 436 return nullptr; | |
| 437 } | |
| 438 | |
| 439 return new QuicPacket(buffer.release(), len, true, | |
| 440 header.public_header.connection_id_length, | |
| 441 header.public_header.version_flag, | |
| 442 header.public_header.sequence_number_length); | |
| 443 } | |
| 444 | |
| 445 // static | |
| 446 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( | |
| 447 const QuicPublicResetPacket& packet) { | |
| 448 DCHECK(packet.public_header.reset_flag); | |
| 449 | |
| 450 CryptoHandshakeMessage reset; | |
| 451 reset.set_tag(kPRST); | |
| 452 reset.SetValue(kRNON, packet.nonce_proof); | |
| 453 reset.SetValue(kRSEQ, packet.rejected_sequence_number); | |
| 454 if (!packet.client_address.address().empty()) { | |
| 455 // packet.client_address is non-empty. | |
| 456 QuicSocketAddressCoder address_coder(packet.client_address); | |
| 457 string serialized_address = address_coder.Encode(); | |
| 458 if (serialized_address.empty()) { | |
| 459 return nullptr; | |
| 460 } | |
| 461 reset.SetStringPiece(kCADR, serialized_address); | |
| 462 } | |
| 463 const QuicData& reset_serialized = reset.GetSerialized(); | |
| 464 | |
| 465 size_t len = | |
| 466 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); | |
| 467 scoped_ptr<char[]> buffer(new char[len]); | |
| 468 QuicDataWriter writer(len, buffer.get()); | |
| 469 | |
| 470 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | | |
| 471 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); | |
| 472 if (!writer.WriteUInt8(flags)) { | |
| 473 return nullptr; | |
| 474 } | |
| 475 | |
| 476 if (!writer.WriteUInt64(packet.public_header.connection_id)) { | |
| 477 return nullptr; | |
| 478 } | |
| 479 | |
| 480 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { | |
| 481 return nullptr; | |
| 482 } | |
| 483 | |
| 484 return new QuicEncryptedPacket(buffer.release(), len, true); | |
| 485 } | |
| 486 | |
| 487 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( | |
| 488 const QuicPacketPublicHeader& header, | |
| 489 const QuicVersionVector& supported_versions) { | |
| 490 DCHECK(header.version_flag); | |
| 491 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); | |
| 492 scoped_ptr<char[]> buffer(new char[len]); | |
| 493 QuicDataWriter writer(len, buffer.get()); | |
| 494 | |
| 495 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | | |
| 496 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); | |
| 497 if (!writer.WriteUInt8(flags)) { | |
| 498 return nullptr; | |
| 499 } | |
| 500 | |
| 501 if (!writer.WriteUInt64(header.connection_id)) { | |
| 502 return nullptr; | |
| 503 } | |
| 504 | |
| 505 for (size_t i = 0; i < supported_versions.size(); ++i) { | |
| 506 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { | |
| 507 return nullptr; | |
| 508 } | |
| 509 } | |
| 510 | |
| 511 return new QuicEncryptedPacket(buffer.release(), len, true); | |
| 512 } | |
| 513 | |
| 514 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | |
| 515 DCHECK(!reader_.get()); | |
| 516 reader_.reset(new QuicDataReader(packet.data(), packet.length())); | |
| 517 | |
| 518 visitor_->OnPacket(); | |
| 519 | |
| 520 // First parse the public header. | |
| 521 QuicPacketPublicHeader public_header; | |
| 522 if (!ProcessPublicHeader(&public_header)) { | |
| 523 DLOG(WARNING) << "Unable to process public header."; | |
| 524 DCHECK_NE("", detailed_error_); | |
| 525 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 526 } | |
| 527 | |
| 528 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { | |
| 529 // The visitor suppresses further processing of the packet. | |
| 530 reader_.reset(nullptr); | |
| 531 return true; | |
| 532 } | |
| 533 | |
| 534 if (is_server_ && public_header.version_flag && | |
| 535 public_header.versions[0] != quic_version_) { | |
| 536 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { | |
| 537 reader_.reset(nullptr); | |
| 538 return true; | |
| 539 } | |
| 540 } | |
| 541 | |
| 542 bool rv; | |
| 543 if (!is_server_ && public_header.version_flag) { | |
| 544 rv = ProcessVersionNegotiationPacket(&public_header); | |
| 545 } else if (public_header.reset_flag) { | |
| 546 rv = ProcessPublicResetPacket(public_header); | |
| 547 } else if (packet.length() <= kMaxPacketSize) { | |
| 548 char buffer[kMaxPacketSize]; | |
| 549 rv = ProcessDataPacket(public_header, packet, buffer, kMaxPacketSize); | |
| 550 } else { | |
| 551 scoped_ptr<char[]> large_buffer(new char[packet.length()]); | |
| 552 rv = ProcessDataPacket(public_header, packet, large_buffer.get(), | |
| 553 packet.length()); | |
| 554 LOG_IF(DFATAL, rv) << "QUIC should never successfully process packets " | |
| 555 << "larger than kMaxPacketSize. packet size:" | |
| 556 << packet.length(); | |
| 557 } | |
| 558 | |
| 559 reader_.reset(nullptr); | |
| 560 return rv; | |
| 561 } | |
| 562 | |
| 563 bool QuicFramer::ProcessVersionNegotiationPacket( | |
| 564 QuicPacketPublicHeader* public_header) { | |
| 565 DCHECK(!is_server_); | |
| 566 // Try reading at least once to raise error if the packet is invalid. | |
| 567 do { | |
| 568 QuicTag version; | |
| 569 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { | |
| 570 set_detailed_error("Unable to read supported version in negotiation."); | |
| 571 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); | |
| 572 } | |
| 573 public_header->versions.push_back(QuicTagToQuicVersion(version)); | |
| 574 } while (!reader_->IsDoneReading()); | |
| 575 | |
| 576 visitor_->OnVersionNegotiationPacket(*public_header); | |
| 577 return true; | |
| 578 } | |
| 579 | |
| 580 bool QuicFramer::ProcessDataPacket(const QuicPacketPublicHeader& public_header, | |
| 581 const QuicEncryptedPacket& packet, | |
| 582 char* decrypted_buffer, | |
| 583 size_t buffer_length) { | |
| 584 QuicPacketHeader header(public_header); | |
| 585 if (!ProcessPacketHeader(&header, packet, decrypted_buffer, buffer_length)) { | |
| 586 DLOG(WARNING) << "Unable to process data packet header."; | |
| 587 return false; | |
| 588 } | |
| 589 | |
| 590 if (!visitor_->OnPacketHeader(header)) { | |
| 591 // The visitor suppresses further processing of the packet. | |
| 592 return true; | |
| 593 } | |
| 594 | |
| 595 if (packet.length() > kMaxPacketSize) { | |
| 596 DLOG(WARNING) << "Packet too large: " << packet.length(); | |
| 597 return RaiseError(QUIC_PACKET_TOO_LARGE); | |
| 598 } | |
| 599 | |
| 600 // Handle the payload. | |
| 601 if (!header.fec_flag) { | |
| 602 if (header.is_in_fec_group == IN_FEC_GROUP) { | |
| 603 StringPiece payload = reader_->PeekRemainingPayload(); | |
| 604 visitor_->OnFecProtectedPayload(payload); | |
| 605 } | |
| 606 if (!ProcessFrameData(header)) { | |
| 607 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. | |
| 608 DLOG(WARNING) << "Unable to process frame data."; | |
| 609 return false; | |
| 610 } | |
| 611 } else { | |
| 612 QuicFecData fec_data; | |
| 613 fec_data.fec_group = header.fec_group; | |
| 614 fec_data.redundancy = reader_->ReadRemainingPayload(); | |
| 615 visitor_->OnFecData(fec_data); | |
| 616 } | |
| 617 | |
| 618 visitor_->OnPacketComplete(); | |
| 619 return true; | |
| 620 } | |
| 621 | |
| 622 bool QuicFramer::ProcessPublicResetPacket( | |
| 623 const QuicPacketPublicHeader& public_header) { | |
| 624 QuicPublicResetPacket packet(public_header); | |
| 625 | |
| 626 scoped_ptr<CryptoHandshakeMessage> reset( | |
| 627 CryptoFramer::ParseMessage(reader_->ReadRemainingPayload())); | |
| 628 if (!reset.get()) { | |
| 629 set_detailed_error("Unable to read reset message."); | |
| 630 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); | |
| 631 } | |
| 632 if (reset->tag() != kPRST) { | |
| 633 set_detailed_error("Incorrect message tag."); | |
| 634 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); | |
| 635 } | |
| 636 | |
| 637 if (reset->GetUint64(kRNON, &packet.nonce_proof) != QUIC_NO_ERROR) { | |
| 638 set_detailed_error("Unable to read nonce proof."); | |
| 639 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); | |
| 640 } | |
| 641 // TODO(satyamshekhar): validate nonce to protect against DoS. | |
| 642 | |
| 643 if (reset->GetUint64(kRSEQ, &packet.rejected_sequence_number) != | |
| 644 QUIC_NO_ERROR) { | |
| 645 set_detailed_error("Unable to read rejected sequence number."); | |
| 646 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); | |
| 647 } | |
| 648 | |
| 649 StringPiece address; | |
| 650 if (reset->GetStringPiece(kCADR, &address)) { | |
| 651 QuicSocketAddressCoder address_coder; | |
| 652 if (address_coder.Decode(address.data(), address.length())) { | |
| 653 packet.client_address = IPEndPoint(address_coder.ip(), | |
| 654 address_coder.port()); | |
| 655 } | |
| 656 } | |
| 657 | |
| 658 visitor_->OnPublicResetPacket(packet); | |
| 659 return true; | |
| 660 } | |
| 661 | |
| 662 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header, | |
| 663 StringPiece payload) { | |
| 664 DCHECK(!reader_.get()); | |
| 665 | |
| 666 visitor_->OnRevivedPacket(); | |
| 667 | |
| 668 header->entropy_hash = GetPacketEntropyHash(*header); | |
| 669 | |
| 670 if (!visitor_->OnPacketHeader(*header)) { | |
| 671 return true; | |
| 672 } | |
| 673 | |
| 674 if (payload.length() > kMaxPacketSize) { | |
| 675 set_detailed_error("Revived packet too large."); | |
| 676 return RaiseError(QUIC_PACKET_TOO_LARGE); | |
| 677 } | |
| 678 | |
| 679 reader_.reset(new QuicDataReader(payload.data(), payload.length())); | |
| 680 if (!ProcessFrameData(*header)) { | |
| 681 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. | |
| 682 DLOG(WARNING) << "Unable to process frame data."; | |
| 683 return false; | |
| 684 } | |
| 685 | |
| 686 visitor_->OnPacketComplete(); | |
| 687 reader_.reset(nullptr); | |
| 688 return true; | |
| 689 } | |
| 690 | |
| 691 bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header, | |
| 692 QuicDataWriter* writer) { | |
| 693 DVLOG(1) << "Appending header: " << header; | |
| 694 DCHECK(header.fec_group > 0 || header.is_in_fec_group == NOT_IN_FEC_GROUP); | |
| 695 uint8 public_flags = 0; | |
| 696 if (header.public_header.reset_flag) { | |
| 697 public_flags |= PACKET_PUBLIC_FLAGS_RST; | |
| 698 } | |
| 699 if (header.public_header.version_flag) { | |
| 700 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; | |
| 701 } | |
| 702 | |
| 703 public_flags |= | |
| 704 GetSequenceNumberFlags(header.public_header.sequence_number_length) | |
| 705 << kPublicHeaderSequenceNumberShift; | |
| 706 | |
| 707 switch (header.public_header.connection_id_length) { | |
| 708 case PACKET_0BYTE_CONNECTION_ID: | |
| 709 if (!writer->WriteUInt8( | |
| 710 public_flags | PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) { | |
| 711 return false; | |
| 712 } | |
| 713 break; | |
| 714 case PACKET_1BYTE_CONNECTION_ID: | |
| 715 if (!writer->WriteUInt8( | |
| 716 public_flags | PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID)) { | |
| 717 return false; | |
| 718 } | |
| 719 if (!writer->WriteUInt8( | |
| 720 header.public_header.connection_id & k1ByteConnectionIdMask)) { | |
| 721 return false; | |
| 722 } | |
| 723 break; | |
| 724 case PACKET_4BYTE_CONNECTION_ID: | |
| 725 if (!writer->WriteUInt8( | |
| 726 public_flags | PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID)) { | |
| 727 return false; | |
| 728 } | |
| 729 if (!writer->WriteUInt32( | |
| 730 header.public_header.connection_id & k4ByteConnectionIdMask)) { | |
| 731 return false; | |
| 732 } | |
| 733 break; | |
| 734 case PACKET_8BYTE_CONNECTION_ID: | |
| 735 if (!writer->WriteUInt8( | |
| 736 public_flags | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID)) { | |
| 737 return false; | |
| 738 } | |
| 739 if (!writer->WriteUInt64(header.public_header.connection_id)) { | |
| 740 return false; | |
| 741 } | |
| 742 break; | |
| 743 } | |
| 744 last_serialized_connection_id_ = header.public_header.connection_id; | |
| 745 | |
| 746 if (header.public_header.version_flag) { | |
| 747 DCHECK(!is_server_); | |
| 748 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); | |
| 749 } | |
| 750 | |
| 751 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, | |
| 752 header.packet_sequence_number, writer)) { | |
| 753 return false; | |
| 754 } | |
| 755 | |
| 756 uint8 private_flags = 0; | |
| 757 if (header.entropy_flag) { | |
| 758 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY; | |
| 759 } | |
| 760 if (header.is_in_fec_group == IN_FEC_GROUP) { | |
| 761 private_flags |= PACKET_PRIVATE_FLAGS_FEC_GROUP; | |
| 762 } | |
| 763 if (header.fec_flag) { | |
| 764 private_flags |= PACKET_PRIVATE_FLAGS_FEC; | |
| 765 } | |
| 766 if (!writer->WriteUInt8(private_flags)) { | |
| 767 return false; | |
| 768 } | |
| 769 | |
| 770 // The FEC group number is the sequence number of the first fec | |
| 771 // protected packet, or 0 if this packet is not protected. | |
| 772 if (header.is_in_fec_group == IN_FEC_GROUP) { | |
| 773 DCHECK_LE(header.fec_group, header.packet_sequence_number); | |
| 774 DCHECK_LT(header.packet_sequence_number - header.fec_group, 255u); | |
| 775 // Offset from the current packet sequence number to the first fec | |
| 776 // protected packet. | |
| 777 uint8 first_fec_protected_packet_offset = | |
| 778 static_cast<uint8>(header.packet_sequence_number - header.fec_group); | |
| 779 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) { | |
| 780 return false; | |
| 781 } | |
| 782 } | |
| 783 | |
| 784 return true; | |
| 785 } | |
| 786 | |
| 787 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( | |
| 788 uint32 time_delta_us) { | |
| 789 // The new time_delta might have wrapped to the next epoch, or it | |
| 790 // might have reverse wrapped to the previous epoch, or it might | |
| 791 // remain in the same epoch. Select the time closest to the previous | |
| 792 // time. | |
| 793 // | |
| 794 // epoch_delta is the delta between epochs. A delta is 4 bytes of | |
| 795 // microseconds. | |
| 796 const uint64 epoch_delta = GG_UINT64_C(1) << 32; | |
| 797 uint64 epoch = last_timestamp_.ToMicroseconds() & ~(epoch_delta - 1); | |
| 798 // Wrapping is safe here because a wrapped value will not be ClosestTo below. | |
| 799 uint64 prev_epoch = epoch - epoch_delta; | |
| 800 uint64 next_epoch = epoch + epoch_delta; | |
| 801 | |
| 802 uint64 time = ClosestTo(last_timestamp_.ToMicroseconds(), | |
| 803 epoch + time_delta_us, | |
| 804 ClosestTo(last_timestamp_.ToMicroseconds(), | |
| 805 prev_epoch + time_delta_us, | |
| 806 next_epoch + time_delta_us)); | |
| 807 | |
| 808 return QuicTime::Delta::FromMicroseconds(time); | |
| 809 } | |
| 810 | |
| 811 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire( | |
| 812 QuicSequenceNumberLength sequence_number_length, | |
| 813 QuicPacketSequenceNumber packet_sequence_number) const { | |
| 814 // The new sequence number might have wrapped to the next epoch, or | |
| 815 // it might have reverse wrapped to the previous epoch, or it might | |
| 816 // remain in the same epoch. Select the sequence number closest to the | |
| 817 // next expected sequence number, the previous sequence number plus 1. | |
| 818 | |
| 819 // epoch_delta is the delta between epochs the sequence number was serialized | |
| 820 // with, so the correct value is likely the same epoch as the last sequence | |
| 821 // number or an adjacent epoch. | |
| 822 const QuicPacketSequenceNumber epoch_delta = | |
| 823 GG_UINT64_C(1) << (8 * sequence_number_length); | |
| 824 QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1; | |
| 825 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1); | |
| 826 QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta; | |
| 827 QuicPacketSequenceNumber next_epoch = epoch + epoch_delta; | |
| 828 | |
| 829 return ClosestTo(next_sequence_number, | |
| 830 epoch + packet_sequence_number, | |
| 831 ClosestTo(next_sequence_number, | |
| 832 prev_epoch + packet_sequence_number, | |
| 833 next_epoch + packet_sequence_number)); | |
| 834 } | |
| 835 | |
| 836 bool QuicFramer::ProcessPublicHeader( | |
| 837 QuicPacketPublicHeader* public_header) { | |
| 838 uint8 public_flags; | |
| 839 if (!reader_->ReadBytes(&public_flags, 1)) { | |
| 840 set_detailed_error("Unable to read public flags."); | |
| 841 return false; | |
| 842 } | |
| 843 | |
| 844 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; | |
| 845 public_header->version_flag = | |
| 846 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; | |
| 847 | |
| 848 if (validate_flags_ && | |
| 849 !public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) { | |
| 850 set_detailed_error("Illegal public flags value."); | |
| 851 return false; | |
| 852 } | |
| 853 | |
| 854 if (public_header->reset_flag && public_header->version_flag) { | |
| 855 set_detailed_error("Got version flag in reset packet"); | |
| 856 return false; | |
| 857 } | |
| 858 | |
| 859 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) { | |
| 860 case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID: | |
| 861 if (!reader_->ReadUInt64(&public_header->connection_id)) { | |
| 862 set_detailed_error("Unable to read ConnectionId."); | |
| 863 return false; | |
| 864 } | |
| 865 public_header->connection_id_length = PACKET_8BYTE_CONNECTION_ID; | |
| 866 break; | |
| 867 case PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID: | |
| 868 // If the connection_id is truncated, expect to read the last serialized | |
| 869 // connection_id. | |
| 870 if (!reader_->ReadBytes(&public_header->connection_id, | |
| 871 PACKET_4BYTE_CONNECTION_ID)) { | |
| 872 set_detailed_error("Unable to read ConnectionId."); | |
| 873 return false; | |
| 874 } | |
| 875 if (last_serialized_connection_id_ && | |
| 876 (public_header->connection_id & k4ByteConnectionIdMask) != | |
| 877 (last_serialized_connection_id_ & k4ByteConnectionIdMask)) { | |
| 878 set_detailed_error("Truncated 4 byte ConnectionId does not match " | |
| 879 "previous connection_id."); | |
| 880 return false; | |
| 881 } | |
| 882 public_header->connection_id_length = PACKET_4BYTE_CONNECTION_ID; | |
| 883 public_header->connection_id = last_serialized_connection_id_; | |
| 884 break; | |
| 885 case PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID: | |
| 886 if (!reader_->ReadBytes(&public_header->connection_id, | |
| 887 PACKET_1BYTE_CONNECTION_ID)) { | |
| 888 set_detailed_error("Unable to read ConnectionId."); | |
| 889 return false; | |
| 890 } | |
| 891 if (last_serialized_connection_id_ && | |
| 892 (public_header->connection_id & k1ByteConnectionIdMask) != | |
| 893 (last_serialized_connection_id_ & k1ByteConnectionIdMask)) { | |
| 894 set_detailed_error("Truncated 1 byte ConnectionId does not match " | |
| 895 "previous connection_id."); | |
| 896 return false; | |
| 897 } | |
| 898 public_header->connection_id_length = PACKET_1BYTE_CONNECTION_ID; | |
| 899 public_header->connection_id = last_serialized_connection_id_; | |
| 900 break; | |
| 901 case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID: | |
| 902 public_header->connection_id_length = PACKET_0BYTE_CONNECTION_ID; | |
| 903 public_header->connection_id = last_serialized_connection_id_; | |
| 904 break; | |
| 905 } | |
| 906 | |
| 907 public_header->sequence_number_length = | |
| 908 ReadSequenceNumberLength( | |
| 909 public_flags >> kPublicHeaderSequenceNumberShift); | |
| 910 | |
| 911 // Read the version only if the packet is from the client. | |
| 912 // version flag from the server means version negotiation packet. | |
| 913 if (public_header->version_flag && is_server_) { | |
| 914 QuicTag version_tag; | |
| 915 if (!reader_->ReadUInt32(&version_tag)) { | |
| 916 set_detailed_error("Unable to read protocol version."); | |
| 917 return false; | |
| 918 } | |
| 919 | |
| 920 // If the version from the new packet is the same as the version of this | |
| 921 // framer, then the public flags should be set to something we understand. | |
| 922 // If not, this raises an error. | |
| 923 QuicVersion version = QuicTagToQuicVersion(version_tag); | |
| 924 if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) { | |
| 925 set_detailed_error("Illegal public flags value."); | |
| 926 return false; | |
| 927 } | |
| 928 public_header->versions.push_back(version); | |
| 929 } | |
| 930 return true; | |
| 931 } | |
| 932 | |
| 933 // static | |
| 934 QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength( | |
| 935 QuicPacketSequenceNumber sequence_number) { | |
| 936 if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) { | |
| 937 return PACKET_1BYTE_SEQUENCE_NUMBER; | |
| 938 } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) { | |
| 939 return PACKET_2BYTE_SEQUENCE_NUMBER; | |
| 940 } else if (sequence_number < | |
| 941 GG_UINT64_C(1) << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) { | |
| 942 return PACKET_4BYTE_SEQUENCE_NUMBER; | |
| 943 } else { | |
| 944 return PACKET_6BYTE_SEQUENCE_NUMBER; | |
| 945 } | |
| 946 } | |
| 947 | |
| 948 // static | |
| 949 uint8 QuicFramer::GetSequenceNumberFlags( | |
| 950 QuicSequenceNumberLength sequence_number_length) { | |
| 951 switch (sequence_number_length) { | |
| 952 case PACKET_1BYTE_SEQUENCE_NUMBER: | |
| 953 return PACKET_FLAGS_1BYTE_SEQUENCE; | |
| 954 case PACKET_2BYTE_SEQUENCE_NUMBER: | |
| 955 return PACKET_FLAGS_2BYTE_SEQUENCE; | |
| 956 case PACKET_4BYTE_SEQUENCE_NUMBER: | |
| 957 return PACKET_FLAGS_4BYTE_SEQUENCE; | |
| 958 case PACKET_6BYTE_SEQUENCE_NUMBER: | |
| 959 return PACKET_FLAGS_6BYTE_SEQUENCE; | |
| 960 default: | |
| 961 LOG(DFATAL) << "Unreachable case statement."; | |
| 962 return PACKET_FLAGS_6BYTE_SEQUENCE; | |
| 963 } | |
| 964 } | |
| 965 | |
| 966 // static | |
| 967 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( | |
| 968 const QuicAckFrame& frame) { | |
| 969 AckFrameInfo ack_info; | |
| 970 if (frame.missing_packets.empty()) { | |
| 971 return ack_info; | |
| 972 } | |
| 973 DCHECK_GE(frame.largest_observed, *frame.missing_packets.rbegin()); | |
| 974 size_t cur_range_length = 0; | |
| 975 SequenceNumberSet::const_iterator iter = frame.missing_packets.begin(); | |
| 976 QuicPacketSequenceNumber last_missing = *iter; | |
| 977 ++iter; | |
| 978 for (; iter != frame.missing_packets.end(); ++iter) { | |
| 979 if (cur_range_length < numeric_limits<uint8>::max() && | |
| 980 *iter == (last_missing + 1)) { | |
| 981 ++cur_range_length; | |
| 982 } else { | |
| 983 ack_info.nack_ranges[last_missing - cur_range_length] = | |
| 984 static_cast<uint8>(cur_range_length); | |
| 985 cur_range_length = 0; | |
| 986 } | |
| 987 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); | |
| 988 last_missing = *iter; | |
| 989 } | |
| 990 // Include the last nack range. | |
| 991 ack_info.nack_ranges[last_missing - cur_range_length] = | |
| 992 static_cast<uint8>(cur_range_length); | |
| 993 // Include the range to the largest observed. | |
| 994 ack_info.max_delta = | |
| 995 max(ack_info.max_delta, frame.largest_observed - last_missing); | |
| 996 return ack_info; | |
| 997 } | |
| 998 | |
| 999 bool QuicFramer::ProcessPacketHeader(QuicPacketHeader* header, | |
| 1000 const QuicEncryptedPacket& packet, | |
| 1001 char* decrypted_buffer, | |
| 1002 size_t buffer_length) { | |
| 1003 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, | |
| 1004 &header->packet_sequence_number)) { | |
| 1005 set_detailed_error("Unable to read sequence number."); | |
| 1006 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 1007 } | |
| 1008 | |
| 1009 if (header->packet_sequence_number == 0u) { | |
| 1010 set_detailed_error("Packet sequence numbers cannot be 0."); | |
| 1011 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 1012 } | |
| 1013 | |
| 1014 if (!visitor_->OnUnauthenticatedHeader(*header)) { | |
| 1015 return false; | |
| 1016 } | |
| 1017 | |
| 1018 if (!DecryptPayload(*header, packet, decrypted_buffer, buffer_length)) { | |
| 1019 set_detailed_error("Unable to decrypt payload."); | |
| 1020 return RaiseError(QUIC_DECRYPTION_FAILURE); | |
| 1021 } | |
| 1022 | |
| 1023 uint8 private_flags; | |
| 1024 if (!reader_->ReadBytes(&private_flags, 1)) { | |
| 1025 set_detailed_error("Unable to read private flags."); | |
| 1026 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 1027 } | |
| 1028 | |
| 1029 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) { | |
| 1030 set_detailed_error("Illegal private flags value."); | |
| 1031 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 1032 } | |
| 1033 | |
| 1034 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0; | |
| 1035 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0; | |
| 1036 | |
| 1037 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) { | |
| 1038 header->is_in_fec_group = IN_FEC_GROUP; | |
| 1039 uint8 first_fec_protected_packet_offset; | |
| 1040 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) { | |
| 1041 set_detailed_error("Unable to read first fec protected packet offset."); | |
| 1042 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 1043 } | |
| 1044 if (first_fec_protected_packet_offset >= header->packet_sequence_number) { | |
| 1045 set_detailed_error("First fec protected packet offset must be less " | |
| 1046 "than the sequence number."); | |
| 1047 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 1048 } | |
| 1049 header->fec_group = | |
| 1050 header->packet_sequence_number - first_fec_protected_packet_offset; | |
| 1051 } | |
| 1052 | |
| 1053 header->entropy_hash = GetPacketEntropyHash(*header); | |
| 1054 // Set the last sequence number after we have decrypted the packet | |
| 1055 // so we are confident is not attacker controlled. | |
| 1056 last_sequence_number_ = header->packet_sequence_number; | |
| 1057 return true; | |
| 1058 } | |
| 1059 | |
| 1060 bool QuicFramer::ProcessPacketSequenceNumber( | |
| 1061 QuicSequenceNumberLength sequence_number_length, | |
| 1062 QuicPacketSequenceNumber* sequence_number) { | |
| 1063 QuicPacketSequenceNumber wire_sequence_number = 0u; | |
| 1064 if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) { | |
| 1065 return false; | |
| 1066 } | |
| 1067 | |
| 1068 // TODO(ianswett): Explore the usefulness of trying multiple sequence numbers | |
| 1069 // in case the first guess is incorrect. | |
| 1070 *sequence_number = | |
| 1071 CalculatePacketSequenceNumberFromWire(sequence_number_length, | |
| 1072 wire_sequence_number); | |
| 1073 return true; | |
| 1074 } | |
| 1075 | |
| 1076 bool QuicFramer::ProcessFrameData(const QuicPacketHeader& header) { | |
| 1077 if (reader_->IsDoneReading()) { | |
| 1078 set_detailed_error("Packet has no frames."); | |
| 1079 return RaiseError(QUIC_MISSING_PAYLOAD); | |
| 1080 } | |
| 1081 while (!reader_->IsDoneReading()) { | |
| 1082 uint8 frame_type; | |
| 1083 if (!reader_->ReadBytes(&frame_type, 1)) { | |
| 1084 set_detailed_error("Unable to read frame type."); | |
| 1085 return RaiseError(QUIC_INVALID_FRAME_DATA); | |
| 1086 } | |
| 1087 | |
| 1088 if (frame_type & kQuicFrameTypeSpecialMask) { | |
| 1089 // Stream Frame | |
| 1090 if (frame_type & kQuicFrameTypeStreamMask) { | |
| 1091 QuicStreamFrame frame; | |
| 1092 if (!ProcessStreamFrame(frame_type, &frame)) { | |
| 1093 return RaiseError(QUIC_INVALID_STREAM_DATA); | |
| 1094 } | |
| 1095 if (!visitor_->OnStreamFrame(frame)) { | |
| 1096 DVLOG(1) << "Visitor asked to stop further processing."; | |
| 1097 // Returning true since there was no parsing error. | |
| 1098 return true; | |
| 1099 } | |
| 1100 continue; | |
| 1101 } | |
| 1102 | |
| 1103 // Ack Frame | |
| 1104 if (frame_type & kQuicFrameTypeAckMask) { | |
| 1105 QuicAckFrame frame; | |
| 1106 if (!ProcessAckFrame(frame_type, &frame)) { | |
| 1107 return RaiseError(QUIC_INVALID_ACK_DATA); | |
| 1108 } | |
| 1109 if (!visitor_->OnAckFrame(frame)) { | |
| 1110 DVLOG(1) << "Visitor asked to stop further processing."; | |
| 1111 // Returning true since there was no parsing error. | |
| 1112 return true; | |
| 1113 } | |
| 1114 continue; | |
| 1115 } | |
| 1116 | |
| 1117 // This was a special frame type that did not match any | |
| 1118 // of the known ones. Error. | |
| 1119 set_detailed_error("Illegal frame type."); | |
| 1120 DLOG(WARNING) << "Illegal frame type: " | |
| 1121 << static_cast<int>(frame_type); | |
| 1122 return RaiseError(QUIC_INVALID_FRAME_DATA); | |
| 1123 } | |
| 1124 | |
| 1125 switch (frame_type) { | |
| 1126 case PADDING_FRAME: | |
| 1127 // We're done with the packet. | |
| 1128 return true; | |
| 1129 | |
| 1130 case RST_STREAM_FRAME: { | |
| 1131 QuicRstStreamFrame frame; | |
| 1132 if (!ProcessRstStreamFrame(&frame)) { | |
| 1133 return RaiseError(QUIC_INVALID_RST_STREAM_DATA); | |
| 1134 } | |
| 1135 if (!visitor_->OnRstStreamFrame(frame)) { | |
| 1136 DVLOG(1) << "Visitor asked to stop further processing."; | |
| 1137 // Returning true since there was no parsing error. | |
| 1138 return true; | |
| 1139 } | |
| 1140 continue; | |
| 1141 } | |
| 1142 | |
| 1143 case CONNECTION_CLOSE_FRAME: { | |
| 1144 QuicConnectionCloseFrame frame; | |
| 1145 if (!ProcessConnectionCloseFrame(&frame)) { | |
| 1146 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA); | |
| 1147 } | |
| 1148 | |
| 1149 if (!visitor_->OnConnectionCloseFrame(frame)) { | |
| 1150 DVLOG(1) << "Visitor asked to stop further processing."; | |
| 1151 // Returning true since there was no parsing error. | |
| 1152 return true; | |
| 1153 } | |
| 1154 continue; | |
| 1155 } | |
| 1156 | |
| 1157 case GOAWAY_FRAME: { | |
| 1158 QuicGoAwayFrame goaway_frame; | |
| 1159 if (!ProcessGoAwayFrame(&goaway_frame)) { | |
| 1160 return RaiseError(QUIC_INVALID_GOAWAY_DATA); | |
| 1161 } | |
| 1162 if (!visitor_->OnGoAwayFrame(goaway_frame)) { | |
| 1163 DVLOG(1) << "Visitor asked to stop further processing."; | |
| 1164 // Returning true since there was no parsing error. | |
| 1165 return true; | |
| 1166 } | |
| 1167 continue; | |
| 1168 } | |
| 1169 | |
| 1170 case WINDOW_UPDATE_FRAME: { | |
| 1171 QuicWindowUpdateFrame window_update_frame; | |
| 1172 if (!ProcessWindowUpdateFrame(&window_update_frame)) { | |
| 1173 return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA); | |
| 1174 } | |
| 1175 if (!visitor_->OnWindowUpdateFrame(window_update_frame)) { | |
| 1176 DVLOG(1) << "Visitor asked to stop further processing."; | |
| 1177 // Returning true since there was no parsing error. | |
| 1178 return true; | |
| 1179 } | |
| 1180 continue; | |
| 1181 } | |
| 1182 | |
| 1183 case BLOCKED_FRAME: { | |
| 1184 QuicBlockedFrame blocked_frame; | |
| 1185 if (!ProcessBlockedFrame(&blocked_frame)) { | |
| 1186 return RaiseError(QUIC_INVALID_BLOCKED_DATA); | |
| 1187 } | |
| 1188 if (!visitor_->OnBlockedFrame(blocked_frame)) { | |
| 1189 DVLOG(1) << "Visitor asked to stop further processing."; | |
| 1190 // Returning true since there was no parsing error. | |
| 1191 return true; | |
| 1192 } | |
| 1193 continue; | |
| 1194 } | |
| 1195 | |
| 1196 case STOP_WAITING_FRAME: { | |
| 1197 QuicStopWaitingFrame stop_waiting_frame; | |
| 1198 if (!ProcessStopWaitingFrame(header, &stop_waiting_frame)) { | |
| 1199 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA); | |
| 1200 } | |
| 1201 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) { | |
| 1202 DVLOG(1) << "Visitor asked to stop further processing."; | |
| 1203 // Returning true since there was no parsing error. | |
| 1204 return true; | |
| 1205 } | |
| 1206 continue; | |
| 1207 } | |
| 1208 case PING_FRAME: { | |
| 1209 // Ping has no payload. | |
| 1210 QuicPingFrame ping_frame; | |
| 1211 if (!visitor_->OnPingFrame(ping_frame)) { | |
| 1212 DVLOG(1) << "Visitor asked to stop further processing."; | |
| 1213 // Returning true since there was no parsing error. | |
| 1214 return true; | |
| 1215 } | |
| 1216 continue; | |
| 1217 } | |
| 1218 | |
| 1219 default: | |
| 1220 set_detailed_error("Illegal frame type."); | |
| 1221 DLOG(WARNING) << "Illegal frame type: " | |
| 1222 << static_cast<int>(frame_type); | |
| 1223 return RaiseError(QUIC_INVALID_FRAME_DATA); | |
| 1224 } | |
| 1225 } | |
| 1226 | |
| 1227 return true; | |
| 1228 } | |
| 1229 | |
| 1230 bool QuicFramer::ProcessStreamFrame(uint8 frame_type, | |
| 1231 QuicStreamFrame* frame) { | |
| 1232 uint8 stream_flags = frame_type; | |
| 1233 | |
| 1234 stream_flags &= ~kQuicFrameTypeStreamMask; | |
| 1235 | |
| 1236 // Read from right to left: StreamID, Offset, Data Length, Fin. | |
| 1237 const uint8 stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1; | |
| 1238 stream_flags >>= kQuicStreamIdShift; | |
| 1239 | |
| 1240 uint8 offset_length = (stream_flags & kQuicStreamOffsetMask); | |
| 1241 // There is no encoding for 1 byte, only 0 and 2 through 8. | |
| 1242 if (offset_length > 0) { | |
| 1243 offset_length += 1; | |
| 1244 } | |
| 1245 stream_flags >>= kQuicStreamOffsetShift; | |
| 1246 | |
| 1247 bool has_data_length = | |
| 1248 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; | |
| 1249 stream_flags >>= kQuicStreamDataLengthShift; | |
| 1250 | |
| 1251 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; | |
| 1252 | |
| 1253 frame->stream_id = 0; | |
| 1254 if (!reader_->ReadBytes(&frame->stream_id, stream_id_length)) { | |
| 1255 set_detailed_error("Unable to read stream_id."); | |
| 1256 return false; | |
| 1257 } | |
| 1258 | |
| 1259 frame->offset = 0; | |
| 1260 if (!reader_->ReadBytes(&frame->offset, offset_length)) { | |
| 1261 set_detailed_error("Unable to read offset."); | |
| 1262 return false; | |
| 1263 } | |
| 1264 | |
| 1265 StringPiece frame_data; | |
| 1266 if (has_data_length) { | |
| 1267 if (!reader_->ReadStringPiece16(&frame_data)) { | |
| 1268 set_detailed_error("Unable to read frame data."); | |
| 1269 return false; | |
| 1270 } | |
| 1271 } else { | |
| 1272 if (!reader_->ReadStringPiece(&frame_data, reader_->BytesRemaining())) { | |
| 1273 set_detailed_error("Unable to read frame data."); | |
| 1274 return false; | |
| 1275 } | |
| 1276 } | |
| 1277 // Point frame to the right data. | |
| 1278 frame->data.Clear(); | |
| 1279 if (!frame_data.empty()) { | |
| 1280 frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size()); | |
| 1281 } | |
| 1282 | |
| 1283 return true; | |
| 1284 } | |
| 1285 | |
| 1286 bool QuicFramer::ProcessAckFrame(uint8 frame_type, QuicAckFrame* ack_frame) { | |
| 1287 // Determine the three lengths from the frame type: largest observed length, | |
| 1288 // missing sequence number length, and missing range length. | |
| 1289 const QuicSequenceNumberLength missing_sequence_number_length = | |
| 1290 ReadSequenceNumberLength(frame_type); | |
| 1291 frame_type >>= kQuicSequenceNumberLengthShift; | |
| 1292 const QuicSequenceNumberLength largest_observed_sequence_number_length = | |
| 1293 ReadSequenceNumberLength(frame_type); | |
| 1294 frame_type >>= kQuicSequenceNumberLengthShift; | |
| 1295 ack_frame->is_truncated = frame_type & kQuicAckTruncatedMask; | |
| 1296 frame_type >>= kQuicAckTruncatedShift; | |
| 1297 bool has_nacks = frame_type & kQuicHasNacksMask; | |
| 1298 | |
| 1299 if (!reader_->ReadBytes(&ack_frame->entropy_hash, 1)) { | |
| 1300 set_detailed_error("Unable to read entropy hash for received packets."); | |
| 1301 return false; | |
| 1302 } | |
| 1303 | |
| 1304 if (!reader_->ReadBytes(&ack_frame->largest_observed, | |
| 1305 largest_observed_sequence_number_length)) { | |
| 1306 set_detailed_error("Unable to read largest observed."); | |
| 1307 return false; | |
| 1308 } | |
| 1309 | |
| 1310 uint64 delta_time_largest_observed_us; | |
| 1311 if (!reader_->ReadUFloat16(&delta_time_largest_observed_us)) { | |
| 1312 set_detailed_error("Unable to read delta time largest observed."); | |
| 1313 return false; | |
| 1314 } | |
| 1315 | |
| 1316 if (delta_time_largest_observed_us == kUFloat16MaxValue) { | |
| 1317 ack_frame->delta_time_largest_observed = QuicTime::Delta::Infinite(); | |
| 1318 } else { | |
| 1319 ack_frame->delta_time_largest_observed = | |
| 1320 QuicTime::Delta::FromMicroseconds(delta_time_largest_observed_us); | |
| 1321 } | |
| 1322 | |
| 1323 if (!ProcessTimestampsInAckFrame(ack_frame)) { | |
| 1324 return false; | |
| 1325 } | |
| 1326 | |
| 1327 if (!has_nacks) { | |
| 1328 return true; | |
| 1329 } | |
| 1330 | |
| 1331 uint8 num_missing_ranges; | |
| 1332 if (!reader_->ReadBytes(&num_missing_ranges, 1)) { | |
| 1333 set_detailed_error("Unable to read num missing packet ranges."); | |
| 1334 return false; | |
| 1335 } | |
| 1336 | |
| 1337 QuicPacketSequenceNumber last_sequence_number = ack_frame->largest_observed; | |
| 1338 for (size_t i = 0; i < num_missing_ranges; ++i) { | |
| 1339 QuicPacketSequenceNumber missing_delta = 0; | |
| 1340 if (!reader_->ReadBytes(&missing_delta, missing_sequence_number_length)) { | |
| 1341 set_detailed_error("Unable to read missing sequence number delta."); | |
| 1342 return false; | |
| 1343 } | |
| 1344 last_sequence_number -= missing_delta; | |
| 1345 QuicPacketSequenceNumber range_length = 0; | |
| 1346 if (!reader_->ReadBytes(&range_length, PACKET_1BYTE_SEQUENCE_NUMBER)) { | |
| 1347 set_detailed_error("Unable to read missing sequence number range."); | |
| 1348 return false; | |
| 1349 } | |
| 1350 for (size_t i = 0; i <= range_length; ++i) { | |
| 1351 ack_frame->missing_packets.insert(last_sequence_number - i); | |
| 1352 } | |
| 1353 // Subtract an extra 1 to ensure ranges are represented efficiently and | |
| 1354 // can't overlap by 1 sequence number. This allows a missing_delta of 0 | |
| 1355 // to represent an adjacent nack range. | |
| 1356 last_sequence_number -= (range_length + 1); | |
| 1357 } | |
| 1358 | |
| 1359 // Parse the revived packets list. | |
| 1360 uint8 num_revived_packets; | |
| 1361 if (!reader_->ReadBytes(&num_revived_packets, 1)) { | |
| 1362 set_detailed_error("Unable to read num revived packets."); | |
| 1363 return false; | |
| 1364 } | |
| 1365 | |
| 1366 for (size_t i = 0; i < num_revived_packets; ++i) { | |
| 1367 QuicPacketSequenceNumber revived_packet = 0; | |
| 1368 if (!reader_->ReadBytes(&revived_packet, | |
| 1369 largest_observed_sequence_number_length)) { | |
| 1370 set_detailed_error("Unable to read revived packet."); | |
| 1371 return false; | |
| 1372 } | |
| 1373 | |
| 1374 ack_frame->revived_packets.insert(revived_packet); | |
| 1375 } | |
| 1376 | |
| 1377 return true; | |
| 1378 } | |
| 1379 | |
| 1380 bool QuicFramer::ProcessTimestampsInAckFrame(QuicAckFrame* ack_frame) { | |
| 1381 if (!ack_frame->is_truncated) { | |
| 1382 uint8 num_received_packets; | |
| 1383 if (!reader_->ReadBytes(&num_received_packets, 1)) { | |
| 1384 set_detailed_error("Unable to read num received packets."); | |
| 1385 return false; | |
| 1386 } | |
| 1387 | |
| 1388 if (num_received_packets > 0) { | |
| 1389 uint8 delta_from_largest_observed; | |
| 1390 if (!reader_->ReadBytes(&delta_from_largest_observed, | |
| 1391 PACKET_1BYTE_SEQUENCE_NUMBER)) { | |
| 1392 set_detailed_error( | |
| 1393 "Unable to read sequence delta in received packets."); | |
| 1394 return false; | |
| 1395 } | |
| 1396 QuicPacketSequenceNumber seq_num = ack_frame->largest_observed - | |
| 1397 delta_from_largest_observed; | |
| 1398 | |
| 1399 // Time delta from the framer creation. | |
| 1400 uint32 time_delta_us; | |
| 1401 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { | |
| 1402 set_detailed_error("Unable to read time delta in received packets."); | |
| 1403 return false; | |
| 1404 } | |
| 1405 | |
| 1406 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); | |
| 1407 | |
| 1408 ack_frame->received_packet_times.push_back( | |
| 1409 std::make_pair(seq_num, creation_time_.Add(last_timestamp_))); | |
| 1410 | |
| 1411 for (uint8 i = 1; i < num_received_packets; ++i) { | |
| 1412 if (!reader_->ReadBytes(&delta_from_largest_observed, | |
| 1413 PACKET_1BYTE_SEQUENCE_NUMBER)) { | |
| 1414 set_detailed_error( | |
| 1415 "Unable to read sequence delta in received packets."); | |
| 1416 return false; | |
| 1417 } | |
| 1418 seq_num = ack_frame->largest_observed - delta_from_largest_observed; | |
| 1419 | |
| 1420 // Time delta from the previous timestamp. | |
| 1421 uint64 incremental_time_delta_us; | |
| 1422 if (!reader_->ReadUFloat16(&incremental_time_delta_us)) { | |
| 1423 set_detailed_error( | |
| 1424 "Unable to read incremental time delta in received packets."); | |
| 1425 return false; | |
| 1426 } | |
| 1427 | |
| 1428 last_timestamp_ = last_timestamp_.Add( | |
| 1429 QuicTime::Delta::FromMicroseconds(incremental_time_delta_us)); | |
| 1430 ack_frame->received_packet_times.push_back( | |
| 1431 std::make_pair(seq_num, creation_time_.Add(last_timestamp_))); | |
| 1432 } | |
| 1433 } | |
| 1434 } | |
| 1435 return true; | |
| 1436 } | |
| 1437 | |
| 1438 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header, | |
| 1439 QuicStopWaitingFrame* stop_waiting) { | |
| 1440 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) { | |
| 1441 set_detailed_error("Unable to read entropy hash for sent packets."); | |
| 1442 return false; | |
| 1443 } | |
| 1444 | |
| 1445 QuicPacketSequenceNumber least_unacked_delta = 0; | |
| 1446 if (!reader_->ReadBytes(&least_unacked_delta, | |
| 1447 header.public_header.sequence_number_length)) { | |
| 1448 set_detailed_error("Unable to read least unacked delta."); | |
| 1449 return false; | |
| 1450 } | |
| 1451 DCHECK_GE(header.packet_sequence_number, least_unacked_delta); | |
| 1452 stop_waiting->least_unacked = | |
| 1453 header.packet_sequence_number - least_unacked_delta; | |
| 1454 | |
| 1455 return true; | |
| 1456 } | |
| 1457 | |
| 1458 bool QuicFramer::ProcessRstStreamFrame(QuicRstStreamFrame* frame) { | |
| 1459 if (!reader_->ReadUInt32(&frame->stream_id)) { | |
| 1460 set_detailed_error("Unable to read stream_id."); | |
| 1461 return false; | |
| 1462 } | |
| 1463 | |
| 1464 if (!reader_->ReadUInt64(&frame->byte_offset)) { | |
| 1465 set_detailed_error("Unable to read rst stream sent byte offset."); | |
| 1466 return false; | |
| 1467 } | |
| 1468 | |
| 1469 uint32 error_code; | |
| 1470 if (!reader_->ReadUInt32(&error_code)) { | |
| 1471 set_detailed_error("Unable to read rst stream error code."); | |
| 1472 return false; | |
| 1473 } | |
| 1474 | |
| 1475 if (error_code >= QUIC_STREAM_LAST_ERROR) { | |
| 1476 set_detailed_error("Invalid rst stream error code."); | |
| 1477 return false; | |
| 1478 } | |
| 1479 | |
| 1480 frame->error_code = static_cast<QuicRstStreamErrorCode>(error_code); | |
| 1481 | |
| 1482 StringPiece error_details; | |
| 1483 if (!reader_->ReadStringPiece16(&error_details)) { | |
| 1484 set_detailed_error("Unable to read rst stream error details."); | |
| 1485 return false; | |
| 1486 } | |
| 1487 frame->error_details = error_details.as_string(); | |
| 1488 | |
| 1489 return true; | |
| 1490 } | |
| 1491 | |
| 1492 bool QuicFramer::ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame) { | |
| 1493 uint32 error_code; | |
| 1494 if (!reader_->ReadUInt32(&error_code)) { | |
| 1495 set_detailed_error("Unable to read connection close error code."); | |
| 1496 return false; | |
| 1497 } | |
| 1498 | |
| 1499 if (error_code >= QUIC_LAST_ERROR) { | |
| 1500 set_detailed_error("Invalid error code."); | |
| 1501 return false; | |
| 1502 } | |
| 1503 | |
| 1504 frame->error_code = static_cast<QuicErrorCode>(error_code); | |
| 1505 | |
| 1506 StringPiece error_details; | |
| 1507 if (!reader_->ReadStringPiece16(&error_details)) { | |
| 1508 set_detailed_error("Unable to read connection close error details."); | |
| 1509 return false; | |
| 1510 } | |
| 1511 frame->error_details = error_details.as_string(); | |
| 1512 | |
| 1513 return true; | |
| 1514 } | |
| 1515 | |
| 1516 bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) { | |
| 1517 uint32 error_code; | |
| 1518 if (!reader_->ReadUInt32(&error_code)) { | |
| 1519 set_detailed_error("Unable to read go away error code."); | |
| 1520 return false; | |
| 1521 } | |
| 1522 frame->error_code = static_cast<QuicErrorCode>(error_code); | |
| 1523 | |
| 1524 if (error_code >= QUIC_LAST_ERROR) { | |
| 1525 set_detailed_error("Invalid error code."); | |
| 1526 return false; | |
| 1527 } | |
| 1528 | |
| 1529 uint32 stream_id; | |
| 1530 if (!reader_->ReadUInt32(&stream_id)) { | |
| 1531 set_detailed_error("Unable to read last good stream id."); | |
| 1532 return false; | |
| 1533 } | |
| 1534 frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id); | |
| 1535 | |
| 1536 StringPiece reason_phrase; | |
| 1537 if (!reader_->ReadStringPiece16(&reason_phrase)) { | |
| 1538 set_detailed_error("Unable to read goaway reason."); | |
| 1539 return false; | |
| 1540 } | |
| 1541 frame->reason_phrase = reason_phrase.as_string(); | |
| 1542 | |
| 1543 return true; | |
| 1544 } | |
| 1545 | |
| 1546 bool QuicFramer::ProcessWindowUpdateFrame(QuicWindowUpdateFrame* frame) { | |
| 1547 if (!reader_->ReadUInt32(&frame->stream_id)) { | |
| 1548 set_detailed_error("Unable to read stream_id."); | |
| 1549 return false; | |
| 1550 } | |
| 1551 | |
| 1552 if (!reader_->ReadUInt64(&frame->byte_offset)) { | |
| 1553 set_detailed_error("Unable to read window byte_offset."); | |
| 1554 return false; | |
| 1555 } | |
| 1556 | |
| 1557 return true; | |
| 1558 } | |
| 1559 | |
| 1560 bool QuicFramer::ProcessBlockedFrame(QuicBlockedFrame* frame) { | |
| 1561 if (!reader_->ReadUInt32(&frame->stream_id)) { | |
| 1562 set_detailed_error("Unable to read stream_id."); | |
| 1563 return false; | |
| 1564 } | |
| 1565 | |
| 1566 return true; | |
| 1567 } | |
| 1568 | |
| 1569 // static | |
| 1570 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( | |
| 1571 const QuicEncryptedPacket& encrypted, | |
| 1572 QuicConnectionIdLength connection_id_length, | |
| 1573 bool includes_version, | |
| 1574 QuicSequenceNumberLength sequence_number_length) { | |
| 1575 return StringPiece( | |
| 1576 encrypted.data() + kStartOfHashData, GetStartOfEncryptedData( | |
| 1577 connection_id_length, includes_version, sequence_number_length) | |
| 1578 - kStartOfHashData); | |
| 1579 } | |
| 1580 | |
| 1581 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter, | |
| 1582 EncryptionLevel level) { | |
| 1583 DCHECK(alternative_decrypter_.get() == nullptr); | |
| 1584 DCHECK_GE(level, decrypter_level_); | |
| 1585 decrypter_.reset(decrypter); | |
| 1586 decrypter_level_ = level; | |
| 1587 } | |
| 1588 | |
| 1589 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, | |
| 1590 EncryptionLevel level, | |
| 1591 bool latch_once_used) { | |
| 1592 alternative_decrypter_.reset(decrypter); | |
| 1593 alternative_decrypter_level_ = level; | |
| 1594 alternative_decrypter_latch_ = latch_once_used; | |
| 1595 } | |
| 1596 | |
| 1597 const QuicDecrypter* QuicFramer::decrypter() const { | |
| 1598 return decrypter_.get(); | |
| 1599 } | |
| 1600 | |
| 1601 const QuicDecrypter* QuicFramer::alternative_decrypter() const { | |
| 1602 return alternative_decrypter_.get(); | |
| 1603 } | |
| 1604 | |
| 1605 void QuicFramer::SetEncrypter(EncryptionLevel level, | |
| 1606 QuicEncrypter* encrypter) { | |
| 1607 DCHECK_GE(level, 0); | |
| 1608 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); | |
| 1609 encrypter_[level].reset(encrypter); | |
| 1610 } | |
| 1611 | |
| 1612 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const { | |
| 1613 DCHECK_GE(level, 0); | |
| 1614 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); | |
| 1615 DCHECK(encrypter_[level].get() != nullptr); | |
| 1616 return encrypter_[level].get(); | |
| 1617 } | |
| 1618 | |
| 1619 QuicEncryptedPacket* QuicFramer::EncryptPacket( | |
| 1620 EncryptionLevel level, | |
| 1621 QuicPacketSequenceNumber packet_sequence_number, | |
| 1622 const QuicPacket& packet) { | |
| 1623 DCHECK(encrypter_[level].get() != nullptr); | |
| 1624 | |
| 1625 // Allocate a large enough buffer for the header and the encrypted data. | |
| 1626 const size_t encrypted_len = | |
| 1627 encrypter_[level]->GetCiphertextSize(packet.Plaintext().length()); | |
| 1628 StringPiece header_data = packet.BeforePlaintext(); | |
| 1629 const size_t len = header_data.length() + encrypted_len; | |
| 1630 // TODO(ianswett): Consider allocating this on the stack in the typical case. | |
| 1631 char* buffer = new char[len]; | |
| 1632 // Copy in the header, because the encrypter only populates the encrypted | |
| 1633 // plaintext content. | |
| 1634 memcpy(buffer, header_data.data(), header_data.length()); | |
| 1635 // Encrypt the plaintext into the buffer. | |
| 1636 size_t output_length = 0; | |
| 1637 if (!encrypter_[level]->EncryptPacket( | |
| 1638 packet_sequence_number, packet.AssociatedData(), packet.Plaintext(), | |
| 1639 buffer + header_data.length(), &output_length, encrypted_len)) { | |
| 1640 RaiseError(QUIC_ENCRYPTION_FAILURE); | |
| 1641 return nullptr; | |
| 1642 } | |
| 1643 | |
| 1644 return new QuicEncryptedPacket(buffer, header_data.length() + output_length, | |
| 1645 true); | |
| 1646 } | |
| 1647 | |
| 1648 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { | |
| 1649 // In order to keep the code simple, we don't have the current encryption | |
| 1650 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. | |
| 1651 size_t min_plaintext_size = ciphertext_size; | |
| 1652 | |
| 1653 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { | |
| 1654 if (encrypter_[i].get() != nullptr) { | |
| 1655 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size); | |
| 1656 if (size < min_plaintext_size) { | |
| 1657 min_plaintext_size = size; | |
| 1658 } | |
| 1659 } | |
| 1660 } | |
| 1661 | |
| 1662 return min_plaintext_size; | |
| 1663 } | |
| 1664 | |
| 1665 bool QuicFramer::DecryptPayload(const QuicPacketHeader& header, | |
| 1666 const QuicEncryptedPacket& packet, | |
| 1667 char* decrypted_buffer, | |
| 1668 size_t buffer_length) { | |
| 1669 StringPiece encrypted = reader_->ReadRemainingPayload(); | |
| 1670 DCHECK(decrypter_.get() != nullptr); | |
| 1671 const StringPiece& associated_data = GetAssociatedDataFromEncryptedPacket( | |
| 1672 packet, header.public_header.connection_id_length, | |
| 1673 header.public_header.version_flag, | |
| 1674 header.public_header.sequence_number_length); | |
| 1675 size_t decrypted_length = 0; | |
| 1676 bool success = decrypter_->DecryptPacket( | |
| 1677 header.packet_sequence_number, associated_data, encrypted, | |
| 1678 decrypted_buffer, &decrypted_length, buffer_length); | |
| 1679 if (success) { | |
| 1680 visitor_->OnDecryptedPacket(decrypter_level_); | |
| 1681 } else if (alternative_decrypter_.get() != nullptr) { | |
| 1682 success = alternative_decrypter_->DecryptPacket( | |
| 1683 header.packet_sequence_number, associated_data, encrypted, | |
| 1684 decrypted_buffer, &decrypted_length, buffer_length); | |
| 1685 if (success) { | |
| 1686 visitor_->OnDecryptedPacket(alternative_decrypter_level_); | |
| 1687 if (alternative_decrypter_latch_) { | |
| 1688 // Switch to the alternative decrypter and latch so that we cannot | |
| 1689 // switch back. | |
| 1690 decrypter_.reset(alternative_decrypter_.release()); | |
| 1691 decrypter_level_ = alternative_decrypter_level_; | |
| 1692 alternative_decrypter_level_ = ENCRYPTION_NONE; | |
| 1693 } else { | |
| 1694 // Switch the alternative decrypter so that we use it first next time. | |
| 1695 decrypter_.swap(alternative_decrypter_); | |
| 1696 EncryptionLevel level = alternative_decrypter_level_; | |
| 1697 alternative_decrypter_level_ = decrypter_level_; | |
| 1698 decrypter_level_ = level; | |
| 1699 } | |
| 1700 } | |
| 1701 } | |
| 1702 | |
| 1703 if (!success) { | |
| 1704 DLOG(WARNING) << "DecryptPacket failed for sequence_number:" | |
| 1705 << header.packet_sequence_number; | |
| 1706 return false; | |
| 1707 } | |
| 1708 | |
| 1709 reader_.reset(new QuicDataReader(decrypted_buffer, decrypted_length)); | |
| 1710 return true; | |
| 1711 } | |
| 1712 | |
| 1713 size_t QuicFramer::GetAckFrameSize( | |
| 1714 const QuicAckFrame& ack, | |
| 1715 QuicSequenceNumberLength sequence_number_length) { | |
| 1716 AckFrameInfo ack_info = GetAckFrameInfo(ack); | |
| 1717 QuicSequenceNumberLength largest_observed_length = | |
| 1718 GetMinSequenceNumberLength(ack.largest_observed); | |
| 1719 QuicSequenceNumberLength missing_sequence_number_length = | |
| 1720 GetMinSequenceNumberLength(ack_info.max_delta); | |
| 1721 | |
| 1722 size_t ack_size = GetMinAckFrameSize(sequence_number_length, | |
| 1723 largest_observed_length); | |
| 1724 if (!ack_info.nack_ranges.empty()) { | |
| 1725 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize; | |
| 1726 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * | |
| 1727 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | |
| 1728 ack_size += min(ack.revived_packets.size(), | |
| 1729 kMaxRevivedPackets) * largest_observed_length; | |
| 1730 } | |
| 1731 | |
| 1732 // In version 23, if the ack will be truncated due to too many nack ranges, | |
| 1733 // then do not include the number of timestamps (1 byte). | |
| 1734 if (ack_info.nack_ranges.size() <= kMaxNackRanges) { | |
| 1735 // 1 byte for the number of timestamps. | |
| 1736 ack_size += 1; | |
| 1737 if (ack.received_packet_times.size() > 0) { | |
| 1738 // 1 byte for sequence number, 4 bytes for timestamp for the first | |
| 1739 // packet. | |
| 1740 ack_size += 5; | |
| 1741 | |
| 1742 // 1 byte for sequence number, 2 bytes for timestamp for the other | |
| 1743 // packets. | |
| 1744 ack_size += 3 * (ack.received_packet_times.size() - 1); | |
| 1745 } | |
| 1746 } | |
| 1747 | |
| 1748 return ack_size; | |
| 1749 } | |
| 1750 | |
| 1751 size_t QuicFramer::ComputeFrameLength( | |
| 1752 const QuicFrame& frame, | |
| 1753 bool last_frame_in_packet, | |
| 1754 InFecGroup is_in_fec_group, | |
| 1755 QuicSequenceNumberLength sequence_number_length) { | |
| 1756 switch (frame.type) { | |
| 1757 case STREAM_FRAME: | |
| 1758 return GetMinStreamFrameSize(frame.stream_frame->stream_id, | |
| 1759 frame.stream_frame->offset, | |
| 1760 last_frame_in_packet, | |
| 1761 is_in_fec_group) + | |
| 1762 frame.stream_frame->data.TotalBufferSize(); | |
| 1763 case ACK_FRAME: { | |
| 1764 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); | |
| 1765 } | |
| 1766 case STOP_WAITING_FRAME: | |
| 1767 return GetStopWaitingFrameSize(sequence_number_length); | |
| 1768 case PING_FRAME: | |
| 1769 // Ping has no payload. | |
| 1770 return kQuicFrameTypeSize; | |
| 1771 case RST_STREAM_FRAME: | |
| 1772 return GetMinRstStreamFrameSize() + | |
| 1773 frame.rst_stream_frame->error_details.size(); | |
| 1774 case CONNECTION_CLOSE_FRAME: | |
| 1775 return GetMinConnectionCloseFrameSize() + | |
| 1776 frame.connection_close_frame->error_details.size(); | |
| 1777 case GOAWAY_FRAME: | |
| 1778 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); | |
| 1779 case WINDOW_UPDATE_FRAME: | |
| 1780 return GetWindowUpdateFrameSize(); | |
| 1781 case BLOCKED_FRAME: | |
| 1782 return GetBlockedFrameSize(); | |
| 1783 case PADDING_FRAME: | |
| 1784 DCHECK(false); | |
| 1785 return 0; | |
| 1786 case NUM_FRAME_TYPES: | |
| 1787 DCHECK(false); | |
| 1788 return 0; | |
| 1789 } | |
| 1790 | |
| 1791 // Not reachable, but some Chrome compilers can't figure that out. *sigh* | |
| 1792 DCHECK(false); | |
| 1793 return 0; | |
| 1794 } | |
| 1795 | |
| 1796 bool QuicFramer::AppendTypeByte(const QuicFrame& frame, | |
| 1797 bool no_stream_frame_length, | |
| 1798 QuicDataWriter* writer) { | |
| 1799 uint8 type_byte = 0; | |
| 1800 switch (frame.type) { | |
| 1801 case STREAM_FRAME: { | |
| 1802 if (frame.stream_frame == nullptr) { | |
| 1803 LOG(DFATAL) << "Failed to append STREAM frame with no stream_frame."; | |
| 1804 } | |
| 1805 // Fin bit. | |
| 1806 type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0; | |
| 1807 | |
| 1808 // Data Length bit. | |
| 1809 type_byte <<= kQuicStreamDataLengthShift; | |
| 1810 type_byte |= no_stream_frame_length ? 0: kQuicStreamDataLengthMask; | |
| 1811 | |
| 1812 // Offset 3 bits. | |
| 1813 type_byte <<= kQuicStreamOffsetShift; | |
| 1814 const size_t offset_len = GetStreamOffsetSize(frame.stream_frame->offset); | |
| 1815 if (offset_len > 0) { | |
| 1816 type_byte |= offset_len - 1; | |
| 1817 } | |
| 1818 | |
| 1819 // stream id 2 bits. | |
| 1820 type_byte <<= kQuicStreamIdShift; | |
| 1821 type_byte |= GetStreamIdSize(frame.stream_frame->stream_id) - 1; | |
| 1822 type_byte |= kQuicFrameTypeStreamMask; // Set Stream Frame Type to 1. | |
| 1823 break; | |
| 1824 } | |
| 1825 case ACK_FRAME: | |
| 1826 return true; | |
| 1827 default: | |
| 1828 type_byte = static_cast<uint8>(frame.type); | |
| 1829 break; | |
| 1830 } | |
| 1831 | |
| 1832 return writer->WriteUInt8(type_byte); | |
| 1833 } | |
| 1834 | |
| 1835 // static | |
| 1836 bool QuicFramer::AppendPacketSequenceNumber( | |
| 1837 QuicSequenceNumberLength sequence_number_length, | |
| 1838 QuicPacketSequenceNumber packet_sequence_number, | |
| 1839 QuicDataWriter* writer) { | |
| 1840 // Ensure the entire sequence number can be written. | |
| 1841 if (writer->capacity() - writer->length() < | |
| 1842 static_cast<size_t>(sequence_number_length)) { | |
| 1843 return false; | |
| 1844 } | |
| 1845 switch (sequence_number_length) { | |
| 1846 case PACKET_1BYTE_SEQUENCE_NUMBER: | |
| 1847 return writer->WriteUInt8( | |
| 1848 packet_sequence_number & k1ByteSequenceNumberMask); | |
| 1849 break; | |
| 1850 case PACKET_2BYTE_SEQUENCE_NUMBER: | |
| 1851 return writer->WriteUInt16( | |
| 1852 packet_sequence_number & k2ByteSequenceNumberMask); | |
| 1853 break; | |
| 1854 case PACKET_4BYTE_SEQUENCE_NUMBER: | |
| 1855 return writer->WriteUInt32( | |
| 1856 packet_sequence_number & k4ByteSequenceNumberMask); | |
| 1857 break; | |
| 1858 case PACKET_6BYTE_SEQUENCE_NUMBER: | |
| 1859 return writer->WriteUInt48( | |
| 1860 packet_sequence_number & k6ByteSequenceNumberMask); | |
| 1861 break; | |
| 1862 default: | |
| 1863 DCHECK(false) << "sequence_number_length: " << sequence_number_length; | |
| 1864 return false; | |
| 1865 } | |
| 1866 } | |
| 1867 | |
| 1868 bool QuicFramer::AppendStreamFrame( | |
| 1869 const QuicStreamFrame& frame, | |
| 1870 bool no_stream_frame_length, | |
| 1871 QuicDataWriter* writer) { | |
| 1872 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | |
| 1873 LOG(DFATAL) << "Writing stream id size failed."; | |
| 1874 return false; | |
| 1875 } | |
| 1876 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | |
| 1877 LOG(DFATAL) << "Writing offset size failed."; | |
| 1878 return false; | |
| 1879 } | |
| 1880 if (!no_stream_frame_length) { | |
| 1881 if ((frame.data.TotalBufferSize() > numeric_limits<uint16>::max()) || | |
| 1882 !writer->WriteUInt16( | |
| 1883 static_cast<uint16>(frame.data.TotalBufferSize()))) { | |
| 1884 LOG(DFATAL) << "Writing stream frame length failed"; | |
| 1885 return false; | |
| 1886 } | |
| 1887 } | |
| 1888 | |
| 1889 if (!writer->WriteIOVector(frame.data)) { | |
| 1890 LOG(DFATAL) << "Writing frame data failed."; | |
| 1891 return false; | |
| 1892 } | |
| 1893 return true; | |
| 1894 } | |
| 1895 | |
| 1896 // static | |
| 1897 void QuicFramer::set_version(const QuicVersion version) { | |
| 1898 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | |
| 1899 quic_version_ = version; | |
| 1900 } | |
| 1901 | |
| 1902 bool QuicFramer::AppendAckFrameAndTypeByte( | |
| 1903 const QuicPacketHeader& header, | |
| 1904 const QuicAckFrame& frame, | |
| 1905 QuicDataWriter* writer) { | |
| 1906 AckFrameInfo ack_info = GetAckFrameInfo(frame); | |
| 1907 QuicPacketSequenceNumber ack_largest_observed = frame.largest_observed; | |
| 1908 QuicSequenceNumberLength largest_observed_length = | |
| 1909 GetMinSequenceNumberLength(ack_largest_observed); | |
| 1910 QuicSequenceNumberLength missing_sequence_number_length = | |
| 1911 GetMinSequenceNumberLength(ack_info.max_delta); | |
| 1912 // Determine whether we need to truncate ranges. | |
| 1913 size_t available_range_bytes = writer->capacity() - writer->length() - | |
| 1914 kNumberOfRevivedPacketsSize - kNumberOfNackRangesSize - | |
| 1915 GetMinAckFrameSize(header.public_header.sequence_number_length, | |
| 1916 largest_observed_length); | |
| 1917 size_t max_num_ranges = available_range_bytes / | |
| 1918 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | |
| 1919 max_num_ranges = min(kMaxNackRanges, max_num_ranges); | |
| 1920 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; | |
| 1921 DVLOG_IF(1, truncated) << "Truncating ack from " | |
| 1922 << ack_info.nack_ranges.size() << " ranges to " | |
| 1923 << max_num_ranges; | |
| 1924 // Write out the type byte by setting the low order bits and doing shifts | |
| 1925 // to make room for the next bit flags to be set. | |
| 1926 // Whether there are any nacks. | |
| 1927 uint8 type_byte = ack_info.nack_ranges.empty() ? 0 : kQuicHasNacksMask; | |
| 1928 | |
| 1929 // truncating bit. | |
| 1930 type_byte <<= kQuicAckTruncatedShift; | |
| 1931 type_byte |= truncated ? kQuicAckTruncatedMask : 0; | |
| 1932 | |
| 1933 // Largest observed sequence number length. | |
| 1934 type_byte <<= kQuicSequenceNumberLengthShift; | |
| 1935 type_byte |= GetSequenceNumberFlags(largest_observed_length); | |
| 1936 | |
| 1937 // Missing sequence number length. | |
| 1938 type_byte <<= kQuicSequenceNumberLengthShift; | |
| 1939 type_byte |= GetSequenceNumberFlags(missing_sequence_number_length); | |
| 1940 | |
| 1941 type_byte |= kQuicFrameTypeAckMask; | |
| 1942 | |
| 1943 if (!writer->WriteUInt8(type_byte)) { | |
| 1944 return false; | |
| 1945 } | |
| 1946 | |
| 1947 QuicPacketEntropyHash ack_entropy_hash = frame.entropy_hash; | |
| 1948 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); | |
| 1949 if (truncated) { | |
| 1950 // Skip the nack ranges which the truncated ack won't include and set | |
| 1951 // a correct largest observed for the truncated ack. | |
| 1952 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); | |
| 1953 ++i) { | |
| 1954 ++ack_iter; | |
| 1955 } | |
| 1956 // If the last range is followed by acks, include them. | |
| 1957 // If the last range is followed by another range, specify the end of the | |
| 1958 // range as the largest_observed. | |
| 1959 ack_largest_observed = ack_iter->first - 1; | |
| 1960 // Also update the entropy so it matches the largest observed. | |
| 1961 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); | |
| 1962 ++ack_iter; | |
| 1963 } | |
| 1964 | |
| 1965 if (!writer->WriteUInt8(ack_entropy_hash)) { | |
| 1966 return false; | |
| 1967 } | |
| 1968 | |
| 1969 if (!AppendPacketSequenceNumber(largest_observed_length, | |
| 1970 ack_largest_observed, writer)) { | |
| 1971 return false; | |
| 1972 } | |
| 1973 | |
| 1974 uint64 delta_time_largest_observed_us = kUFloat16MaxValue; | |
| 1975 if (!frame.delta_time_largest_observed.IsInfinite()) { | |
| 1976 DCHECK_LE(0u, frame.delta_time_largest_observed.ToMicroseconds()); | |
| 1977 delta_time_largest_observed_us = | |
| 1978 frame.delta_time_largest_observed.ToMicroseconds(); | |
| 1979 } | |
| 1980 | |
| 1981 if (!writer->WriteUFloat16(delta_time_largest_observed_us)) { | |
| 1982 return false; | |
| 1983 } | |
| 1984 | |
| 1985 // Timestamp goes at the end of the required fields. | |
| 1986 if (!truncated) { | |
| 1987 if (!AppendTimestampToAckFrame(frame, writer)) { | |
| 1988 return false; | |
| 1989 } | |
| 1990 } | |
| 1991 | |
| 1992 if (ack_info.nack_ranges.empty()) { | |
| 1993 return true; | |
| 1994 } | |
| 1995 | |
| 1996 const uint8 num_missing_ranges = | |
| 1997 static_cast<uint8>(min(ack_info.nack_ranges.size(), max_num_ranges)); | |
| 1998 if (!writer->WriteBytes(&num_missing_ranges, 1)) { | |
| 1999 return false; | |
| 2000 } | |
| 2001 | |
| 2002 int num_ranges_written = 0; | |
| 2003 QuicPacketSequenceNumber last_sequence_written = ack_largest_observed; | |
| 2004 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { | |
| 2005 // Calculate the delta to the last number in the range. | |
| 2006 QuicPacketSequenceNumber missing_delta = | |
| 2007 last_sequence_written - (ack_iter->first + ack_iter->second); | |
| 2008 if (!AppendPacketSequenceNumber(missing_sequence_number_length, | |
| 2009 missing_delta, writer)) { | |
| 2010 return false; | |
| 2011 } | |
| 2012 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, | |
| 2013 ack_iter->second, writer)) { | |
| 2014 return false; | |
| 2015 } | |
| 2016 // Subtract 1 so a missing_delta of 0 means an adjacent range. | |
| 2017 last_sequence_written = ack_iter->first - 1; | |
| 2018 ++num_ranges_written; | |
| 2019 } | |
| 2020 DCHECK_EQ(num_missing_ranges, num_ranges_written); | |
| 2021 | |
| 2022 // Append revived packets. | |
| 2023 // If not all the revived packets fit, only mention the ones that do. | |
| 2024 uint8 num_revived_packets = | |
| 2025 static_cast<uint8>(min(frame.revived_packets.size(), kMaxRevivedPackets)); | |
| 2026 num_revived_packets = static_cast<uint8>(min( | |
| 2027 static_cast<size_t>(num_revived_packets), | |
| 2028 (writer->capacity() - writer->length()) / largest_observed_length)); | |
| 2029 if (!writer->WriteBytes(&num_revived_packets, 1)) { | |
| 2030 return false; | |
| 2031 } | |
| 2032 | |
| 2033 SequenceNumberSet::const_iterator iter = frame.revived_packets.begin(); | |
| 2034 for (int i = 0; i < num_revived_packets; ++i, ++iter) { | |
| 2035 LOG_IF(DFATAL, !ContainsKey(frame.missing_packets, *iter)); | |
| 2036 if (!AppendPacketSequenceNumber(largest_observed_length, | |
| 2037 *iter, writer)) { | |
| 2038 return false; | |
| 2039 } | |
| 2040 } | |
| 2041 | |
| 2042 return true; | |
| 2043 } | |
| 2044 | |
| 2045 bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame, | |
| 2046 QuicDataWriter* writer) { | |
| 2047 DCHECK_GE(version(), QUIC_VERSION_23); | |
| 2048 DCHECK_GE(numeric_limits<uint8>::max(), frame.received_packet_times.size()); | |
| 2049 // num_received_packets is only 1 byte. | |
| 2050 if (frame.received_packet_times.size() > numeric_limits<uint8>::max()) { | |
| 2051 return false; | |
| 2052 } | |
| 2053 | |
| 2054 uint8 num_received_packets = frame.received_packet_times.size(); | |
| 2055 | |
| 2056 if (!writer->WriteBytes(&num_received_packets, 1)) { | |
| 2057 return false; | |
| 2058 } | |
| 2059 if (num_received_packets == 0) { | |
| 2060 return true; | |
| 2061 } | |
| 2062 | |
| 2063 PacketTimeList::const_iterator it = frame.received_packet_times.begin(); | |
| 2064 QuicPacketSequenceNumber sequence_number = it->first; | |
| 2065 QuicPacketSequenceNumber delta_from_largest_observed = | |
| 2066 frame.largest_observed - sequence_number; | |
| 2067 | |
| 2068 DCHECK_GE(numeric_limits<uint8>::max(), delta_from_largest_observed); | |
| 2069 if (delta_from_largest_observed > numeric_limits<uint8>::max()) { | |
| 2070 return false; | |
| 2071 } | |
| 2072 | |
| 2073 if (!writer->WriteUInt8( | |
| 2074 delta_from_largest_observed & k1ByteSequenceNumberMask)) { | |
| 2075 return false; | |
| 2076 } | |
| 2077 | |
| 2078 // Use the lowest 4 bytes of the time delta from the creation_time_. | |
| 2079 const uint64 time_epoch_delta_us = GG_UINT64_C(1) << 32; | |
| 2080 uint32 time_delta_us = | |
| 2081 static_cast<uint32>(it->second.Subtract(creation_time_).ToMicroseconds() | |
| 2082 & (time_epoch_delta_us - 1)); | |
| 2083 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { | |
| 2084 return false; | |
| 2085 } | |
| 2086 | |
| 2087 QuicTime prev_time = it->second; | |
| 2088 | |
| 2089 for (++it; it != frame.received_packet_times.end(); ++it) { | |
| 2090 sequence_number = it->first; | |
| 2091 delta_from_largest_observed = frame.largest_observed - sequence_number; | |
| 2092 | |
| 2093 if (delta_from_largest_observed > numeric_limits<uint8>::max()) { | |
| 2094 return false; | |
| 2095 } | |
| 2096 | |
| 2097 if (!writer->WriteUInt8( | |
| 2098 delta_from_largest_observed & k1ByteSequenceNumberMask)) { | |
| 2099 return false; | |
| 2100 } | |
| 2101 | |
| 2102 uint64 time_delta_us = it->second.Subtract(prev_time).ToMicroseconds(); | |
| 2103 prev_time = it->second; | |
| 2104 if (!writer->WriteUFloat16(time_delta_us)) { | |
| 2105 return false; | |
| 2106 } | |
| 2107 } | |
| 2108 return true; | |
| 2109 } | |
| 2110 | |
| 2111 bool QuicFramer::AppendStopWaitingFrame( | |
| 2112 const QuicPacketHeader& header, | |
| 2113 const QuicStopWaitingFrame& frame, | |
| 2114 QuicDataWriter* writer) { | |
| 2115 DCHECK_GE(header.packet_sequence_number, frame.least_unacked); | |
| 2116 const QuicPacketSequenceNumber least_unacked_delta = | |
| 2117 header.packet_sequence_number - frame.least_unacked; | |
| 2118 const QuicPacketSequenceNumber length_shift = | |
| 2119 header.public_header.sequence_number_length * 8; | |
| 2120 if (!writer->WriteUInt8(frame.entropy_hash)) { | |
| 2121 LOG(DFATAL) << " hash failed"; | |
| 2122 return false; | |
| 2123 } | |
| 2124 | |
| 2125 if (least_unacked_delta >> length_shift > 0) { | |
| 2126 LOG(DFATAL) << "sequence_number_length " | |
| 2127 << header.public_header.sequence_number_length | |
| 2128 << " is too small for least_unacked_delta: " | |
| 2129 << least_unacked_delta; | |
| 2130 return false; | |
| 2131 } | |
| 2132 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, | |
| 2133 least_unacked_delta, writer)) { | |
| 2134 LOG(DFATAL) << " seq failed: " | |
| 2135 << header.public_header.sequence_number_length; | |
| 2136 return false; | |
| 2137 } | |
| 2138 | |
| 2139 return true; | |
| 2140 } | |
| 2141 | |
| 2142 bool QuicFramer::AppendRstStreamFrame( | |
| 2143 const QuicRstStreamFrame& frame, | |
| 2144 QuicDataWriter* writer) { | |
| 2145 if (!writer->WriteUInt32(frame.stream_id)) { | |
| 2146 return false; | |
| 2147 } | |
| 2148 | |
| 2149 if (!writer->WriteUInt64(frame.byte_offset)) { | |
| 2150 return false; | |
| 2151 } | |
| 2152 | |
| 2153 uint32 error_code = static_cast<uint32>(frame.error_code); | |
| 2154 if (!writer->WriteUInt32(error_code)) { | |
| 2155 return false; | |
| 2156 } | |
| 2157 | |
| 2158 if (!writer->WriteStringPiece16(frame.error_details)) { | |
| 2159 return false; | |
| 2160 } | |
| 2161 return true; | |
| 2162 } | |
| 2163 | |
| 2164 bool QuicFramer::AppendConnectionCloseFrame( | |
| 2165 const QuicConnectionCloseFrame& frame, | |
| 2166 QuicDataWriter* writer) { | |
| 2167 uint32 error_code = static_cast<uint32>(frame.error_code); | |
| 2168 if (!writer->WriteUInt32(error_code)) { | |
| 2169 return false; | |
| 2170 } | |
| 2171 if (!writer->WriteStringPiece16(frame.error_details)) { | |
| 2172 return false; | |
| 2173 } | |
| 2174 return true; | |
| 2175 } | |
| 2176 | |
| 2177 bool QuicFramer::AppendGoAwayFrame(const QuicGoAwayFrame& frame, | |
| 2178 QuicDataWriter* writer) { | |
| 2179 uint32 error_code = static_cast<uint32>(frame.error_code); | |
| 2180 if (!writer->WriteUInt32(error_code)) { | |
| 2181 return false; | |
| 2182 } | |
| 2183 uint32 stream_id = static_cast<uint32>(frame.last_good_stream_id); | |
| 2184 if (!writer->WriteUInt32(stream_id)) { | |
| 2185 return false; | |
| 2186 } | |
| 2187 if (!writer->WriteStringPiece16(frame.reason_phrase)) { | |
| 2188 return false; | |
| 2189 } | |
| 2190 return true; | |
| 2191 } | |
| 2192 | |
| 2193 bool QuicFramer::AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame, | |
| 2194 QuicDataWriter* writer) { | |
| 2195 uint32 stream_id = static_cast<uint32>(frame.stream_id); | |
| 2196 if (!writer->WriteUInt32(stream_id)) { | |
| 2197 return false; | |
| 2198 } | |
| 2199 if (!writer->WriteUInt64(frame.byte_offset)) { | |
| 2200 return false; | |
| 2201 } | |
| 2202 return true; | |
| 2203 } | |
| 2204 | |
| 2205 bool QuicFramer::AppendBlockedFrame(const QuicBlockedFrame& frame, | |
| 2206 QuicDataWriter* writer) { | |
| 2207 uint32 stream_id = static_cast<uint32>(frame.stream_id); | |
| 2208 if (!writer->WriteUInt32(stream_id)) { | |
| 2209 return false; | |
| 2210 } | |
| 2211 return true; | |
| 2212 } | |
| 2213 | |
| 2214 bool QuicFramer::RaiseError(QuicErrorCode error) { | |
| 2215 DVLOG(1) << "Error detail: " << detailed_error_; | |
| 2216 set_error(error); | |
| 2217 visitor_->OnError(this); | |
| 2218 reader_.reset(nullptr); | |
| 2219 return false; | |
| 2220 } | |
| 2221 | |
| 2222 } // namespace net | |
| OLD | NEW |