Do not start the PASE Session establishement before device scan succeeds (#23638)
diff --git a/src/controller/CHIPDeviceController.cpp b/src/controller/CHIPDeviceController.cpp
index 0e6c0d5..9c20c77 100644
--- a/src/controller/CHIPDeviceController.cpp
+++ b/src/controller/CHIPDeviceController.cpp
@@ -703,9 +703,15 @@
}
else if (params.HasDiscriminator())
{
+ // The RendezvousParameters argument needs to be recovered if the search succeed, so save them
+ // for later.
+ mRendezvousParametersForDeviceDiscoveredOverBle = params;
+
SetupDiscriminator discriminator;
discriminator.SetLongValue(params.GetDiscriminator());
- SuccessOrExit(err = mSystemState->BleLayer()->NewBleConnectionByDiscriminator(discriminator));
+ SuccessOrExit(err = mSystemState->BleLayer()->NewBleConnectionByDiscriminator(
+ discriminator, this, OnDiscoveredDeviceOverBleSuccess, OnDiscoveredDeviceOverBleError));
+ ExitNow(CHIP_NO_ERROR);
}
else
{
@@ -740,6 +746,38 @@
return err;
}
+#if CONFIG_NETWORK_LAYER_BLE
+void DeviceCommissioner::OnDiscoveredDeviceOverBleSuccess(void * appState, BLE_CONNECTION_OBJECT connObj)
+{
+ auto self = static_cast<DeviceCommissioner *>(appState);
+ auto device = self->mDeviceInPASEEstablishment;
+
+ if (nullptr != device && device->GetDeviceTransportType() == Transport::Type::kBle)
+ {
+ auto remoteId = device->GetDeviceId();
+
+ auto params = self->mRendezvousParametersForDeviceDiscoveredOverBle;
+ params.SetConnectionObject(connObj);
+ self->mRendezvousParametersForDeviceDiscoveredOverBle = RendezvousParameters();
+
+ self->ReleaseCommissioneeDevice(device);
+ LogErrorOnFailure(self->EstablishPASEConnection(remoteId, params));
+ }
+}
+
+void DeviceCommissioner::OnDiscoveredDeviceOverBleError(void * appState, CHIP_ERROR err)
+{
+ auto self = static_cast<DeviceCommissioner *>(appState);
+ auto device = self->mDeviceInPASEEstablishment;
+
+ if (nullptr != device && device->GetDeviceTransportType() == Transport::Type::kBle)
+ {
+ self->ReleaseCommissioneeDevice(device);
+ self->mRendezvousParametersForDeviceDiscoveredOverBle = RendezvousParameters();
+ }
+}
+#endif // CONFIG_NETWORK_LAYER_BLE
+
CHIP_ERROR DeviceCommissioner::Commission(NodeId remoteDeviceId, CommissioningParameters & params)
{
if (mDefaultCommissioner == nullptr)
diff --git a/src/controller/CHIPDeviceController.h b/src/controller/CHIPDeviceController.h
index aa5e293..f549480 100644
--- a/src/controller/CHIPDeviceController.h
+++ b/src/controller/CHIPDeviceController.h
@@ -688,6 +688,12 @@
uint16_t mUdcListenPort = CHIP_UDC_PORT;
#endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY
+#if CONFIG_NETWORK_LAYER_BLE
+ static void OnDiscoveredDeviceOverBleSuccess(void * appState, BLE_CONNECTION_OBJECT connObj);
+ static void OnDiscoveredDeviceOverBleError(void * appState, CHIP_ERROR err);
+ RendezvousParameters mRendezvousParametersForDeviceDiscoveredOverBle;
+#endif
+
CHIP_ERROR LoadKeyId(PersistentStorageDelegate * delegate, uint16_t & out);
/* This function sends a Device Attestation Certificate chain request to the device.