NFD: Named Data Networking Forwarding Daemon 24.07-28-gdcc0e6e0
Loading...
Searching...
No Matches
cs-manager.cpp
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2014-2025, Regents of the University of California,
4 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
26#include "cs-manager.hpp"
28#include "table/cs.hpp"
29
30#include <ndn-cxx/mgmt/nfd/cs-info.hpp>
31
32#include <limits>
33
34namespace nfd {
35
37 Dispatcher& dispatcher, CommandAuthenticator& authenticator)
38 : ManagerBase("cs", dispatcher, authenticator)
39 , m_cs(cs)
40 , m_fwCounters(fwCounters)
41{
42 registerCommandHandler<ndn::nfd::CsConfigCommand>([this] (auto&&, auto&&, auto&&... args) {
43 changeConfig(std::forward<decltype(args)>(args)...);
44 });
45 registerCommandHandler<ndn::nfd::CsEraseCommand>([this] (auto&&, auto&&, auto&&... args) {
46 erase(std::forward<decltype(args)>(args)...);
47 });
48 registerStatusDatasetHandler("info", [this] (auto&&, auto&&, auto&&... args) {
49 serveInfo(std::forward<decltype(args)>(args)...);
50 });
51}
52
53void
54CsManager::changeConfig(const ControlParameters& parameters,
55 const CommandContinuation& done)
56{
57 using ndn::nfd::CsFlagBit;
58
59 if (parameters.hasCapacity()) {
60 m_cs.setLimit(parameters.getCapacity());
61 }
62
63 if (parameters.hasFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT)) {
64 m_cs.enableAdmit(parameters.getFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT));
65 }
66
67 if (parameters.hasFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE)) {
68 m_cs.enableServe(parameters.getFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE));
69 }
70
71 ControlParameters body;
72 body.setCapacity(m_cs.getLimit());
73 body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT, m_cs.shouldAdmit(), false);
74 body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE, m_cs.shouldServe(), false);
75 done(ControlResponse(200, "OK").setBody(body.wireEncode()));
76}
77
78void
79CsManager::erase(const ControlParameters& parameters,
80 const CommandContinuation& done)
81{
82 size_t count = parameters.hasCount() ?
83 parameters.getCount() :
84 std::numeric_limits<size_t>::max();
85 m_cs.erase(parameters.getName(), std::min(count, ERASE_LIMIT),
86 [=] (size_t nErased) {
87 ControlParameters body;
88 body.setName(parameters.getName());
89 body.setCount(nErased);
90 if (nErased == ERASE_LIMIT && count > ERASE_LIMIT) {
91 m_cs.find(Interest(parameters.getName()).setCanBePrefix(true),
92 [=] (const Interest&, const Data&) mutable {
93 body.setCapacity(ERASE_LIMIT);
94 done(ControlResponse(200, "OK").setBody(body.wireEncode()));
95 },
96 [=] (const Interest&) {
97 done(ControlResponse(200, "OK").setBody(body.wireEncode()));
98 });
99 }
100 else {
101 done(ControlResponse(200, "OK").setBody(body.wireEncode()));
102 }
103 });
104}
105
106void
107CsManager::serveInfo(ndn::mgmt::StatusDatasetContext& context) const
108{
109 ndn::nfd::CsInfo info;
110 info.setCapacity(m_cs.getLimit());
111 info.setEnableAdmit(m_cs.shouldAdmit());
112 info.setEnableServe(m_cs.shouldServe());
113 info.setNEntries(m_cs.size());
114 info.setNHits(m_fwCounters.nCsHits);
115 info.setNMisses(m_fwCounters.nCsMisses);
116
117 context.append(info.wireEncode());
118 context.end();
119}
120
121} // namespace nfd
Provides ControlCommand authorization according to NFD's configuration file.
static constexpr size_t ERASE_LIMIT
CsManager(cs::Cs &cs, const ForwarderCounters &fwCounters, Dispatcher &dispatcher, CommandAuthenticator &authenticator)
Counters provided by Forwarder.
A collection of common functions shared by all NFD managers, such as communicating with the dispatche...
void registerStatusDatasetHandler(const std::string &verb, const ndn::mgmt::StatusDatasetHandler &handler)
Implements the Content Store.
Definition cs.hpp:45
bool shouldServe() const noexcept
Get CS_ENABLE_SERVE flag.
Definition cs.hpp:149
void enableAdmit(bool shouldAdmit) noexcept
Set CS_ENABLE_ADMIT flag.
Definition cs.cpp:151
bool shouldAdmit() const noexcept
Get CS_ENABLE_ADMIT flag.
Definition cs.hpp:134
void erase(const Name &prefix, size_t limit, AfterEraseCallback &&cb)
Asynchronously erases entries under prefix.
Definition cs.hpp:64
void setLimit(size_t nMaxPackets)
Change capacity (in number of packets).
Definition cs.hpp:111
void enableServe(bool shouldServe) noexcept
Set CS_ENABLE_SERVE flag.
Definition cs.cpp:161
size_t getLimit() const noexcept
Get capacity (in number of packets).
Definition cs.hpp:103
Definition common.hpp:71