blob: 0e48c210070e8615abfc701cf130ca9803e8875e [file] [log] [blame]
/*
*
* Copyright (c) 2013-2017 Nest Labs, Inc.
* 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.
*/
/**
* @file
* Declaration of Weave Device Manager, a common class
* that implements discovery, pairing and provisioning of Weave
* devices.
*
*/
#ifndef __WEAVEDEVICEMANAGER_H
#define __WEAVEDEVICEMANAGER_H
// This module uses Legacy WDM (V2)
#include <Weave/Profiles/data-management/Legacy/WdmManagedNamespace.h>
#include <Weave/Support/NLDLLUtil.h>
#include <Weave/Core/WeaveCore.h>
#include <Weave/Core/WeaveTLV.h>
#include <Weave/Profiles/common/WeaveMessage.h>
#include <Weave/Profiles/data-management/DataManagement.h>
#include <Weave/Profiles/data-management/ProfileDatabase.h>
#include <Weave/Profiles/device-description/DeviceDescription.h>
#include <Weave/Profiles/locale/LocaleProfile.hpp>
#include <Weave/Profiles/network-provisioning/NetworkProvisioning.h>
#include <Weave/Profiles/network-provisioning/NetworkInfo.h>
#include <Weave/Profiles/security/WeaveSecurity.h>
#include <Weave/Profiles/security/WeaveCASE.h>
#include <Weave/Profiles/service-directory/ServiceDirectory.h>
#include <Weave/Profiles/status-report/StatusReportProfile.h>
#include <Weave/Profiles/token-pairing/TokenPairing.h>
#include <Weave/Profiles/vendor/nestlabs/dropcam-legacy-pairing/DropcamLegacyPairing.h>
#include <Weave/Profiles/vendor/nestlabs/thermostat/NestThermostatWeaveConstants.h>
namespace nl {
namespace Weave {
namespace DeviceManager {
using namespace nl::Weave::Profiles;
using namespace nl::Weave::Profiles::DataManagement;
using namespace nl::Weave::Profiles::DeviceDescription;
using namespace nl::Weave::Profiles::Vendor::Nestlabs::DropcamLegacyPairing;
using namespace nl::Weave::Profiles::NetworkProvisioning;
using NetworkProvisioning::NetworkType;
using NetworkProvisioning::WiFiMode;
using NetworkProvisioning::WiFiRole;
using NetworkProvisioning::WiFiSecurityType;
using DeviceDescription::IdentifyDeviceCriteria;
static const uint16_t MAX_ENUMERATED_DEVICES = 256; // Size (arbitrarily chosen) of table to de-dupe enumerated node IDs.
class DeviceStatus
{
public:
uint32_t StatusProfileId;
uint16_t StatusCode;
uint32_t SystemErrorCode;
};
class WeaveDeviceManager;
extern "C"
{
typedef void (*CompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState);
typedef void (*IdentifyDeviceCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, const DeviceDescription::WeaveDeviceDescriptor *devdesc);
typedef void (*DeviceEnumerationResponseFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, const DeviceDescription::WeaveDeviceDescriptor *devdesc,
IPAddress deviceAddr, InterfaceId deviceIntf);
typedef void (*NetworkScanCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, uint16_t netCount, const NetworkInfo *netInfoList);
typedef void (*GetNetworksCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, uint16_t netCount, const NetworkInfo *netInfoList);
typedef void (*AddNetworkCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, uint32_t networkId);
typedef void (*GetRendezvousModeCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, uint16_t modeFlags);
typedef void (*GetFabricConfigCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, const uint8_t *fabricConfig, uint32_t fabricConfigLen);
typedef void (*ErrorFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, WEAVE_ERROR err, DeviceStatus *devStatus);
typedef void (*StartFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, WeaveConnection *con);
typedef void (*ConnectionClosedFunc)(WeaveDeviceManager *deviceMgr, void *appReqState, WeaveConnection *con, WEAVE_ERROR conErr);
typedef void (*GetActiveLocaleCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, const char *activeLocale);
typedef void (*GetAvailableLocalesCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, uint16_t localeCount, const char **localeList);
typedef void (*ThermostatGetEntryKeyCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, const char *entryKey);
typedef void (*ThermostatSystemTestStatusCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, uint64_t systemTestStatus);
typedef void (*PairTokenCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, const uint8_t *tokenPairingBundle, uint32_t tokenPairingBunldeLen);
typedef void (*UnpairTokenCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState);
typedef void (*GetCameraAuthDataCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, const char *macAddress, const char *authData);
/**
* callback when hush operation completed with a proper response message
*
* @param[in] hushResult result of the hush operation. possible values are in the kAlarmHushResult_ family
* @param[in] length number of valid entries in the conditions array
* @param[in] conditions array of alarm conditions. data pointed by this pointer would be invalid after the call
*
*/
typedef void (*HushCompleteFunct)(WeaveDeviceManager *deviceMgr, void *appReqState, uint8_t hushResult, uint8_t length, const uint8_t *conditions);
}
;
class NL_DLL_EXPORT WeaveDeviceManager : private Security::CASE::WeaveCASEAuthDelegate
{
public:
enum
{
kState_NotInitialized = 0,
kState_Initialized = 1
} State; // [READ-ONLY] Current state
WeaveDeviceManager();
void *AppState;
WEAVE_ERROR Init(WeaveExchangeManager *exchangeMsg, WeaveSecurityManager *securityMgr);
WEAVE_ERROR Shutdown();
// ----- Device Information -----
WEAVE_ERROR GetDeviceId(uint64_t& deviceId);
WEAVE_ERROR GetDeviceAddress(IPAddress& deviceAddr);
WEAVE_ERROR IdentifyDevice(void *appReqState, IdentifyDeviceCompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR StartDeviceEnumeration(void *appReqState, const IdentifyDeviceCriteria &deviceCriteria, DeviceEnumerationResponseFunct onResponse, ErrorFunct onError);
void StopDeviceEnumeration();
// ----- Connection Management -----
// TODO WEAV-1573: Add support for InterfaceId specification for ConnectDevice APIs
WEAVE_ERROR ConnectDevice(uint64_t deviceId, IPAddress deviceAddr,
void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR ConnectDevice(uint64_t deviceId, IPAddress deviceAddr, const char *pairingCode,
void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR ConnectDevice(uint64_t deviceId, IPAddress deviceAddr, const uint8_t *accessToken, uint32_t accessTokenLen,
void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR RendezvousDevice(const IdentifyDeviceCriteria &deviceCriteria,
void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR RendezvousDevice(const char *pairingCode, const IdentifyDeviceCriteria &deviceCriteria,
void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR RendezvousDevice(const uint8_t *accessToken, uint32_t accessTokenLen, const IdentifyDeviceCriteria &deviceCriteria,
void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR PassiveRendezvousDevice(void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR PassiveRendezvousDevice(const char *pairingCode, void *appReqState, CompleteFunct onComplete, ErrorFunct onError, StartFunct onStart = NULL);
WEAVE_ERROR PassiveRendezvousDevice(const uint8_t *accessToken, uint32_t accessTokenLen, void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
#if CONFIG_NETWORK_LAYER_BLE
WEAVE_ERROR ConnectBle(BLE_CONNECTION_OBJECT connObj,
void *appReqState, CompleteFunct onComplete, ErrorFunct onError, bool autoClose = true);
WEAVE_ERROR ConnectBle(BLE_CONNECTION_OBJECT connObj, const char *pairingCode,
void *appReqState, CompleteFunct onComplete, ErrorFunct onError, bool autoClose = true);
WEAVE_ERROR ConnectBle(BLE_CONNECTION_OBJECT connObj, const uint8_t *accessToken, uint32_t accessTokenLen,
void *appReqState, CompleteFunct onComplete, ErrorFunct onError, bool autoClose = true);
#endif // CONFIG_NETWORK_LAYER_BLE
// ----- Remote Passive Rendezvous -----
// In all 3 functions below, the rendezvousDeviceAddr parameter may be specified as IPAddress::Any. Otherwise,
// the assisting device will turn away all would-be joiners if their IP address does not match the specified value.
// The assisting device turns these devices away before ever forming a tunnel between the DM and would-be joiner.
// Perform Remote Passive Rendezvous with CASE authentication for rendezvoused device. DM will attempt to
// authenticate each rendezvoused, would-be joiner using the given CASE credentials. If a device fails to
// authenticate, the DM will close its tunneled connection to that device and reconnect to the assisting device,
// starting over the RPR process to listen for new connections on its unsecured Weave port. This cycle repeats
// until either the rendezvous timeout expires or a joiner successfully authenticates.
//
// The CASE variant of this function is provided for the sake of completeness. It is expected that only the PASE
// variant will be used to perform RPR in the case of Thread-assisted pairing.
WEAVE_ERROR RemotePassiveRendezvous(const IPAddress rendezvousDeviceAddr, const uint8_t *accessToken,
uint32_t accessTokenLen, const uint16_t rendezvousTimeoutSec, const uint16_t inactivityTimeoutSec,
void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
// Perform Remote Passive Rendezvous with PASE authentication for rendezvoused device. DM will attempt to
// authenticate each rendezvoused, would-be joiner using the given PASE credentials. If a device fails to
// authenticate, the DM will close its tunneled connection to that device and reconnect to the assisting device,
// starting over the RPR process to listen for new connections on its unsecured Weave port. This cycle repeats
// until either the rendezvous timeout expires or a joiner successfully authenticates.
//
// It is expected that this function will be used to perform RPR in the case of Thread-assisted pairing.
WEAVE_ERROR RemotePassiveRendezvous(const IPAddress rendezvousDeviceAddr, const char *pairingCode,
const uint16_t rendezvousTimeoutSec, const uint16_t inactivityTimeoutSec, void *appReqState,
CompleteFunct onComplete, ErrorFunct onError);
// Perform Remote Passive Rendezvous with no authentication for rendezvoused device, i.e. DM will accept
// first tunnel handed to it by assisting device without question.
//
// The no-auth variant of this function is provided for the sake of completeness. It is expected that only the
// PASE varient will be used to perform RPR in the case of Thread-assisted pairing.
WEAVE_ERROR RemotePassiveRendezvous(const IPAddress rendezvousDeviceAddr, const uint16_t rendezvousTimeoutSec,
const uint16_t inactivityTimeoutSec, void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR ReconnectDevice(void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR EnableConnectionMonitor(uint16_t interval, uint16_t timeout, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR DisableConnectionMonitor(void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR SetRendezvousAddress(IPAddress addr);
WEAVE_ERROR SetAutoReconnect(bool autoReconnect);
WEAVE_ERROR SetUseAccessToken(bool useAccessToken);
WEAVE_ERROR SetRendezvousLinkLocal(bool RendezvousLinkLocal);
WEAVE_ERROR SetConnectTimeout(uint32_t timeoutMS);
void Close();
void Close(bool graceful);
void CloseDeviceConnection();
void CloseDeviceConnection(bool graceful);
bool IsConnected() const;
void SetConnectionClosedCallback(ConnectionClosedFunc onConnecionClosedFunc, void *onConnecionClosedAppReq);
// ----- Network Provisioning -----
WEAVE_ERROR ScanNetworks(NetworkType networkType, void* appReqState, NetworkScanCompleteFunct onComplete,
ErrorFunct onError);
WEAVE_ERROR AddNetwork(const NetworkInfo *netInfo, void* appReqState, AddNetworkCompleteFunct onComplete,
ErrorFunct onError);
WEAVE_ERROR UpdateNetwork(const NetworkInfo *netInfo, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR RemoveNetwork(uint32_t networkId, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR GetNetworks(uint8_t flags, void* appReqState, GetNetworksCompleteFunct onComplete,
ErrorFunct onError);
WEAVE_ERROR EnableNetwork(uint32_t networkId, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR DisableNetwork(uint32_t networkId, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR TestNetworkConnectivity(uint32_t networkId, void* appReqState, CompleteFunct onComplete,
ErrorFunct onError);
WEAVE_ERROR GetRendezvousMode(void* appReqState, GetRendezvousModeCompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR SetRendezvousMode(uint16_t modeFlags, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR GetLastNetworkProvisioningResult(void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
// ----- Fabric Provisioning -----
WEAVE_ERROR CreateFabric(void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR LeaveFabric(void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR GetFabricConfig(void* appReqState, GetFabricConfigCompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR JoinExistingFabric(const uint8_t *fabricConfig, uint32_t fabricConfigLen, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
// ----- Service Provisioning -----
WEAVE_ERROR RegisterServicePairAccount(uint64_t serviceId, const char *accountId,
const uint8_t *serviceConfig, uint16_t serviceConfigLen,
const uint8_t *pairingToken, uint16_t pairingTokenLen,
const uint8_t *pairingInitData, uint16_t pairingInitDataLen,
void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR UpdateService(uint64_t serviceId, const uint8_t *serviceConfig, uint16_t serviceConfigLen,
void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR UnregisterService(uint64_t serviceId, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
// ----- Device Control -----
WEAVE_ERROR ArmFailSafe(uint8_t armMode, uint32_t failSafeToken, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR DisarmFailSafe(void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR GetCameraAuthData(const char* nonce, void* appReqState, GetCameraAuthDataCompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR ResetConfig(uint16_t resetFlags, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR SignedHush(uint32_t proximityVerificationCode, uint32_t challenge, uint16_t keyId, const uint8_t *key, uint16_t keySize,
void* appReqState, HushCompleteFunct onHushComplete, ErrorFunct onError);
WEAVE_ERROR StartSystemTest(void* appReqState, uint32_t profileId, uint32_t testId, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR StopSystemTest(void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
// ----- Locale -----
WEAVE_ERROR GetActiveLocale(void* appReqState, GetActiveLocaleCompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR SetActiveLocale(void* appReqState, const char *aLocale, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR GetAvailableLocales(void* appReqState, GetAvailableLocalesCompleteFunct onComplete, ErrorFunct onError);
// ---- Thermostat ----
WEAVE_ERROR ThermostatGetEntryKey(void* appReqState, ThermostatGetEntryKeyCompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR ThermostatSystemTestStatus(void* appReqState, ThermostatSystemTestStatusCompleteFunct onComplete, ErrorFunct onError);
// ---- Token Pairing ----
WEAVE_ERROR PairToken(const uint8_t *pairingToken, uint32_t pairingTokenLen, void* appReqState, PairTokenCompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR UnpairToken(void* appReqState, UnpairTokenCompleteFunct onComplete, ErrorFunct onError);
// ----- Misc Operations -----
WEAVE_ERROR Ping(void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR Ping(void* appReqState, int32_t payloadSize, CompleteFunct onComplete, ErrorFunct onError);
static bool IsValidPairingCode(const char *pairingCode);
// ----- Node ID List Utils -----
static WEAVE_ERROR AddNodeToList(uint64_t nodeId, uint64_t* &list, uint32_t &listLen, uint32_t &listMaxLen, uint32_t initialMaxLen);
static bool IsNodeInList(uint64_t nodeId, uint64_t* list, uint32_t listLen);
// ----- DEPRECATED Methods -----
WEAVE_ERROR SetWiFiRendezvousAddress(IPAddress addr); // DEPRECATED -- Use SetRendezvousAddress()
WEAVE_ERROR RendezvousDevice(const char *pairingCode, void* appReqState, CompleteFunct onComplete, ErrorFunct onError);
private:
enum OpState
{
kOpState_Idle = 0,
kOpState_RendezvousDevice = 1,
kOpState_ConnectDevice = 2,
kOpState_ReconnectDevice = 3,
kOpState_IdentifyDevice = 5,
kOpState_ScanNetworks = 6,
kOpState_GetNetworks = 7,
kOpState_GetNetworkConfig = 8,
kOpState_AddNetwork = 9,
kOpState_UpdateNetwork = 10,
kOpState_RemoveNetwork = 11,
kOpState_EnableNetwork = 12,
kOpState_DisableNetwork = 13,
kOpState_TestNetworkConnectivity = 14,
kOpState_GetRendezvousMode = 15,
kOpState_SetRendezvousMode = 16,
kOpState_CreateFabric = 17,
kOpState_LeaveFabric = 18,
kOpState_GetFabricConfig = 19,
kOpState_JoinExistingFabric = 20,
kOpState_RegisterServicePairAccount = 21,
kOpState_UpdateService = 22,
kOpState_UnregisterService = 23,
kOpState_ArmFailSafe = 24,
kOpState_DisarmFailSafe = 25,
kOpState_ResetConfig = 26,
kOpState_Ping = 27,
kOpState_EnableConnectionMonitor = 28,
kOpState_DisableConnectionMonitor = 29,
kOpState_GetLastNPResult = 30,
kOpState_PassiveRendezvousDevice = 31,
kOpState_RemotePassiveRendezvousRequest = 32,
kOpState_AwaitingRemoteConnectionComplete = 33,
kOpState_RemotePassiveRendezvousAuthenticate = 34,
kOpState_RestartRemotePassiveRendezvous = 35,
kOpState_InitializeBleConnection = 36,
kOpState_Hush = 37,
kOpState_GetActiveLocale = 38,
kOpState_SetActiveLocale = 39,
kOpState_GetAvailableLocales = 40,
kOpState_ThermostatGetEntryKey = 41,
kOpState_ThermostatSystemTestStatus = 42,
kOpState_StartSystemTest = 43,
kOpState_StopSystemTest = 44,
kOpState_PairToken = 45,
kOpState_UnpairToken = 46,
kOpState_GetCameraAuthData = 47,
kOpState_EnumerateDevices = 48,
kOpState_RemotePassiveRendezvousTimedOut = 49
};
enum ConnectionState
{
kConnectionState_NotConnected = 0,
kConnectionState_WaitDeviceConnect = 1,
kConnectionState_IdentifyDevice = 2,
kConnectionState_ConnectDevice = 3,
kConnectionState_StartSession = 4,
kConnectionState_ReenableConnectionMonitor = 5,
kConnectionState_Connected = 6,
kConnectionState_IdentifyRemoteDevice = 7
};
enum
{
kMaxPairingCodeLength = 16,
kConRetryInterval = 500, // ms
kEnumerateDevicesRetryInterval = 500, // ms
kSessionRetryInterval = 1000, // ms
kMaxSessionRetryCount = 20,
};
enum
{
kAuthType_None = 0,
kAuthType_PASEWithPairingCode = 1,
kAuthType_CASEWithAccessToken = 2
};
enum
{
// Max Validation Certs -- This controls the maximum number of certificates
// that can be involved in the validation of peer's certificate. It must
// include room for the peer's entity cert, our trust anchors and any intermediate
// certs given to us by the peer in the CASE BeginSession request/response.
kMaxCASECerts = 10,
// Certificate Decode Buffer Size -- Size of the temporary buffer used to decode
// certs. The buffer must be big enough to hold the ASN1 DER encoding of the
// TBSCertificate portion of the largest cert involved in CASE authentication
// of the peer, not including the trust anchors. Note that all certificates
// by the peer are decoded using this buffer, even if they are ultimately not
// involved in authenticating the peer.
kCertDecodeBufferSize = 1024
};
class WDMDMClient : public nl::Weave::Profiles::DataManagement::DMClient
{
public:
WDMDMClient(void);
~WDMDMClient(void);
WEAVE_ERROR InitClient(WeaveDeviceManager *aDeviceMgr, WeaveExchangeManager *aExchangeMgr);
WEAVE_ERROR ViewConfirm(const uint64_t &aResponderId, StatusReport &aStatus, uint16_t aTxnId);
WEAVE_ERROR ViewConfirm(const uint64_t &aResponderId, ReferencedTLVData &aDataList, uint16_t aTxnId);
WEAVE_ERROR UpdateConfirm(const uint64_t &aResponderId, StatusReport &aStatus, uint16_t aTxnId);
using nl::Weave::Profiles::DataManagement::ProtocolEngine::IncompleteIndication;
void IncompleteIndication(const uint64_t &aPeerNodeId, StatusReport &aReport);
#if WEAVE_CONFIG_WDM_ALLOW_CLIENT_SUBSCRIPTION
WEAVE_ERROR SubscribeConfirm(const uint64_t &aResponderId, StatusReport &aStatus, uint16_t aTxnId);
WEAVE_ERROR SubscribeConfirm(const uint64_t &aResponderId, const TopicIdentifier &aTopicId, uint16_t aTxnId);
WEAVE_ERROR SubscribeConfirm(const uint64_t &aResponderId, const TopicIdentifier &aTopicId, ReferencedTLVData &aDataList, uint16_t aTxnId);
WEAVE_ERROR UnsubscribeIndication(const uint64_t &aPublisherId, const TopicIdentifier &aTopicId, StatusReport &aReport);
WEAVE_ERROR CancelSubscriptionConfirm(const uint64_t &aResponderId, const TopicIdentifier &aTopicId, StatusReport &aStatus, uint16_t aTxnId);
WEAVE_ERROR NotifyIndication(const TopicIdentifier &aTopicId, ReferencedTLVData &aDataList);
#endif // WEAVE_CONFIG_WDM_ALLOW_CLIENT_SUBSCRIPTION
private:
WeaveDeviceManager *mDeviceMgr;
};
System::Layer* mSystemLayer;
WeaveMessageLayer *mMessageLayer;
WeaveExchangeManager *mExchangeMgr;
WeaveSecurityManager *mSecurityMgr;
ConnectionState mConState;
WeaveConnection *mDeviceCon;
OpState mOpState;
void *mAppReqState;
union
{
CompleteFunct General;
IdentifyDeviceCompleteFunct IdentifyDevice;
NetworkScanCompleteFunct ScanNetworks;
GetNetworksCompleteFunct GetNetworks;
AddNetworkCompleteFunct AddNetwork;
GetRendezvousModeCompleteFunct GetRendezvousMode;
GetFabricConfigCompleteFunct GetFabricConfig;
HushCompleteFunct Hush;
GetActiveLocaleCompleteFunct GetActiveLocale;
GetAvailableLocalesCompleteFunct GetAvailableLocales;
ThermostatGetEntryKeyCompleteFunct ThermostatGetEntryKey;
ThermostatSystemTestStatusCompleteFunct ThermostatSystemStatus;
PairTokenCompleteFunct PairToken;
UnpairTokenCompleteFunct UnpairToken;
GetCameraAuthDataCompleteFunct GetCameraAuthData;
DeviceEnumerationResponseFunct DeviceEnumeration;
} mOnComplete;
CompleteFunct mOnRemotePassiveRendezvousComplete;
ErrorFunct mOnError;
StartFunct mOnStart;
ConnectionClosedFunc mOnConnectionClosedFunc;
void *mOnConnectionClosedAppReq;
ExchangeContext *mCurReq;
uint32_t mCurReqProfileId;
uint16_t mCurReqMsgType;
PacketBuffer *mCurReqMsg;
ExchangeContext::MessageReceiveFunct mCurReqRcvFunct;
IPAddress mRendezvousAddr;
IPAddress mDeviceAddr;
IPAddress mAssistingDeviceAddr;
IPAddress mRemoteDeviceAddr;
InterfaceId mDeviceIntf;
InterfaceId mAssistingDeviceIntf;
IdentifyDeviceCriteria mDeviceCriteria;
uint64_t mDeviceId;
uint64_t mAssistingDeviceId;
uint32_t mConTimeout; // in ms; 0 means disabled.
uint32_t mConTryCount;
uint16_t mSessionKeyId;
uint8_t mEncType;
uint8_t mAuthType;
uint8_t mAssistingDeviceAuthType;
uint8_t mRemoteDeviceAuthType;
char *mCameraNonce;
void *mAuthKey;
void *mAssistingDeviceAuthKey;
void *mRemoteDeviceAuthKey;
uint32_t mAuthKeyLen;
uint32_t mAssistingDeviceAuthKeyLen;
uint32_t mRemoteDeviceAuthKeyLen;
uint32_t mConMonitorInterval; // in ms; 0 means disabled.
uint32_t mConMonitorTimeout; // in ms; 0 means disabled.
uint32_t mRemotePassiveRendezvousTimeout; // in seconds; 0 means disabled.
uint32_t mRemotePassiveRendezvousInactivityTimeout; // in seconds; 0 means disabled.
bool mRemotePassiveRendezvousTimerIsRunning;
bool mConMonitorEnabled;
bool mAutoReconnect;
bool mRendezvousLinkLocal;
bool mUseAccessToken;
bool mConnectedToRemoteDevice; // Used to determine whether to allow auto-reconnect.
bool mIsUnsecuredConnectionListenerSet;
WDMDMClient mDMClient;
const char *mActiveLocale;
uint32_t mPingSize;
uint8_t *mTokenPairingCertificate;
uint32_t mTokenPairingCertificateLen;
uint64_t *mEnumeratedNodes;
uint32_t mEnumeratedNodesLen;
uint32_t mEnumeratedNodesMaxLen;
// Use by static HandleConnectionReceived callback.
static WeaveDeviceManager *sListeningDeviceMgr;
WEAVE_ERROR DoRemotePassiveRendezvous(const IPAddress rendezvousDeviceAddr, const uint16_t rendezvousTimeout,
const uint16_t inactivityTimeout, void *appReqState, CompleteFunct onComplete, ErrorFunct onError);
WEAVE_ERROR SendRequest(uint32_t profileId, uint16_t msgType, PacketBuffer *msgBuf,
ExchangeContext::MessageReceiveFunct onMsgRcvd);
WEAVE_ERROR SendPendingRequest();
WEAVE_ERROR SaveAuthKey(const char *pairingCode);
WEAVE_ERROR SaveAuthKey(const uint8_t *accessToken, uint32_t accessTokenLen);
void ClearAuthKey();
void ClearAuthKey(void *&authKey, uint32_t &authKeyLen);
WEAVE_ERROR SaveRemoteDeviceAuthInfo(uint8_t authType, const char *authKey, uint32_t authKeyLen);
void ClearRemoteDeviceAuthInfo();
void ClearRequestState();
void ClearOpState();
static void HandleRequestConnectionClosed(ExchangeContext *ec, WeaveConnection *con, WEAVE_ERROR conErr);
WEAVE_ERROR InitiateDeviceEnumeration();
WEAVE_ERROR InitiateConnection();
#if CONFIG_NETWORK_LAYER_BLE
WEAVE_ERROR InitiateBleConnection(BLE_CONNECTION_OBJECT connObj, void *appReqState, CompleteFunct onComplete, ErrorFunct onError, bool autoClose);
#endif // CONFIG_NETWORK_LAYER_BLE
static WEAVE_ERROR FilterIdentifyResponse(IdentifyResponseMessage &respMsg, IdentifyDeviceCriteria criteria, uint64_t sourceNodeId, bool& isMatch);
static void HandleDeviceEnumerationIdentifyResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo,
const WeaveMessageInfo *msgInfo, uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleDeviceEnumerationTimeout(System::Layer *aSystemLayer, void *aAppState, System::Error aError);
static void HandleConnectionIdentifyResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo,
const WeaveMessageInfo *msgInfo, uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleConnectionIdentifyTimeout(System::Layer *aSystemLayer, void *aAppState, System::Error aError);
WEAVE_ERROR SetUnsecuredConnectionHandler();
WEAVE_ERROR ClearUnsecuredConnectionHandler();
WEAVE_ERROR StartConnectDevice(uint64_t deviceId, IPAddress deviceAddr);
static void HandleConnectionComplete(WeaveConnection *con, WEAVE_ERROR conErr);
static void HandleConnectionClosed(WeaveConnection *con, WEAVE_ERROR conErr);
static void HandleConnectionReceived(WeaveMessageLayer *msgLayer, WeaveConnection *con);
static void HandleUnsecuredConnectionCallbackRemoved(void *appState);
WEAVE_ERROR StartSession();
static void HandleSessionEstablished(WeaveSecurityManager *sm, WeaveConnection *con, void *appReqState,
uint16_t sessionKeyId, uint64_t peerNodeId, uint8_t encType);
static void HandleSessionError(WeaveSecurityManager *sm, WeaveConnection *con, void *appReqState,
WEAVE_ERROR localErr, uint64_t peerNodeId, StatusReport *statusReport);
static void RetrySession(System::Layer* aSystemLayer, void* aAppState, System::Error aError);
void ReenableConnectionMonitor();
static void HandleReenableConnectionMonitorResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
void HandleConnectionReady();
static void HandleIdentifyDeviceResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleNetworkProvisioningResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleGetCameraAuthDataResponseEntry(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleServiceProvisioningResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleFabricProvisioningResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
void HandleGetCameraAuthDataResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleDeviceControlResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleRemotePassiveRendezvousComplete(ExchangeContext *ec, const IPPacketInfo *pktInfo, const
WeaveMessageInfo *msgInfo, uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandlePingResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleHushResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandlePairTokenResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleUnpairTokenResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
void StartConnectionMonitorTimer();
void CancelConnectionMonitorTimer();
static void HandleEchoRequest(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo,
uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleConnectionMonitorTimeout(System::Layer* aSystemLayer, void* aAppState, System::Error aError);
void HandleRemoteConnectionComplete();
void CancelRemotePassiveRendezvous();
WEAVE_ERROR StartRemotePassiveRendezvousTimer();
void CancelRemotePassiveRendezvousTimer();
void RestartRemotePassiveRendezvousListen();
WEAVE_ERROR StartReconnectToAssistingDevice();
// Below methods juggle peer address, authentication, and secure session state so we can reuse existing DM
// components for the "RPR PASE failed -> reconnect to assisting device -> send another RPR request" code path.
WEAVE_ERROR SaveAssistingDeviceConnectionInfo(); // Save all information required to reconnect to the assisting
// device so we can continue with Remote Passive Rendezvous
// attempt after PASE authentication with a particular remote
// host fails.
//
void RestoreAssistingDeviceAddressInfo(); // Restore saved node ID, IP address, and interface
// information for assisting device.
//
WEAVE_ERROR RestoreAssistingDeviceAuthInfo(); // Restore saved assisting device auth info so we can
// reauthenticate with it from scratch.
//
void ResetConnectionInfo(); // Clear current connection and authentication information.
void HandleRemotePassiveRendezvousReconnectComplete();
static void HandleAssistingDeviceReconnectWithSessionCompleteEntry(WeaveDeviceManager *deviceMgr,
void *appReqState);
static void HandleAssistingDeviceReconnectCompleteEntry(WeaveDeviceManager *deviceMgr, void *appReqState);
static void HandleRemotePassiveRendezvousTimeout(System::Layer* aSystemLayer, void* aAppState, System::Error aError);
static void HandleRemoteConnectionComplete(ExchangeContext *ec, const IPPacketInfo *pktInfo,
const WeaveMessageInfo *msgInfo, uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleRemoteIdentifyResponse(ExchangeContext *ec, const IPPacketInfo *pktInfo,
const WeaveMessageInfo *msgInfo, uint32_t profileId, uint8_t msgType, PacketBuffer *payload);
static void HandleRemoteIdentifyConnectionClosed(ExchangeContext *ec, WeaveConnection *con, WEAVE_ERROR conErr);
static void HandleRemoteIdentifyTimeout(ExchangeContext *ec);
static WEAVE_ERROR DecodeStatusReport(PacketBuffer *msgBuf, DeviceStatus& status);
static WEAVE_ERROR DecodeNetworkInfoList(PacketBuffer *buf, uint16_t& count, NetworkInfo *& netInfoList);
// CASE auth delegate methods
virtual WEAVE_ERROR GetNodeCertInfo(bool isInitiator, uint8_t *buf, uint16_t bufSize, uint16_t& certInfoLen);
virtual WEAVE_ERROR GetNodePrivateKey(bool isInitiator, const uint8_t *& weavePrivKey, uint16_t& weavePrivKeyLen);
virtual WEAVE_ERROR ReleaseNodePrivateKey(const uint8_t *weavePrivKey);
virtual WEAVE_ERROR GetNodePayload(bool isInitiator, uint8_t *buf, uint16_t bufSize, uint16_t& payloadLen);
virtual WEAVE_ERROR BeginCertValidation(bool isInitiator, Security::WeaveCertificateSet& certSet, Security::ValidationContext& validContext);
virtual WEAVE_ERROR HandleCertValidationResult(bool isInitiator, WEAVE_ERROR& validRes, Security::WeaveCertificateData *peerCert,
uint64_t peerNodeId, Security::WeaveCertificateSet& certSet, Security::ValidationContext& validContext);
virtual WEAVE_ERROR EndCertValidation(Security::WeaveCertificateSet& certSet, Security::ValidationContext& validContext);
// Locale
static void WriteLocaleRequest(nl::Weave::TLV::TLVWriter &aWriter, void *ctx);
// Thermostat
static void WriteThermostatRequest(nl::Weave::TLV::TLVWriter &aWriter, void *ctx);
// Convert EUI-48 value to string of hex characters. String buffer must be at least EUI48_STR_LEN bytes in length.
static void Eui48ToString(char *strBuf, uint8_t (&eui)[EUI48_LEN]);
};
// ProductWildcardId -- Special Values that can be placed in the IdentifyDeviceCriteria.TargetProductId
// field to identify particular groups of Nest devices.
enum ProductWildcardId
{
kProductWildcardId_RangeStart = 0xFFF0,
kProductWildcardId_RangeEnd = 0xFFFE,
kProductWildcardId_NestThermostat = 0xFFF0,
kProductWildcardId_NestProtect = 0xFFF1,
kProductWildcardId_NestCam = 0xFFF2
};
} // namespace DeviceManager
} // namespace Weave
} // namespace nl
#endif // __WEAVEDEVICEMANAGER_H