From 95827bae1647a1ec9fd6c55bdeaef8de691d070b Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Tue, 16 Aug 2016 19:10:26 -0700 Subject: [PATCH] Add return codes to Ip6::HandleDatagram. (#391) --- src/core/net/ip6.cpp | 27 +++++++++++++------------- src/core/thread/mesh_forwarder.cpp | 31 +++++++++++++++++------------- src/ncp/ncp_base.cpp | 28 +++++++++++++-------------- 3 files changed, 44 insertions(+), 42 deletions(-) diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index f51b19283..f8f4831a1 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -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) diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index d9a58a9a5..17cda393e 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -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() diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index a667c14b6..b933f167e 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -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(propKey), value_ptr, - static_cast(value_len)); + static_cast(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(propKey), value_ptr, - static_cast(value_len)); + static_cast(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(propKey), value_ptr, - static_cast(value_len)); + static_cast(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)); }