blob: 556a0ed077a5a7be7336e36d1bfc51d96f5705ee [file] [log] [blame]
Junxiao Shi70911652014-08-12 10:14:24 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi22f85682018-01-22 19:23:22 +00002/*
3 * Copyright (c) 2013-2018 Regents of the University of California.
Junxiao Shi70911652014-08-12 10:14:24 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
Junxiao Shi7357ef22016-09-07 02:39:37 +000022#include "control-command.hpp"
Junxiao Shi70911652014-08-12 10:14:24 -070023
24namespace ndn {
25namespace nfd {
26
27ControlCommand::ControlCommand(const std::string& module, const std::string& verb)
Junxiao Shi5de006b2014-10-26 20:20:52 -070028 : m_module(module)
29 , m_verb(verb)
Junxiao Shi70911652014-08-12 10:14:24 -070030{
Junxiao Shi70911652014-08-12 10:14:24 -070031}
32
Davide Pesaventoaeeb3fc2016-08-14 03:40:02 +020033ControlCommand::~ControlCommand() = default;
34
Junxiao Shi70911652014-08-12 10:14:24 -070035void
36ControlCommand::validateRequest(const ControlParameters& parameters) const
37{
38 m_requestValidator.validate(parameters);
39}
40
41void
42ControlCommand::applyDefaultsToRequest(ControlParameters& parameters) const
43{
44}
45
46void
47ControlCommand::validateResponse(const ControlParameters& parameters) const
48{
49 m_responseValidator.validate(parameters);
50}
51
52void
53ControlCommand::applyDefaultsToResponse(ControlParameters& parameters) const
54{
55}
56
57Name
Junxiao Shi5de006b2014-10-26 20:20:52 -070058ControlCommand::getRequestName(const Name& commandPrefix,
59 const ControlParameters& parameters) const
Junxiao Shi70911652014-08-12 10:14:24 -070060{
61 this->validateRequest(parameters);
62
Junxiao Shi5de006b2014-10-26 20:20:52 -070063 Name name = commandPrefix;
64 name.append(m_module).append(m_verb);
Junxiao Shi70911652014-08-12 10:14:24 -070065 name.append(parameters.wireEncode());
66 return name;
67}
68
Junxiao Shi70911652014-08-12 10:14:24 -070069ControlCommand::FieldValidator::FieldValidator()
70 : m_required(CONTROL_PARAMETER_UBOUND)
71 , m_optional(CONTROL_PARAMETER_UBOUND)
72{
73}
74
75void
76ControlCommand::FieldValidator::validate(const ControlParameters& parameters) const
77{
78 const std::vector<bool>& presentFields = parameters.getPresentFields();
79
80 for (size_t i = 0; i < CONTROL_PARAMETER_UBOUND; ++i) {
81 bool isPresent = presentFields[i];
82 if (m_required[i]) {
83 if (!isPresent) {
Davide Pesaventof8503d22017-02-17 01:19:10 -050084 BOOST_THROW_EXCEPTION(ArgumentError(CONTROL_PARAMETER_FIELD[i] + " is required but missing"));
Junxiao Shi70911652014-08-12 10:14:24 -070085 }
86 }
87 else if (isPresent && !m_optional[i]) {
Davide Pesaventof8503d22017-02-17 01:19:10 -050088 BOOST_THROW_EXCEPTION(ArgumentError(CONTROL_PARAMETER_FIELD[i] + " is forbidden but present"));
Junxiao Shi70911652014-08-12 10:14:24 -070089 }
90 }
Junxiao Shi22f85682018-01-22 19:23:22 +000091
92 if (m_optional[CONTROL_PARAMETER_FLAGS] && m_optional[CONTROL_PARAMETER_MASK]) {
93 if (parameters.hasFlags() != parameters.hasMask()) {
94 BOOST_THROW_EXCEPTION(ArgumentError("Flags must be accompanied by Mask"));
95 }
96 }
Junxiao Shi70911652014-08-12 10:14:24 -070097}
98
99FaceCreateCommand::FaceCreateCommand()
100 : ControlCommand("faces", "create")
101{
102 m_requestValidator
Yukai Tud93c5fc2015-08-25 11:37:16 +0800103 .required(CONTROL_PARAMETER_URI)
Teng Liangf4908b12017-03-29 15:24:03 -0700104 .optional(CONTROL_PARAMETER_LOCAL_URI)
Eric Newberryda916d62016-08-11 23:04:34 -0700105 .optional(CONTROL_PARAMETER_FACE_PERSISTENCY)
Eric Newberry07d05c92018-01-22 16:08:01 -0700106 .optional(CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL)
107 .optional(CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD)
Eric Newberryda916d62016-08-11 23:04:34 -0700108 .optional(CONTROL_PARAMETER_FLAGS)
109 .optional(CONTROL_PARAMETER_MASK);
Junxiao Shi70911652014-08-12 10:14:24 -0700110 m_responseValidator
Yukai Tud93c5fc2015-08-25 11:37:16 +0800111 .required(CONTROL_PARAMETER_FACE_ID)
Junxiao Shi8c2ab2e2017-05-05 20:26:34 +0000112 .required(CONTROL_PARAMETER_URI)
113 .required(CONTROL_PARAMETER_LOCAL_URI)
Eric Newberryda916d62016-08-11 23:04:34 -0700114 .required(CONTROL_PARAMETER_FACE_PERSISTENCY)
Eric Newberryd567aab2018-01-27 16:38:24 -0700115 .optional(CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL)
116 .optional(CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD)
Junxiao Shi8c2ab2e2017-05-05 20:26:34 +0000117 .required(CONTROL_PARAMETER_FLAGS);
Yukai Tud93c5fc2015-08-25 11:37:16 +0800118}
119
120void
121FaceCreateCommand::applyDefaultsToRequest(ControlParameters& parameters) const
122{
123 if (!parameters.hasFacePersistency()) {
124 parameters.setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT);
125 }
Junxiao Shi70911652014-08-12 10:14:24 -0700126}
127
128void
129FaceCreateCommand::validateResponse(const ControlParameters& parameters) const
130{
131 this->ControlCommand::validateResponse(parameters);
132
Davide Pesaventof8503d22017-02-17 01:19:10 -0500133 if (parameters.getFaceId() == INVALID_FACE_ID) {
134 BOOST_THROW_EXCEPTION(ArgumentError("FaceId must be valid"));
Junxiao Shi70911652014-08-12 10:14:24 -0700135 }
136}
137
Yanbiao Licbdacb22016-08-02 16:02:35 +0800138FaceUpdateCommand::FaceUpdateCommand()
139 : ControlCommand("faces", "update")
140{
141 m_requestValidator
Eric Newberryda916d62016-08-11 23:04:34 -0700142 .optional(CONTROL_PARAMETER_FACE_ID)
143 .optional(CONTROL_PARAMETER_FACE_PERSISTENCY)
Eric Newberry07d05c92018-01-22 16:08:01 -0700144 .optional(CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL)
145 .optional(CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD)
Eric Newberryda916d62016-08-11 23:04:34 -0700146 .optional(CONTROL_PARAMETER_FLAGS)
147 .optional(CONTROL_PARAMETER_MASK);
Yanbiao Licbdacb22016-08-02 16:02:35 +0800148 m_responseValidator
Eric Newberry138ef2c2016-08-15 20:29:03 -0700149 .required(CONTROL_PARAMETER_FACE_ID)
150 .required(CONTROL_PARAMETER_FACE_PERSISTENCY)
Eric Newberryd567aab2018-01-27 16:38:24 -0700151 .optional(CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL)
152 .optional(CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD)
Eric Newberry138ef2c2016-08-15 20:29:03 -0700153 .required(CONTROL_PARAMETER_FLAGS);
Eric Newberryda916d62016-08-11 23:04:34 -0700154}
155
156void
157FaceUpdateCommand::applyDefaultsToRequest(ControlParameters& parameters) const
158{
Eric Newberry138ef2c2016-08-15 20:29:03 -0700159 if (!parameters.hasFaceId()) {
160 parameters.setFaceId(0);
161 }
Yanbiao Licbdacb22016-08-02 16:02:35 +0800162}
163
164void
Yanbiao Licbdacb22016-08-02 16:02:35 +0800165FaceUpdateCommand::validateResponse(const ControlParameters& parameters) const
166{
Eric Newberry138ef2c2016-08-15 20:29:03 -0700167 this->ControlCommand::validateResponse(parameters);
168
Davide Pesaventof8503d22017-02-17 01:19:10 -0500169 if (parameters.getFaceId() == INVALID_FACE_ID) {
170 BOOST_THROW_EXCEPTION(ArgumentError("FaceId must be valid"));
Eric Newberry138ef2c2016-08-15 20:29:03 -0700171 }
Yanbiao Licbdacb22016-08-02 16:02:35 +0800172}
173
Junxiao Shi70911652014-08-12 10:14:24 -0700174FaceDestroyCommand::FaceDestroyCommand()
175 : ControlCommand("faces", "destroy")
176{
177 m_requestValidator
178 .required(CONTROL_PARAMETER_FACE_ID);
179 m_responseValidator = m_requestValidator;
180}
181
182void
183FaceDestroyCommand::validateRequest(const ControlParameters& parameters) const
184{
185 this->ControlCommand::validateRequest(parameters);
186
Davide Pesaventof8503d22017-02-17 01:19:10 -0500187 if (parameters.getFaceId() == INVALID_FACE_ID) {
188 BOOST_THROW_EXCEPTION(ArgumentError("FaceId must be valid"));
Junxiao Shi70911652014-08-12 10:14:24 -0700189 }
190}
191
192void
193FaceDestroyCommand::validateResponse(const ControlParameters& parameters) const
194{
195 this->validateRequest(parameters);
196}
197
Junxiao Shi70911652014-08-12 10:14:24 -0700198FibAddNextHopCommand::FibAddNextHopCommand()
199 : ControlCommand("fib", "add-nexthop")
200{
201 m_requestValidator
202 .required(CONTROL_PARAMETER_NAME)
203 .optional(CONTROL_PARAMETER_FACE_ID)
204 .optional(CONTROL_PARAMETER_COST);
205 m_responseValidator
206 .required(CONTROL_PARAMETER_NAME)
207 .required(CONTROL_PARAMETER_FACE_ID)
208 .required(CONTROL_PARAMETER_COST);
209}
210
211void
212FibAddNextHopCommand::applyDefaultsToRequest(ControlParameters& parameters) const
213{
214 if (!parameters.hasFaceId()) {
215 parameters.setFaceId(0);
216 }
217 if (!parameters.hasCost()) {
218 parameters.setCost(0);
219 }
220}
221
222void
223FibAddNextHopCommand::validateResponse(const ControlParameters& parameters) const
224{
225 this->ControlCommand::validateResponse(parameters);
226
Davide Pesaventof8503d22017-02-17 01:19:10 -0500227 if (parameters.getFaceId() == INVALID_FACE_ID) {
228 BOOST_THROW_EXCEPTION(ArgumentError("FaceId must be valid"));
Junxiao Shi70911652014-08-12 10:14:24 -0700229 }
230}
231
232FibRemoveNextHopCommand::FibRemoveNextHopCommand()
233 : ControlCommand("fib", "remove-nexthop")
234{
235 m_requestValidator
236 .required(CONTROL_PARAMETER_NAME)
237 .optional(CONTROL_PARAMETER_FACE_ID);
238 m_responseValidator
239 .required(CONTROL_PARAMETER_NAME)
240 .required(CONTROL_PARAMETER_FACE_ID);
241}
242
243void
244FibRemoveNextHopCommand::applyDefaultsToRequest(ControlParameters& parameters) const
245{
246 if (!parameters.hasFaceId()) {
247 parameters.setFaceId(0);
248 }
249}
250
251void
252FibRemoveNextHopCommand::validateResponse(const ControlParameters& parameters) const
253{
254 this->ControlCommand::validateResponse(parameters);
255
Davide Pesaventof8503d22017-02-17 01:19:10 -0500256 if (parameters.getFaceId() == INVALID_FACE_ID) {
257 BOOST_THROW_EXCEPTION(ArgumentError("FaceId must be valid"));
Junxiao Shi70911652014-08-12 10:14:24 -0700258 }
259}
260
Junxiao Shi22f85682018-01-22 19:23:22 +0000261CsConfigCommand::CsConfigCommand()
262 : ControlCommand("cs", "config")
263{
264 m_requestValidator
265 .optional(CONTROL_PARAMETER_CAPACITY)
266 .optional(CONTROL_PARAMETER_FLAGS)
267 .optional(CONTROL_PARAMETER_MASK);
268 m_responseValidator
269 .required(CONTROL_PARAMETER_CAPACITY)
270 .required(CONTROL_PARAMETER_FLAGS);
271}
272
Junxiao Shidf505382018-03-04 13:40:44 +0000273CsEraseCommand::CsEraseCommand()
274 : ControlCommand("cs", "erase")
275{
276 m_requestValidator
277 .required(CONTROL_PARAMETER_NAME)
278 .optional(CONTROL_PARAMETER_N_CS_ENTRIES);
279 m_responseValidator
280 .required(CONTROL_PARAMETER_NAME)
281 .optional(CONTROL_PARAMETER_CAPACITY)
282 .required(CONTROL_PARAMETER_N_CS_ENTRIES);
283}
284
285void
286CsEraseCommand::validateRequest(const ControlParameters& parameters) const
287{
288 this->ControlCommand::validateRequest(parameters);
289
290 if (parameters.hasNCsEntries() && parameters.getNCsEntries() == 0) {
291 BOOST_THROW_EXCEPTION(ArgumentError("NCsEntries must be positive"));
292 }
293}
294
295void
296CsEraseCommand::validateResponse(const ControlParameters& parameters) const
297{
298 this->ControlCommand::validateResponse(parameters);
299
300 if (parameters.hasCapacity() && parameters.getCapacity() == 0) {
301 BOOST_THROW_EXCEPTION(ArgumentError("Capacity must be positive"));
302 }
303}
304
Junxiao Shi70911652014-08-12 10:14:24 -0700305StrategyChoiceSetCommand::StrategyChoiceSetCommand()
306 : ControlCommand("strategy-choice", "set")
307{
308 m_requestValidator
309 .required(CONTROL_PARAMETER_NAME)
310 .required(CONTROL_PARAMETER_STRATEGY);
311 m_responseValidator = m_requestValidator;
312}
313
314StrategyChoiceUnsetCommand::StrategyChoiceUnsetCommand()
315 : ControlCommand("strategy-choice", "unset")
316{
317 m_requestValidator
318 .required(CONTROL_PARAMETER_NAME);
319 m_responseValidator = m_requestValidator;
320}
321
322void
323StrategyChoiceUnsetCommand::validateRequest(const ControlParameters& parameters) const
324{
325 this->ControlCommand::validateRequest(parameters);
326
327 if (parameters.getName().size() == 0) {
Spyridon Mastorakis0d2ed2e2015-07-27 19:09:12 -0700328 BOOST_THROW_EXCEPTION(ArgumentError("Name must not be ndn:/"));
Junxiao Shi70911652014-08-12 10:14:24 -0700329 }
330}
331
332void
333StrategyChoiceUnsetCommand::validateResponse(const ControlParameters& parameters) const
334{
335 this->validateRequest(parameters);
336}
337
338RibRegisterCommand::RibRegisterCommand()
339 : ControlCommand("rib", "register")
340{
341 m_requestValidator
342 .required(CONTROL_PARAMETER_NAME)
343 .optional(CONTROL_PARAMETER_FACE_ID)
344 .optional(CONTROL_PARAMETER_ORIGIN)
345 .optional(CONTROL_PARAMETER_COST)
346 .optional(CONTROL_PARAMETER_FLAGS)
347 .optional(CONTROL_PARAMETER_EXPIRATION_PERIOD);
348 m_responseValidator
349 .required(CONTROL_PARAMETER_NAME)
350 .required(CONTROL_PARAMETER_FACE_ID)
351 .required(CONTROL_PARAMETER_ORIGIN)
352 .required(CONTROL_PARAMETER_COST)
353 .required(CONTROL_PARAMETER_FLAGS)
354 .optional(CONTROL_PARAMETER_EXPIRATION_PERIOD);
355}
356
357void
358RibRegisterCommand::applyDefaultsToRequest(ControlParameters& parameters) const
359{
360 if (!parameters.hasFaceId()) {
361 parameters.setFaceId(0);
362 }
363 if (!parameters.hasOrigin()) {
364 parameters.setOrigin(ROUTE_ORIGIN_APP);
365 }
366 if (!parameters.hasCost()) {
367 parameters.setCost(0);
368 }
369 if (!parameters.hasFlags()) {
370 parameters.setFlags(ROUTE_FLAG_CHILD_INHERIT);
371 }
372}
373
374void
375RibRegisterCommand::validateResponse(const ControlParameters& parameters) const
376{
377 this->ControlCommand::validateResponse(parameters);
378
Davide Pesaventof8503d22017-02-17 01:19:10 -0500379 if (parameters.getFaceId() == INVALID_FACE_ID) {
380 BOOST_THROW_EXCEPTION(ArgumentError("FaceId must be valid"));
Junxiao Shi70911652014-08-12 10:14:24 -0700381 }
382}
383
384RibUnregisterCommand::RibUnregisterCommand()
385 : ControlCommand("rib", "unregister")
386{
387 m_requestValidator
388 .required(CONTROL_PARAMETER_NAME)
389 .optional(CONTROL_PARAMETER_FACE_ID)
390 .optional(CONTROL_PARAMETER_ORIGIN);
391 m_responseValidator
392 .required(CONTROL_PARAMETER_NAME)
393 .required(CONTROL_PARAMETER_FACE_ID)
394 .required(CONTROL_PARAMETER_ORIGIN);
395}
396
397void
398RibUnregisterCommand::applyDefaultsToRequest(ControlParameters& parameters) const
399{
400 if (!parameters.hasFaceId()) {
401 parameters.setFaceId(0);
402 }
403 if (!parameters.hasOrigin()) {
404 parameters.setOrigin(ROUTE_ORIGIN_APP);
405 }
406}
407
408void
409RibUnregisterCommand::validateResponse(const ControlParameters& parameters) const
410{
411 this->ControlCommand::validateResponse(parameters);
412
Davide Pesaventof8503d22017-02-17 01:19:10 -0500413 if (parameters.getFaceId() == INVALID_FACE_ID) {
414 BOOST_THROW_EXCEPTION(ArgumentError("FaceId must be valid"));
Junxiao Shi70911652014-08-12 10:14:24 -0700415 }
416}
417
418} // namespace nfd
419} // namespace ndn