diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index ecc1c4d54..f2221c89c 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -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(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) diff --git a/src/core/net/ip6.hpp b/src/core/net/ip6.hpp index d7433442d..b3df87789 100644 --- a/src/core/net/ip6.hpp +++ b/src/core/net/ip6.hpp @@ -345,10 +345,11 @@ private: void HandleSendQueue(void); ThreadError ProcessReceiveCallback(const Message &aMessage, const MessageInfo &aMessageInfo, uint8_t aIpProto); - ThreadError HandleExtensionHeaders(Message &message, Header &header, uint8_t &nextHeader, bool receive); + ThreadError HandleExtensionHeaders(Message &message, Header &header, uint8_t &nextHeader, bool &forward, + bool receive); ThreadError HandleFragment(Message &message); ThreadError AddMplOption(Message &message, Header &header, IpProto nextHeader, uint16_t payloadLength); - ThreadError HandleOptions(Message &message, Header &header); + ThreadError HandleOptions(Message &message, Header &header, bool &forward); ThreadError HandlePayload(Message &message, MessageInfo &messageInfo, uint8_t ipproto); ThreadError ForwardMessage(Message &message, MessageInfo &messageInfo, uint8_t ipproto); diff --git a/src/core/net/ip6_mpl.cpp b/src/core/net/ip6_mpl.cpp index f8022cf72..884ea6b7f 100644 --- a/src/core/net/ip6_mpl.cpp +++ b/src/core/net/ip6_mpl.cpp @@ -68,7 +68,7 @@ void Mpl::InitOption(OptionMpl &aOption, const Address &aAddress) } } -ThreadError Mpl::ProcessOption(const Message &aMessage, const Address &aAddress) +ThreadError Mpl::ProcessOption(const Message &aMessage, const Address &aAddress, bool &aForward) { ThreadError error = kThreadError_None; OptionMpl option; @@ -105,6 +105,8 @@ ThreadError Mpl::ProcessOption(const Message &aMessage, const Address &aAddress) VerifyOrExit(entry != NULL, error = kThreadError_Drop); + aForward = true; + entry->mSeed = option.GetSeed(); entry->mSequence = option.GetSequence(); entry->mLifetime = kLifetime; diff --git a/src/core/net/ip6_mpl.hpp b/src/core/net/ip6_mpl.hpp index 19e0ac190..39d53d8d1 100644 --- a/src/core/net/ip6_mpl.hpp +++ b/src/core/net/ip6_mpl.hpp @@ -201,14 +201,15 @@ public: /** * This method processes an MPL option. * - * @param[in] aMessage A reference to the message. - * @param[in] aAddress A reference to the IPv6 Source Address. + * @param[in] aMessage A reference to the message. + * @param[in] aAddress A reference to the IPv6 Source Address. + * @param[out] aForward TRUE if this message should be forwarded, FALSE otherwise. * * @retval kThreadError_None Successfully processed the MPL option. * @retval kThreadError_Drop The MPL message is a duplicate and should be dropped. * */ - ThreadError ProcessOption(const Message &aMessage, const Address &aAddress); + ThreadError ProcessOption(const Message &aMessage, const Address &aAddress, bool &aForward); /** * This method returns the MPL Seed value.