blob: 1fa9e01af565c1c08c8f67e77ff6aeb6eadab7f3 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2016 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#ifndef QUICHE_QUIC_CORE_FRAMES_QUIC_FRAME_H_
6#define QUICHE_QUIC_CORE_FRAMES_QUIC_FRAME_H_
7
8#include <ostream>
9#include <vector>
10
11#include "net/third_party/quiche/src/quic/core/frames/quic_ack_frame.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050012#include "net/third_party/quiche/src/quic/core/frames/quic_blocked_frame.h"
13#include "net/third_party/quiche/src/quic/core/frames/quic_connection_close_frame.h"
14#include "net/third_party/quiche/src/quic/core/frames/quic_crypto_frame.h"
15#include "net/third_party/quiche/src/quic/core/frames/quic_goaway_frame.h"
fkastenholz3c4eabf2019-04-22 07:49:59 -070016#include "net/third_party/quiche/src/quic/core/frames/quic_max_streams_frame.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050017#include "net/third_party/quiche/src/quic/core/frames/quic_message_frame.h"
18#include "net/third_party/quiche/src/quic/core/frames/quic_mtu_discovery_frame.h"
19#include "net/third_party/quiche/src/quic/core/frames/quic_new_connection_id_frame.h"
20#include "net/third_party/quiche/src/quic/core/frames/quic_new_token_frame.h"
21#include "net/third_party/quiche/src/quic/core/frames/quic_padding_frame.h"
22#include "net/third_party/quiche/src/quic/core/frames/quic_path_challenge_frame.h"
23#include "net/third_party/quiche/src/quic/core/frames/quic_path_response_frame.h"
24#include "net/third_party/quiche/src/quic/core/frames/quic_ping_frame.h"
25#include "net/third_party/quiche/src/quic/core/frames/quic_retire_connection_id_frame.h"
26#include "net/third_party/quiche/src/quic/core/frames/quic_rst_stream_frame.h"
27#include "net/third_party/quiche/src/quic/core/frames/quic_stop_sending_frame.h"
28#include "net/third_party/quiche/src/quic/core/frames/quic_stop_waiting_frame.h"
29#include "net/third_party/quiche/src/quic/core/frames/quic_stream_frame.h"
fkastenholz3c4eabf2019-04-22 07:49:59 -070030#include "net/third_party/quiche/src/quic/core/frames/quic_streams_blocked_frame.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050031#include "net/third_party/quiche/src/quic/core/frames/quic_window_update_frame.h"
32#include "net/third_party/quiche/src/quic/core/quic_types.h"
33#include "net/third_party/quiche/src/quic/platform/api/quic_containers.h"
34#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
35
36namespace quic {
37
38struct QUIC_EXPORT_PRIVATE QuicFrame {
39 QuicFrame();
40 // Please keep the constructors in the same order as the union below.
41 explicit QuicFrame(QuicPaddingFrame padding_frame);
42 explicit QuicFrame(QuicMtuDiscoveryFrame frame);
43 explicit QuicFrame(QuicPingFrame frame);
fkastenholz3c4eabf2019-04-22 07:49:59 -070044 explicit QuicFrame(QuicMaxStreamsFrame frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -050045 explicit QuicFrame(QuicStopWaitingFrame frame);
fkastenholz3c4eabf2019-04-22 07:49:59 -070046 explicit QuicFrame(QuicStreamsBlockedFrame frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -050047 explicit QuicFrame(QuicStreamFrame stream_frame);
48
49 explicit QuicFrame(QuicAckFrame* frame);
50 explicit QuicFrame(QuicRstStreamFrame* frame);
51 explicit QuicFrame(QuicConnectionCloseFrame* frame);
52 explicit QuicFrame(QuicGoAwayFrame* frame);
53 explicit QuicFrame(QuicWindowUpdateFrame* frame);
54 explicit QuicFrame(QuicBlockedFrame* frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -050055 explicit QuicFrame(QuicNewConnectionIdFrame* frame);
56 explicit QuicFrame(QuicRetireConnectionIdFrame* frame);
57 explicit QuicFrame(QuicNewTokenFrame* frame);
58 explicit QuicFrame(QuicPathResponseFrame* frame);
59 explicit QuicFrame(QuicPathChallengeFrame* frame);
60 explicit QuicFrame(QuicStopSendingFrame* frame);
61 explicit QuicFrame(QuicMessageFrame* message_frame);
62 explicit QuicFrame(QuicCryptoFrame* crypto_frame);
63
64 QUIC_EXPORT_PRIVATE friend std::ostream& operator<<(std::ostream& os,
65 const QuicFrame& frame);
66
67 union {
68 // Inlined frames.
69 // Overlapping inlined frames have a |type| field at the same 0 offset as
70 // QuicFrame does for out of line frames below, allowing use of the
71 // remaining 7 bytes after offset for frame-type specific fields.
72 QuicPaddingFrame padding_frame;
73 QuicMtuDiscoveryFrame mtu_discovery_frame;
74 QuicPingFrame ping_frame;
fkastenholz3c4eabf2019-04-22 07:49:59 -070075 QuicMaxStreamsFrame max_streams_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -050076 QuicStopWaitingFrame stop_waiting_frame;
fkastenholz3c4eabf2019-04-22 07:49:59 -070077 QuicStreamsBlockedFrame streams_blocked_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -050078 QuicStreamFrame stream_frame;
79
80 // Out of line frames.
81 struct {
82 QuicFrameType type;
83
84 // TODO(wub): These frames can also be inlined without increasing the size
85 // of QuicFrame: QuicRstStreamFrame, QuicWindowUpdateFrame,
86 // QuicBlockedFrame, QuicPathResponseFrame, QuicPathChallengeFrame and
87 // QuicStopSendingFrame.
88 union {
89 QuicAckFrame* ack_frame;
90 QuicRstStreamFrame* rst_stream_frame;
91 QuicConnectionCloseFrame* connection_close_frame;
92 QuicGoAwayFrame* goaway_frame;
93 QuicWindowUpdateFrame* window_update_frame;
94 QuicBlockedFrame* blocked_frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -050095 QuicNewConnectionIdFrame* new_connection_id_frame;
96 QuicRetireConnectionIdFrame* retire_connection_id_frame;
97 QuicPathResponseFrame* path_response_frame;
98 QuicPathChallengeFrame* path_challenge_frame;
99 QuicStopSendingFrame* stop_sending_frame;
100 QuicMessageFrame* message_frame;
101 QuicCryptoFrame* crypto_frame;
102 QuicNewTokenFrame* new_token_frame;
103 };
104 };
105 };
106};
107
108static_assert(sizeof(QuicFrame) <= 24,
109 "Frames larger than 24 bytes should be referenced by pointer.");
110static_assert(offsetof(QuicStreamFrame, type) == offsetof(QuicFrame, type),
111 "Offset of |type| must match in QuicFrame and QuicStreamFrame");
112
113// A inline size of 1 is chosen to optimize the typical use case of
114// 1-stream-frame in QuicTransmissionInfo.retransmittable_frames.
115typedef QuicInlinedVector<QuicFrame, 1> QuicFrames;
116
117// Deletes all the sub-frames contained in |frames|.
118QUIC_EXPORT_PRIVATE void DeleteFrames(QuicFrames* frames);
119
120// Delete the sub-frame contained in |frame|.
121QUIC_EXPORT_PRIVATE void DeleteFrame(QuicFrame* frame);
122
123// Deletes all the QuicStreamFrames for the specified |stream_id|.
124QUIC_EXPORT_PRIVATE void RemoveFramesForStream(QuicFrames* frames,
125 QuicStreamId stream_id);
126
127// Returns true if |type| is a retransmittable control frame.
128QUIC_EXPORT_PRIVATE bool IsControlFrame(QuicFrameType type);
129
130// Returns control_frame_id of |frame|. Returns kInvalidControlFrameId if
131// |frame| does not have a valid control_frame_id.
132QUIC_EXPORT_PRIVATE QuicControlFrameId
133GetControlFrameId(const QuicFrame& frame);
134
135// Sets control_frame_id of |frame| to |control_frame_id|.
136QUIC_EXPORT_PRIVATE void SetControlFrameId(QuicControlFrameId control_frame_id,
137 QuicFrame* frame);
138
139// Returns a copy of |frame|.
140QUIC_EXPORT_PRIVATE QuicFrame
141CopyRetransmittableControlFrame(const QuicFrame& frame);
142
dschinazi118934b2019-06-13 18:09:08 -0700143// Human-readable description suitable for logging.
144QUIC_EXPORT_PRIVATE std::string QuicFramesToString(const QuicFrames& frames);
145
QUICHE teama6ef0a62019-03-07 20:34:33 -0500146} // namespace quic
147
148#endif // QUICHE_QUIC_CORE_FRAMES_QUIC_FRAME_H_