mirror of
https://github.com/espressif/openthread.git
synced 2026-08-26 20:19:53 +00:00
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user