blob: 7acb3b62fdd7a3ccccd138cc9fe17497a572f30f [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
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//
David Zeuthena99981f2013-04-29 13:42:47 -070016
Alex Deymo39910dc2015-11-09 17:04:30 -080017#ifndef UPDATE_ENGINE_COMMON_ERROR_CODE_H_
18#define UPDATE_ENGINE_COMMON_ERROR_CODE_H_
David Zeuthena99981f2013-04-29 13:42:47 -070019
Alex Vakulenkod2779df2014-06-16 13:19:00 -070020#include <ostream> // NOLINT(readability/streams)
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070021
David Zeuthena99981f2013-04-29 13:42:47 -070022namespace chromeos_update_engine {
23
24// Action exit codes.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070025enum 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,
David Zeuthenf3e28012014-08-26 18:23:52 -040072 kOmahaRequestXMLHasEntityDecl = 46,
Allie Woodeb9e6d82015-04-17 13:55:30 -070073 kFilesystemVerifierError = 47,
Alex Deymo1f19dcc2016-02-03 09:22:17 -080074 kUserCanceled = 48,
Kevin Cernekee2494e282016-03-29 18:03:53 -070075 kNonCriticalUpdateInOOBE = 49,
Weidong Guo421ff332017-04-17 10:08:38 -070076 kOmahaUpdateIgnoredOverCellular = 50,
Sen Jiang8e768e92017-06-28 17:13:19 -070077 kPayloadTimestampError = 51,
Sen Jiangfe522822017-10-31 15:14:11 -070078 kUpdatedButNotActive = 52,
Sen Jiang89e24c12018-03-22 18:05:44 -070079 kNoUpdate = 53,
Marton Hunyady199152d2018-05-07 19:08:48 +020080 kRollbackNotPossible = 54,
Amin Hassani80f4d4c2018-05-16 13:34:00 -070081 kFirstActiveOmahaPingSentPersistenceError = 55,
Sen Jiang57f91802017-11-14 17:42:13 -080082 kVerityCalculationError = 56,
Amin Hassanid3d84212019-08-17 00:27:44 -070083 kInternalLibCurlError = 57,
84 kUnresolvedHostError = 58,
85 kUnresolvedHostRecovered = 59,
Jae Hoon Kim3e69b4c2020-06-16 09:23:39 -070086 kPackageExcludedFromUpdate = 60,
David Zeuthena99981f2013-04-29 13:42:47 -070087
Don Garrett4d039442013-10-28 18:40:06 -070088 // VERY IMPORTANT! When adding new error codes:
89 //
Marton Hunyady199152d2018-05-07 19:08:48 +020090 // 1) Update tools/metrics/histograms/enums.xml in Chrome.
Don Garrett4d039442013-10-28 18:40:06 -070091 //
92 // 2) Update the assorted switch statements in update_engine which won't
93 // build until this case is added.
David Zeuthena99981f2013-04-29 13:42:47 -070094
95 // Any code above this is sent to both Omaha and UMA as-is, except
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070096 // kOmahaErrorInHTTPResponse (see error code 2000 for more details).
David Zeuthena99981f2013-04-29 13:42:47 -070097 // Codes/flags below this line is sent only to Omaha and not to UMA.
98
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070099 // kUmaReportedMax is not an error code per se, it's just the count
David Zeuthena99981f2013-04-29 13:42:47 -0700100 // of the number of enums above. Add any new errors above this line if you
101 // want them to show up on UMA. Stuff below this line will not be sent to UMA
102 // but is used for other errors that are sent to Omaha. We don't assign any
103 // particular value for this enum so that it's just one more than the last
104 // one above and thus always represents the correct count of UMA metrics
105 // buckets, even when new enums are added above this line in future. See
Alex Deymoaf9a8632015-09-23 18:51:48 -0700106 // metrics::ReportUpdateAttemptMetrics() on how this enum is used.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700107 kUmaReportedMax,
David Zeuthena99981f2013-04-29 13:42:47 -0700108
109 // use the 2xxx range to encode HTTP errors. These errors are available in
110 // Dremel with the individual granularity. But for UMA purposes, all these
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700111 // errors are aggregated into one: kOmahaErrorInHTTPResponse.
112 kOmahaRequestHTTPResponseBase = 2000, // + HTTP response code
David Zeuthena99981f2013-04-29 13:42:47 -0700113
114 // TODO(jaysri): Move out all the bit masks into separate constants
115 // outside the enum as part of fixing bug 34369.
116 // Bit flags. Remember to update the mask below for new bits.
117
118 // Set if boot mode not normal.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700119 // TODO(garnold) This is very debatable value to use, knowing that the
120 // underlying type is a signed int (often, 32-bit). However, at this point
121 // there are parts of the ecosystem that expect this to be a negative value,
122 // so we preserve this semantics. This should be reconsidered if/when we
123 // modify the implementation of ErrorCode into a properly encapsulated class.
124 kDevModeFlag = 1 << 31,
David Zeuthena99981f2013-04-29 13:42:47 -0700125
Sen Jiang771f6482018-04-04 17:59:10 -0700126 // Set if resuming an interrupted update.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700127 kResumedFlag = 1 << 30,
David Zeuthena99981f2013-04-29 13:42:47 -0700128
129 // Set if using a dev/test image as opposed to an MP-signed image.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700130 kTestImageFlag = 1 << 29,
David Zeuthena99981f2013-04-29 13:42:47 -0700131
132 // Set if using devserver or Omaha sandbox (using crosh autest).
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700133 kTestOmahaUrlFlag = 1 << 28,
David Zeuthena99981f2013-04-29 13:42:47 -0700134
135 // Mask that indicates bit positions that are used to indicate special flags
136 // that are embedded in the error code to provide additional context about
137 // the system in which the error was encountered.
Alex Deymo1f19dcc2016-02-03 09:22:17 -0800138 kSpecialFlags =
139 (kDevModeFlag | kResumedFlag | kTestImageFlag | kTestOmahaUrlFlag)
David Zeuthena99981f2013-04-29 13:42:47 -0700140};
141
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700142inline std::ostream& operator<<(std::ostream& os, ErrorCode val) {
143 return os << static_cast<int>(val);
144}
145
David Zeuthena99981f2013-04-29 13:42:47 -0700146} // namespace chromeos_update_engine
147
Alex Deymo39910dc2015-11-09 17:04:30 -0800148#endif // UPDATE_ENGINE_COMMON_ERROR_CODE_H_