blob: 1b3f45ac75168c4d97b5bacf2cc7031ad398bbe5 [file] [log] [blame]
/*
* Copyright (c) 2021 Project CHIP Authors
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#pragma once
#include "commands/common/Commands.h"
#include "commands/discover/DiscoverCommand.h"
#include "commands/discover/DiscoverCommissionablesCommand.h"
#include "commands/discover/DiscoverCommissionersCommand.h"
#include <lib/address_resolve/AddressResolve.h>
class Resolve : public DiscoverCommand, public chip::AddressResolve::NodeListener
{
public:
Resolve(CredentialIssuerCommands * credsIssuerConfig) : DiscoverCommand("resolve", credsIssuerConfig)
{
mNodeLookupHandle.SetListener(this);
}
/////////// DiscoverCommand Interface /////////
CHIP_ERROR RunCommand(NodeId remoteId, uint64_t fabricId) override
{
ReturnErrorOnFailure(chip::AddressResolve::Resolver::Instance().Init(&chip::DeviceLayer::SystemLayer()));
return chip::AddressResolve::Resolver::Instance().LookupNode(
chip::AddressResolve::NodeLookupRequest(chip::PeerId().SetNodeId(remoteId).SetCompressedFabricId(fabricId)),
mNodeLookupHandle);
}
void OnNodeAddressResolved(const PeerId & peerId, const chip::AddressResolve::ResolveResult & result) override
{
char addrBuffer[chip::Transport::PeerAddress::kMaxToStringSize];
result.address.ToString(addrBuffer);
ChipLogProgress(chipTool, "NodeId Resolution: %" PRIu64 " at %s", peerId.GetNodeId(), addrBuffer);
ChipLogProgress(chipTool, " MRP retry interval (idle): %" PRIu32 "ms",
result.mrpRemoteConfig.mIdleRetransTimeout.count());
ChipLogProgress(chipTool, " MRP retry interval (active): %" PRIu32 "ms",
result.mrpRemoteConfig.mActiveRetransTimeout.count());
ChipLogProgress(chipTool, " Supports TCP: %s", result.supportsTcp ? "yes" : "no");
SetCommandExitStatus(CHIP_NO_ERROR);
}
void OnNodeAddressResolutionFailed(const chip::PeerId & peerId, CHIP_ERROR error) override
{
ChipLogProgress(chipTool, "NodeId %" PRIu64 " Resolution: failed!", peerId.GetNodeId());
SetCommandExitStatus(CHIP_ERROR_INTERNAL);
}
private:
chip::AddressResolve::NodeLookupHandle mNodeLookupHandle;
};
void registerCommandsDiscover(Commands & commands, CredentialIssuerCommands * credsIssuerConfig)
{
const char * clusterName = "Discover";
commands_list clusterCommands = {
make_unique<Resolve>(credsIssuerConfig),
make_unique<DiscoverCommissionablesStartCommand>(credsIssuerConfig),
make_unique<DiscoverCommissionablesStopCommand>(credsIssuerConfig),
make_unique<DiscoverCommissionablesListCommand>(credsIssuerConfig),
make_unique<DiscoverCommissionablesCommand>(credsIssuerConfig),
make_unique<DiscoverCommissionableByShortDiscriminatorCommand>(credsIssuerConfig),
make_unique<DiscoverCommissionableByLongDiscriminatorCommand>(credsIssuerConfig),
make_unique<DiscoverCommissionableByCommissioningModeCommand>(credsIssuerConfig),
make_unique<DiscoverCommissionableByVendorIdCommand>(credsIssuerConfig),
make_unique<DiscoverCommissionableByDeviceTypeCommand>(credsIssuerConfig),
make_unique<DiscoverCommissionersCommand>(credsIssuerConfig),
};
commands.RegisterCommandSet(clusterName, clusterCommands, "Commands for device discovery.");
}