blob: e209b762fc73190f2b51e0020e39fd06c9ccfa6a [file] [log] [blame]
// Copyright (c) 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/quic/core/frames/quic_frame.h"
#include "net/quic/platform/api/quic_logging.h"
using std::string;
namespace net {
QuicFrame::QuicFrame() {}
QuicFrame::QuicFrame(QuicPaddingFrame padding_frame)
: type(PADDING_FRAME), padding_frame(padding_frame) {}
QuicFrame::QuicFrame(QuicStreamFrame* stream_frame)
: type(STREAM_FRAME), stream_frame(stream_frame) {}
QuicFrame::QuicFrame(QuicAckFrame* frame) : type(ACK_FRAME), ack_frame(frame) {}
QuicFrame::QuicFrame(QuicMtuDiscoveryFrame frame)
: type(MTU_DISCOVERY_FRAME), mtu_discovery_frame(frame) {}
QuicFrame::QuicFrame(QuicStopWaitingFrame* frame)
: type(STOP_WAITING_FRAME), stop_waiting_frame(frame) {}
QuicFrame::QuicFrame(QuicPingFrame frame)
: type(PING_FRAME), ping_frame(frame) {}
QuicFrame::QuicFrame(QuicRstStreamFrame* frame)
: type(RST_STREAM_FRAME), rst_stream_frame(frame) {}
QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame)
: type(CONNECTION_CLOSE_FRAME), connection_close_frame(frame) {}
QuicFrame::QuicFrame(QuicGoAwayFrame* frame)
: type(GOAWAY_FRAME), goaway_frame(frame) {}
QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame)
: type(WINDOW_UPDATE_FRAME), window_update_frame(frame) {}
QuicFrame::QuicFrame(QuicBlockedFrame* frame)
: type(BLOCKED_FRAME), blocked_frame(frame) {}
void DeleteFrames(QuicFrames* frames) {
for (QuicFrame& frame : *frames) {
switch (frame.type) {
// Frames smaller than a pointer are inlined, so don't need to be deleted.
case PADDING_FRAME:
case MTU_DISCOVERY_FRAME:
case PING_FRAME:
break;
case STREAM_FRAME:
delete frame.stream_frame;
break;
case ACK_FRAME:
delete frame.ack_frame;
break;
case STOP_WAITING_FRAME:
delete frame.stop_waiting_frame;
break;
case RST_STREAM_FRAME:
delete frame.rst_stream_frame;
break;
case CONNECTION_CLOSE_FRAME:
delete frame.connection_close_frame;
break;
case GOAWAY_FRAME:
delete frame.goaway_frame;
break;
case BLOCKED_FRAME:
delete frame.blocked_frame;
break;
case WINDOW_UPDATE_FRAME:
delete frame.window_update_frame;
break;
case NUM_FRAME_TYPES:
DCHECK(false) << "Cannot delete type: " << frame.type;
}
}
frames->clear();
}
void RemoveFramesForStream(QuicFrames* frames, QuicStreamId stream_id) {
QuicFrames::iterator it = frames->begin();
while (it != frames->end()) {
if (it->type != STREAM_FRAME || it->stream_frame->stream_id != stream_id) {
++it;
continue;
}
delete it->stream_frame;
it = frames->erase(it);
}
}
std::ostream& operator<<(std::ostream& os, const QuicFrame& frame) {
switch (frame.type) {
case PADDING_FRAME: {
os << "type { PADDING_FRAME } " << frame.padding_frame;
break;
}
case RST_STREAM_FRAME: {
os << "type { RST_STREAM_FRAME } " << *(frame.rst_stream_frame);
break;
}
case CONNECTION_CLOSE_FRAME: {
os << "type { CONNECTION_CLOSE_FRAME } "
<< *(frame.connection_close_frame);
break;
}
case GOAWAY_FRAME: {
os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame);
break;
}
case WINDOW_UPDATE_FRAME: {
os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame);
break;
}
case BLOCKED_FRAME: {
os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame);
break;
}
case STREAM_FRAME: {
os << "type { STREAM_FRAME } " << *(frame.stream_frame);
break;
}
case ACK_FRAME: {
os << "type { ACK_FRAME } " << *(frame.ack_frame);
break;
}
case STOP_WAITING_FRAME: {
os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame);
break;
}
case PING_FRAME: {
os << "type { PING_FRAME } ";
break;
}
case MTU_DISCOVERY_FRAME: {
os << "type { MTU_DISCOVERY_FRAME } ";
break;
}
default: {
QUIC_LOG(ERROR) << "Unknown frame type: " << frame.type;
break;
}
}
return os;
}
} // namespace net