Mayank Gupta / Mbed OS pelion-example-frdm

Dependencies:   FXAS21002 FXOS8700Q

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers update_client_hub_error_handler.c Source File

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 }