blob: 25924ec6045ef8cb8f644cb6e17ecdc514657ea6 [file] [log] [blame]
/*
* 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 <array>
#include <bitset>
#include <lib/core/CHIPPersistentStorageDelegate.h>
#include <lib/core/DataModelTypes.h>
#include <lib/core/NodeId.h>
#include <lib/core/PeerId.h>
#include <lib/support/Span.h>
#include <transport/PeerMessageCounter.h>
#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