Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Unified Diff: net/quic/core/quic_packets.cc

Issue 2547583002: Landing Recent QUIC changes until Fri Nov 18 23:21:04 2016 +0000 (Closed)
Patch Set: Remove explicit HTTP/2 enum usage Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/core/quic_packets.h ('k') | net/quic/core/quic_pending_retransmission.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « net/quic/core/quic_packets.h ('k') | net/quic/core/quic_pending_retransmission.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698