/* * Copyright (c) 2021 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 #include #include namespace chip { namespace Transport { class IncomingGroupSession : public Session, public ReferenceCounted, 0> { public: IncomingGroupSession(GroupId group, FabricIndex fabricIndex, NodeId peerNodeId) : mGroupId(group), mPeerNodeId(peerNodeId) { SetFabricIndex(fabricIndex); } ~IncomingGroupSession() override { NotifySessionReleased(); VerifyOrDie(GetReferenceCount() == 0); } void Retain() override { ReferenceCounted, 0>::Retain(); } void Release() override { ReferenceCounted, 0>::Release(); } bool IsActiveSession() const override { return true; } Session::SessionType GetSessionType() const override { return Session::SessionType::kGroupIncoming; } ScopedNodeId GetPeer() const override { return ScopedNodeId(mPeerNodeId, GetFabricIndex()); } ScopedNodeId GetLocalScopedNodeId() const override { return ScopedNodeId(kUndefinedNodeId, GetFabricIndex()); } Access::SubjectDescriptor GetSubjectDescriptor() const override { Access::SubjectDescriptor subjectDescriptor; subjectDescriptor.authMode = Access::AuthMode::kGroup; subjectDescriptor.subject = NodeIdFromGroupId(mGroupId); subjectDescriptor.fabricIndex = GetFabricIndex(); return subjectDescriptor; } bool AllowsMRP() const override { return false; } bool AllowsLargePayload() const override { return false; } const SessionParameters & GetRemoteSessionParameters() const override { static const SessionParameters cfg(GetDefaultMRPConfig()); VerifyOrDie(false); return cfg; } System::Clock::Timestamp GetMRPBaseTimeout() const override { return System::Clock::kZero; } System::Clock::Milliseconds32 GetAckTimeout() const override { VerifyOrDie(false); return System::Clock::Timeout(); } System::Clock::Milliseconds32 GetMessageReceiptTimeout(System::Clock::Timestamp ourLastActivity) const override { // There are no timeouts for group sessions. VerifyOrDie(false); return System::Clock::Timeout(); } GroupId GetGroupId() const { return mGroupId; } private: const GroupId mGroupId; const NodeId mPeerNodeId; }; class OutgoingGroupSession : public Session, public ReferenceCounted, 0> { public: OutgoingGroupSession(GroupId group, FabricIndex fabricIndex) : mGroupId(group) { SetFabricIndex(fabricIndex); } ~OutgoingGroupSession() override { NotifySessionReleased(); VerifyOrDie(GetReferenceCount() == 0); } void Retain() override { ReferenceCounted, 0>::Retain(); } void Release() override { ReferenceCounted, 0>::Release(); } bool IsActiveSession() const override { return true; } Session::SessionType GetSessionType() const override { return Session::SessionType::kGroupOutgoing; } // Peer node ID is unused: users care about the group, not the node ScopedNodeId GetPeer() const override { return ScopedNodeId(); } // Local node ID is unused: users care about the group, not the node ScopedNodeId GetLocalScopedNodeId() const override { return ScopedNodeId(); } Access::SubjectDescriptor GetSubjectDescriptor() const override { return Access::SubjectDescriptor(); // no subject exists for outgoing group session. } bool AllowsMRP() const override { return false; } bool AllowsLargePayload() const override { return false; } const SessionParameters & GetRemoteSessionParameters() const override { static const SessionParameters cfg(GetDefaultMRPConfig()); VerifyOrDie(false); return cfg; } System::Clock::Timestamp GetMRPBaseTimeout() const override { return System::Clock::kZero; } System::Clock::Milliseconds32 GetAckTimeout() const override { VerifyOrDie(false); return System::Clock::Timeout(); } System::Clock::Milliseconds32 GetMessageReceiptTimeout(System::Clock::Timestamp ourLastActivity) const override { // There are no timeouts for group sessions. VerifyOrDie(false); return System::Clock::Timeout(); } GroupId GetGroupId() const { return mGroupId; } private: const GroupId mGroupId; }; } // namespace Transport } // namespace chip