Add MeshCoP State TLV (#377)

* Add MeshCoP State TLV
This commit is contained in:
Lu Wang
2016-08-15 20:23:12 -07:00
committed by Jonathan Hui
parent 743ce89aed
commit b656f57719
3 changed files with 71 additions and 7 deletions
+16 -6
View File
@@ -28,7 +28,7 @@
/**
* @file
* This file implements common methods for manipulating MeshCoP Datasets.
* This file implements MeshCoP Datasets manager to process commands.
*
*/
@@ -236,8 +236,9 @@ void DatasetManager::HandleSet(Coap::Header &aHeader, Message &aMessage, const I
Timestamp timestamp;
uint16_t offset = aMessage.GetOffset();
uint8_t type;
StateTlv::State state = StateTlv::kAccept;
VerifyOrExit(mMle.GetDeviceState() == Mle::kDeviceStateLeader, ;);
VerifyOrExit(mMle.GetDeviceState() == Mle::kDeviceStateLeader, state = StateTlv::kReject);
type = strcmp(mUri, OPENTHREAD_URI_ACTIVE_SET) == 0 ? Tlv::kActiveTimestamp : Tlv::kPendingTimestamp;
@@ -255,24 +256,30 @@ void DatasetManager::HandleSet(Coap::Header &aHeader, Message &aMessage, const I
}
// verify the request includes a timestamp that is ahead of the locally stored value
VerifyOrExit(offset < aMessage.GetLength() && mLocal.GetTimestamp().Compare(timestamp) > 0, ;);
VerifyOrExit(offset < aMessage.GetLength() && mLocal.GetTimestamp().Compare(timestamp) > 0, state = StateTlv::kReject);
mLocal.Set(aMessage, aMessage.GetOffset(), static_cast<uint8_t>(aMessage.GetLength() - aMessage.GetOffset()));
mNetwork = mLocal;
mNetworkDataLeader.IncrementVersion();
mNetworkDataLeader.IncrementStableVersion();
SendSetResponse(aHeader, aMessageInfo);
exit:
if (mMle.GetDeviceState() == Mle::kDeviceStateLeader)
{
SendSetResponse(aHeader, aMessageInfo, state);
}
return;
}
void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo)
void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo,
StateTlv::State aState)
{
ThreadError error = kThreadError_None;
Coap::Header responseHeader;
Message *message;
StateTlv state;
VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs);
responseHeader.Init();
@@ -285,6 +292,9 @@ void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const I
responseHeader.Finalize();
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
state.SetState(aState);
SuccessOrExit(error = message->Append(&state, sizeof(state)));
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
otLogInfoMeshCoP("sent dataset response\n");
+1 -1
View File
@@ -92,7 +92,7 @@ private:
void HandleTimer(void);
ThreadError Register(void);
void SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo);
void SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, StateTlv::State aState);
Coap::Resource mResource;
Timer mTimer;
+54
View File
@@ -69,6 +69,7 @@ public:
kMeshLocalPrefix = 7, ///< Mesh Local Prefix TLV
kSecurityPolicy = 12, ///< Security Policy TLV
kActiveTimestamp = 14, ///< Active Timestamp TLV
kState = 16, ///< State TLV
kPendingTimestamp = 51, ///< Pending Timestamp TLV
kDelayTimer = 52, ///< Delay Timer TLV
kChannelMask = 53, ///< Channel Mask TLV
@@ -659,6 +660,59 @@ public:
bool IsValid(void) const { return GetLength() == sizeof(*this) - sizeof(Tlv); }
} OT_TOOL_PACKED_END;
/**
* This class implements State TLV generation and parsing.
*
*/
OT_TOOL_PACKED_BEGIN
class StateTlv: public Tlv
{
public:
/**
* State TLV values.
*/
enum State
{
kReject = -1, ///< Reject
kPending = 0, ///< Pending
kAccept = 1, ///< Accept
};
/**
* This method initializes the TLV.
*
*/
void Init(void) { SetType(kState); SetLength(sizeof(*this) - sizeof(Tlv)); }
/**
* This method indicates whether or not the TLV appears to be well-formed.
*
* @retval TRUE If the TLV appears to be well-formed.
* @retval FALSE If the TLV does not appear to be well-formed.
*
*/
bool IsValid(void) const { return GetLength() == sizeof(*this) - sizeof(Tlv); }
/**
* This method returns the State value.
*
* @returns The State value.
*
*/
State GetState(void) const { return static_cast<State>(mState); }
/**
* This method sets the State value.
*
* @param[in] aState The State value.
*
*/
void SetState(State aState) { mState = static_cast<uint8_t>(aState); }
private:
uint8_t mState;
} OT_TOOL_PACKED_END;
/**
* This class implements Pending Timestamp TLV generation and parsing.
*