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)
+18 -13
View File
@@ -1331,7 +1331,7 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength,
}
}
VerifyOrExit(message != NULL, ;);
VerifyOrExit(message != NULL, error = kThreadError_Drop);
}
assert(message != NULL);
@@ -1339,14 +1339,18 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength,
// copy Fragment
message->Write(message->GetOffset(), aFrameLength, aFrame);
message->MoveOffset(aFrameLength);
VerifyOrExit(message->GetOffset() >= message->GetLength(), ;);
mReassemblyList.Dequeue(*message);
SuccessOrExit(error = HandleDatagram(*message, aMessageInfo));
exit:
if (error != kThreadError_None && message != NULL)
if (error == kThreadError_None)
{
if (message->GetOffset() >= message->GetLength())
{
mReassemblyList.Dequeue(*message);
error = HandleDatagram(*message, aMessageInfo);
}
}
else if (message != NULL)
{
Message::Free(*message);
}
@@ -1394,12 +1398,12 @@ void MeshForwarder::HandleLowpanHC(uint8_t *aFrame, uint8_t aFrameLength,
int headerLength;
uint16_t ip6PayloadLength;
VerifyOrExit((message = Message::New(Message::kTypeIp6, 0)) != NULL, ;);
VerifyOrExit((message = Message::New(Message::kTypeIp6, 0)) != NULL, error = kThreadError_NoBufs);
message->SetLinkSecurityEnabled(aMessageInfo.mLinkSecurity);
message->SetPanId(aMessageInfo.mPanId);
headerLength = mLowpan.Decompress(*message, aMacSource, aMacDest, aFrame, aFrameLength, 0);
VerifyOrExit(headerLength > 0, ;);
VerifyOrExit(headerLength > 0, error = kThreadError_Drop);
// Security Check
VerifyOrExit(mNetif.GetIp6Filter().Accept(*message), error = kThreadError_Drop);
@@ -1414,11 +1418,13 @@ void MeshForwarder::HandleLowpanHC(uint8_t *aFrame, uint8_t aFrameLength,
message->Write(message->GetOffset(), aFrameLength, aFrame);
SuccessOrExit(error = HandleDatagram(*message, aMessageInfo));
exit:
if (error != kThreadError_None && message != NULL)
if (error == kThreadError_None)
{
error = HandleDatagram(*message, aMessageInfo);
}
else if (message != NULL)
{
Message::Free(*message);
}
@@ -1426,8 +1432,7 @@ exit:
ThreadError MeshForwarder::HandleDatagram(Message &aMessage, const ThreadMessageInfo &aMessageInfo)
{
Ip6::Ip6::HandleDatagram(aMessage, &mNetif, mNetif.GetInterfaceId(), &aMessageInfo, false);
return kThreadError_None;
return Ip6::Ip6::HandleDatagram(aMessage, &mNetif, mNetif.GetInterfaceId(), &aMessageInfo, false);
}
void MeshForwarder::UpdateFramePending()
+13 -15
View File
@@ -514,7 +514,7 @@ void NcpBase::UpdateChangedProps(void)
SPINEL_HEADER_FLAG | SPINEL_HEADER_IID_0,
SPINEL_PROP_IPV6_LL_ADDR
);
}
}
else if ((mChangedFlags & OT_IP6_ML_ADDR_CHANGED) != 0)
{
SuccessOrExit(HandleCommandPropertyGet(
@@ -927,7 +927,7 @@ ThreadError NcpBase::CommandHandler_NOOP(uint8_t header, unsigned int command, c
ThreadError NcpBase::CommandHandler_RESET(uint8_t header, unsigned int command, const uint8_t *arg_ptr,
uint16_t arg_len)
{
// We aren't using any of the arguments to this function.
// We aren't using any of the arguments to this function.
(void)header;
(void)command;
(void)arg_ptr;
@@ -985,7 +985,7 @@ ThreadError NcpBase::CommandHandler_PROP_VALUE_SET(uint8_t header, unsigned int
if (parsedLength == arg_len)
{
errorCode = HandleCommandPropertySet(header, static_cast<spinel_prop_key_t>(propKey), value_ptr,
static_cast<uint16_t>(value_len));
static_cast<uint16_t>(value_len));
}
else
{
@@ -1011,7 +1011,7 @@ ThreadError NcpBase::CommandHandler_PROP_VALUE_INSERT(uint8_t header, unsigned i
if (parsedLength == arg_len)
{
errorCode = HandleCommandPropertyInsert(header, static_cast<spinel_prop_key_t>(propKey), value_ptr,
static_cast<uint16_t>(value_len));
static_cast<uint16_t>(value_len));
}
else
{
@@ -1037,7 +1037,7 @@ ThreadError NcpBase::CommandHandler_PROP_VALUE_REMOVE(uint8_t header, unsigned i
if (parsedLength == arg_len)
{
errorCode = HandleCommandPropertyRemove(header, static_cast<spinel_prop_key_t>(propKey), value_ptr,
static_cast<uint16_t>(value_len));
static_cast<uint16_t>(value_len));
}
else
{
@@ -2656,6 +2656,10 @@ ThreadError NcpBase::SetPropertyHandler_STREAM_NET_INSECURE(uint8_t header, spin
{
errorCode = otSendIp6Datagram(message);
}
else if (message)
{
Message::Free(*message);
}
if (errorCode == kThreadError_None)
{
@@ -2668,11 +2672,6 @@ ThreadError NcpBase::SetPropertyHandler_STREAM_NET_INSECURE(uint8_t header, spin
}
else
{
if (message)
{
Message::Free(*message);
}
errorCode = SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode));
}
@@ -2724,6 +2723,10 @@ ThreadError NcpBase::SetPropertyHandler_STREAM_NET(uint8_t header, spinel_prop_k
{
errorCode = otSendIp6Datagram(message);
}
else if (message)
{
Message::Free(*message);
}
if (errorCode == kThreadError_None)
{
@@ -2736,11 +2739,6 @@ ThreadError NcpBase::SetPropertyHandler_STREAM_NET(uint8_t header, spinel_prop_k
}
else
{
if (message)
{
Message::Free(*message);
}
errorCode = SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode));
}