From 5dbfe2af460e5f3ee4631afc983f6f298a324659 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Tue, 16 Aug 2016 19:10:09 -0700 Subject: [PATCH] Only enable IPv6 forwarding for Router and Leader roles. (#390) --- src/core/net/ip6.cpp | 12 ++++++++++++ src/core/net/ip6.hpp | 8 ++++++++ src/core/thread/mle.cpp | 4 ++++ src/core/thread/mle_router.cpp | 2 ++ 4 files changed, 26 insertions(+) diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index 037e7136a..f51b19283 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -49,6 +49,7 @@ namespace Ip6 { static otDEFINE_ALIGNED_VAR(sMplBuf, sizeof(Mpl), uint64_t); static Mpl *sMpl; +static bool sForwardingEnabled; static otReceiveIp6DatagramCallback sReceiveIp6DatagramCallback = NULL; @@ -63,6 +64,12 @@ Message *Ip6::NewMessage(uint16_t reserved) void Ip6::Init(void) { sMpl = new(&sMplBuf) Mpl; + sForwardingEnabled = false; +} + +void Ip6::SetForwardingEnabled(bool aEnable) +{ + sForwardingEnabled = aEnable; } uint16_t Ip6::UpdateChecksum(uint16_t checksum, uint16_t val) @@ -405,6 +412,11 @@ ThreadError Ip6::HandleDatagram(Message &message, Netif *netif, int8_t interface } } + if (!sForwardingEnabled && netif != NULL) + { + forward = false; + } + message.SetOffset(sizeof(header)); // process IPv6 Extension Headers diff --git a/src/core/net/ip6.hpp b/src/core/net/ip6.hpp index 4fc89a3e5..7af67f8a2 100644 --- a/src/core/net/ip6.hpp +++ b/src/core/net/ip6.hpp @@ -583,6 +583,14 @@ public: */ static void SetReceiveDatagramCallback(otReceiveIp6DatagramCallback aCallback); + /** + * This static method enables/disables IPv6 forwarding. + * + * @param[in] aEnable TRUE to enable IPv6 forwarding, FALSE otherwise. + * + */ + static void SetForwardingEnabled(bool aEnable); + private: static void ProcessReceiveCallback(Message &aMessage); }; diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 8850abae2..659a91519 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -331,6 +331,8 @@ ThreadError Mle::SetStateDetached(void) mParentRequestTimer.Stop(); mMesh.SetRxOnWhenIdle(true); mMleRouter.HandleDetachStart(); + Ip6::Ip6::SetForwardingEnabled(false); + otLogInfoMle("Mode -> Detached\n"); return kThreadError_None; } @@ -356,6 +358,8 @@ ThreadError Mle::SetStateChild(uint16_t aRloc16) mMleRouter.HandleChildStart(mParentRequestMode); } + Ip6::Ip6::SetForwardingEnabled(false); + otLogInfoMle("Mode -> Child\n"); return kThreadError_None; } diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index b5d423e0c..915a9ceb9 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -338,6 +338,7 @@ ThreadError MleRouter::SetStateRouter(uint16_t aRloc16) mRouters[mRouterId].mNextHop = mRouterId; mNetworkData.Stop(); mStateUpdateTimer.Start(kStateUpdatePeriod); + Ip6::Ip6::SetForwardingEnabled(true); otLogInfoMle("Mode -> Router\n"); return kThreadError_None; @@ -364,6 +365,7 @@ ThreadError MleRouter::SetStateLeader(uint16_t aRloc16) mNetif.GetPendingDataset().ApplyLocalToNetwork(); mCoapServer.AddResource(mAddressSolicit); mCoapServer.AddResource(mAddressRelease); + Ip6::Ip6::SetForwardingEnabled(true); otLogInfoMle("Mode -> Leader %d\n", mLeaderData.GetPartitionId()); return kThreadError_None;