blob: d7ebed59a99a8fd87232d0fc362e857c8c33fc11 [file] [log] [blame]
Ivan Yeodb0052d2015-02-08 17:27:04 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev63e81f92019-02-05 13:30:26 -05003 * Copyright (c) 2015-2019 Regents of the University of California
Ivan Yeodb0052d2015-02-08 17:27:04 -08004 *
5 * This file is part of NFD (Named Data Networking Forwarding Daemon) Android.
6 * See AUTHORS.md for complete list of NFD Android authors and contributors.
7 *
8 * NFD Android 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 * NFD Android 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 * NFD Android, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include "nfd-wrapper.hpp"
Ivan Yeodb0052d2015-02-08 17:27:04 -080021
Alexander Afanasyeva5576252019-05-02 16:56:40 -040022#include <nfd.hpp>
23#include <rib/service.hpp>
Ivan Yeodb0052d2015-02-08 17:27:04 -080024
Alexander Afanasyeva5576252019-05-02 16:56:40 -040025#include <common/config-file.hpp>
26#include <common/global.hpp>
27#include <common/logger.hpp>
28#include <common/privilege-helper.hpp>
Alexander Afanasyev216df012015-02-10 17:35:46 -080029
30#include <boost/property_tree/info_parser.hpp>
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -080031#include <boost/thread.hpp>
32#include <mutex>
Alexander Afanasyev14fd3e22018-07-04 14:20:53 -040033#include <ndn-cxx/util/logging.hpp>
34#include <stdlib.h>
Alexander Afanasyev216df012015-02-10 17:35:46 -080035
Alexander Afanasyev14fd3e22018-07-04 14:20:53 -040036NFD_LOG_INIT(NfdWrapper);
Alexander Afanasyev216df012015-02-10 17:35:46 -080037
38namespace nfd {
39
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -080040
Alexander Afanasyev216df012015-02-10 17:35:46 -080041class Runner
42{
43public:
44 Runner()
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -080045 : m_io(nullptr)
Alexander Afanasyev216df012015-02-10 17:35:46 -080046 {
Alexander Afanasyev14fd3e22018-07-04 14:20:53 -040047 std::string initialConfig = R"CONF(
48 log
49 {
50 default_level ALL
51 }
52 tables
53 {
54 cs_max_packets 100
55 strategy_choice
56 {
57 / /localhost/nfd/strategy/best-route
58 /localhost /localhost/nfd/strategy/multicast
59 /localhost/nfd /localhost/nfd/strategy/best-route
60 /ndn/broadcast /localhost/nfd/strategy/multicast
61 /ndn/multicast /localhost/nfd/strategy/multicast
Alexander Afanasyev63e81f92019-02-05 13:30:26 -050062 /sl /localhost/nfd/strategy/self-learning
Alexander Afanasyev14fd3e22018-07-04 14:20:53 -040063 }
64 }
65 face_system
66 {
67 tcp
68 udp
Alexander Afanasyev14fd3e22018-07-04 14:20:53 -040069 websocket
70 }
71 authorizations
72 {
73 authorize
74 {
75 certfile any
76 privileges
77 {
78 faces
79 fib
80 cs
81 strategy-choice
82 }
83 }
84 }
85 rib
86 {
87 localhost_security
88 {
89 trust-anchor
90 {
91 type any
92 }
93 }
Alexander Afanasyev449a4312019-02-14 10:27:37 -050094 localhop_security
95 {
96 trust-anchor
97 {
98 type any
99 }
100 }
Alexander Afanasyev14fd3e22018-07-04 14:20:53 -0400101 auto_prefix_propagate
102 {
103 refresh_interval 300
104 }
105 }
Alexander Afanasyev63e81f92019-02-05 13:30:26 -0500106 )CONF";
Alexander Afanasyev216df012015-02-10 17:35:46 -0800107
108 std::istringstream input(initialConfig);
109 boost::property_tree::read_info(input, m_config);
110
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800111 m_nfd.reset(new Nfd(m_config, m_keyChain));
Alexander Afanasyev63e81f92019-02-05 13:30:26 -0500112 m_ribService.reset(new rib::Service(m_config, m_keyChain));
Alexander Afanasyev216df012015-02-10 17:35:46 -0800113
114 m_nfd->initialize();
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800115 }
116
117 void
Alexander Afanasyev63e81f92019-02-05 13:30:26 -0500118 run()
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800119 {
120 {
121 std::unique_lock<std::mutex> lock(m_pointerMutex);
122 m_io = &getGlobalIoService();
123 }
Alexander Afanasyevf7b62362015-09-10 23:29:47 -0700124
Alexander Afanasyev63e81f92019-02-05 13:30:26 -0500125 setMainIoService(m_io);
126 setRibIoService(m_io);
127
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800128 m_io->run();
129 m_io->reset();
Alexander Afanasyev63e81f92019-02-05 13:30:26 -0500130
131 m_ribService.reset();
132 m_nfd.reset();
133
134 m_io = nullptr;
Alexander Afanasyev216df012015-02-10 17:35:46 -0800135 }
136
137 void
138 stop()
139 {
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800140 std::unique_lock<std::mutex> lock(m_pointerMutex);
141
Alexander Afanasyev63e81f92019-02-05 13:30:26 -0500142 if (m_io != nullptr) {
143 m_io->stop();
144 }
Alexander Afanasyev216df012015-02-10 17:35:46 -0800145 }
146
147private:
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800148 std::mutex m_pointerMutex;
149 boost::asio::io_service* m_io;
Alexander Afanasyev216df012015-02-10 17:35:46 -0800150 ndn::KeyChain m_keyChain;
Alexander Afanasyev63e81f92019-02-05 13:30:26 -0500151 unique_ptr<Nfd> m_nfd;
152 unique_ptr<rib::Service> m_ribService;
Alexander Afanasyev216df012015-02-10 17:35:46 -0800153
154 nfd::ConfigSection m_config;
155};
156
157static unique_ptr<Runner> g_runner;
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800158static boost::thread g_thread;
Alexander Afanasyev45b7ad62015-04-19 22:00:45 -0700159static std::map<std::string, std::string> g_params;
Alexander Afanasyev216df012015-02-10 17:35:46 -0800160
161} // namespace nfd
Ivan Yeodb0052d2015-02-08 17:27:04 -0800162
Alexander Afanasyev45b7ad62015-04-19 22:00:45 -0700163
164std::map<std::string, std::string>
165getParams(JNIEnv* env, jobject jParams)
166{
167 std::map<std::string, std::string> params;
168
169 jclass jcMap = env->GetObjectClass(jParams);
170 jclass jcSet = env->FindClass("java/util/Set");
171 jclass jcIterator = env->FindClass("java/util/Iterator");
172 jclass jcMapEntry = env->FindClass("java/util/Map$Entry");
173
174 jmethodID jcMapEntrySet = env->GetMethodID(jcMap, "entrySet", "()Ljava/util/Set;");
175 jmethodID jcSetIterator = env->GetMethodID(jcSet, "iterator", "()Ljava/util/Iterator;");
176 jmethodID jcIteratorHasNext = env->GetMethodID(jcIterator, "hasNext", "()Z");
177 jmethodID jcIteratorNext = env->GetMethodID(jcIterator, "next", "()Ljava/lang/Object;");
178 jmethodID jcMapEntryGetKey = env->GetMethodID(jcMapEntry, "getKey", "()Ljava/lang/Object;");
179 jmethodID jcMapEntryGetValue = env->GetMethodID(jcMapEntry, "getValue", "()Ljava/lang/Object;");
180
181 jobject jParamsEntrySet = env->CallObjectMethod(jParams, jcMapEntrySet);
182 jobject jParamsIterator = env->CallObjectMethod(jParamsEntrySet, jcSetIterator);
183 jboolean bHasNext = env->CallBooleanMethod(jParamsIterator, jcIteratorHasNext);
184 while (bHasNext) {
185 jobject entry = env->CallObjectMethod(jParamsIterator, jcIteratorNext);
186
187 jstring jKey = (jstring)env->CallObjectMethod(entry, jcMapEntryGetKey);
188 jstring jValue = (jstring)env->CallObjectMethod(entry, jcMapEntryGetValue);
189
190 const char* cKey = env->GetStringUTFChars(jKey, nullptr);
191 const char* cValue = env->GetStringUTFChars(jValue, nullptr);
192
193 params.insert(std::make_pair(cKey, cValue));
194
195 env->ReleaseStringUTFChars(jKey, cKey);
196 env->ReleaseStringUTFChars(jValue, cValue);
197
198 bHasNext = env->CallBooleanMethod(jParamsIterator, jcIteratorHasNext);
199 }
200
201 return params;
202}
203
204
Ivan Yeodb0052d2015-02-08 17:27:04 -0800205JNIEXPORT void JNICALL
Alexander Afanasyev45b7ad62015-04-19 22:00:45 -0700206Java_net_named_1data_nfd_service_NfdService_startNfd(JNIEnv* env, jclass, jobject jParams)
Ivan Yeodb0052d2015-02-08 17:27:04 -0800207{
Alexander Afanasyev216df012015-02-10 17:35:46 -0800208 if (nfd::g_runner.get() == nullptr) {
Alexander Afanasyev45b7ad62015-04-19 22:00:45 -0700209 nfd::g_params = getParams(env, jParams);
210
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800211 // set/update HOME environment variable
Alexander Afanasyev45b7ad62015-04-19 22:00:45 -0700212 ::setenv("HOME", nfd::g_params["homePath"].c_str(), true);
213 NFD_LOG_INFO("Use [" << nfd::g_params["homePath"] << "] as a security storage");
Ivan Yeodb0052d2015-02-08 17:27:04 -0800214
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800215 nfd::g_thread = boost::thread([] {
Alexander Afanasyevf7b62362015-09-10 23:29:47 -0700216 nfd::resetGlobalIoService();
217
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800218 NFD_LOG_INFO("Starting NFD...");
219 try {
220 nfd::g_runner.reset(new nfd::Runner());
Alexander Afanasyev63e81f92019-02-05 13:30:26 -0500221 nfd::g_runner->run();
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800222 }
223 catch (const std::exception& e) {
224 NFD_LOG_FATAL(e.what());
225 }
226 catch (const nfd::PrivilegeHelper::Error& e) {
227 NFD_LOG_FATAL("PrivilegeHelper: " << e.what());
228 }
229 catch (...) {
230 NFD_LOG_FATAL("Unknown fatal error");
231 }
Alexander Afanasyev216df012015-02-10 17:35:46 -0800232
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800233 nfd::g_runner.reset();
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800234 nfd::resetGlobalIoService();
235 NFD_LOG_INFO("NFD stopped");
236 });
237 }
Ivan Yeodb0052d2015-02-08 17:27:04 -0800238}
239
240JNIEXPORT void JNICALL
Ivan Yeo6296dce2015-02-10 23:29:43 -0800241Java_net_named_1data_nfd_service_NfdService_stopNfd(JNIEnv*, jclass)
Ivan Yeodb0052d2015-02-08 17:27:04 -0800242{
Alexander Afanasyevc134b6f2015-02-12 17:01:44 -0800243 if (nfd::g_runner.get() != nullptr) {
244 NFD_LOG_INFO("Stopping NFD...");
245 nfd::g_runner->stop();
246 // do not block anything
Alexander Afanasyev216df012015-02-10 17:35:46 -0800247 }
Ivan Yeodb0052d2015-02-08 17:27:04 -0800248}
Alexander Afanasyev45b7ad62015-04-19 22:00:45 -0700249
Haitao Zhang0c79a9c2016-11-21 00:38:51 -0800250JNIEXPORT jboolean JNICALL
251Java_net_named_1data_nfd_service_NfdService_isNfdRunning(JNIEnv*, jclass)
252{
Alexander Afanasyev63e81f92019-02-05 13:30:26 -0500253 return nfd::g_runner.get() != nullptr;
Alexander Afanasyev45b7ad62015-04-19 22:00:45 -0700254}