mirror of
https://github.com/espressif/openthread.git
synced 2026-09-05 16:50:05 +00:00
Implement Network Data TLV in Child Update messages. (#659)
This commit is contained in:
+28
-6
@@ -2026,6 +2026,7 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
|
||||
LeaderDataTlv leaderData;
|
||||
SourceAddressTlv sourceAddress;
|
||||
TimeoutTlv timeout;
|
||||
NetworkDataTlv networkData;
|
||||
uint8_t tlvs[] = {Tlv::kNetworkData};
|
||||
|
||||
otLogInfoMle("Received Child Update Response\n");
|
||||
@@ -2061,11 +2062,6 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
|
||||
VerifyOrExit(leaderData.IsValid(), error = kThreadError_Parse);
|
||||
|
||||
if (static_cast<int8_t>(leaderData.GetDataVersion() - mNetworkData.GetVersion()) > 0)
|
||||
{
|
||||
SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs));
|
||||
}
|
||||
|
||||
// Source Address
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress));
|
||||
VerifyOrExit(sourceAddress.IsValid(), error = kThreadError_Parse);
|
||||
@@ -2083,7 +2079,16 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
|
||||
mTimeout = timeout.GetTimeout();
|
||||
}
|
||||
|
||||
if ((mode.GetMode() & ModeTlv::kModeRxOnWhenIdle) == 0)
|
||||
// Network Data optional
|
||||
if (Tlv::GetTlv(aMessage, Tlv::kNetworkData, sizeof(networkData), networkData) == kThreadError_None)
|
||||
{
|
||||
VerifyOrExit(networkData.IsValid(), error = kThreadError_Parse);
|
||||
mNetworkData.SetNetworkData(leaderData.GetDataVersion(), leaderData.GetStableDataVersion(),
|
||||
(mDeviceMode & ModeTlv::kModeFullNetworkData) == 0,
|
||||
networkData.GetNetworkData(), networkData.GetLength());
|
||||
}
|
||||
|
||||
if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) == 0)
|
||||
{
|
||||
mMesh.SetPollPeriod(Timer::SecToMsec(mTimeout / kMaxChildKeepAliveAttempts));
|
||||
mMesh.SetRxOnWhenIdle(false);
|
||||
@@ -2093,6 +2098,23 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
|
||||
mMesh.SetRxOnWhenIdle(true);
|
||||
}
|
||||
|
||||
if (mDeviceMode & ModeTlv::kModeFullNetworkData)
|
||||
{
|
||||
// full network data
|
||||
if (leaderData.GetDataVersion() != mNetworkData.GetVersion())
|
||||
{
|
||||
SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// stable network data
|
||||
if (leaderData.GetStableDataVersion() != mNetworkData.GetStableVersion())
|
||||
{
|
||||
SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs));
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user