1//
2// Copyright (C) 2013 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#ifndef UPDATE_ENGINE_COMMON_ERROR_CODE_H_
18#define UPDATE_ENGINE_COMMON_ERROR_CODE_H_
19
20#include <ostream>  // NOLINT(readability/streams)
21
22namespace chromeos_update_engine {
23
24// Action exit codes.
25enum class ErrorCode : int {
26  kSuccess = 0,
27  kError = 1,
28  kOmahaRequestError = 2,
29  kOmahaResponseHandlerError = 3,
30  kFilesystemCopierError = 4,
31  kPostinstallRunnerError = 5,
32  kPayloadMismatchedType = 6,
33  kInstallDeviceOpenError = 7,
34  kKernelDeviceOpenError = 8,
35  kDownloadTransferError = 9,
36  kPayloadHashMismatchError = 10,
37  kPayloadSizeMismatchError = 11,
38  kDownloadPayloadVerificationError = 12,
39  kDownloadNewPartitionInfoError = 13,
40  kDownloadWriteError = 14,
41  kNewRootfsVerificationError = 15,
42  kNewKernelVerificationError = 16,
43  kSignedDeltaPayloadExpectedError = 17,
44  kDownloadPayloadPubKeyVerificationError = 18,
45  kPostinstallBootedFromFirmwareB = 19,
46  kDownloadStateInitializationError = 20,
47  kDownloadInvalidMetadataMagicString = 21,
48  kDownloadSignatureMissingInManifest = 22,
49  kDownloadManifestParseError = 23,
50  kDownloadMetadataSignatureError = 24,
51  kDownloadMetadataSignatureVerificationError = 25,
52  kDownloadMetadataSignatureMismatch = 26,
53  kDownloadOperationHashVerificationError = 27,
54  kDownloadOperationExecutionError = 28,
55  kDownloadOperationHashMismatch = 29,
56  kOmahaRequestEmptyResponseError = 30,
57  kOmahaRequestXMLParseError = 31,
58  kDownloadInvalidMetadataSize = 32,
59  kDownloadInvalidMetadataSignature = 33,
60  kOmahaResponseInvalid = 34,
61  kOmahaUpdateIgnoredPerPolicy = 35,
62  kOmahaUpdateDeferredPerPolicy = 36,
63  kOmahaErrorInHTTPResponse = 37,
64  kDownloadOperationHashMissingError = 38,
65  kDownloadMetadataSignatureMissingError = 39,
66  kOmahaUpdateDeferredForBackoff = 40,
67  kPostinstallPowerwashError = 41,
68  kUpdateCanceledByChannelChange = 42,
69  kPostinstallFirmwareRONotUpdatable = 43,
70  kUnsupportedMajorPayloadVersion = 44,
71  kUnsupportedMinorPayloadVersion = 45,
72  kOmahaRequestXMLHasEntityDecl = 46,
73  kFilesystemVerifierError = 47,
74  kUserCanceled = 48,
75  kNonCriticalUpdateInOOBE = 49,
76
77  // VERY IMPORTANT! When adding new error codes:
78  //
79  // 1) Update tools/metrics/histograms/histograms.xml in Chrome.
80  //
81  // 2) Update the assorted switch statements in update_engine which won't
82  //    build until this case is added.
83
84  // Any code above this is sent to both Omaha and UMA as-is, except
85  // kOmahaErrorInHTTPResponse (see error code 2000 for more details).
86  // Codes/flags below this line is sent only to Omaha and not to UMA.
87
88  // kUmaReportedMax is not an error code per se, it's just the count
89  // of the number of enums above.  Add any new errors above this line if you
90  // want them to show up on UMA. Stuff below this line will not be sent to UMA
91  // but is used for other errors that are sent to Omaha. We don't assign any
92  // particular value for this enum so that it's just one more than the last
93  // one above and thus always represents the correct count of UMA metrics
94  // buckets, even when new enums are added above this line in future. See
95  // metrics::ReportUpdateAttemptMetrics() on how this enum is used.
96  kUmaReportedMax,
97
98  // use the 2xxx range to encode HTTP errors. These errors are available in
99  // Dremel with the individual granularity. But for UMA purposes, all these
100  // errors are aggregated into one: kOmahaErrorInHTTPResponse.
101  kOmahaRequestHTTPResponseBase = 2000,  // + HTTP response code
102
103  // TODO(jaysri): Move out all the bit masks into separate constants
104  // outside the enum as part of fixing bug 34369.
105  // Bit flags. Remember to update the mask below for new bits.
106
107  // Set if boot mode not normal.
108  // TODO(garnold) This is very debatable value to use, knowing that the
109  // underlying type is a signed int (often, 32-bit). However, at this point
110  // there are parts of the ecosystem that expect this to be a negative value,
111  // so we preserve this semantics. This should be reconsidered if/when we
112  // modify the implementation of ErrorCode into a properly encapsulated class.
113  kDevModeFlag = 1 << 31,
114
115  // Set if resuming an interruped update.
116  kResumedFlag = 1 << 30,
117
118  // Set if using a dev/test image as opposed to an MP-signed image.
119  kTestImageFlag = 1 << 29,
120
121  // Set if using devserver or Omaha sandbox (using crosh autest).
122  kTestOmahaUrlFlag = 1 << 28,
123
124  // Mask that indicates bit positions that are used to indicate special flags
125  // that are embedded in the error code to provide additional context about
126  // the system in which the error was encountered.
127  kSpecialFlags =
128      (kDevModeFlag | kResumedFlag | kTestImageFlag | kTestOmahaUrlFlag)
129};
130
131inline std::ostream& operator<<(std::ostream& os, ErrorCode val) {
132  return os << static_cast<int>(val);
133}
134
135}  // namespace chromeos_update_engine
136
137#endif  // UPDATE_ENGINE_COMMON_ERROR_CODE_H_
138