mirror of
https://github.com/espressif/openthread.git
synced 2026-07-29 15:17:47 +00:00
@@ -48,16 +48,18 @@
|
||||
namespace Thread {
|
||||
namespace MeshCoP {
|
||||
|
||||
DatasetManager::DatasetManager(ThreadNetif &aThreadNetif, const char *aUri):
|
||||
DatasetManager::DatasetManager(ThreadNetif &aThreadNetif, const char *aUriSet, const char *aUriGet):
|
||||
mMle(aThreadNetif.GetMle()),
|
||||
mNetif(aThreadNetif),
|
||||
mNetworkDataLeader(aThreadNetif.GetNetworkDataLeader()),
|
||||
mResource(aUri, &HandleSet, this),
|
||||
mResourceSet(aUriSet, &HandleSet, this),
|
||||
mResourceGet(aUriGet, &HandleGet, this),
|
||||
mTimer(&HandleTimer, this),
|
||||
mUri(aUri),
|
||||
mUriSet(aUriSet),
|
||||
mCoapServer(aThreadNetif.GetCoapServer())
|
||||
{
|
||||
mCoapServer.AddResource(mResource);
|
||||
mCoapServer.AddResource(mResourceSet);
|
||||
mCoapServer.AddResource(mResourceGet);
|
||||
}
|
||||
|
||||
ThreadError DatasetManager::Set(const Dataset &aDataset, uint8_t &aFlags)
|
||||
@@ -168,7 +170,7 @@ ThreadError DatasetManager::Register(void)
|
||||
header.SetCode(Coap::Header::kCodePost);
|
||||
header.SetMessageId(++mCoapMessageId);
|
||||
header.SetToken(mCoapToken, sizeof(mCoapToken));
|
||||
header.AppendUriPathOptions(mUri);
|
||||
header.AppendUriPathOptions(mUriSet);
|
||||
header.AppendContentFormatOption(Coap::Header::kApplicationOctetStream);
|
||||
header.Finalize();
|
||||
|
||||
@@ -240,7 +242,7 @@ void DatasetManager::HandleSet(Coap::Header &aHeader, Message &aMessage, const I
|
||||
|
||||
VerifyOrExit(mMle.GetDeviceState() == Mle::kDeviceStateLeader, state = StateTlv::kReject);
|
||||
|
||||
type = strcmp(mUri, OPENTHREAD_URI_ACTIVE_SET) == 0 ? Tlv::kActiveTimestamp : Tlv::kPendingTimestamp;
|
||||
type = strcmp(mUriSet, OPENTHREAD_URI_ACTIVE_SET) == 0 ? Tlv::kActiveTimestamp : Tlv::kPendingTimestamp;
|
||||
|
||||
while (offset < aMessage.GetLength())
|
||||
{
|
||||
@@ -273,6 +275,37 @@ exit:
|
||||
return;
|
||||
}
|
||||
|
||||
void DatasetManager::HandleGet(void *aContext, Coap::Header &aHeader, Message &aMessage,
|
||||
const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
DatasetManager *obj = static_cast<DatasetManager *>(aContext);
|
||||
obj->HandleGet(aHeader, aMessage, aMessageInfo);
|
||||
}
|
||||
|
||||
void DatasetManager::HandleGet(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
Tlv tlv;
|
||||
uint16_t offset = aMessage.GetOffset();
|
||||
uint8_t tlvs[Dataset::kMaxSize];
|
||||
uint8_t length = 0;
|
||||
|
||||
while (offset < aMessage.GetLength())
|
||||
{
|
||||
aMessage.Read(offset, sizeof(tlv), &tlv);
|
||||
|
||||
if (tlv.GetType() == Tlv::kGet)
|
||||
{
|
||||
length = tlv.GetLength();
|
||||
aMessage.Read(offset + sizeof(Tlv), length, tlvs);
|
||||
break;
|
||||
}
|
||||
|
||||
offset += sizeof(tlv) + tlv.GetLength();
|
||||
}
|
||||
|
||||
SendGetResponse(aHeader, aMessageInfo, tlvs, length);
|
||||
}
|
||||
|
||||
void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo,
|
||||
StateTlv::State aState)
|
||||
{
|
||||
@@ -297,7 +330,54 @@ void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const I
|
||||
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
|
||||
|
||||
otLogInfoMeshCoP("sent dataset response\n");
|
||||
otLogInfoMeshCoP("sent dataset set response\n");
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
Message::Free(*message);
|
||||
}
|
||||
}
|
||||
|
||||
void DatasetManager::SendGetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo,
|
||||
uint8_t *aTlvs, uint8_t aLength)
|
||||
{
|
||||
Tlv *tlv;
|
||||
ThreadError error = kThreadError_None;
|
||||
Coap::Header responseHeader;
|
||||
Message *message;
|
||||
uint8_t index;
|
||||
|
||||
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
responseHeader.Init();
|
||||
responseHeader.SetVersion(1);
|
||||
responseHeader.SetType(Coap::Header::kTypeAcknowledgment);
|
||||
responseHeader.SetCode(Coap::Header::kCodeChanged);
|
||||
responseHeader.SetMessageId(aRequestHeader.GetMessageId());
|
||||
responseHeader.SetToken(aRequestHeader.GetToken(), aRequestHeader.GetTokenLength());
|
||||
responseHeader.AppendContentFormatOption(Coap::Header::kApplicationOctetStream);
|
||||
responseHeader.Finalize();
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
|
||||
if (aLength == 0)
|
||||
{
|
||||
SuccessOrExit(error = message->Append(mNetwork.GetBytes(), mNetwork.GetSize()));
|
||||
}
|
||||
else
|
||||
{
|
||||
for (index = 0; index < aLength; index++)
|
||||
{
|
||||
if ((tlv = mNetwork.Get((Tlv::Type)aTlvs[index])) != NULL)
|
||||
{
|
||||
SuccessOrExit(error = message->Append(tlv, sizeof(Tlv) + tlv->GetLength()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
|
||||
|
||||
otLogInfoMeshCoP("sent dataset get response\n");
|
||||
|
||||
exit:
|
||||
|
||||
@@ -308,7 +388,7 @@ exit:
|
||||
}
|
||||
|
||||
ActiveDataset::ActiveDataset(ThreadNetif &aThreadNetif):
|
||||
DatasetManager(aThreadNetif, OPENTHREAD_URI_ACTIVE_SET)
|
||||
DatasetManager(aThreadNetif, OPENTHREAD_URI_ACTIVE_SET, OPENTHREAD_URI_ACTIVE_GET)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -428,7 +508,7 @@ ThreadError ActiveDataset::ApplyConfiguration(void)
|
||||
}
|
||||
|
||||
PendingDataset::PendingDataset(ThreadNetif &aThreadNetif):
|
||||
DatasetManager(aThreadNetif, OPENTHREAD_URI_PENDING_SET),
|
||||
DatasetManager(aThreadNetif, OPENTHREAD_URI_PENDING_SET, OPENTHREAD_URI_PENDING_GET),
|
||||
mTimer(HandleTimer, this)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ protected:
|
||||
kFlagNetworkUpdated = 1 << 1,
|
||||
};
|
||||
|
||||
DatasetManager(ThreadNetif &aThreadNetif, const char *aUri);
|
||||
DatasetManager(ThreadNetif &aThreadNetif, const char *aUriSet, const char *aUriGet);
|
||||
|
||||
ThreadError Set(const Dataset &aDataset, uint8_t &aFlags);
|
||||
|
||||
@@ -88,20 +88,27 @@ private:
|
||||
const Ip6::MessageInfo &aMessageInfo);
|
||||
void HandleSet(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
static void HandleGet(void *aContext, Coap::Header &aHeader, Message &aMessage,
|
||||
const Ip6::MessageInfo &aMessageInfo);
|
||||
void HandleGet(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
static void HandleTimer(void *aContext);
|
||||
void HandleTimer(void);
|
||||
|
||||
ThreadError Register(void);
|
||||
void SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, StateTlv::State aState);
|
||||
void SendGetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo,
|
||||
uint8_t *aTlvs, uint8_t aLength);
|
||||
|
||||
Coap::Resource mResource;
|
||||
Coap::Resource mResourceSet;
|
||||
Coap::Resource mResourceGet;
|
||||
Timer mTimer;
|
||||
|
||||
Ip6::UdpSocket mSocket;
|
||||
uint8_t mCoapToken[2];
|
||||
uint16_t mCoapMessageId;
|
||||
|
||||
const char *mUri;
|
||||
const char *mUriSet;
|
||||
|
||||
Coap::Server &mCoapServer;
|
||||
};
|
||||
|
||||
@@ -68,6 +68,7 @@ public:
|
||||
kNetworkMasterKey = 5, ///< Network Master Key TLV
|
||||
kMeshLocalPrefix = 7, ///< Mesh Local Prefix TLV
|
||||
kSecurityPolicy = 12, ///< Security Policy TLV
|
||||
kGet = 13, ///< Get TLV
|
||||
kActiveTimestamp = 14, ///< Active Timestamp TLV
|
||||
kState = 16, ///< State TLV
|
||||
kPendingTimestamp = 51, ///< Pending Timestamp TLV
|
||||
|
||||
@@ -74,6 +74,14 @@ namespace Thread {
|
||||
*/
|
||||
#define OPENTHREAD_URI_ADDRESS_SOLICIT "a/as"
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_URI_ACTIVE_GET
|
||||
*
|
||||
* The URI Path for MGMT_ACTIVE_GET
|
||||
*
|
||||
*/
|
||||
#define OPENTHREAD_URI_ACTIVE_GET "c/ag"
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_URI_ACTIVE_SET
|
||||
*
|
||||
@@ -82,6 +90,14 @@ namespace Thread {
|
||||
*/
|
||||
#define OPENTHREAD_URI_ACTIVE_SET "c/as"
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_URI_PENDING_GET
|
||||
*
|
||||
* The URI Path for MGMT_PENDING_GET
|
||||
*
|
||||
*/
|
||||
#define OPENTHREAD_URI_PENDING_GET "c/pg"
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_URI_PENDING_SET
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user