xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 "quiche/quic/test_tools/simple_quic_framer.h"
6 
7 #include <memory>
8 #include <utility>
9 
10 #include "absl/memory/memory.h"
11 #include "absl/strings/string_view.h"
12 #include "quiche/quic/core/crypto/quic_decrypter.h"
13 #include "quiche/quic/core/crypto/quic_encrypter.h"
14 #include "quiche/quic/core/frames/quic_reset_stream_at_frame.h"
15 #include "quiche/quic/core/quic_types.h"
16 
17 namespace quic {
18 namespace test {
19 
20 class SimpleFramerVisitor : public QuicFramerVisitorInterface {
21  public:
SimpleFramerVisitor()22   SimpleFramerVisitor() : error_(QUIC_NO_ERROR) {}
23   SimpleFramerVisitor(const SimpleFramerVisitor&) = delete;
24   SimpleFramerVisitor& operator=(const SimpleFramerVisitor&) = delete;
25 
~SimpleFramerVisitor()26   ~SimpleFramerVisitor() override {}
27 
OnError(QuicFramer * framer)28   void OnError(QuicFramer* framer) override { error_ = framer->error(); }
29 
OnProtocolVersionMismatch(ParsedQuicVersion)30   bool OnProtocolVersionMismatch(ParsedQuicVersion /*version*/) override {
31     return false;
32   }
33 
OnPacket()34   void OnPacket() override {}
OnVersionNegotiationPacket(const QuicVersionNegotiationPacket & packet)35   void OnVersionNegotiationPacket(
36       const QuicVersionNegotiationPacket& packet) override {
37     version_negotiation_packet_ =
38         std::make_unique<QuicVersionNegotiationPacket>((packet));
39   }
40 
OnRetryPacket(QuicConnectionId,QuicConnectionId,absl::string_view,absl::string_view,absl::string_view)41   void OnRetryPacket(QuicConnectionId /*original_connection_id*/,
42                      QuicConnectionId /*new_connection_id*/,
43                      absl::string_view /*retry_token*/,
44                      absl::string_view /*retry_integrity_tag*/,
45                      absl::string_view /*retry_without_tag*/) override {}
46 
OnUnauthenticatedPublicHeader(const QuicPacketHeader &)47   bool OnUnauthenticatedPublicHeader(
48       const QuicPacketHeader& /*header*/) override {
49     return true;
50   }
OnUnauthenticatedHeader(const QuicPacketHeader &)51   bool OnUnauthenticatedHeader(const QuicPacketHeader& /*header*/) override {
52     return true;
53   }
OnDecryptedPacket(size_t,EncryptionLevel level)54   void OnDecryptedPacket(size_t /*length*/, EncryptionLevel level) override {
55     last_decrypted_level_ = level;
56   }
OnPacketHeader(const QuicPacketHeader & header)57   bool OnPacketHeader(const QuicPacketHeader& header) override {
58     has_header_ = true;
59     header_ = header;
60     return true;
61   }
62 
OnCoalescedPacket(const QuicEncryptedPacket & packet)63   void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {
64     coalesced_packet_ = packet.Clone();
65   }
66 
OnUndecryptablePacket(const QuicEncryptedPacket &,EncryptionLevel,bool)67   void OnUndecryptablePacket(const QuicEncryptedPacket& /*packet*/,
68                              EncryptionLevel /*decryption_level*/,
69                              bool /*has_decryption_key*/) override {}
70 
OnStreamFrame(const QuicStreamFrame & frame)71   bool OnStreamFrame(const QuicStreamFrame& frame) override {
72     // Save a copy of the data so it is valid after the packet is processed.
73     std::string* string_data =
74         new std::string(frame.data_buffer, frame.data_length);
75     stream_data_.push_back(absl::WrapUnique(string_data));
76     // TODO(ianswett): A pointer isn't necessary with emplace_back.
77     stream_frames_.push_back(std::make_unique<QuicStreamFrame>(
78         frame.stream_id, frame.fin, frame.offset,
79         absl::string_view(*string_data)));
80     return true;
81   }
82 
OnCryptoFrame(const QuicCryptoFrame & frame)83   bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
84     // Save a copy of the data so it is valid after the packet is processed.
85     std::string* string_data =
86         new std::string(frame.data_buffer, frame.data_length);
87     crypto_data_.push_back(absl::WrapUnique(string_data));
88     crypto_frames_.push_back(std::make_unique<QuicCryptoFrame>(
89         frame.level, frame.offset, absl::string_view(*string_data)));
90     return true;
91   }
92 
OnAckFrameStart(QuicPacketNumber largest_acked,QuicTime::Delta ack_delay_time)93   bool OnAckFrameStart(QuicPacketNumber largest_acked,
94                        QuicTime::Delta ack_delay_time) override {
95     QuicAckFrame ack_frame;
96     ack_frame.largest_acked = largest_acked;
97     ack_frame.ack_delay_time = ack_delay_time;
98     ack_frames_.push_back(ack_frame);
99     return true;
100   }
101 
OnAckRange(QuicPacketNumber start,QuicPacketNumber end)102   bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
103     QUICHE_DCHECK(!ack_frames_.empty());
104     ack_frames_[ack_frames_.size() - 1].packets.AddRange(start, end);
105     return true;
106   }
107 
OnAckTimestamp(QuicPacketNumber,QuicTime)108   bool OnAckTimestamp(QuicPacketNumber /*packet_number*/,
109                       QuicTime /*timestamp*/) override {
110     return true;
111   }
112 
OnAckFrameEnd(QuicPacketNumber,const std::optional<QuicEcnCounts> &)113   bool OnAckFrameEnd(
114       QuicPacketNumber /*start*/,
115       const std::optional<QuicEcnCounts>& /*ecn_counts*/) override {
116     return true;
117   }
118 
OnStopWaitingFrame(const QuicStopWaitingFrame & frame)119   bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
120     stop_waiting_frames_.push_back(frame);
121     return true;
122   }
123 
OnPaddingFrame(const QuicPaddingFrame & frame)124   bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
125     padding_frames_.push_back(frame);
126     return true;
127   }
128 
OnPingFrame(const QuicPingFrame & frame)129   bool OnPingFrame(const QuicPingFrame& frame) override {
130     ping_frames_.push_back(frame);
131     return true;
132   }
133 
OnRstStreamFrame(const QuicRstStreamFrame & frame)134   bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
135     rst_stream_frames_.push_back(frame);
136     return true;
137   }
138 
OnConnectionCloseFrame(const QuicConnectionCloseFrame & frame)139   bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
140     connection_close_frames_.push_back(frame);
141     return true;
142   }
143 
OnNewConnectionIdFrame(const QuicNewConnectionIdFrame & frame)144   bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
145     new_connection_id_frames_.push_back(frame);
146     return true;
147   }
148 
OnRetireConnectionIdFrame(const QuicRetireConnectionIdFrame & frame)149   bool OnRetireConnectionIdFrame(
150       const QuicRetireConnectionIdFrame& frame) override {
151     retire_connection_id_frames_.push_back(frame);
152     return true;
153   }
154 
OnNewTokenFrame(const QuicNewTokenFrame & frame)155   bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
156     new_token_frames_.push_back(frame);
157     return true;
158   }
159 
OnStopSendingFrame(const QuicStopSendingFrame & frame)160   bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
161     stop_sending_frames_.push_back(frame);
162     return true;
163   }
164 
OnPathChallengeFrame(const QuicPathChallengeFrame & frame)165   bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
166     path_challenge_frames_.push_back(frame);
167     return true;
168   }
169 
OnPathResponseFrame(const QuicPathResponseFrame & frame)170   bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
171     path_response_frames_.push_back(frame);
172     return true;
173   }
174 
OnGoAwayFrame(const QuicGoAwayFrame & frame)175   bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
176     goaway_frames_.push_back(frame);
177     return true;
178   }
OnMaxStreamsFrame(const QuicMaxStreamsFrame & frame)179   bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) override {
180     max_streams_frames_.push_back(frame);
181     return true;
182   }
183 
OnStreamsBlockedFrame(const QuicStreamsBlockedFrame & frame)184   bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) override {
185     streams_blocked_frames_.push_back(frame);
186     return true;
187   }
188 
OnWindowUpdateFrame(const QuicWindowUpdateFrame & frame)189   bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
190     window_update_frames_.push_back(frame);
191     return true;
192   }
193 
OnBlockedFrame(const QuicBlockedFrame & frame)194   bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
195     blocked_frames_.push_back(frame);
196     return true;
197   }
198 
OnMessageFrame(const QuicMessageFrame & frame)199   bool OnMessageFrame(const QuicMessageFrame& frame) override {
200     message_frames_.emplace_back(frame.data, frame.message_length);
201     return true;
202   }
203 
OnHandshakeDoneFrame(const QuicHandshakeDoneFrame & frame)204   bool OnHandshakeDoneFrame(const QuicHandshakeDoneFrame& frame) override {
205     handshake_done_frames_.push_back(frame);
206     return true;
207   }
208 
OnAckFrequencyFrame(const QuicAckFrequencyFrame & frame)209   bool OnAckFrequencyFrame(const QuicAckFrequencyFrame& frame) override {
210     ack_frequency_frames_.push_back(frame);
211     return true;
212   }
213 
OnResetStreamAtFrame(const QuicResetStreamAtFrame & frame)214   bool OnResetStreamAtFrame(const QuicResetStreamAtFrame& frame) override {
215     reset_stream_at_frames_.push_back(frame);
216     return true;
217   }
218 
OnPacketComplete()219   void OnPacketComplete() override {}
220 
IsValidStatelessResetToken(const StatelessResetToken &) const221   bool IsValidStatelessResetToken(
222       const StatelessResetToken& /*token*/) const override {
223     return false;
224   }
225 
OnAuthenticatedIetfStatelessResetPacket(const QuicIetfStatelessResetPacket & packet)226   void OnAuthenticatedIetfStatelessResetPacket(
227       const QuicIetfStatelessResetPacket& packet) override {
228     stateless_reset_packet_ =
229         std::make_unique<QuicIetfStatelessResetPacket>(packet);
230   }
231 
OnKeyUpdate(KeyUpdateReason)232   void OnKeyUpdate(KeyUpdateReason /*reason*/) override {}
OnDecryptedFirstPacketInKeyPhase()233   void OnDecryptedFirstPacketInKeyPhase() override {}
AdvanceKeysAndCreateCurrentOneRttDecrypter()234   std::unique_ptr<QuicDecrypter> AdvanceKeysAndCreateCurrentOneRttDecrypter()
235       override {
236     return nullptr;
237   }
CreateCurrentOneRttEncrypter()238   std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override {
239     return nullptr;
240   }
241 
header() const242   const QuicPacketHeader& header() const { return header_; }
ack_frames() const243   const std::vector<QuicAckFrame>& ack_frames() const { return ack_frames_; }
connection_close_frames() const244   const std::vector<QuicConnectionCloseFrame>& connection_close_frames() const {
245     return connection_close_frames_;
246   }
247 
goaway_frames() const248   const std::vector<QuicGoAwayFrame>& goaway_frames() const {
249     return goaway_frames_;
250   }
max_streams_frames() const251   const std::vector<QuicMaxStreamsFrame>& max_streams_frames() const {
252     return max_streams_frames_;
253   }
streams_blocked_frames() const254   const std::vector<QuicStreamsBlockedFrame>& streams_blocked_frames() const {
255     return streams_blocked_frames_;
256   }
rst_stream_frames() const257   const std::vector<QuicRstStreamFrame>& rst_stream_frames() const {
258     return rst_stream_frames_;
259   }
stream_frames() const260   const std::vector<std::unique_ptr<QuicStreamFrame>>& stream_frames() const {
261     return stream_frames_;
262   }
crypto_frames() const263   const std::vector<std::unique_ptr<QuicCryptoFrame>>& crypto_frames() const {
264     return crypto_frames_;
265   }
stop_waiting_frames() const266   const std::vector<QuicStopWaitingFrame>& stop_waiting_frames() const {
267     return stop_waiting_frames_;
268   }
ping_frames() const269   const std::vector<QuicPingFrame>& ping_frames() const { return ping_frames_; }
message_frames() const270   const std::vector<QuicMessageFrame>& message_frames() const {
271     return message_frames_;
272   }
window_update_frames() const273   const std::vector<QuicWindowUpdateFrame>& window_update_frames() const {
274     return window_update_frames_;
275   }
padding_frames() const276   const std::vector<QuicPaddingFrame>& padding_frames() const {
277     return padding_frames_;
278   }
path_challenge_frames() const279   const std::vector<QuicPathChallengeFrame>& path_challenge_frames() const {
280     return path_challenge_frames_;
281   }
path_response_frames() const282   const std::vector<QuicPathResponseFrame>& path_response_frames() const {
283     return path_response_frames_;
284   }
version_negotiation_packet() const285   const QuicVersionNegotiationPacket* version_negotiation_packet() const {
286     return version_negotiation_packet_.get();
287   }
last_decrypted_level() const288   EncryptionLevel last_decrypted_level() const { return last_decrypted_level_; }
coalesced_packet() const289   const QuicEncryptedPacket* coalesced_packet() const {
290     return coalesced_packet_.get();
291   }
292 
293  private:
294   QuicErrorCode error_;
295   bool has_header_;
296   QuicPacketHeader header_;
297   std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
298   std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
299   std::vector<QuicAckFrame> ack_frames_;
300   std::vector<QuicStopWaitingFrame> stop_waiting_frames_;
301   std::vector<QuicPaddingFrame> padding_frames_;
302   std::vector<QuicPingFrame> ping_frames_;
303   std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
304   std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
305   std::vector<QuicRstStreamFrame> rst_stream_frames_;
306   std::vector<QuicGoAwayFrame> goaway_frames_;
307   std::vector<QuicStreamsBlockedFrame> streams_blocked_frames_;
308   std::vector<QuicMaxStreamsFrame> max_streams_frames_;
309   std::vector<QuicConnectionCloseFrame> connection_close_frames_;
310   std::vector<QuicStopSendingFrame> stop_sending_frames_;
311   std::vector<QuicPathChallengeFrame> path_challenge_frames_;
312   std::vector<QuicPathResponseFrame> path_response_frames_;
313   std::vector<QuicWindowUpdateFrame> window_update_frames_;
314   std::vector<QuicBlockedFrame> blocked_frames_;
315   std::vector<QuicNewConnectionIdFrame> new_connection_id_frames_;
316   std::vector<QuicRetireConnectionIdFrame> retire_connection_id_frames_;
317   std::vector<QuicNewTokenFrame> new_token_frames_;
318   std::vector<QuicMessageFrame> message_frames_;
319   std::vector<QuicHandshakeDoneFrame> handshake_done_frames_;
320   std::vector<QuicAckFrequencyFrame> ack_frequency_frames_;
321   std::vector<QuicResetStreamAtFrame> reset_stream_at_frames_;
322   std::vector<std::unique_ptr<std::string>> stream_data_;
323   std::vector<std::unique_ptr<std::string>> crypto_data_;
324   EncryptionLevel last_decrypted_level_;
325   std::unique_ptr<QuicEncryptedPacket> coalesced_packet_;
326 };
327 
SimpleQuicFramer()328 SimpleQuicFramer::SimpleQuicFramer()
329     : framer_(AllSupportedVersions(), QuicTime::Zero(), Perspective::IS_SERVER,
330               kQuicDefaultConnectionIdLength) {}
331 
SimpleQuicFramer(const ParsedQuicVersionVector & supported_versions)332 SimpleQuicFramer::SimpleQuicFramer(
333     const ParsedQuicVersionVector& supported_versions)
334     : framer_(supported_versions, QuicTime::Zero(), Perspective::IS_SERVER,
335               kQuicDefaultConnectionIdLength) {}
336 
SimpleQuicFramer(const ParsedQuicVersionVector & supported_versions,Perspective perspective)337 SimpleQuicFramer::SimpleQuicFramer(
338     const ParsedQuicVersionVector& supported_versions, Perspective perspective)
339     : framer_(supported_versions, QuicTime::Zero(), perspective,
340               kQuicDefaultConnectionIdLength) {}
341 
~SimpleQuicFramer()342 SimpleQuicFramer::~SimpleQuicFramer() {}
343 
ProcessPacket(const QuicEncryptedPacket & packet)344 bool SimpleQuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
345   visitor_ = std::make_unique<SimpleFramerVisitor>();
346   framer_.set_visitor(visitor_.get());
347   return framer_.ProcessPacket(packet);
348 }
349 
Reset()350 void SimpleQuicFramer::Reset() {
351   visitor_ = std::make_unique<SimpleFramerVisitor>();
352 }
353 
header() const354 const QuicPacketHeader& SimpleQuicFramer::header() const {
355   return visitor_->header();
356 }
357 
358 const QuicVersionNegotiationPacket*
version_negotiation_packet() const359 SimpleQuicFramer::version_negotiation_packet() const {
360   return visitor_->version_negotiation_packet();
361 }
362 
last_decrypted_level() const363 EncryptionLevel SimpleQuicFramer::last_decrypted_level() const {
364   return visitor_->last_decrypted_level();
365 }
366 
framer()367 QuicFramer* SimpleQuicFramer::framer() { return &framer_; }
368 
num_frames() const369 size_t SimpleQuicFramer::num_frames() const {
370   return ack_frames().size() + goaway_frames().size() +
371          rst_stream_frames().size() + stop_waiting_frames().size() +
372          path_challenge_frames().size() + path_response_frames().size() +
373          stream_frames().size() + ping_frames().size() +
374          connection_close_frames().size() + padding_frames().size() +
375          crypto_frames().size();
376 }
377 
ack_frames() const378 const std::vector<QuicAckFrame>& SimpleQuicFramer::ack_frames() const {
379   return visitor_->ack_frames();
380 }
381 
stop_waiting_frames() const382 const std::vector<QuicStopWaitingFrame>& SimpleQuicFramer::stop_waiting_frames()
383     const {
384   return visitor_->stop_waiting_frames();
385 }
386 
387 const std::vector<QuicPathChallengeFrame>&
path_challenge_frames() const388 SimpleQuicFramer::path_challenge_frames() const {
389   return visitor_->path_challenge_frames();
390 }
391 const std::vector<QuicPathResponseFrame>&
path_response_frames() const392 SimpleQuicFramer::path_response_frames() const {
393   return visitor_->path_response_frames();
394 }
395 
ping_frames() const396 const std::vector<QuicPingFrame>& SimpleQuicFramer::ping_frames() const {
397   return visitor_->ping_frames();
398 }
399 
message_frames() const400 const std::vector<QuicMessageFrame>& SimpleQuicFramer::message_frames() const {
401   return visitor_->message_frames();
402 }
403 
404 const std::vector<QuicWindowUpdateFrame>&
window_update_frames() const405 SimpleQuicFramer::window_update_frames() const {
406   return visitor_->window_update_frames();
407 }
408 
409 const std::vector<std::unique_ptr<QuicStreamFrame>>&
stream_frames() const410 SimpleQuicFramer::stream_frames() const {
411   return visitor_->stream_frames();
412 }
413 
414 const std::vector<std::unique_ptr<QuicCryptoFrame>>&
crypto_frames() const415 SimpleQuicFramer::crypto_frames() const {
416   return visitor_->crypto_frames();
417 }
418 
rst_stream_frames() const419 const std::vector<QuicRstStreamFrame>& SimpleQuicFramer::rst_stream_frames()
420     const {
421   return visitor_->rst_stream_frames();
422 }
423 
goaway_frames() const424 const std::vector<QuicGoAwayFrame>& SimpleQuicFramer::goaway_frames() const {
425   return visitor_->goaway_frames();
426 }
427 
428 const std::vector<QuicConnectionCloseFrame>&
connection_close_frames() const429 SimpleQuicFramer::connection_close_frames() const {
430   return visitor_->connection_close_frames();
431 }
432 
padding_frames() const433 const std::vector<QuicPaddingFrame>& SimpleQuicFramer::padding_frames() const {
434   return visitor_->padding_frames();
435 }
436 
coalesced_packet() const437 const QuicEncryptedPacket* SimpleQuicFramer::coalesced_packet() const {
438   return visitor_->coalesced_packet();
439 }
440 
441 }  // namespace test
442 }  // namespace quic
443