[ncp] emit router entry addition/removal from neighbor table (#3838)

This commit updates `NcpBase` to emit `VALUE_INSERTED/REMOVED` spinel
message to host for `PROP_NEIGHBOR_TABLE` when a router neighbor entry
is added or removed.
This commit is contained in:
Abtin Keshavarzian
2019-05-21 21:35:39 -07:00
committed by Jonathan Hui
parent c0bc29197a
commit a1b2d354b1
3 changed files with 59 additions and 30 deletions
+2
View File
@@ -322,6 +322,8 @@ protected:
const otIp6Address ** aDestIpAddress = NULL,
bool aAllowEmptyValues = false);
otError EncodeNeighborInfo(const otNeighborInfo &aNeighborInfo);
#if OPENTHREAD_FTD
otError EncodeChildInfo(const otChildInfo &aChildInfo);
#endif
+29 -12
View File
@@ -122,30 +122,44 @@ void NcpBase::HandleNeighborTableChanged(otNeighborTableEvent aEvent, const otNe
void NcpBase::HandleNeighborTableChanged(otNeighborTableEvent aEvent, const otNeighborTableEntryInfo &aEntry)
{
otError error = OT_ERROR_NONE;
uint8_t header = SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0;
unsigned int command = 0;
VerifyOrExit(!mChangedPropsSet.IsPropertyFiltered(SPINEL_PROP_THREAD_CHILD_TABLE));
VerifyOrExit(!aEntry.mInfo.mChild.mIsStateRestoring);
otError error = OT_ERROR_NONE;
unsigned int command = SPINEL_CMD_PROP_VALUE_REMOVED;
spinel_prop_key_t property;
switch (aEvent)
{
case OT_NEIGHBOR_TABLE_EVENT_CHILD_ADDED:
command = SPINEL_CMD_PROP_VALUE_INSERTED;
// Fall through
case OT_NEIGHBOR_TABLE_EVENT_CHILD_REMOVED:
property = SPINEL_PROP_THREAD_CHILD_TABLE;
VerifyOrExit(!aEntry.mInfo.mChild.mIsStateRestoring);
break;
case OT_NEIGHBOR_TABLE_EVENT_CHILD_REMOVED:
command = SPINEL_CMD_PROP_VALUE_REMOVED;
case OT_NEIGHBOR_TABLE_EVENT_ROUTER_ADDED:
command = SPINEL_CMD_PROP_VALUE_INSERTED;
// Fall through
case OT_NEIGHBOR_TABLE_EVENT_ROUTER_REMOVED:
property = SPINEL_PROP_THREAD_NEIGHBOR_TABLE;
break;
default:
ExitNow();
}
SuccessOrExit(error = mEncoder.BeginFrame(header, command, SPINEL_PROP_THREAD_CHILD_TABLE));
SuccessOrExit(error = EncodeChildInfo(aEntry.mInfo.mChild));
VerifyOrExit(!mChangedPropsSet.IsPropertyFiltered(property));
SuccessOrExit(error = mEncoder.BeginFrame(SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0, command, property));
if (property == SPINEL_PROP_THREAD_CHILD_TABLE)
{
SuccessOrExit(error = EncodeChildInfo(aEntry.mInfo.mChild));
}
else
{
SuccessOrExit(error = EncodeNeighborInfo(aEntry.mInfo.mRouter));
}
SuccessOrExit(error = mEncoder.EndFrame());
exit:
@@ -158,7 +172,10 @@ exit:
if (error != OT_ERROR_NONE)
{
mShouldEmitChildTableUpdate = true;
if (property == SPINEL_PROP_THREAD_CHILD_TABLE)
{
mShouldEmitChildTableUpdate = true;
}
mChangedPropsSet.AddLastStatus(SPINEL_STATUS_NOMEM);
mUpdateChangedPropsTask.Post();
+28 -18
View File
@@ -163,6 +163,33 @@ uint8_t NcpBase::LinkFlagsToFlagByte(bool aRxOnWhenIdle, bool aSecureDataRequest
return flags;
}
otError NcpBase::EncodeNeighborInfo(const otNeighborInfo &aNeighborInfo)
{
otError error;
uint8_t modeFlags;
modeFlags = LinkFlagsToFlagByte(aNeighborInfo.mRxOnWhenIdle, aNeighborInfo.mSecureDataRequest,
aNeighborInfo.mFullThreadDevice, aNeighborInfo.mFullNetworkData);
SuccessOrExit(error = mEncoder.OpenStruct());
SuccessOrExit(error = mEncoder.WriteEui64(aNeighborInfo.mExtAddress));
SuccessOrExit(error = mEncoder.WriteUint16(aNeighborInfo.mRloc16));
SuccessOrExit(error = mEncoder.WriteUint32(aNeighborInfo.mAge));
SuccessOrExit(error = mEncoder.WriteUint8(aNeighborInfo.mLinkQualityIn));
SuccessOrExit(error = mEncoder.WriteInt8(aNeighborInfo.mAverageRssi));
SuccessOrExit(error = mEncoder.WriteUint8(modeFlags));
SuccessOrExit(error = mEncoder.WriteBool(aNeighborInfo.mIsChild));
SuccessOrExit(error = mEncoder.WriteUint32(aNeighborInfo.mLinkFrameCounter));
SuccessOrExit(error = mEncoder.WriteUint32(aNeighborInfo.mMleFrameCounter));
SuccessOrExit(error = mEncoder.WriteInt8(aNeighborInfo.mLastRssi));
SuccessOrExit(error = mEncoder.CloseStruct());
exit:
return error;
}
template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_MAC_DATA_POLL_PERIOD>(void)
{
return mEncoder.WriteUint32(otLinkGetPollPeriod(mInstance));
@@ -577,27 +604,10 @@ template <> otError NcpBase::HandlePropertyGet<SPINEL_PROP_THREAD_NEIGHBOR_TABLE
otError error = OT_ERROR_NONE;
otNeighborInfoIterator iter = OT_NEIGHBOR_INFO_ITERATOR_INIT;
otNeighborInfo neighInfo;
uint8_t modeFlags;
while (otThreadGetNextNeighborInfo(mInstance, &iter, &neighInfo) == OT_ERROR_NONE)
{
modeFlags = LinkFlagsToFlagByte(neighInfo.mRxOnWhenIdle, neighInfo.mSecureDataRequest,
neighInfo.mFullThreadDevice, neighInfo.mFullNetworkData);
SuccessOrExit(error = mEncoder.OpenStruct());
SuccessOrExit(error = mEncoder.WriteEui64(neighInfo.mExtAddress));
SuccessOrExit(error = mEncoder.WriteUint16(neighInfo.mRloc16));
SuccessOrExit(error = mEncoder.WriteUint32(neighInfo.mAge));
SuccessOrExit(error = mEncoder.WriteUint8(neighInfo.mLinkQualityIn));
SuccessOrExit(error = mEncoder.WriteInt8(neighInfo.mAverageRssi));
SuccessOrExit(error = mEncoder.WriteUint8(modeFlags));
SuccessOrExit(error = mEncoder.WriteBool(neighInfo.mIsChild));
SuccessOrExit(error = mEncoder.WriteUint32(neighInfo.mLinkFrameCounter));
SuccessOrExit(error = mEncoder.WriteUint32(neighInfo.mMleFrameCounter));
SuccessOrExit(error = mEncoder.WriteInt8(neighInfo.mLastRssi));
SuccessOrExit(error = mEncoder.CloseStruct());
SuccessOrExit(error = EncodeNeighborInfo(neighInfo));
}
exit: