Only forward multicast messages when an MPL entry is available. (#800)

This commit is contained in:
Jonathan Hui
2016-10-12 14:17:09 -07:00
committed by GitHub
parent 0bafb5a08f
commit 2d5c4c58f2
4 changed files with 23 additions and 22 deletions
+13 -16
View File
@@ -232,7 +232,7 @@ void Ip6::HandleSendQueue(void)
}
}
ThreadError Ip6::HandleOptions(Message &message, Header &header)
ThreadError Ip6::HandleOptions(Message &message, Header &header, bool &forward)
{
ThreadError error = kThreadError_None;
HopByHopHeader hbhHeader;
@@ -251,7 +251,7 @@ ThreadError Ip6::HandleOptions(Message &message, Header &header)
switch (optionHeader.GetType())
{
case OptionMpl::kType:
SuccessOrExit(error = mMpl.ProcessOption(message, header.GetSource()));
SuccessOrExit(error = mMpl.ProcessOption(message, header.GetSource(), forward));
break;
default:
@@ -307,7 +307,8 @@ exit:
return error;
}
ThreadError Ip6::HandleExtensionHeaders(Message &message, Header &header, uint8_t &nextHeader, bool receive)
ThreadError Ip6::HandleExtensionHeaders(Message &message, Header &header, uint8_t &nextHeader, bool &forward,
bool receive)
{
ThreadError error = kThreadError_None;
ExtensionHeader extensionHeader;
@@ -321,7 +322,7 @@ ThreadError Ip6::HandleExtensionHeaders(Message &message, Header &header, uint8_
switch (nextHeader)
{
case kProtoHopOpts:
SuccessOrExit(error = HandleOptions(message, header));
SuccessOrExit(error = HandleOptions(message, header, forward));
break;
case kProtoFragment:
@@ -329,7 +330,7 @@ ThreadError Ip6::HandleExtensionHeaders(Message &message, Header &header, uint8_
break;
case kProtoDstOpts:
SuccessOrExit(error = HandleOptions(message, header));
SuccessOrExit(error = HandleOptions(message, header, forward));
break;
case kProtoIp6:
@@ -473,11 +474,7 @@ ThreadError Ip6::HandleDatagram(Message &message, Netif *netif, int8_t interface
receive = true;
}
if (header.GetDestination().GetScope() > Address::kLinkLocalScope)
{
forward = true;
}
else if (netif == NULL)
if (netif == NULL)
{
forward = true;
}
@@ -498,16 +495,16 @@ ThreadError Ip6::HandleDatagram(Message &message, Netif *netif, int8_t interface
}
}
if (!mForwardingEnabled && netif != NULL)
{
forward = false;
}
message.SetOffset(sizeof(header));
// process IPv6 Extension Headers
nextHeader = static_cast<uint8_t>(header.GetNextHeader());
SuccessOrExit(error = HandleExtensionHeaders(message, header, nextHeader, receive));
SuccessOrExit(error = HandleExtensionHeaders(message, header, nextHeader, forward, receive));
if (!mForwardingEnabled && netif != NULL)
{
forward = false;
}
// process IPv6 Payload
if (receive)