| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_framer.h" | 5 #include "net/quic/quic_framer.h" |
| 6 | 6 |
| 7 #include "base/hash_tables.h" | 7 #include "base/hash_tables.h" |
| 8 #include "net/quic/crypto/quic_decrypter.h" | 8 #include "net/quic/crypto/quic_decrypter.h" |
| 9 #include "net/quic/crypto/quic_encrypter.h" | 9 #include "net/quic/crypto/quic_encrypter.h" |
| 10 #include "net/quic/quic_data_reader.h" | 10 #include "net/quic/quic_data_reader.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 if (CanTruncate(frame)) { | 79 if (CanTruncate(frame)) { |
| 80 // Truncate the frame so the packet will not exceed kMaxPacketSize. | 80 // Truncate the frame so the packet will not exceed kMaxPacketSize. |
| 81 // Note that we may not use every byte of the writer in this case. | 81 // Note that we may not use every byte of the writer in this case. |
| 82 DLOG(INFO) << "Truncating large frame"; | 82 DLOG(INFO) << "Truncating large frame"; |
| 83 return free_bytes; | 83 return free_bytes; |
| 84 } | 84 } |
| 85 } | 85 } |
| 86 return frame_len; | 86 return frame_len; |
| 87 } | 87 } |
| 88 | 88 |
| 89 QuicPacket* QuicFramer::ConstructFrameDataPacket(const QuicPacketHeader& header, | 89 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( |
| 90 const QuicFrames& frames) { | 90 const QuicPacketHeader& header) const { |
| 91 if (!header.entropy_flag) { |
| 92 // TODO(satyamshekhar): Return some more better value here (something that |
| 93 // is not a constant). |
| 94 return 0; |
| 95 } |
| 96 return 1 << (header.packet_sequence_number % 8); |
| 97 } |
| 98 |
| 99 SerializedPacket QuicFramer::ConstructFrameDataPacket( |
| 100 const QuicPacketHeader& header, |
| 101 const QuicFrames& frames) { |
| 91 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize); | 102 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize); |
| 92 size_t packet_size = kPacketHeaderSize; | 103 size_t packet_size = kPacketHeaderSize; |
| 93 for (size_t i = 0; i < frames.size(); ++i) { | 104 for (size_t i = 0; i < frames.size(); ++i) { |
| 94 DCHECK_LE(packet_size, max_plaintext_size); | 105 DCHECK_LE(packet_size, max_plaintext_size); |
| 95 const size_t frame_size = GetSerializedFrameLength( | 106 const size_t frame_size = GetSerializedFrameLength( |
| 96 frames[i], max_plaintext_size - packet_size, i == 0); | 107 frames[i], max_plaintext_size - packet_size, i == 0); |
| 97 DCHECK(frame_size); | 108 DCHECK(frame_size); |
| 98 packet_size += frame_size; | 109 packet_size += frame_size; |
| 99 } | 110 } |
| 100 return ConstructFrameDataPacket(header, frames, packet_size); | 111 return ConstructFrameDataPacket(header, frames, packet_size); |
| 101 } | 112 } |
| 102 | 113 |
| 103 QuicPacket* QuicFramer::ConstructFrameDataPacket(const QuicPacketHeader& header, | 114 SerializedPacket QuicFramer::ConstructFrameDataPacket( |
| 104 const QuicFrames& frames, | 115 const QuicPacketHeader& header, |
| 105 size_t packet_size) { | 116 const QuicFrames& frames, |
| 117 size_t packet_size) { |
| 106 QuicDataWriter writer(packet_size); | 118 QuicDataWriter writer(packet_size); |
| 119 SerializedPacket kNoPacket = SerializedPacket(0, NULL, 0, NULL); |
| 107 if (!WritePacketHeader(header, &writer)) { | 120 if (!WritePacketHeader(header, &writer)) { |
| 108 return NULL; | 121 return kNoPacket; |
| 109 } | 122 } |
| 110 | 123 |
| 111 for (size_t i = 0; i < frames.size(); ++i) { | 124 for (size_t i = 0; i < frames.size(); ++i) { |
| 112 const QuicFrame& frame = frames[i]; | 125 const QuicFrame& frame = frames[i]; |
| 113 if (!writer.WriteUInt8(frame.type)) { | 126 if (!writer.WriteUInt8(frame.type)) { |
| 114 return NULL; | 127 return kNoPacket; |
| 115 } | 128 } |
| 116 | 129 |
| 117 switch (frame.type) { | 130 switch (frame.type) { |
| 118 case PADDING_FRAME: | 131 case PADDING_FRAME: |
| 119 writer.WritePadding(); | 132 writer.WritePadding(); |
| 120 break; | 133 break; |
| 121 case STREAM_FRAME: | 134 case STREAM_FRAME: |
| 122 if (!AppendStreamFramePayload(*frame.stream_frame, &writer)) { | 135 if (!AppendStreamFramePayload(*frame.stream_frame, &writer)) { |
| 123 return NULL; | 136 return kNoPacket; |
| 124 } | 137 } |
| 125 break; | 138 break; |
| 126 case ACK_FRAME: | 139 case ACK_FRAME: |
| 127 if (!AppendAckFramePayload(*frame.ack_frame, &writer)) { | 140 if (!AppendAckFramePayload(*frame.ack_frame, &writer)) { |
| 128 return NULL; | 141 return kNoPacket; |
| 129 } | 142 } |
| 130 break; | 143 break; |
| 131 case CONGESTION_FEEDBACK_FRAME: | 144 case CONGESTION_FEEDBACK_FRAME: |
| 132 if (!AppendQuicCongestionFeedbackFramePayload( | 145 if (!AppendQuicCongestionFeedbackFramePayload( |
| 133 *frame.congestion_feedback_frame, &writer)) { | 146 *frame.congestion_feedback_frame, &writer)) { |
| 134 return NULL; | 147 return kNoPacket; |
| 135 } | 148 } |
| 136 break; | 149 break; |
| 137 case RST_STREAM_FRAME: | 150 case RST_STREAM_FRAME: |
| 138 if (!AppendRstStreamFramePayload(*frame.rst_stream_frame, &writer)) { | 151 if (!AppendRstStreamFramePayload(*frame.rst_stream_frame, &writer)) { |
| 139 return NULL; | 152 return kNoPacket; |
| 140 } | 153 } |
| 141 break; | 154 break; |
| 142 case CONNECTION_CLOSE_FRAME: | 155 case CONNECTION_CLOSE_FRAME: |
| 143 if (!AppendConnectionCloseFramePayload( | 156 if (!AppendConnectionCloseFramePayload( |
| 144 *frame.connection_close_frame, &writer)) { | 157 *frame.connection_close_frame, &writer)) { |
| 145 return NULL; | 158 return kNoPacket; |
| 159 } |
| 160 break; |
| 161 case GOAWAY_FRAME: |
| 162 if (!AppendGoAwayFramePayload(*frame.goaway_frame, &writer)) { |
| 163 return kNoPacket; |
| 146 } | 164 } |
| 147 break; | 165 break; |
| 148 default: | 166 default: |
| 149 RaiseError(QUIC_INVALID_FRAME_DATA); | 167 RaiseError(QUIC_INVALID_FRAME_DATA); |
| 150 return NULL; | 168 return kNoPacket; |
| 151 } | 169 } |
| 152 } | 170 } |
| 153 | 171 |
| 154 // Save the length before writing, because take clears it. | 172 // Save the length before writing, because take clears it. |
| 155 const size_t len = writer.length(); | 173 const size_t len = writer.length(); |
| 156 // Less than or equal because truncated acks end up with max_plaintex_size | 174 // Less than or equal because truncated acks end up with max_plaintex_size |
| 157 // length, even though they're typically slightly shorter. | 175 // length, even though they're typically slightly shorter. |
| 158 DCHECK_LE(len, packet_size); | 176 DCHECK_LE(len, packet_size); |
| 159 QuicPacket* packet = QuicPacket::NewDataPacket(writer.take(), len, true); | 177 QuicPacket* packet = QuicPacket::NewDataPacket(writer.take(), len, true); |
| 160 | 178 |
| 161 if (fec_builder_) { | 179 if (fec_builder_) { |
| 162 fec_builder_->OnBuiltFecProtectedPayload(header, | 180 fec_builder_->OnBuiltFecProtectedPayload(header, |
| 163 packet->FecProtectedData()); | 181 packet->FecProtectedData()); |
| 164 } | 182 } |
| 165 | 183 |
| 166 return packet; | 184 return SerializedPacket(header.packet_sequence_number, packet, |
| 185 GetPacketEntropyHash(header), NULL); |
| 167 } | 186 } |
| 168 | 187 |
| 169 QuicPacket* QuicFramer::ConstructFecPacket(const QuicPacketHeader& header, | 188 SerializedPacket QuicFramer::ConstructFecPacket(const QuicPacketHeader& header, |
| 170 const QuicFecData& fec) { | 189 const QuicFecData& fec) { |
| 171 size_t len = kPacketHeaderSize; | 190 size_t len = kPacketHeaderSize; |
| 172 len += fec.redundancy.length(); | 191 len += fec.redundancy.length(); |
| 173 | 192 |
| 174 QuicDataWriter writer(len); | 193 QuicDataWriter writer(len); |
| 175 | 194 SerializedPacket kNoPacket = SerializedPacket(0, NULL, 0, NULL); |
| 176 if (!WritePacketHeader(header, &writer)) { | 195 if (!WritePacketHeader(header, &writer)) { |
| 177 return NULL; | 196 return kNoPacket; |
| 178 } | 197 } |
| 179 | 198 |
| 180 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { | 199 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { |
| 181 return NULL; | 200 return kNoPacket; |
| 182 } | 201 } |
| 183 | 202 |
| 184 return QuicPacket::NewFecPacket(writer.take(), len, true); | 203 return SerializedPacket(header.packet_sequence_number, |
| 204 QuicPacket::NewFecPacket(writer.take(), len, true), |
| 205 GetPacketEntropyHash(header), NULL); |
| 185 } | 206 } |
| 186 | 207 |
| 187 // static | 208 // static |
| 188 QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket( | 209 QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket( |
| 189 const QuicPublicResetPacket& packet) { | 210 const QuicPublicResetPacket& packet) { |
| 190 DCHECK_EQ(PACKET_PUBLIC_FLAGS_RST, | 211 DCHECK(packet.public_header.reset_flag); |
| 191 PACKET_PUBLIC_FLAGS_RST & packet.public_header.flags); | 212 DCHECK(!packet.public_header.version_flag); |
| 192 size_t len = kPublicResetPacketSize; | 213 size_t len = kPublicResetPacketSize; |
| 193 QuicDataWriter writer(len); | 214 QuicDataWriter writer(len); |
| 194 | 215 |
| 195 if (!writer.WriteUInt64(packet.public_header.guid)) { | 216 if (!writer.WriteUInt64(packet.public_header.guid)) { |
| 196 return NULL; | 217 return NULL; |
| 197 } | 218 } |
| 198 | 219 |
| 199 uint8 flags = static_cast<uint8>(packet.public_header.flags); | 220 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST); |
| 200 if (!writer.WriteUInt8(flags)) { | 221 if (!writer.WriteUInt8(flags)) { |
| 201 return NULL; | 222 return NULL; |
| 202 } | 223 } |
| 203 | 224 |
| 204 if (!writer.WriteUInt64(packet.nonce_proof)) { | 225 if (!writer.WriteUInt64(packet.nonce_proof)) { |
| 205 return NULL; | 226 return NULL; |
| 206 } | 227 } |
| 207 | 228 |
| 208 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number, | 229 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number, |
| 209 &writer)) { | 230 &writer)) { |
| 210 return NULL; | 231 return NULL; |
| 211 } | 232 } |
| 212 | 233 |
| 213 return new QuicEncryptedPacket(writer.take(), len, true); | 234 return new QuicEncryptedPacket(writer.take(), len, true); |
| 214 } | 235 } |
| 215 | 236 |
| 216 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 237 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
| 217 DCHECK(!reader_.get()); | 238 DCHECK(!reader_.get()); |
| 218 reader_.reset(new QuicDataReader(packet.data(), packet.length())); | 239 reader_.reset(new QuicDataReader(packet.data(), packet.length())); |
| 219 | 240 |
| 220 // First parse the public header. | 241 // First parse the public header. |
| 221 QuicPacketPublicHeader public_header; | 242 QuicPacketPublicHeader public_header; |
| 222 if (!ProcessPublicHeader(&public_header)) { | 243 if (!ProcessPublicHeader(&public_header)) { |
| 223 DLOG(WARNING) << "Unable to process public header."; | 244 DLOG(WARNING) << "Unable to process public header."; |
| 224 reader_.reset(NULL); | 245 reader_.reset(NULL); |
| 225 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 246 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 226 } | 247 } |
| 227 | 248 |
| 228 bool rv; | 249 bool rv; |
| 229 if (public_header.flags & PACKET_PUBLIC_FLAGS_RST) { | 250 if (public_header.reset_flag) { |
| 230 rv = ProcessPublicResetPacket(public_header); | 251 rv = ProcessPublicResetPacket(public_header); |
| 231 } else { | 252 } else { |
| 232 rv = ProcessDataPacket(public_header, packet); | 253 rv = ProcessDataPacket(public_header, packet); |
| 233 } | 254 } |
| 234 | 255 |
| 235 reader_.reset(NULL); | 256 reader_.reset(NULL); |
| 236 return rv; | 257 return rv; |
| 237 } | 258 } |
| 238 | 259 |
| 239 bool QuicFramer::ProcessDataPacket( | 260 bool QuicFramer::ProcessDataPacket( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 250 if (!visitor_->OnPacketHeader(header)) { | 271 if (!visitor_->OnPacketHeader(header)) { |
| 251 return true; | 272 return true; |
| 252 } | 273 } |
| 253 | 274 |
| 254 if (packet.length() > kMaxPacketSize) { | 275 if (packet.length() > kMaxPacketSize) { |
| 255 DLOG(WARNING) << "Packet too large: " << packet.length(); | 276 DLOG(WARNING) << "Packet too large: " << packet.length(); |
| 256 return RaiseError(QUIC_PACKET_TOO_LARGE); | 277 return RaiseError(QUIC_PACKET_TOO_LARGE); |
| 257 } | 278 } |
| 258 | 279 |
| 259 // Handle the payload. | 280 // Handle the payload. |
| 260 if ((header.private_flags & PACKET_PRIVATE_FLAGS_FEC) == 0) { | 281 if (!header.fec_flag) { |
| 261 if (header.fec_group != 0) { | 282 if (header.fec_group != 0) { |
| 262 StringPiece payload = reader_->PeekRemainingPayload(); | 283 StringPiece payload = reader_->PeekRemainingPayload(); |
| 263 visitor_->OnFecProtectedPayload(payload); | 284 visitor_->OnFecProtectedPayload(payload); |
| 264 } | 285 } |
| 265 if (!ProcessFrameData()) { | 286 if (!ProcessFrameData()) { |
| 266 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. | 287 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. |
| 267 DLOG(WARNING) << "Unable to process frame data."; | 288 DLOG(WARNING) << "Unable to process frame data."; |
| 268 return false; | 289 return false; |
| 269 } | 290 } |
| 270 } else { | 291 } else { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 288 // TODO(satyamshekhar): validate nonce to protect against DoS. | 309 // TODO(satyamshekhar): validate nonce to protect against DoS. |
| 289 | 310 |
| 290 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) { | 311 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) { |
| 291 set_detailed_error("Unable to read rejected sequence number."); | 312 set_detailed_error("Unable to read rejected sequence number."); |
| 292 return false; | 313 return false; |
| 293 } | 314 } |
| 294 visitor_->OnPublicResetPacket(packet); | 315 visitor_->OnPublicResetPacket(packet); |
| 295 return true; | 316 return true; |
| 296 } | 317 } |
| 297 | 318 |
| 298 bool QuicFramer::ProcessRevivedPacket(const QuicPacketHeader& header, | 319 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header, |
| 299 StringPiece payload) { | 320 StringPiece payload) { |
| 300 DCHECK(!reader_.get()); | 321 DCHECK(!reader_.get()); |
| 301 | 322 |
| 302 visitor_->OnRevivedPacket(); | 323 visitor_->OnRevivedPacket(); |
| 303 | 324 |
| 304 visitor_->OnPacketHeader(header); | 325 header->entropy_hash = GetPacketEntropyHash(*header); |
| 326 |
| 327 // TODO(satyamshekhar): Don't process if the visitor refuses the header. |
| 328 visitor_->OnPacketHeader(*header); |
| 305 | 329 |
| 306 if (payload.length() > kMaxPacketSize) { | 330 if (payload.length() > kMaxPacketSize) { |
| 307 set_detailed_error("Revived packet too large."); | 331 set_detailed_error("Revived packet too large."); |
| 308 return RaiseError(QUIC_PACKET_TOO_LARGE); | 332 return RaiseError(QUIC_PACKET_TOO_LARGE); |
| 309 } | 333 } |
| 310 | 334 |
| 311 reader_.reset(new QuicDataReader(payload.data(), payload.length())); | 335 reader_.reset(new QuicDataReader(payload.data(), payload.length())); |
| 312 if (!ProcessFrameData()) { | 336 if (!ProcessFrameData()) { |
| 313 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. | 337 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. |
| 314 DLOG(WARNING) << "Unable to process frame data."; | 338 DLOG(WARNING) << "Unable to process frame data."; |
| 315 return false; | 339 return false; |
| 316 } | 340 } |
| 317 | 341 |
| 318 visitor_->OnPacketComplete(); | 342 visitor_->OnPacketComplete(); |
| 319 reader_.reset(NULL); | 343 reader_.reset(NULL); |
| 320 return true; | 344 return true; |
| 321 } | 345 } |
| 322 | 346 |
| 323 bool QuicFramer::WritePacketHeader(const QuicPacketHeader& header, | 347 bool QuicFramer::WritePacketHeader(const QuicPacketHeader& header, |
| 324 QuicDataWriter* writer) { | 348 QuicDataWriter* writer) { |
| 325 if (!writer->WriteUInt64(header.public_header.guid)) { | 349 if (!writer->WriteUInt64(header.public_header.guid)) { |
| 326 return false; | 350 return false; |
| 327 } | 351 } |
| 328 | 352 |
| 329 uint8 flags = static_cast<uint8>(header.public_header.flags); | 353 uint8 flags = 0; |
| 354 if (header.public_header.reset_flag) { |
| 355 flags |= PACKET_PUBLIC_FLAGS_RST; |
| 356 } |
| 357 if (header.public_header.version_flag) { |
| 358 flags |= PACKET_PUBLIC_FLAGS_VERSION; |
| 359 } |
| 330 if (!writer->WriteUInt8(flags)) { | 360 if (!writer->WriteUInt8(flags)) { |
| 331 return false; | 361 return false; |
| 332 } | 362 } |
| 333 | 363 |
| 334 if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) { | 364 if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) { |
| 335 return false; | 365 return false; |
| 336 } | 366 } |
| 337 | 367 |
| 338 flags = static_cast<uint8>(header.private_flags); | 368 flags = 0; |
| 369 if (header.fec_flag) { |
| 370 flags |= PACKET_PRIVATE_FLAGS_FEC; |
| 371 } |
| 372 if (header.entropy_flag) { |
| 373 flags |= PACKET_PRIVATE_FLAGS_ENTROPY; |
| 374 } |
| 375 if (header.fec_entropy_flag) { |
| 376 flags |= PACKET_PRIVATE_FLAGS_FEC_ENTROPY; |
| 377 } |
| 339 if (!writer->WriteUInt8(flags)) { | 378 if (!writer->WriteUInt8(flags)) { |
| 340 return false; | 379 return false; |
| 341 } | 380 } |
| 342 | 381 |
| 343 // Offset from the current packet sequence number to the first fec | 382 // Offset from the current packet sequence number to the first fec |
| 344 // protected packet, or kNoFecOffset to signal no FEC protection. | 383 // protected packet, or kNoFecOffset to signal no FEC protection. |
| 345 uint8 first_fec_protected_packet_offset = kNoFecOffset; | 384 uint8 first_fec_protected_packet_offset = kNoFecOffset; |
| 346 | 385 |
| 347 // The FEC group number is the sequence number of the first fec | 386 // The FEC group number is the sequence number of the first fec |
| 348 // protected packet, or 0 if this packet is not protected. | 387 // protected packet, or 0 if this packet is not protected. |
| 349 if (header.fec_group != 0) { | 388 if (header.fec_group != 0) { |
| 350 DCHECK_GE(header.packet_sequence_number, header.fec_group); | 389 DCHECK_GE(header.packet_sequence_number, header.fec_group); |
| 351 DCHECK_GT(255u, header.packet_sequence_number - header.fec_group); | 390 DCHECK_GT(255u, header.packet_sequence_number - header.fec_group); |
| 352 first_fec_protected_packet_offset = | 391 first_fec_protected_packet_offset = |
| 353 header.packet_sequence_number - header.fec_group; | 392 header.packet_sequence_number - header.fec_group; |
| 354 } | 393 } |
| 355 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) { | 394 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) { |
| 356 return false; | 395 return false; |
| 357 } | 396 } |
| 358 | 397 |
| 359 return true; | 398 return true; |
| 360 } | 399 } |
| 361 | 400 |
| 362 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire( | 401 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire( |
| 363 QuicPacketSequenceNumber packet_sequence_number) const { | 402 QuicPacketSequenceNumber packet_sequence_number) const { |
| 364 // The new sequence number might have wrapped to the next epoc, or | 403 // The new sequence number might have wrapped to the next epoch, or |
| 365 // it might have reverse wrapped to the previous epoch, or it might | 404 // it might have reverse wrapped to the previous epoch, or it might |
| 366 // remain in the same epoch. Select the sequence number closest to the | 405 // remain in the same epoch. Select the sequence number closest to the |
| 367 // previous sequence number. | 406 // previous sequence number. |
| 368 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~kSequenceNumberMask; | 407 QuicPacketSequenceNumber epoch = last_sequence_number_ & ~kSequenceNumberMask; |
| 369 QuicPacketSequenceNumber prev_epoch = epoch - (GG_UINT64_C(1) << 48); | 408 QuicPacketSequenceNumber prev_epoch = epoch - (GG_UINT64_C(1) << 48); |
| 370 QuicPacketSequenceNumber next_epoch = epoch + (GG_UINT64_C(1) << 48); | 409 QuicPacketSequenceNumber next_epoch = epoch + (GG_UINT64_C(1) << 48); |
| 371 | 410 |
| 372 return ClosestTo(last_sequence_number_, | 411 return ClosestTo(last_sequence_number_, |
| 373 epoch + packet_sequence_number, | 412 epoch + packet_sequence_number, |
| 374 ClosestTo(last_sequence_number_, | 413 ClosestTo(last_sequence_number_, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 386 if (!reader_->ReadBytes(&public_flags, 1)) { | 425 if (!reader_->ReadBytes(&public_flags, 1)) { |
| 387 set_detailed_error("Unable to read public flags."); | 426 set_detailed_error("Unable to read public flags."); |
| 388 return false; | 427 return false; |
| 389 } | 428 } |
| 390 | 429 |
| 391 if (public_flags > PACKET_PUBLIC_FLAGS_MAX) { | 430 if (public_flags > PACKET_PUBLIC_FLAGS_MAX) { |
| 392 set_detailed_error("Illegal public flags value."); | 431 set_detailed_error("Illegal public flags value."); |
| 393 return false; | 432 return false; |
| 394 } | 433 } |
| 395 | 434 |
| 396 public_header->flags = static_cast<QuicPacketPublicFlags>(public_flags); | 435 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; |
| 436 public_header->version_flag = |
| 437 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; |
| 438 |
| 397 return true; | 439 return true; |
| 398 } | 440 } |
| 399 | 441 |
| 400 // static | 442 // static |
| 401 bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet, | 443 bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet, |
| 402 QuicGuid* guid) { | 444 QuicGuid* guid) { |
| 403 QuicDataReader reader(packet.data(), packet.length()); | 445 QuicDataReader reader(packet.data(), packet.length()); |
| 404 return reader.ReadUInt64(guid); | 446 return reader.ReadUInt64(guid); |
| 405 } | 447 } |
| 406 | 448 |
| 407 bool QuicFramer::ProcessPacketHeader( | 449 bool QuicFramer::ProcessPacketHeader( |
| 408 QuicPacketHeader* header, | 450 QuicPacketHeader* header, |
| 409 const QuicEncryptedPacket& packet) { | 451 const QuicEncryptedPacket& packet) { |
| 410 if (!ProcessPacketSequenceNumber(&header->packet_sequence_number)) { | 452 if (!ProcessPacketSequenceNumber(&header->packet_sequence_number)) { |
| 411 set_detailed_error("Unable to read sequence number."); | 453 set_detailed_error("Unable to read sequence number."); |
| 412 return false; | 454 return false; |
| 413 } | 455 } |
| 414 | 456 |
| 415 if (header->packet_sequence_number == 0u) { | 457 if (header->packet_sequence_number == 0u) { |
| 416 set_detailed_error("Packet sequence numbers cannot be 0."); | 458 set_detailed_error("Packet sequence numbers cannot be 0."); |
| 417 return false; | 459 return false; |
| 418 } | 460 } |
| 419 | 461 |
| 420 if (!DecryptPayload(packet)) { | 462 if (!DecryptPayload(header->packet_sequence_number, packet)) { |
| 421 DLOG(WARNING) << "Unable to decrypt payload."; | 463 DLOG(WARNING) << "Unable to decrypt payload."; |
| 422 return RaiseError(QUIC_DECRYPTION_FAILURE); | 464 return RaiseError(QUIC_DECRYPTION_FAILURE); |
| 423 } | 465 } |
| 424 | 466 |
| 425 uint8 private_flags; | 467 uint8 private_flags; |
| 426 if (!reader_->ReadBytes(&private_flags, 1)) { | 468 if (!reader_->ReadBytes(&private_flags, 1)) { |
| 427 set_detailed_error("Unable to read private flags."); | 469 set_detailed_error("Unable to read private flags."); |
| 428 return false; | 470 return false; |
| 429 } | 471 } |
| 430 | 472 |
| 431 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) { | 473 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) { |
| 432 set_detailed_error("Illegal private flags value."); | 474 set_detailed_error("Illegal private flags value."); |
| 433 return false; | 475 return false; |
| 434 } | 476 } |
| 435 | 477 |
| 436 header->private_flags = static_cast<QuicPacketPrivateFlags>(private_flags); | 478 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0; |
| 479 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0; |
| 480 header->fec_entropy_flag = |
| 481 (private_flags & PACKET_PRIVATE_FLAGS_FEC_ENTROPY) != 0; |
| 437 | 482 |
| 438 uint8 first_fec_protected_packet_offset; | 483 uint8 first_fec_protected_packet_offset; |
| 439 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) { | 484 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) { |
| 440 set_detailed_error("Unable to read first fec protected packet offset."); | 485 set_detailed_error("Unable to read first fec protected packet offset."); |
| 441 return false; | 486 return false; |
| 442 } | 487 } |
| 443 header->fec_group = first_fec_protected_packet_offset == kNoFecOffset ? 0 : | 488 header->fec_group = first_fec_protected_packet_offset == kNoFecOffset ? 0 : |
| 444 header->packet_sequence_number - first_fec_protected_packet_offset; | 489 header->packet_sequence_number - first_fec_protected_packet_offset; |
| 445 | 490 |
| 491 header->entropy_hash = GetPacketEntropyHash(*header); |
| 446 // Set the last sequence number after we have decrypted the packet | 492 // Set the last sequence number after we have decrypted the packet |
| 447 // so we are confident is not attacker controlled. | 493 // so we are confident is not attacker controlled. |
| 448 last_sequence_number_ = header->packet_sequence_number; | 494 last_sequence_number_ = header->packet_sequence_number; |
| 449 return true; | 495 return true; |
| 450 } | 496 } |
| 451 | 497 |
| 452 bool QuicFramer::ProcessPacketSequenceNumber( | 498 bool QuicFramer::ProcessPacketSequenceNumber( |
| 453 QuicPacketSequenceNumber* sequence_number) { | 499 QuicPacketSequenceNumber* sequence_number) { |
| 454 QuicPacketSequenceNumber wire_sequence_number; | 500 QuicPacketSequenceNumber wire_sequence_number; |
| 455 if (!reader_->ReadUInt48(&wire_sequence_number)) { | 501 if (!reader_->ReadUInt48(&wire_sequence_number)) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 case RST_STREAM_FRAME: | 544 case RST_STREAM_FRAME: |
| 499 if (!ProcessRstStreamFrame()) { | 545 if (!ProcessRstStreamFrame()) { |
| 500 return RaiseError(QUIC_INVALID_RST_STREAM_DATA); | 546 return RaiseError(QUIC_INVALID_RST_STREAM_DATA); |
| 501 } | 547 } |
| 502 break; | 548 break; |
| 503 case CONNECTION_CLOSE_FRAME: | 549 case CONNECTION_CLOSE_FRAME: |
| 504 if (!ProcessConnectionCloseFrame()) { | 550 if (!ProcessConnectionCloseFrame()) { |
| 505 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA); | 551 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA); |
| 506 } | 552 } |
| 507 break; | 553 break; |
| 554 case GOAWAY_FRAME: |
| 555 if (!ProcessGoAwayFrame()) { |
| 556 return RaiseError(QUIC_INVALID_GOAWAY_DATA); |
| 557 } |
| 558 break; |
| 508 default: | 559 default: |
| 509 set_detailed_error("Illegal frame type."); | 560 set_detailed_error("Illegal frame type."); |
| 510 DLOG(WARNING) << "Illegal frame type: " | 561 DLOG(WARNING) << "Illegal frame type: " |
| 511 << static_cast<int>(frame_type); | 562 << static_cast<int>(frame_type); |
| 512 return RaiseError(QUIC_INVALID_FRAME_DATA); | 563 return RaiseError(QUIC_INVALID_FRAME_DATA); |
| 513 } | 564 } |
| 514 } | 565 } |
| 515 | 566 |
| 516 return true; | 567 return true; |
| 517 } | 568 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 return false; | 604 return false; |
| 554 } | 605 } |
| 555 if (!ProcessReceivedInfo(&frame->received_info)) { | 606 if (!ProcessReceivedInfo(&frame->received_info)) { |
| 556 return false; | 607 return false; |
| 557 } | 608 } |
| 558 visitor_->OnAckFrame(*frame); | 609 visitor_->OnAckFrame(*frame); |
| 559 return true; | 610 return true; |
| 560 } | 611 } |
| 561 | 612 |
| 562 bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) { | 613 bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) { |
| 614 if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) { |
| 615 set_detailed_error("Unable to read entropy hash for received packets."); |
| 616 return false; |
| 617 } |
| 618 |
| 563 if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) { | 619 if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) { |
| 564 set_detailed_error("Unable to read largest observed."); | 620 set_detailed_error("Unable to read largest observed."); |
| 565 return false; | 621 return false; |
| 566 } | 622 } |
| 567 | 623 |
| 568 uint8 num_missing_packets; | 624 uint8 num_missing_packets; |
| 569 if (!reader_->ReadBytes(&num_missing_packets, 1)) { | 625 if (!reader_->ReadBytes(&num_missing_packets, 1)) { |
| 570 set_detailed_error("Unable to read num missing packets."); | 626 set_detailed_error("Unable to read num missing packets."); |
| 571 return false; | 627 return false; |
| 572 } | 628 } |
| 573 | 629 |
| 574 for (int i = 0; i < num_missing_packets; ++i) { | 630 for (int i = 0; i < num_missing_packets; ++i) { |
| 575 QuicPacketSequenceNumber sequence_number; | 631 QuicPacketSequenceNumber sequence_number; |
| 576 if (!ProcessPacketSequenceNumber(&sequence_number)) { | 632 if (!ProcessPacketSequenceNumber(&sequence_number)) { |
| 577 set_detailed_error("Unable to read sequence number in missing packets."); | 633 set_detailed_error("Unable to read sequence number in missing packets."); |
| 578 return false; | 634 return false; |
| 579 } | 635 } |
| 580 received_info->missing_packets.insert(sequence_number); | 636 received_info->missing_packets.insert(sequence_number); |
| 581 } | 637 } |
| 582 | 638 |
| 583 return true; | 639 return true; |
| 584 } | 640 } |
| 585 | 641 |
| 586 bool QuicFramer::ProcessSentInfo(SentPacketInfo* sent_info) { | 642 bool QuicFramer::ProcessSentInfo(SentPacketInfo* sent_info) { |
| 643 if (!reader_->ReadBytes(&sent_info->entropy_hash, 1)) { |
| 644 set_detailed_error("Unable to read entropy hash for sent packets."); |
| 645 return false; |
| 646 } |
| 647 |
| 587 if (!ProcessPacketSequenceNumber(&sent_info->least_unacked)) { | 648 if (!ProcessPacketSequenceNumber(&sent_info->least_unacked)) { |
| 588 set_detailed_error("Unable to read least unacked."); | 649 set_detailed_error("Unable to read least unacked."); |
| 589 return false; | 650 return false; |
| 590 } | 651 } |
| 591 | 652 |
| 592 return true; | 653 return true; |
| 593 } | 654 } |
| 594 | 655 |
| 595 bool QuicFramer::ProcessQuicCongestionFeedbackFrame( | 656 bool QuicFramer::ProcessQuicCongestionFeedbackFrame( |
| 596 QuicCongestionFeedbackFrame* frame) { | 657 QuicCongestionFeedbackFrame* frame) { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 return true; | 754 return true; |
| 694 } | 755 } |
| 695 | 756 |
| 696 bool QuicFramer::ProcessRstStreamFrame() { | 757 bool QuicFramer::ProcessRstStreamFrame() { |
| 697 QuicRstStreamFrame frame; | 758 QuicRstStreamFrame frame; |
| 698 if (!reader_->ReadUInt32(&frame.stream_id)) { | 759 if (!reader_->ReadUInt32(&frame.stream_id)) { |
| 699 set_detailed_error("Unable to read stream_id."); | 760 set_detailed_error("Unable to read stream_id."); |
| 700 return false; | 761 return false; |
| 701 } | 762 } |
| 702 | 763 |
| 703 if (!reader_->ReadUInt64(&frame.offset)) { | |
| 704 set_detailed_error("Unable to read offset in rst frame."); | |
| 705 return false; | |
| 706 } | |
| 707 | |
| 708 uint32 error_code; | 764 uint32 error_code; |
| 709 if (!reader_->ReadUInt32(&error_code)) { | 765 if (!reader_->ReadUInt32(&error_code)) { |
| 710 set_detailed_error("Unable to read rst stream error code."); | 766 set_detailed_error("Unable to read rst stream error code."); |
| 711 return false; | 767 return false; |
| 712 } | 768 } |
| 713 frame.error_code = static_cast<QuicErrorCode>(error_code); | 769 frame.error_code = static_cast<QuicErrorCode>(error_code); |
| 714 | 770 |
| 715 StringPiece error_details; | 771 StringPiece error_details; |
| 716 if (!reader_->ReadStringPiece16(&error_details)) { | 772 if (!reader_->ReadStringPiece16(&error_details)) { |
| 717 set_detailed_error("Unable to read rst stream error details."); | 773 set_detailed_error("Unable to read rst stream error details."); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 742 | 798 |
| 743 if (!ProcessAckFrame(&frame.ack_frame)) { | 799 if (!ProcessAckFrame(&frame.ack_frame)) { |
| 744 DLOG(WARNING) << "Unable to process ack frame."; | 800 DLOG(WARNING) << "Unable to process ack frame."; |
| 745 return false; | 801 return false; |
| 746 } | 802 } |
| 747 | 803 |
| 748 visitor_->OnConnectionCloseFrame(frame); | 804 visitor_->OnConnectionCloseFrame(frame); |
| 749 return true; | 805 return true; |
| 750 } | 806 } |
| 751 | 807 |
| 752 QuicEncryptedPacket* QuicFramer::EncryptPacket(const QuicPacket& packet) { | 808 bool QuicFramer::ProcessGoAwayFrame() { |
| 753 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet.AssociatedData(), | 809 QuicGoAwayFrame frame; |
| 810 |
| 811 uint32 error_code; |
| 812 if (!reader_->ReadUInt32(&error_code)) { |
| 813 set_detailed_error("Unable to read go away error code."); |
| 814 return false; |
| 815 } |
| 816 frame.error_code = static_cast<QuicErrorCode>(error_code); |
| 817 |
| 818 uint32 stream_id; |
| 819 if (!reader_->ReadUInt32(&stream_id)) { |
| 820 set_detailed_error("Unable to read last good stream id."); |
| 821 return false; |
| 822 } |
| 823 frame.last_good_stream_id = static_cast<QuicErrorCode>(stream_id); |
| 824 |
| 825 StringPiece reason_phrase; |
| 826 if (!reader_->ReadStringPiece16(&reason_phrase)) { |
| 827 set_detailed_error("Unable to read goaway reason."); |
| 828 return false; |
| 829 } |
| 830 frame.reason_phrase = reason_phrase.as_string(); |
| 831 |
| 832 visitor_->OnGoAwayFrame(frame); |
| 833 return true; |
| 834 } |
| 835 |
| 836 QuicEncryptedPacket* QuicFramer::EncryptPacket( |
| 837 QuicPacketSequenceNumber packet_sequence_number, |
| 838 const QuicPacket& packet) { |
| 839 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet_sequence_number, |
| 840 packet.AssociatedData(), |
| 754 packet.Plaintext())); | 841 packet.Plaintext())); |
| 755 if (out.get() == NULL) { | 842 if (out.get() == NULL) { |
| 756 RaiseError(QUIC_ENCRYPTION_FAILURE); | 843 RaiseError(QUIC_ENCRYPTION_FAILURE); |
| 757 return NULL; | 844 return NULL; |
| 758 } | 845 } |
| 759 size_t len = kStartOfEncryptedData + out->length(); | 846 size_t len = kStartOfEncryptedData + out->length(); |
| 760 char* buffer = new char[len]; | 847 char* buffer = new char[len]; |
| 761 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). | 848 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). |
| 762 memcpy(buffer, packet.data(), kStartOfEncryptedData); | 849 memcpy(buffer, packet.data(), kStartOfEncryptedData); |
| 763 memcpy(buffer + kStartOfEncryptedData, out->data(), out->length()); | 850 memcpy(buffer + kStartOfEncryptedData, out->data(), out->length()); |
| 764 return new QuicEncryptedPacket(buffer, len, true); | 851 return new QuicEncryptedPacket(buffer, len, true); |
| 765 } | 852 } |
| 766 | 853 |
| 767 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { | 854 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { |
| 768 return encrypter_->GetMaxPlaintextSize(ciphertext_size); | 855 return encrypter_->GetMaxPlaintextSize(ciphertext_size); |
| 769 } | 856 } |
| 770 | 857 |
| 771 bool QuicFramer::DecryptPayload(const QuicEncryptedPacket& packet) { | 858 bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number, |
| 859 const QuicEncryptedPacket& packet) { |
| 772 StringPiece encrypted; | 860 StringPiece encrypted; |
| 773 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { | 861 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { |
| 774 return false; | 862 return false; |
| 775 } | 863 } |
| 776 DCHECK(decrypter_.get() != NULL); | 864 DCHECK(decrypter_.get() != NULL); |
| 777 decrypted_.reset(decrypter_->Decrypt(packet.AssociatedData(), encrypted)); | 865 decrypted_.reset(decrypter_->Decrypt(sequence_number, |
| 866 packet.AssociatedData(), encrypted)); |
| 778 if (decrypted_.get() == NULL) { | 867 if (decrypted_.get() == NULL) { |
| 779 return false; | 868 return false; |
| 780 } | 869 } |
| 781 | 870 |
| 782 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); | 871 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); |
| 783 return true; | 872 return true; |
| 784 } | 873 } |
| 785 | 874 |
| 786 size_t QuicFramer::ComputeFramePayloadLength(const QuicFrame& frame) { | 875 size_t QuicFramer::ComputeFramePayloadLength(const QuicFrame& frame) { |
| 787 size_t len = 0; | 876 size_t len = 0; |
| 788 // We use "magic numbers" here because sizeof(member_) is not necessarily the | 877 // We use "magic numbers" here because sizeof(member_) is not necessarily the |
| 789 // same as sizeof(member_wire_format). | 878 // same as sizeof(member_wire_format). |
| 790 switch (frame.type) { | 879 switch (frame.type) { |
| 791 case STREAM_FRAME: | 880 case STREAM_FRAME: |
| 792 len += 4; // stream id | 881 len += 4; // Stream id of the frame. |
| 793 len += 1; // fin | 882 len += 1; // A byte for fin. |
| 794 len += 8; // offset | 883 len += 8; // Byte offset. |
| 795 len += 2; // space for the 16 bit length | 884 len += 2; // Space for the 16 bit length. |
| 796 len += frame.stream_frame->data.size(); | 885 len += frame.stream_frame->data.size(); |
| 797 break; | 886 break; |
| 798 case ACK_FRAME: { | 887 case ACK_FRAME: { |
| 799 const QuicAckFrame& ack = *frame.ack_frame; | 888 const QuicAckFrame& ack = *frame.ack_frame; |
| 800 len += 6; // largest observed packet sequence number | 889 len += 1; // Commutative hash of entropy of the packets received. |
| 801 len += 1; // num missing packets | 890 len += 6; // Least packet sequence number awaiting an ack. |
| 891 len += 1; // Hash of entropy of the packets sent up to largest observed. |
| 892 len += 6; // Largest observed packet sequence number. |
| 893 len += 1; // Number of missing packets. |
| 802 len += 6 * ack.received_info.missing_packets.size(); | 894 len += 6 * ack.received_info.missing_packets.size(); |
| 803 len += 6; // least packet sequence number awaiting an ack | |
| 804 break; | 895 break; |
| 805 } | 896 } |
| 806 case CONGESTION_FEEDBACK_FRAME: { | 897 case CONGESTION_FEEDBACK_FRAME: { |
| 807 const QuicCongestionFeedbackFrame& congestion_feedback = | 898 const QuicCongestionFeedbackFrame& congestion_feedback = |
| 808 *frame.congestion_feedback_frame; | 899 *frame.congestion_feedback_frame; |
| 809 len += 1; // congestion feedback type | 900 len += 1; // Congestion feedback type. |
| 810 | 901 |
| 811 switch (congestion_feedback.type) { | 902 switch (congestion_feedback.type) { |
| 812 case kInterArrival: { | 903 case kInterArrival: { |
| 813 const CongestionFeedbackMessageInterArrival& inter_arrival = | 904 const CongestionFeedbackMessageInterArrival& inter_arrival = |
| 814 congestion_feedback.inter_arrival; | 905 congestion_feedback.inter_arrival; |
| 815 len += 2; | 906 len += 2; |
| 816 len += 1; // num received packets | 907 len += 1; // Number received packets. |
| 817 if (inter_arrival.received_packet_times.size() > 0) { | 908 if (inter_arrival.received_packet_times.size() > 0) { |
| 818 len += 6; // smallest received | 909 len += 6; // Smallest received. |
| 819 len += 8; // time | 910 len += 8; // Time. |
| 820 // 2 bytes per sequence number delta plus 4 bytes per delta time. | 911 // 2 bytes per sequence number delta plus 4 bytes per delta time. |
| 821 len += 6 * (inter_arrival.received_packet_times.size() - 1); | 912 len += 6 * (inter_arrival.received_packet_times.size() - 1); |
| 822 } | 913 } |
| 823 break; | 914 break; |
| 824 } | 915 } |
| 825 case kFixRate: | 916 case kFixRate: |
| 826 len += 4; | 917 len += 4; |
| 827 break; | 918 break; |
| 828 case kTCP: | 919 case kTCP: |
| 829 len += 4; | 920 len += 4; |
| 830 break; | 921 break; |
| 831 default: | 922 default: |
| 832 set_detailed_error("Illegal feedback type."); | 923 set_detailed_error("Illegal feedback type."); |
| 833 DLOG(INFO) << "Illegal feedback type: " << congestion_feedback.type; | 924 DLOG(INFO) << "Illegal feedback type: " << congestion_feedback.type; |
| 834 break; | 925 break; |
| 835 } | 926 } |
| 836 break; | 927 break; |
| 837 } | 928 } |
| 838 case RST_STREAM_FRAME: | 929 case RST_STREAM_FRAME: |
| 839 len += 4; // stream id | 930 len += 4; // Stream id of the frame. |
| 840 len += 8; // offset | 931 len += 4; // Error code. |
| 841 len += 4; // error code | 932 len += 2; // Error details size. |
| 842 len += 2; // error details size | |
| 843 len += frame.rst_stream_frame->error_details.size(); | 933 len += frame.rst_stream_frame->error_details.size(); |
| 844 break; | 934 break; |
| 845 case CONNECTION_CLOSE_FRAME: | 935 case CONNECTION_CLOSE_FRAME: |
| 846 len += 4; // error code | 936 len += 4; // Error code. |
| 847 len += 2; // error details size | 937 len += 2; // Error details size. |
| 848 len += frame.connection_close_frame->error_details.size(); | 938 len += frame.connection_close_frame->error_details.size(); |
| 849 len += ComputeFramePayloadLength( | 939 len += ComputeFramePayloadLength( |
| 850 QuicFrame(&frame.connection_close_frame->ack_frame)); | 940 QuicFrame(&frame.connection_close_frame->ack_frame)); |
| 851 break; | 941 break; |
| 942 case GOAWAY_FRAME: |
| 943 len += 4; // error code |
| 944 len += 4; // last good stream id |
| 945 len += 2; // reason phrase length |
| 946 len += frame.goaway_frame->reason_phrase.size(); |
| 947 break; |
| 852 default: | 948 default: |
| 853 set_detailed_error("Illegal frame type."); | 949 set_detailed_error("Illegal frame type."); |
| 854 DLOG(INFO) << "Illegal frame type: " << frame.type; | 950 DLOG(INFO) << "Illegal frame type: " << frame.type; |
| 855 break; | 951 break; |
| 856 } | 952 } |
| 857 return len; | 953 return len; |
| 858 } | 954 } |
| 859 | 955 |
| 860 // static | 956 // static |
| 861 bool QuicFramer::AppendPacketSequenceNumber( | 957 bool QuicFramer::AppendPacketSequenceNumber( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 884 return false; | 980 return false; |
| 885 } | 981 } |
| 886 if (!writer->WriteBytes(frame.data.data(), | 982 if (!writer->WriteBytes(frame.data.data(), |
| 887 frame.data.size())) { | 983 frame.data.size())) { |
| 888 return false; | 984 return false; |
| 889 } | 985 } |
| 890 return true; | 986 return true; |
| 891 } | 987 } |
| 892 | 988 |
| 893 QuicPacketSequenceNumber QuicFramer::CalculateLargestObserved( | 989 QuicPacketSequenceNumber QuicFramer::CalculateLargestObserved( |
| 894 const SequenceSet& missing_packets, | 990 const SequenceNumberSet& missing_packets, |
| 895 SequenceSet::const_iterator largest_written) { | 991 SequenceNumberSet::const_iterator largest_written) { |
| 896 SequenceSet::const_iterator it = largest_written; | 992 SequenceNumberSet::const_iterator it = largest_written; |
| 897 QuicPacketSequenceNumber previous_missing = *it; | 993 QuicPacketSequenceNumber previous_missing = *it; |
| 898 ++it; | 994 ++it; |
| 899 | 995 |
| 900 // See if the next thing is a gap in the missing packets: if it's a | 996 // See if the next thing is a gap in the missing packets: if it's a |
| 901 // non-missing packet we can return it. | 997 // non-missing packet we can return it. |
| 902 if (it != missing_packets.end() && previous_missing + 1 != *it) { | 998 if (it != missing_packets.end() && previous_missing + 1 != *it) { |
| 903 return *it - 1; | 999 return *it - 1; |
| 904 } | 1000 } |
| 905 | 1001 |
| 906 // Otherwise return the largest missing packet, as indirectly observed. | 1002 // Otherwise return the largest missing packet, as indirectly observed. |
| 907 return *largest_written; | 1003 return *largest_written; |
| 908 } | 1004 } |
| 909 | 1005 |
| 910 // TODO(ianswett): Use varints or another more compact approach for all deltas. | 1006 // TODO(ianswett): Use varints or another more compact approach for all deltas. |
| 911 bool QuicFramer::AppendAckFramePayload( | 1007 bool QuicFramer::AppendAckFramePayload( |
| 912 const QuicAckFrame& frame, | 1008 const QuicAckFrame& frame, |
| 913 QuicDataWriter* writer) { | 1009 QuicDataWriter* writer) { |
| 1010 // TODO(satyamshekhar): Decide how often we really should send this |
| 1011 // entropy_hash update. |
| 1012 if (!writer->WriteUInt8(frame.sent_info.entropy_hash)) { |
| 1013 return false; |
| 1014 } |
| 1015 |
| 914 if (!AppendPacketSequenceNumber(frame.sent_info.least_unacked, writer)) { | 1016 if (!AppendPacketSequenceNumber(frame.sent_info.least_unacked, writer)) { |
| 915 return false; | 1017 return false; |
| 916 } | 1018 } |
| 917 | 1019 |
| 1020 size_t received_entropy_offset = writer->length(); |
| 1021 if (!writer->WriteUInt8(frame.received_info.entropy_hash)) { |
| 1022 return false; |
| 1023 } |
| 1024 |
| 918 size_t largest_observed_offset = writer->length(); | 1025 size_t largest_observed_offset = writer->length(); |
| 919 if (!AppendPacketSequenceNumber(frame.received_info.largest_observed, | 1026 if (!AppendPacketSequenceNumber(frame.received_info.largest_observed, |
| 920 writer)) { | 1027 writer)) { |
| 921 return false; | 1028 return false; |
| 922 } | 1029 } |
| 923 | 1030 |
| 924 // We don't check for overflowing uint8 here, because we only can fit 192 acks | 1031 // We don't check for overflowing uint8 here, because we only can fit 192 acks |
| 925 // per packet, so if we overflow we will be truncated. | 1032 // per packet, so if we overflow we will be truncated. |
| 926 uint8 num_missing_packets = frame.received_info.missing_packets.size(); | 1033 uint8 num_missing_packets = frame.received_info.missing_packets.size(); |
| 927 size_t num_missing_packets_offset = writer->length(); | 1034 size_t num_missing_packets_offset = writer->length(); |
| 928 if (!writer->WriteBytes(&num_missing_packets, 1)) { | 1035 if (!writer->WriteBytes(&num_missing_packets, 1)) { |
| 929 return false; | 1036 return false; |
| 930 } | 1037 } |
| 931 | 1038 |
| 932 SequenceSet::const_iterator it = frame.received_info.missing_packets.begin(); | 1039 SequenceNumberSet::const_iterator it = |
| 1040 frame.received_info.missing_packets.begin(); |
| 933 int num_missing_packets_written = 0; | 1041 int num_missing_packets_written = 0; |
| 934 for (; it != frame.received_info.missing_packets.end(); ++it) { | 1042 for (; it != frame.received_info.missing_packets.end(); ++it) { |
| 935 if (!AppendPacketSequenceNumber(*it, writer)) { | 1043 if (!AppendPacketSequenceNumber(*it, writer)) { |
| 936 // We are truncating. Overwrite largest_observed. | 1044 // We are truncating. |
| 937 QuicPacketSequenceNumber largest_observed = | 1045 QuicPacketSequenceNumber largest_observed = |
| 938 CalculateLargestObserved(frame.received_info.missing_packets, --it); | 1046 CalculateLargestObserved(frame.received_info.missing_packets, --it); |
| 1047 // Overwrite entropy hash for received packets. |
| 1048 writer->WriteUInt8ToOffset( |
| 1049 entropy_calculator_->ReceivedEntropyHash(largest_observed), |
| 1050 received_entropy_offset); |
| 1051 // Overwrite largest_observed. |
| 939 writer->WriteUInt48ToOffset(largest_observed & kSequenceNumberMask, | 1052 writer->WriteUInt48ToOffset(largest_observed & kSequenceNumberMask, |
| 940 largest_observed_offset); | 1053 largest_observed_offset); |
| 941 writer->WriteUInt8ToOffset(num_missing_packets_written, | 1054 writer->WriteUInt8ToOffset(num_missing_packets_written, |
| 942 num_missing_packets_offset); | 1055 num_missing_packets_offset); |
| 943 return true; | 1056 return true; |
| 944 } | 1057 } |
| 945 ++num_missing_packets_written; | 1058 ++num_missing_packets_written; |
| 946 DCHECK_GE(numeric_limits<uint8>::max(), num_missing_packets_written); | 1059 DCHECK_GE(numeric_limits<uint8>::max(), num_missing_packets_written); |
| 947 } | 1060 } |
| 948 | 1061 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1038 | 1151 |
| 1039 return true; | 1152 return true; |
| 1040 } | 1153 } |
| 1041 | 1154 |
| 1042 bool QuicFramer::AppendRstStreamFramePayload( | 1155 bool QuicFramer::AppendRstStreamFramePayload( |
| 1043 const QuicRstStreamFrame& frame, | 1156 const QuicRstStreamFrame& frame, |
| 1044 QuicDataWriter* writer) { | 1157 QuicDataWriter* writer) { |
| 1045 if (!writer->WriteUInt32(frame.stream_id)) { | 1158 if (!writer->WriteUInt32(frame.stream_id)) { |
| 1046 return false; | 1159 return false; |
| 1047 } | 1160 } |
| 1048 if (!writer->WriteUInt64(frame.offset)) { | |
| 1049 return false; | |
| 1050 } | |
| 1051 | 1161 |
| 1052 uint32 error_code = static_cast<uint32>(frame.error_code); | 1162 uint32 error_code = static_cast<uint32>(frame.error_code); |
| 1053 if (!writer->WriteUInt32(error_code)) { | 1163 if (!writer->WriteUInt32(error_code)) { |
| 1054 return false; | 1164 return false; |
| 1055 } | 1165 } |
| 1056 | 1166 |
| 1057 if (!writer->WriteStringPiece16(frame.error_details)) { | 1167 if (!writer->WriteStringPiece16(frame.error_details)) { |
| 1058 return false; | 1168 return false; |
| 1059 } | 1169 } |
| 1060 return true; | 1170 return true; |
| 1061 } | 1171 } |
| 1062 | 1172 |
| 1063 bool QuicFramer::AppendConnectionCloseFramePayload( | 1173 bool QuicFramer::AppendConnectionCloseFramePayload( |
| 1064 const QuicConnectionCloseFrame& frame, | 1174 const QuicConnectionCloseFrame& frame, |
| 1065 QuicDataWriter* writer) { | 1175 QuicDataWriter* writer) { |
| 1066 uint32 error_code = static_cast<uint32>(frame.error_code); | 1176 uint32 error_code = static_cast<uint32>(frame.error_code); |
| 1067 if (!writer->WriteUInt32(error_code)) { | 1177 if (!writer->WriteUInt32(error_code)) { |
| 1068 return false; | 1178 return false; |
| 1069 } | 1179 } |
| 1070 if (!writer->WriteStringPiece16(frame.error_details)) { | 1180 if (!writer->WriteStringPiece16(frame.error_details)) { |
| 1071 return false; | 1181 return false; |
| 1072 } | 1182 } |
| 1073 AppendAckFramePayload(frame.ack_frame, writer); | 1183 AppendAckFramePayload(frame.ack_frame, writer); |
| 1074 return true; | 1184 return true; |
| 1075 } | 1185 } |
| 1076 | 1186 |
| 1187 bool QuicFramer::AppendGoAwayFramePayload(const QuicGoAwayFrame& frame, |
| 1188 QuicDataWriter* writer) { |
| 1189 uint32 error_code = static_cast<uint32>(frame.error_code); |
| 1190 if (!writer->WriteUInt32(error_code)) { |
| 1191 return false; |
| 1192 } |
| 1193 uint32 stream_id = static_cast<uint32>(frame.last_good_stream_id); |
| 1194 if (!writer->WriteUInt32(stream_id)) { |
| 1195 return false; |
| 1196 } |
| 1197 if (!writer->WriteStringPiece16(frame.reason_phrase)) { |
| 1198 return false; |
| 1199 } |
| 1200 return true; |
| 1201 } |
| 1202 |
| 1077 bool QuicFramer::RaiseError(QuicErrorCode error) { | 1203 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 1078 DLOG(INFO) << detailed_error_; | 1204 DLOG(INFO) << detailed_error_; |
| 1079 set_error(error); | 1205 set_error(error); |
| 1080 visitor_->OnError(this); | 1206 visitor_->OnError(this); |
| 1081 reader_.reset(NULL); | 1207 reader_.reset(NULL); |
| 1082 return false; | 1208 return false; |
| 1083 } | 1209 } |
| 1084 | 1210 |
| 1085 } // namespace net | 1211 } // namespace net |
| OLD | NEW |