blob: 354d1374f080724d7494598d550885bc9e00ad5c [file] [log] [blame]
Alex Deymo38429cf2015-11-11 18:27:22 -08001//
2// Copyright (C) 2015 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#include "update_engine/metrics_utils.h"
18
19namespace chromeos_update_engine {
20namespace metrics_utils {
21
22metrics::AttemptResult GetAttemptResult(ErrorCode code) {
23 ErrorCode base_code = static_cast<ErrorCode>(
24 static_cast<int>(code) & ~static_cast<int>(ErrorCode::kSpecialFlags));
25
26 switch (base_code) {
27 case ErrorCode::kSuccess:
28 return metrics::AttemptResult::kUpdateSucceeded;
29
30 case ErrorCode::kDownloadTransferError:
31 return metrics::AttemptResult::kPayloadDownloadError;
32
33 case ErrorCode::kDownloadInvalidMetadataSize:
34 case ErrorCode::kDownloadInvalidMetadataMagicString:
35 case ErrorCode::kDownloadMetadataSignatureError:
36 case ErrorCode::kDownloadMetadataSignatureVerificationError:
37 case ErrorCode::kPayloadMismatchedType:
38 case ErrorCode::kUnsupportedMajorPayloadVersion:
39 case ErrorCode::kUnsupportedMinorPayloadVersion:
40 case ErrorCode::kDownloadNewPartitionInfoError:
41 case ErrorCode::kDownloadSignatureMissingInManifest:
42 case ErrorCode::kDownloadManifestParseError:
43 case ErrorCode::kDownloadOperationHashMissingError:
44 return metrics::AttemptResult::kMetadataMalformed;
45
46 case ErrorCode::kDownloadOperationHashMismatch:
47 case ErrorCode::kDownloadOperationHashVerificationError:
48 return metrics::AttemptResult::kOperationMalformed;
49
50 case ErrorCode::kDownloadOperationExecutionError:
51 case ErrorCode::kInstallDeviceOpenError:
52 case ErrorCode::kKernelDeviceOpenError:
53 case ErrorCode::kDownloadWriteError:
54 case ErrorCode::kFilesystemCopierError:
55 case ErrorCode::kFilesystemVerifierError:
56 return metrics::AttemptResult::kOperationExecutionError;
57
58 case ErrorCode::kDownloadMetadataSignatureMismatch:
59 return metrics::AttemptResult::kMetadataVerificationFailed;
60
61 case ErrorCode::kPayloadSizeMismatchError:
62 case ErrorCode::kPayloadHashMismatchError:
63 case ErrorCode::kDownloadPayloadVerificationError:
64 case ErrorCode::kSignedDeltaPayloadExpectedError:
65 case ErrorCode::kDownloadPayloadPubKeyVerificationError:
66 return metrics::AttemptResult::kPayloadVerificationFailed;
67
68 case ErrorCode::kNewRootfsVerificationError:
69 case ErrorCode::kNewKernelVerificationError:
70 return metrics::AttemptResult::kVerificationFailed;
71
72 case ErrorCode::kPostinstallRunnerError:
73 case ErrorCode::kPostinstallBootedFromFirmwareB:
74 case ErrorCode::kPostinstallFirmwareRONotUpdatable:
75 return metrics::AttemptResult::kPostInstallFailed;
76
77 // We should never get these errors in the update-attempt stage so
78 // return internal error if this happens.
79 case ErrorCode::kError:
80 case ErrorCode::kOmahaRequestXMLParseError:
81 case ErrorCode::kOmahaRequestError:
82 case ErrorCode::kOmahaResponseHandlerError:
83 case ErrorCode::kDownloadStateInitializationError:
84 case ErrorCode::kOmahaRequestEmptyResponseError:
85 case ErrorCode::kDownloadInvalidMetadataSignature:
86 case ErrorCode::kOmahaResponseInvalid:
87 case ErrorCode::kOmahaUpdateIgnoredPerPolicy:
88 case ErrorCode::kOmahaUpdateDeferredPerPolicy:
89 case ErrorCode::kOmahaErrorInHTTPResponse:
90 case ErrorCode::kDownloadMetadataSignatureMissingError:
91 case ErrorCode::kOmahaUpdateDeferredForBackoff:
92 case ErrorCode::kPostinstallPowerwashError:
93 case ErrorCode::kUpdateCanceledByChannelChange:
94 case ErrorCode::kOmahaRequestXMLHasEntityDecl:
95 return metrics::AttemptResult::kInternalError;
96
97 // Special flags. These can't happen (we mask them out above) but
98 // the compiler doesn't know that. Just break out so we can warn and
99 // return |kInternalError|.
100 case ErrorCode::kUmaReportedMax:
101 case ErrorCode::kOmahaRequestHTTPResponseBase:
102 case ErrorCode::kDevModeFlag:
103 case ErrorCode::kResumedFlag:
104 case ErrorCode::kTestImageFlag:
105 case ErrorCode::kTestOmahaUrlFlag:
106 case ErrorCode::kSpecialFlags:
107 break;
108 }
109
110 LOG(ERROR) << "Unexpected error code " << base_code;
111 return metrics::AttemptResult::kInternalError;
112}
113
114metrics::DownloadErrorCode GetDownloadErrorCode(ErrorCode code) {
115 ErrorCode base_code = static_cast<ErrorCode>(
116 static_cast<int>(code) & ~static_cast<int>(ErrorCode::kSpecialFlags));
117
118 if (base_code >= ErrorCode::kOmahaRequestHTTPResponseBase) {
119 int http_status =
120 static_cast<int>(base_code) -
121 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase);
122 if (http_status >= 200 && http_status <= 599) {
123 return static_cast<metrics::DownloadErrorCode>(
124 static_cast<int>(metrics::DownloadErrorCode::kHttpStatus200) +
125 http_status - 200);
126 } else if (http_status == 0) {
127 // The code is using HTTP Status 0 for "Unable to get http
128 // response code."
129 return metrics::DownloadErrorCode::kDownloadError;
130 }
131 LOG(WARNING) << "Unexpected HTTP status code " << http_status;
132 return metrics::DownloadErrorCode::kHttpStatusOther;
133 }
134
135 switch (base_code) {
136 // Unfortunately, ErrorCode::kDownloadTransferError is returned for a wide
137 // variety of errors (proxy errors, host not reachable, timeouts etc.).
138 //
139 // For now just map that to kDownloading. See http://crbug.com/355745
140 // for how we plan to add more detail in the future.
141 case ErrorCode::kDownloadTransferError:
142 return metrics::DownloadErrorCode::kDownloadError;
143
144 // All of these error codes are not related to downloading so break
145 // out so we can warn and return InputMalformed.
146 case ErrorCode::kSuccess:
147 case ErrorCode::kError:
148 case ErrorCode::kOmahaRequestError:
149 case ErrorCode::kOmahaResponseHandlerError:
150 case ErrorCode::kFilesystemCopierError:
151 case ErrorCode::kPostinstallRunnerError:
152 case ErrorCode::kPayloadMismatchedType:
153 case ErrorCode::kInstallDeviceOpenError:
154 case ErrorCode::kKernelDeviceOpenError:
155 case ErrorCode::kPayloadHashMismatchError:
156 case ErrorCode::kPayloadSizeMismatchError:
157 case ErrorCode::kDownloadPayloadVerificationError:
158 case ErrorCode::kDownloadNewPartitionInfoError:
159 case ErrorCode::kDownloadWriteError:
160 case ErrorCode::kNewRootfsVerificationError:
161 case ErrorCode::kNewKernelVerificationError:
162 case ErrorCode::kSignedDeltaPayloadExpectedError:
163 case ErrorCode::kDownloadPayloadPubKeyVerificationError:
164 case ErrorCode::kPostinstallBootedFromFirmwareB:
165 case ErrorCode::kDownloadStateInitializationError:
166 case ErrorCode::kDownloadInvalidMetadataMagicString:
167 case ErrorCode::kDownloadSignatureMissingInManifest:
168 case ErrorCode::kDownloadManifestParseError:
169 case ErrorCode::kDownloadMetadataSignatureError:
170 case ErrorCode::kDownloadMetadataSignatureVerificationError:
171 case ErrorCode::kDownloadMetadataSignatureMismatch:
172 case ErrorCode::kDownloadOperationHashVerificationError:
173 case ErrorCode::kDownloadOperationExecutionError:
174 case ErrorCode::kDownloadOperationHashMismatch:
175 case ErrorCode::kOmahaRequestEmptyResponseError:
176 case ErrorCode::kOmahaRequestXMLParseError:
177 case ErrorCode::kDownloadInvalidMetadataSize:
178 case ErrorCode::kDownloadInvalidMetadataSignature:
179 case ErrorCode::kOmahaResponseInvalid:
180 case ErrorCode::kOmahaUpdateIgnoredPerPolicy:
181 case ErrorCode::kOmahaUpdateDeferredPerPolicy:
182 case ErrorCode::kOmahaErrorInHTTPResponse:
183 case ErrorCode::kDownloadOperationHashMissingError:
184 case ErrorCode::kDownloadMetadataSignatureMissingError:
185 case ErrorCode::kOmahaUpdateDeferredForBackoff:
186 case ErrorCode::kPostinstallPowerwashError:
187 case ErrorCode::kUpdateCanceledByChannelChange:
188 case ErrorCode::kPostinstallFirmwareRONotUpdatable:
189 case ErrorCode::kUnsupportedMajorPayloadVersion:
190 case ErrorCode::kUnsupportedMinorPayloadVersion:
191 case ErrorCode::kOmahaRequestXMLHasEntityDecl:
192 case ErrorCode::kFilesystemVerifierError:
193 break;
194
195 // Special flags. These can't happen (we mask them out above) but
196 // the compiler doesn't know that. Just break out so we can warn and
197 // return |kInputMalformed|.
198 case ErrorCode::kUmaReportedMax:
199 case ErrorCode::kOmahaRequestHTTPResponseBase:
200 case ErrorCode::kDevModeFlag:
201 case ErrorCode::kResumedFlag:
202 case ErrorCode::kTestImageFlag:
203 case ErrorCode::kTestOmahaUrlFlag:
204 case ErrorCode::kSpecialFlags:
205 LOG(ERROR) << "Unexpected error code " << base_code;
206 break;
207 }
208
209 return metrics::DownloadErrorCode::kInputMalformed;
210}
211
212metrics::ConnectionType GetConnectionType(NetworkConnectionType type,
213 NetworkTethering tethering) {
214 switch (type) {
215 case NetworkConnectionType::kUnknown:
216 return metrics::ConnectionType::kUnknown;
217
218 case NetworkConnectionType::kEthernet:
219 if (tethering == NetworkTethering::kConfirmed)
220 return metrics::ConnectionType::kTetheredEthernet;
221 else
222 return metrics::ConnectionType::kEthernet;
223
224 case NetworkConnectionType::kWifi:
225 if (tethering == NetworkTethering::kConfirmed)
226 return metrics::ConnectionType::kTetheredWifi;
227 else
228 return metrics::ConnectionType::kWifi;
229
230 case NetworkConnectionType::kWimax:
231 return metrics::ConnectionType::kWimax;
232
233 case NetworkConnectionType::kBluetooth:
234 return metrics::ConnectionType::kBluetooth;
235
236 case NetworkConnectionType::kCellular:
237 return metrics::ConnectionType::kCellular;
238 }
239
240 LOG(ERROR) << "Unexpected network connection type: type="
241 << static_cast<int>(type)
242 << ", tethering=" << static_cast<int>(tethering);
243
244 return metrics::ConnectionType::kUnknown;
245}
246
247} // namespace metrics_utils
248} // namespace chromeos_update_engine