Add/remove CoAP resources as needed. (#587)

This commit is contained in:
Jonathan Hui
2016-09-15 08:55:49 -07:00
committed by GitHub
parent 5c28c02e40
commit 7dbf483843
7 changed files with 65 additions and 19 deletions
+22
View File
@@ -78,6 +78,28 @@ exit:
return error;
}
void Server::RemoveResource(Resource &aResource)
{
if (mResources == &aResource)
{
mResources = aResource.mNext;
}
else
{
for (Resource *cur = mResources; cur; cur = cur->mNext)
{
if (cur->mNext == &aResource)
{
cur->mNext = aResource.mNext;
ExitNow();
}
}
}
exit:
aResource.mNext = NULL;
}
void Server::HandleUdpReceive(void *aContext, otMessage aMessage, const otMessageInfo *aMessageInfo)
{
Server *obj = reinterpret_cast<Server *>(aContext);
+8
View File
@@ -137,6 +137,14 @@ public:
*/
ThreadError AddResource(Resource &aResource);
/**
* This method removes a resource from the CoAP server.
*
* @param[in] aResource A reference to the resource.
*
*/
void RemoveResource(Resource &aResource);
/**
* This method returns a new UDP message with sufficient header space reserved.
*
+13 -8
View File
@@ -64,10 +64,21 @@ DatasetManager::DatasetManager(ThreadNetif &aThreadNetif, const Tlv::Type aType,
mUriGet(aUriGet),
mCoapServer(aThreadNetif.GetCoapServer())
{
}
void DatasetManager::StartLeader(void)
{
mNetwork = mLocal;
mCoapServer.AddResource(mResourceSet);
mCoapServer.AddResource(mResourceGet);
}
void DatasetManager::StopLeader(void)
{
mCoapServer.RemoveResource(mResourceSet);
mCoapServer.RemoveResource(mResourceGet);
}
ThreadError DatasetManager::Set(const Dataset &aDataset, uint8_t &aFlags)
{
ThreadError error = kThreadError_None;
@@ -133,12 +144,6 @@ exit:
return error;
}
ThreadError DatasetManager::ApplyLocalToNetwork(void)
{
mNetwork = mLocal;
return kThreadError_None;
}
void DatasetManager::HandleTimer(void *aContext)
{
DatasetManager *obj = static_cast<DatasetManager *>(aContext);
@@ -737,9 +742,9 @@ exit:
return error;
}
void PendingDataset::ApplyLocalToNetwork(void)
void PendingDataset::StartLeader(void)
{
DatasetManager::ApplyLocalToNetwork();
DatasetManager::StartLeader();
mNetworkTime = mLocalTime;
}
+4 -3
View File
@@ -53,7 +53,8 @@ namespace MeshCoP {
class DatasetManager
{
public:
ThreadError ApplyLocalToNetwork(void);
void StartLeader(void);
void StopLeader(void);
Dataset &GetLocal(void) { return mLocal; }
@@ -138,6 +139,8 @@ class PendingDataset: public DatasetManager
public:
PendingDataset(ThreadNetif &aThreadNetif);
void StartLeader(void);
void Get(otOperationalDataset &aDataset);
ThreadError Set(const Dataset &aDataset);
@@ -146,8 +149,6 @@ public:
ThreadError Set(const Timestamp &aTimestamp, const Message &aMessage, uint16_t aOffset, uint8_t aLength);
void ApplyLocalToNetwork(void);
void UpdateDelayTimer(void);
private:
+16 -8
View File
@@ -271,6 +271,17 @@ exit:
return error;
}
void MleRouter::StopLeader(void)
{
mCoapServer.RemoveResource(mAddressSolicit);
mCoapServer.RemoveResource(mAddressRelease);
mNetif.GetActiveDataset().StopLeader();
mNetif.GetPendingDataset().StopLeader();
mAdvertiseTimer.Stop();
mNetworkData.Stop();
mNetif.UnsubscribeAllRoutersMulticast();
}
ThreadError MleRouter::HandleDetachStart(void)
{
ThreadError error = kThreadError_None;
@@ -280,10 +291,8 @@ ThreadError MleRouter::HandleDetachStart(void)
mRouters[i].mState = Neighbor::kStateInvalid;
}
mAdvertiseTimer.Stop();
StopLeader();
mStateUpdateTimer.Stop();
mNetworkData.Stop();
mNetif.UnsubscribeAllRoutersMulticast();
return error;
}
@@ -294,9 +303,8 @@ ThreadError MleRouter::HandleChildStart(otMleAttachFilter aFilter)
mRouterIdSequenceLastUpdated = Timer::GetNow();
mAdvertiseTimer.Stop();
StopLeader();
mStateUpdateTimer.Start(kStateUpdatePeriod);
mNetworkData.Stop();
switch (aFilter)
{
@@ -321,7 +329,7 @@ ThreadError MleRouter::HandleChildStart(otMleAttachFilter aFilter)
}
else
{
mNetif.UnsubscribeAllRoutersMulticast();
}
return kThreadError_None;
@@ -366,8 +374,8 @@ ThreadError MleRouter::SetStateLeader(uint16_t aRloc16)
mRouters[mRouterId].mLastHeard = Timer::GetNow();
mNetworkData.Start();
mNetif.GetActiveDataset().ApplyLocalToNetwork();
mNetif.GetPendingDataset().ApplyLocalToNetwork();
mNetif.GetActiveDataset().StartLeader();
mNetif.GetPendingDataset().StartLeader();
mCoapServer.AddResource(mAddressSolicit);
mCoapServer.AddResource(mAddressRelease);
mNetif.GetIp6().SetForwardingEnabled(true);
+1
View File
@@ -518,6 +518,7 @@ private:
ThreadError SetStateRouter(uint16_t aRloc16);
ThreadError SetStateLeader(uint16_t aRloc16);
void StopLeader(void);
ThreadError UpdateChildAddresses(const AddressRegistrationTlv &aTlv, Child &aChild);
void UpdateRoutes(const RouteTlv &aTlv, uint8_t aRouterId);
+1
View File
@@ -79,6 +79,7 @@ void Leader::Start(void)
void Leader::Stop(void)
{
mCoapServer.RemoveResource(mServerData);
}
uint8_t Leader::GetVersion(void) const