/* * 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. */ /** * @file * This file defines the Matter Group message counters of remote nodes for groups. * */ #pragma once #include #include #include #include #include #include #include #include #define GROUP_MSG_COUNTER_MIN_INCREMENT 1000 namespace chip { namespace Transport { class GroupSender { public: NodeId mNodeId = kUndefinedNodeId; PeerMessageCounter msgCounter; }; class GroupFabric { public: FabricIndex mFabricIndex = kUndefinedFabricIndex; uint8_t mControlPeerCount = 0; uint8_t mDataPeerCount = 0; GroupSender mDataGroupSenders[CHIP_CONFIG_MAX_GROUP_DATA_PEERS]; GroupSender mControlGroupSenders[CHIP_CONFIG_MAX_GROUP_CONTROL_PEERS]; }; class GroupPeerTable { public: CHIP_ERROR FindOrAddPeer(FabricIndex fabricIndex, NodeId nodeId, bool isControl, chip::Transport::PeerMessageCounter *& counter); // Used in case of MCSP failure CHIP_ERROR RemovePeer(FabricIndex fabricIndex, NodeId nodeId, bool isControl); CHIP_ERROR FabricRemoved(FabricIndex fabricIndex); // Protected for Unit Tests inheritance protected: bool RemoveSpecificPeer(GroupSender * list, NodeId nodeId, uint32_t size); void CompactPeers(GroupSender * list, uint32_t size); void RemoveAndCompactFabric(uint32_t tableIndex); GroupFabric mGroupFabrics[CHIP_CONFIG_MAX_FABRICS]; }; // Might want to rename this so that it is explicitly the sending side of counters class GroupOutgoingCounters { public: static constexpr uint32_t kMessageCounterRandomInitMask = 0x0FFFFFFF; ///< 28-bit mask GroupOutgoingCounters(){}; GroupOutgoingCounters(chip::PersistentStorageDelegate * storage_delegate); CHIP_ERROR Init(chip::PersistentStorageDelegate * storage_delegate); uint32_t GetCounter(bool isControl); CHIP_ERROR IncrementCounter(bool isControl); // Protected for Unit Tests inheritance protected: // TODO Initialize those to random value uint32_t mGroupDataCounter = 0; uint32_t mGroupControlCounter = 0; chip::PersistentStorageDelegate * mStorage = nullptr; }; } // namespace Transport } // namespace chip