blob: d122d809c683c8cef39ffe2fe020fede860e5b02 [file] [log] [blame]
/*
* Copyright (c) 2017, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for source address match controller.
*/
#ifndef SOURCE_MATCH_CONTROLLER_HPP_
#define SOURCE_MATCH_CONTROLLER_HPP_
#include <openthread/types.h>
#include "openthread-core-config.h"
#include "common/locator.hpp"
#include "thread/topology.hpp"
namespace ot {
/**
* @addtogroup core-source-match-controller
*
* @brief
* This module includes definition for source address match controller.
*
* @{
*/
/**
* This class implements the "source address match" controller.
*
* The source address match feature controls how the radio layer decides the "frame pending" bit for acks sent in
* response to data request commands from sleepy children.
*
* This class updates the source match table and also controls when to enable or disable the source matching
* feature.
*
* The source address match table provides the list of children for which there is a pending frame. Either a short
* address or an extended/long address can be added to the source address match table.
*
*/
class SourceMatchController: public MeshForwarderLocator
{
public:
/**
* This constructor initializes the object.
*
* @param[in] aMeshForwarder A reference to the Mesh Forwarder.
*
*/
explicit SourceMatchController(MeshForwarder &aMeshForwarder);
/**
* This method returns the current state of source address matching.
*
* @returns `true` if source address matching is enabled, `false` otherwise.
*
*/
bool IsEnabled(void) const { return mEnabled; }
/**
* This method increments the message count for a child and updates the source match table.
*
* @param[in] aChild A reference to the child.
*
*/
void IncrementMessageCount(Child &aChild);
/**
* This method decrements the message count for a child and updates the source match table.
*
* @param[in] aChild A reference to the child.
*
*/
void DecrementMessageCount(Child &aChild);
/**
* This method resets the message count for a child to zero and updates the source match table.
*
* @param[in] aChild A reference to the child.
*
*/
void ResetMessageCount(Child &aChild);
/**
* This method sets whether or not to perform source address matching on the extended or short address for
* a child.
*
* @param[in] aChild A reference to the child.
* @param[in] aUseShortAddress `true` to match on short source address, `false` otherwise.
*
*/
void SetSrcMatchAsShort(Child &aChild, bool aUseShortAddress);
private:
/**
* This method clears the source match table.
*
*/
void ClearTable(void);
/**
* This method enables or disables the source matching.
*
* If enabled, the radio uses the source match table to determine whether to set or clear the "frame pending" bit
* in an acknowledgment to a MAC Data Request command. If disabled, the radio layer sets the "frame pending" on all
* acknowledgment frames in response to MAC Data Request commands.
*
* @param[in] aEnable `true` to enable, `false` to disable.
*
*/
void Enable(bool aEnable);
/**
* This method adds an entry to source match table for a given child and updates the state of source matching
* feature accordingly.
*
* If the entry is added successfully, source matching feature is enabled (if not already enabled) after ensuring
* that there are no remaining pending entries. If the entry cannot be added (no space in source match table),
* the child is marked to remember the pending entry and source matching is disabled.
*
* @param[in] aChild A reference to the child.
*
*/
void AddEntry(Child &aChild);
/**
* This method clears an entry in source match table for a given child and updates the state of source matching
* feature accordingly.
*
* If the entry is removed successfully and frees up space in the source match table, any remaining pending
* entries are added. If all pending entries are successfully added, source matching is enabled.
*
* @param[in] aChild A reference to the child.
*
*/
void ClearEntry(Child &aChild);
/**
* This method adds a given child's address (short or extended address depending on child's setting) to the source
* source match table (@sa SetSrcMatchAsShort.
*
* @param[in] aChild A reference to the child
*
* @retval OT_ERROR_NONE Child's address was added successfully to the source match table.
* @retval OT_ERROR_NO_BUFS No available space in the source match table.
*
*/
otError AddAddress(const Child &aChild);
/**
* This method adds all pending entries to the source match table.
*
* @retval OT_ERROR_NONE All pending entries were successfully added.
* @retval OT_ERROR_NO_BUFS No available space in the source match table.
*
*/
otError AddPendingEntries(void);
bool mEnabled;
};
/**
* @}
*
*/
} // namespace ot
#endif // SOURCE_MATCH_CONTROLLER_HPP_