OLD | NEW |
(Empty) | |
| 1 // 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 #include "net/quic/core/frames/quic_frame.h" |
| 6 |
| 7 using base::StringPiece; |
| 8 using std::ostream; |
| 9 using std::string; |
| 10 |
| 11 namespace net { |
| 12 |
| 13 QuicFrame::QuicFrame() {} |
| 14 |
| 15 QuicFrame::QuicFrame(QuicPaddingFrame padding_frame) |
| 16 : type(PADDING_FRAME), padding_frame(padding_frame) {} |
| 17 |
| 18 QuicFrame::QuicFrame(QuicStreamFrame* stream_frame) |
| 19 : type(STREAM_FRAME), stream_frame(stream_frame) {} |
| 20 |
| 21 QuicFrame::QuicFrame(QuicAckFrame* frame) : type(ACK_FRAME), ack_frame(frame) {} |
| 22 |
| 23 QuicFrame::QuicFrame(QuicMtuDiscoveryFrame frame) |
| 24 : type(MTU_DISCOVERY_FRAME), mtu_discovery_frame(frame) {} |
| 25 |
| 26 QuicFrame::QuicFrame(QuicStopWaitingFrame* frame) |
| 27 : type(STOP_WAITING_FRAME), stop_waiting_frame(frame) {} |
| 28 |
| 29 QuicFrame::QuicFrame(QuicPingFrame frame) |
| 30 : type(PING_FRAME), ping_frame(frame) {} |
| 31 |
| 32 QuicFrame::QuicFrame(QuicRstStreamFrame* frame) |
| 33 : type(RST_STREAM_FRAME), rst_stream_frame(frame) {} |
| 34 |
| 35 QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame) |
| 36 : type(CONNECTION_CLOSE_FRAME), connection_close_frame(frame) {} |
| 37 |
| 38 QuicFrame::QuicFrame(QuicGoAwayFrame* frame) |
| 39 : type(GOAWAY_FRAME), goaway_frame(frame) {} |
| 40 |
| 41 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) |
| 42 : type(WINDOW_UPDATE_FRAME), window_update_frame(frame) {} |
| 43 |
| 44 QuicFrame::QuicFrame(QuicBlockedFrame* frame) |
| 45 : type(BLOCKED_FRAME), blocked_frame(frame) {} |
| 46 |
| 47 QuicFrame::QuicFrame(QuicPathCloseFrame* frame) |
| 48 : type(PATH_CLOSE_FRAME), path_close_frame(frame) {} |
| 49 |
| 50 void DeleteFrames(QuicFrames* frames) { |
| 51 for (QuicFrame& frame : *frames) { |
| 52 switch (frame.type) { |
| 53 // Frames smaller than a pointer are inlined, so don't need to be deleted. |
| 54 case PADDING_FRAME: |
| 55 case MTU_DISCOVERY_FRAME: |
| 56 case PING_FRAME: |
| 57 break; |
| 58 case STREAM_FRAME: |
| 59 delete frame.stream_frame; |
| 60 break; |
| 61 case ACK_FRAME: |
| 62 delete frame.ack_frame; |
| 63 break; |
| 64 case STOP_WAITING_FRAME: |
| 65 delete frame.stop_waiting_frame; |
| 66 break; |
| 67 case RST_STREAM_FRAME: |
| 68 delete frame.rst_stream_frame; |
| 69 break; |
| 70 case CONNECTION_CLOSE_FRAME: |
| 71 delete frame.connection_close_frame; |
| 72 break; |
| 73 case GOAWAY_FRAME: |
| 74 delete frame.goaway_frame; |
| 75 break; |
| 76 case BLOCKED_FRAME: |
| 77 delete frame.blocked_frame; |
| 78 break; |
| 79 case WINDOW_UPDATE_FRAME: |
| 80 delete frame.window_update_frame; |
| 81 break; |
| 82 case PATH_CLOSE_FRAME: |
| 83 delete frame.path_close_frame; |
| 84 break; |
| 85 case NUM_FRAME_TYPES: |
| 86 DCHECK(false) << "Cannot delete type: " << frame.type; |
| 87 } |
| 88 } |
| 89 frames->clear(); |
| 90 } |
| 91 |
| 92 void RemoveFramesForStream(QuicFrames* frames, QuicStreamId stream_id) { |
| 93 QuicFrames::iterator it = frames->begin(); |
| 94 while (it != frames->end()) { |
| 95 if (it->type != STREAM_FRAME || it->stream_frame->stream_id != stream_id) { |
| 96 ++it; |
| 97 continue; |
| 98 } |
| 99 delete it->stream_frame; |
| 100 it = frames->erase(it); |
| 101 } |
| 102 } |
| 103 |
| 104 ostream& operator<<(ostream& os, const QuicFrame& frame) { |
| 105 switch (frame.type) { |
| 106 case PADDING_FRAME: { |
| 107 os << "type { PADDING_FRAME } " << frame.padding_frame; |
| 108 break; |
| 109 } |
| 110 case RST_STREAM_FRAME: { |
| 111 os << "type { RST_STREAM_FRAME } " << *(frame.rst_stream_frame); |
| 112 break; |
| 113 } |
| 114 case CONNECTION_CLOSE_FRAME: { |
| 115 os << "type { CONNECTION_CLOSE_FRAME } " |
| 116 << *(frame.connection_close_frame); |
| 117 break; |
| 118 } |
| 119 case GOAWAY_FRAME: { |
| 120 os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame); |
| 121 break; |
| 122 } |
| 123 case WINDOW_UPDATE_FRAME: { |
| 124 os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame); |
| 125 break; |
| 126 } |
| 127 case BLOCKED_FRAME: { |
| 128 os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame); |
| 129 break; |
| 130 } |
| 131 case STREAM_FRAME: { |
| 132 os << "type { STREAM_FRAME } " << *(frame.stream_frame); |
| 133 break; |
| 134 } |
| 135 case ACK_FRAME: { |
| 136 os << "type { ACK_FRAME } " << *(frame.ack_frame); |
| 137 break; |
| 138 } |
| 139 case STOP_WAITING_FRAME: { |
| 140 os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame); |
| 141 break; |
| 142 } |
| 143 case PING_FRAME: { |
| 144 os << "type { PING_FRAME } "; |
| 145 break; |
| 146 } |
| 147 case MTU_DISCOVERY_FRAME: { |
| 148 os << "type { MTU_DISCOVERY_FRAME } "; |
| 149 break; |
| 150 } |
| 151 case PATH_CLOSE_FRAME: { |
| 152 os << "type { PATH_CLOSE_FRAME } " << *(frame.path_close_frame); |
| 153 break; |
| 154 } |
| 155 default: { |
| 156 LOG(ERROR) << "Unknown frame type: " << frame.type; |
| 157 break; |
| 158 } |
| 159 } |
| 160 return os; |
| 161 } |
| 162 |
| 163 } // namespace net |
OLD | NEW |