Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FXAS21002 FXOS8700Q
update_client_hub_error_handler.c
00001 // ---------------------------------------------------------------------------- 00002 // Copyright 2016-2017 ARM Ltd. 00003 // 00004 // SPDX-License-Identifier: Apache-2.0 00005 // 00006 // Licensed under the Apache License, Version 2.0 (the "License"); 00007 // you may not use this file except in compliance with the License. 00008 // You may obtain a copy of the License at 00009 // 00010 // http://www.apache.org/licenses/LICENSE-2.0 00011 // 00012 // Unless required by applicable law or agreed to in writing, software 00013 // distributed under the License is distributed on an "AS IS" BASIS, 00014 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00015 // See the License for the specific language governing permissions and 00016 // limitations under the License. 00017 // ---------------------------------------------------------------------------- 00018 00019 #include <stdio.h> 00020 00021 #include "update_client_hub_error_handler.h" 00022 00023 #include "update-client-control-center/arm_uc_control_center.h" 00024 #include "update-client-common/arm_uc_common.h" 00025 00026 #include <stdio.h> // for snprintf 00027 00028 static void (*arm_uc_error_callback_handler)(int32_t error) = NULL; 00029 00030 void ARM_UC_HUB_AddErrorCallbackInternal(void (*callback)(int32_t error)) 00031 { 00032 arm_uc_error_callback_handler = callback; 00033 } 00034 00035 /** 00036 * @brief Error handler. 00037 * @details Generates error code for the user application and any registered 00038 * monitors. Also responsible for setting the Hub back to a consistent state. 00039 * Supported error codes: All elements of arm_uc_monitor_result_t. 00040 * @param error arm_uc_error_t code. 00041 * @param state Internal Hub state. 00042 */ 00043 void ARM_UC_HUB_ErrorHandler(int32_t error, arm_uc_hub_state_t state) 00044 { 00045 UC_HUB_TRACE("error: %" PRIX32 " %d", (uint32_t) error, state); 00046 00047 #if ARM_UC_HUB_TRACE_ENABLE 00048 uint32_t trace_val = 0; 00049 char *trace_str = ""; 00050 char trace_buf[sizeof("XX:65536")]; 00051 #define TRACE_ARGS(s) do { trace_val = ((uint32_t)error); trace_str = (s); } while(0); 00052 #else 00053 #define TRACE_ARGS(s) 00054 #endif 00055 00056 /* Use common defaults for code size optimisation - avoids duplicate assignments. */ 00057 /* Returns these values for any not otherwise overridden. */ 00058 int32_t error_external = ARM_UC_ERROR; 00059 arm_uc_monitor_result_t error_monitor = ARM_UC_UPDATE_RESULT_UPDATE_NONSPECIFIC_SYSTEM_ERROR; 00060 00061 arm_uc_hub_state_t next_state = ARM_UC_HUB_STATE_WAIT_FOR_ERROR_ACK; 00062 00063 switch (error) { 00064 /* Update Client */ 00065 case ERR_UNSPECIFIED: 00066 TRACE_ARGS("ERR_UNSPECIFIED"); 00067 break; 00068 case ERR_INVALID_PARAMETER: 00069 TRACE_ARGS("ERR_INVALID_PARAMETER"); 00070 break; 00071 case ERR_NULL_PTR: 00072 TRACE_ARGS("ERR_NULL_PTR"); 00073 break; 00074 case ERR_NOT_READY: 00075 TRACE_ARGS("ERR_NOT_READY"); 00076 break; 00077 case ERR_INVALID_STATE: 00078 TRACE_ARGS("ERR_INVALID_STATE"); 00079 break; 00080 case ERR_OUT_OF_MEMORY: 00081 TRACE_ARGS("ERR_OUT_OF_MEMORY"); 00082 error_monitor = ARM_UC_UPDATE_RESULT_WRITER_INSUFFICIENT_MEMORY_SPACE; 00083 break; 00084 /* Certificate Manager */ 00085 case ARM_UC_CM_ERR_NOT_FOUND: 00086 TRACE_ARGS("ARM_UC_CM_ERR_NOT_FOUND"); 00087 error_external = ARM_UC_WARNING_CERTIFICATE_NOT_FOUND; 00088 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_CERTIFICATE_NOT_FOUND; 00089 break; 00090 case ARM_UC_CM_ERR_INVALID_CERT: 00091 case ARM_UC_CM_ERR_BLACKLISTED: 00092 TRACE_ARGS("ARM_UC_CM_ERR_INVALID_CERT/BLACKLISTED"); 00093 error_external = ARM_UC_WARNING_CERTIFICATE_INVALID; 00094 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INVALID_CERTIFICATE; 00095 break; 00096 00097 /* DER Parser */ 00098 case ARM_UC_DP_ERR_UNKNOWN: 00099 case ARM_UC_DP_ERR_NOT_FOUND: 00100 case ARM_UC_DP_ERR_NO_MORE_ELEMENTS: 00101 TRACE_ARGS("ARM_UC_DP_ERR_UNKNOWN/NOT_FOUND/NO_MORE_ELEMENTS"); 00102 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INVALID_MANIFEST_FORMAT; 00103 break; 00104 00105 /* Firmware Manager */ 00106 case FIRM_ERR_WRITE: 00107 TRACE_ARGS("FIRM_ERR_WRITE"); 00108 error_external = ARM_UC_ERROR_WRITE_TO_STORAGE; 00109 error_monitor = ARM_UC_UPDATE_RESULT_WRITER_WRITE_FAILURE; 00110 break; 00111 case FIRM_ERR_INVALID_PARAMETER: 00112 case FIRM_ERR_UNINITIALIZED: 00113 TRACE_ARGS("FIRM_ERR_INVALID_PARAMETER/UNINITIALIZED"); 00114 error_external = ARM_UC_ERROR_WRITE_TO_STORAGE; 00115 error_monitor = ARM_UC_UPDATE_RESULT_WRITER_NONSPECIFIC_ERROR; 00116 break; 00117 case FIRM_ERR_ACTIVATE: 00118 TRACE_ARGS("FIRM_ERR_ACTIVATE"); 00119 error_monitor = ARM_UC_UPDATE_RESULT_WRITER_ACTIVATION_FAILURE; 00120 break; 00121 case FIRM_ERR_INVALID_HASH: 00122 TRACE_ARGS("FIRM_ERR_INVALID_HASH"); 00123 error_external = ARM_UC_ERROR_INVALID_HASH; 00124 error_monitor = ARM_UC_UPDATE_RESULT_WRITER_HASH_ERROR; 00125 break; 00126 case FIRM_ERR_FIRMWARE_TOO_LARGE: 00127 TRACE_ARGS("FIRM_ERR_FIRMWARE_TOO_LARGE"); 00128 error_external = ARM_UC_ERROR_WRITE_TO_STORAGE; 00129 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INSUFFICIENT_STORAGE_SPACE; 00130 break; 00131 00132 /* Manifest Manager */ 00133 case MFST_ERR_NULL_PTR: 00134 TRACE_ARGS("MFST_ERR_NULL_PTR"); 00135 error_external = ARM_UC_WARNING_IDENTITY_NOT_FOUND; 00136 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_NONSPECIFIC_ERROR; 00137 break; 00138 case MFST_ERR_NOT_READY: 00139 TRACE_ARGS("MFST_ERR_NOT_READY"); 00140 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_NONSPECIFIC_ERROR; 00141 break; 00142 // case MFST_ERR_PENDING IS NOT AN ERROR! 00143 case MFST_ERR_SIZE: 00144 TRACE_ARGS("MFST_ERR_SIZE"); 00145 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INVALID_MANIFEST_SIZE; 00146 break; 00147 case MFST_ERR_DER_FORMAT: 00148 case MFST_ERR_FORMAT: 00149 TRACE_ARGS("MFST_ERR_DER_FORMAT/MFST_ERR_FORMAT"); 00150 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INVALID_MANIFEST_FORMAT; 00151 break; 00152 case MFST_ERR_VERSION: 00153 TRACE_ARGS("MFST_ERR_VERSION"); 00154 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_UNSUPPORTED_MANIFEST_VERSION; 00155 break; 00156 case MFST_ERR_ROLLBACK: 00157 TRACE_ARGS("MFST_ERR_ROLLBACK"); 00158 error_external = ARM_UC_WARNING_ROLLBACK_PROTECTION; 00159 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_ROLLBACK_PROTECTION; 00160 break; 00161 case MFST_ERR_CRYPTO_MODE: 00162 TRACE_ARGS("MFST_ERR_CRYPTO_MODE"); 00163 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INVALID_CRYPTO_MODE; 00164 break; 00165 case MFST_ERR_HASH: 00166 TRACE_ARGS("MFST_ERR_HASH"); 00167 error_external = ARM_UC_WARNING_SIGNATURE_INVALID; 00168 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INTEGRITY_CHECK_FAILED; 00169 break; 00170 case MFST_ERR_GUID_VENDOR: 00171 TRACE_ARGS("MFST_ERR_GUID_VENDOR"); 00172 error_external = ARM_UC_WARNING_VENDOR_MISMATCH; 00173 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_WRONG_VENDOR_ID; 00174 break; 00175 case MFST_ERR_GUID_DEVCLASS: 00176 TRACE_ARGS("MFST_ERR_GUID_DEVCLASS"); 00177 error_external = ARM_UC_WARNING_CLASS_MISMATCH; 00178 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_WRONG_CLASS_ID; 00179 break; 00180 case MFST_ERR_GUID_DEVICE: 00181 TRACE_ARGS("MFST_ERR_GUID_DEVICE"); 00182 error_external = ARM_UC_WARNING_DEVICE_MISMATCH; 00183 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_NONSPECIFIC_ERROR; 00184 break; 00185 case MFST_ERR_CERT_INVALID: 00186 TRACE_ARGS("MFST_ERR_CERT_INVALID"); 00187 error_external = ARM_UC_WARNING_CERTIFICATE_INVALID; 00188 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INVALID_CERTIFICATE; 00189 break; 00190 case MFST_ERR_CERT_NOT_FOUND: 00191 case MFST_ERR_CERT_READ: 00192 TRACE_ARGS("MFST_ERR_CERT_NOT_FOUND/READ"); 00193 error_external = ARM_UC_WARNING_CERTIFICATE_NOT_FOUND; 00194 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_CERTIFICATE_NOT_FOUND; 00195 break; 00196 case MFST_ERR_INVALID_SIGNATURE: 00197 TRACE_ARGS("MFST_ERR_INVALID_SIGNATURE"); 00198 error_external = ARM_UC_WARNING_SIGNATURE_INVALID; 00199 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INVALID_SIGNATURE; 00200 break; 00201 case MFST_ERR_INVALID_STATE: 00202 TRACE_ARGS("MFST_ERR_INVALID_STATE"); 00203 break; 00204 case MFST_ERR_BAD_EVENT: 00205 TRACE_ARGS("MFST_ERR_BAD_EVENT"); 00206 break; 00207 case MFST_ERR_EMPTY_FIELD: 00208 TRACE_ARGS("MFST_ERR_EMPTY_FIELD"); 00209 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_MISSING_FIELD; 00210 break; 00211 case MFST_ERR_NO_MANIFEST: 00212 TRACE_ARGS("MFST_ERR_NO_MANIFEST"); 00213 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_DEPENDENT_MANIFEST_NOT_FOUND; 00214 break; 00215 case MFST_ERR_SIGNATURE_ALGORITHM: 00216 case MFST_ERR_UNSUPPORTED_CONDITION: 00217 TRACE_ARGS("MFST_ERR_SIGNATURE_ALGORITHM/UNSUPPORTED_CONDITION"); 00218 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_NONSPECIFIC_ERROR; 00219 break; 00220 case MFST_ERR_CTR_IV_SIZE: 00221 case MFST_ERR_BAD_KEYTABLE: 00222 TRACE_ARGS("MFST_ERR_CTR_IV_SIZE/BAD_KEYTABLE"); 00223 error_external = ARM_UC_WARNING_BAD_KEYTABLE; 00224 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_CORRUPTED_KEYTABLE; 00225 break; 00226 case MFST_ERR_MISSING_KEYTABLE: 00227 TRACE_ARGS("MFST_ERR_MISSING_KEYTABLE"); 00228 error_external = ARM_UC_WARNING_BAD_KEYTABLE; 00229 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_MISSING_ITEM; 00230 break; 00231 00232 /* Source Manager */ 00233 // case SOMA_ERR_UNSPECIFIED IS NOT USED! 00234 case SOMA_ERR_NETWORK_TIMEOUT: 00235 TRACE_ARGS("SOMA_ERR_NETWORK_TIMEOUT"); 00236 error_external = ARM_UC_ERROR_CONNECTION; 00237 error_monitor = ARM_UC_UPDATE_RESULT_FETCHER_NETWORK_TIMEOUT; 00238 break; 00239 case SOMA_ERR_CONNECTION_FAILURE: 00240 TRACE_ARGS("SOMA_ERR_CONNECTION_FAILURE"); 00241 error_external = ARM_UC_ERROR_CONNECTION; 00242 error_monitor = ARM_UC_UPDATE_RESULT_FETCHER_NETWORK_CONNECTION_FAILURE; 00243 break; 00244 case SOMA_ERR_DNS_LOOKUP_FAILURE: 00245 TRACE_ARGS("SOMA_ERR_DNS_LOOKUP_FAILURE"); 00246 error_external = ARM_UC_ERROR_CONNECTION; 00247 error_monitor = ARM_UC_UPDATE_RESULT_FETCHER_DNS_LOOKUP_FAILURE; 00248 break; 00249 case SOMA_ERR_CONNECTION_LOSS: 00250 TRACE_ARGS("SOMA_ERR_CONNECTION_LOSS"); 00251 error_external = ARM_UC_ERROR_CONNECTION; 00252 error_monitor = ARM_UC_UPDATE_RESULT_FETCHER_NETWORK_CONNECTION_LOSS; 00253 break; 00254 case SOMA_ERR_NO_ROUTE_TO_SOURCE: 00255 TRACE_ARGS("SOMA_ERR_NO_ROUTE_TO_SOURCE"); 00256 error_external = ARM_UC_ERROR_CONNECTION; 00257 error_monitor = ARM_UC_UPDATE_RESULT_FETCHER_NO_ROUTE_AVAILABLE; 00258 break; 00259 case SOMA_ERR_SOURCE_REGISTRY_FULL: 00260 case SOMA_ERR_SOURCE_NOT_FOUND: 00261 TRACE_ARGS("SOMA_ERR_SOURCE_REGISTRY_FULL/SOURCE_NOT_FOUND"); 00262 error_external = ARM_UC_ERROR_CONNECTION; 00263 error_monitor = ARM_UC_UPDATE_RESULT_UPDATE_NONSPECIFIC_NETWORK_ERROR; 00264 break; 00265 case SOMA_ERR_INVALID_URI: 00266 TRACE_ARGS("SOMA_ERR_INVALID_URI"); 00267 error_external = ARM_UC_WARNING_URI_NOT_FOUND; 00268 error_monitor = ARM_UC_UPDATE_RESULT_FETCHER_INVALID_RESOURCE_URI; 00269 break; 00270 case SOMA_ERR_INVALID_REQUEST: 00271 TRACE_ARGS("SOMA_ERR_INVALID_REQUEST"); 00272 error_external = ARM_UC_WARNING_URI_NOT_FOUND; 00273 error_monitor = ARM_UC_UPDATE_RESULT_FETCHER_INVALID_REQUEST_TYPE; 00274 break; 00275 case SOMA_ERR_INVALID_PARAMETER: 00276 TRACE_ARGS("SOMA_ERR_INVALID_PARAMETER"); 00277 error_external = ARM_UC_WARNING_URI_NOT_FOUND; 00278 break; 00279 case SOMA_ERR_INVALID_MANIFEST_STATE: 00280 TRACE_ARGS("SOMA_ERR_INVALID_MANIFEST_STATE"); 00281 error_external = ARM_UC_WARNING_UNKNOWN; 00282 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_NONSPECIFIC_ERROR; 00283 break; 00284 case SOMA_ERR_INVALID_FW_STATE: 00285 TRACE_ARGS("SOMA_ERR_INVALID_FW_STATE"); 00286 error_external = ARM_UC_WARNING_UNKNOWN; 00287 break; 00288 case SOMA_ERR_INVALID_EVENT: 00289 TRACE_ARGS("SOMA_ERR_INVALID_EVENT"); 00290 error_external = ARM_UC_WARNING_UNKNOWN; 00291 break; 00292 00293 /* Source */ 00294 case SRCE_ERR_UNINITIALIZED: 00295 case SRCE_ERR_INVALID_PARAMETER: 00296 case SRCE_ERR_FAILED: 00297 case SRCE_ERR_ABORT: 00298 TRACE_ARGS("SRCE_ERR_UNINITIALIZED/INVALID_PARAMETER/FAILED/ABORT"); 00299 error_monitor = ARM_UC_UPDATE_RESULT_UPDATE_NONSPECIFIC_SYSTEM_ERROR; 00300 break; 00301 case SRCE_ERR_BUSY: 00302 /* Unexpected, normally used for flow control, not as error. */ 00303 TRACE_ARGS("SRCE_ERR_BUSY"); 00304 error_monitor = ARM_UC_UPDATE_RESULT_UPDATE_NONSPECIFIC_SYSTEM_ERROR; 00305 break; 00306 00307 /* Crypto */ 00308 case ARM_UC_CU_ERR_INVALID_PARAMETER: 00309 TRACE_ARGS("ARM_UC_CU_ERR_INVALID_PARAMETER"); 00310 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INVALID_CRYPTO_MODE; 00311 break; 00312 00313 /* Device Identity */ 00314 case ARM_UC_DI_ERR_INVALID_PARAMETER: 00315 TRACE_ARGS("ARM_UC_DI_ERR_INVALID_PARAMETER"); 00316 error_monitor = ARM_UC_UPDATE_RESULT_UPDATE_NONSPECIFIC_SYSTEM_ERROR; 00317 break; 00318 case ARM_UC_DI_ERR_NOT_READY: 00319 case ARM_UC_DI_ERR_NOT_FOUND: 00320 TRACE_ARGS("ARM_UC_DI_ERR_NOT_READY/NOT_FOUND"); 00321 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_MISSING_ITEM; 00322 break; 00323 case ARM_UC_DI_ERR_SIZE: 00324 TRACE_ARGS("ARM_UC_DI_ERR_SIZE"); 00325 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_INSUFFICIENT_MEMORY_SPACE; 00326 break; 00327 00328 /* Hub */ 00329 case HUB_ERR_INTERNAL_ERROR: 00330 TRACE_ARGS("HUB_ERR_INTERNAL_ERROR"); 00331 error_external = ARM_UC_FATAL; 00332 break; 00333 case HUB_ERR_ROLLBACK_PROTECTION: 00334 TRACE_ARGS("HUB_ERR_ROLLBACK_PROTECTION"); 00335 error_external = ARM_UC_WARNING_ROLLBACK_PROTECTION; 00336 error_monitor = ARM_UC_UPDATE_RESULT_MANIFEST_ROLLBACK_PROTECTION; 00337 break; 00338 case ARM_UC_HUB_ERR_NOT_AVAILABLE: 00339 TRACE_ARGS("ARM_UC_HUB_ERR_NOT_AVAILABLE"); 00340 error_external = ARM_UC_ERROR_CONNECTION; 00341 break; 00342 /* LWM2M source */ 00343 case HUB_ERR_CONNECTION: 00344 TRACE_ARGS("HUB_ERR_CONNECTION"); 00345 error_external = ARM_UC_ERROR_CONNECTION; 00346 error_monitor = ARM_UC_UPDATE_RESULT_FETCHER_NETWORK_CONNECTION_FAILURE; 00347 /* Prevent a possible infinite loop: when HUB_ERR_CONNECTION is received, 00348 the next state was always set to ARM_UC_HUB_STATE_UNKNOWN. However, 00349 this function also sends a report which might fail, which will trigger 00350 the HUB_ERR_CONNECTION event and will repeat the whole process again, 00351 potentially in an infinite loop in case of network issues. So switch 00352 the state to "idle" directly to prevent this.*/ 00353 next_state = ARM_UC_HUB_STATE_IDLE; 00354 break; 00355 00356 default: 00357 UC_HUB_ERR_MSG("Unexpected error!"); 00358 #if ARM_UC_HUB_TRACE_ENABLE 00359 { 00360 arm_uc_error_t err; 00361 err.code = (uint32_t)error; 00362 snprintf(trace_buf, sizeof(trace_buf), "%c%c.%hu", 00363 err.modulecc[0], err.modulecc[1], err.error); 00364 } 00365 #endif 00366 TRACE_ARGS(trace_buf); 00367 error_external = ARM_UC_WARNING_UNKNOWN; 00368 break; 00369 } 00370 UC_HUB_TRACE("%s: %" PRIX32, trace_str, (uint32_t) trace_val); 00371 00372 /* send error code to monitor */ 00373 ARM_UC_ControlCenter_ReportUpdateResult(error_monitor); 00374 00375 /* progress state in hub */ 00376 ARM_UC_HUB_setState(next_state); 00377 00378 /* Send the external code to the user application. */ 00379 if (arm_uc_error_callback_handler) { 00380 arm_uc_error_callback_handler(error_external); 00381 } 00382 }
Generated on Tue Jul 12 2022 20:21:04 by
