blob: 5a699b39248e04ce1726d923f548d1e101c2d253 [file] [log] [blame]
/*
*
* Copyright (c) 2013-2017 Nest Labs, Inc.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file
* This file implements functions to translate error codes used
* throughout the Weave package into human-readable strings.
*
*/
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <inttypes.h>
#include <stdio.h>
#include <SystemLayer/SystemError.h>
#if CONFIG_NETWORK_LAYER_BLE
#include <BleLayer/BleError.h>
#endif // CONFIG_NETWORK_LAYER_BLE
#include <InetLayer/InetError.h>
#include <Weave/Core/WeaveCore.h>
#include <Weave/Support/CodeUtils.h>
#include "ASN1Error.h"
namespace nl {
#if WEAVE_CONFIG_SHORT_ERROR_STR
/**
* @def ERROR_STR_SIZE
*
* @brief
* This defines the size of the buffer to store the formatted error string.
*
* Static buffer to store the short version of error string, which includes
* subsystem name and 32-bit error code in hex
*
* At max 22 bytes would be needed according to this calculation/formating:
* - 10 characters for subsystem name,
* - ':',
* - "0x", 8 characters for error code in hex,
* - '\0'
*
* An example would be "Weave:0xDEAFBEEF"
* - The output string would be truncated if the subsystem name is longer
* than 10
*/
#define ERROR_STR_SIZE (10 + 3 + 8 + 1)
/**
* @def _SubsystemFormatError(name, err, desc)
*
* @brief
* This defines a function that formats the specified error and string
* describing the subsystem into a platform- or system-specific manner.
*
*/
#define _SubsystemFormatError(name, err, desc) SubsystemFormatError(name, err)
#else // #if WEAVE_CONFIG_SHORT_ERROR_STR
/**
* @def ERROR_STR_SIZE
*
* @brief
* This defines the size of the buffer to store the formatted error string.
*
* Note that the size is arbitrary and probably doesn't have to be this big.
* On platforms where 1kB RAM matters, it is probably better to choose the
* short version, or don't call ErrorStr at all.
*
*/
#define ERROR_STR_SIZE (1000)
/**
* @def _SubsystemFormatError(name, err, desc)
*
* @brief
* This defines a function that formats the specified error and string
* describing the subsystem into a platform- or system-specific manner.
*
*/
#define _SubsystemFormatError(name, err, desc) SubsystemFormatError(name, err, desc)
#endif // #if WEAVE_CONFIG_SHORT_ERROR_STR
/**
* @var static char sErrorStr[ERROR_STR_SIZE]
*
* @brief
* Static buffer to store the formated error string
*
*/
static char sErrorStr[ERROR_STR_SIZE];
/**
* This routine formats the specified error into a human-readable
* NULL-terminated C string describing the provided error.
*
* @param[in] err The error for formatting and description.
*
* @return A pointer to a NULL-terminated C string describing the
* provided error.
*/
static const char *FormatError(int32_t err)
{
#if WEAVE_CONFIG_SHORT_ERROR_STR
(void)snprintf(sErrorStr, sizeof(sErrorStr), "Error 0x%" PRIx32, err);
#else
(void)snprintf(sErrorStr, sizeof(sErrorStr), "Error %" PRId32, err);
#endif
return sErrorStr;
}
/**
* This routine formats the specified error and string describing the
* subsystem into the provided format string and returns a human-readable
* NULL-terminated C string describing the provided error.
*
* @param[in] subsystem A pointer to a NULL-terminated C string representing
* the package subsystem to which the error corresponds.
* @param[in] err The error for formatting and description.
*
* @return A pointer to a NULL-terminated C string describing the
* provided error.
*/
static const char *SubsystemFormatError(const char *subsystem, int32_t err)
{
// note that snprintf shall zero-terminate the string as long as sizeof(sErrorStr) > 0
// note that the return value of snprintf is ignored for an error is very unlikely to happen and we do not care about truncation
#if WEAVE_CONFIG_SHORT_ERROR_STR
(void)snprintf(sErrorStr, sizeof(sErrorStr), "%s:0x%" PRIx32, subsystem, err);
#else
(void)snprintf(sErrorStr, sizeof(sErrorStr), "%s Error %" PRId32, subsystem, err);
#endif
return sErrorStr;
}
#if !(WEAVE_CONFIG_SHORT_ERROR_STR)
/**
* This routine formats the specified error and string describing the
* subsystem into the provided format string and returns a human-readable
* NULL-terminated C string describing the provided error.
*
* @param[in] subsystem A pointer to a NULL-terminated C string representing
* the package subsystem to which the error corresponds.
* @param[in] err The error for formatting and description.
* @param[in] description A pointer to a NULL-terminated C string describing
* the error. Ignored when WEAVE_CONFIG_SHORT_ERROR_STR is defined
*
* @return A pointer to a NULL-terminated C string describing the
* provided error.
*/
static const char *SubsystemFormatError(const char *subsystem, int32_t err, const char *description)
{
(void)snprintf(sErrorStr, sizeof(sErrorStr), "%s Error %" PRId32 ": %s", subsystem, err, description);
return sErrorStr;
}
/**
* This routine formats the specified error and string describing the
* System layer into the provided format string and returns a human-readable
* NULL-terminated C string describing the provided error.
*
* @param[in] err The error for formatting and description.
* @param[in] description A pointer to a NULL-terminated C string describing
* the error. Ignored when WEAVE_CONFIG_SHORT_ERROR_STR is defined
*
* @return A pointer to a NULL-terminated C string describing the
* provided error.
*/
static const char *SystemLayerFormatError(int32_t err, const char *description)
{
return SubsystemFormatError("Sys", err, description);
}
/**
* This routine formats the specified error and string describing the
* Inet layer into the provided format string and returns a human-readable
* NULL-terminated C string describing the provided error.
*
* @param[in] err The error for formatting and description.
* @param[in] description A pointer to a NULL-terminated C string describing
* the error. Ignored when WEAVE_CONFIG_SHORT_ERROR_STR is defined
*
* @return A pointer to a NULL-terminated C string describing the
* provided error.
*/
static const char *InetFormatError(int32_t err, const char *description)
{
return SubsystemFormatError("Inet", err, description);
}
#if CONFIG_NETWORK_LAYER_BLE
/**
* This routine formats the specified error and string describing the
* BLE layer into the provided format string and returns a human-readable
* NULL-terminated C string describing the provided error.
*
* @param[in] err The error for formatting and description.
* @param[in] description A pointer to a NULL-terminated C string describing
* the error. Ignored when WEAVE_CONFIG_SHORT_ERROR_STR is defined
*
* @return A pointer to a NULL-terminated C string describing the
* provided error.
*/
static const char *BleFormatError(int32_t err, const char *description)
{
return SubsystemFormatError("Ble", err, description);
}
#endif // CONFIG_NETWORK_LAYER_BLE
/**
* This routine formats the specified error and string describing Weave
* into the provided format string and returns a human-readable NULL-terminated
* C string describing the provided error.
*
* @param[in] err The error for formatting and description.
* @param[in] description A pointer to a NULL-terminated C string describing
* the error. Ignored when WEAVE_CONFIG_SHORT_ERROR_STR is defined
*
* @return A pointer to a NULL-terminated C string describing the
* provided error.
*/
static const char *WeaveFormatError(int32_t err, const char *description)
{
return SubsystemFormatError("Weave", err, description);
}
/**
* This routine formats the specified error and string describing ASN1
* into the provided format string and returns a human-readable NULL-terminated
* C string describing the provided error.
*
* @param[in] err The error for formatting and description.
* @param[in] description A pointer to a NULL-terminated C string describing
* the error. Ignored when WEAVE_CONFIG_SHORT_ERROR_STR is defined
*
* @return A pointer to a NULL-terminated C string describing the
* provided error.
*/
static const char *ASN1FormatError(int32_t err, const char *description)
{
return SubsystemFormatError("ASN1", err, description);
}
#endif // #if !(WEAVE_CONFIG_SHORT_ERROR_STR)
/**
* This routine returns a human-readable NULL-terminated C string
* describing the provided error.
*
* @param[in] err The error for format and describe.
*
* @return A pointer to a NULL-terminated C string describing the
* provided error.
*/
NL_DLL_EXPORT const char *ErrorStr(int32_t err)
{
switch (err)
{
case 0 : return "No Error";
#if !WEAVE_CONFIG_SHORT_ERROR_STR
// ----- SystemLayer Errors ----
case WEAVE_SYSTEM_ERROR_NOT_IMPLEMENTED : return SystemLayerFormatError(err, "Not implemented");
case WEAVE_SYSTEM_ERROR_NOT_SUPPORTED : return SystemLayerFormatError(err, "Not supported");
case WEAVE_SYSTEM_ERROR_BAD_ARGS : return SystemLayerFormatError(err, "Bad arguments");
case WEAVE_SYSTEM_ERROR_UNEXPECTED_STATE : return SystemLayerFormatError(err, "Unexpected state");
case WEAVE_SYSTEM_ERROR_UNEXPECTED_EVENT : return SystemLayerFormatError(err, "Unexpected event");
case WEAVE_SYSTEM_ERROR_NO_MEMORY : return SystemLayerFormatError(err, "No memory");
// ----- InetLayer Errors -----
case INET_ERROR_WRONG_ADDRESS_TYPE : return InetFormatError(err, "Wrong address type");
case INET_ERROR_CONNECTION_ABORTED : return InetFormatError(err, "TCP connection aborted");
case INET_ERROR_PEER_DISCONNECTED : return InetFormatError(err, "Peer disconnected");
case INET_ERROR_INCORRECT_STATE : return InetFormatError(err, "Incorrect state");
case INET_ERROR_MESSAGE_TOO_LONG : return InetFormatError(err, "Message too long");
case INET_ERROR_NO_CONNECTION_HANDLER : return InetFormatError(err, "No TCP connection handler");
case INET_ERROR_NO_MEMORY : return InetFormatError(err, "No memory");
case INET_ERROR_OUTBOUND_MESSAGE_TRUNCATED : return InetFormatError(err, "Outbound message truncated");
case INET_ERROR_INBOUND_MESSAGE_TOO_BIG : return InetFormatError(err, "Inbound message too big");
case INET_ERROR_HOST_NOT_FOUND : return InetFormatError(err, "Host not found");
case INET_ERROR_DNS_TRY_AGAIN : return InetFormatError(err, "DNS try again");
case INET_ERROR_DNS_NO_RECOVERY : return InetFormatError(err, "DNS no recovery");
case INET_ERROR_BAD_ARGS : return InetFormatError(err, "Bad arguments");
case INET_ERROR_WRONG_PROTOCOL_TYPE : return InetFormatError(err, "Wrong protocol type");
case INET_ERROR_UNKNOWN_INTERFACE : return InetFormatError(err, "Unknown interface");
case INET_ERROR_NOT_IMPLEMENTED : return InetFormatError(err, "Not implemented");
case INET_ERROR_ADDRESS_NOT_FOUND : return InetFormatError(err, "Address not found");
case INET_ERROR_HOST_NAME_TOO_LONG : return InetFormatError(err, "Host name too long");
case INET_ERROR_INVALID_HOST_NAME : return InetFormatError(err, "Invalid host name");
case INET_ERROR_NOT_SUPPORTED : return InetFormatError(err, "Not supported");
case INET_ERROR_NO_ENDPOINTS : return InetFormatError(err, "No more TCP endpoints");
case INET_ERROR_IDLE_TIMEOUT : return InetFormatError(err, "Idle timeout");
case INET_ERROR_UNEXPECTED_EVENT : return InetFormatError(err, "Unexpected event");
case INET_ERROR_INVALID_IPV6_PKT : return InetFormatError(err, "Invalid IPv6 Packet");
case INET_ERROR_INTERFACE_INIT_FAILURE : return InetFormatError(err, "Failure to initialize interface");
case INET_ERROR_TCP_USER_TIMEOUT : return InetFormatError(err, "TCP User Timeout");
case INET_ERROR_TCP_CONNECT_TIMEOUT : return InetFormatError(err, "TCP Connect Timeout");
#if CONFIG_NETWORK_LAYER_BLE
// ----- BleLayer Errors -----
case BLE_ERROR_BAD_ARGS : return BleFormatError(err, "Bad arguments");
case BLE_ERROR_INCORRECT_STATE : return BleFormatError(err, "Incorrect state");
case BLE_ERROR_NO_ENDPOINTS : return BleFormatError(err, "No more BLE endpoints");
case BLE_ERROR_NO_CONNECTION_RECEIVED_CALLBACK : return BleFormatError(err, "No Weave over BLE connection received callback set");
case BLE_ERROR_CENTRAL_UNSUBSCRIBED : return BleFormatError(err, "BLE central unsubscribed");
case BLE_ERROR_GATT_SUBSCRIBE_FAILED : return BleFormatError(err, "GATT subscribe operation failed");
case BLE_ERROR_GATT_UNSUBSCRIBE_FAILED : return BleFormatError(err, "GATT unsubscribe operation failed");
case BLE_ERROR_GATT_WRITE_FAILED : return BleFormatError(err, "GATT write characteristic operation failed");
case BLE_ERROR_GATT_INDICATE_FAILED : return BleFormatError(err, "GATT indicate characteristic operation failed");
case BLE_ERROR_NOT_IMPLEMENTED : return BleFormatError(err, "Not implemented");
case BLE_ERROR_INVALID_ROLE : return BleFormatError(err, "Invalid BLE device role specified");
case BLE_ERROR_WOBLE_PROTOCOL_ABORT : return BleFormatError(err, "BLE transport protocol fired abort");
case BLE_ERROR_REMOTE_DEVICE_DISCONNECTED : return BleFormatError(err, "Remote device closed BLE connection");
case BLE_ERROR_APP_CLOSED_CONNECTION : return BleFormatError(err, "Application closed BLE connection");
case BLE_ERROR_OUTBOUND_MESSAGE_TOO_BIG : return BleFormatError(err, "Outbound message too big");
case BLE_ERROR_NOT_WEAVE_DEVICE : return BleFormatError(err, "BLE device doesn't seem to support Weave");
case BLE_ERROR_INCOMPATIBLE_PROTOCOL_VERSIONS : return BleFormatError(err, "Incompatible BLE transport protocol versions");
case BLE_ERROR_NO_MEMORY : return BleFormatError(err, "No memory");
case BLE_ERROR_MESSAGE_INCOMPLETE : return BleFormatError(err, "Message incomplete");
case BLE_ERROR_INVALID_FRAGMENT_SIZE : return BleFormatError(err, "Invalid fragment size");
case BLE_ERROR_START_TIMER_FAILED : return BleFormatError(err, "Start timer failed");
case BLE_ERROR_CONNECT_TIMED_OUT : return BleFormatError(err, "Connect handshake timed out");
case BLE_ERROR_RECEIVE_TIMED_OUT : return BleFormatError(err, "Receive handshake timed out");
case BLE_ERROR_INVALID_MESSAGE : return BleFormatError(err, "Invalid message");
case BLE_ERROR_FRAGMENT_ACK_TIMED_OUT : return BleFormatError(err, "Message fragment acknowledgement timed out");
case BLE_ERROR_KEEP_ALIVE_TIMED_OUT : return BleFormatError(err, "Keep-alive receipt timed out");
case BLE_ERRROR_NO_CONNECT_COMPLETE_CALLBACK : return BleFormatError(err, "Missing required callback");
case BLE_ERROR_INVALID_ACK : return BleFormatError(err, "Received invalid BLE transport protocol fragment acknowledgement");
case BLE_ERROR_REASSEMBLER_MISSING_DATA : return BleFormatError(err, "BLE message reassembler did not receive enough data");
case BLE_ERROR_INVALID_BTP_HEADER_FLAGS : return BleFormatError(err, "Received invalid BLE transport protocol header flags");
case BLE_ERROR_INVALID_BTP_SEQUENCE_NUMBER : return BleFormatError(err, "Received invalid BLE transport protocol sequence number");
case BLE_ERROR_REASSEMBLER_INCORRECT_STATE : return BleFormatError(err, "BLE message reassembler received packet in incorrect state");
case BLE_ERROR_RECEIVED_MESSAGE_TOO_BIG : return BleFormatError(err, "Message received by BLE message reassembler was too large");
#endif // CONFIG_NETWORK_LAYER_BLE
// ----- Weave Errors -----
case WEAVE_ERROR_TOO_MANY_CONNECTIONS : return WeaveFormatError(err, "Too many connections");
case WEAVE_ERROR_SENDING_BLOCKED : return WeaveFormatError(err, "Sending blocked");
case WEAVE_ERROR_CONNECTION_ABORTED : return WeaveFormatError(err, "Connection aborted");
case WEAVE_ERROR_INCORRECT_STATE : return WeaveFormatError(err, "Incorrect state");
case WEAVE_ERROR_MESSAGE_TOO_LONG : return WeaveFormatError(err, "Message too long");
case WEAVE_ERROR_UNSUPPORTED_EXCHANGE_VERSION : return WeaveFormatError(err, "Unsupported exchange version");
case WEAVE_ERROR_TOO_MANY_UNSOLICITED_MESSAGE_HANDLERS : return WeaveFormatError(err, "Too many unsolicited message handlers");
case WEAVE_ERROR_NO_UNSOLICITED_MESSAGE_HANDLER : return WeaveFormatError(err, "No unsolicited message handler");
case WEAVE_ERROR_NO_CONNECTION_HANDLER : return WeaveFormatError(err, "No connection handler");
case WEAVE_ERROR_TOO_MANY_PEER_NODES : return WeaveFormatError(err, "Too many peer nodes");
case WEAVE_ERROR_NO_MEMORY : return WeaveFormatError(err, "No memory");
case WEAVE_ERROR_NO_MESSAGE_HANDLER : return WeaveFormatError(err, "No message handler");
case WEAVE_ERROR_MESSAGE_INCOMPLETE : return WeaveFormatError(err, "Message incomplete");
case WEAVE_ERROR_DATA_NOT_ALIGNED : return WeaveFormatError(err, "Data not aligned");
case WEAVE_ERROR_UNKNOWN_KEY_TYPE : return WeaveFormatError(err, "Unknown key type");
case WEAVE_ERROR_KEY_NOT_FOUND : return WeaveFormatError(err, "Key not found");
case WEAVE_ERROR_WRONG_ENCRYPTION_TYPE : return WeaveFormatError(err, "Wrong encryption type");
case WEAVE_ERROR_TOO_MANY_KEYS : return WeaveFormatError(err, "Too many keys");
case WEAVE_ERROR_INTEGRITY_CHECK_FAILED : return WeaveFormatError(err, "Integrity check failed");
case WEAVE_ERROR_INVALID_SIGNATURE : return WeaveFormatError(err, "Invalid signature");
case WEAVE_ERROR_UNSUPPORTED_MESSAGE_VERSION : return WeaveFormatError(err, "Unsupported message version");
case WEAVE_ERROR_UNSUPPORTED_ENCRYPTION_TYPE : return WeaveFormatError(err, "Unsupported encryption type");
case WEAVE_ERROR_UNSUPPORTED_SIGNATURE_TYPE : return WeaveFormatError(err, "Unsupported signature type");
case WEAVE_ERROR_INVALID_MESSAGE_LENGTH : return WeaveFormatError(err, "Invalid message length");
case WEAVE_ERROR_BUFFER_TOO_SMALL : return WeaveFormatError(err, "Buffer too small");
case WEAVE_ERROR_DUPLICATE_KEY_ID : return WeaveFormatError(err, "Duplicate key id");
case WEAVE_ERROR_WRONG_KEY_TYPE : return WeaveFormatError(err, "Wrong key type");
case WEAVE_ERROR_WELL_UNINITIALIZED : return WeaveFormatError(err, "Well uninitialized");
case WEAVE_ERROR_WELL_EMPTY : return WeaveFormatError(err, "Well empty");
case WEAVE_ERROR_INVALID_STRING_LENGTH : return WeaveFormatError(err, "Invalid string length");
case WEAVE_ERROR_INVALID_LIST_LENGTH : return WeaveFormatError(err, "invalid list length");
case WEAVE_ERROR_INVALID_INTEGRITY_TYPE : return WeaveFormatError(err, "Invalid integrity type");
case WEAVE_END_OF_TLV : return WeaveFormatError(err, "End of TLV");
case WEAVE_ERROR_TLV_UNDERRUN : return WeaveFormatError(err, "TLV underrun");
case WEAVE_ERROR_INVALID_TLV_ELEMENT : return WeaveFormatError(err, "Invalid TLV element");
case WEAVE_ERROR_INVALID_TLV_TAG : return WeaveFormatError(err, "Invalid TLV tag");
case WEAVE_ERROR_UNKNOWN_IMPLICIT_TLV_TAG : return WeaveFormatError(err, "Unknown implicit TLV tag");
case WEAVE_ERROR_WRONG_TLV_TYPE : return WeaveFormatError(err, "Wrong TLV type");
case WEAVE_ERROR_TLV_CONTAINER_OPEN : return WeaveFormatError(err, "TLV container open");
case WEAVE_ERROR_INVALID_TRANSFER_MODE : return WeaveFormatError(err, "Invalid transfer mode");
case WEAVE_ERROR_INVALID_PROFILE_ID : return WeaveFormatError(err, "Invalid profile id");
case WEAVE_ERROR_INVALID_MESSAGE_TYPE : return WeaveFormatError(err, "Invalid message type");
case WEAVE_ERROR_UNEXPECTED_TLV_ELEMENT : return WeaveFormatError(err, "Unexpected TLV element");
case WEAVE_ERROR_STATUS_REPORT_RECEIVED : return WeaveFormatError(err, "Status Report received from peer");
case WEAVE_ERROR_NOT_IMPLEMENTED : return WeaveFormatError(err, "Not Implemented");
case WEAVE_ERROR_INVALID_ADDRESS : return WeaveFormatError(err, "Invalid address");
case WEAVE_ERROR_INVALID_ARGUMENT : return WeaveFormatError(err, "Invalid argument");
case WEAVE_ERROR_TLV_TAG_NOT_FOUND : return WeaveFormatError(err, "TLV tag not found");
case WEAVE_ERROR_INVALID_PATH_LIST : return WeaveFormatError(err, "Invalid TLV path list");
case WEAVE_ERROR_INVALID_DATA_LIST : return WeaveFormatError(err, "Invalid TLV data list");
case WEAVE_ERROR_TRANSACTION_CANCELED : return WeaveFormatError(err, "Transaction canceled");
case WEAVE_ERROR_LISTENER_ALREADY_STARTED : return WeaveFormatError(err, "Listener already started");
case WEAVE_ERROR_LISTENER_ALREADY_STOPPED : return WeaveFormatError(err, "Listener already stopped");
case WEAVE_ERROR_UNKNOWN_TOPIC : return WeaveFormatError(err, "Unknown Topic");
case WEAVE_ERROR_TIMEOUT : return WeaveFormatError(err, "Timeout");
case WEAVE_ERROR_INVALID_DEVICE_DESCRIPTOR : return WeaveFormatError(err, "Invalid device descriptor");
case WEAVE_ERROR_UNSUPPORTED_DEVICE_DESCRIPTOR_VERSION : return WeaveFormatError(err, "Unsupported device descriptor version");
case WEAVE_END_OF_INPUT : return WeaveFormatError(err, "End of input");
case WEAVE_ERROR_RATE_LIMIT_EXCEEDED : return WeaveFormatError(err, "Rate limit exceeded");
case WEAVE_ERROR_SECURITY_MANAGER_BUSY : return WeaveFormatError(err, "Security manager busy");
case WEAVE_ERROR_INVALID_PASE_PARAMETER : return WeaveFormatError(err, "Invalid PASE parameter");
case WEAVE_ERROR_PASE_SUPPORTS_ONLY_CONFIG1 : return WeaveFormatError(err, "PASE supports only Config1");
case WEAVE_ERROR_NO_COMMON_PASE_CONFIGURATIONS : return WeaveFormatError(err, "No supported PASE configurations in common");
case WEAVE_ERROR_INVALID_PASE_CONFIGURATION : return WeaveFormatError(err, "Invalid PASE configuration");
case WEAVE_ERROR_KEY_CONFIRMATION_FAILED : return WeaveFormatError(err, "Key confirmation failed");
case WEAVE_ERROR_INVALID_USE_OF_SESSION_KEY : return WeaveFormatError(err, "Invalid use of session key");
case WEAVE_ERROR_CONNECTION_CLOSED_UNEXPECTEDLY : return WeaveFormatError(err, "Connection closed unexpectedly");
case WEAVE_ERROR_MISSING_TLV_ELEMENT : return WeaveFormatError(err, "Missing TLV element");
case WEAVE_ERROR_RANDOM_DATA_UNAVAILABLE : return WeaveFormatError(err, "Random data unavailable");
case WEAVE_ERROR_UNSUPPORTED_HOST_PORT_ELEMENT : return WeaveFormatError(err, "Unsupported type in host/port list");
case WEAVE_ERROR_INVALID_HOST_SUFFIX_INDEX : return WeaveFormatError(err, "Invalid suffix index in host/port list");
case WEAVE_ERROR_HOST_PORT_LIST_EMPTY : return WeaveFormatError(err, "Host/port empty");
case WEAVE_ERROR_UNSUPPORTED_AUTH_MODE : return WeaveFormatError(err, "Unsupported authentication mode");
case WEAVE_ERROR_INVALID_SERVICE_EP : return WeaveFormatError(err, "Invalid service endpoint");
case WEAVE_ERROR_INVALID_DIRECTORY_ENTRY_TYPE : return WeaveFormatError(err, "Invalid directory entry type");
case WEAVE_ERROR_FORCED_RESET : return WeaveFormatError(err, "Service manager forced reset");
case WEAVE_ERROR_NO_ENDPOINT : return WeaveFormatError(err, "No endpoint was available to send the message");
case WEAVE_ERROR_INVALID_DESTINATION_NODE_ID : return WeaveFormatError(err, "Invalid destination node id");
case WEAVE_ERROR_NOT_CONNECTED : return WeaveFormatError(err, "Not connected");
case WEAVE_ERROR_NO_SW_UPDATE_AVAILABLE : return WeaveFormatError(err, "No SW update available");
case WEAVE_ERROR_CA_CERT_NOT_FOUND : return WeaveFormatError(err, "CA certificate not found");
case WEAVE_ERROR_CERT_PATH_LEN_CONSTRAINT_EXCEEDED : return WeaveFormatError(err, "Certificate path length constraint exceeded");
case WEAVE_ERROR_CERT_PATH_TOO_LONG : return WeaveFormatError(err, "Certificate path too long");
case WEAVE_ERROR_CERT_USAGE_NOT_ALLOWED : return WeaveFormatError(err, "Requested certificate usage is not allowed");
case WEAVE_ERROR_CERT_EXPIRED : return WeaveFormatError(err, "Certificate expired");
case WEAVE_ERROR_CERT_NOT_VALID_YET : return WeaveFormatError(err, "Certificate not yet valid");
case WEAVE_ERROR_UNSUPPORTED_CERT_FORMAT : return WeaveFormatError(err, "Unsupported certificate format");
case WEAVE_ERROR_UNSUPPORTED_ELLIPTIC_CURVE : return WeaveFormatError(err, "Unsupported elliptic curve");
case WEAVE_CERT_NOT_USED : return WeaveFormatError(err, "Certificate was not used in chain validation");
case WEAVE_ERROR_CERT_NOT_FOUND : return WeaveFormatError(err, "Certificate not found");
case WEAVE_ERROR_INVALID_CASE_PARAMETER : return WeaveFormatError(err, "Invalid CASE parameter");
case WEAVE_ERROR_UNSUPPORTED_CASE_CONFIGURATION : return WeaveFormatError(err, "Unsupported CASE configuration");
case WEAVE_ERROR_CERT_LOAD_FAIL : return WeaveFormatError(err, "Unable to load certificate");
case WEAVE_ERROR_CERT_NOT_TRUSTED : return WeaveFormatError(err, "Certificate not trusted");
case WEAVE_ERROR_INVALID_ACCESS_TOKEN : return WeaveFormatError(err, "Invalid access token");
case WEAVE_ERROR_WRONG_CERT_SUBJECT : return WeaveFormatError(err, "Wrong certificate subject");
case WEAVE_ERROR_WRONG_NODE_ID : return WeaveFormatError(err, "Wrong node ID");
case WEAVE_ERROR_CONN_ACCEPTED_ON_WRONG_PORT : return WeaveFormatError(err, "Connection accepted on wrong port");
case WEAVE_ERROR_CALLBACK_REPLACED : return WeaveFormatError(err, "Application callback replaced");
case WEAVE_ERROR_NO_CASE_AUTH_DELEGATE : return WeaveFormatError(err, "No CASE auth delegate set");
case WEAVE_ERROR_DEVICE_LOCATE_TIMEOUT : return WeaveFormatError(err, "Timeout attempting to locate device");
case WEAVE_ERROR_DEVICE_CONNECT_TIMEOUT : return WeaveFormatError(err, "Timeout connecting to device");
case WEAVE_ERROR_DEVICE_AUTH_TIMEOUT : return WeaveFormatError(err, "Timeout authenticating device");
case WEAVE_ERROR_MESSAGE_NOT_ACKNOWLEDGED : return WeaveFormatError(err, "Message not acknowledged after max retries");
case WEAVE_ERROR_RETRANS_TABLE_FULL : return WeaveFormatError(err, "Retransmit Table is already full");
case WEAVE_ERROR_INVALID_ACK_ID : return WeaveFormatError(err, "Invalid Acknowledgment Id");
case WEAVE_ERROR_SEND_THROTTLED : return WeaveFormatError(err, "Sending to peer is throttled on this Exchange");
case WEAVE_ERROR_WRONG_MSG_VERSION_FOR_EXCHANGE : return WeaveFormatError(err, "Message version not supported by current exchange context");
case WEAVE_ERROR_UNSUPPORTED_WEAVE_FEATURE : return WeaveFormatError(err, "Required feature not supported by this configuration");
case WEAVE_ERROR_UNSOLICITED_MSG_NO_ORIGINATOR : return WeaveFormatError(err, "Unsolicited msg with originator bit clear");
case WEAVE_ERROR_UNSUPPORTED_TUNNEL_VERSION : return WeaveFormatError(err, "Unsupported Tunnel version");
case WEAVE_ERROR_INVALID_FABRIC_ID : return WeaveFormatError(err, "Invalid Fabric Id");
case WEAVE_ERROR_TUNNEL_NEXTHOP_TABLE_FULL : return WeaveFormatError(err, "Local tunnel nexthop table full");
case WEAVE_ERROR_TUNNEL_SERVICE_QUEUE_FULL : return WeaveFormatError(err, "Service queue full");
case WEAVE_ERROR_TUNNEL_PEER_ENTRY_NOT_FOUND : return WeaveFormatError(err, "Shortcut Tunnel peer entry not found");
case WEAVE_ERROR_TUNNEL_FORCE_ABORT : return WeaveFormatError(err, "Forced Tunnel Abort.");
case WEAVE_ERROR_DRBG_ENTROPY_SOURCE_FAILED : return WeaveFormatError(err, "DRBG entropy source failed to generate entropy data");
case WEAVE_ERROR_NO_TAKE_AUTH_DELEGATE : return WeaveFormatError(err, "No TAKE auth delegate set");
case WEAVE_ERROR_TAKE_RECONFIGURE_REQUIRED : return WeaveFormatError(err, "TAKE requires a reconfigure");
case WEAVE_ERROR_TAKE_REAUTH_POSSIBLE : return WeaveFormatError(err, "TAKE can do a reauthentication");
case WEAVE_ERROR_INVALID_TAKE_PARAMETER : return WeaveFormatError(err, "TAKE received an invalid parameter");
case WEAVE_ERROR_UNSUPPORTED_TAKE_CONFIGURATION : return WeaveFormatError(err, "TAKE Unsupported configuration");
case WEAVE_ERROR_TAKE_TOKEN_IDENTIFICATION_FAILED : return WeaveFormatError(err, "TAKE token identification failed");
case WEAVE_ERROR_INVALID_TOKENPAIRINGBUNDLE : return WeaveFormatError(err, "Invalid Token Pairing Bundle");
case WEAVE_ERROR_UNSUPPORTED_TOKENPAIRINGBUNDLE_VERSION : return WeaveFormatError(err, "Unsupported Token Pairing Bundle version");
case WEAVE_ERROR_KEY_NOT_FOUND_FROM_PEER : return WeaveFormatError(err, "Key not found error code received from peer");
case WEAVE_ERROR_WRONG_ENCRYPTION_TYPE_FROM_PEER : return WeaveFormatError(err, "Wrong encryption type error code received from peer");
case WEAVE_ERROR_UNKNOWN_KEY_TYPE_FROM_PEER : return WeaveFormatError(err, "Unknown key type error code received from peer");
case WEAVE_ERROR_INVALID_USE_OF_SESSION_KEY_FROM_PEER : return WeaveFormatError(err, "Invalid use of session key error code received from peer");
case WEAVE_ERROR_UNSUPPORTED_ENCRYPTION_TYPE_FROM_PEER : return WeaveFormatError(err, "Unsupported encryption type error code received from peer");
case WEAVE_ERROR_INTERNAL_KEY_ERROR_FROM_PEER : return WeaveFormatError(err, "Internal key error code received from peer");
case WEAVE_ERROR_INVALID_KEY_ID : return WeaveFormatError(err, "Invalid key identifier");
case WEAVE_ERROR_INVALID_TIME : return WeaveFormatError(err, "Valid time value is not available");
case WEAVE_ERROR_LOCKING_FAILURE : return WeaveFormatError(err, "Failure to lock/unlock OS-provided lock");
case WEAVE_ERROR_UNSUPPORTED_PASSCODE_CONFIG : return WeaveFormatError(err, "Unsupported passcode encryption configuration.");
case WEAVE_ERROR_PASSCODE_AUTHENTICATION_FAILED : return WeaveFormatError(err, "Passcode authentication failed.");
case WEAVE_ERROR_PASSCODE_FINGERPRINT_FAILED : return WeaveFormatError(err, "Passcode fingerprint failed.");
case WEAVE_ERROR_SERIALIZATION_ELEMENT_NULL : return WeaveFormatError(err, "Element requested is null.");
case WEAVE_ERROR_WRONG_CERT_SIGNATURE_ALGORITHM : return WeaveFormatError(err, "Certificate not signed with required signature algorithm");
case WEAVE_ERROR_WRONG_WEAVE_SIGNATURE_ALGORITHM : return WeaveFormatError(err, "Weave signature not signed with required signature algorithm");
case WEAVE_ERROR_WDM_SCHEMA_MISMATCH : return WeaveFormatError(err, "Schema mismatch in WDM.");
case WEAVE_ERROR_INVALID_INTEGER_VALUE : return WeaveFormatError(err, "Invalid integer value.");
case WEAVE_ERROR_TOO_MANY_CASE_RECONFIGURATIONS : return WeaveFormatError(err, "Too many CASE reconfigurations were received.");
case WEAVE_ERROR_INVALID_MESSAGE_FLAG : return WeaveFormatError(err, "Invalid message flag.");
case WEAVE_ERROR_NO_COMMON_KEY_EXPORT_CONFIGURATIONS : return WeaveFormatError(err, "No supported key export protocol configurations in common");
case WEAVE_ERROR_INVALID_KEY_EXPORT_CONFIGURATION : return WeaveFormatError(err, "Invalid key export protocol configuration");
case WEAVE_ERROR_NO_KEY_EXPORT_DELEGATE : return WeaveFormatError(err, "No key export protocol delegate set");
case WEAVE_ERROR_UNAUTHORIZED_KEY_EXPORT_REQUEST : return WeaveFormatError(err, "Unauthorized key export request");
case WEAVE_ERROR_UNAUTHORIZED_KEY_EXPORT_RESPONSE : return WeaveFormatError(err, "Unauthorized key export response");
case WEAVE_ERROR_EXPORTED_KEY_AUTHENTICATION_FAILED : return WeaveFormatError(err, "Exported key authentication failed");
case WEAVE_ERROR_TOO_MANY_SHARED_SESSION_END_NODES : return WeaveFormatError(err, "Too many shared session end nodes");
case WEAVE_ERROR_WDM_MALFORMED_DATA_ELEMENT : return WeaveFormatError(err, "Malformed WDM DataElement");
case WEAVE_ERROR_WRONG_CERT_TYPE : return WeaveFormatError(err, "Wrong certificate type");
case WEAVE_ERROR_TIME_NOT_SYNCED_YET : return WeaveFormatError(err, "Time not synced yet");
case WEAVE_ERROR_UNSUPPORTED_CLOCK : return WeaveFormatError(err, "Unsupported clock");
case WEAVE_ERROR_DEFAULT_EVENT_HANDLER_NOT_CALLED : return WeaveFormatError(err, "Default event handler not called");
case WEAVE_ERROR_PERSISTED_STORAGE_FAIL : return WeaveFormatError(err, "Persisted storage failed");
case WEAVE_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND : return WeaveFormatError(err, "Value not found in the persisted storage");
case WEAVE_ERROR_PROFILE_STRING_CONTEXT_ALREADY_REGISTERED : return WeaveFormatError(err, "String context already registered");
case WEAVE_ERROR_PROFILE_STRING_CONTEXT_NOT_REGISTERED : return WeaveFormatError(err, "String context not registered");
case WEAVE_ERROR_INCOMPATIBLE_SCHEMA_VERSION : return WeaveFormatError(err, "Incompatible data schema version");
case WEAVE_ERROR_TUNNEL_ROUTING_RESTRICTED : return WeaveFormatError(err, "Restricted Routing: Border Routing disabled");
// ----- ASN1 Errors -----
case ASN1_END : return ASN1FormatError(err, "End of input");
case ASN1_ERROR_UNDERRUN : return ASN1FormatError(err, "Reader underrun");
case ASN1_ERROR_OVERFLOW : return ASN1FormatError(err, "Writer overflow");
case ASN1_ERROR_INVALID_STATE : return ASN1FormatError(err, "Invalid state");
case ASN1_ERROR_MAX_DEPTH_EXCEEDED : return ASN1FormatError(err, "Max depth exceeded");
case ASN1_ERROR_INVALID_ENCODING : return ASN1FormatError(err, "Invalid encoding");
case ASN1_ERROR_UNSUPPORTED_ENCODING : return ASN1FormatError(err, "Unsupported encoding");
case ASN1_ERROR_TAG_OVERFLOW : return ASN1FormatError(err, "Tag overflow");
case ASN1_ERROR_LENGTH_OVERFLOW : return ASN1FormatError(err, "Length overflow");
case ASN1_ERROR_VALUE_OVERFLOW : return ASN1FormatError(err, "Value overflow");
case ASN1_ERROR_UNKNOWN_OBJECT_ID : return ASN1FormatError(err, "Unknown object id");
#endif // if !WEAVE_CONFIG_SHORT_ERROR_STR
}
#if WEAVE_SYSTEM_CONFIG_USE_LWIP
// Handle any Weave System Layer LwIP stack-specific errors.
// description is ignored, and the actual printout is different when WEAVE_CONFIG_SHORT_ERROR_STR is defined
if (Weave::System::IsErrorLwIP(static_cast<Weave::System::Error>(err)))
return _SubsystemFormatError("LwIP", err, Weave::System::DescribeErrorLwIP(static_cast<Weave::System::Error>(err)));
#endif // WEAVE_SYSTEM_CONFIG_USE_LWIP
#if WEAVE_SYSTEM_CONFIG_USE_SOCKETS
// Handle any Weave System Layer POSIX stack-specific errors.
// description is ignored, and the actual printout is different when WEAVE_CONFIG_SHORT_ERROR_STR is defined
if (Weave::System::IsErrorPOSIX(static_cast<Weave::System::Error>(err)))
return _SubsystemFormatError("OS", err, Weave::System::DescribeErrorPOSIX(static_cast<Weave::System::Error>(err)));
#endif // WEAVE_SYSTEM_CONFIG_USE_SOCKETS
// Handle any default cases not explicitly handled in the switch
// statement above.
// Note this is the only case, and the actual printout is different when WEAVE_CONFIG_SHORT_ERROR_STR is defined
if (err >= INET_ERROR_MIN && err <= INET_ERROR_MAX)
return SubsystemFormatError("Inet", (int)err);
if (err >= WEAVE_ERROR_MIN && err <= WEAVE_ERROR_MAX)
return SubsystemFormatError("Weave", (int)err);
if (err >= ASN1_ERROR_MIN && err <= ASN1_ERROR_MAX)
return SubsystemFormatError("ASN1", (int)err);
#if CONFIG_NETWORK_LAYER_BLE
if (err >= BLE_ERROR_MIN && err <= BLE_ERROR_MAX)
return SubsystemFormatError("Ble", (int)err);
#endif // CONFIG_NETWORK_LAYER_BLE
// note the actual printout is different when WEAVE_CONFIG_SHORT_ERROR_STR is defined
return FormatError((int)err);
}
} // namespace nl