blob: 799fa8d6a382b220573d5378d503d917ce0ba15c [file] [log] [blame]
Eric Newberry94996d62015-05-07 13:48:46 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2015, Arizona Board of Regents.
4 *
5 * This file is part of ndn-tools (Named Data Networking Essential Tools).
6 * See AUTHORS.md for complete list of ndn-tools authors and contributors.
7 *
8 * ndn-tools is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
11 *
12 * ndn-tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * ndn-tools, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 *
19 * @author Eric Newberry <enewberry@email.arizona.edu>
20 * @author Jerald Paul Abraham <jeraldabraham@email.arizona.edu>
21 */
22
23#include "ping-server.hpp"
24
25namespace ndn {
26namespace ping {
27namespace server {
28
29PingServer::PingServer(Face& face, const Options& options)
30 : m_options(options)
31 , m_name(options.prefix)
32 , m_nPings(0)
33 , m_face(face)
34{
Eric Newberry62f7f712015-05-17 12:15:52 -070035 shared_ptr<Buffer> b = make_shared<Buffer>();
36 b->assign(m_options.payloadSize, 'a');
37 m_payload = Block(tlv::Content, b);
Eric Newberry94996d62015-05-07 13:48:46 -070038}
39
40void
41PingServer::run()
42{
Eric Newberrya93680e2015-07-15 19:25:29 -070043 start();
44
45 m_face.getIoService().run();
46}
47
48void
49PingServer::start()
50{
Eric Newberry94996d62015-05-07 13:48:46 -070051 m_name.append("ping");
52 m_face.setInterestFilter(m_name,
53 bind(&PingServer::onInterest,
54 this, _2),
55 bind(&PingServer::onRegisterFailed,
56 this, _2));
Eric Newberry94996d62015-05-07 13:48:46 -070057}
58
59int
60PingServer::getNPings() const
61{
62 return m_nPings;
63}
64
65void
66PingServer::onInterest(const Interest& interest)
67{
68 Name interestName = interest.getName();
69
70 afterReceive(interestName);
71
Eric Newberry94996d62015-05-07 13:48:46 -070072 shared_ptr<Data> data = make_shared<Data>(interestName);
73 data->setFreshnessPeriod(m_options.freshnessPeriod);
Eric Newberry62f7f712015-05-17 12:15:52 -070074 data->setContent(m_payload);
Eric Newberry38146c52015-06-22 15:11:30 -070075 m_keyChain.sign(*data, signingWithSha256());
Eric Newberry94996d62015-05-07 13:48:46 -070076 m_face.put(*data);
77
78 ++m_nPings;
79 if (m_options.shouldLimitSatisfied && m_options.nMaxPings > 0 && m_options.nMaxPings == m_nPings) {
80 m_face.shutdown();
81 m_face.getIoService().stop();
82 }
83}
84
85void
86PingServer::onRegisterFailed(const std::string& reason)
87{
88 throw "Failed to register prefix in local hub's daemon, REASON: " + reason;
89}
90
91} // namespace server
92} // namespace ping
93} // namespace ndn