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/core/quic_packets.h" |
| 6 |
| 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "net/quic/core/quic_flags.h" |
| 10 #include "net/quic/core/quic_utils.h" |
| 11 #include "net/quic/core/quic_versions.h" |
| 12 |
| 13 using base::StringPiece; |
| 14 using std::map; |
| 15 using std::numeric_limits; |
| 16 using std::ostream; |
| 17 using std::string; |
| 18 |
| 19 namespace net { |
| 20 |
| 21 size_t GetPacketHeaderSize(QuicVersion version, |
| 22 const QuicPacketHeader& header) { |
| 23 return GetPacketHeaderSize(version, header.public_header.connection_id_length, |
| 24 header.public_header.version_flag, |
| 25 header.public_header.multipath_flag, |
| 26 header.public_header.nonce != nullptr, |
| 27 header.public_header.packet_number_length); |
| 28 } |
| 29 |
| 30 size_t GetPacketHeaderSize(QuicVersion version, |
| 31 QuicConnectionIdLength connection_id_length, |
| 32 bool include_version, |
| 33 bool include_path_id, |
| 34 bool include_diversification_nonce, |
| 35 QuicPacketNumberLength packet_number_length) { |
| 36 return kPublicFlagsSize + connection_id_length + |
| 37 (include_version ? kQuicVersionSize : 0) + |
| 38 (include_path_id ? kQuicPathIdSize : 0) + packet_number_length + |
| 39 (include_diversification_nonce ? kDiversificationNonceSize : 0); |
| 40 } |
| 41 |
| 42 size_t GetStartOfEncryptedData(QuicVersion version, |
| 43 const QuicPacketHeader& header) { |
| 44 return GetPacketHeaderSize(version, header); |
| 45 } |
| 46 |
| 47 size_t GetStartOfEncryptedData(QuicVersion version, |
| 48 QuicConnectionIdLength connection_id_length, |
| 49 bool include_version, |
| 50 bool include_path_id, |
| 51 bool include_diversification_nonce, |
| 52 QuicPacketNumberLength packet_number_length) { |
| 53 // Encryption starts before private flags. |
| 54 return GetPacketHeaderSize(version, connection_id_length, include_version, |
| 55 include_path_id, include_diversification_nonce, |
| 56 packet_number_length); |
| 57 } |
| 58 |
| 59 QuicPacketPublicHeader::QuicPacketPublicHeader() |
| 60 : connection_id(0), |
| 61 connection_id_length(PACKET_8BYTE_CONNECTION_ID), |
| 62 multipath_flag(false), |
| 63 reset_flag(false), |
| 64 version_flag(false), |
| 65 packet_number_length(PACKET_6BYTE_PACKET_NUMBER), |
| 66 nonce(nullptr) {} |
| 67 |
| 68 QuicPacketPublicHeader::QuicPacketPublicHeader( |
| 69 const QuicPacketPublicHeader& other) = default; |
| 70 |
| 71 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} |
| 72 |
| 73 QuicPacketHeader::QuicPacketHeader() |
| 74 : packet_number(0), path_id(kDefaultPathId) {} |
| 75 |
| 76 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) |
| 77 : public_header(header), packet_number(0), path_id(kDefaultPathId) {} |
| 78 |
| 79 QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default; |
| 80 |
| 81 QuicPublicResetPacket::QuicPublicResetPacket() |
| 82 : nonce_proof(0), rejected_packet_number(0) {} |
| 83 |
| 84 QuicPublicResetPacket::QuicPublicResetPacket( |
| 85 const QuicPacketPublicHeader& header) |
| 86 : public_header(header), nonce_proof(0), rejected_packet_number(0) {} |
| 87 |
| 88 ostream& operator<<(ostream& os, const QuicPacketHeader& header) { |
| 89 os << "{ connection_id: " << header.public_header.connection_id |
| 90 << ", connection_id_length: " << header.public_header.connection_id_length |
| 91 << ", packet_number_length: " << header.public_header.packet_number_length |
| 92 << ", multipath_flag: " << header.public_header.multipath_flag |
| 93 << ", reset_flag: " << header.public_header.reset_flag |
| 94 << ", version_flag: " << header.public_header.version_flag; |
| 95 if (header.public_header.version_flag) { |
| 96 os << ", version:"; |
| 97 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { |
| 98 os << " "; |
| 99 os << QuicVersionToString(header.public_header.versions[i]); |
| 100 } |
| 101 } |
| 102 if (header.public_header.nonce != nullptr) { |
| 103 os << ", diversification_nonce: " |
| 104 << QuicUtils::HexEncode(StringPiece(header.public_header.nonce->data(), |
| 105 header.public_header.nonce->size())); |
| 106 } |
| 107 os << ", path_id: " << static_cast<int>(header.path_id) |
| 108 << ", packet_number: " << header.packet_number << " }\n"; |
| 109 return os; |
| 110 } |
| 111 |
| 112 QuicData::QuicData(const char* buffer, size_t length) |
| 113 : buffer_(buffer), length_(length), owns_buffer_(false) {} |
| 114 |
| 115 QuicData::QuicData(const char* buffer, size_t length, bool owns_buffer) |
| 116 : buffer_(buffer), length_(length), owns_buffer_(owns_buffer) {} |
| 117 |
| 118 QuicData::~QuicData() { |
| 119 if (owns_buffer_) { |
| 120 delete[] const_cast<char*>(buffer_); |
| 121 } |
| 122 } |
| 123 |
| 124 QuicPacket::QuicPacket(char* buffer, |
| 125 size_t length, |
| 126 bool owns_buffer, |
| 127 QuicConnectionIdLength connection_id_length, |
| 128 bool includes_version, |
| 129 bool includes_path_id, |
| 130 bool includes_diversification_nonce, |
| 131 QuicPacketNumberLength packet_number_length) |
| 132 : QuicData(buffer, length, owns_buffer), |
| 133 buffer_(buffer), |
| 134 connection_id_length_(connection_id_length), |
| 135 includes_version_(includes_version), |
| 136 includes_path_id_(includes_path_id), |
| 137 includes_diversification_nonce_(includes_diversification_nonce), |
| 138 packet_number_length_(packet_number_length) {} |
| 139 |
| 140 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, size_t length) |
| 141 : QuicData(buffer, length) {} |
| 142 |
| 143 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, |
| 144 size_t length, |
| 145 bool owns_buffer) |
| 146 : QuicData(buffer, length, owns_buffer) {} |
| 147 |
| 148 std::unique_ptr<QuicEncryptedPacket> QuicEncryptedPacket::Clone() const { |
| 149 char* buffer = new char[this->length()]; |
| 150 memcpy(buffer, this->data(), this->length()); |
| 151 return base::MakeUnique<QuicEncryptedPacket>(buffer, this->length(), true); |
| 152 } |
| 153 |
| 154 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) { |
| 155 os << s.length() << "-byte data"; |
| 156 return os; |
| 157 } |
| 158 |
| 159 QuicReceivedPacket::QuicReceivedPacket(const char* buffer, |
| 160 size_t length, |
| 161 QuicTime receipt_time) |
| 162 : QuicEncryptedPacket(buffer, length), |
| 163 receipt_time_(receipt_time), |
| 164 ttl_(0) {} |
| 165 |
| 166 QuicReceivedPacket::QuicReceivedPacket(const char* buffer, |
| 167 size_t length, |
| 168 QuicTime receipt_time, |
| 169 bool owns_buffer) |
| 170 : QuicEncryptedPacket(buffer, length, owns_buffer), |
| 171 receipt_time_(receipt_time), |
| 172 ttl_(0) {} |
| 173 |
| 174 QuicReceivedPacket::QuicReceivedPacket(const char* buffer, |
| 175 size_t length, |
| 176 QuicTime receipt_time, |
| 177 bool owns_buffer, |
| 178 int ttl, |
| 179 bool ttl_valid) |
| 180 : QuicEncryptedPacket(buffer, length, owns_buffer), |
| 181 receipt_time_(receipt_time), |
| 182 ttl_(ttl_valid ? ttl : -1) {} |
| 183 |
| 184 std::unique_ptr<QuicReceivedPacket> QuicReceivedPacket::Clone() const { |
| 185 char* buffer = new char[this->length()]; |
| 186 memcpy(buffer, this->data(), this->length()); |
| 187 return base::MakeUnique<QuicReceivedPacket>( |
| 188 buffer, this->length(), receipt_time(), true, ttl(), ttl() >= 0); |
| 189 } |
| 190 |
| 191 ostream& operator<<(ostream& os, const QuicReceivedPacket& s) { |
| 192 os << s.length() << "-byte data"; |
| 193 return os; |
| 194 } |
| 195 |
| 196 StringPiece QuicPacket::AssociatedData(QuicVersion version) const { |
| 197 return StringPiece( |
| 198 data(), GetStartOfEncryptedData(version, connection_id_length_, |
| 199 includes_version_, includes_path_id_, |
| 200 includes_diversification_nonce_, |
| 201 packet_number_length_)); |
| 202 } |
| 203 |
| 204 StringPiece QuicPacket::Plaintext(QuicVersion version) const { |
| 205 const size_t start_of_encrypted_data = GetStartOfEncryptedData( |
| 206 version, connection_id_length_, includes_version_, includes_path_id_, |
| 207 includes_diversification_nonce_, packet_number_length_); |
| 208 return StringPiece(data() + start_of_encrypted_data, |
| 209 length() - start_of_encrypted_data); |
| 210 } |
| 211 |
| 212 SerializedPacket::SerializedPacket(QuicPathId path_id, |
| 213 QuicPacketNumber packet_number, |
| 214 QuicPacketNumberLength packet_number_length, |
| 215 const char* encrypted_buffer, |
| 216 QuicPacketLength encrypted_length, |
| 217 bool has_ack, |
| 218 bool has_stop_waiting) |
| 219 : encrypted_buffer(encrypted_buffer), |
| 220 encrypted_length(encrypted_length), |
| 221 has_crypto_handshake(NOT_HANDSHAKE), |
| 222 num_padding_bytes(0), |
| 223 path_id(path_id), |
| 224 packet_number(packet_number), |
| 225 packet_number_length(packet_number_length), |
| 226 encryption_level(ENCRYPTION_NONE), |
| 227 has_ack(has_ack), |
| 228 has_stop_waiting(has_stop_waiting), |
| 229 transmission_type(NOT_RETRANSMISSION), |
| 230 original_path_id(kInvalidPathId), |
| 231 original_packet_number(0) {} |
| 232 |
| 233 SerializedPacket::SerializedPacket(const SerializedPacket& other) = default; |
| 234 |
| 235 SerializedPacket::~SerializedPacket() {} |
| 236 |
| 237 void ClearSerializedPacket(SerializedPacket* serialized_packet) { |
| 238 if (!serialized_packet->retransmittable_frames.empty()) { |
| 239 DeleteFrames(&serialized_packet->retransmittable_frames); |
| 240 } |
| 241 serialized_packet->encrypted_buffer = nullptr; |
| 242 serialized_packet->encrypted_length = 0; |
| 243 } |
| 244 |
| 245 char* CopyBuffer(const SerializedPacket& packet) { |
| 246 char* dst_buffer = new char[packet.encrypted_length]; |
| 247 memcpy(dst_buffer, packet.encrypted_buffer, packet.encrypted_length); |
| 248 return dst_buffer; |
| 249 } |
| 250 |
| 251 } // namespace net |
OLD | NEW |