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/containers/hash_tables.h" | 7 #include "base/containers/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 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 } | 304 } |
305 | 305 |
306 SerializedPacket QuicFramer::BuildDataPacket( | 306 SerializedPacket QuicFramer::BuildDataPacket( |
307 const QuicPacketHeader& header, | 307 const QuicPacketHeader& header, |
308 const QuicFrames& frames, | 308 const QuicFrames& frames, |
309 size_t packet_size) { | 309 size_t packet_size) { |
310 QuicDataWriter writer(packet_size); | 310 QuicDataWriter writer(packet_size); |
311 const SerializedPacket kNoPacket( | 311 const SerializedPacket kNoPacket( |
312 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); | 312 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); |
313 if (!AppendPacketHeader(header, &writer)) { | 313 if (!AppendPacketHeader(header, &writer)) { |
| 314 LOG(DFATAL) << "AppendPacketHeader failed"; |
314 return kNoPacket; | 315 return kNoPacket; |
315 } | 316 } |
316 | 317 |
317 for (size_t i = 0; i < frames.size(); ++i) { | 318 for (size_t i = 0; i < frames.size(); ++i) { |
318 const QuicFrame& frame = frames[i]; | 319 const QuicFrame& frame = frames[i]; |
319 | 320 |
320 const bool last_frame_in_packet = i == (frames.size() - 1); | 321 const bool last_frame_in_packet = i == (frames.size() - 1); |
321 if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) { | 322 if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) { |
| 323 LOG(DFATAL) << "AppendTypeByte failed"; |
322 return kNoPacket; | 324 return kNoPacket; |
323 } | 325 } |
324 | 326 |
325 switch (frame.type) { | 327 switch (frame.type) { |
326 case PADDING_FRAME: | 328 case PADDING_FRAME: |
327 writer.WritePadding(); | 329 writer.WritePadding(); |
328 break; | 330 break; |
329 case STREAM_FRAME: | 331 case STREAM_FRAME: |
330 if (!AppendStreamFramePayload( | 332 if (!AppendStreamFramePayload( |
331 *frame.stream_frame, last_frame_in_packet, &writer)) { | 333 *frame.stream_frame, last_frame_in_packet, &writer)) { |
| 334 LOG(DFATAL) << "AppendStreamFramePayload failed"; |
332 return kNoPacket; | 335 return kNoPacket; |
333 } | 336 } |
334 break; | 337 break; |
335 case ACK_FRAME: | 338 case ACK_FRAME: |
336 if (!AppendAckFramePayloadAndTypeByte( | 339 if (!AppendAckFramePayloadAndTypeByte( |
337 header, *frame.ack_frame, &writer)) { | 340 header, *frame.ack_frame, &writer)) { |
| 341 LOG(DFATAL) << "AppendAckFramePayloadAndTypeByte failed"; |
338 return kNoPacket; | 342 return kNoPacket; |
339 } | 343 } |
340 break; | 344 break; |
341 case CONGESTION_FEEDBACK_FRAME: | 345 case CONGESTION_FEEDBACK_FRAME: |
342 if (!AppendQuicCongestionFeedbackFramePayload( | 346 if (!AppendQuicCongestionFeedbackFramePayload( |
343 *frame.congestion_feedback_frame, &writer)) { | 347 *frame.congestion_feedback_frame, &writer)) { |
| 348 LOG(DFATAL) << "AppendQuicCongestionFeedbackFramePayload failed"; |
344 return kNoPacket; | 349 return kNoPacket; |
345 } | 350 } |
346 break; | 351 break; |
347 case RST_STREAM_FRAME: | 352 case RST_STREAM_FRAME: |
348 if (!AppendRstStreamFramePayload(*frame.rst_stream_frame, &writer)) { | 353 if (!AppendRstStreamFramePayload(*frame.rst_stream_frame, &writer)) { |
| 354 LOG(DFATAL) << "AppendRstStreamFramePayload failed"; |
349 return kNoPacket; | 355 return kNoPacket; |
350 } | 356 } |
351 break; | 357 break; |
352 case CONNECTION_CLOSE_FRAME: | 358 case CONNECTION_CLOSE_FRAME: |
353 if (!AppendConnectionCloseFramePayload( | 359 if (!AppendConnectionCloseFramePayload( |
354 *frame.connection_close_frame, &writer)) { | 360 *frame.connection_close_frame, &writer)) { |
| 361 LOG(DFATAL) << "AppendConnectionCloseFramePayload failed"; |
355 return kNoPacket; | 362 return kNoPacket; |
356 } | 363 } |
357 break; | 364 break; |
358 case GOAWAY_FRAME: | 365 case GOAWAY_FRAME: |
359 if (!AppendGoAwayFramePayload(*frame.goaway_frame, &writer)) { | 366 if (!AppendGoAwayFramePayload(*frame.goaway_frame, &writer)) { |
| 367 LOG(DFATAL) << "AppendGoAwayFramePayload failed"; |
360 return kNoPacket; | 368 return kNoPacket; |
361 } | 369 } |
362 break; | 370 break; |
363 default: | 371 default: |
364 RaiseError(QUIC_INVALID_FRAME_DATA); | 372 RaiseError(QUIC_INVALID_FRAME_DATA); |
| 373 LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA"; |
365 return kNoPacket; | 374 return kNoPacket; |
366 } | 375 } |
367 } | 376 } |
368 | 377 |
369 // Save the length before writing, because take clears it. | 378 // Save the length before writing, because take clears it. |
370 const size_t len = writer.length(); | 379 const size_t len = writer.length(); |
371 // Less than or equal because truncated acks end up with max_plaintex_size | 380 // Less than or equal because truncated acks end up with max_plaintex_size |
372 // length, even though they're typically slightly shorter. | 381 // length, even though they're typically slightly shorter. |
373 DCHECK_LE(len, packet_size); | 382 DCHECK_LE(len, packet_size); |
374 QuicPacket* packet = QuicPacket::NewDataPacket( | 383 QuicPacket* packet = QuicPacket::NewDataPacket( |
(...skipping 15 matching lines...) Expand all Loading... |
390 const QuicFecData& fec) { | 399 const QuicFecData& fec) { |
391 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); | 400 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group); |
392 DCHECK_NE(0u, header.fec_group); | 401 DCHECK_NE(0u, header.fec_group); |
393 size_t len = GetPacketHeaderSize(header); | 402 size_t len = GetPacketHeaderSize(header); |
394 len += fec.redundancy.length(); | 403 len += fec.redundancy.length(); |
395 | 404 |
396 QuicDataWriter writer(len); | 405 QuicDataWriter writer(len); |
397 const SerializedPacket kNoPacket( | 406 const SerializedPacket kNoPacket( |
398 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); | 407 0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); |
399 if (!AppendPacketHeader(header, &writer)) { | 408 if (!AppendPacketHeader(header, &writer)) { |
| 409 LOG(DFATAL) << "AppendPacketHeader failed"; |
400 return kNoPacket; | 410 return kNoPacket; |
401 } | 411 } |
402 | 412 |
403 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { | 413 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { |
| 414 LOG(DFATAL) << "Failed to add FEC"; |
404 return kNoPacket; | 415 return kNoPacket; |
405 } | 416 } |
406 | 417 |
407 return SerializedPacket( | 418 return SerializedPacket( |
408 header.packet_sequence_number, | 419 header.packet_sequence_number, |
409 header.public_header.sequence_number_length, | 420 header.public_header.sequence_number_length, |
410 QuicPacket::NewFecPacket(writer.take(), len, true, | 421 QuicPacket::NewFecPacket(writer.take(), len, true, |
411 header.public_header.guid_length, | 422 header.public_header.guid_length, |
412 header.public_header.version_flag, | 423 header.public_header.version_flag, |
413 header.public_header.sequence_number_length), | 424 header.public_header.sequence_number_length), |
(...skipping 1626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2040 | 2051 |
2041 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2052 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2042 DVLOG(1) << "Error detail: " << detailed_error_; | 2053 DVLOG(1) << "Error detail: " << detailed_error_; |
2043 set_error(error); | 2054 set_error(error); |
2044 visitor_->OnError(this); | 2055 visitor_->OnError(this); |
2045 reader_.reset(NULL); | 2056 reader_.reset(NULL); |
2046 return false; | 2057 return false; |
2047 } | 2058 } |
2048 | 2059 |
2049 } // namespace net | 2060 } // namespace net |
OLD | NEW |