From 388f734b6499d39818912da3a1bbeb4402ba5f48 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Tue, 26 Aug 2025 21:08:30 -0700 Subject: [PATCH] [nat64] simplify mapping lookup and `Touch()` method (#11864) This change streamlines NAT64 mapping management by removing the `FindMapping()` and `FindOrAllocateMapping()` helper methods. Following recent simplifications, such as adding new `Matches()` flavors, the logic within these `Find` methods became much simpler. Their functionality is now incorporated directly into `TranslateToIp6()` and `TranslateFromIp6()`, respectively. Additionally, the `Mapping::Touch()` method is simplified to no longer require the current time as an argument. It now retrieves the time internally. --- src/core/net/nat64_translator.cpp | 46 +++++++++++-------------------- src/core/net/nat64_translator.hpp | 4 +-- 2 files changed, 17 insertions(+), 33 deletions(-) diff --git a/src/core/net/nat64_translator.cpp b/src/core/net/nat64_translator.cpp index 8c366e434..fa5baf594 100644 --- a/src/core/net/nat64_translator.cpp +++ b/src/core/net/nat64_translator.cpp @@ -148,7 +148,12 @@ Translator::Result Translator::TranslateFromIp6(Message &aMessage) ExitNow(result = kNotTranslated); } - mapping = FindOrAllocateMapping(ip6Headers); + mapping = mActiveMappings.FindMatching(ip6Headers); + + if (mapping == nullptr) + { + mapping = AllocateMapping(ip6Headers); + } if (mapping == nullptr) { @@ -261,7 +266,7 @@ Translator::Result Translator::TranslateToIp6(Message &aMessage) ExitNow(result = kDrop); } - mapping = FindMapping(ip4Headers); + mapping = mActiveMappings.FindMatching(ip4Headers); if (mapping == nullptr) { @@ -270,6 +275,8 @@ Translator::Result Translator::TranslateToIp6(Message &aMessage) ExitNow(result = kDrop); } + mapping->Touch(ip4Headers.GetIpProto()); + #if OPENTHREAD_CONFIG_NAT64_PORT_TRANSLATION_ENABLE dstPortOrId = mapping->mSrcPortOrId; #else @@ -485,7 +492,7 @@ Translator::Mapping *Translator::AllocateMapping(const Ip6::Headers &aIp6Headers mapping->mSrcPortOrId = 0; mapping->mTranslatedPortOrId = 0; #endif - mapping->Touch(TimerMilli::GetNow(), aIp6Headers.GetIpProto()); + mapping->Touch(aIp6Headers.GetIpProto()); LogInfo("Mapping created: %s", mapping->ToString().AsCString()); @@ -493,41 +500,20 @@ exit: return mapping; } -Translator::Mapping *Translator::FindOrAllocateMapping(const Ip6::Headers &aIp6Headers) +void Translator::Mapping::Touch(uint8_t aProtocol) { - Mapping *mapping = mActiveMappings.FindMatching(aIp6Headers); + uint32_t timeout; - // Exit if we found a valid mapping. - VerifyOrExit(mapping == nullptr); - - mapping = AllocateMapping(aIp6Headers); - -exit: - return mapping; -} - -Translator::Mapping *Translator::FindMapping(const Ip4::Headers &aIp4Headers) -{ - Mapping *mapping = mActiveMappings.FindMatching(aIp4Headers); - - if (mapping != nullptr) - { - mapping->Touch(TimerMilli::GetNow(), aIp4Headers.GetIpProto()); - } - - return mapping; -} - -void Translator::Mapping::Touch(TimeMilli aNow, uint8_t aProtocol) -{ if ((aProtocol == Ip6::kProtoIcmp6) || (aProtocol == Ip4::kProtoIcmp)) { - mExpiry = aNow + kIcmpTimeout; + timeout = kIcmpTimeout; } else { - mExpiry = aNow + kIdleTimeout; + timeout = kIdleTimeout; } + + mExpiry = TimerMilli::GetNow() + timeout; } bool Translator::Mapping::Matches(const Ip6::Headers &aIp6Headers) const diff --git a/src/core/net/nat64_translator.hpp b/src/core/net/nat64_translator.hpp index 1e7b1ac40..5f1809ca8 100644 --- a/src/core/net/nat64_translator.hpp +++ b/src/core/net/nat64_translator.hpp @@ -304,7 +304,7 @@ private: typedef String InfoString; - void Touch(TimeMilli aNow, uint8_t aProtocol); + void Touch(uint8_t aProtocol); InfoString ToString(void) const; void CopyTo(AddressMapping &aMapping, TimeMilli aNow) const; bool Matches(const Ip6::Headers &aIp6Headers) const; @@ -328,8 +328,6 @@ private: void ReleaseMapping(Mapping &aMapping); uint16_t ReleaseExpiredMappings(void); Mapping *AllocateMapping(const Ip6::Headers &aIp6Headers); - Mapping *FindOrAllocateMapping(const Ip6::Headers &aIp6Headers); - Mapping *FindMapping(const Ip4::Headers &aIp4Headers); void HandleTimer(void); void UpdateState(void); #if OPENTHREAD_CONFIG_NAT64_PORT_TRANSLATION_ENABLE