Introduce SendEmptyResponse in CoAP Server. (#1108)

This commit is contained in:
Łukasz Duda
2017-01-07 08:18:07 -08:00
committed by Jonathan Hui
parent a52ad98b23
commit 23396a30f8
22 changed files with 87 additions and 338 deletions
+24
View File
@@ -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;
+13
View File
@@ -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.
*
+3 -26
View File
@@ -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)
{
-1
View File
@@ -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);
+5 -27
View File
@@ -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
-2
View File
@@ -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;
+5 -28
View File
@@ -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
-2
View File
@@ -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;
+10 -54
View File
@@ -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));
-2
View File
@@ -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);
+3 -29
View File
@@ -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);
+4 -29
View File
@@ -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)
-1
View File
@@ -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;
+2 -23
View File
@@ -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)
-1
View File
@@ -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,
+3 -32
View File
@@ -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);
+12 -44
View File
@@ -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
-1
View File
@@ -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);
+3 -31
View File
@@ -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)
-1
View File
@@ -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;