[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.
This commit is contained in:
Abtin Keshavarzian
2025-08-26 21:08:30 -07:00
committed by GitHub
parent bdbdcecb77
commit 388f734b64
2 changed files with 17 additions and 33 deletions
+16 -30
View File
@@ -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
+1 -3
View File
@@ -304,7 +304,7 @@ private:
typedef String<kInfoStringSize> 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