diff --git a/src/core/coap/coap.cpp b/src/core/coap/coap.cpp index 64fec364f..e85052f5f 100644 --- a/src/core/coap/coap.cpp +++ b/src/core/coap/coap.cpp @@ -497,7 +497,7 @@ Message *CoapBase::FindRelatedRequest(const Message & aResponse, aMetadata.ReadFrom(*message); if (((aMetadata.mDestinationAddress == aMessageInfo.GetPeerAddr()) || - aMetadata.mDestinationAddress.IsMulticast() || aMetadata.mDestinationAddress.IsAnycastRoutingLocator()) && + aMetadata.mDestinationAddress.IsMulticast() || aMetadata.mDestinationAddress.IsIidAnycastLocator()) && (aMetadata.mDestinationPort == aMessageInfo.GetPeerPort())) { switch (aResponse.GetType()) diff --git a/src/core/meshcop/joiner.cpp b/src/core/meshcop/joiner.cpp index 81b758108..65abb4047 100644 --- a/src/core/meshcop/joiner.cpp +++ b/src/core/meshcop/joiner.cpp @@ -339,8 +339,7 @@ otError Joiner::Connect(JoinerRouter &aRouter) SuccessOrExit(error = Get().SetPanChannel(aRouter.mChannel)); SuccessOrExit(error = Get().AddUnsecurePort(kJoinerUdpPort)); - sockaddr.GetAddress().mFields.m16[0] = HostSwap16(0xfe80); - sockaddr.GetAddress().SetIid(aRouter.mExtAddr); + sockaddr.GetAddress().SetToLinkLocalAddress(aRouter.mExtAddr); sockaddr.mPort = aRouter.mJoinerUdpPort; SuccessOrExit(error = Get().Connect(sockaddr, Joiner::HandleSecureCoapClientConnect, this)); diff --git a/src/core/meshcop/joiner_router.cpp b/src/core/meshcop/joiner_router.cpp index 541ff7fc9..6fadde20c 100644 --- a/src/core/meshcop/joiner_router.cpp +++ b/src/core/meshcop/joiner_router.cpp @@ -213,8 +213,7 @@ void JoinerRouter::HandleRelayTransmit(Coap::Message &aMessage, const Ip6::Messa SuccessOrExit(error = message->SetLength(length)); aMessage.CopyTo(offset, 0, length, *message); - messageInfo.mPeerAddr.mFields.m16[0] = HostSwap16(0xfe80); - memcpy(messageInfo.mPeerAddr.mFields.m8 + 8, joinerIid, 8); + messageInfo.GetPeerAddr().SetToLinkLocalAddress(joinerIid); messageInfo.SetPeerPort(joinerPort); SuccessOrExit(error = mSocket.SendTo(*message, messageInfo)); diff --git a/src/core/net/dhcp6_client.cpp b/src/core/net/dhcp6_client.cpp index 4148423fb..d4e7e8ed1 100644 --- a/src/core/net/dhcp6_client.cpp +++ b/src/core/net/dhcp6_client.cpp @@ -280,11 +280,7 @@ otError Dhcp6Client::Solicit(uint16_t aRloc16) #if OPENTHREAD_ENABLE_DHCP6_MULTICAST_SOLICIT messageInfo.GetPeerAddr().SetToRealmLocalAllRoutersMulticast(); #else - messageInfo.GetPeerAddr().SetPrefix(Get().GetMeshLocalPrefix()); - messageInfo.GetPeerAddr().mFields.m16[4] = HostSwap16(0x0000); - messageInfo.GetPeerAddr().mFields.m16[5] = HostSwap16(0x00ff); - messageInfo.GetPeerAddr().mFields.m16[6] = HostSwap16(0xfe00); - messageInfo.GetPeerAddr().SetLocator(aRloc16); + messageInfo.GetPeerAddr().SetToRoutingLocator(Get().GetMeshLocalPrefix(), aRloc16); #endif messageInfo.SetSockAddr(Get().GetMeshLocal16()); messageInfo.mPeerPort = kDhcpServerPort; diff --git a/src/core/net/dhcp6_server.hpp b/src/core/net/dhcp6_server.hpp index 774e1f60d..ec5dd25cb 100644 --- a/src/core/net/dhcp6_server.hpp +++ b/src/core/net/dhcp6_server.hpp @@ -167,15 +167,10 @@ private: { mPrefix = aPrefix; - mAloc.GetAddress().SetPrefix(aMeshLocalPrefix); - mAloc.mAddress.mFields.m16[4] = HostSwap16(0x0000); - mAloc.mAddress.mFields.m16[5] = HostSwap16(0x00ff); - mAloc.mAddress.mFields.m16[6] = HostSwap16(0xfe00); - mAloc.mAddress.mFields.m8[14] = Ip6::Address::kAloc16Mask; - mAloc.mAddress.mFields.m8[15] = aContextId; - mAloc.mPrefixLength = OT_IP6_PREFIX_BITSIZE; - mAloc.mPreferred = true; - mAloc.mValid = true; + mAloc.GetAddress().SetToAnycastLocator(aMeshLocalPrefix, (Ip6::Address::kAloc16Mask << 8) + aContextId); + mAloc.mPrefixLength = OT_IP6_PREFIX_BITSIZE; + mAloc.mPreferred = true; + mAloc.mValid = true; } private: diff --git a/src/core/net/icmp6.cpp b/src/core/net/icmp6.cpp index babf77ae7..51c7e9a51 100644 --- a/src/core/net/icmp6.cpp +++ b/src/core/net/icmp6.cpp @@ -201,9 +201,7 @@ otError Icmp::HandleEchoRequest(Message &aRequestMessage, const MessageInfo &aMe uint16_t payloadLength; // always handle Echo Request destined for RLOC or ALOC - VerifyOrExit(ShouldHandleEchoRequest(aMessageInfo) || aMessageInfo.GetSockAddr().IsRoutingLocator() || - aMessageInfo.GetSockAddr().IsAnycastRoutingLocator(), - OT_NOOP); + VerifyOrExit(ShouldHandleEchoRequest(aMessageInfo) || aMessageInfo.GetSockAddr().IsIidLocator(), OT_NOOP); otLogInfoIcmp("Received Echo Request"); diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index 880220542..38f1dd749 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -1027,10 +1027,9 @@ otError Ip6::ProcessReceiveCallback(const Message & aMessage, if (mIsReceiveIp6FilterEnabled) { // do not pass messages sent to an RLOC/ALOC, except Service Locator - VerifyOrExit( - (!aMessageInfo.GetSockAddr().IsRoutingLocator() && !aMessageInfo.GetSockAddr().IsAnycastRoutingLocator()) || - aMessageInfo.GetSockAddr().IsAnycastServiceLocator(), - error = OT_ERROR_NO_ROUTE); + VerifyOrExit(!aMessageInfo.GetSockAddr().IsIidLocator() || + aMessageInfo.GetSockAddr().IsIidAnycastServiceLocator(), + error = OT_ERROR_NO_ROUTE); switch (aIpProto) { @@ -1365,7 +1364,7 @@ const NetifUnicastAddress *Ip6::SelectSourceAddress(MessageInfo &aMessageInfo) uint8_t candidatePrefixMatched; uint8_t overrideScope; - if (candidateAddr->IsAnycastRoutingLocator()) + if (candidateAddr->IsIidAnycastLocator()) { // Don't use anycast address as source address. continue; @@ -1435,7 +1434,7 @@ const NetifUnicastAddress *Ip6::SelectSourceAddress(MessageInfo &aMessageInfo) rvalPrefixMatched = candidatePrefixMatched; } else if ((candidatePrefixMatched == rvalPrefixMatched) && - (destination->IsRoutingLocator() == candidateAddr->IsRoutingLocator())) + (destination->IsIidRoutingLocator() == candidateAddr->IsIidRoutingLocator())) { // Additional rule: Prefer RLOC source for RLOC destination, EID source for anything else rvalAddr = addr; diff --git a/src/core/net/ip6_address.cpp b/src/core/net/ip6_address.cpp index 686ae5ba4..6272c7c16 100644 --- a/src/core/net/ip6_address.cpp +++ b/src/core/net/ip6_address.cpp @@ -65,6 +65,20 @@ bool Address::IsLinkLocal(void) const return (mFields.m16[0] & HostSwap16(0xffc0)) == HostSwap16(0xfe80); } +void Address::SetToLinkLocalAddress(const Mac::ExtAddress &aExtAddress) +{ + mFields.m32[0] = HostSwap32(0xfe800000); + mFields.m32[1] = 0; + SetIid(aExtAddress); +} + +void Address::SetToLinkLocalAddress(const uint8_t *aIid) +{ + mFields.m32[0] = HostSwap32(0xfe800000); + mFields.m32[1] = 0; + SetIid(aIid); +} + bool Address::IsLinkLocalMulticast(void) const { return IsMulticast() && (GetScope() == kLinkLocalScope); @@ -130,24 +144,6 @@ void Address::SetToRealmLocalAllMplForwarders(void) *this = GetRealmLocalAllMplForwarders(); } -bool Address::IsRoutingLocator(void) const -{ - return (mFields.m32[2] == HostSwap32(0x000000ff) && mFields.m16[6] == HostSwap16(0xfe00) && - mFields.m8[14] < kAloc16Mask && (mFields.m8[14] & kRloc16ReservedBitMask) == 0); -} - -bool Address::IsAnycastRoutingLocator(void) const -{ - return (mFields.m32[2] == HostSwap32(0x000000ff) && mFields.m16[6] == HostSwap16(0xfe00) && - mFields.m8[14] == kAloc16Mask); -} - -bool Address::IsAnycastServiceLocator(void) const -{ - return IsAnycastRoutingLocator() && (mFields.m8[15] >= (Mle::kAloc16ServiceStart & 0xff)) && - (mFields.m8[15] <= (Mle::kAloc16ServiceEnd & 0xff)); -} - bool Address::IsSubnetRouterAnycast(void) const { return (mFields.m32[2] == 0 && mFields.m32[3] == 0); @@ -161,7 +157,31 @@ bool Address::IsReservedSubnetAnycast(void) const bool Address::IsIidReserved(void) const { - return IsSubnetRouterAnycast() || IsReservedSubnetAnycast() || IsAnycastRoutingLocator(); + return IsSubnetRouterAnycast() || IsReservedSubnetAnycast() || IsIidAnycastLocator(); +} + +bool Address::IsIidLocator(void) const +{ + // IID pattern 0000:00ff:fe00:xxxx + return (mFields.m32[2] == HostSwap32(0x000000ff) && mFields.m16[6] == HostSwap16(0xfe00)); +} + +bool Address::IsIidRoutingLocator(void) const +{ + return (IsIidLocator() && (mFields.m8[14] < kAloc16Mask) && ((mFields.m8[14] & kRloc16ReservedBitMask) == 0)); +} + +bool Address::IsIidAnycastLocator(void) const +{ + // Anycast locator range 0xfc00- 0xfcff (`kAloc16Max` is 0xfc) + return (IsIidLocator() && (mFields.m8[14] == kAloc16Mask)); +} + +bool Address::IsIidAnycastServiceLocator(void) const +{ + uint16_t locator = GetLocator(); + + return (IsIidLocator() && (locator >= Mle::kAloc16ServiceStart) && (locator <= Mle::kAloc16ServiceEnd)); } void Address::SetPrefix(const uint8_t *aPrefix, uint8_t aPrefixLength) @@ -212,6 +232,20 @@ void Address::SetIid(const Mac::ExtAddress &aExtAddress) addr.CopyTo(mFields.m8 + kInterfaceIdentifierOffset); } +void Address::SetIidToLocator(uint16_t aLocator) +{ + // Locator IID pattern `0000:00ff:fe00:xxxx` + mFields.m32[2] = HostSwap32(0x000000ff); + mFields.m16[6] = HostSwap16(0xfe00); + mFields.m16[7] = HostSwap16(aLocator); +} + +void Address::SetToLocator(const Mle::MeshLocalPrefix &aMeshLocalPrefix, uint16_t aLocator) +{ + SetPrefix(aMeshLocalPrefix); + SetIidToLocator(aLocator); +} + void Address::ToExtAddress(Mac::ExtAddress &aExtAddress) const { aExtAddress.Set(mFields.m8 + kInterfaceIdentifierOffset); diff --git a/src/core/net/ip6_address.hpp b/src/core/net/ip6_address.hpp index e4bb3e964..c3ef09005 100644 --- a/src/core/net/ip6_address.hpp +++ b/src/core/net/ip6_address.hpp @@ -137,6 +137,23 @@ public: */ bool IsLinkLocal(void) const; + /** + * This methods sets the IPv6 address to a Link-Local address with Interface Identifier generated from a given + * MAC Extended Address. + * + * @param[in] aExtAddress A MAC Extended Address (used to generate the IID). + * + */ + void SetToLinkLocalAddress(const Mac::ExtAddress &aExtAddress); + + /** + * This methods sets the IPv6 address to a Link-Local address with a given Interface Identifier. + * + * @param[in] aIid A pointer to a buffer containing the Interface Identifier. + * + */ + void SetToLinkLocalAddress(const uint8_t *aIid); + /** * This method indicates whether or not the IPv6 address is multicast address. * @@ -249,34 +266,7 @@ public: bool IsMulticastLargerThanRealmLocal(void) const; /** - * This method indicates whether or not the IPv6 address is a RLOC address. - * - * @retval TRUE If the IPv6 address is a RLOC address. - * @retval FALSE If the IPv6 address is not a RLOC address. - * - */ - bool IsRoutingLocator(void) const; - - /** - * This method indicates whether or not the IPv6 address is an Anycast RLOC address. - * - * @retval TRUE If the IPv6 address is an Anycast RLOC address. - * @retval FALSE If the IPv6 address is not an Anycast RLOC address. - * - */ - bool IsAnycastRoutingLocator(void) const; - - /** - * This method indicates whether or not the IPv6 address is an Anycast Service Locator. - * - * @retval TRUE If the IPv6 address is an Anycast Service Locator. - * @retval FALSE If the IPv6 address is not an Anycast Service Locator. - * - */ - bool IsAnycastServiceLocator(void) const; - - /** - * This method indicates whether or not the IPv6 address is Subnet-Router Anycast (RFC 4291), + * This method indicates whether or not the IPv6 address is Subnet-Router Anycast (RFC 4291). * * @retval TRUE If the IPv6 address is a Subnet-Router Anycast address. * @retval FALSE If the IPv6 address is not a Subnet-Router Anycast address. @@ -285,7 +275,7 @@ public: bool IsSubnetRouterAnycast(void) const; /** - * This method indicates whether or not the IPv6 address is Reserved Subnet Anycast (RFC 2526), + * This method indicates whether or not the IPv6 address is Reserved Subnet Anycast (RFC 2526). * * @retval TRUE If the IPv6 address is a Reserved Subnet Anycast address. * @retval FALSE If the IPv6 address is not a Reserved Subnet Anycast address. @@ -294,7 +284,7 @@ public: bool IsReservedSubnetAnycast(void) const; /** - * This method indicates whether or not the IPv6 address contains Reserved IPv6 IID (RFC 5453), + * This method indicates whether or not the IPv6 address contains Reserved IPv6 IID (RFC 5453). * * @retval TRUE If the IPv6 address contains a reserved IPv6 IID. * @retval FALSE If the IPv6 address does not contain a reserved IPv6 IID. @@ -302,6 +292,55 @@ public: */ bool IsIidReserved(void) const; + /** + * This method indicates whether or not the Interface Identifier (IID) of the IPv6 address matches the locator + * pattern (`0000:00ff:fe00:xxxx`). + * + * @retval TRUE If the IPv6 address IID matches the locator pattern + * @retval FALSE If the IPv6 address IID does not match the locator pattern + * + */ + bool IsIidLocator(void) const; + + /** + * This method indicates whether or not the IPv6 address's Interface Identifier (IID) matches a Routing Locator + * (RLOC). + * + * In addition to checking that the IID matches the locator pattern (`0000:00ff:fe00:xxxx`), this method also + * checks that the locator value is a valid RLOC16. + * + * @retval TRUE If the IPv6 address's IID matches a RLOC address. + * @retval FALSE If the IPv6 address's IID does not match a RLOC address. + * + */ + bool IsIidRoutingLocator(void) const; + + /** + * This method indicates whether or not the IPv6 address's Interface Identifier (IID) matches an Anycast Locator + * (ALOC). + * + * In addition to checking that the IID matches the locator pattern (`0000:00ff:fe00:xxxx`), this method also + * checks that the locator value is any valid ALOC16 (0xfc00 - 0xfcff). + * + * @retval TRUE If the IPv6 address's IID matches a ALOC address. + * @retval FALSE If the IPv6 address's IID does not match a ALOC address. + * + */ + bool IsIidAnycastLocator(void) const; + + /** + * This method indicates whether or not the IPv6 address's Interface Identifier (IID) matches a Service Anycast + * Locator (ALOC). + * + * In addition to checking that the IID matches the locator pattern (`0000:00ff:fe00:xxxx`), this method also + * checks that the locator value is a valid Service ALOC16 (0xfc10 – 0xfc2f). + * + * @retval TRUE If the IPv6 address's IID matches a ALOC address. + * @retval FALSE If the IPv6 address's IID does not match a ALOC address. + * + */ + bool IsIidAnycastServiceLocator(void) const; + /** * This method gets the IPv6 address locator. * @@ -320,6 +359,32 @@ public: */ void SetLocator(uint16_t aLocator) { mFields.m16[7] = HostSwap16(aLocator); } + /** + * This method sets the IPv6 address to a Routing Locator (RLOC) IPv6 address with a given Mesh-local prefix and + * RLOC16 value. + * + * @param[in] aMeshLocalPrefix A Mesh Local Prefix. + * @param[in] aRloc16 A RLOC16 value. + * + */ + void SetToRoutingLocator(const Mle::MeshLocalPrefix &aMeshLocalPrefix, uint16_t aRloc16) + { + SetToLocator(aMeshLocalPrefix, aRloc16); + } + + /** + * This method sets the IPv6 address to a Anycast Locator (ALOC) IPv6 address with a given Mesh-local prefix and + * ALOC16 value. + * + * @param[in] aMeshLocalPrefix A Mesh Local Prefix. + * @param[in] aAloc16 A ALOC16 value. + * + */ + void SetToAnycastLocator(const Mle::MeshLocalPrefix &aMeshLocalPrefix, uint16_t aAloc16) + { + SetToLocator(aMeshLocalPrefix, aAloc16); + } + /** * This method sets the IPv6 address prefix. * @@ -406,6 +471,15 @@ public: */ void SetIid(const Mac::ExtAddress &aExtAddress); + /** + * This method sets the Interface Identifier to Routing/Anycast Locator pattern `0000:00ff:fe00:xxxx` with a given + * locator (RLOC16 or ALOC16) value. + * + * @param[in] aLocator RLOC16 or ALOC16. + * + */ + void SetIidToLocator(uint16_t aLocator); + /** * This method converts the IPv6 Interface Identifier to an IEEE 802.15.4 Extended Address. * @@ -495,6 +569,7 @@ public: private: void SetPrefix(uint8_t aOffset, const uint8_t *aPrefix, uint8_t aPrefixLength); + void SetToLocator(const Mle::MeshLocalPrefix &aMeshLocalPrefix, uint16_t aLocator); static const Address &GetLinkLocalAllNodesMulticast(void); static const Address &GetLinkLocalAllRoutersMulticast(void); diff --git a/src/core/thread/lowpan.cpp b/src/core/thread/lowpan.cpp index ecd3bb373..cb3a31baa 100644 --- a/src/core/thread/lowpan.cpp +++ b/src/core/thread/lowpan.cpp @@ -67,10 +67,7 @@ otError Lowpan::ComputeIid(const Mac::Address &aMacAddr, const Context &aContext switch (aMacAddr.GetType()) { case Mac::Address::kTypeShort: - aIpAddress.mFields.m16[4] = HostSwap16(0x0000); - aIpAddress.mFields.m16[5] = HostSwap16(0x00ff); - aIpAddress.mFields.m16[6] = HostSwap16(0xfe00); - aIpAddress.SetLocator(aMacAddr.GetShort()); + aIpAddress.SetIidToLocator(aMacAddr.GetShort()); break; case Mac::Address::kTypeExtended: diff --git a/src/core/thread/mesh_forwarder_ftd.cpp b/src/core/thread/mesh_forwarder_ftd.cpp index 0d7658af4..b9f1b8296 100644 --- a/src/core/thread/mesh_forwarder_ftd.cpp +++ b/src/core/thread/mesh_forwarder_ftd.cpp @@ -669,7 +669,7 @@ void MeshForwarder::UpdateRoutes(const uint8_t * aFrame, VerifyOrExit(!aMeshDest.IsBroadcast() && aMeshSource.IsShort(), OT_NOOP); SuccessOrExit(GetIp6Header(aFrame, aFrameLength, aMeshSource, aMeshDest, ip6Header)); - if (!ip6Header.GetSource().IsRoutingLocator() && !ip6Header.GetSource().IsAnycastRoutingLocator() && + if (!ip6Header.GetSource().IsIidLocator() && Get().IsOnMesh(ip6Header.GetSource()) /* only for on mesh address which may require AQ */) { if (Get().UpdateCacheEntry(ip6Header.GetSource(), aMeshSource.GetShort()) == diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index e7eb342a0..f8cbd7d03 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -127,8 +127,7 @@ Mle::Mle(Instance &aInstance) // link-local 64 mLinkLocal64.Clear(); - mLinkLocal64.GetAddress().mFields.m16[0] = HostSwap16(0xfe80); - mLinkLocal64.GetAddress().SetIid(Get().GetExtAddress()); + mLinkLocal64.GetAddress().SetToLinkLocalAddress(Get().GetExtAddress()); mLinkLocal64.mPrefixLength = 64; mLinkLocal64.mPreferred = true; mLinkLocal64.mValid = true; @@ -202,15 +201,13 @@ Mle::Mle(Instance &aInstance) // mesh-local 16 mMeshLocal16.Clear(); - mMeshLocal16.GetAddress().mFields.m16[4] = HostSwap16(0x0000); - mMeshLocal16.GetAddress().mFields.m16[5] = HostSwap16(0x00ff); - mMeshLocal16.GetAddress().mFields.m16[6] = HostSwap16(0xfe00); - mMeshLocal16.mPrefixLength = MeshLocalPrefix::kLength; - mMeshLocal16.mPreferred = true; - mMeshLocal16.mValid = true; - mMeshLocal16.mScopeOverride = Ip6::Address::kRealmLocalScope; - mMeshLocal16.mScopeOverrideValid = true; - mMeshLocal16.mRloc = true; + mMeshLocal16.GetAddress().SetIidToLocator(0); + mMeshLocal16.mPrefixLength = MeshLocalPrefix::kLength; + mMeshLocal16.mPreferred = true; + mMeshLocal16.mValid = true; + mMeshLocal16.mScopeOverride = Ip6::Address::kRealmLocalScope; + mMeshLocal16.mScopeOverrideValid = true; + mMeshLocal16.mRloc = true; // Store RLOC address reference in MPL module. Get().SetMatchingAddress(mMeshLocal16.GetAddress()); @@ -1101,11 +1098,7 @@ otError Mle::GetLeaderAddress(Ip6::Address &aAddress) const VerifyOrExit(GetRloc16() != Mac::kShortAddrInvalid, error = OT_ERROR_DETACHED); - aAddress.SetPrefix(GetMeshLocalPrefix()); - aAddress.mFields.m16[4] = HostSwap16(0x0000); - aAddress.mFields.m16[5] = HostSwap16(0x00ff); - aAddress.mFields.m16[6] = HostSwap16(0xfe00); - aAddress.SetLocator(Rloc16FromRouterId(mLeaderData.GetLeaderRouterId())); + aAddress.SetToRoutingLocator(GetMeshLocalPrefix(), Rloc16FromRouterId(mLeaderData.GetLeaderRouterId())); exit: return error; @@ -1129,12 +1122,7 @@ otError Mle::GetServiceAloc(uint8_t aServiceId, Ip6::Address &aAddress) const otError error = OT_ERROR_NONE; VerifyOrExit(GetRloc16() != Mac::kShortAddrInvalid, error = OT_ERROR_DETACHED); - - aAddress.SetPrefix(GetMeshLocalPrefix()); - aAddress.mFields.m16[4] = HostSwap16(0x0000); - aAddress.mFields.m16[5] = HostSwap16(0x00ff); - aAddress.mFields.m16[6] = HostSwap16(0xfe00); - aAddress.SetLocator(ServiceAlocFromId(aServiceId)); + aAddress.SetToAnycastLocator(GetMeshLocalPrefix(), ServiceAlocFromId(aServiceId)); exit: return error; @@ -2161,9 +2149,7 @@ otError Mle::SendChildIdRequest(void) mParentCandidate.SetState(Neighbor::kStateValid); - destination.Clear(); - destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(mParentCandidate.GetExtAddress()); + destination.SetToLinkLocalAddress(mParentCandidate.GetExtAddress()); SuccessOrExit(error = SendMessage(*message, destination)); if (mAddressRegistrationMode == kAppendMeshLocalOnly) @@ -2307,9 +2293,7 @@ void Mle::HandleMessageTransmissionTimer(void) VerifyOrExit(mDataRequestAttempts < kMaxChildKeepAliveAttempts, BecomeDetached()); - destination.Clear(); - destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(mParent.GetExtAddress()); + destination.SetToLinkLocalAddress(mParent.GetExtAddress()); if (SendDataRequest(destination, tlvs, sizeof(tlvs), 0) == OT_ERROR_NONE) { @@ -2397,9 +2381,7 @@ otError Mle::SendChildUpdateRequest(void) break; } - destination.Clear(); - destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(mParent.GetExtAddress()); + destination.SetToLinkLocalAddress(mParent.GetExtAddress()); SuccessOrExit(error = SendMessage(*message, destination)); LogMleMessage("Send Child Update Request to parent", destination); @@ -2476,9 +2458,7 @@ otError Mle::SendChildUpdateResponse(const uint8_t *aTlvs, uint8_t aNumTlvs, con } } - destination.Clear(); - destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(mParent.GetExtAddress()); + destination.SetToLinkLocalAddress(mParent.GetExtAddress()); SuccessOrExit(error = SendMessage(*message, destination)); LogMleMessage("Send Child Update Response to parent", destination); @@ -4082,20 +4062,17 @@ uint16_t Mle::GetNextHop(uint16_t aDestination) const bool Mle::IsRoutingLocator(const Ip6::Address &aAddress) const { - return memcmp(&mMeshLocal16, &aAddress, kRlocPrefixLength) == 0 && - aAddress.mFields.m8[14] < Ip6::Address::kAloc16Mask && - (aAddress.mFields.m8[14] & Ip6::Address::kRloc16ReservedBitMask) == 0; + return IsMeshLocalAddress(aAddress) && aAddress.IsIidRoutingLocator(); } bool Mle::IsAnycastLocator(const Ip6::Address &aAddress) const { - return memcmp(&mMeshLocal16, &aAddress, kRlocPrefixLength) == 0 && - aAddress.mFields.m8[14] == Ip6::Address::kAloc16Mask; + return IsMeshLocalAddress(aAddress) && aAddress.IsIidAnycastLocator(); } bool Mle::IsMeshLocalAddress(const Ip6::Address &aAddress) const { - return aAddress.PrefixMatch(GetMeshLocal16()) >= MeshLocalPrefix::kLength; + return (memcmp(&GetMeshLocalPrefix(), &aAddress, MeshLocalPrefix::kSize) == 0); } otError Mle::CheckReachability(uint16_t aMeshDest, Ip6::Header &aIp6Header) diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 15a3718fb..c3fd6d086 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -523,9 +523,7 @@ otError MleRouter::SendLinkRequest(Neighbor *aNeighbor) mChallengeTimeout = (((2 * kMaxResponseDelay) + kStateUpdatePeriod - 1) / kStateUpdatePeriod); SuccessOrExit(error = AppendChallenge(*message, mChallenge)); - destination.mFields.m8[0] = 0xff; - destination.mFields.m8[1] = 0x02; - destination.mFields.m8[15] = 2; + destination.SetToLinkLocalAllRoutersMulticast(); } else { @@ -542,8 +540,7 @@ otError MleRouter::SendLinkRequest(Neighbor *aNeighbor) SuccessOrExit(error = AppendChallenge(*message, challenge)); } - destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(aNeighbor->GetExtAddress()); + destination.SetToLinkLocalAddress(aNeighbor->GetExtAddress()); } SuccessOrExit(error = SendMessage(*message, destination)); @@ -1964,9 +1961,7 @@ void MleRouter::SendParentResponse(Child *aChild, const Challenge &aChallenge, b SuccessOrExit(error = AppendConnectivity(*message)); SuccessOrExit(error = AppendVersion(*message)); - destination.Clear(); - destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(aChild->GetExtAddress()); + destination.SetToLinkLocalAddress(aChild->GetExtAddress()); if (aRoutersOnlyRequest) { @@ -3038,9 +3033,7 @@ otError MleRouter::SendChildIdResponse(Child &aChild) } #endif - destination.Clear(); - destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(aChild.GetExtAddress()); + destination.SetToLinkLocalAddress(aChild.GetExtAddress()); SuccessOrExit(error = SendMessage(*message, destination)); LogMleMessage("Send Child ID Response", destination, aChild.GetRloc16()); @@ -3100,9 +3093,7 @@ otError MleRouter::SendChildUpdateRequest(Child &aChild) SuccessOrExit(error = AppendChallenge(*message, aChild.GetChallenge(), aChild.GetChallengeSize())); } - destination.Clear(); - destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(aChild.GetExtAddress()); + destination.SetToLinkLocalAddress(aChild.GetExtAddress()); SuccessOrExit(error = SendMessage(*message, destination)); if (aChild.IsRxOnWhenIdle()) @@ -3462,9 +3453,8 @@ Neighbor *MleRouter::GetNeighbor(const Ip6::Address &aAddress) { child = iter.GetChild(); - if (context.mContextId == kMeshLocalPrefixContextId && aAddress.mFields.m16[4] == HostSwap16(0x0000) && - aAddress.mFields.m16[5] == HostSwap16(0x00ff) && aAddress.mFields.m16[6] == HostSwap16(0xfe00) && - aAddress.GetLocator() == child->GetRloc16()) + if ((context.mContextId == kMeshLocalPrefixContextId) && aAddress.IsIidLocator() && + (aAddress.GetLocator() == child->GetRloc16())) { ExitNow(rval = child); } @@ -3477,8 +3467,7 @@ Neighbor *MleRouter::GetNeighbor(const Ip6::Address &aAddress) VerifyOrExit(context.mContextId == kMeshLocalPrefixContextId, rval = NULL); - if (aAddress.mFields.m16[4] == HostSwap16(0x0000) && aAddress.mFields.m16[5] == HostSwap16(0x00ff) && - aAddress.mFields.m16[6] == HostSwap16(0xfe00)) + if (aAddress.IsIidLocator()) { rval = mRouterTable.GetNeighbor(aAddress.GetLocator()); } diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index b9c924d52..c395099be 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -144,7 +144,7 @@ void Leader::HandleServerData(Coap::Message &aMessage, const Ip6::MessageInfo &a otLogInfoNetData("Received network data registration"); - VerifyOrExit(aMessageInfo.GetPeerAddr().IsRoutingLocator(), OT_NOOP); + VerifyOrExit(aMessageInfo.GetPeerAddr().IsIidRoutingLocator(), OT_NOOP); switch (Tlv::ReadUint16Tlv(aMessage, ThreadTlv::kRloc16, rloc16)) {