blob: c02ed15743ccd46de27a4fd59c9d354079c3a5f7 [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
128 bool OnApplicationCloseFrame(
129 const QuicApplicationCloseFrame& frame) override {
130 application_close_frames_.push_back(frame);
131 return true;
132 }
133
134 bool OnNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame) override {
135 new_connection_id_frames_.push_back(frame);
136 return true;
137 }
138
139 bool OnRetireConnectionIdFrame(
140 const QuicRetireConnectionIdFrame& frame) override {
141 retire_connection_id_frames_.push_back(frame);
142 return true;
143 }
144
145 bool OnNewTokenFrame(const QuicNewTokenFrame& frame) override {
146 new_token_frames_.push_back(frame);
147 return true;
148 }
149
150 bool OnStopSendingFrame(const QuicStopSendingFrame& frame) override {
151 stop_sending_frames_.push_back(frame);
152 return true;
153 }
154
155 bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) override {
156 path_challenge_frames_.push_back(frame);
157 return true;
158 }
159
160 bool OnPathResponseFrame(const QuicPathResponseFrame& frame) override {
161 path_response_frames_.push_back(frame);
162 return true;
163 }
164
165 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override {
166 goaway_frames_.push_back(frame);
167 return true;
168 }
169 bool OnMaxStreamIdFrame(const QuicMaxStreamIdFrame& frame) override {
170 max_stream_id_frames_.push_back(frame);
171 return true;
172 }
173
174 bool OnStreamIdBlockedFrame(const QuicStreamIdBlockedFrame& frame) override {
175 stream_id_blocked_frames_.push_back(frame);
176 return true;
177 }
178
179 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override {
180 window_update_frames_.push_back(frame);
181 return true;
182 }
183
184 bool OnBlockedFrame(const QuicBlockedFrame& frame) override {
185 blocked_frames_.push_back(frame);
186 return true;
187 }
188
189 bool OnMessageFrame(const QuicMessageFrame& frame) override {
190 message_frames_.emplace_back(frame.data, frame.message_length);
191 return true;
192 }
193
194 void OnPacketComplete() override {}
195
196 bool IsValidStatelessResetToken(QuicUint128 token) const override {
197 return false;
198 }
199
200 void OnAuthenticatedIetfStatelessResetPacket(
201 const QuicIetfStatelessResetPacket& packet) override {
202 stateless_reset_packet_ =
203 QuicMakeUnique<QuicIetfStatelessResetPacket>(packet);
204 }
205
206 const QuicPacketHeader& header() const { return header_; }
207 const std::vector<QuicAckFrame>& ack_frames() const { return ack_frames_; }
208 const std::vector<QuicConnectionCloseFrame>& connection_close_frames() const {
209 return connection_close_frames_;
210 }
211 const std::vector<QuicApplicationCloseFrame>& application_close_frames()
212 const {
213 return application_close_frames_;
214 }
215 const std::vector<QuicGoAwayFrame>& goaway_frames() const {
216 return goaway_frames_;
217 }
218 const std::vector<QuicMaxStreamIdFrame>& max_stream_id_frames() const {
219 return max_stream_id_frames_;
220 }
221 const std::vector<QuicStreamIdBlockedFrame>& stream_id_blocked_frames()
222 const {
223 return stream_id_blocked_frames_;
224 }
225 const std::vector<QuicRstStreamFrame>& rst_stream_frames() const {
226 return rst_stream_frames_;
227 }
228 const std::vector<std::unique_ptr<QuicStreamFrame>>& stream_frames() const {
229 return stream_frames_;
230 }
231 const std::vector<std::unique_ptr<QuicCryptoFrame>>& crypto_frames() const {
232 return crypto_frames_;
233 }
234 const std::vector<QuicStopWaitingFrame>& stop_waiting_frames() const {
235 return stop_waiting_frames_;
236 }
237 const std::vector<QuicPingFrame>& ping_frames() const { return ping_frames_; }
238 const std::vector<QuicMessageFrame>& message_frames() const {
239 return message_frames_;
240 }
241 const std::vector<QuicWindowUpdateFrame>& window_update_frames() const {
242 return window_update_frames_;
243 }
244 const std::vector<QuicPaddingFrame>& padding_frames() const {
245 return padding_frames_;
246 }
247 const std::vector<QuicPathChallengeFrame>& path_challenge_frames() const {
248 return path_challenge_frames_;
249 }
250 const std::vector<QuicPathResponseFrame>& path_response_frames() const {
251 return path_response_frames_;
252 }
253 const QuicVersionNegotiationPacket* version_negotiation_packet() const {
254 return version_negotiation_packet_.get();
255 }
256 EncryptionLevel last_decrypted_level() const { return last_decrypted_level_; }
257
258 private:
259 QuicErrorCode error_;
260 bool has_header_;
261 QuicPacketHeader header_;
262 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
263 std::unique_ptr<QuicPublicResetPacket> public_reset_packet_;
264 std::unique_ptr<QuicIetfStatelessResetPacket> stateless_reset_packet_;
265 std::vector<QuicAckFrame> ack_frames_;
266 std::vector<QuicStopWaitingFrame> stop_waiting_frames_;
267 std::vector<QuicPaddingFrame> padding_frames_;
268 std::vector<QuicPingFrame> ping_frames_;
269 std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_;
270 std::vector<std::unique_ptr<QuicCryptoFrame>> crypto_frames_;
271 std::vector<QuicRstStreamFrame> rst_stream_frames_;
272 std::vector<QuicGoAwayFrame> goaway_frames_;
273 std::vector<QuicStreamIdBlockedFrame> stream_id_blocked_frames_;
274 std::vector<QuicMaxStreamIdFrame> max_stream_id_frames_;
275 std::vector<QuicConnectionCloseFrame> connection_close_frames_;
276 std::vector<QuicApplicationCloseFrame> application_close_frames_;
277 std::vector<QuicStopSendingFrame> stop_sending_frames_;
278 std::vector<QuicPathChallengeFrame> path_challenge_frames_;
279 std::vector<QuicPathResponseFrame> path_response_frames_;
280 std::vector<QuicWindowUpdateFrame> window_update_frames_;
281 std::vector<QuicBlockedFrame> blocked_frames_;
282 std::vector<QuicNewConnectionIdFrame> new_connection_id_frames_;
283 std::vector<QuicRetireConnectionIdFrame> retire_connection_id_frames_;
284 std::vector<QuicNewTokenFrame> new_token_frames_;
285 std::vector<QuicMessageFrame> message_frames_;
vasilvvc48c8712019-03-11 13:38:16 -0700286 std::vector<std::unique_ptr<std::string>> stream_data_;
287 std::vector<std::unique_ptr<std::string>> crypto_data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500288 EncryptionLevel last_decrypted_level_;
289};
290
291SimpleQuicFramer::SimpleQuicFramer()
292 : framer_(AllSupportedVersions(),
293 QuicTime::Zero(),
294 Perspective::IS_SERVER,
295 kQuicDefaultConnectionIdLength) {}
296
297SimpleQuicFramer::SimpleQuicFramer(
298 const ParsedQuicVersionVector& supported_versions)
299 : framer_(supported_versions,
300 QuicTime::Zero(),
301 Perspective::IS_SERVER,
302 kQuicDefaultConnectionIdLength) {}
303
304SimpleQuicFramer::SimpleQuicFramer(
305 const ParsedQuicVersionVector& supported_versions,
306 Perspective perspective)
307 : framer_(supported_versions,
308 QuicTime::Zero(),
309 perspective,
310 kQuicDefaultConnectionIdLength) {}
311
312SimpleQuicFramer::~SimpleQuicFramer() {}
313
314bool SimpleQuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
315 visitor_ = QuicMakeUnique<SimpleFramerVisitor>();
316 framer_.set_visitor(visitor_.get());
317 return framer_.ProcessPacket(packet);
318}
319
320void SimpleQuicFramer::Reset() {
321 visitor_ = QuicMakeUnique<SimpleFramerVisitor>();
322}
323
324const QuicPacketHeader& SimpleQuicFramer::header() const {
325 return visitor_->header();
326}
327
328const QuicVersionNegotiationPacket*
329SimpleQuicFramer::version_negotiation_packet() const {
330 return visitor_->version_negotiation_packet();
331}
332
333EncryptionLevel SimpleQuicFramer::last_decrypted_level() const {
334 return visitor_->last_decrypted_level();
335}
336
337QuicFramer* SimpleQuicFramer::framer() {
338 return &framer_;
339}
340
341size_t SimpleQuicFramer::num_frames() const {
342 return ack_frames().size() + goaway_frames().size() +
343 rst_stream_frames().size() + stop_waiting_frames().size() +
344 path_challenge_frames().size() + path_response_frames().size() +
345 stream_frames().size() + ping_frames().size() +
346 connection_close_frames().size() + padding_frames().size() +
347 crypto_frames().size();
348}
349
350const std::vector<QuicAckFrame>& SimpleQuicFramer::ack_frames() const {
351 return visitor_->ack_frames();
352}
353
354const std::vector<QuicStopWaitingFrame>& SimpleQuicFramer::stop_waiting_frames()
355 const {
356 return visitor_->stop_waiting_frames();
357}
358
359const std::vector<QuicPathChallengeFrame>&
360SimpleQuicFramer::path_challenge_frames() const {
361 return visitor_->path_challenge_frames();
362}
363const std::vector<QuicPathResponseFrame>&
364SimpleQuicFramer::path_response_frames() const {
365 return visitor_->path_response_frames();
366}
367
368const std::vector<QuicPingFrame>& SimpleQuicFramer::ping_frames() const {
369 return visitor_->ping_frames();
370}
371
372const std::vector<QuicMessageFrame>& SimpleQuicFramer::message_frames() const {
373 return visitor_->message_frames();
374}
375
376const std::vector<QuicWindowUpdateFrame>&
377SimpleQuicFramer::window_update_frames() const {
378 return visitor_->window_update_frames();
379}
380
381const std::vector<std::unique_ptr<QuicStreamFrame>>&
382SimpleQuicFramer::stream_frames() const {
383 return visitor_->stream_frames();
384}
385
386const std::vector<std::unique_ptr<QuicCryptoFrame>>&
387SimpleQuicFramer::crypto_frames() const {
388 return visitor_->crypto_frames();
389}
390
391const std::vector<QuicRstStreamFrame>& SimpleQuicFramer::rst_stream_frames()
392 const {
393 return visitor_->rst_stream_frames();
394}
395
396const std::vector<QuicGoAwayFrame>& SimpleQuicFramer::goaway_frames() const {
397 return visitor_->goaway_frames();
398}
399
400const std::vector<QuicConnectionCloseFrame>&
401SimpleQuicFramer::connection_close_frames() const {
402 return visitor_->connection_close_frames();
403}
404
405const std::vector<QuicPaddingFrame>& SimpleQuicFramer::padding_frames() const {
406 return visitor_->padding_frames();
407}
408
409} // namespace test
410} // namespace quic