2 * Copyright (c) 2020, The OpenThread Authors.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. Neither the name of the copyright holder nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
29 #include "client_error.hpp"
31 #include "common/code_utils.hpp"
32 #include "dbus/common/dbus_message_helper.hpp"
34 #define OTBR_OPENTHREAD_ERROR_PREFIX "io.openthread.Error"
39 static const std::pair<ClientError, const char *> sErrorNames[] = {
40 {ClientError::ERROR_NONE, OTBR_OPENTHREAD_ERROR_PREFIX ".OK"},
41 {ClientError::OT_ERROR_GENERIC, OTBR_OPENTHREAD_ERROR_PREFIX ".Generic"},
42 {ClientError::OT_ERROR_FAILED, OTBR_OPENTHREAD_ERROR_PREFIX ".Failed"},
43 {ClientError::OT_ERROR_DROP, OTBR_OPENTHREAD_ERROR_PREFIX ".Drop"},
44 {ClientError::OT_ERROR_NO_BUFS, OTBR_OPENTHREAD_ERROR_PREFIX ".NoBufs"},
45 {ClientError::OT_ERROR_NO_ROUTE, OTBR_OPENTHREAD_ERROR_PREFIX ".NoRoute"},
46 {ClientError::OT_ERROR_BUSY, OTBR_OPENTHREAD_ERROR_PREFIX ".Busy"},
47 {ClientError::OT_ERROR_PARSE, OTBR_OPENTHREAD_ERROR_PREFIX ".Parse"},
48 {ClientError::OT_ERROR_INVALID_ARGS, OTBR_OPENTHREAD_ERROR_PREFIX ".InvalidArgs"},
49 {ClientError::OT_ERROR_SECURITY, OTBR_OPENTHREAD_ERROR_PREFIX ".Security"},
50 {ClientError::OT_ERROR_ADDRESS_QUERY, OTBR_OPENTHREAD_ERROR_PREFIX ".AddressQuery"},
51 {ClientError::OT_ERROR_NO_ADDRESS, OTBR_OPENTHREAD_ERROR_PREFIX ".NoAddress"},
52 {ClientError::OT_ERROR_ABORT, OTBR_OPENTHREAD_ERROR_PREFIX ".Abort"},
53 {ClientError::OT_ERROR_NOT_IMPLEMENTED, OTBR_OPENTHREAD_ERROR_PREFIX ".NotImplemented"},
54 {ClientError::OT_ERROR_INVALID_STATE, OTBR_OPENTHREAD_ERROR_PREFIX ".InvalidState"},
55 {ClientError::OT_ERROR_NO_ACK, OTBR_OPENTHREAD_ERROR_PREFIX ".NoAck"},
56 {ClientError::OT_ERROR_CHANNEL_ACCESS_FAILURE, OTBR_OPENTHREAD_ERROR_PREFIX ".ChannelAccessFailure"},
57 {ClientError::OT_ERROR_DETACHED, OTBR_OPENTHREAD_ERROR_PREFIX ".Detached"},
58 {ClientError::OT_ERROR_FCS, OTBR_OPENTHREAD_ERROR_PREFIX ".FcsErr"},
59 {ClientError::OT_ERROR_NO_FRAME_RECEIVED, OTBR_OPENTHREAD_ERROR_PREFIX ".NoFrameReceived"},
60 {ClientError::OT_ERROR_UNKNOWN_NEIGHBOR, OTBR_OPENTHREAD_ERROR_PREFIX ".UnknownNeighbor"},
61 {ClientError::OT_ERROR_INVALID_SOURCE_ADDRESS, OTBR_OPENTHREAD_ERROR_PREFIX ".InvalidSourceAddress"},
62 {ClientError::OT_ERROR_ADDRESS_FILTERED, OTBR_OPENTHREAD_ERROR_PREFIX ".AddressFiltered"},
63 {ClientError::OT_ERROR_DESTINATION_ADDRESS_FILTERED, OTBR_OPENTHREAD_ERROR_PREFIX ".DestinationAddressFiltered"},
64 {ClientError::OT_ERROR_NOT_FOUND, OTBR_OPENTHREAD_ERROR_PREFIX ".NotFound"},
65 {ClientError::OT_ERROR_ALREADY, OTBR_OPENTHREAD_ERROR_PREFIX ".Already"},
66 {ClientError::OT_ERROR_IP6_ADDRESS_CREATION_FAILURE, OTBR_OPENTHREAD_ERROR_PREFIX ".Ipv6AddressCreationFailure"},
67 {ClientError::OT_ERROR_NOT_CAPABLE, OTBR_OPENTHREAD_ERROR_PREFIX ".NotCapable"},
68 {ClientError::OT_ERROR_RESPONSE_TIMEOUT, OTBR_OPENTHREAD_ERROR_PREFIX ".ResponseTimeout"},
69 {ClientError::OT_ERROR_DUPLICATED, OTBR_OPENTHREAD_ERROR_PREFIX ".Duplicated"},
70 {ClientError::OT_ERROR_REASSEMBLY_TIMEOUT, OTBR_OPENTHREAD_ERROR_PREFIX ".ReassemblyTimeout"},
71 {ClientError::OT_ERROR_NOT_TMF, OTBR_OPENTHREAD_ERROR_PREFIX ".NotTmf"},
72 {ClientError::OT_ERROR_NOT_LOWPAN_DATA_FRAME, OTBR_OPENTHREAD_ERROR_PREFIX ".NonLowpanDatatFrame"},
73 {ClientError::OT_ERROR_LINK_MARGIN_LOW, OTBR_OPENTHREAD_ERROR_PREFIX ".LinkMarginLow"},
76 ClientError ConvertFromDBusErrorName(const std::string &aErrorName)
78 ClientError error = ClientError::ERROR_NONE;
80 for (const auto &p : sErrorNames)
82 if (p.second == aErrorName)
84 error = static_cast<ClientError>(p.first);
91 ClientError CheckErrorMessage(DBusMessage *aMessage)
93 ClientError error = ClientError::ERROR_NONE;
95 if (dbus_message_get_type(aMessage) == DBUS_MESSAGE_TYPE_ERROR)
98 auto args = std::tie(errorMsg);
100 if (dbus_message_get_type(aMessage) == DBUS_MESSAGE_TYPE_ERROR)
102 error = ConvertFromDBusErrorName(dbus_message_get_error_name(aMessage));
106 VerifyOrExit(DBusMessageToTuple(*aMessage, args) == OTBR_ERROR_NONE, error = ClientError::ERROR_DBUS);
107 error = ConvertFromDBusErrorName(errorMsg);