blob: 252cc420101cc060b0a2d96b583d6ce83fd86e90 [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,
David Zeuthena99981f2013-04-29 13:42:47 -070083
Don Garrett4d039442013-10-28 18:40:06 -070084 // VERY IMPORTANT! When adding new error codes:
85 //
Marton Hunyady199152d2018-05-07 19:08:48 +020086 // 1) Update tools/metrics/histograms/enums.xml in Chrome.
Don Garrett4d039442013-10-28 18:40:06 -070087 //
88 // 2) Update the assorted switch statements in update_engine which won't
89 // build until this case is added.
David Zeuthena99981f2013-04-29 13:42:47 -070090
91 // Any code above this is sent to both Omaha and UMA as-is, except
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070092 // kOmahaErrorInHTTPResponse (see error code 2000 for more details).
David Zeuthena99981f2013-04-29 13:42:47 -070093 // Codes/flags below this line is sent only to Omaha and not to UMA.
94
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070095 // kUmaReportedMax is not an error code per se, it's just the count
David Zeuthena99981f2013-04-29 13:42:47 -070096 // of the number of enums above. Add any new errors above this line if you
97 // want them to show up on UMA. Stuff below this line will not be sent to UMA
98 // but is used for other errors that are sent to Omaha. We don't assign any
99 // particular value for this enum so that it's just one more than the last
100 // one above and thus always represents the correct count of UMA metrics
101 // buckets, even when new enums are added above this line in future. See
Alex Deymoaf9a8632015-09-23 18:51:48 -0700102 // metrics::ReportUpdateAttemptMetrics() on how this enum is used.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700103 kUmaReportedMax,
David Zeuthena99981f2013-04-29 13:42:47 -0700104
105 // use the 2xxx range to encode HTTP errors. These errors are available in
106 // Dremel with the individual granularity. But for UMA purposes, all these
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700107 // errors are aggregated into one: kOmahaErrorInHTTPResponse.
108 kOmahaRequestHTTPResponseBase = 2000, // + HTTP response code
David Zeuthena99981f2013-04-29 13:42:47 -0700109
110 // TODO(jaysri): Move out all the bit masks into separate constants
111 // outside the enum as part of fixing bug 34369.
112 // Bit flags. Remember to update the mask below for new bits.
113
114 // Set if boot mode not normal.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700115 // TODO(garnold) This is very debatable value to use, knowing that the
116 // underlying type is a signed int (often, 32-bit). However, at this point
117 // there are parts of the ecosystem that expect this to be a negative value,
118 // so we preserve this semantics. This should be reconsidered if/when we
119 // modify the implementation of ErrorCode into a properly encapsulated class.
120 kDevModeFlag = 1 << 31,
David Zeuthena99981f2013-04-29 13:42:47 -0700121
Sen Jiang771f6482018-04-04 17:59:10 -0700122 // Set if resuming an interrupted update.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700123 kResumedFlag = 1 << 30,
David Zeuthena99981f2013-04-29 13:42:47 -0700124
125 // Set if using a dev/test image as opposed to an MP-signed image.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700126 kTestImageFlag = 1 << 29,
David Zeuthena99981f2013-04-29 13:42:47 -0700127
128 // Set if using devserver or Omaha sandbox (using crosh autest).
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700129 kTestOmahaUrlFlag = 1 << 28,
David Zeuthena99981f2013-04-29 13:42:47 -0700130
131 // Mask that indicates bit positions that are used to indicate special flags
132 // that are embedded in the error code to provide additional context about
133 // the system in which the error was encountered.
Alex Deymo1f19dcc2016-02-03 09:22:17 -0800134 kSpecialFlags =
135 (kDevModeFlag | kResumedFlag | kTestImageFlag | kTestOmahaUrlFlag)
David Zeuthena99981f2013-04-29 13:42:47 -0700136};
137
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700138inline std::ostream& operator<<(std::ostream& os, ErrorCode val) {
139 return os << static_cast<int>(val);
140}
141
David Zeuthena99981f2013-04-29 13:42:47 -0700142} // namespace chromeos_update_engine
143
Alex Deymo39910dc2015-11-09 17:04:30 -0800144#endif // UPDATE_ENGINE_COMMON_ERROR_CODE_H_