blob: 66d1b8e04bc5bc62e72b856719c410c8327370c0 [file] [log] [blame]
Alexander Afanasyev2a655f72015-01-26 18:38:33 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shi9f5b01d2016-08-05 03:54:28 +00003 * Copyright (c) 2014-2016, Regents of the University of California,
Alexander Afanasyev2a655f72015-01-26 18:38:33 -08004 * 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#ifndef NFD_TOOLS_NDN_AUTOCONFIG_BASE_HPP
27#define NFD_TOOLS_NDN_AUTOCONFIG_BASE_HPP
28
Junxiao Shi9f5b01d2016-08-05 03:54:28 +000029#include "core/common.hpp"
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080030
31#include <ndn-cxx/face.hpp>
Junxiao Shi25c6ce42016-09-09 13:49:59 +000032#include <ndn-cxx/mgmt/nfd/controller.hpp>
33#include <ndn-cxx/mgmt/nfd/face-status.hpp>
Junxiao Shi52fa45c2016-11-29 21:18:13 +000034#include <ndn-cxx/security/key-chain.hpp>
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080035#include <ndn-cxx/util/face-uri.hpp>
36
37namespace ndn {
38namespace tools {
39namespace autoconfig {
40
Junxiao Shi52fa45c2016-11-29 21:18:13 +000041using ndn::nfd::ControlParameters;
42using ndn::nfd::ControlResponse;
43using ndn::util::FaceUri;
44
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080045/**
46 * @brief Base class for discovery stages
47 */
48class Base : boost::noncopyable
49{
50public:
51 class Error : public std::runtime_error
52 {
53 public:
54 explicit
55 Error(const std::string& what)
56 : std::runtime_error(what)
57 {
58 }
59 };
60
61 /**
62 * @brief Callback to be called when the stage fails
63 */
64 typedef std::function<void(const std::string&)> NextStageCallback;
65
66 /**
67 * @brief Start the stage
68 */
69 virtual void
70 start() = 0;
71
72protected:
73 /**
Junxiao Shi52fa45c2016-11-29 21:18:13 +000074 * @brief Initialize variables and create Controller instance
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080075 * @param face Face to be used for all operations (e.g., will send registration commands)
76 * @param keyChain KeyChain object
77 * @param nextStageOnFailure Callback to be called after the stage failed
78 */
79 Base(Face& face, KeyChain& keyChain, const NextStageCallback& nextStageOnFailure);
80
81 /**
82 * @brief Attempt to connect to local hub using the \p uri FaceUri
83 * @throw Base::Error when failed to establish the tunnel
84 */
85 void
86 connectToHub(const std::string& uri);
87
88private:
89 void
Junxiao Shi52fa45c2016-11-29 21:18:13 +000090 onCanonizeSuccess(const FaceUri& canonicalUri);
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080091
92 void
93 onCanonizeFailure(const std::string& reason);
94
95 void
Junxiao Shi52fa45c2016-11-29 21:18:13 +000096 onHubConnectSuccess(const ControlParameters& resp);
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080097
98 void
Junxiao Shi52fa45c2016-11-29 21:18:13 +000099 onHubConnectError(const ControlResponse& response);
Alexander Afanasyev2a655f72015-01-26 18:38:33 -0800100
101 void
102 registerPrefix(const Name& prefix, uint64_t faceId);
103
104 void
Junxiao Shi52fa45c2016-11-29 21:18:13 +0000105 onPrefixRegistrationSuccess(const ControlParameters& commandSuccessResult);
Alexander Afanasyev2a655f72015-01-26 18:38:33 -0800106
107 void
Junxiao Shi52fa45c2016-11-29 21:18:13 +0000108 onPrefixRegistrationError(const ControlResponse& response);
Alexander Afanasyev2a655f72015-01-26 18:38:33 -0800109
110protected:
111 Face& m_face;
112 KeyChain& m_keyChain;
Junxiao Shi52fa45c2016-11-29 21:18:13 +0000113 ndn::nfd::Controller m_controller;
Alexander Afanasyev2a655f72015-01-26 18:38:33 -0800114 NextStageCallback m_nextStageOnFailure;
115};
116
117} // namespace autoconfig
118} // namespace tools
119} // namespace ndn
120
121#endif // NFD_TOOLS_NDN_AUTOCONFIG_BASE_HPP