blob: 39969931a935a7d720d1aab1c071ef6963ec8260 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2019 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/third_party/quiche/src/quic/core/quic_packet_number.h"
6
7namespace quic {
8
9QuicPacketNumber::QuicPacketNumber()
10 : packet_number_(UninitializedPacketNumber()) {}
11
12QuicPacketNumber::QuicPacketNumber(uint64_t packet_number)
13 : packet_number_(packet_number) {
14 DCHECK_NE(UninitializedPacketNumber(), packet_number)
15 << "Use default constructor for uninitialized packet number";
16}
17
18void QuicPacketNumber::Clear() {
19 packet_number_ = UninitializedPacketNumber();
20}
21
QUICHE teamc264e362019-03-19 14:21:06 -070022void QuicPacketNumber::UpdateMax(QuicPacketNumber new_value) {
23 if (!new_value.IsInitialized()) {
24 return;
25 }
26 if (!IsInitialized()) {
27 packet_number_ = new_value.ToUint64();
28 } else {
29 packet_number_ = std::max(packet_number_, new_value.ToUint64());
30 }
31}
32
QUICHE teama6ef0a62019-03-07 20:34:33 -050033uint64_t QuicPacketNumber::Hash() const {
34 DCHECK(IsInitialized());
35 return packet_number_;
36}
37
38uint64_t QuicPacketNumber::ToUint64() const {
39 DCHECK(IsInitialized());
40 return packet_number_;
41}
42
43bool QuicPacketNumber::IsInitialized() const {
44 return packet_number_ != UninitializedPacketNumber();
45}
46
47QuicPacketNumber& QuicPacketNumber::operator++() {
48#ifndef NDEBUG
49 DCHECK(IsInitialized());
50 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
51 DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max() - 1);
52 } else {
53 DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max());
54 }
55#endif
56 packet_number_++;
57 return *this;
58}
59
60QuicPacketNumber QuicPacketNumber::operator++(int) {
61#ifndef NDEBUG
62 DCHECK(IsInitialized());
63 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
64 DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max() - 1);
65 } else {
66 DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max());
67 }
68#endif
69 QuicPacketNumber previous(*this);
70 packet_number_++;
71 return previous;
72}
73
74QuicPacketNumber& QuicPacketNumber::operator--() {
75#ifndef NDEBUG
76 DCHECK(IsInitialized());
77 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
78 DCHECK_GE(ToUint64(), 1UL);
79 } else {
80 DCHECK_GT(ToUint64(), 1UL);
81 }
82#endif
83 packet_number_--;
84 return *this;
85}
86
87QuicPacketNumber QuicPacketNumber::operator--(int) {
88#ifndef NDEBUG
89 DCHECK(IsInitialized());
90 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
91 DCHECK_GE(ToUint64(), 1UL);
92 } else {
93 DCHECK_GT(ToUint64(), 1UL);
94 }
95#endif
96 QuicPacketNumber previous(*this);
97 packet_number_--;
98 return previous;
99}
100
101QuicPacketNumber& QuicPacketNumber::operator+=(uint64_t delta) {
102#ifndef NDEBUG
103 DCHECK(IsInitialized());
104 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
105 DCHECK_GT(std::numeric_limits<uint64_t>::max() - ToUint64(), delta);
106 } else {
107 DCHECK_GE(std::numeric_limits<uint64_t>::max() - ToUint64(), delta);
108 }
109#endif
110 packet_number_ += delta;
111 return *this;
112}
113
114QuicPacketNumber& QuicPacketNumber::operator-=(uint64_t delta) {
115#ifndef NDEBUG
116 DCHECK(IsInitialized());
117 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
118 DCHECK_GE(ToUint64(), delta);
119 } else {
120 DCHECK_GT(ToUint64(), delta);
121 }
122#endif
123 packet_number_ -= delta;
124 return *this;
125}
126
127std::ostream& operator<<(std::ostream& os, const QuicPacketNumber& p) {
128 if (p.IsInitialized()) {
129 os << p.packet_number_;
130 } else {
131 os << "uninitialized";
132 }
133 return os;
134}
135
136// static
137uint64_t QuicPacketNumber::UninitializedPacketNumber() {
138 return GetQuicRestartFlag(quic_uint64max_uninitialized_pn)
139 ? std::numeric_limits<uint64_t>::max()
140 : 0;
141}
142
143} // namespace quic