From bf6da19fbe14827e2d55ef3f24f5756c009b9f74 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Fri, 3 Apr 2026 23:18:52 -0700 Subject: [PATCH] [border-admitter] include admitter state in all enroller responses (#12830) This commit updates `Manager::CoapDtlsSession::SendEnrollerResponse()` to always include the Admitter info TLVs in responses sent to enrollers. Previously, these TLVs were only included in responses to registration and keep-alive requests. This change ensures that enrollers receive consistent state updates from the `Admitter` during all interactions, such as joiner acceptance or release. The test case `TestBorderAdmitterJoinerEnrollerInteraction` is updated to validate the new behavior. --- src/core/meshcop/border_agent_admitter.cpp | 12 ++---------- tests/nexus/test_border_admitter.cpp | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/core/meshcop/border_agent_admitter.cpp b/src/core/meshcop/border_agent_admitter.cpp index 7e0b1ea7d..ef9ad6746 100644 --- a/src/core/meshcop/border_agent_admitter.cpp +++ b/src/core/meshcop/border_agent_admitter.cpp @@ -1369,15 +1369,7 @@ void Manager::CoapDtlsSession::SendEnrollerResponse(Uri aUri, SuccessOrExit(Tlv::Append(*response, static_cast(aResponseState))); - switch (aUri) - { - case kUriEnrollerRegister: - case kUriEnrollerKeepAlive: - SuccessOrExit(AppendAdmitterTlvs(*response, Get().DetermineState())); - break; - default: - break; - } + SuccessOrExit(AppendAdmitterTlvs(*response, Get().DetermineState())); SuccessOrExit(SendMessage(response.PassOwnership())); @@ -1385,7 +1377,7 @@ void Manager::CoapDtlsSession::SendEnrollerResponse(Uri aUri, StateTlv::StateToString(aResponseState), mIndex); exit: - return; + OT_UNUSED_VARIABLE(aUri); } void Manager::CoapDtlsSession::SendEnrollerReportState(uint8_t aAdmitterState) diff --git a/tests/nexus/test_border_admitter.cpp b/tests/nexus/test_border_admitter.cpp index fb8206098..b71db7f2e 100644 --- a/tests/nexus/test_border_admitter.cpp +++ b/tests/nexus/test_border_admitter.cpp @@ -1920,7 +1920,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[0].mReceived); VerifyOrQuit(responseContexts[0].mResponseState == MeshCoP::StateTlv::kAccept); - VerifyOrQuit(!responseContexts[0].mHasAdmitterState); + VerifyOrQuit(responseContexts[0].mHasAdmitterState); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Validate that the accepted `joiners[0]` is tracked by `enrollers[0]` entry on `admitter`"); @@ -2296,7 +2296,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[0].mReceived); VerifyOrQuit(responseContexts[0].mResponseState == MeshCoP::StateTlv::kAccept); - VerifyOrQuit(!responseContexts[0].mHasAdmitterState); + VerifyOrQuit(responseContexts[0].mHasAdmitterState); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Validate that both accepted `joiners` are tracked by `enrollers[0]` on `admitter`"); @@ -2411,7 +2411,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[1].mReceived); VerifyOrQuit(responseContexts[1].mResponseState == MeshCoP::StateTlv::kReject); - VerifyOrQuit(!responseContexts[1].mHasAdmitterState); + VerifyOrQuit(responseContexts[1].mHasAdmitterState); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Validate `joiners[1]` is still accepted by `enrollers[0]`"); @@ -2524,7 +2524,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[0].mReceived); VerifyOrQuit(responseContexts[0].mResponseState == MeshCoP::StateTlv::kAccept); - VerifyOrQuit(!responseContexts[0].mHasAdmitterState); + VerifyOrQuit(responseContexts[0].mHasAdmitterState); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Validate that there is no change in the `enrollers` list and the tracked `joiners` on `admitter`"); @@ -2591,7 +2591,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[0].mReceived); VerifyOrQuit(responseContexts[0].mResponseState == MeshCoP::StateTlv::kAccept); - VerifyOrQuit(!responseContexts[0].mHasAdmitterState); + VerifyOrQuit(responseContexts[0].mHasAdmitterState); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Validate that the released `joiners[0]` is removed on `admitter`"); @@ -2642,7 +2642,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[0].mReceived); VerifyOrQuit(responseContexts[0].mResponseState == MeshCoP::StateTlv::kAccept); - VerifyOrQuit(!responseContexts[0].mHasAdmitterState); + VerifyOrQuit(responseContexts[0].mHasAdmitterState); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Send an `EnrollerJoinerRelease` message releasing `joiners[1]` from `enrollers[0]`"); @@ -2660,7 +2660,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[0].mReceived); VerifyOrQuit(responseContexts[0].mResponseState == MeshCoP::StateTlv::kAccept); - VerifyOrQuit(!responseContexts[0].mHasAdmitterState); + VerifyOrQuit(responseContexts[0].mHasAdmitterState); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Send two `EnrollerJoinerAccept` messages from `enrollers[2]` accepting both `joiners`"); @@ -2681,7 +2681,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[2].mReceived); VerifyOrQuit(responseContexts[2].mResponseState == MeshCoP::StateTlv::kAccept); - VerifyOrQuit(!responseContexts[2].mHasAdmitterState); + VerifyOrQuit(responseContexts[2].mHasAdmitterState); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2750,7 +2750,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[2].mReceived); VerifyOrQuit(responseContexts[2].mResponseState == MeshCoP::StateTlv::kAccept); - VerifyOrQuit(!responseContexts[2].mHasAdmitterState); + VerifyOrQuit(responseContexts[2].mHasAdmitterState); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Validate that all previously accepted joiners by `enrollers[2]` on `admitter` are now removed"); @@ -2791,7 +2791,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[2].mReceived); VerifyOrQuit(responseContexts[2].mResponseState == MeshCoP::StateTlv::kReject); - VerifyOrQuit(!responseContexts[2].mHasAdmitterState); + VerifyOrQuit(responseContexts[2].mHasAdmitterState); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Log("Send two `EnrollerJoinerAccept` messages from `enrollers[2]` accepting both `joiners`"); @@ -2812,7 +2812,7 @@ void TestBorderAdmitterJoinerEnrollerInteraction(void) VerifyOrQuit(responseContexts[2].mReceived); VerifyOrQuit(responseContexts[2].mResponseState == MeshCoP::StateTlv::kAccept); - VerifyOrQuit(!responseContexts[2].mHasAdmitterState); + VerifyOrQuit(responseContexts[2].mHasAdmitterState); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -