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