Remove reference usage to reduce RAM usage. (#1180)

- Rather than maintaining references to a number of commonly-used objects,
  only maintain a single reference to the primary `ThreadNetif` object.

- This trades RAM for code size, as additional code is required to acquire
  objects from the ThreadNetif object.
This commit is contained in:
Jonathan Hui
2017-01-22 18:27:26 -08:00
committed by GitHub
parent ff45ea430c
commit 50db58ddce
47 changed files with 540 additions and 621 deletions
+20 -22
View File
@@ -107,8 +107,6 @@ Mac::Mac(ThreadNetif &aThreadNetif):
mMacTimer(aThreadNetif.GetIp6().mTimerScheduler, &Mac::HandleMacTimer, this),
mBackoffTimer(aThreadNetif.GetIp6().mTimerScheduler, &Mac::HandleBeginTransmit, this),
mReceiveTimer(aThreadNetif.GetIp6().mTimerScheduler, &Mac::HandleReceiveTimer, this),
mKeyManager(aThreadNetif.GetKeyManager()),
mMle(aThreadNetif.GetMle()),
mNetif(aThreadNetif),
mEnergyScanSampleRssiTask(aThreadNetif.GetIp6().mTaskletScheduler, &Mac::HandleEnergyScanSampleRssi, this),
mWhitelist(),
@@ -669,17 +667,17 @@ void Mac::ProcessTransmitSecurity(Frame &aFrame)
switch (keyIdMode)
{
case Frame::kKeyIdMode0:
key = mKeyManager.GetKek();
frameCounter = mKeyManager.GetKekFrameCounter();
mKeyManager.IncrementKekFrameCounter();
key = mNetif.GetKeyManager().GetKek();
frameCounter = mNetif.GetKeyManager().GetKekFrameCounter();
mNetif.GetKeyManager().IncrementKekFrameCounter();
extAddress = &mExtAddress;
break;
case Frame::kKeyIdMode1:
key = mKeyManager.GetCurrentMacKey();
frameCounter = mKeyManager.GetMacFrameCounter();
mKeyManager.IncrementMacFrameCounter();
aFrame.SetKeyId((mKeyManager.GetCurrentKeySequence() & 0x7f) + 1);
key = mNetif.GetKeyManager().GetCurrentMacKey();
frameCounter = mNetif.GetKeyManager().GetMacFrameCounter();
mNetif.GetKeyManager().IncrementMacFrameCounter();
aFrame.SetKeyId((mNetif.GetKeyManager().GetCurrentKeySequence() & 0x7f) + 1);
extAddress = &mExtAddress;
break;
@@ -1064,7 +1062,7 @@ ThreadError Mac::ProcessReceiveSecurity(Frame &aFrame, const Address &aSrcAddr,
switch (keyIdMode)
{
case Frame::kKeyIdMode0:
VerifyOrExit((macKey = mKeyManager.GetKek()) != NULL, error = kThreadError_Security);
VerifyOrExit((macKey = mNetif.GetKeyManager().GetKek()) != NULL, error = kThreadError_Security);
extAddress = &aSrcAddr.mExtAddress;
break;
@@ -1074,23 +1072,23 @@ ThreadError Mac::ProcessReceiveSecurity(Frame &aFrame, const Address &aSrcAddr,
aFrame.GetKeyId(keyid);
keyid--;
if (keyid == (mKeyManager.GetCurrentKeySequence() & 0x7f))
if (keyid == (mNetif.GetKeyManager().GetCurrentKeySequence() & 0x7f))
{
// same key index
keySequence = mKeyManager.GetCurrentKeySequence();
macKey = mKeyManager.GetCurrentMacKey();
keySequence = mNetif.GetKeyManager().GetCurrentKeySequence();
macKey = mNetif.GetKeyManager().GetCurrentMacKey();
}
else if (keyid == ((mKeyManager.GetCurrentKeySequence() - 1) & 0x7f))
else if (keyid == ((mNetif.GetKeyManager().GetCurrentKeySequence() - 1) & 0x7f))
{
// previous key index
keySequence = mKeyManager.GetCurrentKeySequence() - 1;
macKey = mKeyManager.GetTemporaryMacKey(keySequence);
keySequence = mNetif.GetKeyManager().GetCurrentKeySequence() - 1;
macKey = mNetif.GetKeyManager().GetTemporaryMacKey(keySequence);
}
else if (keyid == ((mKeyManager.GetCurrentKeySequence() + 1) & 0x7f))
else if (keyid == ((mNetif.GetKeyManager().GetCurrentKeySequence() + 1) & 0x7f))
{
// next key index
keySequence = mKeyManager.GetCurrentKeySequence() + 1;
macKey = mKeyManager.GetTemporaryMacKey(keySequence);
keySequence = mNetif.GetKeyManager().GetCurrentKeySequence() + 1;
macKey = mNetif.GetKeyManager().GetTemporaryMacKey(keySequence);
}
else
{
@@ -1149,9 +1147,9 @@ ThreadError Mac::ProcessReceiveSecurity(Frame &aFrame, const Address &aSrcAddr,
aNeighbor->mValid.mLinkFrameCounter = frameCounter + 1;
if (keySequence > mKeyManager.GetCurrentKeySequence())
if (keySequence > mNetif.GetKeyManager().GetCurrentKeySequence())
{
mKeyManager.SetCurrentKeySequence(keySequence);
mNetif.GetKeyManager().SetCurrentKeySequence(keySequence);
}
}
@@ -1198,7 +1196,7 @@ void Mac::ReceiveDoneTask(Frame *aFrame, ThreadError aError)
SuccessOrExit(error = aFrame->ValidatePsdu());
aFrame->GetSrcAddr(srcaddr);
neighbor = mMle.GetNeighbor(srcaddr);
neighbor = mNetif.GetMle().GetNeighbor(srcaddr);
switch (srcaddr.mLength)
{
-2
View File
@@ -609,8 +609,6 @@ private:
Timer mBackoffTimer;
Timer mReceiveTimer;
KeyManager &mKeyManager;
Mle::MleRouter &mMle;
ThreadNetif &mNetif;
ExtAddress mExtAddress;
+3 -4
View File
@@ -52,8 +52,7 @@
namespace Thread {
AnnounceBeginClient::AnnounceBeginClient(ThreadNetif &aThreadNetif) :
mNetif(aThreadNetif),
mCoapClient(aThreadNetif.GetCoapClient())
mNetif(aThreadNetif)
{
}
@@ -76,7 +75,7 @@ ThreadError AnnounceBeginClient::SendRequest(uint32_t aChannelMask, uint8_t aCou
header.AppendUriPathOptions(OPENTHREAD_URI_ANNOUNCE_BEGIN);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
sessionId.Init();
sessionId.SetCommissionerSessionId(mNetif.GetCommissioner().GetSessionId());
@@ -98,7 +97,7 @@ ThreadError AnnounceBeginClient::SendRequest(uint32_t aChannelMask, uint8_t aCou
messageInfo.SetPeerPort(kCoapUdpPort);
messageInfo.SetInterfaceId(mNetif.GetInterfaceId());
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMeshCoP("sent announce begin query");
@@ -73,7 +73,6 @@ public:
private:
ThreadNetif &mNetif;
Coap::Client &mCoapClient;
};
/**
+28 -29
View File
@@ -73,15 +73,12 @@ Commissioner::Commissioner(ThreadNetif &aThreadNetif):
mRelayReceive(OPENTHREAD_URI_RELAY_RX, &Commissioner::HandleRelayReceive, this),
mDatasetChanged(OPENTHREAD_URI_DATASET_CHANGED, &Commissioner::HandleDatasetChanged, this),
mJoinerFinalize(OPENTHREAD_URI_JOINER_FINALIZE, &Commissioner::HandleJoinerFinalize, this),
mCoapServer(aThreadNetif.GetCoapServer()),
mCoapClient(aThreadNetif.GetCoapClient()),
mSecureCoapServer(aThreadNetif.GetSecureCoapServer()),
mNetif(aThreadNetif)
{
memset(mJoiners, 0, sizeof(mJoiners));
mCoapServer.AddResource(mRelayReceive);
mCoapServer.AddResource(mDatasetChanged);
mSecureCoapServer.AddResource(mJoinerFinalize);
mNetif.GetCoapServer().AddResource(mRelayReceive);
mNetif.GetCoapServer().AddResource(mDatasetChanged);
mNetif.GetSecureCoapServer().AddResource(mJoinerFinalize);
}
ThreadError Commissioner::Start(void)
@@ -91,7 +88,7 @@ ThreadError Commissioner::Start(void)
otLogFuncEntry();
VerifyOrExit(mState == kStateDisabled, error = kThreadError_InvalidState);
SuccessOrExit(error = mSecureCoapServer.Start(SendRelayTransmit, this));
SuccessOrExit(error = mNetif.GetSecureCoapServer().Start(SendRelayTransmit, this));
mState = kStatePetition;
mTransmitAttempts = 0;
@@ -111,7 +108,7 @@ ThreadError Commissioner::Stop(void)
otLogFuncEntry();
VerifyOrExit(mState != kStateDisabled, error = kThreadError_InvalidState);
mSecureCoapServer.Stop();
mNetif.GetSecureCoapServer().Stop();
mState = kStateDisabled;
mTransmitAttempts = 0;
@@ -332,7 +329,7 @@ ThreadError Commissioner::SendMgmtCommissionerGetRequest(const uint8_t *aTlvs,
header.SetPayloadMarker();
}
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
if (aLength > 0)
{
@@ -344,8 +341,8 @@ ThreadError Commissioner::SendMgmtCommissionerGetRequest(const uint8_t *aTlvs,
mNetif.GetMle().GetLeaderAloc(messageInfo.GetPeerAddr());
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo,
Commissioner::HandleMgmtCommissionerGetResponse, this));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo,
Commissioner::HandleMgmtCommissionerGetResponse, this));
otLogInfoMeshCoP("sent MGMT_COMMISSIONER_GET.req to leader");
@@ -398,7 +395,7 @@ ThreadError Commissioner::SendMgmtCommissionerSetRequest(const otCommissioningDa
header.AppendUriPathOptions(OPENTHREAD_URI_COMMISSIONER_SET);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
if (aDataset.mIsLocatorSet)
{
@@ -440,8 +437,8 @@ ThreadError Commissioner::SendMgmtCommissionerSetRequest(const otCommissioningDa
mNetif.GetMle().GetLeaderAloc(messageInfo.GetPeerAddr());
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo,
Commissioner::HandleMgmtCommissionerSetResponse, this));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo,
Commissioner::HandleMgmtCommissionerSetResponse, this));
otLogInfoMeshCoP("sent MGMT_COMMISSIONER_SET.req to leader");
@@ -496,7 +493,7 @@ ThreadError Commissioner::SendPetition(void)
header.AppendUriPathOptions(OPENTHREAD_URI_LEADER_PETITION);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
commissionerId.Init();
commissionerId.SetCommissionerId("OpenThread Commissioner");
@@ -504,8 +501,8 @@ ThreadError Commissioner::SendPetition(void)
mNetif.GetMle().GetLeaderAloc(*static_cast<Ip6::Address *>(&messageInfo.mPeerAddr));
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo,
Commissioner::HandleLeaderPetitionResponse, this));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo,
Commissioner::HandleLeaderPetitionResponse, this));
otLogInfoMeshCoP("sent petition");
@@ -592,7 +589,7 @@ ThreadError Commissioner::SendKeepAlive(void)
header.AppendUriPathOptions(OPENTHREAD_URI_LEADER_KEEP_ALIVE);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
state.Init();
state.SetState(mState == kStateActive ? StateTlv::kAccept : StateTlv::kReject);
@@ -604,8 +601,8 @@ ThreadError Commissioner::SendKeepAlive(void)
mNetif.GetMle().GetLeaderAloc(*static_cast<Ip6::Address *>(&messageInfo.mPeerAddr));
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo,
Commissioner::HandleLeaderKeepAliveResponse, this));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo,
Commissioner::HandleLeaderKeepAliveResponse, this));
otLogInfoMeshCoP("sent keep alive");
@@ -690,7 +687,7 @@ void Commissioner::HandleRelayReceive(Coap::Header &aHeader, Message &aMessage,
SuccessOrExit(error = Tlv::GetValueOffset(aMessage, Tlv::kJoinerDtlsEncapsulation, offset, length));
VerifyOrExit(length <= aMessage.GetLength() - offset, error = kThreadError_Parse);
if (!mSecureCoapServer.IsConnectionActive())
if (!mNetif.GetSecureCoapServer().IsConnectionActive())
{
memcpy(mJoinerIid, joinerIid.GetIid(), sizeof(mJoinerIid));
mJoinerPort = joinerPort.GetUdpPort();
@@ -710,8 +707,9 @@ void Commissioner::HandleRelayReceive(Coap::Header &aHeader, Message &aMessage,
if (mJoiners[i].mAny || !memcmp(&mJoiners[i].mExtAddress, mJoinerIid, sizeof(mJoiners[i].mExtAddress)))
{
SuccessOrExit(error = mSecureCoapServer.SetPsk(reinterpret_cast<const uint8_t *>(mJoiners[i].mPsk),
static_cast<uint8_t>(strlen(mJoiners[i].mPsk))));
error = mNetif.GetSecureCoapServer().SetPsk(reinterpret_cast<const uint8_t *>(mJoiners[i].mPsk),
static_cast<uint8_t>(strlen(mJoiners[i].mPsk)));
SuccessOrExit(error);
otLogInfoMeshCoP("found joiner, starting new session");
enableJoiner = true;
break;
@@ -734,7 +732,7 @@ void Commissioner::HandleRelayReceive(Coap::Header &aHeader, Message &aMessage,
joinerMessageInfo.GetPeerAddr().SetIid(mJoinerIid);
joinerMessageInfo.SetPeerPort(mJoinerPort);
mSecureCoapServer.Receive(aMessage, joinerMessageInfo);
mNetif.GetSecureCoapServer().Receive(aMessage, joinerMessageInfo);
exit:
(void)aMessageInfo;
@@ -758,7 +756,7 @@ void Commissioner::HandleDatasetChanged(Coap::Header &aHeader, Message &aMessage
otLogInfoMeshCoP("received dataset changed");
(void)aMessage;
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo));
SuccessOrExit(mNetif.GetCoapServer().SendEmptyAck(aHeader, aMessageInfo));
otLogInfoMeshCoP("sent dataset changed acknowledgment");
@@ -821,7 +819,8 @@ void Commissioner::SendJoinFinalizeResponse(const Coap::Header &aRequestHeader,
responseHeader.SetDefaultResponseHeader(aRequestHeader);
responseHeader.SetPayloadMarker();
VerifyOrExit((message = mSecureCoapServer.NewMeshCoPMessage(responseHeader)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetSecureCoapServer().NewMeshCoPMessage(responseHeader)) != NULL,
error = kThreadError_NoBufs);
stateTlv.Init();
stateTlv.SetState(aState);
@@ -832,7 +831,7 @@ void Commissioner::SendJoinFinalizeResponse(const Coap::Header &aRequestHeader,
joinerMessageInfo.SetPeerPort(mJoinerPort);
mSendKek = true;
SuccessOrExit(error = mSecureCoapServer.SendMessage(*message, joinerMessageInfo));
SuccessOrExit(error = mNetif.GetSecureCoapServer().SendMessage(*message, joinerMessageInfo));
otLogInfoMeshCoP("sent joiner finalize response");
otLogCertMeshCoP("[THCI] direction=send | type=JOIN_FIN.rsp");
@@ -871,7 +870,7 @@ ThreadError Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::Messag
header.AppendUriPathOptions(OPENTHREAD_URI_RELAY_TX);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
udpPort.Init();
udpPort.SetUdpPort(mJoinerPort);
@@ -906,7 +905,7 @@ ThreadError Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::Messag
messageInfo.SetPeerPort(kCoapUdpPort);
messageInfo.SetInterfaceId(mNetif.GetInterfaceId());
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
aMessage.Free();
-3
View File
@@ -255,9 +255,6 @@ private:
Coap::Resource mRelayReceive;
Coap::Resource mDatasetChanged;
Coap::Resource mJoinerFinalize;
Coap::Server &mCoapServer;
Coap::Client &mCoapClient;
Coap::SecureServer &mSecureCoapServer;
ThreadNetif &mNetif;
};
+29 -33
View File
@@ -61,12 +61,8 @@ DatasetManager::DatasetManager(ThreadNetif &aThreadNetif, const Tlv::Type aType,
const char *aUriGet):
mLocal(aThreadNetif.GetInstance(), aType),
mNetwork(aThreadNetif.GetInstance(), aType),
mCoapServer(aThreadNetif.GetCoapServer()),
mMle(aThreadNetif.GetMle()),
mNetif(aThreadNetif),
mNetworkDataLeader(aThreadNetif.GetNetworkDataLeader()),
mTimer(aThreadNetif.GetIp6().mTimerScheduler, &DatasetManager::HandleTimer, this),
mCoapClient(aThreadNetif.GetCoapClient()),
mUriSet(aUriSet),
mUriGet(aUriGet)
{
@@ -79,7 +75,7 @@ ThreadError DatasetManager::ApplyConfiguration(void)
const Tlv *cur;
const Tlv *end;
dataset = mMle.IsAttached() ? &mNetwork : &mLocal;
dataset = mNetif.GetMle().IsAttached() ? &mNetwork : &mLocal;
cur = reinterpret_cast<const Tlv *>(dataset->GetBytes());
end = reinterpret_cast<const Tlv *>(dataset->GetBytes() + dataset->GetSize());
@@ -129,7 +125,7 @@ ThreadError DatasetManager::ApplyConfiguration(void)
case Tlv::kMeshLocalPrefix:
{
const MeshLocalPrefixTlv *prefix = static_cast<const MeshLocalPrefixTlv *>(cur);
mMle.SetMeshLocalPrefix(prefix->GetMeshLocalPrefix());
mNetif.GetMle().SetMeshLocalPrefix(prefix->GetMeshLocalPrefix());
break;
}
@@ -161,7 +157,7 @@ ThreadError DatasetManager::Set(const otOperationalDataset &aDataset, uint8_t &a
mLocal.Store();
aFlags = kFlagLocalUpdated;
switch (mMle.GetDeviceState())
switch (mNetif.GetMle().GetDeviceState())
{
case Mle::kDeviceStateChild:
case Mle::kDeviceStateRouter:
@@ -171,8 +167,8 @@ ThreadError DatasetManager::Set(const otOperationalDataset &aDataset, uint8_t &a
case Mle::kDeviceStateLeader:
mNetwork = mLocal;
aFlags |= kFlagNetworkUpdated;
mNetworkDataLeader.IncrementVersion();
mNetworkDataLeader.IncrementStableVersion();
mNetif.GetNetworkDataLeader().IncrementVersion();
mNetif.GetNetworkDataLeader().IncrementStableVersion();
break;
default:
@@ -252,7 +248,7 @@ void DatasetManager::HandleTimer(void)
(mNetif.GetPendingDataset().GetNetwork().Get(Tlv::kActiveTimestamp));
pendingActiveTimestamp = static_cast<const Timestamp *>(tlv);
VerifyOrExit(mMle.IsAttached(),);
VerifyOrExit(mNetif.GetMle().IsAttached(),);
VerifyOrExit(mLocal.Compare(mNetwork) < 0,);
@@ -292,15 +288,15 @@ ThreadError DatasetManager::Register(void)
pending->UpdateDelayTimer();
}
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
SuccessOrExit(error = message->Append(mLocal.GetBytes(), mLocal.GetSize()));
mMle.GetLeaderAloc(leader);
mNetif.GetMle().GetLeaderAloc(leader);
messageInfo.SetPeerAddr(leader);
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMeshCoP("sent dataset to leader");
@@ -365,7 +361,7 @@ ThreadError DatasetManager::Set(Coap::Header &aHeader, Message &aMessage, const
pendingTimestamp.SetLength(0);
sessionId.SetLength(0);
VerifyOrExit(mMle.GetDeviceState() == Mle::kDeviceStateLeader, state = StateTlv::kReject);
VerifyOrExit(mNetif.GetMle().GetDeviceState() == Mle::kDeviceStateLeader, state = StateTlv::kReject);
// verify that TLV data size is less than maximum TLV value size
while (offset < aMessage.GetLength())
@@ -461,7 +457,7 @@ ThreadError DatasetManager::Set(Coap::Header &aHeader, Message &aMessage, const
isUpdateFromCommissioner = true;
localId = static_cast<CommissionerSessionIdTlv *>(mNetworkDataLeader.GetCommissioningDataSubTlv(
localId = static_cast<CommissionerSessionIdTlv *>(mNetif.GetNetworkDataLeader().GetCommissioningDataSubTlv(
Tlv::kCommissionerSessionId));
VerifyOrExit(sessionId.IsValid() &&
@@ -506,8 +502,8 @@ ThreadError DatasetManager::Set(Coap::Header &aHeader, Message &aMessage, const
mLocal.Store();
mNetwork = mLocal;
mNetworkDataLeader.IncrementVersion();
mNetworkDataLeader.IncrementStableVersion();
mNetif.GetNetworkDataLeader().IncrementVersion();
mNetif.GetNetworkDataLeader().IncrementStableVersion();
}
else
{
@@ -520,7 +516,7 @@ ThreadError DatasetManager::Set(Coap::Header &aHeader, Message &aMessage, const
BorderAgentLocatorTlv *borderAgentLocator;
Ip6::Address destination;
borderAgentLocator = static_cast<BorderAgentLocatorTlv *>(mNetworkDataLeader.GetCommissioningDataSubTlv(
borderAgentLocator = static_cast<BorderAgentLocatorTlv *>(mNetif.GetNetworkDataLeader().GetCommissioningDataSubTlv(
Tlv::kBorderAgentLocator));
VerifyOrExit(borderAgentLocator != NULL,);
@@ -536,7 +532,7 @@ ThreadError DatasetManager::Set(Coap::Header &aHeader, Message &aMessage, const
exit:
if (mMle.GetDeviceState() == Mle::kDeviceStateLeader)
if (mNetif.GetMle().GetDeviceState() == Mle::kDeviceStateLeader)
{
SendSetResponse(aHeader, aMessageInfo, state);
}
@@ -556,7 +552,7 @@ ThreadError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset,
header.AppendUriPathOptions(mUriSet);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
#if OPENTHREAD_ENABLE_COMMISSIONER
bool isCommissioner;
@@ -681,9 +677,9 @@ ThreadError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset,
SuccessOrExit(error = message->Append(aTlvs, aLength));
}
mMle.GetLeaderAloc(messageInfo.GetPeerAddr());
mNetif.GetMle().GetLeaderAloc(messageInfo.GetPeerAddr());
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMeshCoP("sent dataset set request to leader");
@@ -711,7 +707,7 @@ ThreadError DatasetManager::SendGetRequest(const uint8_t *aTlvTypes, const uint8
header.AppendUriPathOptions(mUriGet);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
if (aLength > 0)
{
@@ -727,11 +723,11 @@ ThreadError DatasetManager::SendGetRequest(const uint8_t *aTlvTypes, const uint8
}
else
{
mMle.GetLeaderAloc(messageInfo.GetPeerAddr());
mNetif.GetMle().GetLeaderAloc(messageInfo.GetPeerAddr());
}
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMeshCoP("sent dataset get request");
@@ -753,7 +749,7 @@ void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const I
Message *message;
StateTlv state;
VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapServer().NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
responseHeader.SetDefaultResponseHeader(aRequestHeader);
responseHeader.SetPayloadMarker();
@@ -764,7 +760,7 @@ void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const I
state.SetState(aState);
SuccessOrExit(error = message->Append(&state, sizeof(state)));
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
SuccessOrExit(error = mNetif.GetCoapServer().SendMessage(*message, aMessageInfo));
otLogInfoMeshCoP("sent dataset set response");
@@ -785,7 +781,7 @@ void DatasetManager::SendGetResponse(const Coap::Header &aRequestHeader, const I
Message *message;
uint8_t index;
VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapServer().NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
responseHeader.SetDefaultResponseHeader(aRequestHeader);
responseHeader.SetPayloadMarker();
@@ -825,7 +821,7 @@ void DatasetManager::SendGetResponse(const Coap::Header &aRequestHeader, const I
}
}
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
SuccessOrExit(error = mNetif.GetCoapServer().SendMessage(*message, aMessageInfo));
otLogInfoMeshCoP("sent dataset get response");
@@ -883,10 +879,10 @@ ThreadError ActiveDatasetBase::Set(const Dataset &aDataset)
SuccessOrExit(error = DatasetManager::Set(aDataset));
DatasetManager::ApplyConfiguration();
if (mMle.GetDeviceState() == Mle::kDeviceStateLeader)
if (mNetif.GetMle().GetDeviceState() == Mle::kDeviceStateLeader)
{
mNetworkDataLeader.IncrementVersion();
mNetworkDataLeader.IncrementStableVersion();
mNetif.GetNetworkDataLeader().IncrementVersion();
mNetif.GetNetworkDataLeader().IncrementStableVersion();
}
exit:
@@ -1065,7 +1061,7 @@ void PendingDatasetBase::ApplyActiveDataset(const Timestamp &aTimestamp, Message
DelayTimerTlv delayTimer;
uint8_t flags;
VerifyOrExit(mMle.IsAttached(), ;);
VerifyOrExit(mNetif.GetMle().IsAttached(), ;);
while (offset < aMessage.GetLength())
{
-4
View File
@@ -88,10 +88,7 @@ protected:
Dataset mLocal;
Dataset mNetwork;
Coap::Server &mCoapServer;
Mle::Mle &mMle;
ThreadNetif &mNetif;
NetworkData::Leader &mNetworkDataLeader;
private:
static void HandleUdpReceive(void *aContext, otMessage aMessage, const otMessageInfo *aMessageInfo);
@@ -106,7 +103,6 @@ private:
uint8_t *aTlvs, uint8_t aLength);
Timer mTimer;
Coap::Client &mCoapClient;
const char *mUriSet;
const char *mUriGet;
+6 -6
View File
@@ -62,7 +62,7 @@ ActiveDataset::ActiveDataset(ThreadNetif &aThreadNetif):
mResourceGet(OPENTHREAD_URI_ACTIVE_GET, &ActiveDataset::HandleGet, this),
mResourceSet(OPENTHREAD_URI_ACTIVE_SET, &ActiveDataset::HandleSet, this)
{
mCoapServer.AddResource(mResourceGet);
mNetif.GetCoapServer().AddResource(mResourceGet);
}
bool ActiveDataset::IsTlvInitialized(Tlv::Type aType)
@@ -183,12 +183,12 @@ void ActiveDataset::StartLeader(void)
mLocal.Store();
mNetwork = mLocal;
mCoapServer.AddResource(mResourceSet);
mNetif.GetCoapServer().AddResource(mResourceSet);
}
void ActiveDataset::StopLeader(void)
{
mCoapServer.RemoveResource(mResourceSet);
mNetif.GetCoapServer().RemoveResource(mResourceSet);
}
void ActiveDataset::HandleGet(void *aContext, otCoapHeader *aHeader, otMessage aMessage,
@@ -226,7 +226,7 @@ PendingDataset::PendingDataset(ThreadNetif &aThreadNetif):
mResourceGet(OPENTHREAD_URI_PENDING_GET, &PendingDataset::HandleGet, this),
mResourceSet(OPENTHREAD_URI_PENDING_SET, &PendingDataset::HandleSet, this)
{
mCoapServer.AddResource(mResourceGet);
mNetif.GetCoapServer().AddResource(mResourceGet);
}
void PendingDataset::StartLeader(void)
@@ -236,12 +236,12 @@ void PendingDataset::StartLeader(void)
mNetwork = mLocal;
ResetDelayTimer(kFlagNetworkUpdated);
mCoapServer.AddResource(mResourceSet);
mNetif.GetCoapServer().AddResource(mResourceSet);
}
void PendingDataset::StopLeader(void)
{
mCoapServer.RemoveResource(mResourceSet);
mNetif.GetCoapServer().RemoveResource(mResourceSet);
}
void PendingDataset::HandleGet(void *aContext, otCoapHeader *aHeader, otMessage aMessage,
+4 -6
View File
@@ -51,13 +51,11 @@ namespace Thread {
EnergyScanClient::EnergyScanClient(ThreadNetif &aThreadNetif) :
mEnergyScan(OPENTHREAD_URI_ENERGY_REPORT, &EnergyScanClient::HandleReport, this),
mCoapServer(aThreadNetif.GetCoapServer()),
mCoapClient(aThreadNetif.GetCoapClient()),
mNetif(aThreadNetif)
{
mContext = NULL;
mCallback = NULL;
mCoapServer.AddResource(mEnergyScan);
mNetif.GetCoapServer().AddResource(mEnergyScan);
}
ThreadError EnergyScanClient::SendQuery(uint32_t aChannelMask, uint8_t aCount, uint16_t aPeriod,
@@ -80,7 +78,7 @@ ThreadError EnergyScanClient::SendQuery(uint32_t aChannelMask, uint8_t aCount, u
header.AppendUriPathOptions(OPENTHREAD_URI_ENERGY_SCAN);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
sessionId.Init();
sessionId.SetCommissionerSessionId(mNetif.GetCommissioner().GetSessionId());
@@ -105,7 +103,7 @@ ThreadError EnergyScanClient::SendQuery(uint32_t aChannelMask, uint8_t aCount, u
messageInfo.SetPeerAddr(aAddress);
messageInfo.SetPeerPort(kCoapUdpPort);
messageInfo.SetInterfaceId(mNetif.GetInterfaceId());
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMeshCoP("sent energy scan query");
@@ -159,7 +157,7 @@ void EnergyScanClient::HandleReport(Coap::Header &aHeader, Message &aMessage, co
}
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo));
SuccessOrExit(mNetif.GetCoapServer().SendEmptyAck(aHeader, responseInfo));
otLogInfoMeshCoP("sent energy scan report response");
-2
View File
@@ -86,8 +86,6 @@ private:
void *mContext;
Coap::Resource mEnergyScan;
Coap::Server &mCoapServer;
Coap::Client &mCoapClient;
ThreadNetif &mNetif;
};
+18 -17
View File
@@ -72,11 +72,9 @@ Joiner::Joiner(ThreadNetif &aNetif):
mVendorData(NULL),
mTimer(aNetif.GetIp6().mTimerScheduler, &Joiner::HandleTimer, this),
mJoinerEntrust(OPENTHREAD_URI_JOINER_ENTRUST, &Joiner::HandleJoinerEntrust, this),
mCoapServer(aNetif.GetCoapServer()),
mSecureCoapClient(aNetif.GetSecureCoapClient()),
mNetif(aNetif)
{
mCoapServer.AddResource(mJoinerEntrust);
mNetif.GetCoapServer().AddResource(mJoinerEntrust);
}
ThreadError Joiner::Start(const char *aPSKd, const char *aProvisioningUrl,
@@ -95,9 +93,11 @@ ThreadError Joiner::Start(const char *aPSKd, const char *aProvisioningUrl,
mNetif.GetMac().SetExtAddress(extAddress);
mNetif.GetMle().UpdateLinkLocalAddress();
SuccessOrExit(error = mSecureCoapClient.GetDtls().SetPsk(reinterpret_cast<const uint8_t *>(aPSKd),
static_cast<uint8_t>(strlen(aPSKd))));
SuccessOrExit(error = mSecureCoapClient.GetDtls().mProvisioningUrl.SetProvisioningUrl(aProvisioningUrl));
error = mNetif.GetSecureCoapClient().GetDtls().SetPsk(reinterpret_cast<const uint8_t *>(aPSKd),
static_cast<uint8_t>(strlen(aPSKd)));
SuccessOrExit(error);
error = mNetif.GetSecureCoapClient().GetDtls().mProvisioningUrl.SetProvisioningUrl(aProvisioningUrl);
SuccessOrExit(error);
mJoinerRouterPanId = Mac::kPanIdBroadcast;
SuccessOrExit(error = mNetif.GetMle().Discover(0, 0, mNetif.GetMac().GetPanId(), HandleDiscoverResult, this));
@@ -129,8 +129,8 @@ void Joiner::Close(void)
{
otLogFuncEntry();
mSecureCoapClient.Disconnect();
mNetif.GetIp6Filter().RemoveUnsecurePort(mSecureCoapClient.GetPort());
mNetif.GetSecureCoapClient().Disconnect();
mNetif.GetIp6Filter().RemoveUnsecurePort(mNetif.GetSecureCoapClient().GetPort());
otLogFuncExit();
}
@@ -197,14 +197,14 @@ void Joiner::HandleDiscoverResult(otActiveScanResult *aResult)
mNetif.GetMac().SetPanId(mJoinerRouterPanId);
mNetif.GetMac().SetChannel(mJoinerRouterChannel);
mNetif.GetIp6Filter().AddUnsecurePort(mSecureCoapClient.GetPort());
mNetif.GetIp6Filter().AddUnsecurePort(mNetif.GetSecureCoapClient().GetPort());
messageInfo.GetPeerAddr().mFields.m16[0] = HostSwap16(0xfe80);
messageInfo.GetPeerAddr().SetIid(mJoinerRouter);
messageInfo.mPeerPort = mJoinerUdpPort;
messageInfo.mInterfaceId = OT_NETIF_INTERFACE_ID_THREAD;
mSecureCoapClient.Connect(messageInfo, Joiner::HandleSecureCoapClientConnect, this);
mNetif.GetSecureCoapClient().Connect(messageInfo, Joiner::HandleSecureCoapClientConnect, this);
mState = kStateConnect;
}
else
@@ -261,7 +261,8 @@ void Joiner::SendJoinerFinalize(void)
header.AppendUriPathOptions(OPENTHREAD_URI_JOINER_FINALIZE);
header.SetPayloadMarker();
VerifyOrExit((message = mSecureCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetSecureCoapClient().NewMeshCoPMessage(header)) != NULL,
error = kThreadError_NoBufs);
stateTlv.Init();
stateTlv.SetState(MeshCoP::StateTlv::kAccept);
@@ -294,10 +295,10 @@ void Joiner::SendJoinerFinalize(void)
SuccessOrExit(error = message->Append(&vendorDataTlv, vendorDataTlv.GetSize()));
}
if (mSecureCoapClient.GetDtls().mProvisioningUrl.GetLength() > 0)
if (mNetif.GetSecureCoapClient().GetDtls().mProvisioningUrl.GetLength() > 0)
{
SuccessOrExit(error = message->Append(&mSecureCoapClient.GetDtls().mProvisioningUrl,
mSecureCoapClient.GetDtls().mProvisioningUrl.GetSize()));
SuccessOrExit(error = message->Append(&mNetif.GetSecureCoapClient().GetDtls().mProvisioningUrl,
mNetif.GetSecureCoapClient().GetDtls().mProvisioningUrl.GetSize()));
}
#if OPENTHREAD_ENABLE_CERT_LOG
@@ -307,7 +308,7 @@ void Joiner::SendJoinerFinalize(void)
otDumpCertMeshCoP("[THCI] direction=send | type=JOIN_FIN.req |", buf, message->GetLength() - header.GetLength());
#endif
mSecureCoapClient.SendMessage(*message, Joiner::HandleJoinerFinalizeResponse, this);
mNetif.GetSecureCoapClient().SendMessage(*message, Joiner::HandleJoinerFinalizeResponse, this);
otLogInfoMeshCoP("Sent joiner finalize");
@@ -430,7 +431,7 @@ void Joiner::SendJoinerEntrustResponse(const Coap::Header &aRequestHeader,
otLogFuncEntry();
VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapServer().NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
message->SetSubType(Message::kSubTypeJoinerEntrust);
responseHeader.SetDefaultResponseHeader(aRequestHeader);
@@ -438,7 +439,7 @@ void Joiner::SendJoinerEntrustResponse(const Coap::Header &aRequestHeader,
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo));
SuccessOrExit(error = mNetif.GetCoapServer().SendMessage(*message, responseInfo));
mState = kStateJoined;
-2
View File
@@ -146,8 +146,6 @@ private:
Timer mTimer;
Coap::Resource mJoinerEntrust;
Coap::Server &mCoapServer;
Coap::SecureClient &mSecureCoapClient;
ThreadNetif &mNetif;
};
+2 -3
View File
@@ -59,7 +59,6 @@ namespace MeshCoP {
JoinerRouter::JoinerRouter(ThreadNetif &aNetif):
mSocket(aNetif.GetIp6().mUdp),
mRelayTransmit(OPENTHREAD_URI_RELAY_TX, &JoinerRouter::HandleRelayTransmit, this),
mCoapClient(aNetif.GetCoapClient()),
mNetif(aNetif),
mJoinerUdpPort(0),
mIsJoinerPortConfigured(false)
@@ -329,7 +328,7 @@ ThreadError JoinerRouter::SendJoinerEntrust(const Ip6::MessageInfo &aMessageInfo
header.AppendUriPathOptions(OPENTHREAD_URI_JOINER_ENTRUST);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
message->SetSubType(Message::kSubTypeJoinerEntrust);
masterKey.Init();
@@ -398,7 +397,7 @@ ThreadError JoinerRouter::SendJoinerEntrust(const Ip6::MessageInfo &aMessageInfo
messageInfo = aMessageInfo;
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMeshCoP("Sent joiner entrust length = %d", message->GetLength());
otLogCertMeshCoP("[THCI] direction=send | type=JOIN_ENT.ntf");
-1
View File
@@ -98,7 +98,6 @@ private:
Ip6::UdpSocket mSocket;
Coap::Resource mRelayTransmit;
Coap::Client &mCoapClient;
ThreadNetif &mNetif;
uint16_t mJoinerUdpPort;
+11 -14
View File
@@ -50,15 +50,12 @@ namespace MeshCoP {
Leader::Leader(ThreadNetif &aThreadNetif):
mPetition(OPENTHREAD_URI_LEADER_PETITION, Leader::HandlePetition, this),
mKeepAlive(OPENTHREAD_URI_LEADER_KEEP_ALIVE, Leader::HandleKeepAlive, this),
mCoapServer(aThreadNetif.GetCoapServer()),
mCoapClient(aThreadNetif.GetCoapClient()),
mNetworkData(aThreadNetif.GetNetworkDataLeader()),
mTimer(aThreadNetif.GetIp6().mTimerScheduler, HandleTimer, this),
mSessionId(0xffff),
mNetif(aThreadNetif)
{
mCoapServer.AddResource(mPetition);
mCoapServer.AddResource(mKeepAlive);
mNetif.GetCoapServer().AddResource(mPetition);
mNetif.GetCoapServer().AddResource(mKeepAlive);
}
void Leader::HandlePetition(void *aContext, otCoapHeader *aHeader, otMessage aMessage,
@@ -92,7 +89,7 @@ void Leader::HandlePetition(Coap::Header &aHeader, Message &aMessage, const Ip6:
data.mSteeringData.SetLength(1);
data.mSteeringData.Clear();
SuccessOrExit(mNetworkData.SetCommissioningData(reinterpret_cast<uint8_t *>(&data), data.GetLength()));
SuccessOrExit(mNetif.GetNetworkDataLeader().SetCommissioningData(reinterpret_cast<uint8_t *>(&data), data.GetLength()));
mCommissionerId = commissionerId;
@@ -114,7 +111,7 @@ ThreadError Leader::SendPetitionResponse(const Coap::Header &aRequestHeader, con
Message *message;
Ip6::MessageInfo responseInfo(aMessageInfo);
VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapServer().NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
responseHeader.SetDefaultResponseHeader(aRequestHeader);
responseHeader.SetPayloadMarker();
@@ -139,7 +136,7 @@ ThreadError Leader::SendPetitionResponse(const Coap::Header &aRequestHeader, con
}
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo));
SuccessOrExit(error = mNetif.GetCoapServer().SendMessage(*message, responseInfo));
otLogInfoMeshCoP("sent petition response");
@@ -206,7 +203,7 @@ ThreadError Leader::SendKeepAliveResponse(const Coap::Header &aRequestHeader, co
Message *message;
Ip6::MessageInfo responseInfo(aMessageInfo);
VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapServer().NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
responseHeader.SetDefaultResponseHeader(aRequestHeader);
responseHeader.SetPayloadMarker();
@@ -218,7 +215,7 @@ ThreadError Leader::SendKeepAliveResponse(const Coap::Header &aRequestHeader, co
SuccessOrExit(error = message->Append(&state, sizeof(state)));
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
SuccessOrExit(error = mNetif.GetCoapServer().SendMessage(*message, aMessageInfo));
otLogInfoMeshCoP("sent keep alive response");
@@ -243,11 +240,11 @@ ThreadError Leader::SendDatasetChanged(const Ip6::Address &aAddress)
header.SetToken(Coap::Header::kDefaultTokenLength);
header.AppendUriPathOptions(OPENTHREAD_URI_DATASET_CHANGED);
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
messageInfo.SetPeerAddr(aAddress);
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMeshCoP("sent dataset changed");
@@ -283,8 +280,8 @@ void Leader::ResignCommissioner(void)
mCommissionerSessionId.Init();
mCommissionerSessionId.SetCommissionerSessionId(++mSessionId);
mNetworkData.SetCommissioningData(reinterpret_cast<uint8_t *>(&mCommissionerSessionId),
sizeof(Tlv) + mCommissionerSessionId.GetLength());
mNetif.GetNetworkDataLeader().SetCommissioningData(reinterpret_cast<uint8_t *>(&mCommissionerSessionId),
sizeof(Tlv) + mCommissionerSessionId.GetLength());
otLogInfoMeshCoP("commissioner inactive");
}
-4
View File
@@ -108,10 +108,6 @@ private:
Coap::Resource mPetition;
Coap::Resource mKeepAlive;
Coap::Server &mCoapServer;
Coap::Client &mCoapClient;
NetworkData::Leader &mNetworkData;
Timer mTimer;
CommissionerIdTlv mCommissionerId;
+4 -6
View File
@@ -49,11 +49,9 @@ PanIdQueryClient::PanIdQueryClient(ThreadNetif &aThreadNetif) :
mCallback(NULL),
mContext(NULL),
mPanIdQuery(OPENTHREAD_URI_PANID_CONFLICT, &PanIdQueryClient::HandleConflict, this),
mCoapServer(aThreadNetif.GetCoapServer()),
mCoapClient(aThreadNetif.GetCoapClient()),
mNetif(aThreadNetif)
{
mCoapServer.AddResource(mPanIdQuery);
mNetif.GetCoapServer().AddResource(mPanIdQuery);
}
ThreadError PanIdQueryClient::SendQuery(uint16_t aPanId, uint32_t aChannelMask, const Ip6::Address &aAddress,
@@ -73,7 +71,7 @@ ThreadError PanIdQueryClient::SendQuery(uint16_t aPanId, uint32_t aChannelMask,
header.AppendUriPathOptions(OPENTHREAD_URI_PANID_QUERY);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
sessionId.Init();
sessionId.SetCommissionerSessionId(mNetif.GetCommissioner().GetSessionId());
@@ -90,7 +88,7 @@ ThreadError PanIdQueryClient::SendQuery(uint16_t aPanId, uint32_t aChannelMask,
messageInfo.SetPeerAddr(aAddress);
messageInfo.SetPeerPort(kCoapUdpPort);
messageInfo.SetInterfaceId(mNetif.GetInterfaceId());
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMeshCoP("sent panid query");
@@ -138,7 +136,7 @@ void PanIdQueryClient::HandleConflict(Coap::Header &aHeader, Message &aMessage,
}
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo));
SuccessOrExit(mNetif.GetCoapServer().SendEmptyAck(aHeader, responseInfo));
otLogInfoMeshCoP("sent panid query conflict response");
-2
View File
@@ -84,8 +84,6 @@ private:
void *mContext;
Coap::Resource mPanIdQuery;
Coap::Server &mCoapServer;
Coap::Client &mCoapClient;
ThreadNetif &mNetif;
};
+5 -6
View File
@@ -53,8 +53,6 @@ namespace Dhcp6 {
Dhcp6Client::Dhcp6Client(ThreadNetif &aThreadNetif) :
mTrickleTimer(aThreadNetif.GetIp6().mTimerScheduler, &Dhcp6Client::HandleTrickleTimer, NULL, this),
mSocket(aThreadNetif.GetIp6().mUdp),
mMle(aThreadNetif.GetMle()),
mMac(aThreadNetif.GetMac()),
mNetif(aThreadNetif),
mStartTime(0),
mAddresses(NULL),
@@ -385,12 +383,12 @@ ThreadError Dhcp6Client::Solicit(uint16_t aRloc16)
SuccessOrExit(error = AppendRapidCommit(*message));
memset(&messageInfo, 0, sizeof(messageInfo));
memcpy(messageInfo.GetPeerAddr().mFields.m8, mMle.GetMeshLocalPrefix(), 8);
memcpy(messageInfo.GetPeerAddr().mFields.m8, mNetif.GetMle().GetMeshLocalPrefix(), 8);
messageInfo.GetPeerAddr().mFields.m16[4] = HostSwap16(0x0000);
messageInfo.GetPeerAddr().mFields.m16[5] = HostSwap16(0x00ff);
messageInfo.GetPeerAddr().mFields.m16[6] = HostSwap16(0xfe00);
messageInfo.GetPeerAddr().mFields.m16[7] = HostSwap16(aRloc16);
messageInfo.SetSockAddr(mMle.GetMeshLocal16());
messageInfo.SetSockAddr(mNetif.GetMle().GetMeshLocal16());
messageInfo.mPeerPort = kDhcpServerPort;
messageInfo.mInterfaceId = mNetif.GetInterfaceId();
@@ -433,7 +431,7 @@ ThreadError Dhcp6Client::AppendClientIdentifier(Message &aMessage)
option.Init();
option.SetDuidType(kDuidLL);
option.SetDuidHardwareType(kHardwareTypeEui64);
option.SetDuidLinkLayerAddress(mMac.GetExtAddress());
option.SetDuidLinkLayerAddress(mNetif.GetMac().GetExtAddress());
return aMessage.Append(&option, sizeof(option));
}
@@ -604,7 +602,8 @@ ThreadError Dhcp6Client::ProcessClientIdentifier(Message &aMessage, uint16_t aOf
(option.GetLength() == (sizeof(option) - sizeof(Dhcp6Option))) &&
(option.GetDuidType() == kDuidLL) &&
(option.GetDuidHardwareType() == kHardwareTypeEui64)) &&
(!memcmp(option.GetDuidLinkLayerAddress(), mMac.GetExtAddress(), sizeof(Mac::ExtAddress)))),
(!memcmp(option.GetDuidLinkLayerAddress(), mNetif.GetMac().GetExtAddress(),
sizeof(Mac::ExtAddress)))),
error = kThreadError_Parse);
exit:
return error;
-2
View File
@@ -224,8 +224,6 @@ private:
TrickleTimer mTrickleTimer;
Ip6::UdpSocket mSocket;
Mle::MleRouter &mMle;
Mac::Mac &mMac;
ThreadNetif &mNetif;
uint8_t mTransactionId[kTransactionIdSize];
+10 -11
View File
@@ -49,9 +49,6 @@ namespace Dhcp6 {
Dhcp6Server::Dhcp6Server(ThreadNetif &aThreadNetif):
mSocket(aThreadNetif.GetIp6().mUdp),
mMac(aThreadNetif.GetMac()),
mMle(aThreadNetif.GetMle()),
mNetworkDataLeader(aThreadNetif.GetNetworkDataLeader()),
mNetif(aThreadNetif)
{
for (uint8_t i = 0; i < OPENTHREAD_CONFIG_NUM_DHCP_PREFIXES; i++)
@@ -69,7 +66,7 @@ ThreadError Dhcp6Server::UpdateService(void)
ThreadError error = kThreadError_None;
bool found;
uint8_t i;
uint16_t rloc16 = mMle.GetRloc16();
uint16_t rloc16 = mNetif.GetMle().GetRloc16();
Ip6::Address *address = NULL;
otNetworkDataIterator iterator;
otBorderRouterConfig config;
@@ -88,14 +85,15 @@ ThreadError Dhcp6Server::UpdateService(void)
address = &(mAgentsAloc[i].GetAddress());
iterator = OT_NETWORK_DATA_ITERATOR_INIT;
while (mNetworkDataLeader.GetNextOnMeshPrefix(&iterator, rloc16, &config) == kThreadError_None)
while (mNetif.GetNetworkDataLeader().GetNextOnMeshPrefix(&iterator, rloc16, &config) == kThreadError_None)
{
if (!config.mDhcp)
{
continue;
}
mNetworkDataLeader.GetContext(*static_cast<const Ip6::Address *>(&(config.mPrefix.mPrefix)), lowpanContext);
mNetif.GetNetworkDataLeader().GetContext(*static_cast<const Ip6::Address *>(&(config.mPrefix.mPrefix)),
lowpanContext);
if (address->mFields.m8[15] == lowpanContext.mContextId)
{
@@ -107,7 +105,7 @@ ThreadError Dhcp6Server::UpdateService(void)
if (!found)
{
mNetworkDataLeader.GetContext(address->mFields.m8[15], lowpanContext);
mNetif.GetNetworkDataLeader().GetContext(address->mFields.m8[15], lowpanContext);
mNetif.RemoveUnicastAddress(mAgentsAloc[i]);
mAgentsAloc[i].mValid = false;
RemovePrefixAgent(lowpanContext.mPrefix);
@@ -117,7 +115,7 @@ ThreadError Dhcp6Server::UpdateService(void)
// add dhcp agent aloc and prefix delegation
iterator = OT_NETWORK_DATA_ITERATOR_INIT;
while (mNetworkDataLeader.GetNextOnMeshPrefix(&iterator, rloc16, &config) == kThreadError_None)
while (mNetif.GetNetworkDataLeader().GetNextOnMeshPrefix(&iterator, rloc16, &config) == kThreadError_None)
{
found = false;
@@ -126,7 +124,8 @@ ThreadError Dhcp6Server::UpdateService(void)
continue;
}
mNetworkDataLeader.GetContext(*static_cast<const Ip6::Address *>(&config.mPrefix.mPrefix), lowpanContext);
mNetif.GetNetworkDataLeader().GetContext(*static_cast<const Ip6::Address *>(&config.mPrefix.mPrefix),
lowpanContext);
for (i = 0; i < OPENTHREAD_CONFIG_NUM_DHCP_PREFIXES; i++)
{
@@ -150,7 +149,7 @@ ThreadError Dhcp6Server::UpdateService(void)
if (!mAgentsAloc[i].mValid)
{
address = &(mAgentsAloc[i].GetAddress());
memcpy(address, mMle.GetMeshLocalPrefix(), 8);
memcpy(address, mNetif.GetMle().GetMeshLocalPrefix(), 8);
address->mFields.m16[4] = HostSwap16(0x0000);
address->mFields.m16[5] = HostSwap16(0x00ff);
address->mFields.m16[6] = HostSwap16(0xfe00);
@@ -461,7 +460,7 @@ ThreadError Dhcp6Server::AppendServerIdentifier(Message &aMessage)
option.Init();
option.SetDuidType(kDuidLL);
option.SetDuidHardwareType(kHardwareTypeEui64);
option.SetDuidLinkLayerAddress(mMac.GetExtAddress());
option.SetDuidLinkLayerAddress(mNetif.GetMac().GetExtAddress());
SuccessOrExit(error = aMessage.Append(&option, sizeof(option)));
exit:
-3
View File
@@ -148,9 +148,6 @@ private:
Ip6::UdpSocket mSocket;
Mac::Mac &mMac;
Mle::MleRouter &mMle;
NetworkData::Leader &mNetworkDataLeader;
ThreadNetif &mNetif;
Ip6::NetifUnicastAddress mAgentsAloc[OPENTHREAD_CONFIG_NUM_DHCP_PREFIXES];
+21 -25
View File
@@ -57,17 +57,13 @@ AddressResolver::AddressResolver(ThreadNetif &aThreadNetif) :
mAddressNotification(OPENTHREAD_URI_ADDRESS_NOTIFY, &AddressResolver::HandleAddressNotification, this),
mIcmpHandler(&AddressResolver::HandleDstUnreach, this),
mTimer(aThreadNetif.GetIp6().mTimerScheduler, &AddressResolver::HandleTimer, this),
mMeshForwarder(aThreadNetif.GetMeshForwarder()),
mCoapServer(aThreadNetif.GetCoapServer()),
mCoapClient(aThreadNetif.GetCoapClient()),
mMle(aThreadNetif.GetMle()),
mNetif(aThreadNetif)
{
memset(&mCache, 0, sizeof(mCache));
mCoapServer.AddResource(mAddressError);
mCoapServer.AddResource(mAddressQuery);
mCoapServer.AddResource(mAddressNotification);
mNetif.GetCoapServer().AddResource(mAddressError);
mNetif.GetCoapServer().AddResource(mAddressQuery);
mNetif.GetCoapServer().AddResource(mAddressNotification);
mNetif.GetIp6().mIcmp.RegisterCallbacks(mIcmpHandler);
}
@@ -176,7 +172,7 @@ ThreadError AddressResolver::SendAddressQuery(const Ip6::Address &aEid)
header.AppendUriPathOptions(OPENTHREAD_URI_ADDRESS_QUERY);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMessage(header)) != NULL, error = kThreadError_NoBufs);
targetTlv.Init();
targetTlv.SetTarget(aEid);
@@ -184,11 +180,11 @@ ThreadError AddressResolver::SendAddressQuery(const Ip6::Address &aEid)
messageInfo.GetPeerAddr().mFields.m16[0] = HostSwap16(0xff03);
messageInfo.GetPeerAddr().mFields.m16[7] = HostSwap16(0x0002);
messageInfo.SetSockAddr(mMle.GetMeshLocal16());
messageInfo.SetSockAddr(mNetif.GetMle().GetMeshLocal16());
messageInfo.SetPeerPort(kCoapUdpPort);
messageInfo.SetInterfaceId(mNetif.GetInterfaceId());
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoArp("Sent address query");
@@ -285,12 +281,12 @@ void AddressResolver::HandleAddressNotification(Coap::Header &aHeader, Message &
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
if (mCoapServer.SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None)
if (mNetif.GetCoapServer().SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None)
{
otLogInfoArp("Sent address notification acknowledgment");
}
mMeshForwarder.HandleResolved(*targetTlv.GetTarget(), kThreadError_None);
mNetif.GetMeshForwarder().HandleResolved(*targetTlv.GetTarget(), kThreadError_None);
break;
}
}
@@ -312,7 +308,7 @@ ThreadError AddressResolver::SendAddressError(const ThreadTargetTlv &aTarget, co
header.AppendUriPathOptions(OPENTHREAD_URI_ADDRESS_ERROR);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMessage(header)) != NULL, error = kThreadError_NoBufs);
SuccessOrExit(error = message->Append(&aTarget, sizeof(aTarget)));
SuccessOrExit(error = message->Append(&aEid, sizeof(aEid)));
@@ -327,11 +323,11 @@ ThreadError AddressResolver::SendAddressError(const ThreadTargetTlv &aTarget, co
memcpy(&messageInfo.GetPeerAddr(), aDestination, sizeof(messageInfo.GetPeerAddr()));
}
messageInfo.SetSockAddr(mMle.GetMeshLocal16());
messageInfo.SetSockAddr(mNetif.GetMle().GetMeshLocal16());
messageInfo.SetPeerPort(kCoapUdpPort);
messageInfo.SetInterfaceId(mNetif.GetInterfaceId());
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoArp("Sent address error");
@@ -374,7 +370,7 @@ void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessag
{
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
if (mCoapServer.SendEmptyAck(aHeader, responseInfo) == kThreadError_None)
if (mNetif.GetCoapServer().SendEmptyAck(aHeader, responseInfo) == kThreadError_None)
{
otLogInfoArp("Sent address error notification acknowledgment");
}
@@ -389,7 +385,7 @@ void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessag
for (const Ip6::NetifUnicastAddress *address = mNetif.GetUnicastAddresses(); address; address = address->GetNext())
{
if (memcmp(&address->mAddress, targetTlv.GetTarget(), sizeof(address->mAddress)) == 0 &&
memcmp(mMle.GetMeshLocal64().GetIid(), mlIidTlv.GetIid(), 8))
memcmp(mNetif.GetMle().GetMeshLocal64().GetIid(), mlIidTlv.GetIid(), 8))
{
// Target EID matches address and Mesh Local EID differs
mNetif.RemoveUnicastAddress(*address);
@@ -397,7 +393,7 @@ void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessag
}
}
children = mMle.GetChildren(&numChildren);
children = mNetif.GetMle().GetChildren(&numChildren);
memcpy(&macAddr, mlIidTlv.GetIid(), sizeof(macAddr));
macAddr.m8[0] ^= 0x2;
@@ -462,12 +458,12 @@ void AddressResolver::HandleAddressQuery(Coap::Header &aHeader, Message &aMessag
if (mNetif.IsUnicastAddress(*targetTlv.GetTarget()))
{
mlIidTlv.SetIid(mMle.GetMeshLocal64().GetIid());
mlIidTlv.SetIid(mNetif.GetMle().GetMeshLocal64().GetIid());
SendAddressQueryResponse(targetTlv, mlIidTlv, NULL, aMessageInfo.GetPeerAddr());
ExitNow();
}
children = mMle.GetChildren(&numChildren);
children = mNetif.GetMle().GetChildren(&numChildren);
for (int i = 0; i < numChildren; i++)
{
@@ -513,13 +509,13 @@ void AddressResolver::SendAddressQueryResponse(const ThreadTargetTlv &aTargetTlv
header.AppendUriPathOptions(OPENTHREAD_URI_ADDRESS_NOTIFY);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMessage(header)) != NULL, error = kThreadError_NoBufs);
SuccessOrExit(error = message->Append(&aTargetTlv, sizeof(aTargetTlv)));
SuccessOrExit(error = message->Append(&aMlIidTlv, sizeof(aMlIidTlv)));
rloc16Tlv.Init();
rloc16Tlv.SetRloc16(mMle.GetRloc16());
rloc16Tlv.SetRloc16(mNetif.GetMle().GetRloc16());
SuccessOrExit(error = message->Append(&rloc16Tlv, sizeof(rloc16Tlv)));
if (aLastTransactionTimeTlv != NULL)
@@ -528,10 +524,10 @@ void AddressResolver::SendAddressQueryResponse(const ThreadTargetTlv &aTargetTlv
}
messageInfo.SetPeerAddr(aDestination);
messageInfo.SetSockAddr(mMle.GetMeshLocal16());
messageInfo.SetSockAddr(mNetif.GetMle().GetMeshLocal16());
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoArp("Sent address notification");
@@ -579,7 +575,7 @@ void AddressResolver::HandleTimer()
mCache[i].mRetryTimeout = kAddressQueryMaxRetryDelay;
}
mMeshForwarder.HandleResolved(mCache[i].mTarget, kThreadError_Drop);
mNetif.GetMeshForwarder().HandleResolved(mCache[i].mTarget, kThreadError_Drop);
}
}
else if (mCache[i].mRetryTimeout > 0)
+1 -5
View File
@@ -183,11 +183,7 @@ private:
Ip6::IcmpHandler mIcmpHandler;
Timer mTimer;
MeshForwarder &mMeshForwarder;
Coap::Server &mCoapServer;
Coap::Client &mCoapClient;
Mle::MleRouter &mMle;
Ip6::Netif &mNetif;
ThreadNetif &mNetif;
};
/**
+2 -3
View File
@@ -60,10 +60,9 @@ AnnounceBeginServer::AnnounceBeginServer(ThreadNetif &aThreadNetif) :
mChannel(0),
mTimer(aThreadNetif.GetIp6().mTimerScheduler, &AnnounceBeginServer::HandleTimer, this),
mAnnounceBegin(OPENTHREAD_URI_ANNOUNCE_BEGIN, &AnnounceBeginServer::HandleRequest, this),
mCoapServer(aThreadNetif.GetCoapServer()),
mNetif(aThreadNetif)
{
mCoapServer.AddResource(mAnnounceBegin);
mNetif.GetCoapServer().AddResource(mAnnounceBegin);
}
ThreadError AnnounceBeginServer::SendAnnounce(uint32_t aChannelMask)
@@ -120,7 +119,7 @@ void AnnounceBeginServer::HandleRequest(Coap::Header &aHeader, Message &aMessage
SendAnnounce(channelMask.GetMask(), count.GetCount(), period.GetPeriod());
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo));
SuccessOrExit(mNetif.GetCoapServer().SendEmptyAck(aHeader, responseInfo));
otLogInfoMeshCoP("sent announce begin response");
@@ -102,7 +102,6 @@ private:
Timer mTimer;
Coap::Resource mAnnounceBegin;
Coap::Server &mCoapServer;
ThreadNetif &mNetif;
};
+4 -6
View File
@@ -55,14 +55,12 @@ EnergyScanServer::EnergyScanServer(ThreadNetif &aThreadNetif) :
mScanResultsLength(0),
mTimer(aThreadNetif.GetIp6().mTimerScheduler, &EnergyScanServer::HandleTimer, this),
mEnergyScan(OPENTHREAD_URI_ENERGY_SCAN, &EnergyScanServer::HandleRequest, this),
mCoapServer(aThreadNetif.GetCoapServer()),
mCoapClient(aThreadNetif.GetCoapClient()),
mNetif(aThreadNetif)
{
mNetifCallback.Set(&EnergyScanServer::HandleNetifStateChanged, this);
mNetif.RegisterCallback(mNetifCallback);
mCoapServer.AddResource(mEnergyScan);
mNetif.GetCoapServer().AddResource(mEnergyScan);
}
void EnergyScanServer::HandleRequest(void *aContext, otCoapHeader *aHeader, otMessage aMessage,
@@ -107,7 +105,7 @@ void EnergyScanServer::HandleRequest(Coap::Header &aHeader, Message &aMessage, c
mCommissioner = aMessageInfo.GetPeerAddr();
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo));
SuccessOrExit(mNetif.GetCoapServer().SendEmptyAck(aHeader, responseInfo));
otLogInfoMeshCoP("sent energy scan query response");
@@ -191,7 +189,7 @@ ThreadError EnergyScanServer::SendReport(void)
header.AppendUriPathOptions(OPENTHREAD_URI_ENERGY_REPORT);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
channelMask.Init();
channelMask.SetMask(mChannelMask);
@@ -204,7 +202,7 @@ ThreadError EnergyScanServer::SendReport(void)
messageInfo.SetPeerAddr(mCommissioner);
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMeshCoP("sent scan results");
-2
View File
@@ -101,8 +101,6 @@ private:
Ip6::NetifCallback mNetifCallback;
Coap::Resource mEnergyScan;
Coap::Server &mCoapServer;
Coap::Client &mCoapClient;
ThreadNetif &mNetif;
};
+104 -98
View File
@@ -75,15 +75,10 @@ MeshForwarder::MeshForwarder(ThreadNetif &aThreadNetif):
mRestoreChannel(0),
mScanning(false),
mNetif(aThreadNetif),
mAddressResolver(aThreadNetif.GetAddressResolver()),
mLowpan(aThreadNetif.GetLowpan()),
mMac(aThreadNetif.GetMac()),
mMle(aThreadNetif.GetMle()),
mNetworkData(aThreadNetif.GetNetworkDataLeader()),
mSrcMatchEnabled(false)
{
mFragTag = static_cast<uint16_t>(otPlatRandomGet());
mMac.RegisterReceiver(mMacReceiver);
mNetif.GetMac().RegisterReceiver(mMacReceiver);
mMacSource.mLength = 0;
mMacDest.mLength = 0;
}
@@ -94,7 +89,7 @@ ThreadError MeshForwarder::Start(void)
if (mEnabled == false)
{
mMac.SetRxOnWhenIdle(true);
mNetif.GetMac().SetRxOnWhenIdle(true);
mEnabled = true;
}
@@ -113,9 +108,9 @@ ThreadError MeshForwarder::Stop(void)
if (mScanning)
{
mMac.SetChannel(mRestoreChannel);
mNetif.GetMac().SetChannel(mRestoreChannel);
mScanning = false;
mMle.HandleDiscoverComplete();
mNetif.GetMle().HandleDiscoverComplete();
}
while ((message = mSendQueue.GetHead()) != NULL)
@@ -132,7 +127,7 @@ ThreadError MeshForwarder::Stop(void)
mEnabled = false;
mSendMessage = NULL;
mMac.SetRxOnWhenIdle(false);
mNetif.GetMac().SetRxOnWhenIdle(false);
exit:
return error;
@@ -187,7 +182,7 @@ void MeshForwarder::UpdateIndirectMessages(void)
Child *children;
uint8_t numChildren;
children = mMle.GetChildren(&numChildren);
children = mNetif.GetMle().GetChildren(&numChildren);
for (uint8_t i = 0; i < numChildren; i++)
{
@@ -232,7 +227,7 @@ void MeshForwarder::ScheduleTransmissionTask()
UpdateIndirectMessages();
children = mMle.GetChildren(&numChildren);
children = mNetif.GetMle().GetChildren(&numChildren);
for (int i = 0; i < numChildren; i++)
{
@@ -259,14 +254,14 @@ void MeshForwarder::ScheduleTransmissionTask()
}
}
mMac.SendFrameRequest(mMacSender);
mNetif.GetMac().SendFrameRequest(mMacSender);
ExitNow();
}
}
if ((mSendMessage = GetDirectTransmission()) != NULL)
{
mMac.SendFrameRequest(mMacSender);
mNetif.GetMac().SendFrameRequest(mMacSender);
ExitNow();
}
@@ -280,7 +275,7 @@ ThreadError MeshForwarder::AddPendingSrcMatchEntries(void)
Child *children = NULL;
ThreadError error = kThreadError_NoBufs;
children = mMle.GetChildren(&numChildren);
children = mNetif.GetMle().GetChildren(&numChildren);
// Add pending short address first
for (uint8_t i = 0; i < numChildren; i++)
@@ -335,14 +330,14 @@ ThreadError MeshForwarder::AddSrcMatchEntry(Child &aChild)
memcpy(macAddr.mExtAddress.m8, aChild.mMacAddr.m8, sizeof(macAddr.mExtAddress));
}
if ((error = mMac.AddSrcMatchEntry(macAddr)) == kThreadError_None)
if ((error = mNetif.GetMac().AddSrcMatchEntry(macAddr)) == kThreadError_None)
{
// succeed in adding to source match table
aChild.mAddSrcMatchEntryPending = false;
if (!mSrcMatchEnabled)
{
mMac.EnableSrcMatch(true);
mNetif.GetMac().EnableSrcMatch(true);
mSrcMatchEnabled = true;
}
}
@@ -350,7 +345,7 @@ ThreadError MeshForwarder::AddSrcMatchEntry(Child &aChild)
{
if (mSrcMatchEnabled)
{
mMac.EnableSrcMatch(false);
mNetif.GetMac().EnableSrcMatch(false);
mSrcMatchEnabled = false;
}
}
@@ -375,11 +370,11 @@ void MeshForwarder::ClearSrcMatchEntry(Child &aChild)
memcpy(macAddr.mExtAddress.m8, aChild.mMacAddr.m8, sizeof(macAddr.mExtAddress));
}
if (mMac.ClearSrcMatchEntry(macAddr) == kThreadError_None)
if (mNetif.GetMac().ClearSrcMatchEntry(macAddr) == kThreadError_None)
{
if (!mSrcMatchEnabled && (AddPendingSrcMatchEntries() == kThreadError_None))
{
mMac.EnableSrcMatch(true);
mNetif.GetMac().EnableSrcMatch(true);
mSrcMatchEnabled = true;
}
}
@@ -406,9 +401,10 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage)
aMessage.Read(0, sizeof(ip6Header), &ip6Header);
if (!memcmp(&ip6Header.GetDestination(), mMle.GetLinkLocalAllThreadNodesAddress(),
if (!memcmp(&ip6Header.GetDestination(), mNetif.GetMle().GetLinkLocalAllThreadNodesAddress(),
sizeof(ip6Header.GetDestination())) ||
!memcmp(&ip6Header.GetDestination(), mMle.GetRealmLocalAllThreadNodesAddress(), sizeof(ip6Header.GetDestination())))
!memcmp(&ip6Header.GetDestination(), mNetif.GetMle().GetRealmLocalAllThreadNodesAddress(),
sizeof(ip6Header.GetDestination())))
{
// schedule direct transmission
aMessage.SetDirectTransmission();
@@ -416,7 +412,7 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage)
if (aMessage.GetSubType() != Message::kSubTypeMplRetransmission)
{
// destined for all sleepy children
children = mMle.GetChildren(&numChildren);
children = mNetif.GetMle().GetChildren(&numChildren);
for (uint8_t i = 0; i < numChildren; i++)
{
@@ -429,7 +425,7 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage)
}
}
}
else if ((neighbor = mMle.GetNeighbor(ip6Header.GetDestination())) != NULL &&
else if ((neighbor = mNetif.GetMle().GetNeighbor(ip6Header.GetDestination())) != NULL &&
(neighbor->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0)
{
// destined for a sleepy child
@@ -437,7 +433,7 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage)
children->mQueuedIndirectMessageCnt++;
AddSrcMatchEntry(*children);
aMessage.SetChildMask(mMle.GetChildIndex(*children));
aMessage.SetChildMask(mNetif.GetMle().GetChildIndex(*children));
}
else
{
@@ -454,7 +450,7 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage)
IgnoreReturnValue(meshHeader.Init(aMessage));
if ((neighbor = mMle.GetNeighbor(meshHeader.GetDestination())) != NULL &&
if ((neighbor = mNetif.GetMle().GetNeighbor(meshHeader.GetDestination())) != NULL &&
(neighbor->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0)
{
// destined for a sleepy child
@@ -462,7 +458,7 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage)
children->mQueuedIndirectMessageCnt++;
AddSrcMatchEntry(*children);
aMessage.SetChildMask(mMle.GetChildIndex(*children));
aMessage.SetChildMask(mNetif.GetMle().GetChildIndex(*children));
}
else
{
@@ -544,7 +540,7 @@ exit:
Message *MeshForwarder::GetIndirectTransmission(const Child &aChild)
{
Message *message = NULL;
uint8_t childIndex = mMle.GetChildIndex(aChild);
uint8_t childIndex = mNetif.GetMle().GetChildIndex(aChild);
Ip6::Header ip6Header;
for (message = mSendQueue.GetHead(); message; message = message->GetNext())
@@ -586,7 +582,7 @@ Message *MeshForwarder::GetIndirectTransmission(const Child &aChild)
mMeshDest = meshHeader.GetDestination();
mMeshSource = meshHeader.GetSource();
mMacSource.mLength = sizeof(mMacSource.mShortAddress);
mMacSource.mShortAddress = mMac.GetShortAddress();
mMacSource.mShortAddress = mNetif.GetMac().GetShortAddress();
mMacDest.mLength = sizeof(mMacDest.mShortAddress);
mMacDest.mShortAddress = meshHeader.GetDestination();
break;
@@ -611,15 +607,15 @@ ThreadError MeshForwarder::UpdateMeshRoute(Message &aMessage)
IgnoreReturnValue(meshHeader.Init(aMessage));
nextHop = mMle.GetNextHop(meshHeader.GetDestination());
nextHop = mNetif.GetMle().GetNextHop(meshHeader.GetDestination());
if (nextHop != Mac::kShortAddrInvalid)
{
neighbor = mMle.GetNeighbor(nextHop);
neighbor = mNetif.GetMle().GetNeighbor(nextHop);
}
else
{
neighbor = mMle.GetNeighbor(meshHeader.GetDestination());
neighbor = mNetif.GetMle().GetNeighbor(meshHeader.GetDestination());
}
if (neighbor == NULL)
@@ -630,7 +626,7 @@ ThreadError MeshForwarder::UpdateMeshRoute(Message &aMessage)
mMacDest.mLength = sizeof(mMacDest.mShortAddress);
mMacDest.mShortAddress = neighbor->mValid.mRloc16;
mMacSource.mLength = sizeof(mMacSource.mShortAddress);
mMacSource.mShortAddress = mMac.GetShortAddress();
mMacSource.mShortAddress = mNetif.GetMac().GetShortAddress();
mAddMeshHeader = true;
mMeshDest = meshHeader.GetDestination();
@@ -652,7 +648,7 @@ ThreadError MeshForwarder::UpdateIp6Route(Message &aMessage)
aMessage.Read(0, sizeof(ip6Header), &ip6Header);
switch (mMle.GetDeviceState())
switch (mNetif.GetMle().GetDeviceState())
{
case Mle::kDeviceStateDisabled:
case Mle::kDeviceStateDetached:
@@ -679,7 +675,7 @@ ThreadError MeshForwarder::UpdateIp6Route(Message &aMessage)
}
else
{
mMacDest.mShortAddress = mMle.GetNextHop(Mac::kShortAddrBroadcast);
mMacDest.mShortAddress = mNetif.GetMle().GetNextHop(Mac::kShortAddrBroadcast);
}
GetMacSourceAddress(ip6Header.GetSource(), mMacSource);
@@ -705,20 +701,21 @@ ThreadError MeshForwarder::UpdateIp6Route(Message &aMessage)
}
else
{
if (mMle.IsRoutingLocator(ip6Header.GetDestination()))
if (mNetif.GetMle().IsRoutingLocator(ip6Header.GetDestination()))
{
rloc16 = HostSwap16(ip6Header.GetDestination().mFields.m16[7]);
VerifyOrExit(mMle.IsRouterIdValid(mMle.GetRouterId(rloc16)), error = kThreadError_Drop);
VerifyOrExit(mNetif.GetMle().IsRouterIdValid(mNetif.GetMle().GetRouterId(rloc16)),
error = kThreadError_Drop);
mMeshDest = rloc16;
}
else if (mMle.IsAnycastLocator(ip6Header.GetDestination()))
else if (mNetif.GetMle().IsAnycastLocator(ip6Header.GetDestination()))
{
// only support Leader ALOC for now
aloc16 = HostSwap16(ip6Header.GetDestination().mFields.m16[7]);
if (aloc16 == Mle::kAloc16Leader)
{
mMeshDest = mMle.GetRloc16(mMle.GetLeaderId());
mMeshDest = mNetif.GetMle().GetRloc16(mNetif.GetMle().GetLeaderId());
}
#if OPENTHREAD_ENABLE_DHCP6_SERVER || OPENTHREAD_ENABLE_DHCP6_CLIENT
@@ -726,20 +723,23 @@ ThreadError MeshForwarder::UpdateIp6Route(Message &aMessage)
{
uint16_t agentRloc16;
uint8_t routerId;
VerifyOrExit((mNetworkData.GetRlocByContextId(static_cast<uint8_t>(aloc16 & Mle::kAloc16DhcpAgentMask),
agentRloc16) == kThreadError_None), error = kThreadError_Drop);
VerifyOrExit((mNetif.GetNetworkDataLeader().GetRlocByContextId(
static_cast<uint8_t>(aloc16 & Mle::kAloc16DhcpAgentMask),
agentRloc16) == kThreadError_None),
error = kThreadError_Drop);
routerId = mMle.GetRouterId(agentRloc16);
routerId = mNetif.GetMle().GetRouterId(agentRloc16);
// if agent is active router or the child of the device
if ((mMle.IsActiveRouter(agentRloc16)) || (mMle.GetRloc16(routerId) == mMle.GetRloc16()))
if ((mNetif.GetMle().IsActiveRouter(agentRloc16)) ||
(mNetif.GetMle().GetRloc16(routerId) == mNetif.GetMle().GetRloc16()))
{
mMeshDest = agentRloc16;
}
else
{
// use the parent of the ED Agent as Dest
mMeshDest = mMle.GetRloc16(routerId);
mMeshDest = mNetif.GetMle().GetRloc16(routerId);
}
}
@@ -750,22 +750,27 @@ ThreadError MeshForwarder::UpdateIp6Route(Message &aMessage)
ExitNow(error = kThreadError_Drop);
}
}
else if ((neighbor = mMle.GetNeighbor(ip6Header.GetDestination())) != NULL)
else if ((neighbor = mNetif.GetMle().GetNeighbor(ip6Header.GetDestination())) != NULL)
{
mMeshDest = neighbor->mValid.mRloc16;
}
else if (mNetworkData.IsOnMesh(ip6Header.GetDestination()))
else if (mNetif.GetNetworkDataLeader().IsOnMesh(ip6Header.GetDestination()))
{
SuccessOrExit(error = mAddressResolver.Resolve(ip6Header.GetDestination(), mMeshDest));
SuccessOrExit(error = mNetif.GetAddressResolver().Resolve(ip6Header.GetDestination(), mMeshDest));
}
else
{
mNetworkData.RouteLookup(ip6Header.GetSource(), ip6Header.GetDestination(), NULL, &mMeshDest);
mNetif.GetNetworkDataLeader().RouteLookup(
ip6Header.GetSource(),
ip6Header.GetDestination(),
NULL,
&mMeshDest
);
}
VerifyOrExit(mMeshDest != Mac::kShortAddrInvalid, error = kThreadError_Drop);
if (mMle.GetNeighbor(mMeshDest) != NULL)
if (mNetif.GetMle().GetNeighbor(mMeshDest) != NULL)
{
// destination is neighbor
mMacDest.mLength = sizeof(mMacDest.mShortAddress);
@@ -775,12 +780,12 @@ ThreadError MeshForwarder::UpdateIp6Route(Message &aMessage)
else
{
// destination is not neighbor
mMeshSource = mMac.GetShortAddress();
mMeshSource = mNetif.GetMac().GetShortAddress();
SuccessOrExit(error = mMle.CheckReachability(mMeshSource, mMeshDest, ip6Header));
SuccessOrExit(error = mNetif.GetMle().CheckReachability(mMeshSource, mMeshDest, ip6Header));
mMacDest.mLength = sizeof(mMacDest.mShortAddress);
mMacDest.mShortAddress = mMle.GetNextHop(mMeshDest);
mMacDest.mShortAddress = mNetif.GetMle().GetNextHop(mMeshDest);
mMacSource.mLength = sizeof(mMacSource.mShortAddress);
mMacSource.mShortAddress = mMeshSource;
mAddMeshHeader = true;
@@ -796,12 +801,12 @@ exit:
bool MeshForwarder::GetRxOnWhenIdle()
{
return mMac.GetRxOnWhenIdle();
return mNetif.GetMac().GetRxOnWhenIdle();
}
void MeshForwarder::SetRxOnWhenIdle(bool aRxOnWhenIdle)
{
mMac.SetRxOnWhenIdle(aRxOnWhenIdle);
mNetif.GetMac().SetRxOnWhenIdle(aRxOnWhenIdle);
if (aRxOnWhenIdle)
{
@@ -817,7 +822,7 @@ void MeshForwarder::SetAssignPollPeriod(uint32_t aPeriod)
{
mAssignPollPeriod = aPeriod;
if (mPollTimer.IsRunning() && ((mMle.GetDeviceMode() & Mle::ModeTlv::kModeFFD) == 0))
if (mPollTimer.IsRunning() && ((mNetif.GetMle().GetDeviceMode() & Mle::ModeTlv::kModeFFD) == 0))
{
SetPollPeriod(mAssignPollPeriod);
}
@@ -873,7 +878,7 @@ ThreadError MeshForwarder::SendMacDataRequest(void)
Message *message;
// only send MAC Data Requests in rx-off-when-idle mode
VerifyOrExit(!mMac.GetRxOnWhenIdle(), error = kThreadError_InvalidState);
VerifyOrExit(!mNetif.GetMac().GetRxOnWhenIdle(), error = kThreadError_InvalidState);
// only enqueue one MAC Data Request at a time
for (message = mSendQueue.GetHead(); message; message = message->GetNext())
@@ -900,10 +905,10 @@ ThreadError MeshForwarder::GetMacSourceAddress(const Ip6::Address &aIp6Addr, Mac
aMacAddr.mLength = sizeof(aMacAddr.mExtAddress);
aMacAddr.mExtAddress.Set(aIp6Addr);
if (memcmp(&aMacAddr.mExtAddress, mMac.GetExtAddress(), sizeof(aMacAddr.mExtAddress)) != 0)
if (memcmp(&aMacAddr.mExtAddress, mNetif.GetMac().GetExtAddress(), sizeof(aMacAddr.mExtAddress)) != 0)
{
aMacAddr.mLength = sizeof(aMacAddr.mShortAddress);
aMacAddr.mShortAddress = mMac.GetShortAddress();
aMacAddr.mShortAddress = mNetif.GetMac().GetShortAddress();
}
return kThreadError_None;
@@ -927,7 +932,7 @@ ThreadError MeshForwarder::GetMacDestinationAddress(const Ip6::Address &aIp6Addr
aMacAddr.mLength = sizeof(aMacAddr.mShortAddress);
aMacAddr.mShortAddress = HostSwap16(aIp6Addr.mFields.m16[7]);
}
else if (mMle.IsRoutingLocator(aIp6Addr))
else if (mNetif.GetMle().IsRoutingLocator(aIp6Addr))
{
aMacAddr.mLength = sizeof(aMacAddr.mShortAddress);
aMacAddr.mShortAddress = HostSwap16(aIp6Addr.mFields.m16[7]);
@@ -970,7 +975,7 @@ ThreadError MeshForwarder::HandleFrameRequest(Mac::Frame &aFrame)
if (!mScanning)
{
mScanChannel = kPhyMinChannel;
mRestoreChannel = mMac.GetChannel();
mRestoreChannel = mNetif.GetMac().GetChannel();
mScanning = true;
}
@@ -980,7 +985,7 @@ ThreadError MeshForwarder::HandleFrameRequest(Mac::Frame &aFrame)
mScanChannel++;
}
mMac.SetChannel(mScanChannel);
mNetif.GetMac().SetChannel(mScanChannel);
aFrame.SetChannel(mScanChannel);
}
@@ -1000,7 +1005,7 @@ ThreadError MeshForwarder::HandleFrameRequest(Mac::Frame &aFrame)
// set FramePending if there are more queued messages for the child
aFrame.GetDstAddr(macDest);
if (((child = mMle.GetChild(macDest)) != NULL)
if (((child = mNetif.GetMle().GetChild(macDest)) != NULL)
&& ((child->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0)
&& (child->mQueuedIndirectMessageCnt > 1))
{
@@ -1019,9 +1024,9 @@ ThreadError MeshForwarder::SendPoll(Message &aMessage, Mac::Frame &aFrame)
Neighbor *neighbor;
// only send MAC Data Requests in rx-off-when-idle mode
VerifyOrExit(!mMac.GetRxOnWhenIdle(), error = kThreadError_InvalidState);
VerifyOrExit(!mNetif.GetMac().GetRxOnWhenIdle(), error = kThreadError_InvalidState);
macSource.mShortAddress = mMac.GetShortAddress();
macSource.mShortAddress = mNetif.GetMac().GetShortAddress();
if (macSource.mShortAddress != Mac::kShortAddrInvalid)
{
@@ -1030,7 +1035,7 @@ ThreadError MeshForwarder::SendPoll(Message &aMessage, Mac::Frame &aFrame)
else
{
macSource.mLength = sizeof(macSource.mExtAddress);
memcpy(&macSource.mExtAddress, mMac.GetExtAddress(), sizeof(macSource.mExtAddress));
memcpy(&macSource.mExtAddress, mNetif.GetMac().GetExtAddress(), sizeof(macSource.mExtAddress));
}
// initialize MAC header
@@ -1048,9 +1053,9 @@ ThreadError MeshForwarder::SendPoll(Message &aMessage, Mac::Frame &aFrame)
fcf |= Mac::Frame::kFcfAckRequest | Mac::Frame::kFcfSecurityEnabled;
aFrame.InitMacHeader(fcf, Mac::Frame::kKeyIdMode1 | Mac::Frame::kSecEncMic32);
aFrame.SetDstPanId(mMac.GetPanId());
aFrame.SetDstPanId(mNetif.GetMac().GetPanId());
neighbor = mMle.GetParent();
neighbor = mNetif.GetMle().GetParent();
assert(neighbor != NULL);
if (macSource.mLength == 2)
@@ -1082,7 +1087,7 @@ ThreadError MeshForwarder::SendMesh(Message &aMessage, Mac::Frame &aFrame)
Mac::Frame::kFcfAckRequest | Mac::Frame::kFcfSecurityEnabled;
aFrame.InitMacHeader(fcf, Mac::Frame::kKeyIdMode1 | Mac::Frame::kSecEncMic32);
aFrame.SetDstPanId(mMac.GetPanId());
aFrame.SetDstPanId(mNetif.GetMac().GetPanId());
aFrame.SetDstAddr(mMacDest.mShortAddress);
aFrame.SetSrcAddr(mMacSource.mShortAddress);
@@ -1157,7 +1162,7 @@ ThreadError MeshForwarder::SendFragment(Message &aMessage, Mac::Frame &aFrame)
secCtl |= Mac::Frame::kSecEncMic32;
}
dstpan = mMac.GetPanId();
dstpan = mNetif.GetMac().GetPanId();
switch (aMessage.GetSubType())
{
@@ -1175,14 +1180,14 @@ ThreadError MeshForwarder::SendFragment(Message &aMessage, Mac::Frame &aFrame)
break;
}
if (dstpan == mMac.GetPanId())
if (dstpan == mNetif.GetMac().GetPanId())
{
fcf |= Mac::Frame::kFcfPanidCompression;
}
aFrame.InitMacHeader(fcf, secCtl);
aFrame.SetDstPanId(dstpan);
aFrame.SetSrcPanId(mMac.GetPanId());
aFrame.SetSrcPanId(mNetif.GetMac().GetPanId());
if (mMacDest.mLength == 2)
{
@@ -1210,19 +1215,19 @@ ThreadError MeshForwarder::SendFragment(Message &aMessage, Mac::Frame &aFrame)
if (mAddMeshHeader)
{
// Calculate the number of predicted hops.
hopsLeft = mMle.GetRouteCost(mMeshDest);
hopsLeft += mMle.GetLinkCost(mMle.GetRouterId(mMle.GetNextHop(mMeshDest)));
hopsLeft = mNetif.GetMle().GetRouteCost(mMeshDest);
hopsLeft += mNetif.GetMle().GetLinkCost(mNetif.GetMle().GetRouterId(mNetif.GetMle().GetNextHop(mMeshDest)));
// The hopsLft field MUST be incremented by one if the device is not
// an active Router.
if (!mMle.IsActiveRouter(mMeshSource))
if (!mNetif.GetMle().IsActiveRouter(mMeshSource))
{
hopsLeft += 1;
}
// The hopsLft field MUST be incremented by one if the destination RLOC16
// is not that of an active Router.
if (!mMle.IsActiveRouter(mMeshDest))
if (!mNetif.GetMle().IsActiveRouter(mMeshDest))
{
hopsLeft += 1;
}
@@ -1239,7 +1244,7 @@ ThreadError MeshForwarder::SendFragment(Message &aMessage, Mac::Frame &aFrame)
// copy IPv6 Header
if (aMessage.GetOffset() == 0)
{
hcLength = mLowpan.Compress(aMessage, meshSource, meshDest, payload);
hcLength = mNetif.GetLowpan().Compress(aMessage, meshSource, meshDest, payload);
assert(hcLength > 0);
headerLength += static_cast<uint8_t>(hcLength);
@@ -1326,7 +1331,7 @@ ThreadError MeshForwarder::SendEmptyFrame(Mac::Frame &aFrame)
uint8_t secCtl;
Mac::Address macSource;
macSource.mShortAddress = mMac.GetShortAddress();
macSource.mShortAddress = mNetif.GetMac().GetShortAddress();
if (macSource.mShortAddress != Mac::kShortAddrInvalid)
{
@@ -1335,7 +1340,7 @@ ThreadError MeshForwarder::SendEmptyFrame(Mac::Frame &aFrame)
else
{
macSource.mLength = sizeof(macSource.mExtAddress);
memcpy(&macSource.mExtAddress, mMac.GetExtAddress(), sizeof(macSource.mExtAddress));
memcpy(&macSource.mExtAddress, mNetif.GetMac().GetExtAddress(), sizeof(macSource.mExtAddress));
}
fcf = Mac::Frame::kFcfFrameData | Mac::Frame::kFcfFrameVersion2006;
@@ -1352,8 +1357,8 @@ ThreadError MeshForwarder::SendEmptyFrame(Mac::Frame &aFrame)
aFrame.InitMacHeader(fcf, secCtl);
aFrame.SetDstPanId(mMac.GetPanId());
aFrame.SetSrcPanId(mMac.GetPanId());
aFrame.SetDstPanId(mNetif.GetMac().GetPanId());
aFrame.SetSrcPanId(mNetif.GetMac().GetPanId());
if (mMacDest.mLength == 2)
{
@@ -1401,7 +1406,7 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError)
aFrame.GetDstAddr(macDest);
if ((neighbor = mMle.GetNeighbor(macDest)) != NULL)
if ((neighbor = mNetif.GetMle().GetNeighbor(macDest)) != NULL)
{
switch (aError)
{
@@ -1419,11 +1424,11 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError)
case kThreadError_NoAck:
neighbor->mLinkFailures++;
if (mMle.IsActiveRouter(neighbor->mValid.mRloc16))
if (mNetif.GetMle().IsActiveRouter(neighbor->mValid.mRloc16))
{
if (neighbor->mLinkFailures >= Mle::kFailedRouterTransmissions)
{
mMle.RemoveNeighbor(*neighbor);
mNetif.GetMle().RemoveNeighbor(*neighbor);
}
}
@@ -1435,7 +1440,7 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError)
}
}
if ((child = mMle.GetChild(macDest)) != NULL)
if ((child = mNetif.GetMle().GetChild(macDest)) != NULL)
{
child->mDataRequest = false;
@@ -1448,7 +1453,7 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError)
else
{
child->mFragmentOffset = 0;
mSendMessage->ClearChildMask(mMle.GetChildIndex(*child));
mSendMessage->ClearChildMask(mNetif.GetMle().GetChildIndex(*child));
if ((child->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0)
{
@@ -1488,12 +1493,12 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError)
if (mSendMessage->GetType() == Message::kTypeMacDataPoll)
{
neighbor = mMle.GetParent();
neighbor = mNetif.GetMle().GetParent();
if (neighbor->mState == Neighbor::kStateInvalid)
{
mPollTimer.Stop();
mMle.BecomeDetached();
mNetif.GetMle().BecomeDetached();
}
}
@@ -1537,9 +1542,9 @@ void MeshForwarder::HandleDiscoverTimer(void)
mSendQueue.Dequeue(*mSendMessage);
mSendMessage->Free();
mSendMessage = NULL;
mMac.SetChannel(mRestoreChannel);
mNetif.GetMac().SetChannel(mRestoreChannel);
mScanning = false;
mMle.HandleDiscoverComplete();
mNetif.GetMle().HandleDiscoverComplete();
ExitNow();
}
}
@@ -1576,7 +1581,7 @@ void MeshForwarder::HandleReceivedFrame(Mac::Frame &aFrame)
SuccessOrExit(error = aFrame.GetSrcAddr(macSource));
SuccessOrExit(aFrame.GetDstAddr(macDest));
if ((child = mMle.GetChild(macSource)) != NULL)
if ((child = mNetif.GetMle().GetChild(macSource)) != NULL)
{
if (((child->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0) &&
macSource.mLength == sizeof(otShortAddress))
@@ -1660,7 +1665,7 @@ void MeshForwarder::HandleMesh(uint8_t *aFrame, uint8_t aFrameLength, const Mac:
meshDest.mLength = sizeof(meshDest.mShortAddress);
meshDest.mShortAddress = meshHeader.GetDestination();
if (meshDest.mShortAddress == mMac.GetShortAddress())
if (meshDest.mShortAddress == mNetif.GetMac().GetShortAddress())
{
aFrame += meshHeader.GetHeaderLength();
aFrameLength -= meshHeader.GetHeaderLength();
@@ -1680,7 +1685,7 @@ void MeshForwarder::HandleMesh(uint8_t *aFrame, uint8_t aFrameLength, const Mac:
}
else if (meshHeader.GetHopsLeft() > 0)
{
mMle.ResolveRoutingLoops(aMacSource.mShortAddress, meshDest.mShortAddress);
mNetif.GetMle().ResolveRoutingLoops(aMacSource.mShortAddress, meshDest.mShortAddress);
SuccessOrExit(error = CheckReachability(aFrame, aFrameLength, meshSource, meshDest));
@@ -1737,10 +1742,10 @@ ThreadError MeshForwarder::CheckReachability(uint8_t *aFrame, uint8_t aFrameLeng
// only process IPv6 packets
VerifyOrExit(aFrameLength >= 1 && Lowpan::Lowpan::IsLowpanHc(aFrame),);
VerifyOrExit(mLowpan.DecompressBaseHeader(ip6Header, aMeshSource, aMeshDest, aFrame, aFrameLength) > 0,
VerifyOrExit(mNetif.GetLowpan().DecompressBaseHeader(ip6Header, aMeshSource, aMeshDest, aFrame, aFrameLength) > 0,
error = kThreadError_Drop);
error = mMle.CheckReachability(aMeshSource.mShortAddress, aMeshDest.mShortAddress, ip6Header);
error = mNetif.GetMle().CheckReachability(aMeshSource.mShortAddress, aMeshDest.mShortAddress, ip6Header);
exit:
return error;
@@ -1766,7 +1771,8 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength,
error = kThreadError_NoBufs);
message->SetLinkSecurityEnabled(aMessageInfo.mLinkSecurity);
message->SetPanId(aMessageInfo.mPanId);
headerLength = mLowpan.Decompress(*message, aMacSource, aMacDest, aFrame, aFrameLength, datagramLength);
headerLength = mNetif.GetLowpan().Decompress(*message, aMacSource, aMacDest, aFrame, aFrameLength,
datagramLength);
VerifyOrExit(headerLength > 0, error = kThreadError_Parse);
aFrame += headerLength;
@@ -1883,7 +1889,7 @@ void MeshForwarder::HandleLowpanHC(uint8_t *aFrame, uint8_t aFrameLength,
message->SetLinkSecurityEnabled(aMessageInfo.mLinkSecurity);
message->SetPanId(aMessageInfo.mPanId);
headerLength = mLowpan.Decompress(*message, aMacSource, aMacDest, aFrame, aFrameLength, 0);
headerLength = mNetif.GetLowpan().Decompress(*message, aMacSource, aMacDest, aFrame, aFrameLength, 0);
VerifyOrExit(headerLength > 0, error = kThreadError_Parse);
aFrame += headerLength;
@@ -1928,9 +1934,9 @@ void MeshForwarder::HandleDataRequest(const Mac::Address &aMacSource, const Thre
// Security Check: only process secure Data Poll frames.
VerifyOrExit(aMessageInfo.mLinkSecurity, ;);
VerifyOrExit(mMle.GetDeviceState() != Mle::kDeviceStateDetached, ;);
VerifyOrExit(mNetif.GetMle().GetDeviceState() != Mle::kDeviceStateDetached, ;);
VerifyOrExit((child = mMle.GetChild(aMacSource)) != NULL, ;);
VerifyOrExit((child = mNetif.GetMle().GetChild(aMacSource)) != NULL, ;);
child->mLastHeard = Timer::GetNow();
child->mLinkFailures = 0;
-5
View File
@@ -299,11 +299,6 @@ private:
bool mScanning;
ThreadNetif &mNetif;
AddressResolver &mAddressResolver;
Lowpan::Lowpan &mLowpan;
Mac::Mac &mMac;
Mle::MleRouter &mMle;
NetworkData::Leader &mNetworkData;
bool mSrcMatchEnabled;
};
+121 -116
View File
@@ -59,13 +59,6 @@ namespace Mle {
Mle::Mle(ThreadNetif &aThreadNetif) :
mNetif(aThreadNetif),
mAddressResolver(aThreadNetif.GetAddressResolver()),
mKeyManager(aThreadNetif.GetKeyManager()),
mMac(aThreadNetif.GetMac()),
mMesh(aThreadNetif.GetMeshForwarder()),
mMleRouter(aThreadNetif.GetMle()),
mNetworkData(aThreadNetif.GetNetworkDataLeader()),
mJoinerRouter(aThreadNetif.GetJoinerRouter()),
mRetrieveNewNetworkData(false),
mDeviceState(kDeviceStateDisabled),
mDeviceMode(ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeSecureDataRequest | ModeTlv::kModeFFD |
@@ -111,7 +104,7 @@ Mle::Mle(ThreadNetif &aThreadNetif) :
// link-local 64
mLinkLocal64.GetAddress().mFields.m16[0] = HostSwap16(0xfe80);
mLinkLocal64.GetAddress().SetIid(*mMac.GetExtAddress());
mLinkLocal64.GetAddress().SetIid(*mNetif.GetMac().GetExtAddress());
mLinkLocal64.mPrefixLength = 64;
mLinkLocal64.mPreferred = true;
mLinkLocal64.mValid = true;
@@ -126,7 +119,7 @@ Mle::Mle(ThreadNetif &aThreadNetif) :
// initialize Mesh Local Prefix
meshLocalPrefix[0] = 0xfd;
memcpy(meshLocalPrefix + 1, mMac.GetExtendedPanId(), 5);
memcpy(meshLocalPrefix + 1, mNetif.GetMac().GetExtendedPanId(), 5);
meshLocalPrefix[6] = 0x00;
meshLocalPrefix[7] = 0x00;
@@ -214,7 +207,7 @@ ThreadError Mle::Start(bool aEnableReattach)
mNetif.SetStateChangedFlags(OT_NET_ROLE);
SetStateDetached();
mKeyManager.Start();
mNetif.GetKeyManager().Start();
if (aEnableReattach)
{
@@ -227,7 +220,7 @@ ThreadError Mle::Start(bool aEnableReattach)
}
else if (IsActiveRouter(GetRloc16()))
{
if (mMleRouter.BecomeRouter(ThreadStatusTlv::kTooFewRouters) != kThreadError_None)
if (mNetif.GetMle().BecomeRouter(ThreadStatusTlv::kTooFewRouters) != kThreadError_None)
{
BecomeChild(kMleAttachAnyPartition);
}
@@ -247,7 +240,7 @@ exit:
ThreadError Mle::Stop(bool aClearNetworkDatasets)
{
otLogFuncEntry();
mKeyManager.Stop();
mNetif.GetKeyManager().Stop();
SetStateDetached();
mNetif.RemoveUnicastAddress(mMeshLocal16);
@@ -279,10 +272,10 @@ ThreadError Mle::Restore(void)
mDeviceMode = networkInfo.mDeviceMode;
SetRloc16(networkInfo.mRloc16);
mKeyManager.SetCurrentKeySequence(networkInfo.mKeySequence);
mKeyManager.SetMleFrameCounter(networkInfo.mMleFrameCounter);
mKeyManager.SetMacFrameCounter(networkInfo.mMacFrameCounter);
mMac.SetExtAddress(networkInfo.mExtAddress);
mNetif.GetKeyManager().SetCurrentKeySequence(networkInfo.mKeySequence);
mNetif.GetKeyManager().SetMleFrameCounter(networkInfo.mMleFrameCounter);
mNetif.GetKeyManager().SetMacFrameCounter(networkInfo.mMacFrameCounter);
mNetif.GetMac().SetExtAddress(networkInfo.mExtAddress);
UpdateLinkLocalAddress();
if (networkInfo.mDeviceState == kDeviceStateChild)
@@ -294,9 +287,9 @@ ThreadError Mle::Restore(void)
}
else if (networkInfo.mDeviceState == kDeviceStateRouter || networkInfo.mDeviceState == kDeviceStateLeader)
{
mMleRouter.SetRouterId(GetRouterId(GetRloc16()));
mMleRouter.SetPreviousPartitionId(networkInfo.mPreviousPartitionId);
mMleRouter.RestoreChildren();
mNetif.GetMle().SetRouterId(GetRouterId(GetRloc16()));
mNetif.GetMle().SetPreviousPartitionId(networkInfo.mPreviousPartitionId);
mNetif.GetMle().RestoreChildren();
}
exit:
@@ -321,11 +314,13 @@ ThreadError Mle::Store(void)
networkInfo.mDeviceMode = mDeviceMode;
networkInfo.mDeviceState = mDeviceState;
networkInfo.mRloc16 = GetRloc16();
networkInfo.mKeySequence = mKeyManager.GetCurrentKeySequence();
networkInfo.mMleFrameCounter = mKeyManager.GetMleFrameCounter() + OPENTHREAD_CONFIG_STORE_FRAME_COUNTER_AHEAD;
networkInfo.mMacFrameCounter = mKeyManager.GetMacFrameCounter() + OPENTHREAD_CONFIG_STORE_FRAME_COUNTER_AHEAD;
networkInfo.mKeySequence = mNetif.GetKeyManager().GetCurrentKeySequence();
networkInfo.mMleFrameCounter = mNetif.GetKeyManager().GetMleFrameCounter() +
OPENTHREAD_CONFIG_STORE_FRAME_COUNTER_AHEAD;
networkInfo.mMacFrameCounter = mNetif.GetKeyManager().GetMacFrameCounter() +
OPENTHREAD_CONFIG_STORE_FRAME_COUNTER_AHEAD;
networkInfo.mPreviousPartitionId = mLeaderData.GetPartitionId();
memcpy(networkInfo.mExtAddress.m8, mMac.GetExtAddress(), sizeof(networkInfo.mExtAddress));
memcpy(networkInfo.mExtAddress.m8, mNetif.GetMac().GetExtAddress(), sizeof(networkInfo.mExtAddress));
if (mDeviceState == kDeviceStateChild)
{
@@ -336,8 +331,8 @@ ThreadError Mle::Store(void)
SuccessOrExit(error = otPlatSettingsSet(mNetif.GetInstance(), kKeyNetworkInfo,
reinterpret_cast<uint8_t *>(&networkInfo), sizeof(networkInfo)));
mKeyManager.SetStoredMleFrameCounter(networkInfo.mMleFrameCounter);
mKeyManager.SetStoredMacFrameCounter(networkInfo.mMacFrameCounter);
mNetif.GetKeyManager().SetStoredMleFrameCounter(networkInfo.mMleFrameCounter);
mNetif.GetKeyManager().SetStoredMacFrameCounter(networkInfo.mMacFrameCounter);
otLogDebgMle("Store Network Information");
@@ -359,7 +354,7 @@ ThreadError Mle::Discover(uint32_t aScanChannels, uint16_t aScanDuration, uint16
mDiscoverHandler = aCallback;
mDiscoverContext = aContext;
mMesh.SetDiscoverParameters(aScanChannels, aScanDuration);
mNetif.GetMeshForwarder().SetDiscoverParameters(aScanChannels, aScanDuration);
VerifyOrExit((message = NewMleMessage()) != NULL, ;);
message->SetSubType(Message::kSubTypeMleDiscoverRequest);
@@ -461,8 +456,8 @@ ThreadError Mle::BecomeChild(otMleAttachFilter aFilter)
if (aFilter == kMleAttachAnyPartition)
{
mParent.mState = Neighbor::kStateInvalid;
mLastPartitionId = mMleRouter.GetPreviousPartitionId();
mLastPartitionRouterIdSequence = mMleRouter.GetRouterIdSequence();
mLastPartitionId = mNetif.GetMle().GetPreviousPartitionId();
mLastPartitionRouterIdSequence = mNetif.GetMle().GetRouterIdSequence();
}
mParentRequestTimer.Start(kParentRequestRouterTimeout);
@@ -496,12 +491,12 @@ ThreadError Mle::SetStateDetached(void)
mNetif.RemoveUnicastAddress(mLeaderAloc);
}
mAddressResolver.Clear();
mNetif.GetAddressResolver().Clear();
mDeviceState = kDeviceStateDetached;
mParentRequestState = kParentIdle;
mParentRequestTimer.Stop();
mMesh.SetRxOnWhenIdle(true);
mMleRouter.HandleDetachStart();
mNetif.GetMeshForwarder().SetRxOnWhenIdle(true);
mNetif.GetMle().HandleDetachStart();
mNetif.GetIp6().SetForwardingEnabled(false);
mNetif.GetIp6().mMpl.SetTimerExpirations(0);
@@ -532,7 +527,7 @@ ThreadError Mle::SetStateChild(uint16_t aRloc16)
if ((mDeviceMode & ModeTlv::kModeFFD) != 0)
{
mMleRouter.HandleChildStart(mParentRequestMode);
mNetif.GetMle().HandleChildStart(mParentRequestMode);
}
mNetif.GetNetworkDataLocal().ClearResubmitDelayTimer();
@@ -619,7 +614,7 @@ exit:
ThreadError Mle::UpdateLinkLocalAddress(void)
{
mNetif.RemoveUnicastAddress(mLinkLocal64);
mLinkLocal64.GetAddress().SetIid(*mMac.GetExtAddress());
mLinkLocal64.GetAddress().SetIid(*mNetif.GetMac().GetExtAddress());
mNetif.AddUnicastAddress(mLinkLocal64);
mNetif.SetStateChangedFlags(OT_IP6_LL_ADDR_CHANGED);
@@ -686,7 +681,7 @@ const Ip6::Address *Mle::GetRealmLocalAllThreadNodesAddress(void) const
uint16_t Mle::GetRloc16(void) const
{
return mMac.GetShortAddress();
return mNetif.GetMac().GetShortAddress();
}
ThreadError Mle::SetRloc16(uint16_t aRloc16)
@@ -700,7 +695,7 @@ ThreadError Mle::SetRloc16(uint16_t aRloc16)
mNetif.AddUnicastAddress(mMeshLocal16);
}
mMac.SetShortAddress(aRloc16);
mNetif.GetMac().SetShortAddress(aRloc16);
mNetif.GetIp6().mMpl.SetSeedId(aRloc16);
return kThreadError_None;
@@ -781,8 +776,8 @@ exit:
const LeaderDataTlv &Mle::GetLeaderDataTlv(void)
{
mLeaderData.SetDataVersion(mNetworkData.GetVersion());
mLeaderData.SetStableDataVersion(mNetworkData.GetStableVersion());
mLeaderData.SetDataVersion(mNetif.GetNetworkDataLeader().GetVersion());
mLeaderData.SetStableDataVersion(mNetif.GetNetworkDataLeader().GetStableVersion());
return mLeaderData;
}
@@ -988,7 +983,7 @@ ThreadError Mle::AppendLinkFrameCounter(Message &aMessage)
LinkFrameCounterTlv tlv;
tlv.Init();
tlv.SetFrameCounter(mKeyManager.GetMacFrameCounter());
tlv.SetFrameCounter(mNetif.GetKeyManager().GetMacFrameCounter());
return aMessage.Append(&tlv, sizeof(tlv));
}
@@ -998,7 +993,7 @@ ThreadError Mle::AppendMleFrameCounter(Message &aMessage)
MleFrameCounterTlv tlv;
tlv.Init();
tlv.SetFrameCounter(mKeyManager.GetMleFrameCounter());
tlv.SetFrameCounter(mNetif.GetKeyManager().GetMleFrameCounter());
return aMessage.Append(&tlv, sizeof(tlv));
}
@@ -1016,8 +1011,8 @@ ThreadError Mle::AppendAddress16(Message &aMessage, uint16_t aRloc16)
ThreadError Mle::AppendLeaderData(Message &aMessage)
{
mLeaderData.Init();
mLeaderData.SetDataVersion(mNetworkData.GetVersion());
mLeaderData.SetStableDataVersion(mNetworkData.GetStableVersion());
mLeaderData.SetDataVersion(mNetif.GetNetworkDataLeader().GetVersion());
mLeaderData.SetStableDataVersion(mNetif.GetNetworkDataLeader().GetStableVersion());
return aMessage.Append(&mLeaderData, sizeof(mLeaderData));
}
@@ -1025,7 +1020,7 @@ ThreadError Mle::AppendLeaderData(Message &aMessage)
void Mle::FillNetworkDataTlv(NetworkDataTlv &aTlv, bool aStableOnly)
{
uint8_t length;
mNetworkData.GetNetworkData(aStableOnly, aTlv.GetNetworkData(), length);
mNetif.GetNetworkDataLeader().GetNetworkData(aStableOnly, aTlv.GetNetworkData(), length);
aTlv.SetLength(length);
}
@@ -1108,7 +1103,7 @@ ThreadError Mle::AppendAddressRegistration(Message &aMessage)
continue;
}
if (mNetworkData.GetContext(addr->GetAddress(), context) == kThreadError_None)
if (mNetif.GetNetworkDataLeader().GetContext(addr->GetAddress(), context) == kThreadError_None)
{
// compressed entry
entry.SetContextId(context.mContextId);
@@ -1207,7 +1202,7 @@ void Mle::HandleNetifStateChanged(uint32_t aFlags)
{
if (mDeviceMode & ModeTlv::kModeFFD)
{
mMleRouter.HandleNetworkDataUpdateRouter();
mNetif.GetMle().HandleNetworkDataUpdateRouter();
}
else if ((aFlags & OT_NET_ROLE) == 0)
{
@@ -1318,8 +1313,8 @@ void Mle::HandleParentRequestTimer(void)
case kMleAttachAnyPartition:
if (mPreviousPanId != Mac::kPanIdBroadcast)
{
mMac.SetChannel(mPreviousChannel);
mMac.SetPanId(mPreviousPanId);
mNetif.GetMac().SetChannel(mPreviousChannel);
mNetif.GetMac().SetPanId(mPreviousPanId);
mPreviousPanId = Mac::kPanIdBroadcast;
BecomeDetached();
}
@@ -1328,7 +1323,7 @@ void Mle::HandleParentRequestTimer(void)
SendOrphanAnnounce();
BecomeDetached();
}
else if (mMleRouter.BecomeLeader() != kThreadError_None)
else if (mNetif.GetMle().BecomeLeader() != kThreadError_None)
{
mParentRequestState = kParentIdle;
BecomeDetached();
@@ -1469,8 +1464,8 @@ ThreadError Mle::SendChildIdRequest(void)
if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) == 0)
{
mMesh.SetPollPeriod(kAttachDataPollPeriod);
mMesh.SetRxOnWhenIdle(false);
mNetif.GetMeshForwarder().SetPollPeriod(kAttachDataPollPeriod);
mNetif.GetMeshForwarder().SetRxOnWhenIdle(false);
}
exit:
@@ -1576,8 +1571,8 @@ ThreadError Mle::SendChildUpdateRequest(void)
if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) == 0)
{
mMesh.SetPollPeriod(kAttachDataPollPeriod);
mMesh.SetRxOnWhenIdle(false);
mNetif.GetMeshForwarder().SetPollPeriod(kAttachDataPollPeriod);
mNetif.GetMeshForwarder().SetRxOnWhenIdle(false);
}
exit:
@@ -1665,7 +1660,7 @@ ThreadError Mle::SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce)
channel.Init();
channel.SetChannelPage(0);
channel.SetChannel(mMac.GetChannel());
channel.SetChannel(mNetif.GetMac().GetChannel());
SuccessOrExit(error = message->Append(&channel, sizeof(channel)));
if (aOrphanAnnounce)
@@ -1683,7 +1678,7 @@ ThreadError Mle::SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce)
}
panid.Init();
panid.SetPanId(mMac.GetPanId());
panid.SetPanId(mNetif.GetMac().GetPanId());
SuccessOrExit(error = message->Append(&panid, sizeof(panid)));
memset(&destination, 0, sizeof(destination));
@@ -1760,16 +1755,19 @@ ThreadError Mle::SendMessage(Message &aMessage, const Ip6::Address &aDestination
if (header.GetSecuritySuite() == Header::k154Security)
{
header.SetFrameCounter(mKeyManager.GetMleFrameCounter());
header.SetFrameCounter(mNetif.GetKeyManager().GetMleFrameCounter());
keySequence = mKeyManager.GetCurrentKeySequence();
keySequence = mNetif.GetKeyManager().GetCurrentKeySequence();
header.SetKeyId(keySequence);
aMessage.Write(0, header.GetLength(), &header);
GenerateNonce(*mMac.GetExtAddress(), mKeyManager.GetMleFrameCounter(), Mac::Frame::kSecEncMic32, nonce);
GenerateNonce(*mNetif.GetMac().GetExtAddress(),
mNetif.GetKeyManager().GetMleFrameCounter(),
Mac::Frame::kSecEncMic32,
nonce);
aesCcm.SetKey(mKeyManager.GetCurrentMleKey(), 16);
aesCcm.SetKey(mNetif.GetKeyManager().GetCurrentMleKey(), 16);
aesCcm.Init(16 + 16 + header.GetHeaderLength(), aMessage.GetLength() - (header.GetLength() - 1),
sizeof(tag), nonce, sizeof(nonce));
@@ -1791,7 +1789,7 @@ ThreadError Mle::SendMessage(Message &aMessage, const Ip6::Address &aDestination
aesCcm.Finalize(tag, &tagLength);
SuccessOrExit(error = aMessage.Append(tag, tagLength));
mKeyManager.IncrementMleFrameCounter();
mNetif.GetKeyManager().IncrementMleFrameCounter();
}
messageInfo.SetPeerAddr(aDestination);
@@ -1843,7 +1841,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
switch (header.GetCommand())
{
case Header::kCommandDiscoveryRequest:
mMleRouter.HandleDiscoveryRequest(aMessage, aMessageInfo);
mNetif.GetMle().HandleDiscoveryRequest(aMessage, aMessageInfo);
break;
case Header::kCommandDiscoveryResponse:
@@ -1861,13 +1859,13 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
keySequence = header.GetKeyId();
if (keySequence == mKeyManager.GetCurrentKeySequence())
if (keySequence == mNetif.GetKeyManager().GetCurrentKeySequence())
{
mleKey = mKeyManager.GetCurrentMleKey();
mleKey = mNetif.GetKeyManager().GetCurrentMleKey();
}
else
{
mleKey = mKeyManager.GetTemporaryMleKey(keySequence);
mleKey = mNetif.GetKeyManager().GetTemporaryMleKey(keySequence);
}
aMessage.MoveOffset(header.GetLength() - 1);
@@ -1902,9 +1900,9 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
aesCcm.Finalize(tag, &tagLength);
VerifyOrExit(messageTagLength == tagLength && memcmp(messageTag, tag, tagLength) == 0, ;);
if (keySequence > mKeyManager.GetCurrentKeySequence())
if (keySequence > mNetif.GetKeyManager().GetCurrentKeySequence())
{
mKeyManager.SetCurrentKeySequence(keySequence);
mNetif.GetKeyManager().SetCurrentKeySequence(keySequence);
}
aMessage.SetOffset(mleOffset);
@@ -1927,7 +1925,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
}
else
{
neighbor = mMleRouter.GetNeighbor(macAddr);
neighbor = mNetif.GetMle().GetNeighbor(macAddr);
}
break;
@@ -1982,15 +1980,15 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
switch (command)
{
case Header::kCommandLinkRequest:
mMleRouter.HandleLinkRequest(aMessage, aMessageInfo);
mNetif.GetMle().HandleLinkRequest(aMessage, aMessageInfo);
break;
case Header::kCommandLinkAccept:
mMleRouter.HandleLinkAccept(aMessage, aMessageInfo, keySequence);
mNetif.GetMle().HandleLinkAccept(aMessage, aMessageInfo, keySequence);
break;
case Header::kCommandLinkAcceptAndRequest:
mMleRouter.HandleLinkAcceptAndRequest(aMessage, aMessageInfo, keySequence);
mNetif.GetMle().HandleLinkAcceptAndRequest(aMessage, aMessageInfo, keySequence);
break;
case Header::kCommandAdvertisement:
@@ -1998,7 +1996,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
break;
case Header::kCommandDataRequest:
mMleRouter.HandleDataRequest(aMessage, aMessageInfo);
mNetif.GetMle().HandleDataRequest(aMessage, aMessageInfo);
break;
case Header::kCommandDataResponse:
@@ -2006,7 +2004,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
break;
case Header::kCommandParentRequest:
mMleRouter.HandleParentRequest(aMessage, aMessageInfo);
mNetif.GetMle().HandleParentRequest(aMessage, aMessageInfo);
break;
case Header::kCommandParentResponse:
@@ -2014,7 +2012,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
break;
case Header::kCommandChildIdRequest:
mMleRouter.HandleChildIdRequest(aMessage, aMessageInfo, keySequence);
mNetif.GetMle().HandleChildIdRequest(aMessage, aMessageInfo, keySequence);
break;
case Header::kCommandChildIdResponse:
@@ -2024,7 +2022,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
case Header::kCommandChildUpdateRequest:
if (mDeviceState == kDeviceStateLeader || mDeviceState == kDeviceStateRouter)
{
mMleRouter.HandleChildUpdateRequest(aMessage, aMessageInfo);
mNetif.GetMle().HandleChildUpdateRequest(aMessage, aMessageInfo);
}
else
{
@@ -2036,7 +2034,7 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
case Header::kCommandChildUpdateResponse:
if (mDeviceState == kDeviceStateLeader || mDeviceState == kDeviceStateRouter)
{
mMleRouter.HandleChildUpdateResponse(aMessage, aMessageInfo, keySequence);
mNetif.GetMle().HandleChildUpdateResponse(aMessage, aMessageInfo, keySequence);
}
else
{
@@ -2077,7 +2075,7 @@ ThreadError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::Message
if (mDeviceState != kDeviceStateDetached)
{
SuccessOrExit(error = mMleRouter.HandleAdvertisement(aMessage, aMessageInfo));
SuccessOrExit(error = mNetif.GetMle().HandleAdvertisement(aMessage, aMessageInfo));
}
macAddr.Set(aMessageInfo.GetPeerAddr());
@@ -2107,7 +2105,7 @@ ThreadError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::Message
route.IsValid())
{
// Overwrite Route Data
mMleRouter.ProcessRouteTlv(route);
mNetif.GetMle().ProcessRouteTlv(route);
}
mRetrieveNewNetworkData = true;
@@ -2119,7 +2117,7 @@ ThreadError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::Message
case kDeviceStateRouter:
case kDeviceStateLeader:
if ((neighbor = mMleRouter.GetNeighbor(macAddr)) != NULL &&
if ((neighbor = mNetif.GetMle().GetNeighbor(macAddr)) != NULL &&
neighbor->mState == Neighbor::kStateValid)
{
isNeighbor = true;
@@ -2131,7 +2129,7 @@ ThreadError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::Message
if (isNeighbor)
{
if (mRetrieveNewNetworkData ||
(static_cast<int8_t>(leaderData.GetDataVersion() - mNetworkData.GetVersion()) > 0))
(static_cast<int8_t>(leaderData.GetDataVersion() - mNetif.GetNetworkDataLeader().GetVersion()) > 0))
{
SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs));
}
@@ -2179,7 +2177,8 @@ ThreadError Mle::HandleDataResponse(const Message &aMessage, const Ip6::MessageI
}
else if (!mRetrieveNewNetworkData)
{
VerifyOrExit(static_cast<int8_t>(leaderData.GetDataVersion() - mNetworkData.GetVersion()) > 0, ;);
int8_t diff = static_cast<int8_t>(leaderData.GetDataVersion() - mNetif.GetNetworkDataLeader().GetVersion());
VerifyOrExit(diff > 0, ;);
}
// Network Data
@@ -2229,9 +2228,9 @@ ThreadError Mle::HandleDataResponse(const Message &aMessage, const Ip6::MessageI
}
// Network Data
mNetworkData.SetNetworkData(leaderData.GetDataVersion(), leaderData.GetStableDataVersion(),
(mDeviceMode & ModeTlv::kModeFullNetworkData) == 0,
networkData.GetNetworkData(), networkData.GetLength());
mNetif.GetNetworkDataLeader().SetNetworkData(leaderData.GetDataVersion(), leaderData.GetStableDataVersion(),
(mDeviceMode & ModeTlv::kModeFullNetworkData) == 0,
networkData.GetNetworkData(), networkData.GetLength());
// Active Dataset
if (activeTimestamp.GetLength() > 0)
@@ -2365,7 +2364,7 @@ ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::Messag
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLinkMargin, sizeof(linkMarginTlv), linkMarginTlv));
VerifyOrExit(linkMarginTlv.IsValid(), error = kThreadError_Parse);
linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
if (linkMargin > linkMarginTlv.GetLinkMargin())
{
@@ -2382,23 +2381,24 @@ ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::Messag
if ((mDeviceMode & ModeTlv::kModeFFD) && (mDeviceState != kDeviceStateDetached))
{
diff = static_cast<int8_t>(connectivity.GetIdSequence() - mNetif.GetMle().GetRouterIdSequence());
switch (mParentRequestMode)
{
case kMleAttachAnyPartition:
VerifyOrExit(leaderData.GetPartitionId() != mLeaderData.GetPartitionId() ||
static_cast<int8_t>(connectivity.GetIdSequence() - mMleRouter.GetRouterIdSequence()) > 0,);
VerifyOrExit(leaderData.GetPartitionId() != mLeaderData.GetPartitionId() || diff > 0,);
break;
case kMleAttachSamePartition:
VerifyOrExit(leaderData.GetPartitionId() == mLeaderData.GetPartitionId(), ;);
diff = static_cast<int8_t>(connectivity.GetIdSequence() - mMleRouter.GetRouterIdSequence());
VerifyOrExit(diff > 0 || (diff == 0 && mMleRouter.GetLeaderAge() < mMleRouter.GetNetworkIdTimeout()), ;);
VerifyOrExit(diff > 0 ||
(diff == 0 && mNetif.GetMle().GetLeaderAge() < mNetif.GetMle().GetNetworkIdTimeout()), ;);
break;
case kMleAttachBetterPartition:
VerifyOrExit(leaderData.GetPartitionId() != mLeaderData.GetPartitionId(), ;);
VerifyOrExit(mMleRouter.ComparePartitions(connectivity.GetActiveRouters() <= 1, leaderData,
mMleRouter.IsSingleton(), mLeaderData) > 0, ;);
VerifyOrExit(mNetif.GetMle().ComparePartitions(connectivity.GetActiveRouters() <= 1, leaderData,
mNetif.GetMle().IsSingleton(), mLeaderData) > 0, ;);
break;
}
}
@@ -2410,8 +2410,8 @@ ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::Messag
if (mDeviceMode & ModeTlv::kModeFFD)
{
compare = mMleRouter.ComparePartitions(connectivity.GetActiveRouters() <= 1, leaderData,
mParentIsSingleton, mParentLeaderData);
compare = mNetif.GetMle().ComparePartitions(connectivity.GetActiveRouters() <= 1, leaderData,
mParentIsSingleton, mParentLeaderData);
}
// only consider partitions that are the same or better
@@ -2447,7 +2447,7 @@ ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::Messag
mParent.mValid.mMleFrameCounter = mleFrameCounter.GetFrameCounter();
mParent.mMode = ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData;
mParent.mLinkInfo.Clear();
mParent.mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
mParent.mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
mParent.mLinkFailures = 0;
mParent.mState = Neighbor::kStateValid;
mParent.mKeySequence = aKeySequence;
@@ -2559,19 +2559,19 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa
if ((mDeviceMode & ModeTlv::kModeRxOnWhenIdle) == 0)
{
mMesh.SetPollPeriod(Timer::SecToMsec(mTimeout / kMaxChildKeepAliveAttempts));
mMesh.SetRxOnWhenIdle(false);
mNetif.GetMeshForwarder().SetPollPeriod(Timer::SecToMsec(mTimeout / kMaxChildKeepAliveAttempts));
mNetif.GetMeshForwarder().SetRxOnWhenIdle(false);
}
else
{
mMesh.SetRxOnWhenIdle(true);
mNetif.GetMeshForwarder().SetRxOnWhenIdle(true);
}
// Route
if ((Tlv::GetTlv(aMessage, Tlv::kRoute, sizeof(route), route) == kThreadError_None) &&
(mDeviceMode & ModeTlv::kModeFFD))
{
SuccessOrExit(error = mMleRouter.ProcessRouteTlv(route));
SuccessOrExit(error = mNetif.GetMle().ProcessRouteTlv(route));
for (uint8_t i = 0; i <= kMaxRouterId; i++)
{
@@ -2581,7 +2581,7 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa
}
}
if (mRouterSelectionJitterTimeout == 0 && numRouters < mMleRouter.GetRouterUpgradeThreshold())
if (mRouterSelectionJitterTimeout == 0 && numRouters < mNetif.GetMle().GetRouterUpgradeThreshold())
{
mRouterSelectionJitterTimeout = (otPlatRandomGet() % mRouterSelectionJitter) + 1;
}
@@ -2589,9 +2589,9 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa
mParent.mValid.mRloc16 = sourceAddress.GetRloc16();
mNetworkData.SetNetworkData(leaderData.GetDataVersion(), leaderData.GetStableDataVersion(),
(mDeviceMode & ModeTlv::kModeFullNetworkData) == 0,
networkData.GetNetworkData(), networkData.GetLength());
mNetif.GetNetworkDataLeader().SetNetworkData(leaderData.GetDataVersion(), leaderData.GetStableDataVersion(),
(mDeviceMode & ModeTlv::kModeFullNetworkData) == 0,
networkData.GetNetworkData(), networkData.GetLength());
mNetif.GetActiveDataset().ApplyConfiguration();
SuccessOrExit(error = SetStateChild(shortAddress.GetRloc16()));
@@ -2634,9 +2634,10 @@ ThreadError Mle::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Me
VerifyOrExit(leaderData.IsValid(), error = kThreadError_Parse);
SetLeaderData(leaderData.GetPartitionId(), leaderData.GetWeighting(), leaderData.GetLeaderRouterId());
if ((mDeviceMode & ModeTlv::kModeFullNetworkData && leaderData.GetDataVersion() != mNetworkData.GetVersion()) ||
if ((mDeviceMode & ModeTlv::kModeFullNetworkData &&
leaderData.GetDataVersion() != mNetif.GetNetworkDataLeader().GetVersion()) ||
((mDeviceMode & ModeTlv::kModeFullNetworkData) == 0 &&
leaderData.GetStableDataVersion() != mNetworkData.GetStableVersion()))
leaderData.GetStableDataVersion() != mNetif.GetNetworkDataLeader().GetStableVersion()))
{
mRetrieveNewNetworkData = true;
}
@@ -2645,9 +2646,11 @@ ThreadError Mle::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Me
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());
mNetif.GetNetworkDataLeader().SetNetworkData(leaderData.GetDataVersion(),
leaderData.GetStableDataVersion(),
(mDeviceMode & ModeTlv::kModeFullNetworkData) == 0,
networkData.GetNetworkData(),
networkData.GetLength());
}
}
@@ -2746,25 +2749,27 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
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());
mNetif.GetNetworkDataLeader().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);
mNetif.GetMeshForwarder().SetPollPeriod(Timer::SecToMsec(mTimeout / kMaxChildKeepAliveAttempts));
mNetif.GetMeshForwarder().SetRxOnWhenIdle(false);
}
else
{
mMesh.SetRxOnWhenIdle(true);
mNetif.GetMeshForwarder().SetRxOnWhenIdle(true);
}
if (mDeviceMode & ModeTlv::kModeFullNetworkData)
{
// full network data
if (leaderData.GetDataVersion() != mNetworkData.GetVersion())
if (leaderData.GetDataVersion() != mNetif.GetNetworkDataLeader().GetVersion())
{
SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs));
}
@@ -2772,7 +2777,7 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M
else
{
// stable network data
if (leaderData.GetStableDataVersion() != mNetworkData.GetStableVersion())
if (leaderData.GetStableDataVersion() != mNetif.GetNetworkDataLeader().GetStableVersion())
{
SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs));
}
@@ -2824,10 +2829,10 @@ ThreadError Mle::HandleAnnounce(const Message &aMessage, const Ip6::MessageInfo
}
Stop(false);
mPreviousChannel = mMac.GetChannel();
mPreviousPanId = mMac.GetPanId();
mMac.SetChannel(static_cast<uint8_t>(channel.GetChannel()));
mMac.SetPanId(panid.GetPanId());
mPreviousChannel = mNetif.GetMac().GetChannel();
mPreviousPanId = mNetif.GetMac().GetPanId();
mNetif.GetMac().SetChannel(static_cast<uint8_t>(channel.GetChannel()));
mNetif.GetMac().SetPanId(panid.GetPanId());
Start(false);
}
else
-7
View File
@@ -1164,13 +1164,6 @@ protected:
void SetLeaderData(uint32_t aPartitionId, uint8_t aWeighting, uint8_t aLeaderRouterId);
ThreadNetif &mNetif; ///< The Thread Network Interface object.
AddressResolver &mAddressResolver; ///< The Address Resolver object.
KeyManager &mKeyManager; ///< The Key Manager object.
Mac::Mac &mMac; ///< The MAC object.
MeshForwarder &mMesh; ///< The Mesh Forwarding object.
MleRouter &mMleRouter; ///< The MLE Router object.
NetworkData::Leader &mNetworkData; ///< The Network Data object.
MeshCoP::JoinerRouter &mJoinerRouter; ///< The Joiner Router object.
LeaderDataTlv mLeaderData; ///< Last received Leader Data TLV.
bool mRetrieveNewNetworkData; ///< Indicating new Network Data is needed if set.
+70 -68
View File
@@ -1,6 +1,5 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
* Copyright (c) 2016, 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:
@@ -59,9 +58,7 @@ MleRouter::MleRouter(ThreadNetif &aThreadNetif):
mDelayedResponseTimer(aThreadNetif.GetIp6().mTimerScheduler, &MleRouter::HandleDelayedResponseTimer, this),
mChildUpdateRequestTimer(aThreadNetif.GetIp6().mTimerScheduler, &MleRouter::HandleChildUpdateRequestTimer, this),
mAddressSolicit(OPENTHREAD_URI_ADDRESS_SOLICIT, &MleRouter::HandleAddressSolicit, this),
mAddressRelease(OPENTHREAD_URI_ADDRESS_RELEASE, &MleRouter::HandleAddressRelease, this),
mCoapServer(aThreadNetif.GetCoapServer()),
mCoapClient(aThreadNetif.GetCoapClient())
mAddressRelease(OPENTHREAD_URI_ADDRESS_RELEASE, &MleRouter::HandleAddressRelease, this)
{
mChallengeTimeout = 0;
mNextChildId = kMaxChildId;
@@ -195,8 +192,8 @@ ThreadError MleRouter::ReleaseRouterId(uint8_t aRouterId)
mRouterIdSequence++;
mRouterIdSequenceLastUpdated = Timer::GetNow();
mAddressResolver.Remove(aRouterId);
mNetworkData.RemoveBorderRouter(GetRloc16(aRouterId));
mNetif.GetAddressResolver().Remove(aRouterId);
mNetif.GetNetworkDataLeader().RemoveBorderRouter(GetRloc16(aRouterId));
ResetAdvertiseInterval();
exit:
@@ -225,7 +222,7 @@ ThreadError MleRouter::BecomeRouter(ThreadStatusTlv::Status aStatus)
}
mAdvertiseTimer.Stop();
mAddressResolver.Clear();
mNetif.GetAddressResolver().Clear();
mRouterSelectionJitterTimeout = 0;
switch (mDeviceState)
@@ -268,7 +265,7 @@ ThreadError MleRouter::BecomeLeader(void)
mAdvertiseTimer.Stop();
mStateUpdateTimer.Start(kStateUpdatePeriod);
mAddressResolver.Clear();
mNetif.GetAddressResolver().Clear();
routerId = IsRouterIdValid(mPreviousRouterId) ? AllocateRouterId(mPreviousRouterId) : AllocateRouterId();
router = GetRouter(routerId);
@@ -276,7 +273,7 @@ ThreadError MleRouter::BecomeLeader(void)
SetRouterId(routerId);
memcpy(&router->mMacAddr, mMac.GetExtAddress(), sizeof(router->mMacAddr));
memcpy(&router->mMacAddr, mNetif.GetMac().GetExtAddress(), sizeof(router->mMacAddr));
if (mFixedLeaderPartitionId != 0)
{
@@ -289,7 +286,7 @@ ThreadError MleRouter::BecomeLeader(void)
mRouterIdSequence = static_cast<uint8_t>(otPlatRandomGet());
mNetworkData.Reset();
mNetif.GetNetworkDataLeader().Reset();
SuccessOrExit(error = SetStateLeader(GetRloc16(mRouterId)));
@@ -303,12 +300,12 @@ exit:
void MleRouter::StopLeader(void)
{
mCoapServer.RemoveResource(mAddressSolicit);
mCoapServer.RemoveResource(mAddressRelease);
mNetif.GetCoapServer().RemoveResource(mAddressSolicit);
mNetif.GetCoapServer().RemoveResource(mAddressRelease);
mNetif.GetActiveDataset().StopLeader();
mNetif.GetPendingDataset().StopLeader();
mAdvertiseTimer.Stop();
mNetworkData.Stop();
mNetif.GetNetworkDataLeader().Stop();
mNetif.UnsubscribeAllRoutersMulticast();
}
@@ -405,7 +402,7 @@ ThreadError MleRouter::SetStateRouter(uint16_t aRloc16)
mNetif.SubscribeAllRoutersMulticast();
mRouters[mRouterId].mNextHop = mRouterId;
mPreviousPartitionId = mLeaderData.GetPartitionId();
mNetworkData.Stop();
mNetif.GetNetworkDataLeader().Stop();
mStateUpdateTimer.Start(kStateUpdatePeriod);
mNetif.GetIp6().SetForwardingEnabled(true);
mNetif.GetIp6().mMpl.SetTimerExpirations(kMplRouterDataMessageTimerExpirations);
@@ -440,11 +437,11 @@ ThreadError MleRouter::SetStateLeader(uint16_t aRloc16)
mPreviousPartitionId = mLeaderData.GetPartitionId();
mRouters[mRouterId].mLastHeard = Timer::GetNow();
mNetworkData.Start();
mNetif.GetNetworkDataLeader().Start();
mNetif.GetActiveDataset().StartLeader();
mNetif.GetPendingDataset().StartLeader();
mCoapServer.AddResource(mAddressSolicit);
mCoapServer.AddResource(mAddressRelease);
mNetif.GetCoapServer().AddResource(mAddressSolicit);
mNetif.GetCoapServer().AddResource(mAddressRelease);
mNetif.GetIp6().SetForwardingEnabled(true);
mNetif.GetIp6().mMpl.SetTimerExpirations(kMplRouterDataMessageTimerExpirations);
@@ -710,7 +707,7 @@ ThreadError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Mes
memcpy(&neighbor->mMacAddr, &macAddr, sizeof(neighbor->mMacAddr));
neighbor->mLinkInfo.Clear();
neighbor->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
neighbor->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
neighbor->mLinkFailures = 0;
neighbor->mState = Neighbor::kStateLinkRequest;
}
@@ -764,7 +761,7 @@ ThreadError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neig
SuccessOrExit(error = AppendMleFrameCounter(*message));
// always append a link margin, regardless of whether or not it was requested
linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
// add for certification testing
if (isAssignLinkQuality &&
@@ -1006,7 +1003,7 @@ ThreadError MleRouter::HandleLinkAccept(const Message &aMessage, const Ip6::Mess
router->mLastHeard = Timer::GetNow();
router->mMode = ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData;
router->mLinkInfo.Clear();
router->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
router->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
router->mLinkFailures = 0;
router->mState = Neighbor::kStateValid;
router->mKeySequence = aKeySequence;
@@ -1109,7 +1106,7 @@ uint8_t MleRouter::GetLinkCost(uint8_t aRouterId)
// NULL aRouterId indicates non-existing next hop, hence return kMaxRouteCost for it.
VerifyOrExit(aRouterId != mRouterId && router != NULL && router->mState == Neighbor::kStateValid,);
rval = router->mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
rval = router->mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor());
if (rval > router->mLinkQualityOut)
{
@@ -1143,7 +1140,7 @@ ThreadError MleRouter::ProcessRouteTlv(const RouteTlv &aRoute)
if (old && !mRouters[i].mAllocated)
{
mRouters[i].mNextHop = kInvalidRouterId;
mAddressResolver.Remove(i);
mNetif.GetAddressResolver().Remove(i);
}
}
@@ -1421,7 +1418,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
{
memcpy(&router->mMacAddr, &macAddr, sizeof(router->mMacAddr));
router->mLinkInfo.Clear();
router->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
router->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
router->mLinkFailures = 0;
router->mState = Neighbor::kStateLinkRequest;
SendLinkRequest(router);
@@ -1468,7 +1465,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
{
memcpy(&router->mMacAddr, &macAddr, sizeof(router->mMacAddr));
router->mLinkInfo.Clear();
router->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
router->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
router->mLinkFailures = 0;
router->mState = Neighbor::kStateLinkRequest;
router->mDataRequest = false;
@@ -1605,8 +1602,11 @@ void MleRouter::UpdateRoutes(const RouteTlv &aRoute, uint8_t aRouterId)
continue;
}
otLogDebgMle("%x: %x %d %d %d %d", GetRloc16(i), GetRloc16(mRouters[i].mNextHop),
mRouters[i].mCost, GetLinkCost(i), mRouters[i].mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor()),
otLogDebgMle("%x: %x %d %d %d %d",
GetRloc16(i),
GetRloc16(mRouters[i].mNextHop),
mRouters[i].mCost,
GetLinkCost(i), mRouters[i].mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()),
mRouters[i].mLinkQualityOut);
}
@@ -1683,7 +1683,7 @@ ThreadError MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::M
// MAC Address
memcpy(&child->mMacAddr, &macAddr, sizeof(child->mMacAddr));
child->mLinkInfo.Clear();
child->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
child->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
child->mLinkFailures = 0;
child->mState = Neighbor::kStateParentRequest;
child->mDataRequest = false;
@@ -1985,7 +1985,8 @@ ThreadError MleRouter::SendParentResponse(Child *aChild, const ChallengeTlv &cha
}
else
{
SuccessOrExit(error = AppendLinkMargin(*message, aChild->mLinkInfo.GetLinkMargin(mMac.GetNoiseFloor())));
error = AppendLinkMargin(*message, aChild->mLinkInfo.GetLinkMargin(mNetif.GetMac().GetNoiseFloor()));
SuccessOrExit(error);
}
SuccessOrExit(error = AppendConnectivity(*message));
@@ -2035,7 +2036,7 @@ ThreadError MleRouter::UpdateChildAddresses(const AddressRegistrationTlv &aTlv,
if (entry->IsCompressed())
{
// xxx check if context id exists
mNetworkData.GetContext(entry->GetContextId(), context);
mNetif.GetNetworkDataLeader().GetContext(entry->GetContextId(), context);
memcpy(&aChild.mIp6Address[count], context.mPrefix, BitVectorBytes(context.mPrefixLength));
aChild.mIp6Address[count].SetIid(entry->GetIid());
}
@@ -2153,7 +2154,7 @@ ThreadError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6::
child->mValid.mMleFrameCounter = mleFrameCounter.GetFrameCounter();
child->mKeySequence = aKeySequence;
child->mMode = mode.GetMode();
child->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
child->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
child->mTimeout = timeout.GetTimeout();
if (mode.GetMode() & ModeTlv::kModeFullNetworkData)
@@ -2272,7 +2273,7 @@ ThreadError MleRouter::HandleChildUpdateRequest(const Message &aMessage, const I
// full network data
child->mNetworkDataVersion = leaderData.GetDataVersion();
if (leaderData.GetDataVersion() != mNetworkData.GetVersion())
if (leaderData.GetDataVersion() != mNetif.GetNetworkDataLeader().GetVersion())
{
tlvs[tlvslength++] = Tlv::kNetworkData;
}
@@ -2282,7 +2283,7 @@ ThreadError MleRouter::HandleChildUpdateRequest(const Message &aMessage, const I
// stable network data
child->mNetworkDataVersion = leaderData.GetStableDataVersion();
if (leaderData.GetStableDataVersion() != mNetworkData.GetStableVersion())
if (leaderData.GetStableDataVersion() != mNetif.GetNetworkDataLeader().GetStableVersion())
{
tlvs[tlvslength++] = Tlv::kNetworkData;
}
@@ -2392,7 +2393,7 @@ ThreadError MleRouter::HandleChildUpdateResponse(const Message &aMessage, const
child->mLastHeard = Timer::GetNow();
child->mKeySequence = aKeySequence;
child->mLinkInfo.AddRss(mMac.GetNoiseFloor(), threadMessageInfo->mRss);
child->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss);
child->mAddSrcMatchEntryShort = true;
child->mState = Neighbor::kStateValid;
@@ -2483,14 +2484,14 @@ ThreadError MleRouter::HandleNetworkDataUpdateRouter(void)
if (child->mMode & ModeTlv::kModeFullNetworkData)
{
if (child->mNetworkDataVersion != mNetworkData.GetVersion())
if (child->mNetworkDataVersion != mNetif.GetNetworkDataLeader().GetVersion())
{
SendDataResponse(destination, tlvs, sizeof(tlvs));
}
}
else
{
if (child->mNetworkDataVersion != mNetworkData.GetStableVersion())
if (child->mNetworkDataVersion != mNetif.GetNetworkDataLeader().GetStableVersion())
{
static const uint8_t responseTlvs[] = {Tlv::kNetworkData, Tlv::kActiveDataset, Tlv::kPendingDataset};
@@ -2553,7 +2554,7 @@ ThreadError MleRouter::HandleDiscoveryRequest(const Message &aMessage, const Ip6
case MeshCoP::Tlv::kExtendedPanId:
aMessage.Read(offset, sizeof(extPanId), &extPanId);
VerifyOrExit(extPanId.IsValid(), error = kThreadError_Parse);
VerifyOrExit(memcmp(mMac.GetExtendedPanId(), extPanId.GetExtendedPanId(), OT_EXT_PAN_ID_SIZE),
VerifyOrExit(memcmp(mNetif.GetMac().GetExtendedPanId(), extPanId.GetExtendedPanId(), OT_EXT_PAN_ID_SIZE),
error = kThreadError_Drop);
break;
@@ -2616,12 +2617,12 @@ ThreadError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, u
// Extended PAN ID TLV
extPanId.Init();
extPanId.SetExtendedPanId(mMac.GetExtendedPanId());
extPanId.SetExtendedPanId(mNetif.GetMac().GetExtendedPanId());
SuccessOrExit(error = message->Append(&extPanId, sizeof(extPanId)));
// Network Name TLV
networkName.Init();
networkName.SetNetworkName(mMac.GetNetworkName());
networkName.SetNetworkName(mNetif.GetMac().GetNetworkName());
SuccessOrExit(error = message->Append(&networkName, sizeof(tlv) + networkName.GetLength()));
// Steering Data TLV
@@ -2634,7 +2635,7 @@ ThreadError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, u
// Joiner UDP Port TLV
joinerUdpPort.Init();
joinerUdpPort.SetUdpPort(mJoinerRouter.GetJoinerUdpPort());
joinerUdpPort.SetUdpPort(mNetif.GetJoinerRouter().GetJoinerUdpPort());
SuccessOrExit(error = message->Append(&joinerUdpPort, sizeof(tlv) + joinerUdpPort.GetLength()));
tlv.SetLength(static_cast<uint8_t>(message->GetLength() - startOffset));
@@ -2682,7 +2683,7 @@ ThreadError MleRouter::SendChildIdResponse(Child *aChild)
while (FindChild(mNextChildId) != NULL);
// allocate Child ID
aChild->mValid.mRloc16 = mMac.GetShortAddress() | mNextChildId;
aChild->mValid.mRloc16 = mNetif.GetMac().GetShortAddress() | mNextChildId;
}
SuccessOrExit(error = AppendAddress16(*message, aChild->mValid.mRloc16));
@@ -2866,7 +2867,7 @@ ThreadError MleRouter::SendDataResponse(const Ip6::Address &aDestination, const
switch (aTlvs[i])
{
case Tlv::kNetworkData:
neighbor = mMleRouter.GetNeighbor(aDestination);
neighbor = GetNeighbor(aDestination);
stableOnly = neighbor != NULL ? (neighbor->mMode & ModeTlv::kModeFullNetworkData) == 0 : false;
SuccessOrExit(error = AppendNetworkData(*message, stableOnly));
break;
@@ -3001,9 +3002,9 @@ ThreadError MleRouter::RemoveNeighbor(Neighbor &aNeighbor)
if (aNeighbor.mState == Neighbor::kStateValid && !IsActiveRouter(aNeighbor.mValid.mRloc16))
{
aNeighbor.mState = Neighbor::kStateInvalid;
mMesh.UpdateIndirectMessages();
mNetif.GetMeshForwarder().UpdateIndirectMessages();
mNetif.SetStateChangedFlags(OT_THREAD_CHILD_REMOVED);
mNetworkData.SendServerDataNotification(aNeighbor.mValid.mRloc16);
mNetif.GetNetworkDataLeader().SendServerDataNotification(aNeighbor.mValid.mRloc16);
RemoveStoredChild(aNeighbor.mValid.mRloc16);
}
@@ -3152,7 +3153,7 @@ Neighbor *MleRouter::GetNeighbor(const Ip6::Address &aAddress)
ExitNow(rval = GetNeighbor(macaddr));
}
if (mNetworkData.GetContext(aAddress, context) != kThreadError_None)
if (mNetif.GetNetworkDataLeader().GetContext(aAddress, context) != kThreadError_None)
{
context.mContextId = 0xff;
}
@@ -3424,7 +3425,7 @@ ThreadError MleRouter::StoreChild(uint16_t aChildRloc16)
ThreadError error = kThreadError_None;
otChildInfo childInfo;
SuccessOrExit(error = mMleRouter.GetChildInfoById(GetChildId(aChildRloc16), childInfo));
SuccessOrExit(error = GetChildInfoById(GetChildId(aChildRloc16), childInfo));
error = otPlatSettingsAdd(mNetif.GetInstance(), kKeyChildInfo, reinterpret_cast<uint8_t *>(&childInfo),
sizeof(childInfo));
@@ -3445,7 +3446,7 @@ void MleRouter::GetChildInfo(Child &aChild, otChildInfo &aChildInfo)
aChildInfo.mChildId = GetChildId(aChild.mValid.mRloc16);
aChildInfo.mNetworkDataVersion = aChild.mNetworkDataVersion;
aChildInfo.mAge = Timer::MsecToSec(Timer::GetNow() - aChild.mLastHeard);
aChildInfo.mLinkQualityIn = aChild.mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
aChildInfo.mLinkQualityIn = aChild.mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor());
aChildInfo.mAverageRssi = aChild.mLinkInfo.GetAverageRss();
aChildInfo.mRxOnWhenIdle = (aChild.mMode & ModeTlv::kModeRxOnWhenIdle) != 0;
@@ -3480,7 +3481,7 @@ ThreadError MleRouter::GetRouterInfo(uint16_t aRouterId, otRouterInfo &aRouterIn
aRouterInfo.mNextHop = router->mNextHop;
aRouterInfo.mLinkEstablished = router->mState == Neighbor::kStateValid;
aRouterInfo.mPathCost = router->mCost;
aRouterInfo.mLinkQualityIn = router->mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
aRouterInfo.mLinkQualityIn = router->mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor());
aRouterInfo.mLinkQualityOut = router->mLinkQualityOut;
aRouterInfo.mAge = static_cast<uint8_t>(Timer::MsecToSec(Timer::GetNow() - router->mLastHeard));
@@ -3541,7 +3542,7 @@ exit:
aNeighInfo.mRloc16 = neighbor->mValid.mRloc16;
aNeighInfo.mLinkFrameCounter = neighbor->mValid.mLinkFrameCounter;
aNeighInfo.mMleFrameCounter = neighbor->mValid.mMleFrameCounter;
aNeighInfo.mLinkQualityIn = neighbor->mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
aNeighInfo.mLinkQualityIn = neighbor->mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor());
aNeighInfo.mAverageRssi = neighbor->mLinkInfo.GetAverageRss();
aNeighInfo.mRxOnWhenIdle = (neighbor->mMode & ModeTlv::kModeRxOnWhenIdle) != 0;
aNeighInfo.mSecureDataRequest = (neighbor->mMode & ModeTlv::kModeSecureDataRequest) != 0;
@@ -3575,7 +3576,7 @@ ThreadError MleRouter::CheckReachability(uint16_t aMeshSource, uint16_t aMeshDes
return Mle::CheckReachability(aMeshSource, aMeshDest, aIp6Header);
}
if (aMeshDest == mMac.GetShortAddress())
if (aMeshDest == mNetif.GetMac().GetShortAddress())
{
// mesh destination is this device
if (mNetif.IsUnicastAddress(aIp6Header.GetDestination()))
@@ -3629,10 +3630,10 @@ ThreadError MleRouter::SendAddressSolicit(ThreadStatusTlv::Status aStatus)
header.AppendUriPathOptions(OPENTHREAD_URI_ADDRESS_SOLICIT);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMessage(header)) != NULL, error = kThreadError_NoBufs);
macAddr64Tlv.Init();
macAddr64Tlv.SetMacAddr(*mMac.GetExtAddress());
macAddr64Tlv.SetMacAddr(*mNetif.GetMac().GetExtAddress());
SuccessOrExit(error = message->Append(&macAddr64Tlv, sizeof(macAddr64Tlv)));
if (IsRouterIdValid(mPreviousRouterId))
@@ -3650,8 +3651,8 @@ ThreadError MleRouter::SendAddressSolicit(ThreadStatusTlv::Status aStatus)
messageInfo.SetSockAddr(GetMeshLocal16());
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo,
&MleRouter::HandleAddressSolicitResponse, this));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo,
&MleRouter::HandleAddressSolicitResponse, this));
otLogInfoMle("Sent address solicit to %04x", HostSwap16(messageInfo.GetPeerAddr().mFields.m16[7]));
@@ -3679,19 +3680,19 @@ ThreadError MleRouter::SendAddressRelease(void)
header.AppendUriPathOptions(OPENTHREAD_URI_ADDRESS_RELEASE);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMessage(header)) != NULL, error = kThreadError_NoBufs);
rlocTlv.Init();
rlocTlv.SetRloc16(GetRloc16(mRouterId));
SuccessOrExit(error = message->Append(&rlocTlv, sizeof(rlocTlv)));
macAddr64Tlv.Init();
macAddr64Tlv.SetMacAddr(*mMac.GetExtAddress());
macAddr64Tlv.SetMacAddr(*mNetif.GetMac().GetExtAddress());
SuccessOrExit(error = message->Append(&macAddr64Tlv, sizeof(macAddr64Tlv)));
SuccessOrExit(error = GetLeaderAddress(messageInfo.GetPeerAddr()));
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMle("Sent address release");
@@ -3788,7 +3789,7 @@ void MleRouter::HandleAddressSolicitResponse(Coap::Header *aHeader, Message *aMe
if (old && !mRouters[i].mAllocated)
{
mAddressResolver.Remove(i);
mNetif.GetAddressResolver().Remove(i);
}
}
@@ -3941,7 +3942,7 @@ void MleRouter::SendAddressSolicitResponse(const Coap::Header &aRequestHeader, u
ThreadRloc16Tlv rlocTlv;
Message *message;
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapServer().NewMessage(0)) != NULL, error = kThreadError_NoBufs);
responseHeader.SetDefaultResponseHeader(aRequestHeader);
responseHeader.SetPayloadMarker();
@@ -3973,7 +3974,7 @@ void MleRouter::SendAddressSolicitResponse(const Coap::Header &aRequestHeader, u
SuccessOrExit(error = message->Append(&routerMaskTlv, sizeof(routerMaskTlv)));
}
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
SuccessOrExit(error = mNetif.GetCoapServer().SendMessage(*message, aMessageInfo));
otLogInfoMle("Sent address reply");
@@ -4020,7 +4021,7 @@ void MleRouter::HandleAddressRelease(Coap::Header &aHeader, Message &aMessage,
ReleaseRouterId(routerId);
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo));
SuccessOrExit(mNetif.GetCoapServer().SendEmptyAck(aHeader, aMessageInfo));
otLogInfoMle("Sent address release response");
@@ -4067,7 +4068,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv)
break;
case kDeviceStateChild:
switch (mParent.mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor()))
switch (mParent.mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()))
{
case 1:
tlv.SetLinkQuality1(tlv.GetLinkQuality1() + 1);
@@ -4082,7 +4083,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv)
break;
}
cost += LqiToCost(mParent.mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor()));
cost += LqiToCost(mParent.mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()));
break;
case kDeviceStateRouter:
@@ -4108,7 +4109,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv)
continue;
}
lqi = mRouters[i].mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
lqi = mRouters[i].mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor());
if (lqi > mRouters[i].mLinkQualityOut)
{
@@ -4170,7 +4171,7 @@ ThreadError MleRouter::AppendChildAddresses(Message &aMessage, Child &aChild)
break;
}
if (mNetworkData.GetContext(aChild.mIp6Address[i], context) == kThreadError_None)
if (mNetif.GetNetworkDataLeader().GetContext(aChild.mIp6Address[i], context) == kThreadError_None)
{
// compressed entry
entry.SetContextId(context.mContextId);
@@ -4243,7 +4244,8 @@ void MleRouter::FillRouteTlv(RouteTlv &tlv)
}
else
{
tlv.SetLinkQualityIn(routeCount, mRouters[i].mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor()));
tlv.SetLinkQualityIn(routeCount,
mRouters[i].mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()));
}
}
@@ -4320,7 +4322,7 @@ bool MleRouter::HasOneNeighborwithComparableConnectivity(const RouteTlv &aRoute,
continue;
}
localLqi = mRouters[i].mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
localLqi = mRouters[i].mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor());
if (localLqi > mRouters[i].mLinkQualityOut)
{
@@ -4427,7 +4429,7 @@ uint8_t MleRouter::GetMinDowngradeNeighborRouters(void)
continue;
}
lqi = mRouters[i].mLinkInfo.GetLinkQuality(mMac.GetNoiseFloor());
lqi = mRouters[i].mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor());
if (lqi > mRouters[i].mLinkQualityOut)
{
-3
View File
@@ -838,9 +838,6 @@ private:
uint8_t mRouterId;
uint8_t mPreviousRouterId;
uint32_t mPreviousPartitionId;
Coap::Server &mCoapServer;
Coap::Client &mCoapClient;
};
} // namespace Mle
+6 -7
View File
@@ -48,11 +48,10 @@ namespace Thread {
namespace NetworkData {
NetworkData::NetworkData(ThreadNetif &aThreadNetif, bool aLocal):
mMle(aThreadNetif.GetMle()),
mNetif(aThreadNetif),
mLocal(aLocal),
mLastAttemptWait(false),
mLastAttempt(0),
mCoapClient(aThreadNetif.GetCoapClient())
mLastAttempt(0)
{
mLength = 0;
}
@@ -605,7 +604,7 @@ ThreadError NetworkData::SendServerDataNotification(uint16_t aRloc16)
header.AppendUriPathOptions(OPENTHREAD_URI_SERVER_DATA);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMessage(header)) != NULL, error = kThreadError_NoBufs);
if (mLocal)
{
@@ -624,10 +623,10 @@ ThreadError NetworkData::SendServerDataNotification(uint16_t aRloc16)
SuccessOrExit(error = message->Append(&rloc16Tlv, sizeof(rloc16Tlv)));
}
mMle.GetLeaderAloc(messageInfo.GetPeerAddr());
messageInfo.SetSockAddr(mMle.GetMeshLocal16());
mNetif.GetMle().GetLeaderAloc(messageInfo.GetPeerAddr());
messageInfo.SetSockAddr(mNetif.GetMle().GetMeshLocal16());
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
if (mLocal)
{
+1 -3
View File
@@ -339,7 +339,7 @@ protected:
uint8_t mTlvs[kMaxSize]; ///< The Network Data buffer.
uint8_t mLength; ///< The number of valid bytes in @var mTlvs.
Mle::MleRouter &mMle;
ThreadNetif &mNetif;
private:
enum
@@ -350,8 +350,6 @@ private:
const bool mLocal;
bool mLastAttemptWait;
uint32_t mLastAttempt;
Coap::Client &mCoapClient;
};
} // namespace NetworkData
+8 -8
View File
@@ -55,8 +55,7 @@ namespace Thread {
namespace NetworkData {
LeaderBase::LeaderBase(ThreadNetif &aThreadNetif):
NetworkData(aThreadNetif, false),
mNetif(aThreadNetif)
NetworkData(aThreadNetif, false)
{
Reset();
}
@@ -86,9 +85,9 @@ ThreadError LeaderBase::GetContext(const Ip6::Address &aAddress, Lowpan::Context
aContext.mPrefixLength = 0;
if (PrefixMatch(mMle.GetMeshLocalPrefix(), aAddress.mFields.m8, 64) >= 0)
if (PrefixMatch(mNetif.GetMle().GetMeshLocalPrefix(), aAddress.mFields.m8, 64) >= 0)
{
aContext.mPrefix = mMle.GetMeshLocalPrefix();
aContext.mPrefix = mNetif.GetMle().GetMeshLocalPrefix();
aContext.mPrefixLength = 64;
aContext.mContextId = 0;
aContext.mCompressFlag = true;
@@ -137,7 +136,7 @@ ThreadError LeaderBase::GetContext(uint8_t aContextId, Lowpan::Context &aContext
if (aContextId == 0)
{
aContext.mPrefix = mMle.GetMeshLocalPrefix();
aContext.mPrefix = mNetif.GetMle().GetMeshLocalPrefix();
aContext.mPrefixLength = 64;
aContext.mContextId = 0;
aContext.mCompressFlag = true;
@@ -209,7 +208,7 @@ bool LeaderBase::IsOnMesh(const Ip6::Address &aAddress)
PrefixTlv *prefix;
bool rval = false;
if (memcmp(aAddress.mFields.m8, mMle.GetMeshLocalPrefix(), 8) == 0)
if (memcmp(aAddress.mFields.m8, mNetif.GetMle().GetMeshLocalPrefix(), 8) == 0)
{
ExitNow(rval = true);
}
@@ -332,7 +331,8 @@ ThreadError LeaderBase::ExternalRouteLookup(uint8_t aDomainId, const Ip6::Addres
if (rvalRoute == NULL ||
entry->GetPreference() > rvalRoute->GetPreference() ||
(entry->GetPreference() == rvalRoute->GetPreference() &&
mMle.GetRouteCost(entry->GetRloc()) < mMle.GetRouteCost(rvalRoute->GetRloc())))
mNetif.GetMle().GetRouteCost(entry->GetRloc()) <
mNetif.GetMle().GetRouteCost(rvalRoute->GetRloc())))
{
rvalRoute = entry;
rval_plen = static_cast<uint8_t>(plen);
@@ -389,7 +389,7 @@ ThreadError LeaderBase::DefaultRouteLookup(PrefixTlv &aPrefix, uint16_t *aRloc16
if (route == NULL ||
entry->GetPreference() > route->GetPreference() ||
(entry->GetPreference() == route->GetPreference() &&
mMle.GetRouteCost(entry->GetRloc()) < mMle.GetRouteCost(route->GetRloc())))
mNetif.GetMle().GetRouteCost(entry->GetRloc()) < mNetif.GetMle().GetRouteCost(route->GetRloc())))
{
route = entry;
}
-1
View File
@@ -216,7 +216,6 @@ public:
protected:
uint8_t mStableVersion;
uint8_t mVersion;
ThreadNetif &mNetif;
private:
ThreadError RemoveCommissioningData(void);
+16 -17
View File
@@ -59,8 +59,7 @@ Leader::Leader(ThreadNetif &aThreadNetif):
mTimer(aThreadNetif.GetIp6().mTimerScheduler, &Leader::HandleTimer, this),
mServerData(OPENTHREAD_URI_SERVER_DATA, &Leader::HandleServerData, this),
mCommissioningDataGet(OPENTHREAD_URI_COMMISSIONER_GET, &Leader::HandleCommissioningGet, this),
mCommissioningDataSet(OPENTHREAD_URI_COMMISSIONER_SET, &Leader::HandleCommissioningSet, this),
mCoapServer(aThreadNetif.GetCoapServer())
mCommissioningDataSet(OPENTHREAD_URI_COMMISSIONER_SET, &Leader::HandleCommissioningSet, this)
{
Reset();
}
@@ -76,21 +75,21 @@ void Leader::Reset(void)
void Leader::Start(void)
{
mCoapServer.AddResource(mServerData);
mCoapServer.AddResource(mCommissioningDataGet);
mCoapServer.AddResource(mCommissioningDataSet);
mNetif.GetCoapServer().AddResource(mServerData);
mNetif.GetCoapServer().AddResource(mCommissioningDataGet);
mNetif.GetCoapServer().AddResource(mCommissioningDataSet);
}
void Leader::Stop(void)
{
mCoapServer.RemoveResource(mServerData);
mCoapServer.RemoveResource(mCommissioningDataGet);
mCoapServer.RemoveResource(mCommissioningDataSet);
mNetif.GetCoapServer().RemoveResource(mServerData);
mNetif.GetCoapServer().RemoveResource(mCommissioningDataGet);
mNetif.GetCoapServer().RemoveResource(mCommissioningDataSet);
}
void Leader::IncrementVersion(void)
{
if (mMle.GetDeviceState() == Mle::kDeviceStateLeader)
if (mNetif.GetMle().GetDeviceState() == Mle::kDeviceStateLeader)
{
mVersion++;
mNetif.SetStateChangedFlags(OT_THREAD_NETDATA_UPDATED);
@@ -99,7 +98,7 @@ void Leader::IncrementVersion(void)
void Leader::IncrementStableVersion(void)
{
if (mMle.GetDeviceState() == Mle::kDeviceStateLeader)
if (mNetif.GetMle().GetDeviceState() == Mle::kDeviceStateLeader)
{
mStableVersion++;
}
@@ -167,7 +166,7 @@ void Leader::HandleServerData(Coap::Header &aHeader, Message &aMessage,
networkData.GetTlvs(), networkData.GetLength());
}
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo));
SuccessOrExit(mNetif.GetCoapServer().SendEmptyAck(aHeader, aMessageInfo));
otLogInfoNetData("Sent network data registration acknowledgment");
@@ -193,7 +192,7 @@ void Leader::HandleCommissioningSet(Coap::Header &aHeader, Message &aMessage, co
bool hasValidTlv = false;
uint16_t sessionId = 0;
VerifyOrExit(mMle.GetDeviceState() == Mle::kDeviceStateLeader, state = MeshCoP::StateTlv::kReject);
VerifyOrExit(mNetif.GetMle().GetDeviceState() == Mle::kDeviceStateLeader, state = MeshCoP::StateTlv::kReject);
aMessage.Read(offset, length, tlvs);
@@ -251,7 +250,7 @@ void Leader::HandleCommissioningSet(Coap::Header &aHeader, Message &aMessage, co
exit:
if (mMle.GetDeviceState() == Mle::kDeviceStateLeader)
if (mNetif.GetMle().GetDeviceState() == Mle::kDeviceStateLeader)
{
SendCommissioningSetResponse(aHeader, aMessageInfo, state);
}
@@ -301,7 +300,7 @@ void Leader::SendCommissioningGetResponse(const Coap::Header &aRequestHeader, co
uint8_t *data = NULL;
uint8_t length = 0;
VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapServer().NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
responseHeader.SetDefaultResponseHeader(aRequestHeader);
responseHeader.SetPayloadMarker();
@@ -343,7 +342,7 @@ void Leader::SendCommissioningGetResponse(const Coap::Header &aRequestHeader, co
}
}
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
SuccessOrExit(error = mNetif.GetCoapServer().SendMessage(*message, aMessageInfo));
otLogInfoMeshCoP("sent commissioning dataset get response");
@@ -364,7 +363,7 @@ void Leader::SendCommissioningSetResponse(const Coap::Header &aRequestHeader, co
MeshCoP::StateTlv state;
Ip6::MessageInfo responseInfo(aMessageInfo);
VerifyOrExit((message = mCoapServer.NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapServer().NewMeshCoPMessage(0)) != NULL, error = kThreadError_NoBufs);
responseHeader.SetDefaultResponseHeader(aRequestHeader);
responseHeader.SetPayloadMarker();
@@ -376,7 +375,7 @@ void Leader::SendCommissioningSetResponse(const Coap::Header &aRequestHeader, co
SuccessOrExit(error = message->Append(&state, sizeof(state)));
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo));
SuccessOrExit(error = mNetif.GetCoapServer().SendMessage(*message, responseInfo));
otLogInfoMeshCoP("sent commissioning dataset set response");
@@ -205,8 +205,6 @@ private:
Coap::Resource mCommissioningDataGet;
Coap::Resource mCommissioningDataSet;
Coap::Server &mCoapServer;
};
/**
+12 -13
View File
@@ -43,8 +43,7 @@ namespace NetworkData {
Local::Local(ThreadNetif &aThreadNetif):
NetworkData(aThreadNetif, true),
mOldRloc(Mac::kShortAddrInvalid),
mLeader(aThreadNetif.GetNetworkDataLeader())
mOldRloc(Mac::kShortAddrInvalid)
{
}
@@ -191,38 +190,38 @@ ThreadError Local::UpdateRloc(PrefixTlv &aPrefix)
ThreadError Local::UpdateRloc(HasRouteTlv &aHasRoute)
{
HasRouteEntry *entry = aHasRoute.GetEntry(0);
entry->SetRloc(mMle.GetRloc16());
entry->SetRloc(mNetif.GetMle().GetRloc16());
return kThreadError_None;
}
ThreadError Local::UpdateRloc(BorderRouterTlv &aBorderRouter)
{
BorderRouterEntry *entry = aBorderRouter.GetEntry(0);
entry->SetRloc(mMle.GetRloc16());
entry->SetRloc(mNetif.GetMle().GetRloc16());
return kThreadError_None;
}
bool Local::IsOnMeshPrefixConsistent(void)
{
return (mLeader.ContainsOnMeshPrefixes(*this, mMle.GetRloc16()) &&
ContainsOnMeshPrefixes(mLeader, mMle.GetRloc16()));
return (mNetif.GetNetworkDataLeader().ContainsOnMeshPrefixes(*this, mNetif.GetMle().GetRloc16()) &&
ContainsOnMeshPrefixes(mNetif.GetNetworkDataLeader(), mNetif.GetMle().GetRloc16()));
}
bool Local::IsExternalRouteConsistent(void)
{
return (mLeader.ContainsExternalRoutes(*this, mMle.GetRloc16()) &&
ContainsExternalRoutes(mLeader, mMle.GetRloc16()));
return (mNetif.GetNetworkDataLeader().ContainsExternalRoutes(*this, mNetif.GetMle().GetRloc16()) &&
ContainsExternalRoutes(mNetif.GetNetworkDataLeader(), mNetif.GetMle().GetRloc16()));
}
ThreadError Local::SendServerDataNotification(void)
{
ThreadError error = kThreadError_None;
uint16_t rloc = mMle.GetRloc16();
uint16_t rloc = mNetif.GetMle().GetRloc16();
if ((mMle.GetDeviceMode() & Mle::ModeTlv::kModeFFD) != 0 &&
(mMle.IsRouterRoleEnabled()) &&
(mMle.GetDeviceState() < Mle::kDeviceStateRouter) &&
(mMle.GetActiveRouterCount() < mMle.GetRouterUpgradeThreshold()))
if ((mNetif.GetMle().GetDeviceMode() & Mle::ModeTlv::kModeFFD) != 0 &&
(mNetif.GetMle().IsRouterRoleEnabled()) &&
(mNetif.GetMle().GetDeviceState() < Mle::kDeviceStateRouter) &&
(mNetif.GetMle().GetActiveRouterCount() < mNetif.GetMle().GetRouterUpgradeThreshold()))
{
ExitNow(error = kThreadError_InvalidState);
}
@@ -139,8 +139,6 @@ private:
bool IsExternalRouteConsistent(void);
uint16_t mOldRloc;
Leader &mLeader;
};
} // namespace NetworkData
+30 -34
View File
@@ -60,18 +60,14 @@ NetworkDiagnostic::NetworkDiagnostic(ThreadNetif &aThreadNetif) :
mDiagnosticGetQuery(OPENTHREAD_URI_DIAGNOSTIC_GET_QUERY, &NetworkDiagnostic::HandleDiagnosticGetQuery, this),
mDiagnosticGetAnswer(OPENTHREAD_URI_DIAGNOSTIC_GET_ANSWER, &NetworkDiagnostic::HandleDiagnosticGetAnswer, this),
mDiagnosticReset(OPENTHREAD_URI_DIAGNOSTIC_RESET, &NetworkDiagnostic::HandleDiagnosticReset, this),
mCoapServer(aThreadNetif.GetCoapServer()),
mCoapClient(aThreadNetif.GetCoapClient()),
mMle(aThreadNetif.GetMle()),
mMac(aThreadNetif.GetMac()),
mNetif(aThreadNetif),
mReceiveDiagnosticGetCallback(NULL),
mReceiveDiagnosticGetCallbackContext(NULL)
{
mCoapServer.AddResource(mDiagnosticGetRequest);
mCoapServer.AddResource(mDiagnosticGetQuery);
mCoapServer.AddResource(mDiagnosticGetAnswer);
mCoapServer.AddResource(mDiagnosticReset);
mNetif.GetCoapServer().AddResource(mDiagnosticGetRequest);
mNetif.GetCoapServer().AddResource(mDiagnosticGetQuery);
mNetif.GetCoapServer().AddResource(mDiagnosticGetAnswer);
mNetif.GetCoapServer().AddResource(mDiagnosticReset);
}
void NetworkDiagnostic::SetReceiveDiagnosticGetCallback(otReceiveDiagnosticGetCallback aCallback,
@@ -106,16 +102,16 @@ ThreadError NetworkDiagnostic::SendDiagnosticGet(const Ip6::Address &aDestinatio
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMessage(header)) != NULL, error = kThreadError_NoBufs);
SuccessOrExit(error = message->Append(aTlvTypes, aCount));
messageInfo.SetPeerAddr(aDestination);
messageInfo.SetSockAddr(mMle.GetMeshLocal16());
messageInfo.SetSockAddr(mNetif.GetMle().GetMeshLocal16());
messageInfo.SetPeerPort(kCoapUdpPort);
messageInfo.SetInterfaceId(mNetif.GetInterfaceId());
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo, handler, this));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo, handler, this));
otLogInfoNetDiag("Sent diagnostic get");
@@ -177,7 +173,7 @@ void NetworkDiagnostic::HandleDiagnosticGetAnswer(Coap::Header &aHeader, Message
mReceiveDiagnosticGetCallback(&aMessage, &aMessageInfo, mReceiveDiagnosticGetCallbackContext);
}
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo));
SuccessOrExit(mNetif.GetCoapServer().SendEmptyAck(aHeader, aMessageInfo));
otLogInfoNetDiag("Sent diagnostic answer acknowledgment");
@@ -217,7 +213,7 @@ ThreadError NetworkDiagnostic::AppendChildTable(Message &aMessage)
uint8_t count = 0;
uint8_t timeout = 0;
uint8_t numChildren;
const Child *children = mMle.GetChildren(&numChildren);
const Child *children = mNetif.GetMle().GetChildren(&numChildren);
ChildTableTlv tlv;
ChildTableEntry entry;
@@ -245,7 +241,7 @@ ThreadError NetworkDiagnostic::AppendChildTable(Message &aMessage)
entry.SetReserved(0);
entry.SetTimeout(timeout + 4);
entry.SetChildId(mMle.GetChildId(children[i].mValid.mRloc16));
entry.SetChildId(mNetif.GetMle().GetChildId(children[i].mValid.mRloc16));
entry.SetMode(children[i].mMode);
SuccessOrExit(error = aMessage.Append(&entry, sizeof(ChildTableEntry)));
@@ -287,7 +283,7 @@ ThreadError NetworkDiagnostic::FillRequestedTlvs(Message &aRequest, Message &aRe
{
Address16Tlv tlv;
tlv.Init();
tlv.SetRloc16(mMle.GetRloc16());
tlv.SetRloc16(mNetif.GetMle().GetRloc16());
SuccessOrExit(error = aResponse.Append(&tlv, sizeof(tlv)));
break;
}
@@ -296,18 +292,18 @@ ThreadError NetworkDiagnostic::FillRequestedTlvs(Message &aRequest, Message &aRe
{
ModeTlv tlv;
tlv.Init();
tlv.SetMode(mMle.GetDeviceMode());
tlv.SetMode(mNetif.GetMle().GetDeviceMode());
SuccessOrExit(error = aResponse.Append(&tlv, sizeof(tlv)));
break;
}
case NetworkDiagnosticTlv::kTimeout:
{
if ((mMle.GetDeviceMode() & ModeTlv::kModeRxOnWhenIdle) == 0)
if ((mNetif.GetMle().GetDeviceMode() & ModeTlv::kModeRxOnWhenIdle) == 0)
{
TimeoutTlv tlv;
tlv.Init();
tlv.SetTimeout(mMle.GetTimeout());
tlv.SetTimeout(mNetif.GetMle().GetTimeout());
SuccessOrExit(error = aResponse.Append(&tlv, sizeof(tlv)));
}
@@ -318,7 +314,7 @@ ThreadError NetworkDiagnostic::FillRequestedTlvs(Message &aRequest, Message &aRe
{
ConnectivityTlv tlv;
tlv.Init();
mMle.FillConnectivityTlv(*reinterpret_cast<Mle::ConnectivityTlv *>(&tlv));
mNetif.GetMle().FillConnectivityTlv(*reinterpret_cast<Mle::ConnectivityTlv *>(&tlv));
SuccessOrExit(error = aResponse.Append(&tlv, sizeof(tlv)));
break;
}
@@ -327,7 +323,7 @@ ThreadError NetworkDiagnostic::FillRequestedTlvs(Message &aRequest, Message &aRe
{
RouteTlv tlv;
tlv.Init();
mMle.FillRouteTlv(*reinterpret_cast<Mle::RouteTlv *>(&tlv));
mNetif.GetMle().FillRouteTlv(*reinterpret_cast<Mle::RouteTlv *>(&tlv));
SuccessOrExit(error = aResponse.Append(&tlv, tlv.GetSize()));
break;
}
@@ -335,7 +331,7 @@ ThreadError NetworkDiagnostic::FillRequestedTlvs(Message &aRequest, Message &aRe
case NetworkDiagnosticTlv::kLeaderData:
{
LeaderDataTlv tlv;
memcpy(&tlv, &mMle.GetLeaderDataTlv(), sizeof(tlv));
memcpy(&tlv, &mNetif.GetMle().GetLeaderDataTlv(), sizeof(tlv));
tlv.Init();
SuccessOrExit(error = aResponse.Append(&tlv, tlv.GetSize()));
break;
@@ -345,7 +341,7 @@ ThreadError NetworkDiagnostic::FillRequestedTlvs(Message &aRequest, Message &aRe
{
NetworkDataTlv tlv;
tlv.Init();
mMle.FillNetworkDataTlv((*reinterpret_cast<Mle::NetworkDataTlv *>(&tlv)), true);
mNetif.GetMle().FillNetworkDataTlv((*reinterpret_cast<Mle::NetworkDataTlv *>(&tlv)), true);
SuccessOrExit(error = aResponse.Append(&tlv, tlv.GetSize()));
break;
}
@@ -361,7 +357,7 @@ ThreadError NetworkDiagnostic::FillRequestedTlvs(Message &aRequest, Message &aRe
MacCountersTlv tlv;
memset(&tlv, 0, sizeof(tlv));
tlv.Init();
mMac.FillMacCountersTlv(tlv);
mNetif.GetMac().FillMacCountersTlv(tlv);
SuccessOrExit(error = aResponse.Append(&tlv, tlv.GetSize()));
break;
}
@@ -444,7 +440,7 @@ void NetworkDiagnostic::HandleDiagnosticGetQuery(Coap::Header &aHeader, Message
// DIAG_GET.qry may be sent as a confirmable message.
if (aHeader.GetType() == kCoapTypeConfirmable)
{
if (mCoapServer.SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None)
if (mNetif.GetCoapServer().SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None)
{
otLogInfoNetDiag("Sent diagnostic get query acknowledgment");
}
@@ -459,16 +455,16 @@ void NetworkDiagnostic::HandleDiagnosticGetQuery(Coap::Header &aHeader, Message
header.SetPayloadMarker();
}
VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMessage(header)) != NULL, error = kThreadError_NoBufs);
messageInfo.SetPeerAddr(aMessageInfo.GetPeerAddr());
messageInfo.SetSockAddr(mMle.GetMeshLocal16());
messageInfo.SetSockAddr(mNetif.GetMle().GetMeshLocal16());
messageInfo.SetPeerPort(kCoapUdpPort);
messageInfo.SetInterfaceId(mNetif.GetInterfaceId());
SuccessOrExit(error = FillRequestedTlvs(aMessage, *message, networkDiagnosticTlv));
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo, NULL, this));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo, NULL, this));
otLogInfoNetDiag("Sent diagnostic get answer");
@@ -509,7 +505,7 @@ void NetworkDiagnostic::HandleDiagnosticGetRequest(Coap::Header &aHeader, Messag
VerifyOrExit((static_cast<TypeListTlv *>(&networkDiagnosticTlv)->IsValid()), error = kThreadError_Drop);
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapServer().NewMessage(0)) != NULL, error = kThreadError_NoBufs);
header.SetDefaultResponseHeader(aHeader);
@@ -522,7 +518,7 @@ void NetworkDiagnostic::HandleDiagnosticGetRequest(Coap::Header &aHeader, Messag
SuccessOrExit(error = FillRequestedTlvs(aMessage, *message, networkDiagnosticTlv));
SuccessOrExit(error = mCoapServer.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapServer().SendMessage(*message, messageInfo));
otLogInfoNetDiag("Sent diagnostic get response");
@@ -547,16 +543,16 @@ ThreadError NetworkDiagnostic::SendDiagnosticReset(const Ip6::Address &aDestinat
header.AppendUriPathOptions(OPENTHREAD_URI_DIAGNOSTIC_RESET);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMessage(header)) != NULL, error = kThreadError_NoBufs);
SuccessOrExit(error = message->Append(aTlvTypes, aCount));
messageInfo.SetPeerAddr(aDestination);
messageInfo.SetSockAddr(mMle.GetMeshLocal16());
messageInfo.SetSockAddr(mNetif.GetMle().GetMeshLocal16());
messageInfo.SetPeerPort(kCoapUdpPort);
messageInfo.SetInterfaceId(mNetif.GetInterfaceId());
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoNetDiag("Sent network diagnostic reset");
@@ -606,7 +602,7 @@ void NetworkDiagnostic::HandleDiagnosticReset(Coap::Header &aHeader, Message &aM
switch (type)
{
case NetworkDiagnosticTlv::kMacCounters:
mMac.ResetCounters();
mNetif.GetMac().ResetCounters();
otLogInfoNetDiag("Received diagnostic reset type kMacCounters(9)");
break;
@@ -616,7 +612,7 @@ void NetworkDiagnostic::HandleDiagnosticReset(Coap::Header &aHeader, Message &aM
}
}
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo));
SuccessOrExit(mNetif.GetCoapServer().SendEmptyAck(aHeader, aMessageInfo));
otLogInfoNetDiag("Sent diagnostic reset acknowledgment");
-4
View File
@@ -135,11 +135,7 @@ private:
Coap::Resource mDiagnosticGetQuery;
Coap::Resource mDiagnosticGetAnswer;
Coap::Resource mDiagnosticReset;
Coap::Server &mCoapServer;
Coap::Client &mCoapClient;
Mle::MleRouter &mMle;
Mac::Mac &mMac;
ThreadNetif &mNetif;
otReceiveDiagnosticGetCallback mReceiveDiagnosticGetCallback;
+4 -6
View File
@@ -50,11 +50,9 @@ PanIdQueryServer::PanIdQueryServer(ThreadNetif &aThreadNetif) :
mPanId(Mac::kPanIdBroadcast),
mTimer(aThreadNetif.GetIp6().mTimerScheduler, &PanIdQueryServer::HandleTimer, this),
mPanIdQuery(OPENTHREAD_URI_PANID_QUERY, &PanIdQueryServer::HandleQuery, this),
mCoapServer(aThreadNetif.GetCoapServer()),
mCoapClient(aThreadNetif.GetCoapClient()),
mNetif(aThreadNetif)
{
mCoapServer.AddResource(mPanIdQuery);
mNetif.GetCoapServer().AddResource(mPanIdQuery);
}
void PanIdQueryServer::HandleQuery(void *aContext, otCoapHeader *aHeader, otMessage aMessage,
@@ -85,7 +83,7 @@ void PanIdQueryServer::HandleQuery(Coap::Header &aHeader, Message &aMessage, con
mTimer.Start(kScanDelay);
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo));
SuccessOrExit(mNetif.GetCoapServer().SendEmptyAck(aHeader, responseInfo));
otLogInfoMeshCoP("sent panid query response");
@@ -131,7 +129,7 @@ ThreadError PanIdQueryServer::SendConflict(void)
header.AppendUriPathOptions(OPENTHREAD_URI_PANID_CONFLICT);
header.SetPayloadMarker();
VerifyOrExit((message = mCoapClient.NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
VerifyOrExit((message = mNetif.GetCoapClient().NewMeshCoPMessage(header)) != NULL, error = kThreadError_NoBufs);
channelMask.Init();
channelMask.SetMask(mChannelMask);
@@ -143,7 +141,7 @@ ThreadError PanIdQueryServer::SendConflict(void)
messageInfo.SetPeerAddr(mCommissioner);
messageInfo.SetPeerPort(kCoapUdpPort);
SuccessOrExit(error = mCoapClient.SendMessage(*message, messageInfo));
SuccessOrExit(error = mNetif.GetCoapClient().SendMessage(*message, messageInfo));
otLogInfoMeshCoP("sent panid conflict");
-2
View File
@@ -89,8 +89,6 @@ private:
Timer mTimer;
Coap::Resource mPanIdQuery;
Coap::Server &mCoapServer;
Coap::Client &mCoapClient;
ThreadNetif &mNetif;
};