blob: c5c8f205a4ffe34e7b65d45757298937e9901c24 [file] [log] [blame]
Andrew Brown2f1fdbf2015-01-21 10:52:29 -08001/*
andrewsbrown7e6b9e82015-03-03 16:11:11 -08002 * jndn-management
3 * Copyright (c) 2015, Intel Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU Lesser General Public License,
7 * version 3, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT ANY
10 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
12 * more details.
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080013 */
14package com.intel.jndn.management;
15
Andrew Brownc46c1602015-02-18 10:45:56 -080016import com.intel.jndn.management.types.StatusDataset;
17import com.intel.jndn.management.types.ControlResponse;
18import com.intel.jndn.management.types.FaceStatus;
Andrew Brown63bed362015-02-18 11:28:50 -080019import com.intel.jndn.management.types.FibEntry;
andrewsbrown8a32f302015-03-24 08:42:46 -070020import com.intel.jndn.management.types.ForwarderStatus;
andrewsbrowne8e8e852015-03-09 13:48:31 -070021import com.intel.jndn.management.types.LocalControlHeader;
Andrew Brownc46c1602015-02-18 10:45:56 -080022import com.intel.jndn.management.types.RibEntry;
andrewsbrown43b96302015-03-17 21:51:43 +010023import com.intel.jndn.utils.SimpleClient;
Andrew Brown07466442015-02-24 09:07:02 -080024import com.intel.jndn.utils.SegmentedClient;
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080025import java.io.IOException;
26import java.util.List;
27import net.named_data.jndn.ControlParameters;
28import net.named_data.jndn.Data;
29import net.named_data.jndn.Face;
30import net.named_data.jndn.ForwardingFlags;
31import net.named_data.jndn.Interest;
32import net.named_data.jndn.Name;
33import net.named_data.jndn.encoding.EncodingException;
34import net.named_data.jndn.security.SecurityException;
Andrew Brownc46c1602015-02-18 10:45:56 -080035import java.util.logging.Logger;
Andrew Brownc5dda702015-04-13 09:36:04 -070036import net.named_data.jndn.KeyLocator;
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080037
38/**
39 * Helper class for interacting with an NDN forwarder daemon; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -070040 * <a href="http://redmine.named-data.net/projects/nfd/wiki/Management">http://redmine.named-data.net/projects/nfd/wiki/Management</a>
41 * for explanations of the various protocols used.
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080042 *
43 * @author Andrew Brown <andrew.brown@intel.com>
44 */
45public class NFD {
46
Andrew Brown211d2b62015-02-18 11:12:02 -080047 public final static long DEFAULT_TIMEOUT = 2000;
andrewsbrown43b96302015-03-17 21:51:43 +010048 public final static int OK_STATUS = 200;
Andrew Brown211d2b62015-02-18 11:12:02 -080049 static private final Logger logger = Logger.getLogger(NFD.class.getName());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080050
Andrew Brown211d2b62015-02-18 11:12:02 -080051 /**
52 * Ping a forwarder on an existing face to verify that the forwarder is
53 * working and responding to requests; this version sends a discovery packet
54 * to /localhost/nfd which should always respond if the requestor is on the
55 * same machine as the NDN forwarding daemon.
56 *
andrewsbrown8a32f302015-03-24 08:42:46 -070057 * @param face only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -080058 * @return true if successful, false otherwise
59 */
60 public static boolean pingLocal(Face face) {
61 return ping(face, new Name("/localhost/nfd"));
62 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080063
Andrew Brown211d2b62015-02-18 11:12:02 -080064 /**
65 * Request a name on an existing face to verify the forwarder is working and
66 * responding to requests. Note that the name must be served or cached on the
67 * forwarder for this to return true.
68 *
69 * @param face
70 * @param name
71 * @return true if successful, false otherwise
72 */
73 public static boolean ping(Face face, Name name) {
74 // build interest
75 Interest interest = new Interest(name);
76 interest.setInterestLifetimeMilliseconds(DEFAULT_TIMEOUT);
77 interest.setMustBeFresh(true);
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080078
Andrew Brown211d2b62015-02-18 11:12:02 -080079 // send packet
andrewsbrown43b96302015-03-17 21:51:43 +010080 try {
81 Data data = SimpleClient.getDefault().getSync(face, interest);
82 return data != null;
83 } catch (IOException e) {
84 return false;
85 }
Andrew Brown211d2b62015-02-18 11:12:02 -080086 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080087
Andrew Brown211d2b62015-02-18 11:12:02 -080088 /**
andrewsbrown8a32f302015-03-24 08:42:46 -070089 * Retrieve the status of the given forwarder; calls /localhost/nfd/status
90 * which requires a local Face (all non-local packets are dropped)
91 *
92 * @param forwarder only a localhost Face
93 * @return the forwarder status object, see
Andrew Browndfa8fc12015-03-25 10:46:47 -070094 * <a href="http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus">
95 * http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus</a>.
andrewsbrown8a32f302015-03-24 08:42:46 -070096 * @throws java.lang.Exception
97 */
98 public static ForwarderStatus getForwarderStatus(Face forwarder) throws Exception {
Andrew Brownc5dda702015-04-13 09:36:04 -070099 Data data = retrieveStatus(forwarder);
andrewsbrown8a32f302015-03-24 08:42:46 -0700100 ForwarderStatus status = new ForwarderStatus();
101 status.wireDecode(data.getContent().buf());
102 return status;
103 }
104
105 /**
Andrew Brown211d2b62015-02-18 11:12:02 -0800106 * Retrieve a list of faces and their status from the given forwarder; calls
107 * /localhost/nfd/faces/list which requires a local Face (all non-local
108 * packets are dropped)
109 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700110 * @param forwarder only a localhost Face
111 * @return a list of face status objects, see
112 * http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt.
andrewsbrown43b96302015-03-17 21:51:43 +0100113 * @throws java.lang.Exception
Andrew Brown211d2b62015-02-18 11:12:02 -0800114 */
115 public static List<FaceStatus> getFaceList(Face forwarder) throws Exception {
andrewsbrown43b96302015-03-17 21:51:43 +0100116 Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/faces/list"));
Andrew Brown211d2b62015-02-18 11:12:02 -0800117 return StatusDataset.wireDecode(data.getContent(), FaceStatus.class);
118 }
Andrew Brownc46c1602015-02-18 10:45:56 -0800119
Andrew Brown211d2b62015-02-18 11:12:02 -0800120 /**
Andrew Brown63bed362015-02-18 11:28:50 -0800121 * Retrieve a list of FIB entries and their NextHopRecords from the given
122 * forwarder; calls /localhost/nfd/fib/list which requires a local Face (all
123 * non-local packets are dropped).
124 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700125 * @param forwarder only a localhost Face
126 * @return a list of FIB entries, see
127 * http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset.
andrewsbrown43b96302015-03-17 21:51:43 +0100128 * @throws java.lang.Exception
Andrew Brown63bed362015-02-18 11:28:50 -0800129 */
130 public static List<FibEntry> getFibList(Face forwarder) throws Exception {
andrewsbrown43b96302015-03-17 21:51:43 +0100131 Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/fib/list"));
Andrew Brown63bed362015-02-18 11:28:50 -0800132 return StatusDataset.wireDecode(data.getContent(), FibEntry.class);
133 }
134
135 /**
Andrew Brown211d2b62015-02-18 11:12:02 -0800136 * Retrieve a list of routing entries from the RIB; calls
137 * /localhost/nfd/rib/list which requires a local Face (all non-local packets
andrewsbrown43b96302015-03-17 21:51:43 +0100138 * are dropped).
Andrew Brown211d2b62015-02-18 11:12:02 -0800139 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700140 * @param forwarder only a localhost Face
141 * @return a list of RIB entries, i.e. routes, see
142 * http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset.
andrewsbrown43b96302015-03-17 21:51:43 +0100143 * @throws java.lang.Exception
Andrew Brown211d2b62015-02-18 11:12:02 -0800144 */
145 public static List<RibEntry> getRouteList(Face forwarder) throws Exception {
andrewsbrown43b96302015-03-17 21:51:43 +0100146 Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/rib/list"));
Andrew Brown211d2b62015-02-18 11:12:02 -0800147 return StatusDataset.wireDecode(data.getContent(), RibEntry.class);
148 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800149
Andrew Brown211d2b62015-02-18 11:12:02 -0800150 /**
Andrew Brownc5dda702015-04-13 09:36:04 -0700151 * Retrieve the {@link KeyLocator} for an NFD.
152 *
153 * @param forwarder only a localhost {@link Face}
154 * @return the {@link KeyLocator} of the NFD's key
155 * @throws ManagementException if the key is not available
156 * @throws IOException if the request fails
157 */
158 public static KeyLocator getKeyLocator(Face forwarder) throws ManagementException, IOException {
159 Data data = retrieveStatus(forwarder);
160 if (!KeyLocator.canGetFromSignature(data.getSignature())) {
161 throw new ManagementException("No key locator available.");
162 }
163 return KeyLocator.getFromSignature(data.getSignature());
164 }
165
166 /**
Andrew Brown211d2b62015-02-18 11:12:02 -0800167 * Helper method to register a new face on the forwarder; as mentioned at
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700168 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>,
169 * this is more for debugging; use 'register' instead
Andrew Brown211d2b62015-02-18 11:12:02 -0800170 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700171 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800172 * @param faceId
173 * @param prefix
andrewsbrown43b96302015-03-17 21:51:43 +0100174 * @throws java.lang.Exception
Andrew Brown211d2b62015-02-18 11:12:02 -0800175 */
andrewsbrown43b96302015-03-17 21:51:43 +0100176 public static void addNextHop(Face forwarder, int faceId, Name prefix) throws Exception {
Andrew Brown211d2b62015-02-18 11:12:02 -0800177 // build command name
178 Name command = new Name("/localhost/nfd/fib/add-nexthop");
179 ControlParameters parameters = new ControlParameters();
180 parameters.setName(prefix);
181 parameters.setFaceId(faceId);
182 command.append(parameters.wireEncode());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800183
Andrew Brown211d2b62015-02-18 11:12:02 -0800184 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100185 sendCommand(forwarder, new Interest(command));
Andrew Brown211d2b62015-02-18 11:12:02 -0800186 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800187
Andrew Brown211d2b62015-02-18 11:12:02 -0800188 /**
189 * Create a new face on the given forwarder. Ensure the forwarding face is on
190 * the local machine (management requests are to /localhost/...) and that
191 * command signing has been set up (e.g. forwarder.setCommandSigningInfo()).
192 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700193 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800194 * @param uri
195 * @return
196 * @throws java.lang.Exception
197 */
198 public static int createFace(Face forwarder, String uri) throws Exception {
199 Name command = new Name("/localhost/nfd/faces/create");
200 ControlParameters parameters = new ControlParameters();
201 parameters.setUri(uri);
202 command.append(parameters.wireEncode());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800203
Andrew Brown211d2b62015-02-18 11:12:02 -0800204 // send the interest
205 ControlResponse response = sendCommand(forwarder, new Interest(command));
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800206
Andrew Brown211d2b62015-02-18 11:12:02 -0800207 // return
208 return response.getBody().get(0).getFaceId();
209 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800210
Andrew Brown211d2b62015-02-18 11:12:02 -0800211 /**
andrewsbrown43b96302015-03-17 21:51:43 +0100212 * Destroy a face on given forwarder. Ensure the forwarding face is on the
213 * local machine (management requests are to /localhost/...) and that command
214 * signing has been set up (e.g. forwarder.setCommandSigningInfo()).
Alexander Afanasyev75d8dfc2015-03-13 16:41:01 -0700215 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700216 * @param forwarder only a localhost Face
Alexander Afanasyev75d8dfc2015-03-13 16:41:01 -0700217 * @param faceId
218 * @throws java.lang.Exception
219 */
andrewsbrown43b96302015-03-17 21:51:43 +0100220 public static void destroyFace(Face forwarder, int faceId) throws Exception {
Alexander Afanasyev75d8dfc2015-03-13 16:41:01 -0700221 Name command = new Name("/localhost/nfd/faces/destroy");
222 ControlParameters parameters = new ControlParameters();
223 parameters.setFaceId(faceId);
224 command.append(parameters.wireEncode());
225
226 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100227 sendCommand(forwarder, new Interest(command));
Alexander Afanasyev75d8dfc2015-03-13 16:41:01 -0700228 }
229
230 /**
andrewsbrowne8e8e852015-03-09 13:48:31 -0700231 * Enable a local control feature on the given forwarder. See
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700232 * <a href="http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature">http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature</a>
andrewsbrowne8e8e852015-03-09 13:48:31 -0700233 *
234 * @param forwarder
235 * @param header
andrewsbrowne8e8e852015-03-09 13:48:31 -0700236 * @throws Exception
237 */
andrewsbrown43b96302015-03-17 21:51:43 +0100238 public static void enableLocalControlHeader(Face forwarder, LocalControlHeader header) throws Exception {
andrewsbrowne8e8e852015-03-09 13:48:31 -0700239 // build command name
240 Name command = new Name("/localhost/nfd/faces/enable-local-control");
241 ControlParameters parameters = new ControlParameters();
242 parameters.setLocalControlFeature(header.getNumericValue());
243 command.append(parameters.wireEncode());
244
245 // send command and return
andrewsbrown43b96302015-03-17 21:51:43 +0100246 sendCommand(forwarder, new Interest(command));
andrewsbrowne8e8e852015-03-09 13:48:31 -0700247 }
248
249 /**
250 * Disable a local control feature on the given forwarder. See
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700251 * <a href="http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature">http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature</a>
andrewsbrowne8e8e852015-03-09 13:48:31 -0700252 *
253 * @param forwarder
254 * @param header
andrewsbrowne8e8e852015-03-09 13:48:31 -0700255 * @throws Exception
256 */
andrewsbrown43b96302015-03-17 21:51:43 +0100257 public static void disableLocalControlHeader(Face forwarder, LocalControlHeader header) throws Exception {
andrewsbrowne8e8e852015-03-09 13:48:31 -0700258 // build command name
259 Name command = new Name("/localhost/nfd/faces/disable-local-control");
260 ControlParameters parameters = new ControlParameters();
261 parameters.setLocalControlFeature(header.getNumericValue());
262 command.append(parameters.wireEncode());
263
264 // send command and return
andrewsbrown43b96302015-03-17 21:51:43 +0100265 sendCommand(forwarder, new Interest(command));
andrewsbrowne8e8e852015-03-09 13:48:31 -0700266 }
267
268 /**
Andrew Brown211d2b62015-02-18 11:12:02 -0800269 * Register a route on the forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700270 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
271 * for command-line usage and
272 * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
273 * for protocol documentation. Ensure the forwarding face is on the local
274 * machine (management requests are to /localhost/...) and that command
275 * signing has been set up (e.g. forwarder.setCommandSigningInfo()).
Andrew Brown211d2b62015-02-18 11:12:02 -0800276 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700277 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800278 * @param controlParameters
Andrew Brown211d2b62015-02-18 11:12:02 -0800279 * @throws Exception
280 */
andrewsbrown43b96302015-03-17 21:51:43 +0100281 public static void register(Face forwarder, ControlParameters controlParameters) throws Exception {
Andrew Brown211d2b62015-02-18 11:12:02 -0800282 // build command name
283 Name command = new Name("/localhost/nfd/rib/register");
284 command.append(controlParameters.wireEncode());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800285
Andrew Brown211d2b62015-02-18 11:12:02 -0800286 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100287 sendCommand(forwarder, new Interest(command));
Andrew Brown211d2b62015-02-18 11:12:02 -0800288 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800289
Andrew Brown211d2b62015-02-18 11:12:02 -0800290 /**
291 * Register a route on a forwarder; this will create a new face on the
292 * forwarder to the given URI/route pair. See register(Face,
293 * ControlParameters) for more details documentation.
294 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700295 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800296 * @param uri
297 * @param cost
298 * @param route
Andrew Brown211d2b62015-02-18 11:12:02 -0800299 * @throws java.lang.Exception
300 */
andrewsbrown43b96302015-03-17 21:51:43 +0100301 public static void register(Face forwarder, String uri, Name route, int cost) throws Exception {
Andrew Brown211d2b62015-02-18 11:12:02 -0800302 // create the new face
303 int faceId = createFace(forwarder, uri);
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800304
Andrew Brown211d2b62015-02-18 11:12:02 -0800305 // run base method
andrewsbrown43b96302015-03-17 21:51:43 +0100306 register(forwarder, faceId, route, cost);
Andrew Brown211d2b62015-02-18 11:12:02 -0800307 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800308
Andrew Brown211d2b62015-02-18 11:12:02 -0800309 /**
310 * Register a route on a forwarder; this will not create a new face since it
311 * is provided a faceId. See register(Face, ControlParameters) for full
312 * documentation
313 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700314 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800315 * @param faceId
316 * @param route
317 * @param cost
Andrew Brown211d2b62015-02-18 11:12:02 -0800318 * @throws java.lang.Exception
319 */
andrewsbrown43b96302015-03-17 21:51:43 +0100320 public static void register(Face forwarder, int faceId, Name route, int cost) throws Exception {
Andrew Brown211d2b62015-02-18 11:12:02 -0800321 // build command name
322 ControlParameters parameters = new ControlParameters();
323 parameters.setName(route);
324 parameters.setFaceId(faceId);
325 parameters.setCost(cost);
326 ForwardingFlags flags = new ForwardingFlags();
327 flags.setCapture(true);
328 flags.setChildInherit(true);
329 parameters.setForwardingFlags(flags);
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800330
Andrew Brown211d2b62015-02-18 11:12:02 -0800331 // run base method
andrewsbrown43b96302015-03-17 21:51:43 +0100332 register(forwarder, parameters);
Andrew Brown211d2b62015-02-18 11:12:02 -0800333 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800334
Andrew Brown211d2b62015-02-18 11:12:02 -0800335 /**
Andrew Brown63bed362015-02-18 11:28:50 -0800336 * Unregister a route on a forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700337 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
338 * for command-line usage and
339 * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
340 * for protocol documentation. Ensure the forwarding face is on the local
341 * machine (management requests are to /localhost/...) and that command
342 * signing has been set up (e.g. forwarder.setCommandSigningInfo()
Andrew Brown63bed362015-02-18 11:28:50 -0800343 *
344 * @param forwarder
Andrew Brown07466442015-02-24 09:07:02 -0800345 * @param controlParameters
andrewsbrown43b96302015-03-17 21:51:43 +0100346 * @throws java.lang.Exception
Andrew Brown63bed362015-02-18 11:28:50 -0800347 */
andrewsbrown43b96302015-03-17 21:51:43 +0100348 public static void unregister(Face forwarder, ControlParameters controlParameters) throws Exception {
Andrew Brown63bed362015-02-18 11:28:50 -0800349 // build command name
350 Name command = new Name("/localhost/nfd/rib/unregister");
351 command.append(controlParameters.wireEncode());
352
353 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100354 sendCommand(forwarder, new Interest(command));
Andrew Brown63bed362015-02-18 11:28:50 -0800355 }
356
357 /**
Andrew Brown07466442015-02-24 09:07:02 -0800358 * Unregister a route on a forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700359 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
360 * for command-line usage and
361 * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
362 * for protocol documentation. Ensure the forwarding face is on the local
363 * machine (management requests are to /localhost/...) and that command
364 * signing has been set up (e.g. forwarder.setCommandSigningInfo()
Andrew Brown07466442015-02-24 09:07:02 -0800365 *
366 * @param forwarder
367 * @param route
andrewsbrown43b96302015-03-17 21:51:43 +0100368 * @throws java.lang.Exception
Andrew Brown07466442015-02-24 09:07:02 -0800369 */
andrewsbrown43b96302015-03-17 21:51:43 +0100370 public static void unregister(Face forwarder, Name route) throws Exception {
Andrew Brown07466442015-02-24 09:07:02 -0800371 // build command name
372 ControlParameters controlParameters = new ControlParameters();
373 controlParameters.setName(route);
374
375 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100376 unregister(forwarder, controlParameters);
Andrew Brown07466442015-02-24 09:07:02 -0800377 }
378
379 /**
380 * Unregister a route on a forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700381 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
382 * for command-line usage and
383 * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
384 * for protocol documentation. Ensure the forwarding face is on the local
385 * machine (management requests are to /localhost/...) and that command
386 * signing has been set up (e.g. forwarder.setCommandSigningInfo()
Andrew Brown07466442015-02-24 09:07:02 -0800387 *
388 * @param forwarder
389 * @param route
390 * @param faceId
andrewsbrown43b96302015-03-17 21:51:43 +0100391 * @throws java.lang.Exception
Andrew Brown07466442015-02-24 09:07:02 -0800392 */
andrewsbrown43b96302015-03-17 21:51:43 +0100393 public static void unregister(Face forwarder, Name route, int faceId) throws Exception {
Andrew Brown07466442015-02-24 09:07:02 -0800394 // build command name
395 ControlParameters controlParameters = new ControlParameters();
396 controlParameters.setName(route);
397 controlParameters.setFaceId(faceId);
398
399 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100400 unregister(forwarder, controlParameters);
Andrew Brown07466442015-02-24 09:07:02 -0800401 }
402
403 /**
404 * Unregister a route on a forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700405 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
406 * for command-line usage and
407 * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
408 * for protocol documentation. Ensure the forwarding face is on the local
409 * machine (management requests are to /localhost/...) and that command
410 * signing has been set up (e.g. forwarder.setCommandSigningInfo()
Andrew Brown07466442015-02-24 09:07:02 -0800411 *
412 * @param forwarder
413 * @param route
414 * @param uri
andrewsbrown43b96302015-03-17 21:51:43 +0100415 * @throws java.lang.Exception
Andrew Brown07466442015-02-24 09:07:02 -0800416 */
andrewsbrown43b96302015-03-17 21:51:43 +0100417 public static void unregister(Face forwarder, Name route, String uri) throws Exception {
Andrew Brown07466442015-02-24 09:07:02 -0800418 int faceId = -1;
andrewsbrown4c21ea22015-03-09 12:05:03 -0700419 for (FaceStatus face : getFaceList(forwarder)) {
420 if (face.getUri().matches(uri)) {
Andrew Brown07466442015-02-24 09:07:02 -0800421 faceId = face.getFaceId();
422 break;
423 }
424 }
andrewsbrown4c21ea22015-03-09 12:05:03 -0700425
426 if (faceId == -1) {
andrewsbrown43b96302015-03-17 21:51:43 +0100427 throw new ManagementException("Face not found: " + uri);
Andrew Brown07466442015-02-24 09:07:02 -0800428 }
429
430 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100431 unregister(forwarder, route, faceId);
Andrew Brown07466442015-02-24 09:07:02 -0800432 }
433
434 /**
Andrew Brown211d2b62015-02-18 11:12:02 -0800435 * Set a strategy on the forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700436 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
437 * for command-line usage and
438 * <a href="http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice">http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice</a>
Andrew Brown211d2b62015-02-18 11:12:02 -0800439 * for protocol documentation. Ensure the forwarding face is on the local
440 * machine (management requests are to /localhost/...) and that command
441 * signing has been set up (e.g. forwarder.setCommandSigningInfo()).
442 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700443 * @param forwarder only a localhost Face
andrewsbrowncad04eb2015-05-11 13:16:24 -0700444 * @param prefix the {@link Name} prefix
445 * @param strategy the {@link Name} of the strategy to set, e.g. /localhost/nfd/strategy/broadcast
446 * @throws Exception if the command fails
Andrew Brown211d2b62015-02-18 11:12:02 -0800447 */
andrewsbrown43b96302015-03-17 21:51:43 +0100448 public static void setStrategy(Face forwarder, Name prefix, Name strategy) throws Exception {
Andrew Brown211d2b62015-02-18 11:12:02 -0800449 // build command name
450 Name command = new Name("/localhost/nfd/strategy-choice/set");
451 ControlParameters parameters = new ControlParameters();
452 parameters.setName(prefix);
453 parameters.setStrategy(strategy);
454 command.append(parameters.wireEncode());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800455
Andrew Brown211d2b62015-02-18 11:12:02 -0800456 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100457 sendCommand(forwarder, new Interest(command));
458 }
459
460 /**
andrewsbrowncad04eb2015-05-11 13:16:24 -0700461 * Set a strategy on the forwarder; see
462 * {@link #setStrategy(net.named_data.jndn.Face, net.named_data.jndn.Name, net.named_data.jndn.Name)}
463 * for more information. Ensure the forwarding face is on the local machine
464 * (management requests are to /localhost/...) and that command signing has
465 * been set up (e.g. forwarder.setCommandSigningInfo()).
466 *
467 * @param forwarder only a localhost {@link Face}
468 * @param prefix the {@link Name} prefix
469 * @throws Exception if the command fails
470 */
471 public static void unsetStrategy(Face forwarder, Name prefix) throws Exception {
472 // build command name
473 Name command = new Name("/localhost/nfd/strategy-choice/unsetset");
474 ControlParameters parameters = new ControlParameters();
475 parameters.setName(prefix);
476 command.append(parameters.wireEncode());
477
478 // send the interest
479 sendCommand(forwarder, new Interest(command));
480 }
481
482 /**
Andrew Brownc5dda702015-04-13 09:36:04 -0700483 * Build an interest to retrieve the NFD status.
484 *
485 * @param forwarder only a localhost {@link Face}
486 * @return the status {@link Data} packet
487 * @throws IOException if the retrieval fails
488 */
489 private static Data retrieveStatus(Face forwarder) throws IOException {
490 Interest interest = new Interest(new Name("/localhost/nfd/status"));
491 interest.setMustBeFresh(true);
492 interest.setChildSelector(Interest.CHILD_SELECTOR_RIGHT);
493 interest.setInterestLifetimeMilliseconds(DEFAULT_TIMEOUT);
494 Data data = SimpleClient.getDefault().getSync(forwarder, interest);
495 return data;
496 }
497
498 /**
andrewsbrown43b96302015-03-17 21:51:43 +0100499 * Build an interest to retrieve a segmented data set from the NFD; for
500 * details on the DataSet, see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700501 * <a href="http://redmine.named-data.net/projects/nfd/wiki/StatusDataset">http://redmine.named-data.net/projects/nfd/wiki/StatusDataset</a>
andrewsbrown43b96302015-03-17 21:51:43 +0100502 *
Andrew Brownc5dda702015-04-13 09:36:04 -0700503 * @param forwarder the {@link Face} to an NFD
504 * @param datasetName the {@link Name} of the dataset to retrieve
505 * @return the re-assembled {@link Data} packet
506 * @throws IOException if the request fails
507 * @throws ManagementException if the returned TLV is not the expected type
andrewsbrown43b96302015-03-17 21:51:43 +0100508 */
509 public static Data retrieveDataSet(Face forwarder, Name datasetName) throws IOException, ManagementException {
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700510 // build management Interest packet; see <a href="http://redmine.named-data.net/projects/nfd/wiki/StatusDataset">http://redmine.named-data.net/projects/nfd/wiki/StatusDataset</a>
Andrew Brown0e904e12015-03-17 14:10:29 -0700511 Interest interest = new Interest(datasetName);
andrewsbrown43b96302015-03-17 21:51:43 +0100512 interest.setMustBeFresh(true);
513 interest.setChildSelector(Interest.CHILD_SELECTOR_RIGHT);
514 interest.setInterestLifetimeMilliseconds(DEFAULT_TIMEOUT);
515
516 // send packet
517 Data data = SegmentedClient.getDefault().getSync(forwarder, interest);
518
519 // check for failed request
520 if (data.getContent().buf().get(0) == ControlResponse.TLV_CONTROL_RESPONSE) {
521 throw ManagementException.fromResponse(data.getContent());
522 }
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700523
andrewsbrown43b96302015-03-17 21:51:43 +0100524 return data;
Andrew Brown211d2b62015-02-18 11:12:02 -0800525 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800526
Andrew Brown211d2b62015-02-18 11:12:02 -0800527 /**
528 * Send an interest as a command to the forwarder; this method will convert
529 * the interest to a command interest and block until a response is received
530 * from the forwarder. Ensure the forwarding face is on the local machine
531 * (management requests are to /localhost/...) and that command signing has
532 * been set up (e.g. forwarder.setCommandSigningInfo()).
533 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700534 * @param forwarder only a localhost Face, command signing info must be set
Andrew Brown211d2b62015-02-18 11:12:02 -0800535 * @param interest As described at
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700536 * <a href="http://redmine.named-data.net/projects/nfd/wiki/ControlCommand,">http://redmine.named-data.net/projects/nfd/wiki/ControlCommand,</a>
537 * the requested interest must have encoded ControlParameters appended to the
Andrew Brown211d2b62015-02-18 11:12:02 -0800538 * interest name
Andrew Brownc5dda702015-04-13 09:36:04 -0700539 * @return a {@link ControlResponse}
Andrew Brown211d2b62015-02-18 11:12:02 -0800540 * @throws java.io.IOException
541 * @throws net.named_data.jndn.encoding.EncodingException
andrewsbrown43b96302015-03-17 21:51:43 +0100542 * @throws com.intel.jndn.management.ManagementException
Andrew Brown211d2b62015-02-18 11:12:02 -0800543 */
andrewsbrown43b96302015-03-17 21:51:43 +0100544 public static ControlResponse sendCommand(Face forwarder, Interest interest) throws IOException, EncodingException, ManagementException {
545 // forwarder must have command signing info set
546 try {
547 forwarder.makeCommandInterest(interest);
548 } catch (SecurityException e) {
549 throw new IllegalArgumentException("Failed to make command interest; ensure command signing info is set on the face.", e);
550 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800551
Andrew Brown211d2b62015-02-18 11:12:02 -0800552 // send command packet
andrewsbrown43b96302015-03-17 21:51:43 +0100553 Data data = SimpleClient.getDefault().getSync(forwarder, interest);
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800554
andrewsbrown43b96302015-03-17 21:51:43 +0100555 // decode response
Andrew Brown211d2b62015-02-18 11:12:02 -0800556 ControlResponse response = new ControlResponse();
557 response.wireDecode(data.getContent().buf());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800558
andrewsbrown43b96302015-03-17 21:51:43 +0100559 // check response for success
560 if (response.getStatusCode() != OK_STATUS) {
561 throw ManagementException.fromResponse(response);
Andrew Brown211d2b62015-02-18 11:12:02 -0800562 }
andrewsbrown43b96302015-03-17 21:51:43 +0100563
564 return response;
Andrew Brown211d2b62015-02-18 11:12:02 -0800565 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800566}