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-2022, 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 namespace nfd {
33 
34 CsManager::CsManager(Cs& cs, const ForwarderCounters& fwCounters,
35  Dispatcher& dispatcher, CommandAuthenticator& authenticator)
36  : ManagerBase("cs", dispatcher, authenticator)
37  , m_cs(cs)
38  , m_fwCounters(fwCounters)
39 {
40  registerCommandHandler<ndn::nfd::CsConfigCommand>("config",
41  std::bind(&CsManager::changeConfig, this, _4, _5));
42  registerCommandHandler<ndn::nfd::CsEraseCommand>("erase",
43  std::bind(&CsManager::erase, this, _4, _5));
44 
45  registerStatusDatasetHandler("info", std::bind(&CsManager::serveInfo, this, _1, _2, _3));
46 }
47 
48 void
49 CsManager::changeConfig(const ControlParameters& parameters,
50  const ndn::mgmt::CommandContinuation& done)
51 {
52  using ndn::nfd::CsFlagBit;
53 
54  if (parameters.hasCapacity()) {
55  m_cs.setLimit(parameters.getCapacity());
56  }
57 
58  if (parameters.hasFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT)) {
59  m_cs.enableAdmit(parameters.getFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT));
60  }
61 
62  if (parameters.hasFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE)) {
63  m_cs.enableServe(parameters.getFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE));
64  }
65 
66  ControlParameters body;
67  body.setCapacity(m_cs.getLimit());
68  body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT, m_cs.shouldAdmit(), false);
69  body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE, m_cs.shouldServe(), false);
70  done(ControlResponse(200, "OK").setBody(body.wireEncode()));
71 }
72 
73 void
74 CsManager::erase(const ControlParameters& parameters,
75  const ndn::mgmt::CommandContinuation& done)
76 {
77  size_t count = parameters.hasCount() ?
78  parameters.getCount() :
79  std::numeric_limits<size_t>::max();
80  m_cs.erase(parameters.getName(), std::min(count, ERASE_LIMIT),
81  [=] (size_t nErased) {
82  ControlParameters body;
83  body.setName(parameters.getName());
84  body.setCount(nErased);
85  if (nErased == ERASE_LIMIT && count > ERASE_LIMIT) {
86  m_cs.find(Interest(parameters.getName()).setCanBePrefix(true),
87  [=] (const Interest&, const Data&) mutable {
88  body.setCapacity(ERASE_LIMIT);
89  done(ControlResponse(200, "OK").setBody(body.wireEncode()));
90  },
91  [=] (const Interest&) {
92  done(ControlResponse(200, "OK").setBody(body.wireEncode()));
93  });
94  }
95  else {
96  done(ControlResponse(200, "OK").setBody(body.wireEncode()));
97  }
98  });
99 }
100 
101 void
102 CsManager::serveInfo(const Name&, const Interest&, ndn::mgmt::StatusDatasetContext& context) const
103 {
104  ndn::nfd::CsInfo info;
105  info.setCapacity(m_cs.getLimit());
106  info.setEnableAdmit(m_cs.shouldAdmit());
107  info.setEnableServe(m_cs.shouldServe());
108  info.setNEntries(m_cs.size());
109  info.setNHits(m_fwCounters.nCsHits);
110  info.setNMisses(m_fwCounters.nCsMisses);
111 
112  context.append(info.wireEncode());
113  context.end();
114 }
115 
116 } // namespace nfd
Provides ControlCommand authorization according to NFD's configuration file.
static constexpr size_t ERASE_LIMIT
Definition: cs-manager.hpp:69
CsManager(cs::Cs &cs, const ForwarderCounters &fwCounters, Dispatcher &dispatcher, CommandAuthenticator &authenticator)
Definition: cs-manager.cpp:34
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:160
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:170
size_t getLimit() const noexcept
Get capacity (in number of packets).
Definition: cs.hpp:103
Definition: common.hpp:77