Skip to content

Commit e925b72

Browse files
authored
Restricted controller apps to scan and pair only with JF-compatible devices (project-chip#40414)
1 parent d5106c0 commit e925b72

9 files changed

Lines changed: 62 additions & 13 deletions

File tree

examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,13 @@
2323

2424
using namespace ::chip;
2525

26-
void DiscoverCommissionablesCommandBase::OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData & nodeData)
26+
void DiscoverCommissionablesCommandBase::OnDiscoveredDevice(const Dnssd::CommissionNodeData & nodeData)
2727
{
28+
if (mCommissioningMode.HasValue() && nodeData.commissioningMode != mCommissioningMode.Value())
29+
{
30+
return; // Skip nodes that do not match the commissioning mode filter.
31+
}
32+
2833
nodeData.LogDetail();
2934
LogErrorOnFailure(RemoteDataModelLogger::LogDiscoveredNodeData(nodeData));
3035

examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
#include "../common/CHIPCommand.h"
2222

23+
#include <lib/dnssd/Advertiser.h>
24+
2325
class DiscoverCommissionablesCommandBase : public CHIPCommand, public chip::Controller::DeviceDiscoveryDelegate
2426
{
2527
public:
@@ -39,6 +41,8 @@ class DiscoverCommissionablesCommandBase : public CHIPCommand, public chip::Cont
3941
protected:
4042
chip::Controller::DeviceCommissioner * mCommissioner;
4143

44+
chip::Optional<uint64_t> mCommissioningMode;
45+
4246
private:
4347
chip::Optional<bool> mDiscoverOnce;
4448
};
@@ -121,7 +125,12 @@ class DiscoverCommissionableByCommissioningModeCommand : public DiscoverCommissi
121125
public:
122126
DiscoverCommissionableByCommissioningModeCommand(CredentialIssuerCommands * credsIssuerConfig) :
123127
DiscoverCommissionablesCommandBase("find-commissionable-by-commissioning-mode", credsIssuerConfig)
124-
{}
128+
{
129+
AddArgument("commissioning-mode", chip::to_underlying(chip::Dnssd::CommissioningMode::kEnabledBasic),
130+
chip::to_underlying(chip::Dnssd::CommissioningMode::kEnabledJointFabric), &mCommissioningMode,
131+
"Optional integer value representing the commissioning mode to filter devices. If provided, only devices with "
132+
"the specified commissioning mode will be discovered.");
133+
}
125134

126135
/////////// CHIPCommand Interface /////////
127136
CHIP_ERROR RunCommand() override;

examples/jf-control-app/commands/pairing/PairingCommand.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <credentials/CHIPCert.h>
2828
#include <crypto/CHIPCryptoPAL.h>
2929
#include <lib/core/CHIPSafeCasts.h>
30+
#include <lib/dnssd/Advertiser.h>
3031
#include <lib/support/logging/CHIPLogging.h>
3132
#include <protocols/secure_channel/PASESession.h>
3233

@@ -468,10 +469,6 @@ CHIP_ERROR PairingCommand::PairWithMdns(NodeId remoteId)
468469
filter.code = mDiscoveryFilterCode;
469470
break;
470471
case Dnssd::DiscoveryFilterType::kCommissioningMode:
471-
if (mExecuteJCM.ValueOr(false))
472-
{
473-
filter.code = 3;
474-
}
475472
break;
476473
case Dnssd::DiscoveryFilterType::kCommissioner:
477474
filter.code = 1;
@@ -840,7 +837,13 @@ void PairingCommand::OnICDStayActiveComplete(ScopedNodeId deviceId, uint32_t pro
840837
void PairingCommand::OnDiscoveredDevice(const Dnssd::CommissionNodeData & nodeData)
841838
{
842839
// Ignore nodes with closed commissioning window
843-
VerifyOrReturn(nodeData.commissioningMode != 0);
840+
VerifyOrReturn(nodeData.commissioningMode != to_underlying(Dnssd::CommissioningMode::kDisabled));
841+
842+
if (mJCM.ValueOr(false) && nodeData.commissioningMode != to_underlying(Dnssd::CommissioningMode::kEnabledJointFabric))
843+
{
844+
ChipLogProgress(chipTool, "Skipping device with commissioning mode %u", nodeData.commissioningMode);
845+
return; // Skip nodes that do not match the JCM commissioning mode.
846+
}
844847

845848
auto & resolutionData = nodeData;
846849

examples/jf-control-app/commands/pairing/PairingCommand.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,6 @@ class PairingCommand : public CHIPCommand,
332332
bool mDeviceIsICD = false;
333333
uint8_t mRandomGeneratedICDSymmetricKey[chip::Crypto::kAES_CCM128_Key_Length];
334334

335-
chip::Optional<bool> mExecuteJCM;
336335
::pw::rpc::NanopbClientReader<::RequestOptions> rpcGetStream;
337336

338337
// For unpair

src/controller/CHIPDeviceController.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3805,5 +3805,15 @@ CHIP_ERROR DeviceController::GetRootPublicKey(Crypto::P256PublicKey & outRootPub
38053805
return fabricTable->FetchRootPubkey(mFabricIndex, outRootPublicKey);
38063806
}
38073807

3808+
bool DeviceCommissioner::HasValidCommissioningMode(const Dnssd::CommissionNodeData & nodeData)
3809+
{
3810+
if (nodeData.commissioningMode == to_underlying(Dnssd::CommissioningMode::kDisabled))
3811+
{
3812+
ChipLogProgress(Controller, "Discovered device does not have an open commissioning window.");
3813+
return false;
3814+
}
3815+
return true;
3816+
}
3817+
38083818
} // namespace Controller
38093819
} // namespace chip

src/controller/CHIPDeviceController.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,9 @@ class DLL_EXPORT DeviceCommissioner : public DeviceController,
836836
/* fireAndForget = */ true);
837837
}
838838

839+
// Check if the commissioning mode is valid for the current commissioning parameters.
840+
virtual bool HasValidCommissioningMode(const Dnssd::CommissionNodeData & nodeData);
841+
839842
protected:
840843
// Cleans up and resets failsafe as appropriate depending on the error and the failed stage.
841844
// For success, sends completion report with the CommissioningDelegate and sends callbacks to the PairingDelegate

src/controller/SetUpCodePairer.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -491,11 +491,9 @@ bool SetUpCodePairer::NodeMatchesCurrentFilter(const Dnssd::DiscoveredNodeData &
491491
}
492492

493493
const Dnssd::CommissionNodeData & nodeData = discNodeData.Get<Dnssd::CommissionNodeData>();
494-
if (nodeData.commissioningMode == 0)
495-
{
496-
ChipLogProgress(Controller, "Discovered device does not have an open commissioning window.");
497-
return false;
498-
}
494+
495+
VerifyOrReturnError(mCommissioner != nullptr, false);
496+
VerifyOrReturnError(mCommissioner->HasValidCommissioningMode(nodeData), false);
499497

500498
// Check whether this matches one of our setup payloads.
501499
for (auto & payload : mSetupPayloads)

src/controller/jcm/DeviceCommissioner.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <credentials/CHIPCert.h>
2525
#include <lib/core/CHIPCore.h>
2626
#include <lib/core/CHIPError.h>
27+
#include <lib/dnssd/Advertiser.h>
2728

2829
using namespace ::chip;
2930
using namespace ::chip::app;
@@ -534,6 +535,25 @@ void DeviceCommissioner::CleanupCommissioning(DeviceProxy * proxy, NodeId nodeId
534535
mInfo.Cleanup();
535536
}
536537

538+
bool DeviceCommissioner::HasValidCommissioningMode(const Dnssd::CommissionNodeData & nodeData)
539+
{
540+
if (GetCommissioningParameters().HasValue() && GetCommissioningParameters().Value().GetUseJCM().ValueOr(false))
541+
{
542+
if (nodeData.commissioningMode != to_underlying(Dnssd::CommissioningMode::kEnabledJointFabric))
543+
{
544+
ChipLogProgress(Controller, "Discovered device has a commissioning mode (%u) that is not supported by JCM.",
545+
static_cast<unsigned>(nodeData.commissioningMode));
546+
return false;
547+
}
548+
}
549+
else
550+
{
551+
return chip::Controller::DeviceCommissioner::HasValidCommissioningMode(nodeData);
552+
}
553+
554+
return true;
555+
}
556+
537557
} // namespace JCM
538558
} // namespace Controller
539559
} // namespace chip

src/controller/jcm/DeviceCommissioner.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ class DeviceCommissioner : public chip::Controller::DeviceCommissioner
8888
*/
8989
TrustVerificationInfo & GetTrustVerificationInfo() { return mInfo; }
9090

91+
bool HasValidCommissioningMode(const Dnssd::CommissionNodeData & nodeData) override;
92+
9193
protected:
9294
// Override ParseExtraCommissioningInfo to parse JCM administrator info
9395
CHIP_ERROR ParseExtraCommissioningInfo(ReadCommissioningInfo & info, const CommissioningParameters & params) override;

0 commit comments

Comments
 (0)