[routing-manager] set SNAC Router Flag in emitted RA (#10695)

This commit updates the `RouteingManager` to set the newly
allocated "SNAC Router Flag" (bit 6) in emitted RA messages from
Thread BR. The flag is also parsed and tracked in received RA
messages.

This replaces the previous model where an experimental flag bit
in "Flags Extension Option" indicated a "stub router". This commit
also removes the `STUB_ROUTER_FLAG_IN_EMITTED_RA_ENABLE` confg
(no longer optional/experimental) and renames `mStubRouterFlag` to
`mSnacRouterFlag`.
This commit is contained in:
Abtin Keshavarzian
2024-09-16 13:33:32 -07:00
committed by GitHub
parent 5f74baa2ea
commit 67b8f5c821
13 changed files with 84 additions and 169 deletions
+1 -1
View File
@@ -107,7 +107,7 @@ typedef struct otBorderRoutingRouterEntry
uint32_t mAge; ///< The router's age in seconds (duration since its first discovery).
bool mManagedAddressConfigFlag : 1; ///< The router's Managed Address Config flag (`M` flag).
bool mOtherConfigFlag : 1; ///< The router's Other Config flag (`O` flag).
bool mStubRouterFlag : 1; ///< The router's Stub Router flag.
bool mSnacRouterFlag : 1; ///< The router's SNAC Router flag (`S` flag).
bool mIsLocalDevice : 1; ///< This router is the local device (this BR).
bool mIsReachable : 1; ///< This router is reachable.
bool mIsPeerBr : 1; ///< This router is (likely) a peer BR.
+1 -1
View File
@@ -53,7 +53,7 @@ extern "C" {
* @note This number versions both OpenThread platform and user APIs.
*
*/
#define OPENTHREAD_API_VERSION (442)
#define OPENTHREAD_API_VERSION (443)
/**
* @addtogroup api-instance
+5 -5
View File
@@ -283,12 +283,12 @@ Info per prefix entry:
- Flags in received Router Advertisement header:
- M: Managed Address Config flag
- O: Other Config flag
- Stub: Stub Router flag (indicates whether the router is a stub router)
- S: SNAC Router flag
```bash
> br prefixtable
prefix:fd00:1234:5678:0::/64, on-link:no, ms-since-rx:29526, lifetime:1800, route-prf:med, router:ff02:0:0:0:0:0:0:1 (M:0 O:0 Stub:1)
prefix:1200:abba:baba:0::/64, on-link:yes, ms-since-rx:29527, lifetime:1800, preferred:1800, router:ff02:0:0:0:0:0:0:1 (M:0 O:0 Stub:1)
prefix:fd00:1234:5678:0::/64, on-link:no, ms-since-rx:29526, lifetime:1800, route-prf:med, router:ff02:0:0:0:0:0:0:1 (M:0 O:0 S:1)
prefix:1200:abba:baba:0::/64, on-link:yes, ms-since-rx:29527, lifetime:1800, preferred:1800, router:ff02:0:0:0:0:0:0:1 (M:0 O:0 S:1)
Done
```
@@ -394,7 +394,7 @@ Info per router:
- Flags in received Router Advertisement header:
- M: Managed Address Config flag
- O: Other Config flag
- Stub: Stub Router flag (indicates whether the router is a stub router)
- S: SNAC Router flag (indicates whether the router is a stub router)
- Milliseconds since last received message from this router
- Reachability flag: A router is marked as unreachable if it fails to respond to multiple Neighbor Solicitation probes.
- Age: Duration interval since this router was first discovered. It is formatted as `{hh}:{mm}:{ss}` for hours, minutes, seconds, if the duration is less than 24 hours. If the duration is 24 hours or more, the format is `{dd}d.{hh}:{mm}:{ss}` for days, hours, minutes, seconds.
@@ -403,6 +403,6 @@ Info per router:
```bash
> br routers
ff02:0:0:0:0:0:0:1 (M:0 O:0 Stub:1) ms-since-rx:1505 reachable:yes age:00:18:13
ff02:0:0:0:0:0:0:1 (M:0 O:0 S:1) ms-since-rx:1505 reachable:yes age:00:18:13
Done
```
+7 -7
View File
@@ -470,9 +470,9 @@ exit:
* @code
* br prefixtable
* prefix:fd00:1234:5678:0::/64, on-link:no, ms-since-rx:29526, lifetime:1800, route-prf:med,
* router:ff02:0:0:0:0:0:0:1 (M:0 O:0 Stub:1)
* router:ff02:0:0:0:0:0:0:1 (M:0 O:0 S:1)
* prefix:1200:abba:baba:0::/64, on-link:yes, ms-since-rx:29527, lifetime:1800, preferred:1800,
* router:ff02:0:0:0:0:0:0:1 (M:0 O:0 Stub:1)
* router:ff02:0:0:0:0:0:0:1 (M:0 O:0 S:1)
* Done
* @endcode
* @par
@@ -488,7 +488,7 @@ exit:
* - Flags in received Router Advertisement header:
* - M: Managed Address Config flag
* - O: Other Config flag
* - Stub: Stub Router flag (indicates whether the router is a stub router)
* - S: SNAC Router flag
* @sa otBorderRoutingGetNextPrefixTableEntry
*/
template <> otError Br::Process<Cmd("prefixtable")>(Arg aArgs[])
@@ -609,7 +609,7 @@ exit:
* @cli br routers
* @code
* br routers
* ff02:0:0:0:0:0:0:1 (M:0 O:0 Stub:1) ms-since-rx:1505 reachable:yes age:00:18:13
* ff02:0:0:0:0:0:0:1 (M:0 O:0 S:1) ms-since-rx:1505 reachable:yes age:00:18:13
* Done
* @endcode
* @par
@@ -619,7 +619,7 @@ exit:
* - Flags in received Router Advertisement header:
* - M: Managed Address Config flag
* - O: Other Config flag
* - Stub: Stub Router flag (indicates whether the router is a stub router)
* - S: SNAC Router flag (indicates whether the router is a stub router)
* - Milliseconds since last received message from this router
* - Reachability flag: A router is marked as unreachable if it fails to respond to multiple Neighbor Solicitation
* probes.
@@ -653,8 +653,8 @@ exit:
void Br::OutputRouterInfo(const otBorderRoutingRouterEntry &aEntry, RouterOutputMode aMode)
{
OutputIp6Address(aEntry.mAddress);
OutputFormat(" (M:%u O:%u Stub:%u)", aEntry.mManagedAddressConfigFlag, aEntry.mOtherConfigFlag,
aEntry.mStubRouterFlag);
OutputFormat(" (M:%u O:%u S:%u)", aEntry.mManagedAddressConfigFlag, aEntry.mOtherConfigFlag,
aEntry.mSnacRouterFlag);
if (aMode == kLongVersion)
{
+16 -36
View File
@@ -601,16 +601,11 @@ void RoutingManager::SendRouterAdvertisement(RouterAdvTxMode aRaTxMode)
}
mRxRaTracker.SetHeaderFlagsOn(header);
header.SetSnacRouterFlag();
SuccessOrExit(error = raMsg.AppendHeader(header));
LogInfo("- RA Header - flags - M:%u O:%u", header.IsManagedAddressConfigFlagSet(), header.IsOtherConfigFlagSet());
LogInfo("- RA Header - default route - lifetime:%u", header.GetRouterLifetime());
#if OPENTHREAD_CONFIG_BORDER_ROUTING_STUB_ROUTER_FLAG_IN_EMITTED_RA_ENABLE
SuccessOrExit(error = raMsg.AppendFlagsExtensionOption(/* aStubRouterFlag */ true));
LogInfo("- FlagsExt - StubRouter:1");
#endif
LogRaHeader(header);
// Append PIO for local on-link prefix if is either being
// advertised or deprecated and for old prefix if is being
@@ -874,6 +869,13 @@ exit:
#if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_INFO)
void RoutingManager::LogRaHeader(const RouterAdvert::Header &aRaHeader)
{
LogInfo("- RA Header - flags - M:%u O:%u S:%u", aRaHeader.IsManagedAddressConfigFlagSet(),
aRaHeader.IsOtherConfigFlagSet(), aRaHeader.IsSnacRouterFlagSet());
LogInfo("- RA Header - default route - lifetime:%u", aRaHeader.GetRouterLifetime());
}
void RoutingManager::LogPrefixInfoOption(const Ip6::Prefix &aPrefix,
uint32_t aValidLifetime,
uint32_t aPreferredLifetime)
@@ -905,6 +907,7 @@ const char *RoutingManager::RouterAdvOriginToString(RouterAdvOrigin aRaOrigin)
#else
void RoutingManager::LogRaHeader(const RouterAdvert::Header &) {}
void RoutingManager::LogPrefixInfoOption(const Ip6::Prefix &, uint32_t, uint32_t) {}
void RoutingManager::LogRouteInfoOption(const Ip6::Prefix &, uint32_t, RoutePreference) {}
@@ -1205,10 +1208,6 @@ void RoutingManager::RxRaTracker::ProcessRouterAdvertMessage(const RouterAdvert:
ProcessRouteInfoOption(static_cast<const RouteInfoOption &>(option), *router);
break;
case Option::kTypeRaFlagsExtension:
ProcessRaFlagsExtOption(static_cast<const RaFlagsExtOption &>(option), *router);
break;
default:
break;
}
@@ -1228,22 +1227,14 @@ void RoutingManager::RxRaTracker::ProcessRaHeader(const RouterAdvert::Header &aR
Router &aRouter,
RouterAdvOrigin aRaOrigin)
{
bool managedFlag = aRaHeader.IsManagedAddressConfigFlagSet();
bool otherFlag = aRaHeader.IsOtherConfigFlagSet();
Entry<RoutePrefix> *entry;
Ip6::Prefix prefix;
LogInfo("- RA Header - flags - M:%u O:%u", managedFlag, otherFlag);
LogRaHeader(aRaHeader);
if (aRouter.mManagedAddressConfigFlag != managedFlag)
{
aRouter.mManagedAddressConfigFlag = managedFlag;
}
if (aRouter.mOtherConfigFlag != otherFlag)
{
aRouter.mOtherConfigFlag = otherFlag;
}
aRouter.mManagedAddressConfigFlag = aRaHeader.IsManagedAddressConfigFlagSet();
aRouter.mOtherConfigFlag = aRaHeader.IsOtherConfigFlagSet();
aRouter.mSnacRouterFlag = aRaHeader.IsSnacRouterFlagSet();
if (aRaOrigin == kThisBrOtherEntity)
{
@@ -1420,17 +1411,6 @@ exit:
return;
}
void RoutingManager::RxRaTracker::ProcessRaFlagsExtOption(const RaFlagsExtOption &aRaFlagsOption, Router &aRouter)
{
VerifyOrExit(aRaFlagsOption.IsValid());
aRouter.mStubRouterFlag = aRaFlagsOption.IsStubRouterFlagSet();
LogInfo("- FlagsExt - StubRouter:%u", aRouter.mStubRouterFlag);
exit:
return;
}
#if !OPENTHREAD_CONFIG_BORDER_ROUTING_USE_HEAP_ENABLE
template <>
@@ -2149,7 +2129,7 @@ void RoutingManager::RxRaTracker::Router::CopyInfoTo(RouterEntry &aEntry, TimeMi
aEntry.mAge = aUptime - mDiscoverTime;
aEntry.mManagedAddressConfigFlag = mManagedAddressConfigFlag;
aEntry.mOtherConfigFlag = mOtherConfigFlag;
aEntry.mStubRouterFlag = mStubRouterFlag;
aEntry.mSnacRouterFlag = mSnacRouterFlag;
aEntry.mIsLocalDevice = mIsLocalDevice;
aEntry.mIsReachable = IsReachable();
aEntry.mIsPeerBr = IsPeerBr();
@@ -2167,7 +2147,7 @@ void RoutingManager::RxRaTracker::DecisionFactors::UpdateFlagsFrom(const Router
// stub router (e.g., another Thread BR) includes the `M` or `O`
// flag, we also include the same flag.
VerifyOrExit(!aRouter.mStubRouterFlag);
VerifyOrExit(!aRouter.mSnacRouterFlag);
VerifyOrExit(aRouter.IsReachable());
if (aRouter.mManagedAddressConfigFlag)
+2 -3
View File
@@ -688,7 +688,6 @@ private:
using Option = Ip6::Nd::Option;
using PrefixInfoOption = Ip6::Nd::PrefixInfoOption;
using RouteInfoOption = Ip6::Nd::RouteInfoOption;
using RaFlagsExtOption = Ip6::Nd::RaFlagsExtOption;
using RouterAdvert = Ip6::Nd::RouterAdvert;
using NeighborAdvertMessage = Ip6::Nd::NeighborAdvertMessage;
using NeighborSolicitMessage = Ip6::Nd::NeighborSolicitMessage;
@@ -980,7 +979,7 @@ private:
uint8_t mNsProbeCount;
bool mManagedAddressConfigFlag : 1;
bool mOtherConfigFlag : 1;
bool mStubRouterFlag : 1;
bool mSnacRouterFlag : 1;
bool mIsLocalDevice : 1;
bool mAllEntriesDisregarded : 1;
};
@@ -1080,7 +1079,6 @@ private:
void ProcessRaHeader(const RouterAdvert::Header &aRaHeader, Router &aRouter, RouterAdvOrigin aRaOrigin);
void ProcessPrefixInfoOption(const PrefixInfoOption &aPio, Router &aRouter);
void ProcessRouteInfoOption(const RouteInfoOption &aRio, Router &aRouter);
void ProcessRaFlagsExtOption(const RaFlagsExtOption &aFlagsOption, Router &aRouter);
void Evaluate(void);
void DetermineStaleTimeFor(const OnLinkPrefix &aPrefix, NextFireTime &aStaleTime);
void DetermineStaleTimeFor(const RoutePrefix &aPrefix, NextFireTime &aStaleTime);
@@ -1584,6 +1582,7 @@ private:
static bool IsValidOnLinkPrefix(const PrefixInfoOption &aPio);
static bool IsValidOnLinkPrefix(const Ip6::Prefix &aOnLinkPrefix);
static void LogRaHeader(const RouterAdvert::Header &aRaHeader);
static void LogPrefixInfoOption(const Ip6::Prefix &aPrefix, uint32_t aValidLifetime, uint32_t aPreferredLifetime);
static void LogRouteInfoOption(const Ip6::Prefix &aPrefix, uint32_t aLifetime, RoutePreference aPreference);
-11
View File
@@ -178,17 +178,6 @@
#define OPENTHREAD_CONFIG_BORDER_ROUTING_ROUTER_ACTIVE_CHECK_TIMEOUT (60 * 1000) // (in msec).
#endif
/**
* @def OPENTHREAD_CONFIG_BORDER_ROUTING_STUB_ROUTER_FLAG_IN_EMITTED_RA_ENABLE
*
* Define to 1 so for the routing manager to include the Flags Extension Option with Stub Router flag in the emitted
* Router Advertisement messages from this Border Router.
*
*/
#ifndef OPENTHREAD_CONFIG_BORDER_ROUTING_STUB_ROUTER_FLAG_IN_EMITTED_RA_ENABLE
#define OPENTHREAD_CONFIG_BORDER_ROUTING_STUB_ROUTER_FLAG_IN_EMITTED_RA_ENABLE 1
#endif
/**
* @def OPENTHREAD_CONFIG_BORDER_ROUTING_DHCP6_PD_ENABLE
*
@@ -687,4 +687,8 @@
#error "OPENTHREAD_CONFIG_SRP_CLIENT_UPDATE_TX_MAX_DELAY was removed."
#endif
#ifdef OPENTHREAD_CONFIG_BORDER_ROUTING_STUB_ROUTER_FLAG_IN_EMITTED_RA_ENABLE
#error "OPENTHREAD_CONFIG_BORDER_ROUTING_STUB_ROUTER_FLAG_IN_EMITTED_RA_ENABLE is removed"
#endif
#endif // OPENTHREAD_CORE_CONFIG_CHECK_H_
+2 -19
View File
@@ -179,6 +179,8 @@ void RaFlagsExtOption::Init(void)
Clear();
SetType(kTypeRaFlagsExtension);
SetSize(sizeof(RaFlagsExtOption));
OT_UNUSED_VARIABLE(mFlags);
}
//----------------------------------------------------------------------------------------------------------------------
@@ -288,25 +290,6 @@ exit:
return error;
}
Error RouterAdvert::TxMessage::AppendFlagsExtensionOption(bool aStubRouterFlag)
{
Error error = kErrorNone;
RaFlagsExtOption *flagsOption;
flagsOption = static_cast<RaFlagsExtOption *>(AppendOption(sizeof(RaFlagsExtOption)));
VerifyOrExit(flagsOption != nullptr, error = kErrorNoBufs);
flagsOption->Init();
if (aStubRouterFlag)
{
flagsOption->SetStubRouterFlag();
}
exit:
return error;
}
//----------------------------------------------------------------------------------------------------------------------
// RouterSolicitMessage
+17 -31
View File
@@ -488,21 +488,6 @@ public:
*/
bool IsValid(void) const { return GetSize() >= sizeof(*this); }
/**
* Indicates whether or not the Stub Router Flag is set.
*
* @retval TRUE The Stub Router Flag is set.
* @retval FALSE The Stub Router Flag is not set.
*
*/
bool IsStubRouterFlagSet(void) const { return (mFlags[0] & kStubRouterFlag) != 0; }
/**
* Sets the Stub Router Flag.
*
*/
void SetStubRouterFlag(void) { mFlags[0] |= kStubRouterFlag; }
RaFlagsExtOption(void) = delete;
private:
@@ -516,10 +501,6 @@ private:
// ... for assignment |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ .
// Stub router flags defined in [https://www.ietf.org/archive/id/draft-hui-stub-router-ra-flag-01.txt]
static constexpr uint8_t kStubRouterFlag = 1 << 7;
uint8_t mFlags[6];
} OT_TOOL_PACKED_END;
@@ -638,6 +619,21 @@ public:
*/
void SetOtherConfigFlag(void) { mFlags |= kOtherConfigFlag; }
/**
* Indicates whether or not the SNAC Router Flag is set in the RA message header.
*
* @retval TRUE The SNAC Router Flag is set.
* @retval FALSE The SNAC Router Flag is not set.
*
*/
bool IsSnacRouterFlagSet(void) const { return (mFlags & kSnacRouterFlag) != 0; }
/**
* Sets the SNAC Router Flag in the RA message header.
*
*/
void SetSnacRouterFlag(void) { mFlags |= kSnacRouterFlag; }
/**
* This method returns the ICMPv6 message type.
*
@@ -654,7 +650,7 @@ public:
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Type | Code | Checksum |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Cur Hop Limit |M|O| |Prf| | Router Lifetime |
// | Cur Hop Limit |M|O| |Prf| |S| | Router Lifetime |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | Reachable Time |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -665,6 +661,7 @@ public:
static constexpr uint8_t kManagedAddressConfigFlag = 1 << 7;
static constexpr uint8_t kOtherConfigFlag = 1 << 6;
static constexpr uint8_t kSnacRouterFlag = 1 << 1;
static constexpr uint8_t kPreferenceOffset = 3;
static constexpr uint8_t kPreferenceMask = 3 << kPreferenceOffset;
@@ -821,17 +818,6 @@ public:
*/
Error AppendRouteInfoOption(const Prefix &aPrefix, uint32_t aRouteLifetime, RoutePreference aPreference);
/**
* Appends a Flags Extension Option to the RA message.
*
* @param[in] aStubRouterFlag The stub router flag.
*
* @retval kErrorNone Option is appended successfully.
* @retval kErrorNoBufs Insufficient available buffers to grow the message.
*
*/
Error AppendFlagsExtensionOption(bool aStubRouterFlag);
/**
* Appends bytes from a given buffer to the RA message.
*
+2 -2
View File
@@ -2286,8 +2286,8 @@ class NodeImpl:
def get_br_routers(self) -> List[str]:
# Example output of `br routers` command:
# fe80:0:0:0:42:acff:fe14:3 (M:0 O:0 Stub:1) ms-since-rx:144160 reachable:yes age:00:17:36 (peer BR)
# fe80:0:0:0:42:acff:fe14:2 (M:0 O:0 Stub:1) ms-since-rx:45179 reachable:yes age:00:17:36
# fe80:0:0:0:42:acff:fe14:3 (M:0 O:0 S:1) ms-since-rx:144160 reachable:yes age:00:17:36 (peer BR)
# fe80:0:0:0:42:acff:fe14:2 (M:0 O:0 S:1) ms-since-rx:45179 reachable:yes age:00:17:36
# Done
self.send_command('br routers')
return self._expect_command_output()
@@ -105,7 +105,7 @@ for br in [br1, br1]:
verify(len(routers) > 0)
for router in routers:
verify('reachable:yes' in router)
verify('Stub:1' in router)
verify('S:1' in router)
verify(not router.endswith('(peer BR)'))
# -----------------------------------------------------------------------------------------------------------------------
+26 -52
View File
@@ -435,9 +435,6 @@ void ValidateRouterAdvert(const Icmp6Packet &aPacket)
bool sawExpectedPio = false;
Array<Ip6::Prefix, kMaxPrefixes> pioPrefixes;
Array<Ip6::Prefix, kMaxPrefixes> rioPrefixes;
#if OPENTHREAD_CONFIG_BORDER_ROUTING_STUB_ROUTER_FLAG_IN_EMITTED_RA_ENABLE
bool sawStubRouterFlag = false;
#endif
VerifyOrQuit(raMsg.IsValid());
@@ -468,6 +465,8 @@ void ValidateRouterAdvert(const Icmp6Packet &aPacket)
break;
}
VerifyOrQuit(raMsg.GetHeader().IsSnacRouterFlagSet());
sDeprecatingPrefixes.Clear();
for (const Ip6::Nd::Option &option : raMsg)
@@ -544,27 +543,11 @@ void ValidateRouterAdvert(const Icmp6Packet &aPacket)
break;
}
#if OPENTHREAD_CONFIG_BORDER_ROUTING_STUB_ROUTER_FLAG_IN_EMITTED_RA_ENABLE
case Ip6::Nd::Option::kTypeRaFlagsExtension:
{
const Ip6::Nd::RaFlagsExtOption &flagsOption = static_cast<const Ip6::Nd::RaFlagsExtOption &>(option);
VerifyOrQuit(flagsOption.IsValid());
VerifyOrQuit(flagsOption.IsStubRouterFlagSet());
sawStubRouterFlag = true;
break;
}
#endif
default:
VerifyOrQuit(false, "Unexpected option type in RA msg");
}
}
#if OPENTHREAD_CONFIG_BORDER_ROUTING_STUB_ROUTER_FLAG_IN_EMITTED_RA_ENABLE
VerifyOrQuit(sawStubRouterFlag);
#endif
if (!sRaValidated)
{
switch (sExpectedPio)
@@ -595,8 +578,8 @@ void LogRouterAdvert(const Icmp6Packet &aPacket)
VerifyOrQuit(raMsg.IsValid());
Log(" RA header - M:%u, O:%u", raMsg.GetHeader().IsManagedAddressConfigFlagSet(),
raMsg.GetHeader().IsOtherConfigFlagSet());
Log(" RA header - M:%u, O:%u, S:%u", raMsg.GetHeader().IsManagedAddressConfigFlagSet(),
raMsg.GetHeader().IsOtherConfigFlagSet(), raMsg.GetHeader().IsSnacRouterFlagSet());
Log(" RA header - lifetime %u, prf:%s", raMsg.GetHeader().GetRouterLifetime(),
PreferenceToString(raMsg.GetHeader().GetDefaultRouterPreference()));
@@ -629,15 +612,6 @@ void LogRouterAdvert(const Icmp6Packet &aPacket)
break;
}
case Ip6::Nd::Option::kTypeRaFlagsExtension:
{
const Ip6::Nd::RaFlagsExtOption &flagsOption = static_cast<const Ip6::Nd::RaFlagsExtOption &>(option);
VerifyOrQuit(flagsOption.IsValid());
Log(" FlagsExt - StubRouter:%u", flagsOption.IsStubRouterFlagSet());
break;
}
default:
VerifyOrQuit(false, "Bad option type in RA msg");
}
@@ -864,13 +838,13 @@ struct RaFlags : public Clearable<RaFlags>
RaFlags(void)
: mManagedAddressConfigFlag(false)
, mOtherConfigFlag(false)
, mStubRouterFlag(false)
, mSnacRouterFlag(false)
{
}
bool mManagedAddressConfigFlag;
bool mOtherConfigFlag;
bool mStubRouterFlag;
bool mSnacRouterFlag;
};
void BuildRouterAdvert(Ip6::Nd::RouterAdvert::TxMessage &aRaMsg,
@@ -896,13 +870,13 @@ void BuildRouterAdvert(Ip6::Nd::RouterAdvert::TxMessage &aRaMsg,
header.SetOtherConfigFlag();
}
SuccessOrQuit(aRaMsg.AppendHeader(header));
if (aRaFlags.mStubRouterFlag)
if (aRaFlags.mSnacRouterFlag)
{
SuccessOrQuit(aRaMsg.AppendFlagsExtensionOption(/* aStubRouterFlag */ true));
header.SetSnacRouterFlag();
}
SuccessOrQuit(aRaMsg.AppendHeader(header));
for (; aNumPios > 0; aPios++, aNumPios--)
{
SuccessOrQuit(aRaMsg.AppendPrefixInfoOption(aPios->mPrefix, aPios->mValidLifetime, aPios->mPreferredLifetime));
@@ -1111,7 +1085,7 @@ struct InfraRouter
InfraRouter(const Ip6::Address &aAddress,
bool aManagedAddressConfigFlag,
bool aOtherConfigFlag,
bool aStubRouterFlag,
bool aSnacRouterFlag,
bool aIsLocalDevice = false)
: mAddress(aAddress)
, mIsLocalDevice(aIsLocalDevice)
@@ -1119,7 +1093,7 @@ struct InfraRouter
mFlags.Clear();
mFlags.mManagedAddressConfigFlag = aManagedAddressConfigFlag;
mFlags.mOtherConfigFlag = aOtherConfigFlag;
mFlags.mStubRouterFlag = aStubRouterFlag;
mFlags.mSnacRouterFlag = aSnacRouterFlag;
}
Ip6::Address mAddress;
@@ -1146,8 +1120,8 @@ void VerifyDiscoveredRouters(const InfraRouter *aRouters, uint16_t aNumRouters)
{
bool didFind = false;
Log(" address:%s, M:%u, O:%u, StubRouter:%u%s", AsCoreType(&entry.mAddress).ToString().AsCString(),
entry.mManagedAddressConfigFlag, entry.mOtherConfigFlag, entry.mStubRouterFlag,
Log(" address:%s, M:%u, O:%u, S:%u%s", AsCoreType(&entry.mAddress).ToString().AsCString(),
entry.mManagedAddressConfigFlag, entry.mOtherConfigFlag, entry.mSnacRouterFlag,
entry.mIsLocalDevice ? " (this BR)" : "");
for (uint16_t index = 0; index < aNumRouters; index++)
@@ -1156,7 +1130,7 @@ void VerifyDiscoveredRouters(const InfraRouter *aRouters, uint16_t aNumRouters)
{
VerifyOrQuit(entry.mManagedAddressConfigFlag == aRouters[index].mFlags.mManagedAddressConfigFlag);
VerifyOrQuit(entry.mOtherConfigFlag == aRouters[index].mFlags.mOtherConfigFlag);
VerifyOrQuit(entry.mStubRouterFlag == aRouters[index].mFlags.mStubRouterFlag);
VerifyOrQuit(entry.mSnacRouterFlag == aRouters[index].mFlags.mSnacRouterFlag);
VerifyOrQuit(entry.mIsLocalDevice == aRouters[index].mIsLocalDevice);
didFind = true;
}
@@ -3131,7 +3105,7 @@ void TestLearningAndCopyingOfFlags(void)
SendRouterAdvert(routerAddressA, raFlags);
AdvanceTime(1);
VerifyDiscoveredRouters({InfraRouter(routerAddressA, /* M */ true, /* O */ false, /* StubRouter */ false)});
VerifyDiscoveredRouters({InfraRouter(routerAddressA, /* M */ true, /* O */ false, /* S */ false)});
sRaValidated = false;
sExpectedRaHeaderFlags = kRaHeaderFlagsOnlyM;
@@ -3157,18 +3131,18 @@ void TestLearningAndCopyingOfFlags(void)
VerifyOrQuit(sRaValidated);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Send an RA from router A with both M and StubRouter flags.
// Send an RA from router A with both M and S flags.
// Since it is from a stub router, the M flag should be ignored.
// Ensure emitted RA does not set the M flag.
raFlags.Clear();
raFlags.mManagedAddressConfigFlag = true;
raFlags.mStubRouterFlag = true;
raFlags.mSnacRouterFlag = true;
SendRouterAdvert(routerAddressA, raFlags);
AdvanceTime(1);
VerifyDiscoveredRouters({InfraRouter(routerAddressA, /* M */ true, /* O */ false, /* StubRouter */ true)});
VerifyDiscoveredRouters({InfraRouter(routerAddressA, /* M */ true, /* O */ false, /* S */ true)});
sRaValidated = false;
sExpectedRaHeaderFlags = kRaHeaderFlagsNone;
@@ -3186,8 +3160,8 @@ void TestLearningAndCopyingOfFlags(void)
SendRouterAdvert(routerAddressB, raFlags);
AdvanceTime(1);
VerifyDiscoveredRouters({InfraRouter(routerAddressA, /* M */ true, /* O */ false, /* StubRouter */ true),
InfraRouter(routerAddressB, /* M */ false, /* O */ true, /* StubRouter */ false)});
VerifyDiscoveredRouters({InfraRouter(routerAddressA, /* M */ true, /* O */ false, /* S */ true),
InfraRouter(routerAddressB, /* M */ false, /* O */ true, /* S */ false)});
sRaValidated = false;
sExpectedRaHeaderFlags = kRaHeaderFlagsOnlyO;
@@ -3206,9 +3180,9 @@ void TestLearningAndCopyingOfFlags(void)
DefaultRoute(0, NetworkData::kRoutePreferenceMedium), raFlags);
AdvanceTime(1);
VerifyDiscoveredRouters({InfraRouter(routerAddressA, /* M */ true, /* O */ false, /* StubRouter */ true),
InfraRouter(routerAddressB, /* M */ false, /* O */ true, /* StubRouter */ false),
InfraRouter(routerAddressC, /* M */ true, /* O */ false, /* StubRouter */ false)});
VerifyDiscoveredRouters({InfraRouter(routerAddressA, /* M */ true, /* O */ false, /* S */ true),
InfraRouter(routerAddressB, /* M */ false, /* O */ true, /* S */ false),
InfraRouter(routerAddressC, /* M */ true, /* O */ false, /* S */ false)});
sRaValidated = false;
sExpectedPio = kPioDeprecatingLocalOnLink;
@@ -3229,7 +3203,7 @@ void TestLearningAndCopyingOfFlags(void)
// Router C should be in the table since it will have a deprecating
// on-link prefix.
VerifyDiscoveredRouters({InfraRouter(routerAddressC, /* M */ true, /* O */ false, /* StubRouter */ false)});
VerifyDiscoveredRouters({InfraRouter(routerAddressC, /* M */ true, /* O */ false, /* S */ false)});
sRaValidated = false;
sExpectedPio = kPioAdvertisingLocalOnLink;
@@ -3297,7 +3271,7 @@ void TestLearnRaHeader(void)
AdvanceTime(1);
VerifyDiscoveredRouters(
{InfraRouter(sInfraIfAddress, /* M */ false, /* O */ false, /* StubRouter */ false, /* IsLocalDevice */ true)});
{InfraRouter(sInfraIfAddress, /* M */ false, /* O */ false, /* S */ false, /* IsLocalDevice */ true)});
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// RoutingManager should learn the header from the