mirror of
https://github.com/espressif/openthread.git
synced 2026-08-29 05:19:54 +00:00
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:
committed by
Jonathan Hui
parent
7eed76c781
commit
be7e27117b
+23
-7
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user