blob: 7b6e7533c94741615286ca426d171c1ee287aebc [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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 "net/third_party/quiche/src/quic/test_tools/simple_quic_framer.h"
6
7#include <memory>
8
QUICHE teama6ef0a62019-03-07 20:34:33 -05009#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
10#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
11#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
12#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
13
14namespace quic {
15namespace test {
16
17class SimpleFramerVisitor : public QuicFramerVisitorInterface {
18 public:
19 SimpleFramerVisitor() : error_(QUIC_NO_ERROR) {}
20 SimpleFramerVisitor(const SimpleFramerVisitor&) = delete;
21 SimpleFramerVisitor& operator=(const SimpleFramerVisitor&) = delete;
22
23 ~SimpleFramerVisitor() override {}
24
25 void OnError(QuicFramer* framer) override { error_ = framer->error(); }
26
27 bool OnProtocolVersionMismatch(ParsedQuicVersion version,
28 PacketHeaderFormat form) override {
29 return false;
30 }
31
32 void OnPacket() override {}
33 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override {
34 public_reset_packet_ = QuicMakeUnique<QuicPublicResetPacket>((packet));
35 }
36 void OnVersionNegotiationPacket(
37 const QuicVersionNegotiationPacket& packet) override {
38 version_negotiation_packet_ =
39 QuicMakeUnique<QuicVersionNegotiationPacket>((packet));
40 }
41
42 bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
43 return true;
44 }
45 bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override {
46 return true;
47 }
48 void OnDecryptedPacket(EncryptionLevel level) override {
49 last_decrypted_level_ = level;
50 }
51 bool OnPacketHeader(const QuicPacketHeader& header) override {
52 has_header_ = true;
53 header_ = header;
54 return true;
55 }
56
57 void OnCoalescedPacket(const QuicEncryptedPacket& packet) override {}
58
59 bool OnStreamFrame(const QuicStreamFrame& frame) override {
60 // Save a copy of the data so it is valid after the packet is processed.
vasilvvc48c8712019-03-11 13:38:16 -070061 std::string* string_data =
62 new std::string(frame.data_buffer, frame.data_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -050063 stream_data_.push_back(QuicWrapUnique(string_data));
64 // TODO(ianswett): A pointer isn't necessary with emplace_back.
65 stream_frames_.push_back(QuicMakeUnique<QuicStreamFrame>(
66 frame.stream_id, frame.fin, frame.offset,
67 QuicStringPiece(*string_data)));
68 return true;
69 }
70
71 bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
72 // Save a copy of the data so it is valid after the packet is processed.
vasilvvc48c8712019-03-11 13:38:16 -070073 std::string* string_data =
74 new std::string(frame.data_buffer, frame.data_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -050075 crypto_data_.push_back(QuicWrapUnique(string_data));
76 crypto_frames_.push_back(QuicMakeUnique<QuicCryptoFrame>(
77 frame.level, frame.offset, QuicStringPiece(*string_data)));
78 return true;
79 }
80
81 bool OnAckFrameStart(QuicPacketNumber largest_acked,
82 QuicTime::Delta ack_delay_time) override {
83 QuicAckFrame ack_frame;
84 ack_frame.largest_acked = largest_acked;
85 ack_frame.ack_delay_time = ack_delay_time;
86 ack_frames_.push_back(ack_frame);
87 return true;
88 }
89
90 bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) override {
91 DCHECK(!ack_frames_.empty());
92 ack_frames_[ack_frames_.size() - 1].packets.AddRange(start, end);
93 return true;
94 }
95
96 bool OnAckTimestamp(QuicPacketNumber packet_number,
97 QuicTime timestamp) override {
98 return true;
99 }
100
101 bool OnAckFrameEnd(QuicPacketNumber /*start*/) override { return true; }
102
103 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
104 stop_waiting_frames_.push_back(frame);
105 return true;
106 }
107
108 bool OnPaddingFrame(const QuicPaddingFrame& frame) override {
109 padding_frames_.push_back(frame);
110 return true;
111 }
112
113 bool OnPingFrame(const QuicPingFrame& frame) override {
114 ping_frames_.push_back(frame);
115 return true;
116 }
117
118 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
119 rst_stream_frames_.push_back(frame);
120 return true;
121 }
122
123 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
124 connection_close_frames_.push_back(frame);
125 return true;
126 }
127
fkastenholz72f509b2019-04-10 09:17:49 -0700128 bool OnApplicationCloseFrame(const QuicConnectionCloseFrame& frame) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500129 application_close_frames_.push_back(frame);
130 return true;
131 }
132
133 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
134 new_connection_id_frames_.push_back(frame);
135 return true;
136 }
137
138 bool OnRetireConnectionIdFrame(
139 const QuicRetireConnectionIdFrame& frame) override {
140 retire_connection_id_frames_.push_back(frame);
141 return true;
142 }
143
144 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
145 new_token_frames_.push_back(frame);
146 return true;
147 }
148
149 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
150 stop_sending_frames_.push_back(frame);
151 return true;
152 }
153
154 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
155 path_challenge_frames_.push_back(frame);
156 return true;
157 }
158
159 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
160 path_response_frames_.push_back(frame);
161 return true;
162 }
163
164 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
165 goaway_frames_.push_back(frame);
166 return true;
167 }
168 bool OnMaxStreamIdFrame(const QuicMaxStreamIdFrame& frame) override {
169 max_stream_id_frames_.push_back(frame);
170 return true;
171 }
172
173 bool OnStreamIdBlockedFrame(const QuicStreamIdBlockedFrame& frame) override {
174 stream_id_blocked_frames_.push_back(frame);
175 return true;
176 }
177
178 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
179 window_update_frames_.push_back(frame);
180 return true;
181 }
182
183 bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
184 blocked_frames_.push_back(frame);
185 return true;
186 }
187
188 bool OnMessageFrame(const QuicMessageFrame& frame) override {
189 message_frames_.emplace_back(frame.data, frame.message_length);
190 return true;
191 }
192
193 void OnPacketComplete() override {}
194
195 bool IsValidStatelessResetToken(QuicUint128 token) const override {
196 return false;
197 }
198
199 void OnAuthenticatedIetfStatelessResetPacket(
200 const QuicIetfStatelessResetPacket& packet) override {
201 stateless_reset_packet_ =
202 QuicMakeUnique<QuicIetfStatelessResetPacket>(packet);
203 }
204
205 const QuicPacketHeader& header() const { return header_; }
206 const std::vector<QuicAckFrame>& ack_frames() const { return ack_frames_; }
207 const std::vector<QuicConnectionCloseFrame>& connection_close_frames() const {
208 return connection_close_frames_;
209 }
fkastenholz72f509b2019-04-10 09:17:49 -0700210 const std::vector<QuicConnectionCloseFrame>& application_close_frames()
QUICHE teama6ef0a62019-03-07 20:34:33 -0500211 const {
212 return application_close_frames_;
213 }
214 const std::vector<QuicGoAwayFrame>& goaway_frames() const {
215 return goaway_frames_;
216 }
217 const std::vector<QuicMaxStreamIdFrame>& max_stream_id_frames() const {
218 return max_stream_id_frames_;
219 }
220 const std::vector<QuicStreamIdBlockedFrame>& stream_id_blocked_frames()
221 const {
222 return stream_id_blocked_frames_;
223 }
224 const std::vector<QuicRstStreamFrame>& rst_stream_frames() const {
225 return rst_stream_frames_;
226 }
227 const std::vector<std::unique_ptr<QuicStreamFrame>>& stream_frames() const {
228 return stream_frames_;
229 }
230 const std::vector<std::unique_ptr<QuicCryptoFrame>>& crypto_frames() const {
231 return crypto_frames_;
232 }
233 const std::vector<QuicStopWaitingFrame>& stop_waiting_frames() const {
234 return stop_waiting_frames_;
235 }
236 const std::vector<QuicPingFrame>& ping_frames() const { return ping_frames_; }
237 const std::vector<QuicMessageFrame>& message_frames() const {
238 return message_frames_;
239 }
240 const std::vector<QuicWindowUpdateFrame>& window_update_frames() const {
241 return window_update_frames_;
242 }
243 const std::vector<QuicPaddingFrame>& padding_frames() const {
244 return padding_frames_;
245 }
246 const std::vector<QuicPathChallengeFrame>& path_challenge_frames() const {
247 return path_challenge_frames_;
248 }
249 const std::vector<QuicPathResponseFrame>& path_response_frames() const {
250 return path_response_frames_;
251 }
252 const QuicVersionNegotiationPacket* version_negotiation_packet() const {
253 return version_negotiation_packet_.get();
254 }
255 EncryptionLevel last_decrypted_level() const { return last_decrypted_level_; }
256
257 private:
258 QuicErrorCode error_;
259 bool has_header_;
260 QuicPacketHeader header_;
261 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
262 std::unique_ptr<QuicPublicResetPacket> public_reset_packet_;
263 std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
264 std::vector<QuicAckFrame> ack_frames_;
265 std::vector<QuicStopWaitingFrame> stop_waiting_frames_;
266 std::vector<QuicPaddingFrame> padding_frames_;
267 std::vector<QuicPingFrame> ping_frames_;
268 std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
269 std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
270 std::vector<QuicRstStreamFrame> rst_stream_frames_;
271 std::vector<QuicGoAwayFrame> goaway_frames_;
272 std::vector<QuicStreamIdBlockedFrame> stream_id_blocked_frames_;
273 std::vector<QuicMaxStreamIdFrame> max_stream_id_frames_;
274 std::vector<QuicConnectionCloseFrame> connection_close_frames_;
fkastenholz72f509b2019-04-10 09:17:49 -0700275 std::vector<QuicConnectionCloseFrame> application_close_frames_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500276 std::vector<QuicStopSendingFrame> stop_sending_frames_;
277 std::vector<QuicPathChallengeFrame> path_challenge_frames_;
278 std::vector<QuicPathResponseFrame> path_response_frames_;
279 std::vector<QuicWindowUpdateFrame> window_update_frames_;
280 std::vector<QuicBlockedFrame> blocked_frames_;
281 std::vector<QuicNewConnectionIdFrame> new_connection_id_frames_;
282 std::vector<QuicRetireConnectionIdFrame> retire_connection_id_frames_;
283 std::vector<QuicNewTokenFrame> new_token_frames_;
284 std::vector<QuicMessageFrame> message_frames_;
vasilvvc48c8712019-03-11 13:38:16 -0700285 std::vector<std::unique_ptr<std::string>> stream_data_;
286 std::vector<std::unique_ptr<std::string>> crypto_data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500287 EncryptionLevel last_decrypted_level_;
288};
289
290SimpleQuicFramer::SimpleQuicFramer()
291 : framer_(AllSupportedVersions(),
292 QuicTime::Zero(),
293 Perspective::IS_SERVER,
294 kQuicDefaultConnectionIdLength) {}
295
296SimpleQuicFramer::SimpleQuicFramer(
297 const ParsedQuicVersionVector& supported_versions)
298 : framer_(supported_versions,
299 QuicTime::Zero(),
300 Perspective::IS_SERVER,
301 kQuicDefaultConnectionIdLength) {}
302
303SimpleQuicFramer::SimpleQuicFramer(
304 const ParsedQuicVersionVector& supported_versions,
305 Perspective perspective)
306 : framer_(supported_versions,
307 QuicTime::Zero(),
308 perspective,
309 kQuicDefaultConnectionIdLength) {}
310
311SimpleQuicFramer::~SimpleQuicFramer() {}
312
313bool SimpleQuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
314 visitor_ = QuicMakeUnique<SimpleFramerVisitor>();
315 framer_.set_visitor(visitor_.get());
316 return framer_.ProcessPacket(packet);
317}
318
319void SimpleQuicFramer::Reset() {
320 visitor_ = QuicMakeUnique<SimpleFramerVisitor>();
321}
322
323const QuicPacketHeader& SimpleQuicFramer::header() const {
324 return visitor_->header();
325}
326
327const QuicVersionNegotiationPacket*
328SimpleQuicFramer::version_negotiation_packet() const {
329 return visitor_->version_negotiation_packet();
330}
331
332EncryptionLevel SimpleQuicFramer::last_decrypted_level() const {
333 return visitor_->last_decrypted_level();
334}
335
336QuicFramer* SimpleQuicFramer::framer() {
337 return &framer_;
338}
339
340size_t SimpleQuicFramer::num_frames() const {
341 return ack_frames().size() + goaway_frames().size() +
342 rst_stream_frames().size() + stop_waiting_frames().size() +
343 path_challenge_frames().size() + path_response_frames().size() +
344 stream_frames().size() + ping_frames().size() +
345 connection_close_frames().size() + padding_frames().size() +
346 crypto_frames().size();
347}
348
349const std::vector<QuicAckFrame>& SimpleQuicFramer::ack_frames() const {
350 return visitor_->ack_frames();
351}
352
353const std::vector<QuicStopWaitingFrame>& SimpleQuicFramer::stop_waiting_frames()
354 const {
355 return visitor_->stop_waiting_frames();
356}
357
358const std::vector<QuicPathChallengeFrame>&
359SimpleQuicFramer::path_challenge_frames() const {
360 return visitor_->path_challenge_frames();
361}
362const std::vector<QuicPathResponseFrame>&
363SimpleQuicFramer::path_response_frames() const {
364 return visitor_->path_response_frames();
365}
366
367const std::vector<QuicPingFrame>& SimpleQuicFramer::ping_frames() const {
368 return visitor_->ping_frames();
369}
370
371const std::vector<QuicMessageFrame>& SimpleQuicFramer::message_frames() const {
372 return visitor_->message_frames();
373}
374
375const std::vector<QuicWindowUpdateFrame>&
376SimpleQuicFramer::window_update_frames() const {
377 return visitor_->window_update_frames();
378}
379
380const std::vector<std::unique_ptr<QuicStreamFrame>>&
381SimpleQuicFramer::stream_frames() const {
382 return visitor_->stream_frames();
383}
384
385const std::vector<std::unique_ptr<QuicCryptoFrame>>&
386SimpleQuicFramer::crypto_frames() const {
387 return visitor_->crypto_frames();
388}
389
390const std::vector<QuicRstStreamFrame>& SimpleQuicFramer::rst_stream_frames()
391 const {
392 return visitor_->rst_stream_frames();
393}
394
395const std::vector<QuicGoAwayFrame>& SimpleQuicFramer::goaway_frames() const {
396 return visitor_->goaway_frames();
397}
398
399const std::vector<QuicConnectionCloseFrame>&
400SimpleQuicFramer::connection_close_frames() const {
401 return visitor_->connection_close_frames();
402}
403
404const std::vector<QuicPaddingFrame>& SimpleQuicFramer::padding_frames() const {
405 return visitor_->padding_frames();
406}
407
408} // namespace test
409} // namespace quic