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

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

Issue 990533002: Land Recent QUIC Changes until 03/06/2015. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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
« no previous file with comments | « net/quic/quic_fec_group.h ('k') | net/quic/quic_fec_group_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_fec_group.h" 5 #include "net/quic/quic_fec_group.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 12
13 using base::StringPiece; 13 using base::StringPiece;
14 using std::numeric_limits; 14 using std::numeric_limits;
15 using std::set; 15 using std::set;
16 16
17 namespace net { 17 namespace net {
18 18
19 namespace {
20 const QuicPacketSequenceNumber kNoSequenceNumber = kuint64max;
21 } // namespace
22
23 QuicFecGroup::QuicFecGroup() 19 QuicFecGroup::QuicFecGroup()
24 : min_protected_packet_(kNoSequenceNumber), 20 : min_protected_packet_(kInvalidPacketSequenceNumber),
25 max_protected_packet_(kNoSequenceNumber), 21 max_protected_packet_(kInvalidPacketSequenceNumber),
26 payload_parity_len_(0), 22 payload_parity_len_(0),
27 effective_encryption_level_(NUM_ENCRYPTION_LEVELS) { 23 effective_encryption_level_(NUM_ENCRYPTION_LEVELS) {
28 } 24 }
29 25
30 QuicFecGroup::~QuicFecGroup() {} 26 QuicFecGroup::~QuicFecGroup() {}
31 27
32 bool QuicFecGroup::Update(EncryptionLevel encryption_level, 28 bool QuicFecGroup::Update(EncryptionLevel encryption_level,
33 const QuicPacketHeader& header, 29 const QuicPacketHeader& header,
34 StringPiece decrypted_payload) { 30 StringPiece decrypted_payload) {
31 DCHECK_NE(kInvalidPacketSequenceNumber, header.packet_sequence_number);
35 if (ContainsKey(received_packets_, header.packet_sequence_number)) { 32 if (ContainsKey(received_packets_, header.packet_sequence_number)) {
36 return false; 33 return false;
37 } 34 }
38 if (min_protected_packet_ != kNoSequenceNumber && 35 if (min_protected_packet_ != kInvalidPacketSequenceNumber &&
39 max_protected_packet_ != kNoSequenceNumber && 36 max_protected_packet_ != kInvalidPacketSequenceNumber &&
40 (header.packet_sequence_number < min_protected_packet_ || 37 (header.packet_sequence_number < min_protected_packet_ ||
41 header.packet_sequence_number > max_protected_packet_)) { 38 header.packet_sequence_number > max_protected_packet_)) {
42 DLOG(ERROR) << "FEC group does not cover received packet: " 39 DLOG(ERROR) << "FEC group does not cover received packet: "
43 << header.packet_sequence_number; 40 << header.packet_sequence_number;
44 return false; 41 return false;
45 } 42 }
46 if (!UpdateParity(decrypted_payload)) { 43 if (!UpdateParity(decrypted_payload)) {
47 return false; 44 return false;
48 } 45 }
49 received_packets_.insert(header.packet_sequence_number); 46 received_packets_.insert(header.packet_sequence_number);
50 if (encryption_level < effective_encryption_level_) { 47 if (encryption_level < effective_encryption_level_) {
51 effective_encryption_level_ = encryption_level; 48 effective_encryption_level_ = encryption_level;
52 } 49 }
53 return true; 50 return true;
54 } 51 }
55 52
56 bool QuicFecGroup::UpdateFec( 53 bool QuicFecGroup::UpdateFec(
57 EncryptionLevel encryption_level, 54 EncryptionLevel encryption_level,
58 QuicPacketSequenceNumber fec_packet_sequence_number, 55 QuicPacketSequenceNumber fec_packet_sequence_number,
59 const QuicFecData& fec) { 56 const QuicFecData& fec) {
60 if (min_protected_packet_ != kNoSequenceNumber) { 57 DCHECK_NE(kInvalidPacketSequenceNumber, fec_packet_sequence_number);
58 DCHECK_NE(kInvalidPacketSequenceNumber, fec.fec_group);
59 if (min_protected_packet_ != kInvalidPacketSequenceNumber) {
61 return false; 60 return false;
62 } 61 }
63 SequenceNumberSet::const_iterator it = received_packets_.begin(); 62 SequenceNumberSet::const_iterator it = received_packets_.begin();
64 while (it != received_packets_.end()) { 63 while (it != received_packets_.end()) {
65 if ((*it < fec.fec_group) || (*it >= fec_packet_sequence_number)) { 64 if ((*it < fec.fec_group) || (*it >= fec_packet_sequence_number)) {
66 DLOG(ERROR) << "FEC group does not cover received packet: " << *it; 65 DLOG(ERROR) << "FEC group does not cover received packet: " << *it;
67 return false; 66 return false;
68 } 67 }
69 ++it; 68 ++it;
70 } 69 }
(...skipping 19 matching lines...) Expand all
90 } 89 }
91 90
92 size_t QuicFecGroup::Revive(QuicPacketHeader* header, 91 size_t QuicFecGroup::Revive(QuicPacketHeader* header,
93 char* decrypted_payload, 92 char* decrypted_payload,
94 size_t decrypted_payload_len) { 93 size_t decrypted_payload_len) {
95 if (!CanRevive()) { 94 if (!CanRevive()) {
96 return 0; 95 return 0;
97 } 96 }
98 97
99 // Identify the packet sequence number to be resurrected. 98 // Identify the packet sequence number to be resurrected.
100 QuicPacketSequenceNumber missing = kNoSequenceNumber; 99 QuicPacketSequenceNumber missing = kInvalidPacketSequenceNumber;
101 for (QuicPacketSequenceNumber i = min_protected_packet_; 100 for (QuicPacketSequenceNumber i = min_protected_packet_;
102 i <= max_protected_packet_; ++i) { 101 i <= max_protected_packet_; ++i) {
103 // Is this packet missing? 102 // Is this packet missing?
104 if (received_packets_.count(i) == 0) { 103 if (received_packets_.count(i) == 0) {
105 missing = i; 104 missing = i;
106 break; 105 break;
107 } 106 }
108 } 107 }
109 DCHECK_NE(kNoSequenceNumber, missing); 108 DCHECK_NE(kInvalidPacketSequenceNumber, missing);
110 109
111 DCHECK_LE(payload_parity_len_, decrypted_payload_len); 110 DCHECK_LE(payload_parity_len_, decrypted_payload_len);
112 if (payload_parity_len_ > decrypted_payload_len) { 111 if (payload_parity_len_ > decrypted_payload_len) {
113 return 0; 112 return 0;
114 } 113 }
115 for (size_t i = 0; i < payload_parity_len_; ++i) { 114 for (size_t i = 0; i < payload_parity_len_; ++i) {
116 decrypted_payload[i] = payload_parity_[i]; 115 decrypted_payload[i] = payload_parity_[i];
117 } 116 }
118 117
119 header->packet_sequence_number = missing; 118 header->packet_sequence_number = missing;
120 header->entropy_flag = false; // Unknown entropy. 119 header->entropy_flag = false; // Unknown entropy.
121 120
122 received_packets_.insert(missing); 121 received_packets_.insert(missing);
123 return payload_parity_len_; 122 return payload_parity_len_;
124 } 123 }
125 124
126 bool QuicFecGroup::ProtectsPacketsBefore(QuicPacketSequenceNumber num) const { 125 bool QuicFecGroup::ProtectsPacketsBefore(QuicPacketSequenceNumber num) const {
127 if (max_protected_packet_ != kNoSequenceNumber) { 126 if (max_protected_packet_ != kInvalidPacketSequenceNumber) {
128 return max_protected_packet_ < num; 127 return max_protected_packet_ < num;
129 } 128 }
130 // Since we might not yet have received the FEC packet, we must check 129 // Since we might not yet have received the FEC packet, we must check
131 // the packets we have received. 130 // the packets we have received.
132 return *received_packets_.begin() < num; 131 return *received_packets_.begin() < num;
133 } 132 }
134 133
135 bool QuicFecGroup::UpdateParity(StringPiece payload) { 134 bool QuicFecGroup::UpdateParity(StringPiece payload) {
136 DCHECK_LE(payload.size(), kMaxPacketSize); 135 DCHECK_GE(kMaxPacketSize, payload.size());
137 if (payload.size() > kMaxPacketSize) { 136 if (payload.size() > kMaxPacketSize) {
138 DLOG(ERROR) << "Illegal payload size: " << payload.size(); 137 DLOG(ERROR) << "Illegal payload size: " << payload.size();
139 return false; 138 return false;
140 } 139 }
141 if (payload_parity_len_ < payload.size()) { 140 if (payload_parity_len_ < payload.size()) {
142 payload_parity_len_ = payload.size(); 141 payload_parity_len_ = payload.size();
143 } 142 }
144 DCHECK_LE(payload.size(), kMaxPacketSize);
145 if (received_packets_.empty() && 143 if (received_packets_.empty() &&
146 min_protected_packet_ == kNoSequenceNumber) { 144 min_protected_packet_ == kInvalidPacketSequenceNumber) {
147 // Initialize the parity to the value of this payload 145 // Initialize the parity to the value of this payload
148 memcpy(payload_parity_, payload.data(), payload.size()); 146 memcpy(payload_parity_, payload.data(), payload.size());
149 if (payload.size() < kMaxPacketSize) { 147 if (payload.size() < kMaxPacketSize) {
150 // TODO(rch): expand as needed. 148 // TODO(rch): expand as needed.
151 memset(payload_parity_ + payload.size(), 0, 149 memset(payload_parity_ + payload.size(), 0,
152 kMaxPacketSize - payload.size()); 150 kMaxPacketSize - payload.size());
153 } 151 }
154 return true; 152 return true;
155 } 153 }
156 // Update the parity by XORing in the data (padding with 0s if necessary). 154 // Update the parity by XORing in the data (padding with 0s if necessary).
157 for (size_t i = 0; i < kMaxPacketSize; ++i) { 155 for (size_t i = 0; i < kMaxPacketSize; ++i) {
158 uint8 byte = i < payload.size() ? payload[i] : 0x00; 156 uint8 byte = i < payload.size() ? payload[i] : 0x00;
159 payload_parity_[i] ^= byte; 157 payload_parity_[i] ^= byte;
160 } 158 }
161 return true; 159 return true;
162 } 160 }
163 161
164 size_t QuicFecGroup::NumMissingPackets() const { 162 QuicPacketCount QuicFecGroup::NumMissingPackets() const {
165 if (min_protected_packet_ == kNoSequenceNumber) 163 if (min_protected_packet_ == kInvalidPacketSequenceNumber) {
166 return numeric_limits<size_t>::max(); 164 return numeric_limits<QuicPacketCount>::max();
167 return static_cast<size_t>( 165 }
166 return static_cast<QuicPacketCount>(
168 (max_protected_packet_ - min_protected_packet_ + 1) - 167 (max_protected_packet_ - min_protected_packet_ + 1) -
169 received_packets_.size()); 168 received_packets_.size());
170 } 169 }
171 170
172 } // namespace net 171 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_fec_group.h ('k') | net/quic/quic_fec_group_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698