blob: 8a799c162251c13094038bb8c7aae207a3105f12 [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
22uint64_t QuicPacketNumber::Hash() const {
23 DCHECK(IsInitialized());
24 return packet_number_;
25}
26
27uint64_t QuicPacketNumber::ToUint64() const {
28 DCHECK(IsInitialized());
29 return packet_number_;
30}
31
32bool QuicPacketNumber::IsInitialized() const {
33 return packet_number_ != UninitializedPacketNumber();
34}
35
36QuicPacketNumber& QuicPacketNumber::operator++() {
37#ifndef NDEBUG
38 DCHECK(IsInitialized());
39 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
40 DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max() - 1);
41 } else {
42 DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max());
43 }
44#endif
45 packet_number_++;
46 return *this;
47}
48
49QuicPacketNumber QuicPacketNumber::operator++(int) {
50#ifndef NDEBUG
51 DCHECK(IsInitialized());
52 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
53 DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max() - 1);
54 } else {
55 DCHECK_LT(ToUint64(), std::numeric_limits<uint64_t>::max());
56 }
57#endif
58 QuicPacketNumber previous(*this);
59 packet_number_++;
60 return previous;
61}
62
63QuicPacketNumber& QuicPacketNumber::operator--() {
64#ifndef NDEBUG
65 DCHECK(IsInitialized());
66 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
67 DCHECK_GE(ToUint64(), 1UL);
68 } else {
69 DCHECK_GT(ToUint64(), 1UL);
70 }
71#endif
72 packet_number_--;
73 return *this;
74}
75
76QuicPacketNumber QuicPacketNumber::operator--(int) {
77#ifndef NDEBUG
78 DCHECK(IsInitialized());
79 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
80 DCHECK_GE(ToUint64(), 1UL);
81 } else {
82 DCHECK_GT(ToUint64(), 1UL);
83 }
84#endif
85 QuicPacketNumber previous(*this);
86 packet_number_--;
87 return previous;
88}
89
90QuicPacketNumber& QuicPacketNumber::operator+=(uint64_t delta) {
91#ifndef NDEBUG
92 DCHECK(IsInitialized());
93 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
94 DCHECK_GT(std::numeric_limits<uint64_t>::max() - ToUint64(), delta);
95 } else {
96 DCHECK_GE(std::numeric_limits<uint64_t>::max() - ToUint64(), delta);
97 }
98#endif
99 packet_number_ += delta;
100 return *this;
101}
102
103QuicPacketNumber& QuicPacketNumber::operator-=(uint64_t delta) {
104#ifndef NDEBUG
105 DCHECK(IsInitialized());
106 if (GetQuicRestartFlag(quic_uint64max_uninitialized_pn)) {
107 DCHECK_GE(ToUint64(), delta);
108 } else {
109 DCHECK_GT(ToUint64(), delta);
110 }
111#endif
112 packet_number_ -= delta;
113 return *this;
114}
115
116std::ostream& operator<<(std::ostream& os, const QuicPacketNumber& p) {
117 if (p.IsInitialized()) {
118 os << p.packet_number_;
119 } else {
120 os << "uninitialized";
121 }
122 return os;
123}
124
125// static
126uint64_t QuicPacketNumber::UninitializedPacketNumber() {
127 return GetQuicRestartFlag(quic_uint64max_uninitialized_pn)
128 ? std::numeric_limits<uint64_t>::max()
129 : 0;
130}
131
132} // namespace quic