blob: c02830b987970f9808a092d1972e18ff87a4ca3b [file] [log] [blame]
/*
* Copyright (c) 2020, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <string.h>
#include "dbus/common/dbus_message_helper.hpp"
namespace otbr {
namespace DBus {
otbrError DBusMessageExtract(DBusMessageIter *aIter, otbrError &aError)
{
uint8_t val;
otbrError error = DBusMessageExtract(aIter, val);
VerifyOrExit(error == OTBR_ERROR_NONE);
aError = static_cast<otbrError>(val);
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const otbrError &aError)
{
return DBusMessageEncode(aIter, static_cast<uint8_t>(aError));
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, ActiveScanResult &aScanResult)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_STRUCT, error = OTBR_ERROR_DBUS);
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mExtAddress));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mNetworkName));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mExtendedPanId));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mSteeringData));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mPanId));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mJoinerUdpPort));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mChannel));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mRssi));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mLqi));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mVersion));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mIsNative));
SuccessOrExit(error = DBusMessageExtract(&sub, aScanResult.mIsJoinable));
dbus_message_iter_next(aIter);
error = OTBR_ERROR_NONE;
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const ActiveScanResult &aScanResult)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mExtAddress));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mNetworkName));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mExtendedPanId));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mSteeringData));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mPanId));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mJoinerUdpPort));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mChannel));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mRssi));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mLqi));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mVersion));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mIsNative));
SuccessOrExit(error = DBusMessageEncode(&sub, aScanResult.mIsJoinable));
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub), error = OTBR_ERROR_DBUS);
error = OTBR_ERROR_NONE;
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const LinkModeConfig &aConfig)
{
otbrError error = OTBR_ERROR_NONE;
DBusMessageIter sub;
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
SuccessOrExit(error = DBusMessageEncode(&sub, aConfig.mRxOnWhenIdle));
SuccessOrExit(error = DBusMessageEncode(&sub, aConfig.mSecureDataRequests));
SuccessOrExit(error = DBusMessageEncode(&sub, aConfig.mDeviceType));
SuccessOrExit(error = DBusMessageEncode(&sub, aConfig.mNetworkData));
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub) == true, error = OTBR_ERROR_DBUS);
error = OTBR_ERROR_NONE;
exit:
return error;
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, LinkModeConfig &aConfig)
{
otbrError error = OTBR_ERROR_DBUS;
DBusMessageIter sub;
VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_STRUCT);
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(DBusMessageExtract(&sub, aConfig.mRxOnWhenIdle));
SuccessOrExit(DBusMessageExtract(&sub, aConfig.mSecureDataRequests));
SuccessOrExit(DBusMessageExtract(&sub, aConfig.mDeviceType));
SuccessOrExit(DBusMessageExtract(&sub, aConfig.mNetworkData));
dbus_message_iter_next(aIter);
error = OTBR_ERROR_NONE;
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const Ip6Prefix &aPrefix)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
VerifyOrExit(aPrefix.mPrefix.size() <= OTBR_IP6_PREFIX_SIZE, error = OTBR_ERROR_DBUS);
SuccessOrExit(error = DBusMessageEncode(&sub, aPrefix.mPrefix));
SuccessOrExit(error = DBusMessageEncode(&sub, aPrefix.mLength));
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub), error = OTBR_ERROR_DBUS);
exit:
return error;
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, Ip6Prefix &aPrefix)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(error = DBusMessageExtract(&sub, aPrefix.mPrefix));
VerifyOrExit(aPrefix.mPrefix.size() <= OTBR_IP6_PREFIX_SIZE, error = OTBR_ERROR_DBUS);
SuccessOrExit(error = DBusMessageExtract(&sub, aPrefix.mLength));
dbus_message_iter_next(aIter);
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const ExternalRoute &aRoute)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
SuccessOrExit(error = DBusMessageEncode(&sub, aRoute.mPrefix));
SuccessOrExit(error = DBusMessageEncode(&sub, aRoute.mRloc16));
SuccessOrExit(error = DBusMessageEncode(&sub, aRoute.mPreference));
SuccessOrExit(error = DBusMessageEncode(&sub, aRoute.mStable));
SuccessOrExit(error = DBusMessageEncode(&sub, aRoute.mNextHopIsThisDevice));
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub), error = OTBR_ERROR_DBUS);
exit:
return error;
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, ExternalRoute &aRoute)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(error = DBusMessageExtract(&sub, aRoute.mPrefix));
SuccessOrExit(error = DBusMessageExtract(&sub, aRoute.mRloc16));
SuccessOrExit(error = DBusMessageExtract(&sub, aRoute.mPreference));
SuccessOrExit(error = DBusMessageExtract(&sub, aRoute.mStable));
SuccessOrExit(error = DBusMessageExtract(&sub, aRoute.mNextHopIsThisDevice));
dbus_message_iter_next(aIter);
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const OnMeshPrefix &aPrefix)
{
DBusMessageIter sub, flagsSub;
auto args = std::tie(aPrefix.mPreferred, aPrefix.mSlaac, aPrefix.mDhcp, aPrefix.mConfigure, aPrefix.mDefaultRoute,
aPrefix.mOnMesh, aPrefix.mStable);
otbrError error = OTBR_ERROR_NONE;
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
SuccessOrExit(error = ConvertToDBusMessage(&sub, std::tie(aPrefix.mPrefix, aPrefix.mPreference)));
VerifyOrExit(dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, nullptr, &flagsSub), error = OTBR_ERROR_DBUS);
SuccessOrExit(error = ConvertToDBusMessage(&flagsSub, args));
VerifyOrExit(dbus_message_iter_close_container(&sub, &flagsSub) == true, error = OTBR_ERROR_DBUS);
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub) == true, error = OTBR_ERROR_DBUS);
exit:
return error;
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, OnMeshPrefix &aPrefix)
{
DBusMessageIter sub, flagsSub;
auto args = std::tie(aPrefix.mPrefix, aPrefix.mPreference);
auto flagArgs = std::tie(aPrefix.mPreferred, aPrefix.mSlaac, aPrefix.mDhcp, aPrefix.mConfigure,
aPrefix.mDefaultRoute, aPrefix.mOnMesh, aPrefix.mStable);
otbrError error = OTBR_ERROR_NONE;
VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_STRUCT, error = OTBR_ERROR_DBUS);
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(error = ConvertToTuple(&sub, args));
VerifyOrExit(dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRUCT, error = OTBR_ERROR_DBUS);
dbus_message_iter_recurse(&sub, &flagsSub);
SuccessOrExit(error = ConvertToTuple(&flagsSub, flagArgs));
dbus_message_iter_next(aIter);
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const MacCounters &aCounters)
{
auto args = std::tie(aCounters.mTxTotal, aCounters.mTxUnicast, aCounters.mTxBroadcast, aCounters.mTxAckRequested,
aCounters.mTxAcked, aCounters.mTxNoAckRequested, aCounters.mTxData, aCounters.mTxDataPoll,
aCounters.mTxBeacon, aCounters.mTxBeaconRequest, aCounters.mTxOther, aCounters.mTxRetry,
aCounters.mTxErrCca, aCounters.mTxErrAbort, aCounters.mTxErrBusyChannel, aCounters.mRxTotal,
aCounters.mRxUnicast, aCounters.mRxBroadcast, aCounters.mRxData, aCounters.mRxDataPoll,
aCounters.mRxBeacon, aCounters.mRxBeaconRequest, aCounters.mRxOther,
aCounters.mRxAddressFiltered, aCounters.mRxDestAddrFiltered, aCounters.mRxDuplicated,
aCounters.mRxErrNoFrame, aCounters.mRxErrUnknownNeighbor, aCounters.mRxErrInvalidSrcAddr,
aCounters.mRxErrSec, aCounters.mRxErrFcs, aCounters.mRxErrOther);
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
SuccessOrExit(error = ConvertToDBusMessage(&sub, args));
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub) == true, error = OTBR_ERROR_DBUS);
exit:
return error;
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, MacCounters &aCounters)
{
auto args = std::tie(aCounters.mTxTotal, aCounters.mTxUnicast, aCounters.mTxBroadcast, aCounters.mTxAckRequested,
aCounters.mTxAcked, aCounters.mTxNoAckRequested, aCounters.mTxData, aCounters.mTxDataPoll,
aCounters.mTxBeacon, aCounters.mTxBeaconRequest, aCounters.mTxOther, aCounters.mTxRetry,
aCounters.mTxErrCca, aCounters.mTxErrAbort, aCounters.mTxErrBusyChannel, aCounters.mRxTotal,
aCounters.mRxUnicast, aCounters.mRxBroadcast, aCounters.mRxData, aCounters.mRxDataPoll,
aCounters.mRxBeacon, aCounters.mRxBeaconRequest, aCounters.mRxOther,
aCounters.mRxAddressFiltered, aCounters.mRxDestAddrFiltered, aCounters.mRxDuplicated,
aCounters.mRxErrNoFrame, aCounters.mRxErrUnknownNeighbor, aCounters.mRxErrInvalidSrcAddr,
aCounters.mRxErrSec, aCounters.mRxErrFcs, aCounters.mRxErrOther);
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_STRUCT, error = OTBR_ERROR_DBUS);
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(error = ConvertToTuple(&sub, args));
dbus_message_iter_next(aIter);
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const IpCounters &aCounters)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
auto args = std::tie(aCounters.mTxSuccess, aCounters.mRxSuccess, aCounters.mTxFailure, aCounters.mRxFailure);
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
SuccessOrExit(error = ConvertToDBusMessage(&sub, args));
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub) == true, error = OTBR_ERROR_DBUS);
exit:
return error;
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, IpCounters &aCounters)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
auto args = std::tie(aCounters.mTxSuccess, aCounters.mRxSuccess, aCounters.mTxFailure, aCounters.mRxFailure);
VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_STRUCT, error = OTBR_ERROR_DBUS);
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(error = ConvertToTuple(&sub, args));
dbus_message_iter_next(aIter);
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const ChildInfo &aChildInfo)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
auto args = std::tie(aChildInfo.mExtAddress, aChildInfo.mTimeout, aChildInfo.mAge, aChildInfo.mRloc16,
aChildInfo.mChildId, aChildInfo.mNetworkDataVersion, aChildInfo.mLinkQualityIn,
aChildInfo.mAverageRssi, aChildInfo.mLastRssi, aChildInfo.mFrameErrorRate,
aChildInfo.mMessageErrorRate, aChildInfo.mRxOnWhenIdle, aChildInfo.mSecureDataRequest,
aChildInfo.mFullThreadDevice, aChildInfo.mFullNetworkData, aChildInfo.mIsStateRestoring);
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
SuccessOrExit(error = ConvertToDBusMessage(&sub, args));
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub) == true, error = OTBR_ERROR_DBUS);
exit:
return error;
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, ChildInfo &aChildInfo)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
auto args = std::tie(aChildInfo.mExtAddress, aChildInfo.mTimeout, aChildInfo.mAge, aChildInfo.mRloc16,
aChildInfo.mChildId, aChildInfo.mNetworkDataVersion, aChildInfo.mLinkQualityIn,
aChildInfo.mAverageRssi, aChildInfo.mLastRssi, aChildInfo.mFrameErrorRate,
aChildInfo.mMessageErrorRate, aChildInfo.mRxOnWhenIdle, aChildInfo.mSecureDataRequest,
aChildInfo.mFullThreadDevice, aChildInfo.mFullNetworkData, aChildInfo.mIsStateRestoring);
VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_STRUCT, error = OTBR_ERROR_DBUS);
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(error = ConvertToTuple(&sub, args));
dbus_message_iter_next(aIter);
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const NeighborInfo &aNeighborInfo)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
auto args = std::tie(aNeighborInfo.mExtAddress, aNeighborInfo.mAge, aNeighborInfo.mRloc16,
aNeighborInfo.mLinkFrameCounter, aNeighborInfo.mMleFrameCounter, aNeighborInfo.mLinkQualityIn,
aNeighborInfo.mAverageRssi, aNeighborInfo.mLastRssi, aNeighborInfo.mFrameErrorRate,
aNeighborInfo.mMessageErrorRate, aNeighborInfo.mRxOnWhenIdle, aNeighborInfo.mSecureDataRequest,
aNeighborInfo.mFullThreadDevice, aNeighborInfo.mFullNetworkData, aNeighborInfo.mIsChild);
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
SuccessOrExit(error = ConvertToDBusMessage(&sub, args));
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub) == true, error = OTBR_ERROR_DBUS);
exit:
return error;
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, NeighborInfo &aNeighborInfo)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
auto args = std::tie(aNeighborInfo.mExtAddress, aNeighborInfo.mAge, aNeighborInfo.mRloc16,
aNeighborInfo.mLinkFrameCounter, aNeighborInfo.mMleFrameCounter, aNeighborInfo.mLinkQualityIn,
aNeighborInfo.mAverageRssi, aNeighborInfo.mLastRssi, aNeighborInfo.mFrameErrorRate,
aNeighborInfo.mMessageErrorRate, aNeighborInfo.mRxOnWhenIdle, aNeighborInfo.mSecureDataRequest,
aNeighborInfo.mFullThreadDevice, aNeighborInfo.mFullNetworkData, aNeighborInfo.mIsChild);
VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_STRUCT, error = OTBR_ERROR_DBUS);
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(error = ConvertToTuple(&sub, args));
dbus_message_iter_next(aIter);
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const LeaderData &aLeaderData)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
auto args = std::tie(aLeaderData.mPartitionId, aLeaderData.mWeighting, aLeaderData.mDataVersion,
aLeaderData.mStableDataVersion, aLeaderData.mLeaderRouterId);
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
SuccessOrExit(error = ConvertToDBusMessage(&sub, args));
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub) == true, error = OTBR_ERROR_DBUS);
exit:
return error;
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, LeaderData &aLeaderData)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
auto args = std::tie(aLeaderData.mPartitionId, aLeaderData.mWeighting, aLeaderData.mDataVersion,
aLeaderData.mStableDataVersion, aLeaderData.mLeaderRouterId);
VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_STRUCT, error = OTBR_ERROR_DBUS);
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(error = ConvertToTuple(&sub, args));
dbus_message_iter_next(aIter);
exit:
return error;
}
otbrError DBusMessageEncode(DBusMessageIter *aIter, const ChannelQuality &aQuality)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
auto args = std::tie(aQuality.mChannel, aQuality.mOccupancy);
VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub));
SuccessOrExit(error = ConvertToDBusMessage(&sub, args));
VerifyOrExit(dbus_message_iter_close_container(aIter, &sub) == true, error = OTBR_ERROR_DBUS);
exit:
return error;
}
otbrError DBusMessageExtract(DBusMessageIter *aIter, ChannelQuality &aQuality)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;
auto args = std::tie(aQuality.mChannel, aQuality.mOccupancy);
VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_STRUCT, error = OTBR_ERROR_DBUS);
dbus_message_iter_recurse(aIter, &sub);
SuccessOrExit(error = ConvertToTuple(&sub, args));
dbus_message_iter_next(aIter);
exit:
return error;
}
} // namespace DBus
} // namespace otbr