| 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" |
| 11 #include "net/quic/quic_data_writer.h" | 11 #include "net/quic/quic_data_writer.h" |
| 12 #include "net/quic/quic_utils.h" | 12 #include "net/quic/quic_utils.h" |
| 13 | 13 |
| 14 using base::hash_set; | 14 using base::hash_set; |
| 15 using base::StringPiece; | 15 using base::StringPiece; |
| 16 | 16 |
| 17 namespace net { | 17 namespace net { |
| 18 | 18 |
| 19 QuicFramer::QuicFramer(QuicDecrypter* decrypter, QuicEncrypter* encrypter) | 19 QuicFramer::QuicFramer(QuicDecrypter* decrypter, QuicEncrypter* encrypter) |
| 20 : visitor_(NULL), | 20 : visitor_(NULL), |
| 21 fec_builder_(NULL), | 21 fec_builder_(NULL), |
| 22 error_(QUIC_NO_ERROR), | 22 error_(QUIC_NO_ERROR), |
| 23 decrypter_(decrypter), | 23 decrypter_(decrypter), |
| 24 encrypter_(encrypter) { | 24 encrypter_(encrypter) { |
| 25 } | 25 } |
| 26 | 26 |
| 27 QuicFramer::~QuicFramer() {} | 27 QuicFramer::~QuicFramer() {} |
| 28 | 28 |
| 29 bool QuicFramer::ConstructFragementDataPacket( | 29 bool QuicFramer::ConstructFrameDataPacket( |
| 30 const QuicPacketHeader& header, | 30 const QuicPacketHeader& header, |
| 31 const QuicFrames& frames, | 31 const QuicFrames& frames, |
| 32 QuicPacket** packet) { | 32 QuicPacket** packet) { |
| 33 // Compute the length of the packet. We use "magic numbers" here because | 33 // Compute the length of the packet. We use "magic numbers" here because |
| 34 // sizeof(member_) is not necessairly the same as sizeof(member_wire_format). | 34 // sizeof(member_) is not necessairly the same as sizeof(member_wire_format). |
| 35 size_t len = kPacketHeaderSize; | 35 size_t len = kPacketHeaderSize; |
| 36 len += 1; // frame count | 36 len += 1; // frame count |
| 37 for (size_t i = 0; i < frames.size(); ++i) { | 37 for (size_t i = 0; i < frames.size(); ++i) { |
| 38 len += 1; // space for the 8 bit type | 38 len += 1; // space for the 8 bit type |
| 39 len += ComputeFramePayloadLength(frames[i]); | 39 len += ComputeFramePayloadLength(frames[i]); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 case CONNECTION_CLOSE_FRAME: | 82 case CONNECTION_CLOSE_FRAME: |
| 83 if (!AppendConnectionCloseFramePayload( | 83 if (!AppendConnectionCloseFramePayload( |
| 84 *frame.connection_close_frame, &writer)) { | 84 *frame.connection_close_frame, &writer)) { |
| 85 return false; | 85 return false; |
| 86 } | 86 } |
| 87 break; | 87 break; |
| 88 default: | 88 default: |
| 89 return RaiseError(QUIC_INVALID_FRAME_DATA); | 89 return RaiseError(QUIC_INVALID_FRAME_DATA); |
| 90 } | 90 } |
| 91 } | 91 } |
| 92 |
| 92 DCHECK_EQ(len, writer.length()); | 93 DCHECK_EQ(len, writer.length()); |
| 93 *packet = new QuicPacket(writer.take(), len, true); | 94 *packet = new QuicPacket(writer.take(), len, true, PACKET_FLAGS_NONE); |
| 94 if (fec_builder_) { | 95 if (fec_builder_) { |
| 95 fec_builder_->OnBuiltFecProtectedPayload(header, | 96 fec_builder_->OnBuiltFecProtectedPayload(header, |
| 96 (*packet)->FecProtectedData()); | 97 (*packet)->FecProtectedData()); |
| 97 } | 98 } |
| 98 | 99 |
| 99 return true; | 100 return true; |
| 100 } | 101 } |
| 101 | 102 |
| 102 bool QuicFramer::ConstructFecPacket(const QuicPacketHeader& header, | 103 bool QuicFramer::ConstructFecPacket(const QuicPacketHeader& header, |
| 103 const QuicFecData& fec, | 104 const QuicFecData& fec, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 115 } | 116 } |
| 116 | 117 |
| 117 if (!writer.WriteUInt48(fec.min_protected_packet_sequence_number)) { | 118 if (!writer.WriteUInt48(fec.min_protected_packet_sequence_number)) { |
| 118 return false; | 119 return false; |
| 119 } | 120 } |
| 120 | 121 |
| 121 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { | 122 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { |
| 122 return false; | 123 return false; |
| 123 } | 124 } |
| 124 | 125 |
| 125 *packet = new QuicPacket(writer.take(), len, true); | 126 *packet = new QuicPacket(writer.take(), len, true, PACKET_FLAGS_FEC); |
| 126 | 127 |
| 127 return true; | 128 return true; |
| 128 } | 129 } |
| 129 | 130 |
| 130 void QuicFramer::IncrementRetransmitCount(QuicPacket* packet) { | |
| 131 CHECK_GT(packet->length(), kPacketHeaderSize); | |
| 132 | |
| 133 ++packet->mutable_data()[kRetransmissionOffset]; | |
| 134 } | |
| 135 | |
| 136 uint8 QuicFramer::GetRetransmitCount(QuicPacket* packet) { | |
| 137 CHECK_GT(packet->length(), kPacketHeaderSize); | |
| 138 | |
| 139 return packet->mutable_data()[kRetransmissionOffset]; | |
| 140 } | |
| 141 | |
| 142 bool QuicFramer::ProcessPacket(const IPEndPoint& self_address, | 131 bool QuicFramer::ProcessPacket(const IPEndPoint& self_address, |
| 143 const IPEndPoint& peer_address, | 132 const IPEndPoint& peer_address, |
| 144 const QuicEncryptedPacket& packet) { | 133 const QuicEncryptedPacket& packet) { |
| 145 DCHECK(!reader_.get()); | 134 DCHECK(!reader_.get()); |
| 146 reader_.reset(new QuicDataReader(packet.data(), packet.length())); | 135 reader_.reset(new QuicDataReader(packet.data(), packet.length())); |
| 147 visitor_->OnPacket(self_address, peer_address); | 136 visitor_->OnPacket(self_address, peer_address); |
| 148 | 137 |
| 149 // First parse the packet header. | 138 // First parse the packet header. |
| 150 QuicPacketHeader header; | 139 QuicPacketHeader header; |
| 151 if (!ProcessPacketHeader(&header, packet)) { | 140 if (!ProcessPacketHeader(&header, packet)) { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 QuicDataWriter* writer) { | 210 QuicDataWriter* writer) { |
| 222 // ConnectionHeader | 211 // ConnectionHeader |
| 223 if (!writer->WriteUInt64(header.guid)) { | 212 if (!writer->WriteUInt64(header.guid)) { |
| 224 return false; | 213 return false; |
| 225 } | 214 } |
| 226 | 215 |
| 227 if (!writer->WriteUInt48(header.packet_sequence_number)) { | 216 if (!writer->WriteUInt48(header.packet_sequence_number)) { |
| 228 return false; | 217 return false; |
| 229 } | 218 } |
| 230 | 219 |
| 231 if (!writer->WriteBytes(&header.retransmission_count, 1)) { | |
| 232 return false; | |
| 233 } | |
| 234 | |
| 235 // CongestionMonitoredHeader | 220 // CongestionMonitoredHeader |
| 236 if (!writer->WriteUInt64(header.transmission_time)) { | 221 if (!writer->WriteUInt64(header.transmission_time)) { |
| 237 return false; | 222 return false; |
| 238 } | 223 } |
| 239 | 224 |
| 240 uint8 flags = static_cast<uint8>(header.flags); | 225 uint8 flags = static_cast<uint8>(header.flags); |
| 241 if (!writer->WriteBytes(&flags, 1)) { | 226 if (!writer->WriteBytes(&flags, 1)) { |
| 242 return false; | 227 return false; |
| 243 } | 228 } |
| 244 | 229 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 255 if (!reader_->ReadUInt64(&header->guid)) { | 240 if (!reader_->ReadUInt64(&header->guid)) { |
| 256 set_detailed_error("Unable to read GUID."); | 241 set_detailed_error("Unable to read GUID."); |
| 257 return false; | 242 return false; |
| 258 } | 243 } |
| 259 | 244 |
| 260 if (!reader_->ReadUInt48(&header->packet_sequence_number)) { | 245 if (!reader_->ReadUInt48(&header->packet_sequence_number)) { |
| 261 set_detailed_error("Unable to read sequence number."); | 246 set_detailed_error("Unable to read sequence number."); |
| 262 return false; | 247 return false; |
| 263 } | 248 } |
| 264 | 249 |
| 265 if (!reader_->ReadBytes(&header->retransmission_count, 1)) { | |
| 266 set_detailed_error("Unable to read retransmission count."); | |
| 267 return false; | |
| 268 } | |
| 269 | |
| 270 // CongestionMonitoredHeader | 250 // CongestionMonitoredHeader |
| 271 if (!reader_->ReadUInt64(&header->transmission_time)) { | 251 if (!reader_->ReadUInt64(&header->transmission_time)) { |
| 272 set_detailed_error("Unable to read transmission time."); | 252 set_detailed_error("Unable to read transmission time."); |
| 273 return false; | 253 return false; |
| 274 } | 254 } |
| 275 | 255 |
| 276 unsigned char flags; | 256 unsigned char flags; |
| 277 if (!reader_->ReadBytes(&flags, 1)) { | 257 if (!reader_->ReadBytes(&flags, 1)) { |
| 278 set_detailed_error("Unable to read flags."); | 258 set_detailed_error("Unable to read flags."); |
| 279 return false; | 259 return false; |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 visitor_->OnConnectionCloseFrame(frame); | 530 visitor_->OnConnectionCloseFrame(frame); |
| 551 return true; | 531 return true; |
| 552 } | 532 } |
| 553 | 533 |
| 554 void QuicFramer::WriteTransmissionTime(QuicTransmissionTime time, | 534 void QuicFramer::WriteTransmissionTime(QuicTransmissionTime time, |
| 555 QuicPacket* packet) { | 535 QuicPacket* packet) { |
| 556 QuicDataWriter::WriteUint64ToBuffer( | 536 QuicDataWriter::WriteUint64ToBuffer( |
| 557 time, packet->mutable_data() + kTransmissionTimeOffset); | 537 time, packet->mutable_data() + kTransmissionTimeOffset); |
| 558 } | 538 } |
| 559 | 539 |
| 540 void QuicFramer::WriteSequenceNumber(QuicPacketSequenceNumber sequence_number, |
| 541 QuicPacket* packet) { |
| 542 QuicDataWriter::WriteUint48ToBuffer( |
| 543 sequence_number, packet->mutable_data() + kSequenceNumberOffset); |
| 544 } |
| 545 |
| 546 void QuicFramer::WriteFecGroup(QuicFecGroupNumber fec_group, |
| 547 QuicPacket* packet) { |
| 548 QuicDataWriter::WriteUint8ToBuffer( |
| 549 fec_group, packet->mutable_data() + kFecGroupOffset); |
| 550 } |
| 551 |
| 560 QuicEncryptedPacket* QuicFramer::EncryptPacket(const QuicPacket& packet) { | 552 QuicEncryptedPacket* QuicFramer::EncryptPacket(const QuicPacket& packet) { |
| 561 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet.AssociatedData(), | 553 scoped_ptr<QuicData> out(encrypter_->Encrypt(packet.AssociatedData(), |
| 562 packet.Plaintext())); | 554 packet.Plaintext())); |
| 563 if (out.get() == NULL) { | 555 if (out.get() == NULL) { |
| 564 RaiseError(QUIC_ENCRYPTION_FAILURE); | 556 RaiseError(QUIC_ENCRYPTION_FAILURE); |
| 565 return NULL; | 557 return NULL; |
| 566 } | 558 } |
| 567 size_t len = kStartOfEncryptedData + out->length(); | 559 size_t len = kStartOfEncryptedData + out->length(); |
| 568 char* buffer = new char[len]; | 560 char* buffer = new char[len]; |
| 569 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). | 561 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 | 796 |
| 805 bool QuicFramer::RaiseError(QuicErrorCode error) { | 797 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 806 DLOG(INFO) << detailed_error_; | 798 DLOG(INFO) << detailed_error_; |
| 807 set_error(error); | 799 set_error(error); |
| 808 visitor_->OnError(this); | 800 visitor_->OnError(this); |
| 809 reader_.reset(NULL); | 801 reader_.reset(NULL); |
| 810 return false; | 802 return false; |
| 811 } | 803 } |
| 812 | 804 |
| 813 } // namespace net | 805 } // namespace net |
| OLD | NEW |