ip6: Ensure not to pass a message from local host back to it. (#1583)

The commit makes the following changes:

- We ensure not to pass up a message we received from local host
  back to the host again (this avoids message loops due to incorrect
  route setup on the host).

- We add logs to indicate when the process of passing up a message to
  host fails (e.g., running out of message buffers and thus failing
  to clone the message).
This commit is contained in:
Abtin Keshavarzian
2017-04-11 19:39:54 -07:00
committed by Jonathan Hui
parent 7eed76c781
commit be7e27117b
2 changed files with 25 additions and 8 deletions
+23 -7
View File
@@ -575,11 +575,13 @@ exit:
return error;
}
ThreadError Ip6::ProcessReceiveCallback(const Message &aMessage, const MessageInfo &messageInfo, uint8_t aIpProto)
ThreadError Ip6::ProcessReceiveCallback(const Message &aMessage, const MessageInfo &messageInfo, uint8_t aIpProto,
bool fromLocalHost)
{
ThreadError error = kThreadError_None;
Message *messageCopy = NULL;
VerifyOrExit(fromLocalHost == false, error = kThreadError_Drop);
VerifyOrExit(mReceiveIp6DatagramCallback != NULL, error = kThreadError_NoRoute);
if (mIsReceiveIp6FilterEnabled)
@@ -627,6 +629,23 @@ ThreadError Ip6::ProcessReceiveCallback(const Message &aMessage, const MessageIn
mReceiveIp6DatagramCallback(messageCopy, mReceiveIp6DatagramCallbackContext);
exit:
switch (error)
{
case kThreadError_NoBufs:
otLogInfoIp6(GetInstance(), "Failed to pass up message (len: %d) to host - out of message buffer.",
aMessage.GetLength());
break;
case kThreadError_Drop:
otLogInfoIp6(GetInstance(), "Dropping message (len: %d) from local host since next hop is the host.",
aMessage.GetLength());
break;
default:
break;
}
return error;
}
@@ -735,16 +754,13 @@ ThreadError Ip6::HandleDatagram(Message &message, Netif *netif, int8_t interface
ExitNow(tunnel = true);
}
if (fromLocalHost == false)
{
ProcessReceiveCallback(message, messageInfo, nextHeader);
}
ProcessReceiveCallback(message, messageInfo, nextHeader, fromLocalHost);
SuccessOrExit(error = HandlePayload(message, messageInfo, nextHeader));
}
else if (multicastPromiscuous)
{
ProcessReceiveCallback(message, messageInfo, nextHeader);
ProcessReceiveCallback(message, messageInfo, nextHeader, fromLocalHost);
}
if (forward)
@@ -754,7 +770,7 @@ ThreadError Ip6::HandleDatagram(Message &message, Netif *netif, int8_t interface
if (forwardInterfaceId == 0)
{
// try passing to host
SuccessOrExit(error = ProcessReceiveCallback(message, messageInfo, nextHeader));
SuccessOrExit(error = ProcessReceiveCallback(message, messageInfo, nextHeader, fromLocalHost));
// the caller transfers custody in the success case, so free the message here
message.Free();
+2 -1
View File
@@ -368,7 +368,8 @@ private:
static void HandleSendQueue(void *aContext);
void HandleSendQueue(void);
ThreadError ProcessReceiveCallback(const Message &aMessage, const MessageInfo &aMessageInfo, uint8_t aIpProto);
ThreadError ProcessReceiveCallback(const Message &aMessage, const MessageInfo &aMessageInfo, uint8_t aIpProto,
bool fromLocalHost);
ThreadError HandleExtensionHeaders(Message &message, Header &header, uint8_t &nextHeader, bool forward,
bool receive);
ThreadError HandleFragment(Message &message);