blob: f5d26d37b32379fe375cb9219d2af74c0010eb99 [file] [log] [blame]
Junxiao Shib8590312016-12-29 21:22:25 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shi38b24c72017-01-05 02:59:31 +00003 * Copyright (c) 2014-2017, Regents of the University of California,
Junxiao Shib8590312016-12-29 21:22:25 +00004 * 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_DAEMON_FACE_FACE_SYSTEM_HPP
27#define NFD_DAEMON_FACE_FACE_SYSTEM_HPP
28
Junxiao Shi38b24c72017-01-05 02:59:31 +000029#include "channel.hpp"
Junxiao Shib8590312016-12-29 21:22:25 +000030#include "core/config-file.hpp"
Junxiao Shi38b24c72017-01-05 02:59:31 +000031#include "core/network-interface.hpp"
32#include "core/network-interface-predicate.hpp"
Junxiao Shib8590312016-12-29 21:22:25 +000033
34namespace nfd {
35
36class FaceTable;
Junxiao Shib8590312016-12-29 21:22:25 +000037
38namespace face {
39
Junxiao Shi38b24c72017-01-05 02:59:31 +000040class ProtocolFactory;
41
Junxiao Shib8590312016-12-29 21:22:25 +000042/** \brief entry point of the face system
43 *
Junxiao Shi38b24c72017-01-05 02:59:31 +000044 * NFD's face system is organized as a FaceSystem-ProtocolFactory-Channel-Face hierarchy.
45 * FaceSystem class is the entry point of NFD's face system and owns ProtocolFactory objects.
Junxiao Shib8590312016-12-29 21:22:25 +000046 */
47class FaceSystem : noncopyable
48{
49public:
50 explicit
51 FaceSystem(FaceTable& faceTable);
52
53 /** \return ProtocolFactory objects owned by the FaceSystem
54 */
55 std::set<const ProtocolFactory*>
56 listProtocolFactories() const;
57
Junxiao Shi38b24c72017-01-05 02:59:31 +000058 /** \return ProtocolFactory for the specified registered factory id or nullptr if not found
Junxiao Shib8590312016-12-29 21:22:25 +000059 */
60 ProtocolFactory*
Junxiao Shi38b24c72017-01-05 02:59:31 +000061 getFactoryById(const std::string& id);
62
63 /** \return ProtocolFactory for the specified FaceUri scheme or nullptr if not found
64 */
65 ProtocolFactory*
66 getFactoryByScheme(const std::string& scheme);
Junxiao Shib8590312016-12-29 21:22:25 +000067
68 /** \brief register handler for face_system section of NFD configuration file
69 */
70 void
71 setConfigFile(ConfigFile& configFile);
72
Junxiao Shi38b24c72017-01-05 02:59:31 +000073 /** \brief context for processing a config section in ProtocolFactory
74 */
75 class ConfigContext : noncopyable
76 {
77 public:
78 const std::vector<NetworkInterfaceInfo>&
79 listNics() const
80 {
81 ///\todo get NIC list from NetworkMonitor
82 return m_nicList;
83 }
84
85 public:
86 bool isDryRun;
87 FaceCreatedCallback addFace;
88 ///\todo add NetworkMonitor
89
90 private:
91 std::vector<NetworkInterfaceInfo> m_nicList;
92
93 friend class FaceSystem;
94 };
95
Junxiao Shib8590312016-12-29 21:22:25 +000096private:
97 void
98 processConfig(const ConfigSection& configSection, bool isDryRun,
99 const std::string& filename);
100
101 void
Junxiao Shib8590312016-12-29 21:22:25 +0000102 processSectionUdp(const ConfigSection& configSection, bool isDryRun,
103 const std::vector<NetworkInterfaceInfo>& nicList);
104
105 void
106 processSectionEther(const ConfigSection& configSection, bool isDryRun,
107 const std::vector<NetworkInterfaceInfo>& nicList);
108
109 void
110 processSectionWebSocket(const ConfigSection& configSection, bool isDryRun);
111
112PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Junxiao Shi38b24c72017-01-05 02:59:31 +0000113 /** \brief config section name => protocol factory
114 *
115 * \todo #3904 store unique_ptr<ProtocolFactory> here, and reference_wrapper<ProtocolFactory>
116 * in m_factoryByScheme
117 */
118 std::map<std::string, shared_ptr<ProtocolFactory>> m_factories;
119
Junxiao Shib8590312016-12-29 21:22:25 +0000120 /** \brief scheme => protocol factory
121 *
122 * The same protocol factory may be available under multiple schemes.
123 */
Junxiao Shi38b24c72017-01-05 02:59:31 +0000124 std::map<std::string, shared_ptr<ProtocolFactory>> m_factoryByScheme;
Junxiao Shib8590312016-12-29 21:22:25 +0000125
126 FaceTable& m_faceTable;
127};
128
129} // namespace face
130
131using face::FaceSystem;
132
133} // namespace nfd
134
135#endif // NFD_DAEMON_FACE_FACE_SYSTEM_HPP