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