/* * * Copyright (c) 2020 Project CHIP Authors * * 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 #include #include #if CONFIG_NETWORK_LAYER_BLE #include #endif // CONFIG_NETWORK_LAYER_BLE #include #include #include #include #include namespace chip { // The largest supported value for Rendezvous discriminators const uint16_t kMaxRendezvousDiscriminatorValue = 0xFFF; // The largest supported value for session idle interval and session active interval inline constexpr uint32_t kMaxSessionIdleInterval = 3600000; class RendezvousParameters { public: RendezvousParameters() = default; bool HasSetupPINCode() const { return mSetupPINCode != 0; } uint32_t GetSetupPINCode() const { return mSetupPINCode; } RendezvousParameters & SetSetupPINCode(uint32_t setupPINCode) { mSetupPINCode = setupPINCode; return *this; } bool HasPeerAddress() const { return mPeerAddress.IsInitialized(); } Transport::PeerAddress GetPeerAddress() const { return mPeerAddress; } RendezvousParameters & SetPeerAddress(const Transport::PeerAddress & peerAddress) { mPeerAddress = peerAddress; return *this; } // Discriminators in RendezvousParameters are always long (12-bit) // discriminators. bool HasDiscriminator() const { return mSetupDiscriminator.has_value(); } // Obtains the long version of the discriminator, or 0 if short. // WARNING: This is lossy and a bad idea to use. The correct method to use // is GetSetupDiscriminator(). This method exists for public // API backwards compatibility. uint16_t GetDiscriminator() const { if (!mSetupDiscriminator.has_value()) { ChipLogError(Discovery, "Get RendezvousParameters::GetDiscriminator() called without discriminator in params (inconsistent). " "Using value 0 to avoid crash! Ensure discriminator is set!"); return 0; } if (mSetupDiscriminator.value().IsShortDiscriminator()) { ChipLogError(Discovery, "Get RendezvousParameters::GetDiscriminator() called with SHORT discriminator (inconsistent). Using value " "0 to avoid crash! Call GetSetupDiscriminator() to avoid loss."); return 0; } return mSetupDiscriminator.value().GetLongValue(); } std::optional GetSetupDiscriminator() const { if (!mSetupDiscriminator.has_value()) { ChipLogError( Discovery, "Get RendezvousParameters::GetSetupDiscriminator() called without discriminator in params (inconsistent)."); } return mSetupDiscriminator; } RendezvousParameters & SetSetupDiscriminator(SetupDiscriminator discriminator) { mSetupDiscriminator = discriminator; return *this; } RendezvousParameters & SetDiscriminator(uint16_t discriminator) { SetupDiscriminator tempDiscriminator; tempDiscriminator.SetLongValue(discriminator); mSetupDiscriminator = tempDiscriminator; return *this; } bool HasPASEVerifier() const { return mHasPASEVerifier; } const Crypto::Spake2pVerifier & GetPASEVerifier() const { return mPASEVerifier; } RendezvousParameters & SetPASEVerifier(Crypto::Spake2pVerifier & verifier) { memmove(&mPASEVerifier, &verifier, sizeof(verifier)); mHasPASEVerifier = true; return *this; } #if CONFIG_NETWORK_LAYER_BLE bool HasBleLayer() const { return mBleLayer != nullptr; } Ble::BleLayer * GetBleLayer() const { return mBleLayer; } RendezvousParameters & SetBleLayer(Ble::BleLayer * value) { mBleLayer = value; return *this; } bool HasConnectionObject() const { return mConnectionObject != BLE_CONNECTION_UNINITIALIZED; } BLE_CONNECTION_OBJECT GetConnectionObject() const { return mConnectionObject; } RendezvousParameters & SetConnectionObject(BLE_CONNECTION_OBJECT connObj) { mConnectionObject = connObj; return *this; } bool HasDiscoveredObject() const { return mDiscoveredObject != BLE_CONNECTION_UNINITIALIZED; } BLE_CONNECTION_OBJECT GetDiscoveredObject() const { return mDiscoveredObject; } RendezvousParameters & SetDiscoveredObject(BLE_CONNECTION_OBJECT connObj) { mDiscoveredObject = connObj; return *this; } #else bool HasConnectionObject() const { return false; } bool HasDiscoveredObject() const { return false; } #endif // CONFIG_NETWORK_LAYER_BLE bool HasMRPConfig() const { return mMRPConfig.HasValue(); } ReliableMessageProtocolConfig GetMRPConfig() const { return mMRPConfig.ValueOr(GetDefaultMRPConfig()); } RendezvousParameters & SetIdleInterval(System::Clock::Milliseconds32 interval) { if (!mMRPConfig.HasValue()) { mMRPConfig.Emplace(GetDefaultMRPConfig()); } mMRPConfig.Value().mIdleRetransTimeout = interval; return *this; } RendezvousParameters & SetActiveInterval(System::Clock::Milliseconds32 interval) { if (!mMRPConfig.HasValue()) { mMRPConfig.Emplace(GetDefaultMRPConfig()); } mMRPConfig.Value().mActiveRetransTimeout = interval; return *this; } private: Transport::PeerAddress mPeerAddress; ///< the peer node address uint32_t mSetupPINCode = 0; ///< the target peripheral setup PIN Code std::optional mSetupDiscriminator; Crypto::Spake2pVerifier mPASEVerifier; bool mHasPASEVerifier = false; Optional mMRPConfig; #if CONFIG_NETWORK_LAYER_BLE Ble::BleLayer * mBleLayer = nullptr; BLE_CONNECTION_OBJECT mConnectionObject = BLE_CONNECTION_UNINITIALIZED; BLE_CONNECTION_OBJECT mDiscoveredObject = BLE_CONNECTION_UNINITIALIZED; #endif // CONFIG_NETWORK_LAYER_BLE }; } // namespace chip