| // Copyright (c) 2020 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. | |
| #ifndef QUICHE_QUIC_CORE_QUIC_LEGACY_VERSION_ENCAPSULATOR_H_ | |
| #define QUICHE_QUIC_CORE_QUIC_LEGACY_VERSION_ENCAPSULATOR_H_ | |
| #include "absl/strings/string_view.h" | |
| #include "quic/core/quic_packet_creator.h" | |
| #include "quic/core/quic_packets.h" | |
| #include "quic/core/quic_types.h" | |
| #include "quic/platform/api/quic_export.h" | |
| namespace quic { | |
| // QuicLegacyVersionEncapsulator is responsible for encapsulation of packets | |
| // using Legacy Version Encapsulation. | |
| class QUIC_EXPORT_PRIVATE QuicLegacyVersionEncapsulator | |
| : public QuicPacketCreator::DelegateInterface { | |
| public: | |
| // Encapsulates |inner_packet| into a new encapsulated packet that uses a | |
| // CHLO of version LegacyVersionForEncapsulation() with server name |sni| | |
| // exposed and using |server_connection_id|. The packet will be padded up to | |
| // |outer_max_packet_length| bytes if necessary. On failure, returns 0. On | |
| // success, returns the length of the outer encapsulated packet, and copies | |
| // the contents of the encapsulated packet to |out|. |out| must point to a | |
| // valid memory buffer capable of holding kMaxOutgoingPacketSize bytes. | |
| static QuicPacketLength Encapsulate( | |
| absl::string_view sni, | |
| absl::string_view inner_packet, | |
| const QuicConnectionId& server_connection_id, | |
| QuicTime creation_time, | |
| QuicByteCount outer_max_packet_length, | |
| char* out); | |
| // Returns the number of bytes of minimum overhead caused by Legacy Version | |
| // Encapsulation, based on the length of the provided server name |sni|. | |
| // The overhead may be higher due to extra padding added. | |
| static QuicByteCount GetMinimumOverhead(absl::string_view sni); | |
| // Overrides for QuicPacketCreator::DelegateInterface. | |
| QuicPacketBuffer GetPacketBuffer() override; | |
| void OnSerializedPacket(SerializedPacket serialized_packet) override; | |
| void OnUnrecoverableError(QuicErrorCode error, | |
| const std::string& error_details) override; | |
| bool ShouldGeneratePacket(HasRetransmittableData retransmittable, | |
| IsHandshake handshake) override; | |
| const QuicFrames MaybeBundleAckOpportunistically() override; | |
| SerializedPacketFate GetSerializedPacketFate( | |
| bool is_mtu_discovery, | |
| EncryptionLevel encryption_level) override; | |
| ~QuicLegacyVersionEncapsulator() override; | |
| private: | |
| explicit QuicLegacyVersionEncapsulator(QuicPacketBuffer packet_buffer); | |
| // Disallow copy, move and assignment. | |
| QuicLegacyVersionEncapsulator(const QuicLegacyVersionEncapsulator&) = delete; | |
| QuicLegacyVersionEncapsulator(QuicLegacyVersionEncapsulator&&) = delete; | |
| QuicLegacyVersionEncapsulator& operator=( | |
| const QuicLegacyVersionEncapsulator&) = delete; | |
| QuicLegacyVersionEncapsulator& operator=(QuicLegacyVersionEncapsulator&&) = | |
| delete; | |
| QuicPacketBuffer packet_buffer_; | |
| QuicPacketLength encrypted_length_ = 0; | |
| bool unrecoverable_failure_encountered_ = false; | |
| }; | |
| } // namespace quic | |
| #endif // QUICHE_QUIC_CORE_QUIC_LEGACY_VERSION_ENCAPSULATOR_H_ |