| Index: net/quic/core/quic_packets.cc
|
| diff --git a/net/quic/core/quic_packets.cc b/net/quic/core/quic_packets.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..253155d00b492b6acf586cb9cb7aa17f40e1ca06
|
| --- /dev/null
|
| +++ b/net/quic/core/quic_packets.cc
|
| @@ -0,0 +1,251 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "net/quic/core/quic_packets.h"
|
| +
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| +#include "net/quic/core/quic_flags.h"
|
| +#include "net/quic/core/quic_utils.h"
|
| +#include "net/quic/core/quic_versions.h"
|
| +
|
| +using base::StringPiece;
|
| +using std::map;
|
| +using std::numeric_limits;
|
| +using std::ostream;
|
| +using std::string;
|
| +
|
| +namespace net {
|
| +
|
| +size_t GetPacketHeaderSize(QuicVersion version,
|
| + const QuicPacketHeader& header) {
|
| + return GetPacketHeaderSize(version, header.public_header.connection_id_length,
|
| + header.public_header.version_flag,
|
| + header.public_header.multipath_flag,
|
| + header.public_header.nonce != nullptr,
|
| + header.public_header.packet_number_length);
|
| +}
|
| +
|
| +size_t GetPacketHeaderSize(QuicVersion version,
|
| + QuicConnectionIdLength connection_id_length,
|
| + bool include_version,
|
| + bool include_path_id,
|
| + bool include_diversification_nonce,
|
| + QuicPacketNumberLength packet_number_length) {
|
| + return kPublicFlagsSize + connection_id_length +
|
| + (include_version ? kQuicVersionSize : 0) +
|
| + (include_path_id ? kQuicPathIdSize : 0) + packet_number_length +
|
| + (include_diversification_nonce ? kDiversificationNonceSize : 0);
|
| +}
|
| +
|
| +size_t GetStartOfEncryptedData(QuicVersion version,
|
| + const QuicPacketHeader& header) {
|
| + return GetPacketHeaderSize(version, header);
|
| +}
|
| +
|
| +size_t GetStartOfEncryptedData(QuicVersion version,
|
| + QuicConnectionIdLength connection_id_length,
|
| + bool include_version,
|
| + bool include_path_id,
|
| + bool include_diversification_nonce,
|
| + QuicPacketNumberLength packet_number_length) {
|
| + // Encryption starts before private flags.
|
| + return GetPacketHeaderSize(version, connection_id_length, include_version,
|
| + include_path_id, include_diversification_nonce,
|
| + packet_number_length);
|
| +}
|
| +
|
| +QuicPacketPublicHeader::QuicPacketPublicHeader()
|
| + : connection_id(0),
|
| + connection_id_length(PACKET_8BYTE_CONNECTION_ID),
|
| + multipath_flag(false),
|
| + reset_flag(false),
|
| + version_flag(false),
|
| + packet_number_length(PACKET_6BYTE_PACKET_NUMBER),
|
| + nonce(nullptr) {}
|
| +
|
| +QuicPacketPublicHeader::QuicPacketPublicHeader(
|
| + const QuicPacketPublicHeader& other) = default;
|
| +
|
| +QuicPacketPublicHeader::~QuicPacketPublicHeader() {}
|
| +
|
| +QuicPacketHeader::QuicPacketHeader()
|
| + : packet_number(0), path_id(kDefaultPathId) {}
|
| +
|
| +QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header)
|
| + : public_header(header), packet_number(0), path_id(kDefaultPathId) {}
|
| +
|
| +QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default;
|
| +
|
| +QuicPublicResetPacket::QuicPublicResetPacket()
|
| + : nonce_proof(0), rejected_packet_number(0) {}
|
| +
|
| +QuicPublicResetPacket::QuicPublicResetPacket(
|
| + const QuicPacketPublicHeader& header)
|
| + : public_header(header), nonce_proof(0), rejected_packet_number(0) {}
|
| +
|
| +ostream& operator<<(ostream& os, const QuicPacketHeader& header) {
|
| + os << "{ connection_id: " << header.public_header.connection_id
|
| + << ", connection_id_length: " << header.public_header.connection_id_length
|
| + << ", packet_number_length: " << header.public_header.packet_number_length
|
| + << ", multipath_flag: " << header.public_header.multipath_flag
|
| + << ", reset_flag: " << header.public_header.reset_flag
|
| + << ", version_flag: " << header.public_header.version_flag;
|
| + if (header.public_header.version_flag) {
|
| + os << ", version:";
|
| + for (size_t i = 0; i < header.public_header.versions.size(); ++i) {
|
| + os << " ";
|
| + os << QuicVersionToString(header.public_header.versions[i]);
|
| + }
|
| + }
|
| + if (header.public_header.nonce != nullptr) {
|
| + os << ", diversification_nonce: "
|
| + << QuicUtils::HexEncode(StringPiece(header.public_header.nonce->data(),
|
| + header.public_header.nonce->size()));
|
| + }
|
| + os << ", path_id: " << static_cast<int>(header.path_id)
|
| + << ", packet_number: " << header.packet_number << " }\n";
|
| + return os;
|
| +}
|
| +
|
| +QuicData::QuicData(const char* buffer, size_t length)
|
| + : buffer_(buffer), length_(length), owns_buffer_(false) {}
|
| +
|
| +QuicData::QuicData(const char* buffer, size_t length, bool owns_buffer)
|
| + : buffer_(buffer), length_(length), owns_buffer_(owns_buffer) {}
|
| +
|
| +QuicData::~QuicData() {
|
| + if (owns_buffer_) {
|
| + delete[] const_cast<char*>(buffer_);
|
| + }
|
| +}
|
| +
|
| +QuicPacket::QuicPacket(char* buffer,
|
| + size_t length,
|
| + bool owns_buffer,
|
| + QuicConnectionIdLength connection_id_length,
|
| + bool includes_version,
|
| + bool includes_path_id,
|
| + bool includes_diversification_nonce,
|
| + QuicPacketNumberLength packet_number_length)
|
| + : QuicData(buffer, length, owns_buffer),
|
| + buffer_(buffer),
|
| + connection_id_length_(connection_id_length),
|
| + includes_version_(includes_version),
|
| + includes_path_id_(includes_path_id),
|
| + includes_diversification_nonce_(includes_diversification_nonce),
|
| + packet_number_length_(packet_number_length) {}
|
| +
|
| +QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, size_t length)
|
| + : QuicData(buffer, length) {}
|
| +
|
| +QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer,
|
| + size_t length,
|
| + bool owns_buffer)
|
| + : QuicData(buffer, length, owns_buffer) {}
|
| +
|
| +std::unique_ptr<QuicEncryptedPacket> QuicEncryptedPacket::Clone() const {
|
| + char* buffer = new char[this->length()];
|
| + memcpy(buffer, this->data(), this->length());
|
| + return base::MakeUnique<QuicEncryptedPacket>(buffer, this->length(), true);
|
| +}
|
| +
|
| +ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) {
|
| + os << s.length() << "-byte data";
|
| + return os;
|
| +}
|
| +
|
| +QuicReceivedPacket::QuicReceivedPacket(const char* buffer,
|
| + size_t length,
|
| + QuicTime receipt_time)
|
| + : QuicEncryptedPacket(buffer, length),
|
| + receipt_time_(receipt_time),
|
| + ttl_(0) {}
|
| +
|
| +QuicReceivedPacket::QuicReceivedPacket(const char* buffer,
|
| + size_t length,
|
| + QuicTime receipt_time,
|
| + bool owns_buffer)
|
| + : QuicEncryptedPacket(buffer, length, owns_buffer),
|
| + receipt_time_(receipt_time),
|
| + ttl_(0) {}
|
| +
|
| +QuicReceivedPacket::QuicReceivedPacket(const char* buffer,
|
| + size_t length,
|
| + QuicTime receipt_time,
|
| + bool owns_buffer,
|
| + int ttl,
|
| + bool ttl_valid)
|
| + : QuicEncryptedPacket(buffer, length, owns_buffer),
|
| + receipt_time_(receipt_time),
|
| + ttl_(ttl_valid ? ttl : -1) {}
|
| +
|
| +std::unique_ptr<QuicReceivedPacket> QuicReceivedPacket::Clone() const {
|
| + char* buffer = new char[this->length()];
|
| + memcpy(buffer, this->data(), this->length());
|
| + return base::MakeUnique<QuicReceivedPacket>(
|
| + buffer, this->length(), receipt_time(), true, ttl(), ttl() >= 0);
|
| +}
|
| +
|
| +ostream& operator<<(ostream& os, const QuicReceivedPacket& s) {
|
| + os << s.length() << "-byte data";
|
| + return os;
|
| +}
|
| +
|
| +StringPiece QuicPacket::AssociatedData(QuicVersion version) const {
|
| + return StringPiece(
|
| + data(), GetStartOfEncryptedData(version, connection_id_length_,
|
| + includes_version_, includes_path_id_,
|
| + includes_diversification_nonce_,
|
| + packet_number_length_));
|
| +}
|
| +
|
| +StringPiece QuicPacket::Plaintext(QuicVersion version) const {
|
| + const size_t start_of_encrypted_data = GetStartOfEncryptedData(
|
| + version, connection_id_length_, includes_version_, includes_path_id_,
|
| + includes_diversification_nonce_, packet_number_length_);
|
| + return StringPiece(data() + start_of_encrypted_data,
|
| + length() - start_of_encrypted_data);
|
| +}
|
| +
|
| +SerializedPacket::SerializedPacket(QuicPathId path_id,
|
| + QuicPacketNumber packet_number,
|
| + QuicPacketNumberLength packet_number_length,
|
| + const char* encrypted_buffer,
|
| + QuicPacketLength encrypted_length,
|
| + bool has_ack,
|
| + bool has_stop_waiting)
|
| + : encrypted_buffer(encrypted_buffer),
|
| + encrypted_length(encrypted_length),
|
| + has_crypto_handshake(NOT_HANDSHAKE),
|
| + num_padding_bytes(0),
|
| + path_id(path_id),
|
| + packet_number(packet_number),
|
| + packet_number_length(packet_number_length),
|
| + encryption_level(ENCRYPTION_NONE),
|
| + has_ack(has_ack),
|
| + has_stop_waiting(has_stop_waiting),
|
| + transmission_type(NOT_RETRANSMISSION),
|
| + original_path_id(kInvalidPathId),
|
| + original_packet_number(0) {}
|
| +
|
| +SerializedPacket::SerializedPacket(const SerializedPacket& other) = default;
|
| +
|
| +SerializedPacket::~SerializedPacket() {}
|
| +
|
| +void ClearSerializedPacket(SerializedPacket* serialized_packet) {
|
| + if (!serialized_packet->retransmittable_frames.empty()) {
|
| + DeleteFrames(&serialized_packet->retransmittable_frames);
|
| + }
|
| + serialized_packet->encrypted_buffer = nullptr;
|
| + serialized_packet->encrypted_length = 0;
|
| +}
|
| +
|
| +char* CopyBuffer(const SerializedPacket& packet) {
|
| + char* dst_buffer = new char[packet.encrypted_length];
|
| + memcpy(dst_buffer, packet.encrypted_buffer, packet.encrypted_length);
|
| + return dst_buffer;
|
| +}
|
| +
|
| +} // namespace net
|
|
|