mirror of
https://github.com/espressif/openthread.git
synced 2026-08-08 03:37:46 +00:00
Introduce SendEmptyResponse in CoAP Server. (#1108)
This commit is contained in:
committed by
Jonathan Hui
parent
a52ad98b23
commit
23396a30f8
@@ -105,6 +105,30 @@ ThreadError Server::SendMessage(Message &aMessage, const Ip6::MessageInfo &aMess
|
||||
return mSender(this, aMessage, aMessageInfo);
|
||||
}
|
||||
|
||||
ThreadError Server::SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Coap::Header responseHeader;
|
||||
Message *message = NULL;
|
||||
|
||||
VerifyOrExit(aRequestHeader.GetType() == kCoapTypeConfirmable, error = kThreadError_InvalidArgs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
|
||||
VerifyOrExit((message = NewMessage(responseHeader)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
SuccessOrExit(error = SendMessage(*message, aMessageInfo));
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
void Server::ProcessReceivedMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
Header header;
|
||||
|
||||
@@ -178,6 +178,19 @@ public:
|
||||
*/
|
||||
ThreadError SendMessage(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
/**
|
||||
* This method sends a CoAP ACK message on which a dummy CoAP response is piggybacked.
|
||||
*
|
||||
* @param[in] aRequestHeader A reference to the CoAP Header that was used in CoAP request.
|
||||
* @param[in] aMessageInfo The message info corresponding to the CoAP request.
|
||||
*
|
||||
* @retval kThreadError_None Successfully enqueued the CoAP response message.
|
||||
* @retval kThreadError_NoBufs Insufficient buffers available to send the CoAP response.
|
||||
* @retval kThreadError_InvalidArgs The @p aRequestHeader header is not of confirmable type.
|
||||
*
|
||||
*/
|
||||
ThreadError SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
/**
|
||||
* This method sets CoAP server's port number.
|
||||
*
|
||||
|
||||
@@ -758,37 +758,14 @@ void Commissioner::HandleDatasetChanged(Coap::Header &aHeader, Message &aMessage
|
||||
otLogInfoMeshCoP("received dataset changed");
|
||||
(void)aMessage;
|
||||
|
||||
SendDatasetChangedResponse(aHeader, aMessageInfo);
|
||||
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo));
|
||||
|
||||
otLogInfoMeshCoP("sent dataset changed acknowledgment");
|
||||
|
||||
exit:
|
||||
otLogFuncExit();
|
||||
}
|
||||
|
||||
void Commissioner::SendDatasetChangedResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Coap::Header responseHeader;
|
||||
Message *message;
|
||||
|
||||
otLogFuncEntry();
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
|
||||
|
||||
otLogInfoMeshCoP("Sent dataset changed acknowledgment");
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
|
||||
otLogFuncExit();
|
||||
}
|
||||
|
||||
void Commissioner::HandleJoinerFinalize(void *aContext, otCoapHeader *aHeader, otMessage aMessage,
|
||||
const otMessageInfo *aMessageInfo)
|
||||
{
|
||||
|
||||
@@ -224,7 +224,6 @@ private:
|
||||
static ThreadError SendRelayTransmit(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
ThreadError SendRelayTransmit(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
void SendDatasetChangedResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo);
|
||||
ThreadError SendCommissionerSet(void);
|
||||
ThreadError SendPetition(void);
|
||||
ThreadError SendKeepAlive(void);
|
||||
|
||||
@@ -133,6 +133,7 @@ void EnergyScanClient::HandleReport(void *aContext, otCoapHeader *aHeader, otMes
|
||||
void EnergyScanClient::HandleReport(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
MeshCoP::ChannelMask0Tlv channelMask;
|
||||
Ip6::MessageInfo responseInfo(aMessageInfo);
|
||||
|
||||
OT_TOOL_PACKED_BEGIN
|
||||
struct
|
||||
@@ -157,36 +158,13 @@ void EnergyScanClient::HandleReport(Coap::Header &aHeader, Message &aMessage, co
|
||||
mCallback(channelMask.GetMask(), energyList.list, energyList.tlv.GetLength(), mContext);
|
||||
}
|
||||
|
||||
SendResponse(aHeader, aMessageInfo);
|
||||
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
|
||||
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo));
|
||||
|
||||
otLogInfoMeshCoP("sent energy scan report response");
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
ThreadError EnergyScanClient::SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Message *message;
|
||||
Coap::Header responseHeader;
|
||||
Ip6::MessageInfo responseInfo(aRequestInfo);
|
||||
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
|
||||
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo));
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
} // namespace Thread
|
||||
|
||||
@@ -82,8 +82,6 @@ private:
|
||||
const otMessageInfo *aMessageInfo);
|
||||
void HandleReport(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
ThreadError SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestMessageInfo);
|
||||
|
||||
otCommissionerEnergyReportCallback mCallback;
|
||||
void *mContext;
|
||||
|
||||
|
||||
@@ -119,6 +119,7 @@ void PanIdQueryClient::HandleConflict(Coap::Header &aHeader, Message &aMessage,
|
||||
{
|
||||
MeshCoP::PanIdTlv panId;
|
||||
MeshCoP::ChannelMask0Tlv channelMask;
|
||||
Ip6::MessageInfo responseInfo(aMessageInfo);
|
||||
|
||||
VerifyOrExit(aHeader.GetType() == kCoapTypeConfirmable &&
|
||||
aHeader.GetCode() == kCoapRequestPost, ;);
|
||||
@@ -136,37 +137,13 @@ void PanIdQueryClient::HandleConflict(Coap::Header &aHeader, Message &aMessage,
|
||||
mCallback(panId.GetPanId(), channelMask.GetMask(), mContext);
|
||||
}
|
||||
|
||||
SendConflictResponse(aHeader, aMessageInfo);
|
||||
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
|
||||
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo));
|
||||
|
||||
otLogInfoMeshCoP("sent panid query conflict response");
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
ThreadError PanIdQueryClient::SendConflictResponse(const Coap::Header &aRequestHeader,
|
||||
const Ip6::MessageInfo &aRequestInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Message *message;
|
||||
Coap::Header responseHeader;
|
||||
Ip6::MessageInfo responseInfo(aRequestInfo);
|
||||
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
|
||||
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo));
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
} // namespace Thread
|
||||
|
||||
@@ -80,8 +80,6 @@ private:
|
||||
const otMessageInfo *aMessageInfo);
|
||||
void HandleConflict(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
ThreadError SendConflictResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestMessageInfo);
|
||||
|
||||
otCommissionerPanIdConflictCallback mCallback;
|
||||
void *mContext;
|
||||
|
||||
|
||||
@@ -281,7 +281,12 @@ void AddressResolver::HandleAddressNotification(Coap::Header &aHeader, Message &
|
||||
mCache[i].mTimeout = 0;
|
||||
mCache[i].mFailures = 0;
|
||||
mCache[i].mState = Cache::kStateCached;
|
||||
SendAddressNotificationResponse(aHeader, aMessageInfo);
|
||||
|
||||
if (mCoapServer.SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None)
|
||||
{
|
||||
otLogInfoArp("Sent address notification acknowledgment");
|
||||
}
|
||||
|
||||
mMeshForwarder.HandleResolved(*targetTlv.GetTarget(), kThreadError_None);
|
||||
break;
|
||||
}
|
||||
@@ -291,32 +296,6 @@ exit:
|
||||
return;
|
||||
}
|
||||
|
||||
void AddressResolver::SendAddressNotificationResponse(const Coap::Header &aRequestHeader,
|
||||
const Ip6::MessageInfo &aRequestInfo)
|
||||
{
|
||||
ThreadError error;
|
||||
Message *message;
|
||||
Coap::Header responseHeader;
|
||||
Ip6::MessageInfo responseInfo(aRequestInfo);
|
||||
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo));
|
||||
|
||||
otLogInfoArp("Sent address notification acknowledgment");
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
}
|
||||
|
||||
ThreadError AddressResolver::SendAddressError(const ThreadTargetTlv &aTarget, const ThreadMeshLocalEidTlv &aEid,
|
||||
const Ip6::Address *aDestination)
|
||||
{
|
||||
@@ -363,32 +342,6 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
void AddressResolver::SendAddressErrorResponse(const Coap::Header &aRequestHeader,
|
||||
const Ip6::MessageInfo &aRequestInfo)
|
||||
{
|
||||
ThreadError error;
|
||||
Message *message;
|
||||
Coap::Header responseHeader;
|
||||
Ip6::MessageInfo responseInfo(aRequestInfo);
|
||||
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo));
|
||||
|
||||
otLogInfoArp("Sent address error notification acknowledgment");
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
}
|
||||
|
||||
void AddressResolver::HandleAddressError(void *aContext, otCoapHeader *aHeader, otMessage aMessage,
|
||||
const otMessageInfo *aMessageInfo)
|
||||
{
|
||||
@@ -415,7 +368,10 @@ void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessag
|
||||
|
||||
if (!aMessageInfo.GetSockAddr().IsMulticast())
|
||||
{
|
||||
SendAddressErrorResponse(aHeader, aMessageInfo);
|
||||
if (mCoapServer.SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None)
|
||||
{
|
||||
otLogInfoArp("Sent address error notification acknowledgment");
|
||||
}
|
||||
}
|
||||
|
||||
SuccessOrExit(error = ThreadTlv::GetTlv(aMessage, ThreadTlv::kTarget, sizeof(targetTlv), targetTlv));
|
||||
|
||||
@@ -154,8 +154,6 @@ private:
|
||||
void SendAddressQueryResponse(const ThreadTargetTlv &aTargetTlv, const ThreadMeshLocalEidTlv &aMlEidTlv,
|
||||
const ThreadLastTransactionTimeTlv *aLastTransactionTimeTlv,
|
||||
const Ip6::Address &aDestination);
|
||||
void SendAddressErrorResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestInfo);
|
||||
void SendAddressNotificationResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestInfo);
|
||||
|
||||
static void HandleUdpReceive(void *aContext, otMessage aMessage, const otMessageInfo *aMessageInfo);
|
||||
|
||||
|
||||
@@ -104,6 +104,7 @@ void AnnounceBeginServer::HandleRequest(Coap::Header &aHeader, Message &aMessage
|
||||
MeshCoP::ChannelMask0Tlv channelMask;
|
||||
MeshCoP::CountTlv count;
|
||||
MeshCoP::PeriodTlv period;
|
||||
Ip6::MessageInfo responseInfo(aMessageInfo);
|
||||
|
||||
VerifyOrExit(aHeader.GetCode() == kCoapRequestPost, ;);
|
||||
|
||||
@@ -118,40 +119,13 @@ void AnnounceBeginServer::HandleRequest(Coap::Header &aHeader, Message &aMessage
|
||||
|
||||
SendAnnounce(channelMask.GetMask(), count.GetCount(), period.GetPeriod());
|
||||
|
||||
SendResponse(aHeader, aMessageInfo);
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
ThreadError AnnounceBeginServer::SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Message *message = NULL;
|
||||
Coap::Header responseHeader;
|
||||
Ip6::MessageInfo responseInfo(aRequestInfo);
|
||||
|
||||
VerifyOrExit(aRequestHeader.GetType() == kCoapTypeConfirmable, ;);
|
||||
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
|
||||
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo));
|
||||
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo));
|
||||
|
||||
otLogInfoMeshCoP("sent announce begin response");
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
|
||||
return error;
|
||||
return;
|
||||
}
|
||||
|
||||
void AnnounceBeginServer::HandleTimer(void *aContext)
|
||||
|
||||
@@ -91,8 +91,6 @@ private:
|
||||
const otMessageInfo *aMessageInfo);
|
||||
void HandleRequest(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
ThreadError SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestMessageInfo);
|
||||
|
||||
static void HandleTimer(void *aContext);
|
||||
void HandleTimer(void);
|
||||
|
||||
|
||||
@@ -79,6 +79,7 @@ void EnergyScanServer::HandleRequest(Coap::Header &aHeader, Message &aMessage, c
|
||||
MeshCoP::PeriodTlv period;
|
||||
MeshCoP::ScanDurationTlv scanDuration;
|
||||
MeshCoP::ChannelMask0Tlv channelMask;
|
||||
Ip6::MessageInfo responseInfo(aMessageInfo);
|
||||
|
||||
VerifyOrExit(aHeader.GetCode() == kCoapRequestPost, ;);
|
||||
|
||||
@@ -92,7 +93,7 @@ void EnergyScanServer::HandleRequest(Coap::Header &aHeader, Message &aMessage, c
|
||||
VerifyOrExit(scanDuration.IsValid(), ;);
|
||||
|
||||
SuccessOrExit(MeshCoP::Tlv::GetTlv(aMessage, MeshCoP::Tlv::kChannelMask, sizeof(channelMask), channelMask));
|
||||
VerifyOrExit(channelMask.IsValid(),);
|
||||
VerifyOrExit(channelMask.IsValid(), ;);
|
||||
|
||||
mChannelMask = channelMask.GetMask();
|
||||
mChannelMaskCurrent = mChannelMask;
|
||||
@@ -104,40 +105,14 @@ void EnergyScanServer::HandleRequest(Coap::Header &aHeader, Message &aMessage, c
|
||||
mTimer.Start(kScanDelay);
|
||||
|
||||
mCommissioner = aMessageInfo.GetPeerAddr();
|
||||
SendResponse(aHeader, aMessageInfo);
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
ThreadError EnergyScanServer::SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Message *message = NULL;
|
||||
Coap::Header responseHeader;
|
||||
Ip6::MessageInfo responseInfo(aRequestInfo);
|
||||
|
||||
VerifyOrExit(aRequestHeader.GetType() == kCoapTypeConfirmable, ;);
|
||||
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
|
||||
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo));
|
||||
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo));
|
||||
|
||||
otLogInfoMeshCoP("sent energy scan query response");
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
|
||||
return error;
|
||||
return;
|
||||
}
|
||||
|
||||
void EnergyScanServer::HandleTimer(void *aContext)
|
||||
|
||||
@@ -84,7 +84,6 @@ private:
|
||||
void HandleNetifStateChanged(uint32_t aFlags);
|
||||
|
||||
ThreadError SendReport(void);
|
||||
ThreadError SendResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestMessageInfo);
|
||||
|
||||
Ip6::Address mCommissioner;
|
||||
uint32_t mChannelMask;
|
||||
|
||||
@@ -3990,34 +3990,13 @@ void MleRouter::HandleAddressRelease(Coap::Header &aHeader, Message &aMessage,
|
||||
memcmp(&router->mMacAddr, macAddr64Tlv.GetMacAddr(), sizeof(router->mMacAddr)) == 0,);
|
||||
|
||||
ReleaseRouterId(routerId);
|
||||
SendAddressReleaseResponse(aHeader, aMessageInfo);
|
||||
|
||||
exit:
|
||||
{}
|
||||
}
|
||||
|
||||
void MleRouter::SendAddressReleaseResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Coap::Header responseHeader;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
|
||||
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo));
|
||||
|
||||
otLogInfoMle("Sent address release response");
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
{}
|
||||
}
|
||||
|
||||
void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv)
|
||||
|
||||
@@ -746,7 +746,6 @@ private:
|
||||
ThreadError SendAddressRelease(void);
|
||||
void SendAddressSolicitResponse(const Coap::Header &aRequest, uint8_t aRouterId,
|
||||
const Ip6::MessageInfo &aMessageInfo);
|
||||
void SendAddressReleaseResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo);
|
||||
ThreadError SendAdvertisement(void);
|
||||
ThreadError SendLinkRequest(Neighbor *aNeighbor);
|
||||
ThreadError SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor,
|
||||
|
||||
@@ -167,7 +167,9 @@ void Leader::HandleServerData(Coap::Header &aHeader, Message &aMessage,
|
||||
networkData.GetTlvs(), networkData.GetLength());
|
||||
}
|
||||
|
||||
SendServerDataResponse(aHeader, aMessageInfo, NULL, 0);
|
||||
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo));
|
||||
|
||||
otLogInfoNetData("Sent network data registration acknowledgment");
|
||||
|
||||
exit:
|
||||
return;
|
||||
@@ -289,37 +291,6 @@ void Leader::HandleCommissioningGet(Coap::Header &aHeader, Message &aMessage, co
|
||||
SendCommissioningGetResponse(aHeader, aMessageInfo, tlvs, length);
|
||||
}
|
||||
|
||||
void Leader::SendServerDataResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo,
|
||||
const uint8_t *aTlvs, uint8_t aTlvsLength)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Coap::Header responseHeader;
|
||||
Message *message;
|
||||
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
|
||||
if (aTlvsLength > 0)
|
||||
{
|
||||
responseHeader.SetPayloadMarker();
|
||||
}
|
||||
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
SuccessOrExit(error = message->Append(aTlvs, aTlvsLength));
|
||||
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo));
|
||||
|
||||
otLogInfoNetData("Sent network data registration acknowledgment");
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
}
|
||||
|
||||
void Leader::SendCommissioningGetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo,
|
||||
uint8_t *aTlvs, uint8_t aLength)
|
||||
{
|
||||
|
||||
@@ -144,8 +144,6 @@ private:
|
||||
static void HandleServerData(void *aContext, otCoapHeader *aHeader, otMessage aMessage,
|
||||
const otMessageInfo *aMessageInfo);
|
||||
void HandleServerData(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
void SendServerDataResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo,
|
||||
const uint8_t *aTlvs, uint8_t aTlvsLength);
|
||||
|
||||
static void HandleTimer(void *aContext);
|
||||
void HandleTimer(void);
|
||||
|
||||
@@ -81,31 +81,6 @@ void NetworkDiagnostic::SetReceiveDiagnosticGetCallback(otReceiveDiagnosticGetCa
|
||||
mReceiveDiagnosticGetCallbackContext = aCallbackContext;
|
||||
}
|
||||
|
||||
ThreadError NetworkDiagnostic::SendEmptyAck(Coap::Header &aHeader, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Message *message = NULL;
|
||||
Coap::Header header;
|
||||
Ip6::MessageInfo messageInfo(aMessageInfo);
|
||||
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
header.SetDefaultResponseHeader(aHeader);
|
||||
|
||||
SuccessOrExit(error = message->Append(header.GetBytes(), header.GetLength()));
|
||||
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, messageInfo));
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
ThreadError NetworkDiagnostic::SendDiagnosticGet(const Ip6::Address &aDestination, const uint8_t aTlvTypes[],
|
||||
uint8_t aCount)
|
||||
{
|
||||
@@ -192,8 +167,6 @@ void NetworkDiagnostic::HandleDiagnosticGetAnswer(void *aContext, otCoapHeader *
|
||||
void NetworkDiagnostic::HandleDiagnosticGetAnswer(Coap::Header &aHeader, Message &aMessage,
|
||||
const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
|
||||
VerifyOrExit(aHeader.GetType() == kCoapTypeConfirmable &&
|
||||
aHeader.GetCode() == kCoapRequestPost, ;);
|
||||
|
||||
@@ -204,7 +177,7 @@ void NetworkDiagnostic::HandleDiagnosticGetAnswer(Coap::Header &aHeader, Message
|
||||
mReceiveDiagnosticGetCallback(&aMessage, &aMessageInfo, mReceiveDiagnosticGetCallbackContext);
|
||||
}
|
||||
|
||||
SuccessOrExit(error = SendEmptyAck(aHeader, aMessageInfo));
|
||||
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo));
|
||||
|
||||
otLogInfoNetDiag("Sent diagnostic answer acknowledgment");
|
||||
|
||||
@@ -471,9 +444,10 @@ void NetworkDiagnostic::HandleDiagnosticGetQuery(Coap::Header &aHeader, Message
|
||||
// DIAG_GET.qry may be sent as a confirmable message.
|
||||
if (aHeader.GetType() == kCoapTypeConfirmable)
|
||||
{
|
||||
SuccessOrExit(error = SendEmptyAck(aHeader, aMessageInfo));
|
||||
|
||||
otLogInfoNetDiag("Sent diagnostic get query acknowledgment");
|
||||
if (mCoapServer.SendEmptyAck(aHeader, aMessageInfo) == kThreadError_None)
|
||||
{
|
||||
otLogInfoNetDiag("Sent diagnostic get query acknowledgment");
|
||||
}
|
||||
}
|
||||
|
||||
header.Init(kCoapTypeConfirmable, kCoapRequestPost);
|
||||
@@ -607,8 +581,6 @@ void NetworkDiagnostic::HandleDiagnosticReset(void *aContext, otCoapHeader *aHea
|
||||
void NetworkDiagnostic::HandleDiagnosticReset(Coap::Header &aHeader, Message &aMessage,
|
||||
const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Message *message = NULL;
|
||||
uint16_t offset = 0;
|
||||
uint8_t type;
|
||||
NetworkDiagnosticTlv networkDiagnosticTlv;
|
||||
@@ -616,20 +588,20 @@ void NetworkDiagnostic::HandleDiagnosticReset(Coap::Header &aHeader, Message &aM
|
||||
otLogInfoNetDiag("Received diagnostic reset request");
|
||||
|
||||
VerifyOrExit(aHeader.GetType() == kCoapTypeConfirmable &&
|
||||
aHeader.GetCode() == kCoapRequestPost, error = kThreadError_Drop);
|
||||
aHeader.GetCode() == kCoapRequestPost, ;);
|
||||
|
||||
VerifyOrExit((aMessage.Read(aMessage.GetOffset(), sizeof(NetworkDiagnosticTlv),
|
||||
&networkDiagnosticTlv) == sizeof(NetworkDiagnosticTlv)), error = kThreadError_Drop);
|
||||
&networkDiagnosticTlv) == sizeof(NetworkDiagnosticTlv)), ;);
|
||||
|
||||
VerifyOrExit(networkDiagnosticTlv.GetType() == NetworkDiagnosticTlv::kTypeList, error = kThreadError_Drop);
|
||||
VerifyOrExit(networkDiagnosticTlv.GetType() == NetworkDiagnosticTlv::kTypeList, ;);
|
||||
|
||||
VerifyOrExit((static_cast<TypeListTlv *>(&networkDiagnosticTlv)->IsValid()), error = kThreadError_Drop);
|
||||
VerifyOrExit((static_cast<TypeListTlv *>(&networkDiagnosticTlv)->IsValid()), ;);
|
||||
|
||||
offset = aMessage.GetOffset() + sizeof(NetworkDiagnosticTlv);
|
||||
|
||||
for (uint8_t i = 0; i < networkDiagnosticTlv.GetLength(); i++)
|
||||
{
|
||||
VerifyOrExit(aMessage.Read(offset, sizeof(type), &type) == sizeof(type), error = kThreadError_Drop);
|
||||
VerifyOrExit(aMessage.Read(offset, sizeof(type), &type) == sizeof(type), ;);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
@@ -644,16 +616,12 @@ void NetworkDiagnostic::HandleDiagnosticReset(Coap::Header &aHeader, Message &aM
|
||||
}
|
||||
}
|
||||
|
||||
SuccessOrExit(error = SendEmptyAck(aHeader, aMessageInfo));
|
||||
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, aMessageInfo));
|
||||
|
||||
otLogInfoNetDiag("Sent diagnostic reset acknowledgment");
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
} // namespace NetworkDiagnostic
|
||||
|
||||
@@ -109,7 +109,6 @@ private:
|
||||
ThreadError AppendIPv6AddressList(Message &aMessage);
|
||||
ThreadError AppendChildTable(Message &aMessage);
|
||||
ThreadError FillRequestedTlvs(Message &aRequest, Message &aResponse, NetworkDiagnosticTlv &aNetworkDiagnosticTlv);
|
||||
ThreadError SendEmptyAck(Coap::Header &aHeader, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
static void HandleDiagnosticGetRequest(void *aContext, otCoapHeader *aHeader, otMessage aMessage,
|
||||
const otMessageInfo *aMessageInfo);
|
||||
|
||||
@@ -69,6 +69,7 @@ void PanIdQueryServer::HandleQuery(Coap::Header &aHeader, Message &aMessage, con
|
||||
{
|
||||
MeshCoP::PanIdTlv panId;
|
||||
MeshCoP::ChannelMask0Tlv channelMask;
|
||||
Ip6::MessageInfo responseInfo(aMessageInfo);
|
||||
|
||||
VerifyOrExit(aHeader.GetCode() == kCoapRequestPost, ;);
|
||||
|
||||
@@ -83,42 +84,13 @@ void PanIdQueryServer::HandleQuery(Coap::Header &aHeader, Message &aMessage, con
|
||||
mPanId = panId.GetPanId();
|
||||
mTimer.Start(kScanDelay);
|
||||
|
||||
SendQueryResponse(aHeader, aMessageInfo);
|
||||
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
|
||||
ThreadError PanIdQueryServer::SendQueryResponse(const Coap::Header &aRequestHeader,
|
||||
const Ip6::MessageInfo &aRequestInfo)
|
||||
{
|
||||
ThreadError error = kThreadError_None;
|
||||
Message *message = NULL;
|
||||
Coap::Header responseHeader;
|
||||
Ip6::MessageInfo responseInfo;
|
||||
|
||||
VerifyOrExit(aRequestHeader.GetType() == kCoapTypeConfirmable, ;);
|
||||
|
||||
VerifyOrExit((message = mCoapServer.NewMessage(0)) != NULL, error = kThreadError_NoBufs);
|
||||
|
||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
||||
|
||||
SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength()));
|
||||
|
||||
memcpy(&responseInfo, &aRequestInfo, sizeof(responseInfo));
|
||||
memset(&responseInfo.mSockAddr, 0, sizeof(responseInfo.mSockAddr));
|
||||
SuccessOrExit(error = mCoapServer.SendMessage(*message, responseInfo));
|
||||
SuccessOrExit(mCoapServer.SendEmptyAck(aHeader, responseInfo));
|
||||
|
||||
otLogInfoMeshCoP("sent panid query response");
|
||||
|
||||
exit:
|
||||
|
||||
if (error != kThreadError_None && message != NULL)
|
||||
{
|
||||
message->Free();
|
||||
}
|
||||
|
||||
return error;
|
||||
return;
|
||||
}
|
||||
|
||||
void PanIdQueryServer::HandleScanResult(void *aContext, Mac::Frame *aFrame)
|
||||
|
||||
@@ -81,7 +81,6 @@ private:
|
||||
static void HandleUdpReceive(void *aContext, otMessage aMessage, const otMessageInfo *aMessageInfo);
|
||||
|
||||
ThreadError SendConflict(void);
|
||||
ThreadError SendQueryResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aRequestMessageInfo);
|
||||
|
||||
Ip6::Address mCommissioner;
|
||||
uint32_t mChannelMask;
|
||||
|
||||
Reference in New Issue
Block a user