| 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/quic_frames.h" | |
| 6 | |
| 7 using base::StringPiece; | |
| 8 using std::ostream; | |
| 9 using std::string; | |
| 10 | |
| 11 namespace net { | |
| 12 | |
| 13 void StreamBufferDeleter::operator()(char* buffer) const { | |
| 14 if (allocator_ != nullptr && buffer != nullptr) { | |
| 15 allocator_->Delete(buffer); | |
| 16 } | |
| 17 } | |
| 18 | |
| 19 UniqueStreamBuffer NewStreamBuffer(QuicBufferAllocator* allocator, | |
| 20 size_t size) { | |
| 21 return UniqueStreamBuffer(allocator->New(size), | |
| 22 StreamBufferDeleter(allocator)); | |
| 23 } | |
| 24 | |
| 25 QuicStreamFrame::QuicStreamFrame() | |
| 26 : QuicStreamFrame(0, false, 0, nullptr, 0, nullptr) {} | |
| 27 | |
| 28 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, | |
| 29 bool fin, | |
| 30 QuicStreamOffset offset, | |
| 31 StringPiece data) | |
| 32 : QuicStreamFrame(stream_id, | |
| 33 fin, | |
| 34 offset, | |
| 35 data.data(), | |
| 36 data.length(), | |
| 37 nullptr) {} | |
| 38 | |
| 39 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, | |
| 40 bool fin, | |
| 41 QuicStreamOffset offset, | |
| 42 QuicPacketLength data_length, | |
| 43 UniqueStreamBuffer buffer) | |
| 44 : QuicStreamFrame(stream_id, | |
| 45 fin, | |
| 46 offset, | |
| 47 nullptr, | |
| 48 data_length, | |
| 49 std::move(buffer)) { | |
| 50 DCHECK(this->buffer != nullptr); | |
| 51 DCHECK_EQ(data_buffer, this->buffer.get()); | |
| 52 } | |
| 53 | |
| 54 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, | |
| 55 bool fin, | |
| 56 QuicStreamOffset offset, | |
| 57 const char* data_buffer, | |
| 58 QuicPacketLength data_length, | |
| 59 UniqueStreamBuffer buffer) | |
| 60 : stream_id(stream_id), | |
| 61 fin(fin), | |
| 62 data_length(data_length), | |
| 63 data_buffer(data_buffer), | |
| 64 offset(offset), | |
| 65 buffer(std::move(buffer)) { | |
| 66 if (this->buffer != nullptr) { | |
| 67 DCHECK(data_buffer == nullptr); | |
| 68 this->data_buffer = this->buffer.get(); | |
| 69 } | |
| 70 } | |
| 71 | |
| 72 QuicStreamFrame::~QuicStreamFrame() {} | |
| 73 | |
| 74 bool IsAwaitingPacket(const QuicAckFrame& ack_frame, | |
| 75 QuicPacketNumber packet_number, | |
| 76 QuicPacketNumber peer_least_packet_awaiting_ack) { | |
| 77 return packet_number >= peer_least_packet_awaiting_ack && | |
| 78 !ack_frame.packets.Contains(packet_number); | |
| 79 } | |
| 80 | |
| 81 QuicStopWaitingFrame::QuicStopWaitingFrame() | |
| 82 : path_id(kDefaultPathId), least_unacked(0) {} | |
| 83 | |
| 84 QuicStopWaitingFrame::~QuicStopWaitingFrame() {} | |
| 85 | |
| 86 QuicAckFrame::QuicAckFrame() | |
| 87 : largest_observed(0), | |
| 88 ack_delay_time(QuicTime::Delta::Infinite()), | |
| 89 path_id(kDefaultPathId) {} | |
| 90 | |
| 91 QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default; | |
| 92 | |
| 93 QuicAckFrame::~QuicAckFrame() {} | |
| 94 | |
| 95 QuicRstStreamFrame::QuicRstStreamFrame() | |
| 96 : stream_id(0), error_code(QUIC_STREAM_NO_ERROR), byte_offset(0) {} | |
| 97 | |
| 98 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, | |
| 99 QuicRstStreamErrorCode error_code, | |
| 100 QuicStreamOffset bytes_written) | |
| 101 : stream_id(stream_id), | |
| 102 error_code(error_code), | |
| 103 byte_offset(bytes_written) {} | |
| 104 | |
| 105 QuicConnectionCloseFrame::QuicConnectionCloseFrame() | |
| 106 : error_code(QUIC_NO_ERROR) {} | |
| 107 | |
| 108 QuicFrame::QuicFrame() {} | |
| 109 | |
| 110 QuicFrame::QuicFrame(QuicPaddingFrame padding_frame) | |
| 111 : type(PADDING_FRAME), padding_frame(padding_frame) {} | |
| 112 | |
| 113 QuicFrame::QuicFrame(QuicStreamFrame* stream_frame) | |
| 114 : type(STREAM_FRAME), stream_frame(stream_frame) {} | |
| 115 | |
| 116 QuicFrame::QuicFrame(QuicAckFrame* frame) : type(ACK_FRAME), ack_frame(frame) {} | |
| 117 | |
| 118 QuicFrame::QuicFrame(QuicMtuDiscoveryFrame frame) | |
| 119 : type(MTU_DISCOVERY_FRAME), mtu_discovery_frame(frame) {} | |
| 120 | |
| 121 QuicFrame::QuicFrame(QuicStopWaitingFrame* frame) | |
| 122 : type(STOP_WAITING_FRAME), stop_waiting_frame(frame) {} | |
| 123 | |
| 124 QuicFrame::QuicFrame(QuicPingFrame frame) | |
| 125 : type(PING_FRAME), ping_frame(frame) {} | |
| 126 | |
| 127 QuicFrame::QuicFrame(QuicRstStreamFrame* frame) | |
| 128 : type(RST_STREAM_FRAME), rst_stream_frame(frame) {} | |
| 129 | |
| 130 QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame) | |
| 131 : type(CONNECTION_CLOSE_FRAME), connection_close_frame(frame) {} | |
| 132 | |
| 133 QuicFrame::QuicFrame(QuicGoAwayFrame* frame) | |
| 134 : type(GOAWAY_FRAME), goaway_frame(frame) {} | |
| 135 | |
| 136 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) | |
| 137 : type(WINDOW_UPDATE_FRAME), window_update_frame(frame) {} | |
| 138 | |
| 139 QuicFrame::QuicFrame(QuicBlockedFrame* frame) | |
| 140 : type(BLOCKED_FRAME), blocked_frame(frame) {} | |
| 141 | |
| 142 QuicFrame::QuicFrame(QuicPathCloseFrame* frame) | |
| 143 : type(PATH_CLOSE_FRAME), path_close_frame(frame) {} | |
| 144 | |
| 145 void DeleteFrames(QuicFrames* frames) { | |
| 146 for (QuicFrame& frame : *frames) { | |
| 147 switch (frame.type) { | |
| 148 // Frames smaller than a pointer are inlined, so don't need to be deleted. | |
| 149 case PADDING_FRAME: | |
| 150 case MTU_DISCOVERY_FRAME: | |
| 151 case PING_FRAME: | |
| 152 break; | |
| 153 case STREAM_FRAME: | |
| 154 delete frame.stream_frame; | |
| 155 break; | |
| 156 case ACK_FRAME: | |
| 157 delete frame.ack_frame; | |
| 158 break; | |
| 159 case STOP_WAITING_FRAME: | |
| 160 delete frame.stop_waiting_frame; | |
| 161 break; | |
| 162 case RST_STREAM_FRAME: | |
| 163 delete frame.rst_stream_frame; | |
| 164 break; | |
| 165 case CONNECTION_CLOSE_FRAME: | |
| 166 delete frame.connection_close_frame; | |
| 167 break; | |
| 168 case GOAWAY_FRAME: | |
| 169 delete frame.goaway_frame; | |
| 170 break; | |
| 171 case BLOCKED_FRAME: | |
| 172 delete frame.blocked_frame; | |
| 173 break; | |
| 174 case WINDOW_UPDATE_FRAME: | |
| 175 delete frame.window_update_frame; | |
| 176 break; | |
| 177 case PATH_CLOSE_FRAME: | |
| 178 delete frame.path_close_frame; | |
| 179 break; | |
| 180 case NUM_FRAME_TYPES: | |
| 181 DCHECK(false) << "Cannot delete type: " << frame.type; | |
| 182 } | |
| 183 } | |
| 184 frames->clear(); | |
| 185 } | |
| 186 | |
| 187 void RemoveFramesForStream(QuicFrames* frames, QuicStreamId stream_id) { | |
| 188 QuicFrames::iterator it = frames->begin(); | |
| 189 while (it != frames->end()) { | |
| 190 if (it->type != STREAM_FRAME || it->stream_frame->stream_id != stream_id) { | |
| 191 ++it; | |
| 192 continue; | |
| 193 } | |
| 194 delete it->stream_frame; | |
| 195 it = frames->erase(it); | |
| 196 } | |
| 197 } | |
| 198 | |
| 199 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { | |
| 200 os << "{ least_unacked: " << sent_info.least_unacked << " }\n"; | |
| 201 return os; | |
| 202 } | |
| 203 | |
| 204 PacketNumberQueue::PacketNumberQueue() = default; | |
| 205 PacketNumberQueue::PacketNumberQueue(const PacketNumberQueue& other) = default; | |
| 206 PacketNumberQueue::PacketNumberQueue(PacketNumberQueue&& other) = default; | |
| 207 PacketNumberQueue::~PacketNumberQueue() {} | |
| 208 | |
| 209 PacketNumberQueue& PacketNumberQueue::operator=( | |
| 210 const PacketNumberQueue& other) = default; | |
| 211 PacketNumberQueue& PacketNumberQueue::operator=(PacketNumberQueue&& other) = | |
| 212 default; | |
| 213 | |
| 214 void PacketNumberQueue::Add(QuicPacketNumber packet_number) { | |
| 215 packet_number_intervals_.Add(packet_number, packet_number + 1); | |
| 216 } | |
| 217 | |
| 218 void PacketNumberQueue::Add(QuicPacketNumber lower, QuicPacketNumber higher) { | |
| 219 packet_number_intervals_.Add(lower, higher); | |
| 220 } | |
| 221 | |
| 222 void PacketNumberQueue::Remove(QuicPacketNumber packet_number) { | |
| 223 packet_number_intervals_.Difference(packet_number, packet_number + 1); | |
| 224 } | |
| 225 | |
| 226 void PacketNumberQueue::Remove(QuicPacketNumber lower, | |
| 227 QuicPacketNumber higher) { | |
| 228 packet_number_intervals_.Difference(lower, higher); | |
| 229 } | |
| 230 | |
| 231 bool PacketNumberQueue::RemoveUpTo(QuicPacketNumber higher) { | |
| 232 if (Empty()) { | |
| 233 return false; | |
| 234 } | |
| 235 const QuicPacketNumber old_min = Min(); | |
| 236 packet_number_intervals_.Difference(0, higher); | |
| 237 return Empty() || old_min != Min(); | |
| 238 } | |
| 239 | |
| 240 void PacketNumberQueue::Complement() { | |
| 241 if (Empty()) { | |
| 242 return; | |
| 243 } | |
| 244 packet_number_intervals_.Complement(Min(), Max() + 1); | |
| 245 } | |
| 246 | |
| 247 bool PacketNumberQueue::Contains(QuicPacketNumber packet_number) const { | |
| 248 return packet_number_intervals_.Contains(packet_number); | |
| 249 } | |
| 250 | |
| 251 bool PacketNumberQueue::Empty() const { | |
| 252 return packet_number_intervals_.Empty(); | |
| 253 } | |
| 254 | |
| 255 QuicPacketNumber PacketNumberQueue::Min() const { | |
| 256 DCHECK(!Empty()); | |
| 257 return packet_number_intervals_.begin()->min(); | |
| 258 } | |
| 259 | |
| 260 QuicPacketNumber PacketNumberQueue::Max() const { | |
| 261 DCHECK(!Empty()); | |
| 262 return packet_number_intervals_.rbegin()->max() - 1; | |
| 263 } | |
| 264 | |
| 265 size_t PacketNumberQueue::NumPacketsSlow() const { | |
| 266 size_t num_packets = 0; | |
| 267 for (const auto& interval : packet_number_intervals_) { | |
| 268 num_packets += interval.Length(); | |
| 269 } | |
| 270 return num_packets; | |
| 271 } | |
| 272 | |
| 273 size_t PacketNumberQueue::NumIntervals() const { | |
| 274 return packet_number_intervals_.Size(); | |
| 275 } | |
| 276 | |
| 277 QuicPacketNumber PacketNumberQueue::LastIntervalLength() const { | |
| 278 DCHECK(!Empty()); | |
| 279 return packet_number_intervals_.rbegin()->Length(); | |
| 280 } | |
| 281 | |
| 282 PacketNumberQueue::const_iterator PacketNumberQueue::lower_bound( | |
| 283 QuicPacketNumber packet_number) const { | |
| 284 // lower_bound returns the first interval that contains |packet_number| or the | |
| 285 // first interval after |packet_number|. | |
| 286 auto itr = packet_number_intervals_.Find(packet_number); | |
| 287 if (itr != packet_number_intervals_.end()) { | |
| 288 return itr; | |
| 289 } | |
| 290 for (itr = packet_number_intervals_.begin(); | |
| 291 itr != packet_number_intervals_.end(); ++itr) { | |
| 292 if (packet_number < itr->min()) { | |
| 293 return itr; | |
| 294 } | |
| 295 } | |
| 296 return packet_number_intervals_.end(); | |
| 297 } | |
| 298 | |
| 299 PacketNumberQueue::const_iterator PacketNumberQueue::begin() const { | |
| 300 return packet_number_intervals_.begin(); | |
| 301 } | |
| 302 | |
| 303 PacketNumberQueue::const_iterator PacketNumberQueue::end() const { | |
| 304 return packet_number_intervals_.end(); | |
| 305 } | |
| 306 | |
| 307 PacketNumberQueue::const_reverse_iterator PacketNumberQueue::rbegin() const { | |
| 308 return packet_number_intervals_.rbegin(); | |
| 309 } | |
| 310 | |
| 311 PacketNumberQueue::const_reverse_iterator PacketNumberQueue::rend() const { | |
| 312 return packet_number_intervals_.rend(); | |
| 313 } | |
| 314 | |
| 315 ostream& operator<<(ostream& os, const PacketNumberQueue& q) { | |
| 316 for (const Interval<QuicPacketNumber>& interval : q) { | |
| 317 for (QuicPacketNumber packet_number = interval.min(); | |
| 318 packet_number < interval.max(); ++packet_number) { | |
| 319 os << packet_number << " "; | |
| 320 } | |
| 321 } | |
| 322 return os; | |
| 323 } | |
| 324 | |
| 325 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { | |
| 326 os << "{ largest_observed: " << ack_frame.largest_observed | |
| 327 << ", ack_delay_time: " << ack_frame.ack_delay_time.ToMicroseconds() | |
| 328 << ", packets: [ " << ack_frame.packets << " ]" | |
| 329 << ", received_packets: [ "; | |
| 330 for (const std::pair<QuicPacketNumber, QuicTime>& p : | |
| 331 ack_frame.received_packet_times) { | |
| 332 os << p.first << " at " << p.second.ToDebuggingValue() << " "; | |
| 333 } | |
| 334 os << " ] }\n"; | |
| 335 return os; | |
| 336 } | |
| 337 | |
| 338 ostream& operator<<(ostream& os, const QuicFrame& frame) { | |
| 339 switch (frame.type) { | |
| 340 case PADDING_FRAME: { | |
| 341 os << "type { PADDING_FRAME } " << frame.padding_frame; | |
| 342 break; | |
| 343 } | |
| 344 case RST_STREAM_FRAME: { | |
| 345 os << "type { RST_STREAM_FRAME } " << *(frame.rst_stream_frame); | |
| 346 break; | |
| 347 } | |
| 348 case CONNECTION_CLOSE_FRAME: { | |
| 349 os << "type { CONNECTION_CLOSE_FRAME } " | |
| 350 << *(frame.connection_close_frame); | |
| 351 break; | |
| 352 } | |
| 353 case GOAWAY_FRAME: { | |
| 354 os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame); | |
| 355 break; | |
| 356 } | |
| 357 case WINDOW_UPDATE_FRAME: { | |
| 358 os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame); | |
| 359 break; | |
| 360 } | |
| 361 case BLOCKED_FRAME: { | |
| 362 os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame); | |
| 363 break; | |
| 364 } | |
| 365 case STREAM_FRAME: { | |
| 366 os << "type { STREAM_FRAME } " << *(frame.stream_frame); | |
| 367 break; | |
| 368 } | |
| 369 case ACK_FRAME: { | |
| 370 os << "type { ACK_FRAME } " << *(frame.ack_frame); | |
| 371 break; | |
| 372 } | |
| 373 case STOP_WAITING_FRAME: { | |
| 374 os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame); | |
| 375 break; | |
| 376 } | |
| 377 case PING_FRAME: { | |
| 378 os << "type { PING_FRAME } "; | |
| 379 break; | |
| 380 } | |
| 381 case MTU_DISCOVERY_FRAME: { | |
| 382 os << "type { MTU_DISCOVERY_FRAME } "; | |
| 383 break; | |
| 384 } | |
| 385 case PATH_CLOSE_FRAME: { | |
| 386 os << "type { PATH_CLOSE_FRAME } " << *(frame.path_close_frame); | |
| 387 break; | |
| 388 } | |
| 389 default: { | |
| 390 LOG(ERROR) << "Unknown frame type: " << frame.type; | |
| 391 break; | |
| 392 } | |
| 393 } | |
| 394 return os; | |
| 395 } | |
| 396 | |
| 397 ostream& operator<<(ostream& os, const QuicPaddingFrame& padding_frame) { | |
| 398 os << "{ num_padding_bytes: " << padding_frame.num_padding_bytes << " }\n"; | |
| 399 return os; | |
| 400 } | |
| 401 | |
| 402 ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) { | |
| 403 os << "{ stream_id: " << rst_frame.stream_id | |
| 404 << ", error_code: " << rst_frame.error_code << " }\n"; | |
| 405 return os; | |
| 406 } | |
| 407 | |
| 408 ostream& operator<<(ostream& os, | |
| 409 const QuicConnectionCloseFrame& connection_close_frame) { | |
| 410 os << "{ error_code: " << connection_close_frame.error_code | |
| 411 << ", error_details: '" << connection_close_frame.error_details << "' }\n"; | |
| 412 return os; | |
| 413 } | |
| 414 | |
| 415 ostream& operator<<(ostream& os, const QuicGoAwayFrame& goaway_frame) { | |
| 416 os << "{ error_code: " << goaway_frame.error_code | |
| 417 << ", last_good_stream_id: " << goaway_frame.last_good_stream_id | |
| 418 << ", reason_phrase: '" << goaway_frame.reason_phrase << "' }\n"; | |
| 419 return os; | |
| 420 } | |
| 421 | |
| 422 ostream& operator<<(ostream& os, | |
| 423 const QuicWindowUpdateFrame& window_update_frame) { | |
| 424 os << "{ stream_id: " << window_update_frame.stream_id | |
| 425 << ", byte_offset: " << window_update_frame.byte_offset << " }\n"; | |
| 426 return os; | |
| 427 } | |
| 428 | |
| 429 ostream& operator<<(ostream& os, const QuicBlockedFrame& blocked_frame) { | |
| 430 os << "{ stream_id: " << blocked_frame.stream_id << " }\n"; | |
| 431 return os; | |
| 432 } | |
| 433 | |
| 434 ostream& operator<<(ostream& os, const QuicPathCloseFrame& path_close_frame) { | |
| 435 os << "{ path_id: " << static_cast<int>(path_close_frame.path_id) << " }\n"; | |
| 436 return os; | |
| 437 } | |
| 438 | |
| 439 ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) { | |
| 440 os << "{ stream_id: " << stream_frame.stream_id | |
| 441 << ", fin: " << stream_frame.fin << ", offset: " << stream_frame.offset | |
| 442 << ", length: " << stream_frame.data_length << " }\n"; | |
| 443 return os; | |
| 444 } | |
| 445 | |
| 446 QuicGoAwayFrame::QuicGoAwayFrame() | |
| 447 : error_code(QUIC_NO_ERROR), last_good_stream_id(0) {} | |
| 448 | |
| 449 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code, | |
| 450 QuicStreamId last_good_stream_id, | |
| 451 const string& reason) | |
| 452 : error_code(error_code), | |
| 453 last_good_stream_id(last_good_stream_id), | |
| 454 reason_phrase(reason) {} | |
| 455 | |
| 456 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id, | |
| 457 QuicStreamOffset byte_offset) | |
| 458 : stream_id(stream_id), byte_offset(byte_offset) {} | |
| 459 | |
| 460 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id) | |
| 461 : stream_id(stream_id) {} | |
| 462 | |
| 463 QuicPathCloseFrame::QuicPathCloseFrame(QuicPathId path_id) : path_id(path_id) {} | |
| 464 | |
| 465 } // namespace net | |
| OLD | NEW |