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