Add /c/ag and /c/pg URI (#378)

* Add /c/ag and /c/pg URI
This commit is contained in:
Lu Wang
2016-08-16 09:05:52 -07:00
committed by Jonathan Hui
parent 4ddde9a96c
commit 01a3f7aea9
4 changed files with 116 additions and 12 deletions
+89 -9
View File
@@ -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)
{
}
+10 -3
View File
@@ -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;
};
+1
View File
@@ -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
+16
View File
@@ -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
*