Skip to content

Commit

Permalink
[dbus] add notifications for active dataset changes (openthread#26) (o…
Browse files Browse the repository at this point in the history
…penthread#28)

* [dbus] add notifications for active dataset changes

* Fix error log

* Fix style

(cherry picked from commit 2f878e2297ba6277e17fb56da0cfb772e5ccd4d4)
  • Loading branch information
jinran-google committed Aug 23, 2021
1 parent 1e43f9a commit d9aa857
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 4 deletions.
29 changes: 29 additions & 0 deletions src/agent/thread_helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,30 @@ void ThreadHelper::StateChangedCallback(otChangedFlags aFlags)
}
}
}

if (aFlags & OT_CHANGED_ACTIVE_DATASET)
{
ActiveDatasetChangedCallback();
}
}

void ThreadHelper::ActiveDatasetChangedCallback()
{
otError error;
otOperationalDatasetTlvs datasetTlvs;

SuccessOrExit(error = otDatasetGetActiveTlvs(mInstance, &datasetTlvs));

for (const auto &handler : mActiveDatasetChangeHandlers)
{
handler(datasetTlvs);
}

exit:
if (error != OT_ERROR_NONE)
{
otbrLogWarning("Error handling active dataset change: %s", otThreadErrorToString(error));
}
}

void ThreadHelper::AddDeviceRoleHandler(DeviceRoleHandler aHandler)
Expand Down Expand Up @@ -446,5 +470,10 @@ otError ThreadHelper::PermitUnsecureJoin(uint16_t aPort, uint32_t aSeconds)
}
#endif

void ThreadHelper::AddActiveDatasetChangeHandler(DatasetChangeHandler aHandler)
{
mActiveDatasetChangeHandlers.push_back(std::move(aHandler));
}

} // namespace agent
} // namespace otbr
19 changes: 15 additions & 4 deletions src/agent/thread_helper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,10 @@ namespace agent {
class ThreadHelper
{
public:
using DeviceRoleHandler = std::function<void(otDeviceRole)>;
using ScanHandler = std::function<void(otError, const std::vector<otActiveScanResult> &)>;
using ResultHandler = std::function<void(otError)>;
using DeviceRoleHandler = std::function<void(otDeviceRole)>;
using ScanHandler = std::function<void(otError, const std::vector<otActiveScanResult> &)>;
using ResultHandler = std::function<void(otError)>;
using DatasetChangeHandler = std::function<void(const otOperationalDatasetTlvs &)>;

/**
* The constructor of a Thread helper.
Expand All @@ -84,6 +85,13 @@ class ThreadHelper
*/
void AddDeviceRoleHandler(DeviceRoleHandler aHandler);

/**
* This method adds a callback for active dataset change.
*
* @param[in] aHandler The active dataset change handler.
*/
void AddActiveDatasetChangeHandler(DatasetChangeHandler aHandler);

/**
* This method permits unsecure join on port.
*
Expand Down Expand Up @@ -217,14 +225,17 @@ class ThreadHelper
void RandomFill(void *aBuf, size_t size);
uint8_t RandomChannelFromChannelMask(uint32_t aChannelMask);

void ActiveDatasetChangedCallback();

otInstance *mInstance;

otbr::Ncp::ControllerOpenThread *mNcp;

ScanHandler mScanHandler;
std::vector<otActiveScanResult> mScanResults;

std::vector<DeviceRoleHandler> mDeviceRoleHandlers;
std::vector<DeviceRoleHandler> mDeviceRoleHandlers;
std::vector<DatasetChangeHandler> mActiveDatasetChangeHandlers;

std::map<uint16_t, size_t> mUnsecurePortRefCounter;

Expand Down
10 changes: 10 additions & 0 deletions src/dbus/server/dbus_thread_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ otbrError DBusThreadObject::Init(void)
auto threadHelper = mNcp->GetThreadHelper();

threadHelper->AddDeviceRoleHandler(std::bind(&DBusThreadObject::DeviceRoleHandler, this, _1));
threadHelper->AddActiveDatasetChangeHandler(std::bind(&DBusThreadObject::ActiveDatasetChangeHandler, this, _1));
mNcp->RegisterResetHandler(std::bind(&DBusThreadObject::NcpResetHandler, this));

RegisterMethod(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_SCAN_METHOD,
Expand Down Expand Up @@ -215,6 +216,8 @@ void DBusThreadObject::DeviceRoleHandler(otDeviceRole aDeviceRole)
void DBusThreadObject::NcpResetHandler(void)
{
mNcp->GetThreadHelper()->AddDeviceRoleHandler(std::bind(&DBusThreadObject::DeviceRoleHandler, this, _1));
mNcp->GetThreadHelper()->AddActiveDatasetChangeHandler(
std::bind(&DBusThreadObject::ActiveDatasetChangeHandler, this, _1));
SignalPropertyChanged(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_DEVICE_ROLE,
GetDeviceRoleName(OT_DEVICE_ROLE_DISABLED));
}
Expand Down Expand Up @@ -1053,5 +1056,12 @@ otError DBusThreadObject::GetRadioRegionHandler(DBusMessageIter &aIter)
return error;
}

void DBusThreadObject::ActiveDatasetChangeHandler(const otOperationalDatasetTlvs &aDatasetTlvs)
{
std::vector<uint8_t> value(aDatasetTlvs.mLength);
std::copy(aDatasetTlvs.mTlvs, aDatasetTlvs.mTlvs + aDatasetTlvs.mLength, value.begin());
SignalPropertyChanged(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_ACTIVE_DATASET_TLVS, value);
}

} // namespace DBus
} // namespace otbr
1 change: 1 addition & 0 deletions src/dbus/server/dbus_thread_object.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ class DBusThreadObject : public DBusObject

private:
void DeviceRoleHandler(otDeviceRole aDeviceRole);
void ActiveDatasetChangeHandler(const otOperationalDatasetTlvs &aDatasetTlvs);
void NcpResetHandler(void);

void ScanHandler(DBusRequest &aRequest);
Expand Down

0 comments on commit d9aa857

Please sign in to comment.