Add option 'discover-once' for chip-tool. (#21712)

diff --git a/examples/chip-tool/commands/pairing/PairingCommand.cpp b/examples/chip-tool/commands/pairing/PairingCommand.cpp
index 557f25a..6bc5fc9 100644
--- a/examples/chip-tool/commands/pairing/PairingCommand.cpp
+++ b/examples/chip-tool/commands/pairing/PairingCommand.cpp
@@ -150,6 +150,17 @@
         ChipLogError(chipTool, "Secure Pairing Failed");
         SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE);
         break;
+    case DevicePairingDelegate::Status::SecurePairingDiscoveringMoreDevices:
+        if (IsDiscoverOnce())
+        {
+            ChipLogError(chipTool, "Secure Pairing Failed");
+            SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE);
+        }
+        else
+        {
+            ChipLogProgress(chipTool, "Secure Pairing Discovering More Devices");
+        }
+        break;
     }
 }
 
diff --git a/examples/chip-tool/commands/pairing/PairingCommand.h b/examples/chip-tool/commands/pairing/PairingCommand.h
index 49e9675..8a7ee89 100644
--- a/examples/chip-tool/commands/pairing/PairingCommand.h
+++ b/examples/chip-tool/commands/pairing/PairingCommand.h
@@ -80,6 +80,7 @@
         case PairingMode::Code:
         case PairingMode::CodePaseOnly:
             AddArgument("payload", &mOnboardingPayload);
+            AddArgument("discover-once", 0, 1, &mDiscoverOnce);
             break;
         case PairingMode::Ble:
             AddArgument("setup-pin-code", 0, 134217727, &mSetupPINCode);
@@ -144,6 +145,7 @@
 
     /////////// DeviceDiscoveryDelegate Interface /////////
     void OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & nodeData) override;
+    bool IsDiscoverOnce() { return mDiscoverOnce.ValueOr(false); }
 
 private:
     CHIP_ERROR RunInternal(NodeId remoteId);
@@ -160,6 +162,7 @@
     Command::AddressWithInterface mRemoteAddr;
     NodeId mNodeId;
     chip::Optional<uint16_t> mTimeout;
+    chip::Optional<bool> mDiscoverOnce;
     uint16_t mRemotePort;
     uint16_t mDiscriminator;
     uint32_t mSetupPINCode;
diff --git a/examples/darwin-framework-tool/commands/pairing/PairingDelegateBridge.mm b/examples/darwin-framework-tool/commands/pairing/PairingDelegateBridge.mm
index 5aee425..b2dae79 100644
--- a/examples/darwin-framework-tool/commands/pairing/PairingDelegateBridge.mm
+++ b/examples/darwin-framework-tool/commands/pairing/PairingDelegateBridge.mm
@@ -35,6 +35,9 @@
         ChipLogError(chipTool, "Secure Pairing Failed");
         _commandBridge->SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE);
         break;
+    case MTRPairingStatusDiscoveringMoreDevices:
+        ChipLogProgress(chipTool, "Secure Pairing Discovering More Devices");
+        break;
     case MTRPairingStatusUnknown:
         ChipLogError(chipTool, "Uknown Pairing Status");
         break;
diff --git a/examples/platform/linux/CommissionerMain.cpp b/examples/platform/linux/CommissionerMain.cpp
index b1b096b..7e8bdbc 100644
--- a/examples/platform/linux/CommissionerMain.cpp
+++ b/examples/platform/linux/CommissionerMain.cpp
@@ -255,6 +255,9 @@
     case DevicePairingDelegate::Status::SecurePairingFailed:
         ChipLogError(AppServer, "Secure Pairing Failed");
         break;
+    case DevicePairingDelegate::Status::SecurePairingDiscoveringMoreDevices:
+        ChipLogProgress(AppServer, "Secure Pairing Discovering More Device");
+        break;
     }
 }
 
diff --git a/src/app/tests/suites/commands/commissioner/CommissionerCommands.cpp b/src/app/tests/suites/commands/commissioner/CommissionerCommands.cpp
index dfd0dd7..c41d892 100644
--- a/src/app/tests/suites/commands/commissioner/CommissionerCommands.cpp
+++ b/src/app/tests/suites/commands/commissioner/CommissionerCommands.cpp
@@ -83,6 +83,8 @@
         ChipLogError(chipTool, "Secure Pairing Failed");
         OnResponse(ConvertToStatusIB(CHIP_ERROR_INCORRECT_STATE), nullptr);
         break;
+    case DevicePairingDelegate::Status::SecurePairingDiscoveringMoreDevices:
+        break;
     }
 }
 
diff --git a/src/controller/DevicePairingDelegate.h b/src/controller/DevicePairingDelegate.h
index 2e9fc05..186e3dc 100644
--- a/src/controller/DevicePairingDelegate.h
+++ b/src/controller/DevicePairingDelegate.h
@@ -40,6 +40,7 @@
     {
         SecurePairingSuccess = 0,
         SecurePairingFailed,
+        SecurePairingDiscoveringMoreDevices,
     };
 
     /**
diff --git a/src/controller/SetUpCodePairer.cpp b/src/controller/SetUpCodePairer.cpp
index c24ecc5..3ab62af 100644
--- a/src/controller/SetUpCodePairer.cpp
+++ b/src/controller/SetUpCodePairer.cpp
@@ -405,14 +405,14 @@
         if (!mDiscoveredParameters.empty())
         {
             ChipLogProgress(Controller, "Ignoring SecurePairingFailed status for now; we have more discovered devices to try");
-            return;
+            status = DevicePairingDelegate::Status::SecurePairingDiscoveringMoreDevices;
         }
 
         if (DiscoveryInProgress())
         {
             ChipLogProgress(Controller,
                             "Ignoring SecurePairingFailed status for now; we are waiting to see if we discover more devices");
-            return;
+            status = DevicePairingDelegate::Status::SecurePairingDiscoveringMoreDevices;
         }
     }
 
diff --git a/src/darwin/Framework/CHIP/MTRDevicePairingDelegate.h b/src/darwin/Framework/CHIP/MTRDevicePairingDelegate.h
index eeb7a4f..b4bd256 100644
--- a/src/darwin/Framework/CHIP/MTRDevicePairingDelegate.h
+++ b/src/darwin/Framework/CHIP/MTRDevicePairingDelegate.h
@@ -22,7 +22,8 @@
 typedef NS_ENUM(NSUInteger, MTRPairingStatus) {
     MTRPairingStatusUnknown = 0,
     MTRPairingStatusSuccess = 1,
-    MTRPairingStatusFailed = 2
+    MTRPairingStatusFailed = 2,
+    MTRPairingStatusDiscoveringMoreDevices = 3
 };
 
 /**
diff --git a/src/darwin/Framework/CHIP/MTRDevicePairingDelegateBridge.mm b/src/darwin/Framework/CHIP/MTRDevicePairingDelegateBridge.mm
index bd05a12..f0393f5 100644
--- a/src/darwin/Framework/CHIP/MTRDevicePairingDelegateBridge.mm
+++ b/src/darwin/Framework/CHIP/MTRDevicePairingDelegateBridge.mm
@@ -46,6 +46,9 @@
     case chip::Controller::DevicePairingDelegate::Status::SecurePairingFailed:
         rv = MTRPairingStatusFailed;
         break;
+    case chip::Controller::DevicePairingDelegate::Status::SecurePairingDiscoveringMoreDevices:
+        rv = MTRPairingStatusDiscoveringMoreDevices;
+        break;
     }
     return rv;
 }