blob: 5c9d4cfcdd9c9db9b15b5d560335cfb3c3677739 [file] [log] [blame]
Alexander Afanasyev2a655f72015-01-26 18:38:33 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Qi Zhao6fc57a62017-04-05 16:53:10 +00003 * Copyright (c) 2014-2017, 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 Shi83be1da2017-06-30 13:37:37 +000034#include <ndn-cxx/net/face-uri.hpp>
Junxiao Shi52fa45c2016-11-29 21:18:13 +000035#include <ndn-cxx/security/key-chain.hpp>
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080036
37namespace ndn {
38namespace tools {
39namespace autoconfig {
40
Junxiao Shi52fa45c2016-11-29 21:18:13 +000041using ndn::nfd::ControlParameters;
42using ndn::nfd::ControlResponse;
Junxiao Shi52fa45c2016-11-29 21:18:13 +000043
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080044/**
45 * @brief Base class for discovery stages
46 */
47class Base : boost::noncopyable
48{
49public:
50 class Error : public std::runtime_error
51 {
52 public:
53 explicit
54 Error(const std::string& what)
55 : std::runtime_error(what)
56 {
57 }
58 };
59
60 /**
61 * @brief Callback to be called when the stage fails
62 */
63 typedef std::function<void(const std::string&)> NextStageCallback;
64
65 /**
66 * @brief Start the stage
67 */
68 virtual void
69 start() = 0;
70
71protected:
72 /**
Junxiao Shi52fa45c2016-11-29 21:18:13 +000073 * @brief Initialize variables and create Controller instance
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080074 * @param face Face to be used for all operations (e.g., will send registration commands)
75 * @param keyChain KeyChain object
76 * @param nextStageOnFailure Callback to be called after the stage failed
77 */
78 Base(Face& face, KeyChain& keyChain, const NextStageCallback& nextStageOnFailure);
79
80 /**
81 * @brief Attempt to connect to local hub using the \p uri FaceUri
82 * @throw Base::Error when failed to establish the tunnel
83 */
84 void
85 connectToHub(const std::string& uri);
86
87private:
88 void
Junxiao Shi52fa45c2016-11-29 21:18:13 +000089 onCanonizeSuccess(const FaceUri& canonicalUri);
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080090
91 void
92 onCanonizeFailure(const std::string& reason);
93
94 void
Junxiao Shi52fa45c2016-11-29 21:18:13 +000095 onHubConnectSuccess(const ControlParameters& resp);
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080096
97 void
Junxiao Shi52fa45c2016-11-29 21:18:13 +000098 onHubConnectError(const ControlResponse& response);
Alexander Afanasyev2a655f72015-01-26 18:38:33 -080099
100 void
Qi Zhao6fc57a62017-04-05 16:53:10 +0000101 registerAutoConfigNames(uint64_t faceId);
102
103 void
Alexander Afanasyev2a655f72015-01-26 18:38:33 -0800104 registerPrefix(const Name& prefix, uint64_t faceId);
105
106 void
Junxiao Shi52fa45c2016-11-29 21:18:13 +0000107 onPrefixRegistrationSuccess(const ControlParameters& commandSuccessResult);
Alexander Afanasyev2a655f72015-01-26 18:38:33 -0800108
109 void
Junxiao Shi52fa45c2016-11-29 21:18:13 +0000110 onPrefixRegistrationError(const ControlResponse& response);
Alexander Afanasyev2a655f72015-01-26 18:38:33 -0800111
112protected:
113 Face& m_face;
114 KeyChain& m_keyChain;
Junxiao Shi52fa45c2016-11-29 21:18:13 +0000115 ndn::nfd::Controller m_controller;
Alexander Afanasyev2a655f72015-01-26 18:38:33 -0800116 NextStageCallback m_nextStageOnFailure;
117};
118
119} // namespace autoconfig
120} // namespace tools
121} // namespace ndn
122
123#endif // NFD_TOOLS_NDN_AUTOCONFIG_BASE_HPP