• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
22 namespace chromeos_update_engine {
23 
24 // Action exit codes.
25 enum 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   kOmahaUpdateIgnoredOverCellular = 50,
77   kPayloadTimestampError = 51,
78   kUpdatedButNotActive = 52,
79   kNoUpdate = 53,
80   kRollbackNotPossible = 54,
81   kFirstActiveOmahaPingSentPersistenceError = 55,
82   kVerityCalculationError = 56,
83   kInternalLibCurlError = 57,
84   kUnresolvedHostError = 58,
85   kUnresolvedHostRecovered = 59,
86   kNotEnoughSpace = 60,
87   kDeviceCorrupted = 61,
88   kPackageExcludedFromUpdate = 62,
89   kPostInstallMountError = 63,
90   kOverlayfsenabledError = 64,
91   kUpdateProcessing = 65,
92   kUpdateAlreadyInstalled = 66,
93 
94   // VERY IMPORTANT! When adding new error codes:
95   //
96   // 1) Update tools/metrics/histograms/enums.xml in Chrome.
97   //
98   // 2) Update the assorted switch statements in update_engine which won't
99   //    build until this case is added.
100 
101   // Any code above this is sent to both Omaha and UMA as-is, except
102   // kOmahaErrorInHTTPResponse (see error code 2000 for more details).
103   // Codes/flags below this line is sent only to Omaha and not to UMA.
104 
105   // kUmaReportedMax is not an error code per se, it's just the count
106   // of the number of enums above.  Add any new errors above this line if you
107   // want them to show up on UMA. Stuff below this line will not be sent to UMA
108   // but is used for other errors that are sent to Omaha. We don't assign any
109   // particular value for this enum so that it's just one more than the last
110   // one above and thus always represents the correct count of UMA metrics
111   // buckets, even when new enums are added above this line in future. See
112   // metrics::ReportUpdateAttemptMetrics() on how this enum is used.
113   kUmaReportedMax,
114 
115   // use the 2xxx range to encode HTTP errors. These errors are available in
116   // Dremel with the individual granularity. But for UMA purposes, all these
117   // errors are aggregated into one: kOmahaErrorInHTTPResponse.
118   kOmahaRequestHTTPResponseBase = 2000,  // + HTTP response code
119 
120   // TODO(jaysri): Move out all the bit masks into separate constants
121   // outside the enum as part of fixing bug 34369.
122   // Bit flags. Remember to update the mask below for new bits.
123 
124   // Set if boot mode not normal.
125   // TODO(garnold) This is very debatable value to use, knowing that the
126   // underlying type is a signed int (often, 32-bit). However, at this point
127   // there are parts of the ecosystem that expect this to be a negative value,
128   // so we preserve this semantics. This should be reconsidered if/when we
129   // modify the implementation of ErrorCode into a properly encapsulated class.
130   kDevModeFlag = 1 << 31,
131 
132   // Set if resuming an interrupted update.
133   kResumedFlag = 1 << 30,
134 
135   // Set if using a dev/test image as opposed to an MP-signed image.
136   kTestImageFlag = 1 << 29,
137 
138   // Set if using devserver or Omaha sandbox (using crosh autest).
139   kTestOmahaUrlFlag = 1 << 28,
140 
141   // Mask that indicates bit positions that are used to indicate special flags
142   // that are embedded in the error code to provide additional context about
143   // the system in which the error was encountered.
144   kSpecialFlags =
145       (kDevModeFlag | kResumedFlag | kTestImageFlag | kTestOmahaUrlFlag)
146 };
147 
148 inline std::ostream& operator<<(std::ostream& os, ErrorCode val) {
149   return os << static_cast<int>(val);
150 }
151 
152 }  // namespace chromeos_update_engine
153 
154 #endif  // UPDATE_ENGINE_COMMON_ERROR_CODE_H_
155