[mle] improve log messages (#2219)

This commit is contained in:
Jonathan Hui
2017-09-27 11:37:23 -07:00
committed by GitHub
parent aa6e1a4c22
commit f533fa60ab
4 changed files with 194 additions and 116 deletions
+60 -36
View File
@@ -457,7 +457,7 @@ otError Mle::Discover(uint32_t aScanChannels, uint16_t aPanId, bool aJoiner, boo
mIsDiscoverInProgress = true;
otLogInfoMle(GetInstance(), "Sent discovery request");
LogMleMessage("Send Discovery Request", destination);
exit:
@@ -515,6 +515,8 @@ otError Mle::BecomeChild(AttachMode aMode)
VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED, error = OT_ERROR_INVALID_STATE);
VerifyOrExit(mParentRequestState == kParentIdle, error = OT_ERROR_BUSY);
otLogInfoMle(GetInstance(), "Attempt to attach");
if (mReattachState == kReattachStart)
{
if (netif.GetActiveDataset().Restore() == OT_ERROR_NONE)
@@ -585,7 +587,7 @@ otError Mle::SetStateDetached(void)
netif.GetIp6().SetForwardingEnabled(false);
netif.GetIp6().mMpl.SetTimerExpirations(0);
otLogInfoMle(GetInstance(), "Mode -> Detached");
otLogInfoMle(GetInstance(), "Role -> Detached");
return OT_ERROR_NONE;
}
@@ -639,7 +641,7 @@ otError Mle::SetStateChild(uint16_t aRloc16)
mPreviousParentRloc = mParent.GetRloc16();
#endif
otLogInfoMle(GetInstance(), "Mode -> Child");
otLogInfoMle(GetInstance(), "Role -> Child");
return OT_ERROR_NONE;
}
@@ -1466,7 +1468,7 @@ void Mle::HandleDelayedResponseTimer(void)
// Send the message.
if (SendMessage(*message, delayedResponse.GetDestination()) == OT_ERROR_NONE)
{
otLogInfoMle(GetInstance(), "Sent delayed response");
LogMleMessage("Send delayed message", delayedResponse.GetDestination());
}
else
{
@@ -1531,11 +1533,11 @@ otError Mle::SendParentRequest(void)
if ((scanMask & ScanMaskTlv::kEndDeviceFlag) == 0)
{
otLogInfoMle(GetInstance(), "Sent parent request to routers");
LogMleMessage("Send Parent Request to routers", destination);
}
else
{
otLogInfoMle(GetInstance(), "Sent parent request to all devices");
LogMleMessage("Send Parent Request to routers and REEDs", destination);
}
exit:
@@ -1586,7 +1588,7 @@ otError Mle::SendChildIdRequest(void)
destination.mFields.m16[0] = HostSwap16(0xfe80);
destination.SetIid(mParentCandidate.GetExtAddress());
SuccessOrExit(error = SendMessage(*message, destination));
otLogInfoMle(GetInstance(), "Sent Child ID Request");
LogMleMessage("Send Child ID Request", destination);;
if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) == 0)
{
@@ -1619,10 +1621,12 @@ otError Mle::SendDataRequest(const Ip6::Address &aDestination, const uint8_t *aT
if (aDelay)
{
SuccessOrExit(error = AddDelayedResponse(*message, aDestination, aDelay));
LogMleMessage("Delay Data Request", aDestination);
}
else
{
SuccessOrExit(error = SendMessage(*message, aDestination));
LogMleMessage("Send Data Request", aDestination);
if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) == 0)
{
@@ -1630,8 +1634,6 @@ otError Mle::SendDataRequest(const Ip6::Address &aDestination, const uint8_t *aT
}
}
otLogInfoMle(GetInstance(), "Sent Data Request");
exit:
if (error != OT_ERROR_NONE && message != NULL)
@@ -1718,7 +1720,7 @@ otError Mle::SendChildUpdateRequest(void)
destination.SetIid(mParent.GetExtAddress());
SuccessOrExit(error = SendMessage(*message, destination));
otLogInfoMle(GetInstance(), "Sent Child Update Request to parent");
LogMleMessage("Send Child Update Request to parent", destination);
if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) == 0)
{
@@ -1786,7 +1788,7 @@ otError Mle::SendChildUpdateResponse(const uint8_t *aTlvs, uint8_t aNumTlvs, con
destination.SetIid(mParent.GetExtAddress());
SuccessOrExit(error = SendMessage(*message, destination));
otLogInfoMle(GetInstance(), "Sent Child Update Response to parent");
LogMleMessage("Send Child Update Response to parent", destination);
exit:
@@ -1842,7 +1844,7 @@ otError Mle::SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce)
destination.mFields.m16[7] = HostSwap16(0x0001);
SuccessOrExit(error = SendMessage(*message, destination));
otLogInfoMle(GetInstance(), "sent announce on channel %d", aChannel);
otLogInfoMle(GetInstance(), "Send Announce on channel %d", aChannel);
exit:
@@ -2266,12 +2268,12 @@ otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress));
VerifyOrExit(sourceAddress.IsValid(), error = OT_ERROR_PARSE);
LogMleMessage("Receive Advertisement", aMessageInfo.GetPeerAddr(), sourceAddress.GetRloc16());
// Leader Data
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
otLogInfoMle(GetInstance(), "Received advertisement from %04x", sourceAddress.GetRloc16());
aMessageInfo.GetPeerAddr().ToExtAddress(macAddr);
if (mRole != OT_DEVICE_ROLE_DETACHED)
@@ -2350,12 +2352,6 @@ otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo
}
exit:
if (error != OT_ERROR_NONE)
{
otLogWarnMleErr(GetInstance(), error, "Failed to process Advertisement");
}
return error;
}
@@ -2363,7 +2359,7 @@ otError Mle::HandleDataResponse(const Message &aMessage, const Ip6::MessageInfo
{
otError error;
otLogInfoMle(GetInstance(), "Received Data Response");
LogMleMessage("Receive Data Response", aMessageInfo.GetPeerAddr());
error = HandleLeaderData(aMessage, aMessageInfo);
@@ -2593,7 +2589,11 @@ otError Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInf
ChallengeTlv challenge;
int8_t diff;
otLogInfoMle(GetInstance(), "Received Parent Response");
// Source Address
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress));
VerifyOrExit(sourceAddress.IsValid(), error = OT_ERROR_PARSE);
LogMleMessage("Receive Parent Response", aMessageInfo.GetPeerAddr(), sourceAddress.GetRloc16());
// Response
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kResponse, sizeof(response), response));
@@ -2601,10 +2601,6 @@ otError Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInf
memcmp(response.GetResponse(), mParentRequest.mChallenge, response.GetLength()) == 0,
error = OT_ERROR_PARSE);
// Source Address
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress));
VerifyOrExit(sourceAddress.IsValid(), error = OT_ERROR_PARSE);
// Leader Data
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
@@ -2736,7 +2732,11 @@ otError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::MessageIn
Tlv tlv;
uint16_t offset;
otLogInfoMle(GetInstance(), "Received Child ID Response");
// Source Address
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress));
VerifyOrExit(sourceAddress.IsValid(), error = OT_ERROR_PARSE);
LogMleMessage("Receive Child ID Response", aMessageInfo.GetPeerAddr(), sourceAddress.GetRloc16());
VerifyOrExit(mParentRequestState == kChildIdRequest);
@@ -2744,10 +2744,6 @@ otError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::MessageIn
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
// Source Address
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress));
VerifyOrExit(sourceAddress.IsValid(), error = OT_ERROR_PARSE);
// ShortAddress
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kAddress16, sizeof(shortAddress), shortAddress));
VerifyOrExit(shortAddress.IsValid(), error = OT_ERROR_PARSE);
@@ -2852,11 +2848,12 @@ otError Mle::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Messag
uint8_t tlvs[kMaxResponseTlvs] = {};
uint8_t numTlvs = 0;
otLogInfoMle(GetInstance(), "Received Child Update Request from parent");
// Source Address
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress));
VerifyOrExit(sourceAddress.IsValid(), error = OT_ERROR_PARSE);
LogMleMessage("Receive Child Update Request from parent", aMessageInfo.GetPeerAddr(), sourceAddress.GetRloc16());
VerifyOrExit(mParent.GetRloc16() == sourceAddress.GetRloc16(), error = OT_ERROR_DROP);
// Leader Data, Network Data, Active Timestamp, Pending Timestamp
@@ -2898,7 +2895,7 @@ otError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::Messa
SourceAddressTlv sourceAddress;
TimeoutTlv timeout;
otLogInfoMle(GetInstance(), "Received Child Update Response from parent");
LogMleMessage("Receive Child Update Response from parent", aMessageInfo.GetPeerAddr());
// Status
if (Tlv::GetTlv(aMessage, Tlv::kStatus, sizeof(status), status) == OT_ERROR_NONE)
@@ -3006,7 +3003,7 @@ otError Mle::HandleAnnounce(const Message &aMessage, const Ip6::MessageInfo &aMe
const MeshCoP::Timestamp *localTimestamp;
PanIdTlv panid;
otLogInfoMle(GetInstance(), "Received announce");
LogMleMessage("Receive Announce", aMessageInfo.GetPeerAddr());
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kChannel, sizeof(channel), channel));
VerifyOrExit(channel.IsValid(), error = OT_ERROR_PARSE);
@@ -3060,7 +3057,7 @@ otError Mle::HandleDiscoveryResponse(const Message &aMessage, const Ip6::Message
uint16_t offset;
uint16_t end;
otLogInfoMle(GetInstance(), "Handle discovery response");
LogMleMessage("Receive Discovery Response", aMessageInfo.GetPeerAddr());
VerifyOrExit(mIsDiscoverInProgress, error = OT_ERROR_DROP);
@@ -3328,5 +3325,32 @@ Mle &Mle::GetOwner(const Context &aContext)
return mle;
}
void Mle::LogMleMessage(const char *aLogString, const Ip6::Address &aAddress) const
{
#if (OPENTHREAD_CONFIG_LOG_LEVEL >= OT_LOG_LEVEL_INFO) && (OPENTHREAD_CONFIG_LOG_MLE == 1)
char stringBuffer[Ip6::Address::kIp6AddressStringSize];
otLogInfoMle(GetInstance(), "%s (%s)",
aLogString, aAddress.ToString(stringBuffer, sizeof(stringBuffer)));
#endif // #if (OPENTHREAD_CONFIG_LOG_LEVEL >= OT_LOG_LEVEL_INFO) && (OPENTHREAD_CONFIG_LOG_MLE == 1)
OT_UNUSED_VARIABLE(aLogString);
OT_UNUSED_VARIABLE(aAddress);
}
void Mle::LogMleMessage(const char *aLogString, const Ip6::Address &aAddress, uint16_t aRloc) const
{
#if (OPENTHREAD_CONFIG_LOG_LEVEL >= OT_LOG_LEVEL_INFO) && (OPENTHREAD_CONFIG_LOG_MLE == 1)
char stringBuffer[Ip6::Address::kIp6AddressStringSize];
otLogInfoMle(GetInstance(), "%s (%s,0x%04x)",
aLogString, aAddress.ToString(stringBuffer, sizeof(stringBuffer)), aRloc);
#endif // #if (OPENTHREAD_CONFIG_LOG_LEVEL >= OT_LOG_LEVEL_INFO) && (OPENTHREAD_CONFIG_LOG_MLE == 1)
OT_UNUSED_VARIABLE(aLogString);
OT_UNUSED_VARIABLE(aAddress);
OT_UNUSED_VARIABLE(aRloc);
}
} // namespace Mle
} // namespace ot
+19 -1
View File
@@ -1289,6 +1289,25 @@ protected:
*/
otError AddDelayedResponse(Message &aMessage, const Ip6::Address &aDestination, uint16_t aDelay);
/**
* This method prints an MLE log message with an IPv6 address.
*
* @param[in] aLogMessage The log message string.
* @param[in] aAddress The IPv6 address of the peer.
*
*/
void LogMleMessage(const char *aLogMessage, const Ip6::Address &aAddress) const;
/**
* This method prints an MLE log message with an IPv6 address and RLOC16.
*
* @param[in] aLogMessage The log message string.
* @param[in] aAddress The IPv6 address of the peer.
* @param[in] aRloc The RLOC16.
*
*/
void LogMleMessage(const char *aLogMessage, const Ip6::Address &aAddress, uint16_t aRloc) const;
LeaderDataTlv mLeaderData; ///< Last received Leader Data TLV.
bool mRetrieveNewNetworkData; ///< Indicating new Network Data is needed if set.
@@ -1329,7 +1348,6 @@ protected:
uint8_t mLastPartitionRouterIdSequence;
uint32_t mLastPartitionId;
protected:
uint8_t mParentLeaderCost;
private:
+112 -76
View File
@@ -186,7 +186,7 @@ uint8_t MleRouter::AllocateRouterId(uint8_t aRouterId)
mRouterIdSequenceLastUpdated = TimerMilli::GetNow();
rval = aRouterId;
otLogInfoMle(GetInstance(), "add router id %d", aRouterId);
otLogInfoMle(GetInstance(), "Allocate router id %d", aRouterId);
exit:
return rval;
@@ -201,7 +201,7 @@ otError MleRouter::ReleaseRouterId(uint8_t aRouterId)
VerifyOrExit(router != NULL, error = OT_ERROR_INVALID_ARGS);
VerifyOrExit(mRole == OT_DEVICE_ROLE_LEADER, error = OT_ERROR_INVALID_STATE);
otLogInfoMle(GetInstance(), "delete router id %d", aRouterId);
otLogInfoMle(GetInstance(), "Release router id %d", aRouterId);
router->SetAllocated(false);
router->SetReclaimDelay(true);
router->SetState(Neighbor::kStateInvalid);
@@ -240,6 +240,8 @@ otError MleRouter::BecomeRouter(ThreadStatusTlv::Status aStatus)
VerifyOrExit(mRole != OT_DEVICE_ROLE_ROUTER, error = OT_ERROR_NONE);
VerifyOrExit(IsRouterRoleEnabled(), error = OT_ERROR_NOT_CAPABLE);
otLogInfoMle(GetInstance(), "Attempt to become router");
for (int i = 0; i <= kMaxRouterId; i++)
{
mRouters[i].SetAllocated(false);
@@ -452,7 +454,7 @@ otError MleRouter::SetStateRouter(uint16_t aRloc16)
}
}
otLogInfoMle(GetInstance(), "Mode -> Router");
otLogInfoMle(GetInstance(), "Role -> Router");
return OT_ERROR_NONE;
}
@@ -496,7 +498,7 @@ otError MleRouter::SetStateLeader(uint16_t aRloc16)
}
}
otLogInfoMle(GetInstance(), "Mode -> Leader %d", mLeaderData.GetPartitionId());
otLogInfoMle(GetInstance(), "Role -> Leader %d", mLeaderData.GetPartitionId());
return OT_ERROR_NONE;
}
@@ -572,7 +574,7 @@ otError MleRouter::SendAdvertisement(void)
destination.mFields.m16[7] = HostSwap16(0x0001);
SuccessOrExit(error = SendMessage(*message, destination));
otLogInfoMle(GetInstance(), "Sent advertisement");
LogMleMessage("Send Advertisement", destination);
exit:
@@ -670,7 +672,7 @@ otError MleRouter::SendLinkRequest(Neighbor *aNeighbor)
SuccessOrExit(error = SendMessage(*message, destination));
otLogInfoMle(GetInstance(), "Sent link request");
LogMleMessage("Send Link Request", destination);
exit:
@@ -694,7 +696,7 @@ otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Message
TlvRequestTlv tlvRequest;
uint16_t rloc16;
otLogInfoMle(GetInstance(), "Received link request");
LogMleMessage("Receive Link Request", aMessageInfo.GetPeerAddr());
VerifyOrExit(mRole == OT_DEVICE_ROLE_ROUTER || mRole == OT_DEVICE_ROLE_LEADER, error = OT_ERROR_INVALID_STATE);
@@ -851,13 +853,13 @@ otError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neighbor
SuccessOrExit(error = AddDelayedResponse(*message, aMessageInfo.GetPeerAddr(),
(otPlatRandomGet() % kMaxResponseDelay) + 1));
otLogInfoMle(GetInstance(), "Delayed link accept");
LogMleMessage("Delay Link Accept", aMessageInfo.GetPeerAddr());
}
else
{
SuccessOrExit(error = SendMessage(*message, aMessageInfo.GetPeerAddr()));
otLogInfoMle(GetInstance(), "Sent link accept");
LogMleMessage("Send Link Accept", aMessageInfo.GetPeerAddr());
}
exit:
@@ -873,14 +875,12 @@ exit:
otError MleRouter::HandleLinkAccept(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo,
uint32_t aKeySequence)
{
otLogInfoMle(GetInstance(), "Received link accept");
return HandleLinkAccept(aMessage, aMessageInfo, aKeySequence, false);
}
otError MleRouter::HandleLinkAcceptAndRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo,
uint32_t aKeySequence)
{
otLogInfoMle(GetInstance(), "Received link accept and request");
return HandleLinkAccept(aMessage, aMessageInfo, aKeySequence, true);
}
@@ -909,6 +909,19 @@ otError MleRouter::HandleLinkAccept(const Message &aMessage, const Ip6::MessageI
aMessageInfo.GetPeerAddr().ToExtAddress(macAddr);
// Source Address
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress));
VerifyOrExit(sourceAddress.IsValid(), error = OT_ERROR_PARSE);
if (aRequest)
{
LogMleMessage("Receive Link Accept and Request", aMessageInfo.GetPeerAddr(), sourceAddress.GetRloc16());
}
else
{
LogMleMessage("Receive Link Accept", aMessageInfo.GetPeerAddr(), sourceAddress.GetRloc16());
}
// Version
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kVersion, sizeof(version), version));
VerifyOrExit(version.IsValid(), error = OT_ERROR_PARSE);
@@ -917,10 +930,6 @@ otError MleRouter::HandleLinkAccept(const Message &aMessage, const Ip6::MessageI
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kResponse, sizeof(response), response));
VerifyOrExit(response.IsValid(), error = OT_ERROR_PARSE);
// Source Address
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress));
VerifyOrExit(sourceAddress.IsValid(), error = OT_ERROR_PARSE);
// Remove stale neighbors
if ((neighbor = GetNeighbor(macAddr)) != NULL &&
neighbor->GetRloc16() != sourceAddress.GetRloc16())
@@ -1327,9 +1336,8 @@ otError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Messa
if (partitionId != mLeaderData.GetPartitionId())
{
otLogDebgMle(GetInstance(), "different partition! %d %d %d %d",
leaderData.GetWeighting(), partitionId,
mLeaderData.GetWeighting(), mLeaderData.GetPartitionId());
otLogInfoMle(GetInstance(), "Different partition (peer:%d, local:%d)",
leaderData.GetPartitionId(), mLeaderData.GetPartitionId());
if (partitionId == mLastPartitionId && (mDeviceMode & ModeTlv::kModeFFD))
{
@@ -1355,7 +1363,6 @@ otError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Messa
if (ComparePartitions(routerCount <= 1, leaderData, IsSingleton(), mLeaderData) > 0)
{
otLogDebgMle(GetInstance(), "trying to migrate");
BecomeChild(kAttachBetter);
}
@@ -1365,6 +1372,7 @@ otError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Messa
{
if (mRole != OT_DEVICE_ROLE_CHILD)
{
otLogInfoMle(GetInstance(), "Leader ID mismatch");
BecomeDetached();
error = OT_ERROR_DROP;
}
@@ -1509,6 +1517,7 @@ otError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Messa
// router is not in list, reject
if (!router->IsAllocated())
{
otLogInfoMle(GetInstance(), "Router ID not allocated");
ExitNow(error = OT_ERROR_NO_ROUTE);
}
@@ -1674,7 +1683,7 @@ otError MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::Messa
ChallengeTlv challenge;
Child *child;
otLogInfoMle(GetInstance(), "Received parent request");
LogMleMessage("Receive Parent Request", aMessageInfo.GetPeerAddr());
// A Router MUST NOT send an MLE Parent Response if:
@@ -1816,12 +1825,14 @@ void MleRouter::HandleStateUpdateTimer(void)
if (GetLeaderAge() >= mNetworkIdTimeout)
{
otLogInfoMle(GetInstance(), "Router ID Sequence timeout");
BecomeChild(kAttachSame1);
}
if (routerStateUpdate && GetActiveRouterCount() > mRouterDowngradeThreshold)
{
// downgrade to REED
otLogInfoMle(GetInstance(), "Downgrade to REED");
BecomeChild(kAttachSame1);
}
@@ -1847,7 +1858,7 @@ void MleRouter::HandleStateUpdateTimer(void)
{
if (mChildren[i].GetState() == Neighbor::kStateRestored)
{
SendChildUpdateRequest(&mChildren[i]);
SendChildUpdateRequest(mChildren[i]);
hasRestoringChildren = true;
}
}
@@ -1884,6 +1895,7 @@ void MleRouter::HandleStateUpdateTimer(void)
if ((TimerMilli::GetNow() - mChildren[i].GetLastHeard()) >= timeout)
{
otLogInfoMle(GetInstance(), "Child timeout expired");
RemoveNeighbor(mChildren[i]);
}
}
@@ -1900,6 +1912,7 @@ void MleRouter::HandleStateUpdateTimer(void)
if (age >= TimerMilli::SecToMsec(kMaxNeighborAge))
{
otLogInfoMle(GetInstance(), "Router timeout expired");
RemoveNeighbor(router);
}
@@ -1908,6 +1921,7 @@ void MleRouter::HandleStateUpdateTimer(void)
if (age >= TimerMilli::SecToMsec(kMaxNeighborAge) &&
age < TimerMilli::SecToMsec(kMaxNeighborAge) + kStateUpdatePeriod)
{
otLogInfoMle(GetInstance(), "Router timeout expired");
SendLinkRequest(&router);
}
else if (age >= TimerMilli::SecToMsec(kMaxNeighborAge) + kMaxLinkRequestTimeout)
@@ -1921,6 +1935,7 @@ void MleRouter::HandleStateUpdateTimer(void)
{
if (age >= kMaxLinkRequestTimeout)
{
otLogInfoMle(GetInstance(), "Link Request timeout expired");
RemoveNeighbor(router);
}
}
@@ -1933,6 +1948,7 @@ void MleRouter::HandleStateUpdateTimer(void)
GetLinkCost(i) >= kMaxRouteCost &&
age >= TimerMilli::SecToMsec(kMaxLeaderToRouterTimeout))
{
otLogInfoMle(GetInstance(), "Router ID timeout expired (no route)");
ReleaseRouterId(i);
}
}
@@ -1995,7 +2011,7 @@ otError MleRouter::SendParentResponse(Child *aChild, const ChallengeTlv &challen
SuccessOrExit(error = AddDelayedResponse(*message, destination, delay));
otLogInfoMle(GetInstance(), "Delayed Parent Response");
LogMleMessage("Delay Parent Response", destination);
exit:
@@ -2103,7 +2119,7 @@ otError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6::Mess
Child *child;
uint8_t numTlvs;
otLogInfoMle(GetInstance(), "Received Child ID Request");
LogMleMessage("Receive Child ID Request", aMessageInfo.GetPeerAddr());
// only process message when operating as a child, router, or leader
VerifyOrExit(mRole >= OT_DEVICE_ROLE_CHILD, error = OT_ERROR_INVALID_STATE);
@@ -2254,7 +2270,7 @@ otError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6::Mess
case OT_DEVICE_ROLE_ROUTER:
case OT_DEVICE_ROLE_LEADER:
SuccessOrExit(error = SendChildIdResponse(child));
SuccessOrExit(error = SendChildIdResponse(*child));
break;
}
@@ -2279,7 +2295,7 @@ otError MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::
uint8_t tlvs[kMaxResponseTlvs];
uint8_t tlvslength = 0;
otLogInfoMle(GetInstance(), "Received Child Update Request from child");
LogMleMessage("Receive Child Update Request from child", aMessageInfo.GetPeerAddr());
// Mode
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kMode, sizeof(mode), mode));
@@ -2365,7 +2381,7 @@ otError MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::
if (child->IsStateRestoring())
{
SetChildStateToValid(child);
SetChildStateToValid(*child);
child->SetKeySequence(aKeySequence);
}
@@ -2390,20 +2406,32 @@ otError MleRouter::HandleChildUpdateResponse(const Message &aMessage, const Ip6:
LeaderDataTlv leaderData;
Child *child;
otLogInfoMle(GetInstance(), "Received Child Update Response from child");
// Find Child
aMessageInfo.GetPeerAddr().ToExtAddress(macAddr);
VerifyOrExit((child = FindChild(macAddr)) != NULL, error = OT_ERROR_NOT_FOUND);
child = FindChild(macAddr);
if (child == NULL)
{
LogMleMessage("Receive Child Update Response from unknown child", aMessageInfo.GetPeerAddr());
ExitNow(error = OT_ERROR_NOT_FOUND);
}
// Source Address
if (Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress) == OT_ERROR_NONE)
{
VerifyOrExit(sourceAddress.IsValid(), error = OT_ERROR_PARSE);
VerifyOrExit(child->GetRloc16() == sourceAddress.GetRloc16(), error = OT_ERROR_PARSE);
if (child->GetRloc16() != sourceAddress.GetRloc16())
{
LogMleMessage("Receive Child Update Response from unknown child", aMessageInfo.GetPeerAddr(),
sourceAddress.GetRloc16());
ExitNow(error = OT_ERROR_PARSE);
}
}
LogMleMessage("Receive Child Update Response from child", aMessageInfo.GetPeerAddr(), child->GetRloc16());
// Response
if (Tlv::GetTlv(aMessage, Tlv::kResponse, sizeof(response), response) == OT_ERROR_NONE)
{
@@ -2455,7 +2483,7 @@ otError MleRouter::HandleChildUpdateResponse(const Message &aMessage, const Ip6:
}
}
SetChildStateToValid(child);
SetChildStateToValid(*child);
child->SetLastHeard(TimerMilli::GetNow());
child->SetKeySequence(aKeySequence);
child->GetLinkInfo().AddRss(GetNetif().GetMac().GetNoiseFloor(), linkInfo->mRss);
@@ -2474,7 +2502,7 @@ otError MleRouter::HandleDataRequest(const Message &aMessage, const Ip6::Message
uint8_t tlvs[4];
uint8_t numTlvs;
otLogInfoMle(GetInstance(), "Received Data Request");
LogMleMessage("Receive Data Request", aMessageInfo.GetPeerAddr());
// TLV Request
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kTlvRequest, sizeof(tlvRequest), tlvRequest));
@@ -2547,15 +2575,15 @@ void MleRouter::SynchronizeChildNetworkData(void)
for (uint8_t i = 0; i < mMaxChildrenAllowed; i++)
{
Child *child = &mChildren[i];
Child &child = mChildren[i];
uint8_t version;
if (child->GetState() != Neighbor::kStateValid || child->IsRxOnWhenIdle())
if (child.GetState() != Neighbor::kStateValid || child.IsRxOnWhenIdle())
{
continue;
}
if (child->IsFullNetworkData())
if (child.IsFullNetworkData())
{
version = netif.GetNetworkDataLeader().GetVersion();
}
@@ -2564,7 +2592,7 @@ void MleRouter::SynchronizeChildNetworkData(void)
version = netif.GetNetworkDataLeader().GetStableVersion();
}
if (child->GetNetworkDataVersion() == version)
if (child.GetNetworkDataVersion() == version)
{
continue;
}
@@ -2620,7 +2648,7 @@ otError MleRouter::HandleDiscoveryRequest(const Message &aMessage, const Ip6::Me
uint16_t offset;
uint16_t end;
otLogInfoMle(GetInstance(), "Received discovery request");
LogMleMessage("Receive Discovery Request", aMessageInfo.GetPeerAddr());
// only Routers and REEDs respond
VerifyOrExit((mDeviceMode & ModeTlv::kModeFFD) != 0, error = OT_ERROR_INVALID_STATE);
@@ -2767,7 +2795,7 @@ otError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, uint1
SuccessOrExit(error = AddDelayedResponse(*message, aDestination, delay));
otLogInfoMle(GetInstance(), "Sent discovery response");
LogMleMessage("Delay Discovery Response", aDestination);
exit:
@@ -2779,7 +2807,7 @@ exit:
return error;
}
otError MleRouter::SendChildIdResponse(Child *aChild)
otError MleRouter::SendChildIdResponse(Child &aChild)
{
ThreadNetif &netif = GetNetif();
otError error = OT_ERROR_NONE;
@@ -2793,7 +2821,7 @@ otError MleRouter::SendChildIdResponse(Child *aChild)
SuccessOrExit(error = AppendActiveTimestamp(*message));
SuccessOrExit(error = AppendPendingTimestamp(*message));
if (aChild->GetRloc16() == 0)
if (aChild.GetRloc16() == 0)
{
// pick next Child ID that is not being used
do
@@ -2808,17 +2836,17 @@ otError MleRouter::SendChildIdResponse(Child *aChild)
while (FindChild(mNextChildId) != NULL);
// allocate Child ID
aChild->SetRloc16(netif.GetMac().GetShortAddress() | mNextChildId);
aChild.SetRloc16(netif.GetMac().GetShortAddress() | mNextChildId);
}
SuccessOrExit(error = AppendAddress16(*message, aChild->GetRloc16()));
SuccessOrExit(error = AppendAddress16(*message, aChild.GetRloc16()));
for (uint8_t i = 0; i < Child::kMaxRequestTlvs; i++)
{
switch (aChild->GetRequestTlv(i))
switch (aChild.GetRequestTlv(i))
{
case Tlv::kNetworkData:
SuccessOrExit(error = AppendNetworkData(*message, !aChild->IsFullNetworkData()));
SuccessOrExit(error = AppendNetworkData(*message, !aChild.IsFullNetworkData()));
break;
case Tlv::kRoute:
@@ -2838,24 +2866,24 @@ otError MleRouter::SendChildIdResponse(Child *aChild)
}
}
if (!aChild->IsFullThreadDevice())
if (!aChild.IsFullThreadDevice())
{
SuccessOrExit(error = AppendChildAddresses(*message, *aChild));
SuccessOrExit(error = AppendChildAddresses(*message, aChild));
}
SetChildStateToValid(aChild);
if (!aChild->IsRxOnWhenIdle())
if (!aChild.IsRxOnWhenIdle())
{
netif.GetMeshForwarder().GetSourceMatchController().SetSrcMatchAsShort(*aChild, false);
netif.GetMeshForwarder().GetSourceMatchController().SetSrcMatchAsShort(aChild, false);
}
memset(&destination, 0, sizeof(destination));
destination.mFields.m16[0] = HostSwap16(0xfe80);
destination.SetIid(aChild->GetExtAddress());
destination.SetIid(aChild.GetExtAddress());
SuccessOrExit(error = SendMessage(*message, destination));
otLogInfoMle(GetInstance(), "Sent Child ID Response");
LogMleMessage("Send Child ID Response", destination, aChild.GetRloc16());
exit:
@@ -2867,7 +2895,7 @@ exit:
return error;
}
otError MleRouter::SendChildUpdateRequest(Child *aChild)
otError MleRouter::SendChildUpdateRequest(Child &aChild)
{
static const uint8_t tlvs[] = {Tlv::kTimeout, Tlv::kAddressRegistration};
ThreadNetif &netif = GetNetif();
@@ -2875,9 +2903,9 @@ otError MleRouter::SendChildUpdateRequest(Child *aChild)
Ip6::Address destination;
Message *message;
if (!aChild->IsRxOnWhenIdle())
if (!aChild.IsRxOnWhenIdle())
{
uint8_t childIndex = netif.GetMle().GetChildIndex(*aChild);
uint8_t childIndex = netif.GetMle().GetChildIndex(aChild);
// No need to send "Child Update Request" to the sleepy child if there is one already queued for it.
for (message = netif.GetMeshForwarder().GetSendQueue().GetHead(); message; message = message->GetNext())
@@ -2894,29 +2922,29 @@ otError MleRouter::SendChildUpdateRequest(Child *aChild)
SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateRequest));
SuccessOrExit(error = AppendSourceAddress(*message));
SuccessOrExit(error = AppendLeaderData(*message));
SuccessOrExit(error = AppendNetworkData(*message, !aChild->IsFullNetworkData()));
SuccessOrExit(error = AppendNetworkData(*message, !aChild.IsFullNetworkData()));
SuccessOrExit(error = AppendActiveTimestamp(*message));
SuccessOrExit(error = AppendPendingTimestamp(*message));
if (aChild->GetState() != Neighbor::kStateValid)
if (aChild.GetState() != Neighbor::kStateValid)
{
SuccessOrExit(error = AppendTlvRequest(*message, tlvs, sizeof(tlvs)));
aChild->GenerateChallenge();
SuccessOrExit(error = AppendChallenge(*message, aChild->GetChallenge(), aChild->GetChallengeSize()));
aChild.GenerateChallenge();
SuccessOrExit(error = AppendChallenge(*message, aChild.GetChallenge(), aChild.GetChallengeSize()));
}
memset(&destination, 0, sizeof(destination));
destination.mFields.m16[0] = HostSwap16(0xfe80);
destination.SetIid(aChild->GetExtAddress());
destination.SetIid(aChild.GetExtAddress());
SuccessOrExit(error = SendMessage(*message, destination));
if (aChild->IsRxOnWhenIdle())
if (aChild.IsRxOnWhenIdle())
{
// only try to send a single Child Update Request message to an rx-on-when-idle child
aChild->SetState(Child::kStateChildUpdateRequest);
aChild.SetState(Child::kStateChildUpdateRequest);
}
otLogInfoMle(GetInstance(), "Sent Child Update Request to child");
LogMleMessage("Send Child Update Request to child", destination, aChild.GetRloc16());
exit:
@@ -2988,7 +3016,15 @@ otError MleRouter::SendChildUpdateResponse(Child *aChild, const Ip6::MessageInfo
SuccessOrExit(error = SendMessage(*message, aMessageInfo.GetPeerAddr()));
otLogInfoMle(GetInstance(), "Sent Child Update Response to child");
if (aChild == NULL)
{
LogMleMessage("Send Child Update Response to child", aMessageInfo.GetPeerAddr());
}
else
{
LogMleMessage("Send Child Update Response to child", aMessageInfo.GetPeerAddr(), aChild->GetRloc16());
}
exit:
@@ -3038,14 +3074,14 @@ otError MleRouter::SendDataResponse(const Ip6::Address &aDestination, const uint
if (aDelay)
{
SuccessOrExit(error = AddDelayedResponse(*message, aDestination, aDelay));
LogMleMessage("Delay Data Response", aDestination);
}
else
{
SuccessOrExit(error = SendMessage(*message, aDestination));
LogMleMessage("Send Data Response", aDestination);
}
otLogInfoMle(GetInstance(), "Sent Data Response");
exit:
if (error != OT_ERROR_NONE && message != NULL)
@@ -3902,7 +3938,7 @@ otError MleRouter::SendAddressSolicit(ThreadStatusTlv::Status aStatus)
SuccessOrExit(error = netif.GetCoap().SendMessage(*message, messageInfo,
&MleRouter::HandleAddressSolicitResponse, this));
otLogInfoMle(GetInstance(), "Sent address solicit to %04x", HostSwap16(messageInfo.GetPeerAddr().mFields.m16[7]));
LogMleMessage("Send Address Solicit", messageInfo.GetPeerAddr());
exit:
@@ -3944,7 +3980,7 @@ otError MleRouter::SendAddressRelease(void)
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = netif.GetCoap().SendMessage(*message, messageInfo));
otLogInfoMle(GetInstance(), "Sent address release");
LogMleMessage("Send Address Release", messageInfo.GetPeerAddr());
exit:
@@ -3982,7 +4018,7 @@ void MleRouter::HandleAddressSolicitResponse(Coap::Header *aHeader, Message *aMe
VerifyOrExit(aHeader->GetCode() == OT_COAP_CODE_CHANGED);
otLogInfoMle(GetInstance(), "Received address reply");
LogMleMessage("Receive Address Reply", aMessageInfo->GetPeerAddr());
SuccessOrExit(ThreadTlv::GetTlv(*aMessage, ThreadTlv::kStatus, sizeof(statusTlv), statusTlv));
VerifyOrExit(statusTlv.IsValid());
@@ -4064,7 +4100,7 @@ void MleRouter::HandleAddressSolicitResponse(Coap::Header *aHeader, Message *aMe
switch (mChildren[i].GetState())
{
case Neighbor::kStateChildIdRequest:
SendChildIdResponse(&mChildren[i]);
SendChildIdResponse(mChildren[i]);
break;
case Neighbor::kStateLinkRequest:
@@ -4104,7 +4140,7 @@ void MleRouter::HandleAddressSolicit(Coap::Header &aHeader, Message &aMessage, c
VerifyOrExit(aHeader.GetType() == OT_COAP_TYPE_CONFIRMABLE && aHeader.GetCode() == OT_COAP_CODE_POST,
error = OT_ERROR_PARSE);
otLogInfoMle(GetInstance(), "Received address solicit");
LogMleMessage("Receive Address Solicit", aMessageInfo.GetPeerAddr());
SuccessOrExit(error = ThreadTlv::GetTlv(aMessage, ThreadTlv::kExtMacAddress, sizeof(macAddr64Tlv), macAddr64Tlv));
VerifyOrExit(macAddr64Tlv.IsValid(), error = OT_ERROR_PARSE);
@@ -4237,7 +4273,7 @@ void MleRouter::SendAddressSolicitResponse(const Coap::Header &aRequestHeader, u
SuccessOrExit(error = netif.GetCoap().SendMessage(*message, aMessageInfo));
otLogInfoMle(GetInstance(), "Sent address reply");
LogMleMessage("Send Address Reply", aMessageInfo.GetPeerAddr());
exit:
@@ -4266,7 +4302,7 @@ void MleRouter::HandleAddressRelease(Coap::Header &aHeader, Message &aMessage,
VerifyOrExit(aHeader.GetType() == OT_COAP_TYPE_CONFIRMABLE &&
aHeader.GetCode() == OT_COAP_CODE_POST);
otLogInfoMle(GetInstance(), "Received address release");
LogMleMessage("Receive Address Release", aMessageInfo.GetPeerAddr());
SuccessOrExit(ThreadTlv::GetTlv(aMessage, ThreadTlv::kRloc16, sizeof(rlocTlv), rlocTlv));
VerifyOrExit(rlocTlv.IsValid());
@@ -4284,7 +4320,7 @@ void MleRouter::HandleAddressRelease(Coap::Header &aHeader, Message &aMessage,
SuccessOrExit(GetNetif().GetCoap().SendEmptyAck(aHeader, aMessageInfo));
otLogInfoMle(GetInstance(), "Sent address release response");
LogMleMessage("Send Address Release Reply", aMessageInfo.GetPeerAddr());
exit:
return;
@@ -4627,13 +4663,13 @@ exit:
return rval;
}
void MleRouter::SetChildStateToValid(Child *aChild)
void MleRouter::SetChildStateToValid(Child &aChild)
{
VerifyOrExit(aChild->GetState() != Neighbor::kStateValid);
VerifyOrExit(aChild.GetState() != Neighbor::kStateValid);
aChild->SetState(Neighbor::kStateValid);
aChild.SetState(Neighbor::kStateValid);
GetNetif().SetStateChangedFlags(OT_CHANGED_THREAD_CHILD_ADDED);
StoreChild(aChild->GetRloc16());
StoreChild(aChild.GetRloc16());
exit:
return;
+3 -3
View File
@@ -750,8 +750,8 @@ private:
otError SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor,
const TlvRequestTlv &aTlvRequest, const ChallengeTlv &aChallenge);
otError SendParentResponse(Child *aChild, const ChallengeTlv &aChallenge, bool aRoutersOnlyRequest);
otError SendChildIdResponse(Child *aChild);
otError SendChildUpdateRequest(Child *aChild);
otError SendChildIdResponse(Child &aChild);
otError SendChildUpdateRequest(Child &aChild);
otError SendChildUpdateResponse(Child *aChild, const Ip6::MessageInfo &aMessageInfo,
const uint8_t *aTlvs, uint8_t aTlvsLength, const ChallengeTlv *challenge);
otError SendDataResponse(const Ip6::Address &aDestination, const uint8_t *aTlvs, uint8_t aTlvsLength,
@@ -782,7 +782,7 @@ private:
Child *FindChild(uint16_t aChildId);
Child *FindChild(const Mac::ExtAddress &aMacAddr);
void SetChildStateToValid(Child *aChild);
void SetChildStateToValid(Child &aChild);
bool HasChildren(void);
void RemoveChildren(void);
bool HasMinDowngradeNeighborRouters(void);