Properly handle commissioning error paths (#16882)

* Don't re-establish PASE if we have a connection.

* Fix incorrect error return for pase with no pairing delegate

* Add commissioning status update callback

Also callback with full peer id for folks that want that.

* Disarm failsafe immediately if we get 0 timeout.

* Fix event handling in commissioning window manager.

The current failsafe expiry doesn't actually re-start the advertising
because the pase connection stops the commissioning window timer.

Instead, stop the commissining window timer when we get a commissioning
complete.

Don't use the OnSessionEstablishmentError function for failsafe
timer expiry because it sends a callback about pairing that does not
apply here.

* Fail re-send if the session is expired.

* Disarm failsafe and kill pase connection for early failures

* Clear event on BLE commissioning.

* Restyled by clang-format

* Restyled by autopep8

* Add ExpireAllPASEPairings function to session manager

Use in CommissioningWindowManager

* Restyled by clang-format

* Address review comments

* Boris' reliable transmission fix.

* Revert back to using > 0 for breadcrumb.

Most commands don't set it - the last one that did was the failsafe.

* manually cancel timer.

* Apply suggestions from code review

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>

* Add API documentation

* Move log line down.

* Restyled by clang-format

* Boris' fix for darwin tests.

Co-authored-by: Restyled.io <commits@restyled.io>
Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
diff --git a/src/controller/python/ChipDeviceController-ScriptBinding.cpp b/src/controller/python/ChipDeviceController-ScriptBinding.cpp
index e795cf5..8a74f1c 100644
--- a/src/controller/python/ChipDeviceController-ScriptBinding.cpp
+++ b/src/controller/python/ChipDeviceController-ScriptBinding.cpp
@@ -162,6 +162,10 @@
 ChipError::StorageType pychip_ScriptDevicePairingDelegate_SetCommissioningCompleteCallback(
     chip::Controller::DeviceCommissioner * devCtrl, chip::Controller::DevicePairingDelegate_OnCommissioningCompleteFunct callback);
 
+ChipError::StorageType pychip_ScriptDevicePairingDelegate_SetCommissioningStatusUpdateCallback(
+    chip::Controller::DeviceCommissioner * devCtrl,
+    chip::Controller::DevicePairingDelegate_OnCommissioningStatusUpdateFunct callback);
+
 // BLE
 ChipError::StorageType pychip_DeviceCommissioner_CloseBleConnection(chip::Controller::DeviceCommissioner * devCtrl);
 
@@ -523,6 +527,14 @@
     return CHIP_NO_ERROR.AsInteger();
 }
 
+ChipError::StorageType pychip_ScriptDevicePairingDelegate_SetCommissioningStatusUpdateCallback(
+    chip::Controller::DeviceCommissioner * devCtrl,
+    chip::Controller::DevicePairingDelegate_OnCommissioningStatusUpdateFunct callback)
+{
+    sPairingDelegate.SetCommissioningStatusUpdateCallback(callback);
+    return CHIP_NO_ERROR.AsInteger();
+}
+
 ChipError::StorageType pychip_DeviceController_UpdateDevice(chip::Controller::DeviceCommissioner * devCtrl, chip::NodeId nodeid)
 {
     return devCtrl->UpdateDevice(nodeid).AsInteger();