Add return codes to Ip6::HandleDatagram. (#391)

This commit is contained in:
Jonathan Hui
2016-08-16 19:10:26 -07:00
committed by GitHub
parent 5dbfe2af46
commit 95827bae16
3 changed files with 44 additions and 42 deletions
+13 -14
View File
@@ -188,7 +188,7 @@ exit:
if (error == kThreadError_None)
{
error = HandleDatagram(message, NULL, messageInfo.mInterfaceId, NULL, false);
HandleDatagram(message, NULL, messageInfo.mInterfaceId, NULL, false);
}
return error;
@@ -327,10 +327,9 @@ void Ip6::ProcessReceiveCallback(Message &aMessage)
VerifyOrExit(sReceiveIp6DatagramCallback != NULL, ;);
// make a copy of the datagram to pass to host
VerifyOrExit((messageCopy = NewMessage(0)) != NULL, ;);
VerifyOrExit((messageCopy = NewMessage(0)) != NULL, error = kThreadError_NoBufs);
SuccessOrExit(error = messageCopy->SetLength(aMessage.GetLength()));
VerifyOrExit(aMessage.CopyTo(0, 0, aMessage.GetLength(), *messageCopy) == aMessage.GetLength(),
error = kThreadError_Drop);
aMessage.CopyTo(0, 0, aMessage.GetLength(), *messageCopy);
sReceiveIp6DatagramCallback(messageCopy);
@@ -345,7 +344,7 @@ exit:
ThreadError Ip6::HandleDatagram(Message &message, Netif *netif, int8_t interfaceId, const void *linkMessageInfo,
bool fromLocalHost)
{
ThreadError error = kThreadError_Drop;
ThreadError error = kThreadError_None;
MessageInfo messageInfo;
Header header;
uint16_t payloadLength;
@@ -361,16 +360,16 @@ ThreadError Ip6::HandleDatagram(Message &message, Netif *netif, int8_t interface
#endif
// check message length
VerifyOrExit(message.GetLength() >= sizeof(header), ;);
VerifyOrExit(message.GetLength() >= sizeof(header), error = kThreadError_Drop);
message.Read(0, sizeof(header), &header);
payloadLength = header.GetPayloadLength();
// check Version
VerifyOrExit(header.IsVersion6(), ;);
VerifyOrExit(header.IsVersion6(), error = kThreadError_Drop);
// check Payload Length
VerifyOrExit(sizeof(header) + payloadLength == message.GetLength() &&
sizeof(header) + payloadLength <= Ip6::kMaxDatagramLength, ;);
sizeof(header) + payloadLength <= Ip6::kMaxDatagramLength, error = kThreadError_Drop);
memset(&messageInfo, 0, sizeof(messageInfo));
messageInfo.GetPeerAddr() = header.GetSource();
@@ -421,7 +420,7 @@ ThreadError Ip6::HandleDatagram(Message &message, Netif *netif, int8_t interface
// process IPv6 Extension Headers
nextHeader = header.GetNextHeader();
SuccessOrExit(HandleExtensionHeaders(message, nextHeader, receive));
SuccessOrExit(error = HandleExtensionHeaders(message, nextHeader, receive));
// process IPv6 Payload
if (receive)
@@ -431,7 +430,7 @@ ThreadError Ip6::HandleDatagram(Message &message, Netif *netif, int8_t interface
ProcessReceiveCallback(message);
}
SuccessOrExit(HandlePayload(message, messageInfo, nextHeader));
SuccessOrExit(error = HandlePayload(message, messageInfo, nextHeader));
}
if (forward)
@@ -444,24 +443,24 @@ ThreadError Ip6::HandleDatagram(Message &message, Netif *netif, int8_t interface
if (header.GetHopLimit() == 0)
{
// send time exceeded
ExitNow(error = kThreadError_Drop);
}
else
{
hopLimit = header.GetHopLimit();
message.Write(Header::GetHopLimitOffset(), Header::GetHopLimitSize(), &hopLimit);
SuccessOrExit(ForwardMessage(message, messageInfo));
ExitNow(error = kThreadError_None);
SuccessOrExit(error = ForwardMessage(message, messageInfo));
}
}
exit:
if (error == kThreadError_Drop)
if (error != kThreadError_None || !forward)
{
Message::Free(message);
}
return kThreadError_None;
return error;
}
ThreadError ForwardMessage(Message &message, MessageInfo &messageInfo)