Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(792)

Side by Side Diff: net/quic/quic_framer.cc

Issue 180723003: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unintialized memory error Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_framer.h" 5 #include "net/quic/quic_framer.h"
6 6
7 #include "base/containers/hash_tables.h" 7 #include "base/containers/hash_tables.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "net/quic/crypto/crypto_framer.h" 9 #include "net/quic/crypto/crypto_framer.h"
10 #include "net/quic/crypto/crypto_handshake_message.h" 10 #include "net/quic/crypto/crypto_handshake_message.h"
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 size_t QuicFramer::GetMinAckFrameSize( 191 size_t QuicFramer::GetMinAckFrameSize(
192 QuicVersion version, 192 QuicVersion version,
193 QuicSequenceNumberLength sequence_number_length, 193 QuicSequenceNumberLength sequence_number_length,
194 QuicSequenceNumberLength largest_observed_length) { 194 QuicSequenceNumberLength largest_observed_length) {
195 return kQuicFrameTypeSize + kQuicEntropyHashSize + 195 return kQuicFrameTypeSize + kQuicEntropyHashSize +
196 sequence_number_length + kQuicEntropyHashSize + 196 sequence_number_length + kQuicEntropyHashSize +
197 largest_observed_length + kQuicDeltaTimeLargestObservedSize; 197 largest_observed_length + kQuicDeltaTimeLargestObservedSize;
198 } 198 }
199 199
200 // static 200 // static
201 size_t QuicFramer::GetStopWaitingFrameSize(
202 QuicSequenceNumberLength sequence_number_length) {
203 return kQuicFrameTypeSize + kQuicEntropyHashSize +
204 sequence_number_length;
205 }
206
207 // static
201 size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) { 208 size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) {
202 if (quic_version > QUIC_VERSION_13) { 209 if (quic_version > QUIC_VERSION_13) {
203 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + 210 return kQuicFrameTypeSize + kQuicMaxStreamIdSize +
204 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize + 211 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize +
205 kQuicErrorDetailsLengthSize; 212 kQuicErrorDetailsLengthSize;
206 } else { 213 } else {
207 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicErrorCodeSize + 214 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicErrorCodeSize +
208 kQuicErrorDetailsLengthSize; 215 kQuicErrorDetailsLengthSize;
209 } 216 }
210 } 217 }
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 } 374 }
368 break; 375 break;
369 case ACK_FRAME: 376 case ACK_FRAME:
370 if (!AppendAckFrameAndTypeByte( 377 if (!AppendAckFrameAndTypeByte(
371 header, *frame.ack_frame, &writer)) { 378 header, *frame.ack_frame, &writer)) {
372 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed"; 379 LOG(DFATAL) << "AppendAckFrameAndTypeByte failed";
373 return kNoPacket; 380 return kNoPacket;
374 } 381 }
375 break; 382 break;
376 case CONGESTION_FEEDBACK_FRAME: 383 case CONGESTION_FEEDBACK_FRAME:
377 if (!AppendQuicCongestionFeedbackFrame( 384 if (!AppendCongestionFeedbackFrame(
378 *frame.congestion_feedback_frame, &writer)) { 385 *frame.congestion_feedback_frame, &writer)) {
379 LOG(DFATAL) << "AppendQuicCongestionFeedbackFrame failed"; 386 LOG(DFATAL) << "AppendCongestionFeedbackFrame failed";
380 return kNoPacket; 387 return kNoPacket;
381 } 388 }
382 break; 389 break;
390 case STOP_WAITING_FRAME:
391 if (quic_version_ <= QUIC_VERSION_15) {
392 LOG(DFATAL) << "Attempt to add a StopWaitingFrame in "
393 << QuicVersionToString(quic_version_);
394 return kNoPacket;
395 }
396 if (!AppendStopWaitingFrame(
397 header, *frame.stop_waiting_frame, &writer)) {
398 LOG(DFATAL) << "AppendStopWaitingFrame failed";
399 return kNoPacket;
400 }
401 break;
383 case RST_STREAM_FRAME: 402 case RST_STREAM_FRAME:
384 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) { 403 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) {
385 LOG(DFATAL) << "AppendRstStreamFrame failed"; 404 LOG(DFATAL) << "AppendRstStreamFrame failed";
386 return kNoPacket; 405 return kNoPacket;
387 } 406 }
388 break; 407 break;
389 case CONNECTION_CLOSE_FRAME: 408 case CONNECTION_CLOSE_FRAME:
390 if (!AppendConnectionCloseFrame( 409 if (!AppendConnectionCloseFrame(
391 *frame.connection_close_frame, &writer)) { 410 *frame.connection_close_frame, &writer)) {
392 LOG(DFATAL) << "AppendConnectionCloseFrame failed"; 411 LOG(DFATAL) << "AppendConnectionCloseFrame failed";
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
1221 return true; 1240 return true;
1222 } 1241 }
1223 } else { 1242 } else {
1224 LOG(DFATAL) << "Trying to read a BlockedFrame in " 1243 LOG(DFATAL) << "Trying to read a BlockedFrame in "
1225 << QuicVersionToString(quic_version_); 1244 << QuicVersionToString(quic_version_);
1226 return RaiseError(QUIC_INTERNAL_ERROR); 1245 return RaiseError(QUIC_INTERNAL_ERROR);
1227 } 1246 }
1228 continue; 1247 continue;
1229 } 1248 }
1230 1249
1250 case STOP_WAITING_FRAME: {
1251 if (quic_version_ <= QUIC_VERSION_15) {
1252 LOG(DFATAL) << "Trying to read a StopWaiting in "
1253 << QuicVersionToString(quic_version_);
1254 return RaiseError(QUIC_INTERNAL_ERROR);
1255 }
1256 QuicStopWaitingFrame stop_waiting_frame;
1257 if (!ProcessStopWaitingFrame(header, &stop_waiting_frame)) {
1258 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA);
1259 }
1260 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) {
1261 DVLOG(1) << "Visitor asked to stop further processing.";
1262 // Returning true since there was no parsing error.
1263 return true;
1264 }
1265 continue;
1266 }
1267
1231 default: 1268 default:
1232 set_detailed_error("Illegal frame type."); 1269 set_detailed_error("Illegal frame type.");
1233 DLOG(WARNING) << "Illegal frame type: " 1270 DLOG(WARNING) << "Illegal frame type: "
1234 << static_cast<int>(frame_type); 1271 << static_cast<int>(frame_type);
1235 return RaiseError(QUIC_INVALID_FRAME_DATA); 1272 return RaiseError(QUIC_INVALID_FRAME_DATA);
1236 } 1273 }
1237 } 1274 }
1238 1275
1239 return true; 1276 return true;
1240 } 1277 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 if (!frame_data.empty()) { 1328 if (!frame_data.empty()) {
1292 frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size()); 1329 frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size());
1293 } 1330 }
1294 1331
1295 return true; 1332 return true;
1296 } 1333 }
1297 1334
1298 bool QuicFramer::ProcessAckFrame(const QuicPacketHeader& header, 1335 bool QuicFramer::ProcessAckFrame(const QuicPacketHeader& header,
1299 uint8 frame_type, 1336 uint8 frame_type,
1300 QuicAckFrame* frame) { 1337 QuicAckFrame* frame) {
1301 if (!ProcessSentInfo(header, &frame->sent_info)) { 1338 if (quic_version_ <= QUIC_VERSION_15) {
1302 return false; 1339 if (!ProcessStopWaitingFrame(header, &frame->sent_info)) {
1340 return false;
1341 }
1303 } 1342 }
1304 if (!ProcessReceivedInfo(frame_type, &frame->received_info)) { 1343 if (!ProcessReceivedInfo(frame_type, &frame->received_info)) {
1305 return false; 1344 return false;
1306 } 1345 }
1307 return true; 1346 return true;
1308 } 1347 }
1309 1348
1310 bool QuicFramer::ProcessReceivedInfo(uint8 frame_type, 1349 bool QuicFramer::ProcessReceivedInfo(uint8 frame_type,
1311 ReceivedPacketInfo* received_info) { 1350 ReceivedPacketInfo* received_info) {
1312 // Determine the three lengths from the frame type: largest observed length, 1351 // Determine the three lengths from the frame type: largest observed length,
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1394 return false; 1433 return false;
1395 } 1434 }
1396 1435
1397 received_info->revived_packets.insert(revived_packet); 1436 received_info->revived_packets.insert(revived_packet);
1398 } 1437 }
1399 } 1438 }
1400 1439
1401 return true; 1440 return true;
1402 } 1441 }
1403 1442
1404 bool QuicFramer::ProcessSentInfo(const QuicPacketHeader& header, 1443 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header,
1405 SentPacketInfo* sent_info) { 1444 QuicStopWaitingFrame* stop_waiting) {
1406 if (!reader_->ReadBytes(&sent_info->entropy_hash, 1)) { 1445 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) {
1407 set_detailed_error("Unable to read entropy hash for sent packets."); 1446 set_detailed_error("Unable to read entropy hash for sent packets.");
1408 return false; 1447 return false;
1409 } 1448 }
1410 1449
1411 QuicPacketSequenceNumber least_unacked_delta = 0; 1450 QuicPacketSequenceNumber least_unacked_delta = 0;
1412 if (!reader_->ReadBytes(&least_unacked_delta, 1451 if (!reader_->ReadBytes(&least_unacked_delta,
1413 header.public_header.sequence_number_length)) { 1452 header.public_header.sequence_number_length)) {
1414 set_detailed_error("Unable to read least unacked delta."); 1453 set_detailed_error("Unable to read least unacked delta.");
1415 return false; 1454 return false;
1416 } 1455 }
1417 DCHECK_GE(header.packet_sequence_number, least_unacked_delta); 1456 DCHECK_GE(header.packet_sequence_number, least_unacked_delta);
1418 sent_info->least_unacked = 1457 stop_waiting->least_unacked =
1419 header.packet_sequence_number - least_unacked_delta; 1458 header.packet_sequence_number - least_unacked_delta;
1420 1459
1421 return true; 1460 return true;
1422 } 1461 }
1423 1462
1424 bool QuicFramer::ProcessQuicCongestionFeedbackFrame( 1463 bool QuicFramer::ProcessQuicCongestionFeedbackFrame(
1425 QuicCongestionFeedbackFrame* frame) { 1464 QuicCongestionFeedbackFrame* frame) {
1426 uint8 feedback_type; 1465 uint8 feedback_type;
1427 if (!reader_->ReadBytes(&feedback_type, 1)) { 1466 if (!reader_->ReadBytes(&feedback_type, 1)) {
1428 set_detailed_error("Unable to read congestion feedback type."); 1467 set_detailed_error("Unable to read congestion feedback type.");
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
1854 } 1893 }
1855 len += 2; // Receive window. 1894 len += 2; // Receive window.
1856 break; 1895 break;
1857 default: 1896 default:
1858 set_detailed_error("Illegal feedback type."); 1897 set_detailed_error("Illegal feedback type.");
1859 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; 1898 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type;
1860 break; 1899 break;
1861 } 1900 }
1862 return len; 1901 return len;
1863 } 1902 }
1903 case STOP_WAITING_FRAME:
1904 return GetStopWaitingFrameSize(sequence_number_length);
1864 case RST_STREAM_FRAME: 1905 case RST_STREAM_FRAME:
1865 return GetMinRstStreamFrameSize(quic_version_) + 1906 return GetMinRstStreamFrameSize(quic_version_) +
1866 frame.rst_stream_frame->error_details.size(); 1907 frame.rst_stream_frame->error_details.size();
1867 case CONNECTION_CLOSE_FRAME: 1908 case CONNECTION_CLOSE_FRAME:
1868 return GetMinConnectionCloseFrameSize() + 1909 return GetMinConnectionCloseFrameSize() +
1869 frame.connection_close_frame->error_details.size(); 1910 frame.connection_close_frame->error_details.size();
1870 case GOAWAY_FRAME: 1911 case GOAWAY_FRAME:
1871 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size(); 1912 return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size();
1872 case WINDOW_UPDATE_FRAME: 1913 case WINDOW_UPDATE_FRAME:
1873 return GetWindowUpdateFrameSize(); 1914 return GetWindowUpdateFrameSize();
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1980 } 2021 }
1981 2022
1982 if (!writer->WriteIOVector(frame.data)) { 2023 if (!writer->WriteIOVector(frame.data)) {
1983 return false; 2024 return false;
1984 } 2025 }
1985 return true; 2026 return true;
1986 } 2027 }
1987 2028
1988 // static 2029 // static
1989 void QuicFramer::set_version(const QuicVersion version) { 2030 void QuicFramer::set_version(const QuicVersion version) {
1990 DCHECK(IsSupportedVersion(version)); 2031 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version);
1991 quic_version_ = version; 2032 quic_version_ = version;
1992 } 2033 }
1993 2034
1994 bool QuicFramer::AppendAckFrameAndTypeByte( 2035 bool QuicFramer::AppendAckFrameAndTypeByte(
1995 const QuicPacketHeader& header, 2036 const QuicPacketHeader& header,
1996 const QuicAckFrame& frame, 2037 const QuicAckFrame& frame,
1997 QuicDataWriter* writer) { 2038 QuicDataWriter* writer) {
1998 AckFrameInfo ack_info = GetAckFrameInfo(frame); 2039 AckFrameInfo ack_info = GetAckFrameInfo(frame);
1999 QuicPacketSequenceNumber ack_largest_observed = 2040 QuicPacketSequenceNumber ack_largest_observed =
2000 frame.received_info.largest_observed; 2041 frame.received_info.largest_observed;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2033 // Missing sequence number length. 2074 // Missing sequence number length.
2034 type_byte <<= kQuicSequenceNumberLengthShift; 2075 type_byte <<= kQuicSequenceNumberLengthShift;
2035 type_byte |= GetSequenceNumberFlags(missing_sequence_number_length); 2076 type_byte |= GetSequenceNumberFlags(missing_sequence_number_length);
2036 2077
2037 type_byte |= kQuicFrameTypeAckMask; 2078 type_byte |= kQuicFrameTypeAckMask;
2038 2079
2039 if (!writer->WriteUInt8(type_byte)) { 2080 if (!writer->WriteUInt8(type_byte)) {
2040 return false; 2081 return false;
2041 } 2082 }
2042 2083
2043 // TODO(satyamshekhar): Decide how often we really should send this 2084 if (quic_version_ <= QUIC_VERSION_15) {
2044 // entropy_hash update. 2085 if (!AppendStopWaitingFrame(header, frame.sent_info, writer)) {
2045 if (!writer->WriteUInt8(frame.sent_info.entropy_hash)) { 2086 return false;
2046 return false; 2087 }
2047 }
2048
2049 DCHECK_GE(header.packet_sequence_number, frame.sent_info.least_unacked);
2050 const QuicPacketSequenceNumber least_unacked_delta =
2051 header.packet_sequence_number - frame.sent_info.least_unacked;
2052 const QuicPacketSequenceNumber length_shift =
2053 header.public_header.sequence_number_length * 8;
2054 if (least_unacked_delta >> length_shift > 0) {
2055 LOG(DFATAL) << "sequence_number_length "
2056 << header.public_header.sequence_number_length
2057 << " is too small for least_unacked_delta: "
2058 << least_unacked_delta;
2059 return false;
2060 }
2061 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length,
2062 least_unacked_delta, writer)) {
2063 return false;
2064 } 2088 }
2065 2089
2066 const ReceivedPacketInfo& received_info = frame.received_info; 2090 const ReceivedPacketInfo& received_info = frame.received_info;
2067 QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash; 2091 QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash;
2068 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); 2092 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin();
2069 if (truncated) { 2093 if (truncated) {
2070 // Skip the nack ranges which the truncated ack won't include and set 2094 // Skip the nack ranges which the truncated ack won't include and set
2071 // a correct largest observed for the truncated ack. 2095 // a correct largest observed for the truncated ack.
2072 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); 2096 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges);
2073 ++i) { 2097 ++i) {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
2153 if (!AppendPacketSequenceNumber(largest_observed_length, 2177 if (!AppendPacketSequenceNumber(largest_observed_length,
2154 *iter, writer)) { 2178 *iter, writer)) {
2155 return false; 2179 return false;
2156 } 2180 }
2157 } 2181 }
2158 } 2182 }
2159 2183
2160 return true; 2184 return true;
2161 } 2185 }
2162 2186
2163 bool QuicFramer::AppendQuicCongestionFeedbackFrame( 2187 bool QuicFramer::AppendCongestionFeedbackFrame(
2164 const QuicCongestionFeedbackFrame& frame, 2188 const QuicCongestionFeedbackFrame& frame,
2165 QuicDataWriter* writer) { 2189 QuicDataWriter* writer) {
2166 if (!writer->WriteBytes(&frame.type, 1)) { 2190 if (!writer->WriteBytes(&frame.type, 1)) {
2167 return false; 2191 return false;
2168 } 2192 }
2169 2193
2170 switch (frame.type) { 2194 switch (frame.type) {
2171 case kInterArrival: { 2195 case kInterArrival: {
2172 const CongestionFeedbackMessageInterArrival& inter_arrival = 2196 const CongestionFeedbackMessageInterArrival& inter_arrival =
2173 frame.inter_arrival; 2197 frame.inter_arrival;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2248 } 2272 }
2249 break; 2273 break;
2250 } 2274 }
2251 default: 2275 default:
2252 return false; 2276 return false;
2253 } 2277 }
2254 2278
2255 return true; 2279 return true;
2256 } 2280 }
2257 2281
2282 bool QuicFramer::AppendStopWaitingFrame(
2283 const QuicPacketHeader& header,
2284 const QuicStopWaitingFrame& frame,
2285 QuicDataWriter* writer) {
2286 DCHECK_GE(header.packet_sequence_number, frame.least_unacked);
2287 const QuicPacketSequenceNumber least_unacked_delta =
2288 header.packet_sequence_number - frame.least_unacked;
2289 const QuicPacketSequenceNumber length_shift =
2290 header.public_header.sequence_number_length * 8;
2291 if (!writer->WriteUInt8(frame.entropy_hash)) {
2292 LOG(DFATAL) << " hash failed";
2293 return false;
2294 }
2295
2296 if (least_unacked_delta >> length_shift > 0) {
2297 LOG(DFATAL) << "sequence_number_length "
2298 << header.public_header.sequence_number_length
2299 << " is too small for least_unacked_delta: "
2300 << least_unacked_delta;
2301 return false;
2302 }
2303 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length,
2304 least_unacked_delta, writer)) {
2305 LOG(DFATAL) << " seq failed: "
2306 << header.public_header.sequence_number_length;
2307 return false;
2308 }
2309
2310 return true;
2311 }
2312
2258 bool QuicFramer::AppendRstStreamFrame( 2313 bool QuicFramer::AppendRstStreamFrame(
2259 const QuicRstStreamFrame& frame, 2314 const QuicRstStreamFrame& frame,
2260 QuicDataWriter* writer) { 2315 QuicDataWriter* writer) {
2261 if (!writer->WriteUInt32(frame.stream_id)) { 2316 if (!writer->WriteUInt32(frame.stream_id)) {
2262 return false; 2317 return false;
2263 } 2318 }
2264 2319
2265 if (quic_version_ > QUIC_VERSION_13) { 2320 if (quic_version_ > QUIC_VERSION_13) {
2266 if (!writer->WriteUInt64(frame.byte_offset)) { 2321 if (!writer->WriteUInt64(frame.byte_offset)) {
2267 return false; 2322 return false;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
2331 2386
2332 bool QuicFramer::RaiseError(QuicErrorCode error) { 2387 bool QuicFramer::RaiseError(QuicErrorCode error) {
2333 DVLOG(1) << "Error detail: " << detailed_error_; 2388 DVLOG(1) << "Error detail: " << detailed_error_;
2334 set_error(error); 2389 set_error(error);
2335 visitor_->OnError(this); 2390 visitor_->OnError(this);
2336 reader_.reset(NULL); 2391 reader_.reset(NULL);
2337 return false; 2392 return false;
2338 } 2393 }
2339 2394
2340 } // namespace net 2395 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698