mirror of
https://github.com/espressif/openthread.git
synced 2026-09-15 13:40:06 +00:00
implement the MUST not found response. (#1788)
This commit is contained in:
+43
-10
@@ -245,15 +245,36 @@ exit:
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
ThreadError Coap::SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo)
|
ThreadError Coap::SendHeaderResponse(Header::Code aCode, const Header &aRequestHeader,
|
||||||
|
const Ip6::MessageInfo &aMessageInfo)
|
||||||
{
|
{
|
||||||
ThreadError error = kThreadError_None;
|
ThreadError error = kThreadError_None;
|
||||||
Header responseHeader;
|
Header responseHeader;
|
||||||
|
Header::Type requestType;
|
||||||
Message *message = NULL;
|
Message *message = NULL;
|
||||||
|
|
||||||
VerifyOrExit(aRequestHeader.GetType() == kCoapTypeConfirmable, error = kThreadError_InvalidArgs);
|
VerifyOrExit(aRequestHeader.IsRequest(), error = kThreadError_InvalidArgs);
|
||||||
|
|
||||||
responseHeader.SetDefaultResponseHeader(aRequestHeader);
|
requestType = aRequestHeader.GetType();
|
||||||
|
|
||||||
|
switch (requestType)
|
||||||
|
{
|
||||||
|
case kCoapTypeConfirmable:
|
||||||
|
responseHeader.Init(kCoapTypeAcknowledgment, aCode);
|
||||||
|
responseHeader.SetMessageId(aRequestHeader.GetMessageId());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kCoapTypeNonConfirmable:
|
||||||
|
responseHeader.Init(kCoapTypeNonConfirmable, aCode);
|
||||||
|
responseHeader.SetMessageId(mMessageId++);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ExitNow(error = kThreadError_InvalidArgs);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
responseHeader.SetToken(aRequestHeader.GetToken(), aRequestHeader.GetTokenLength());
|
||||||
|
|
||||||
VerifyOrExit((message = NewMessage(responseHeader)) != NULL, error = kThreadError_NoBufs);
|
VerifyOrExit((message = NewMessage(responseHeader)) != NULL, error = kThreadError_NoBufs);
|
||||||
|
|
||||||
@@ -614,20 +635,20 @@ void Coap::ProcessReceivedRequest(Header &aHeader, Message &aMessage, const Ip6:
|
|||||||
char uriPath[Resource::kMaxReceivedUriPath] = "";
|
char uriPath[Resource::kMaxReceivedUriPath] = "";
|
||||||
char *curUriPath = uriPath;
|
char *curUriPath = uriPath;
|
||||||
const Header::Option *coapOption;
|
const Header::Option *coapOption;
|
||||||
Message *response = NULL;
|
Message *cachedResponse = NULL;
|
||||||
ThreadError error = kThreadError_None;
|
ThreadError error = kThreadError_NotFound;
|
||||||
|
|
||||||
if (mInterceptor != NULL)
|
if (mInterceptor != NULL)
|
||||||
{
|
{
|
||||||
SuccessOrExit(mInterceptor(aMessage, aMessageInfo));
|
SuccessOrExit(error = mInterceptor(aMessage, aMessageInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
aMessage.MoveOffset(aHeader.GetLength());
|
aMessage.MoveOffset(aHeader.GetLength());
|
||||||
|
|
||||||
switch (mResponsesQueue.GetMatchedResponseCopy(aHeader, aMessageInfo, &response))
|
switch (mResponsesQueue.GetMatchedResponseCopy(aHeader, aMessageInfo, &cachedResponse))
|
||||||
{
|
{
|
||||||
case kThreadError_None:
|
case kThreadError_None:
|
||||||
error = Send(*response, aMessageInfo);
|
error = Send(*cachedResponse, aMessageInfo);
|
||||||
// fall through
|
// fall through
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -671,6 +692,7 @@ void Coap::ProcessReceivedRequest(Header &aHeader, Message &aMessage, const Ip6:
|
|||||||
if (strcmp(resource->mUriPath, uriPath) == 0)
|
if (strcmp(resource->mUriPath, uriPath) == 0)
|
||||||
{
|
{
|
||||||
resource->HandleRequest(aHeader, aMessage, aMessageInfo);
|
resource->HandleRequest(aHeader, aMessage, aMessageInfo);
|
||||||
|
error = kThreadError_None;
|
||||||
ExitNow();
|
ExitNow();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -678,13 +700,24 @@ void Coap::ProcessReceivedRequest(Header &aHeader, Message &aMessage, const Ip6:
|
|||||||
if (mDefaultHandler)
|
if (mDefaultHandler)
|
||||||
{
|
{
|
||||||
mDefaultHandler(mDefaultHandlerContext, &aHeader, &aMessage, &aMessageInfo);
|
mDefaultHandler(mDefaultHandlerContext, &aHeader, &aMessage, &aMessageInfo);
|
||||||
|
error = kThreadError_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
|
||||||
if (error != kThreadError_None && response != NULL)
|
if (error != kThreadError_None)
|
||||||
{
|
{
|
||||||
response->Free();
|
otLogInfoCoapErr(mNetif.GetInstance(), error, "Failed to process request");
|
||||||
|
|
||||||
|
if (error == kThreadError_NotFound)
|
||||||
|
{
|
||||||
|
SendNotFound(aHeader, aMessageInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cachedResponse != NULL)
|
||||||
|
{
|
||||||
|
cachedResponse->Free();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|||||||
+33
-1
@@ -551,6 +551,20 @@ public:
|
|||||||
return SendEmptyMessage(kCoapTypeReset, aRequestHeader, aMessageInfo);
|
return SendEmptyMessage(kCoapTypeReset, aRequestHeader, aMessageInfo);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method sends header-only CoAP response message.
|
||||||
|
*
|
||||||
|
* @param[in] aCode The CoAP code of this response.
|
||||||
|
* @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 SendHeaderResponse(Header::Code aCode, const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method sends a CoAP ACK empty message which is used in Separate Response for confirmable requests.
|
* This method sends a CoAP ACK empty message which is used in Separate Response for confirmable requests.
|
||||||
*
|
*
|
||||||
@@ -577,7 +591,25 @@ public:
|
|||||||
* @retval kThreadError_InvalidArgs The @p aRequestHeader header is not of confirmable type.
|
* @retval kThreadError_InvalidArgs The @p aRequestHeader header is not of confirmable type.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
ThreadError SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo);
|
ThreadError SendEmptyAck(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo) {
|
||||||
|
return (aRequestHeader.GetType() == kCoapTypeConfirmable ?
|
||||||
|
SendHeaderResponse(kCoapResponseChanged, aRequestHeader, aMessageInfo) :
|
||||||
|
kThreadError_InvalidArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method sends a header-only CoAP message to indicate no resource matched for the request.
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
ThreadError SendNotFound(const Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo) {
|
||||||
|
return SendHeaderResponse(kCoapResponseNotFound, aRequestHeader, aMessageInfo);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method aborts CoAP transactions associated with given handler and context.
|
* This method aborts CoAP transactions associated with given handler and context.
|
||||||
|
|||||||
Reference in New Issue
Block a user