mirror of
https://github.com/espressif/openthread.git
synced 2026-08-03 09:27:47 +00:00
Add/remove CoAP resources as needed. (#587)
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -79,6 +79,7 @@ void Leader::Start(void)
|
||||
|
||||
void Leader::Stop(void)
|
||||
{
|
||||
mCoapServer.RemoveResource(mServerData);
|
||||
}
|
||||
|
||||
uint8_t Leader::GetVersion(void) const
|
||||
|
||||
Reference in New Issue
Block a user