blob: 381291dffdf1c04b9a534a339554937d1d88554a [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 Brown2f1fdbf2015-01-21 10:52:29 -080036
37/**
38 * Helper class for interacting with an NDN forwarder daemon; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -070039 * <a href="http://redmine.named-data.net/projects/nfd/wiki/Management">http://redmine.named-data.net/projects/nfd/wiki/Management</a>
40 * for explanations of the various protocols used.
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080041 *
42 * @author Andrew Brown <andrew.brown@intel.com>
43 */
44public class NFD {
45
Andrew Brown211d2b62015-02-18 11:12:02 -080046 public final static long DEFAULT_TIMEOUT = 2000;
andrewsbrown43b96302015-03-17 21:51:43 +010047 public final static int OK_STATUS = 200;
Andrew Brown211d2b62015-02-18 11:12:02 -080048 static private final Logger logger = Logger.getLogger(NFD.class.getName());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080049
Andrew Brown211d2b62015-02-18 11:12:02 -080050 /**
51 * Ping a forwarder on an existing face to verify that the forwarder is
52 * working and responding to requests; this version sends a discovery packet
53 * to /localhost/nfd which should always respond if the requestor is on the
54 * same machine as the NDN forwarding daemon.
55 *
andrewsbrown8a32f302015-03-24 08:42:46 -070056 * @param face only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -080057 * @return true if successful, false otherwise
58 */
59 public static boolean pingLocal(Face face) {
60 return ping(face, new Name("/localhost/nfd"));
61 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080062
Andrew Brown211d2b62015-02-18 11:12:02 -080063 /**
64 * Request a name on an existing face to verify the forwarder is working and
65 * responding to requests. Note that the name must be served or cached on the
66 * forwarder for this to return true.
67 *
68 * @param face
69 * @param name
70 * @return true if successful, false otherwise
71 */
72 public static boolean ping(Face face, Name name) {
73 // build interest
74 Interest interest = new Interest(name);
75 interest.setInterestLifetimeMilliseconds(DEFAULT_TIMEOUT);
76 interest.setMustBeFresh(true);
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080077
Andrew Brown211d2b62015-02-18 11:12:02 -080078 // send packet
andrewsbrown43b96302015-03-17 21:51:43 +010079 try {
80 Data data = SimpleClient.getDefault().getSync(face, interest);
81 return data != null;
82 } catch (IOException e) {
83 return false;
84 }
Andrew Brown211d2b62015-02-18 11:12:02 -080085 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -080086
Andrew Brown211d2b62015-02-18 11:12:02 -080087 /**
andrewsbrown8a32f302015-03-24 08:42:46 -070088 * Retrieve the status of the given forwarder; calls /localhost/nfd/status
89 * which requires a local Face (all non-local packets are dropped)
90 *
91 * @param forwarder only a localhost Face
92 * @return the forwarder status object, see
Andrew Browndfa8fc12015-03-25 10:46:47 -070093 * <a href="http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus">
94 * http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus</a>.
andrewsbrown8a32f302015-03-24 08:42:46 -070095 * @throws java.lang.Exception
96 */
97 public static ForwarderStatus getForwarderStatus(Face forwarder) throws Exception {
Andrew Browndfa8fc12015-03-25 10:46:47 -070098 Interest interest = new Interest(new Name("/localhost/nfd/status"));
99 interest.setMustBeFresh(true);
100 interest.setChildSelector(Interest.CHILD_SELECTOR_RIGHT);
101 interest.setInterestLifetimeMilliseconds(DEFAULT_TIMEOUT);
102
103 Data data = SimpleClient.getDefault().getSync(forwarder, interest);
andrewsbrown8a32f302015-03-24 08:42:46 -0700104 ForwarderStatus status = new ForwarderStatus();
105 status.wireDecode(data.getContent().buf());
106 return status;
107 }
108
109 /**
Andrew Brown211d2b62015-02-18 11:12:02 -0800110 * Retrieve a list of faces and their status from the given forwarder; calls
111 * /localhost/nfd/faces/list which requires a local Face (all non-local
112 * packets are dropped)
113 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700114 * @param forwarder only a localhost Face
115 * @return a list of face status objects, see
116 * http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt.
andrewsbrown43b96302015-03-17 21:51:43 +0100117 * @throws java.lang.Exception
Andrew Brown211d2b62015-02-18 11:12:02 -0800118 */
119 public static List<FaceStatus> getFaceList(Face forwarder) throws Exception {
andrewsbrown43b96302015-03-17 21:51:43 +0100120 Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/faces/list"));
Andrew Brown211d2b62015-02-18 11:12:02 -0800121 return StatusDataset.wireDecode(data.getContent(), FaceStatus.class);
122 }
Andrew Brownc46c1602015-02-18 10:45:56 -0800123
Andrew Brown211d2b62015-02-18 11:12:02 -0800124 /**
Andrew Brown63bed362015-02-18 11:28:50 -0800125 * Retrieve a list of FIB entries and their NextHopRecords from the given
126 * forwarder; calls /localhost/nfd/fib/list which requires a local Face (all
127 * non-local packets are dropped).
128 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700129 * @param forwarder only a localhost Face
130 * @return a list of FIB entries, see
131 * http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset.
andrewsbrown43b96302015-03-17 21:51:43 +0100132 * @throws java.lang.Exception
Andrew Brown63bed362015-02-18 11:28:50 -0800133 */
134 public static List<FibEntry> getFibList(Face forwarder) throws Exception {
andrewsbrown43b96302015-03-17 21:51:43 +0100135 Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/fib/list"));
Andrew Brown63bed362015-02-18 11:28:50 -0800136 return StatusDataset.wireDecode(data.getContent(), FibEntry.class);
137 }
138
139 /**
Andrew Brown211d2b62015-02-18 11:12:02 -0800140 * Retrieve a list of routing entries from the RIB; calls
141 * /localhost/nfd/rib/list which requires a local Face (all non-local packets
andrewsbrown43b96302015-03-17 21:51:43 +0100142 * are dropped).
Andrew Brown211d2b62015-02-18 11:12:02 -0800143 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700144 * @param forwarder only a localhost Face
145 * @return a list of RIB entries, i.e. routes, see
146 * http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset.
andrewsbrown43b96302015-03-17 21:51:43 +0100147 * @throws java.lang.Exception
Andrew Brown211d2b62015-02-18 11:12:02 -0800148 */
149 public static List<RibEntry> getRouteList(Face forwarder) throws Exception {
andrewsbrown43b96302015-03-17 21:51:43 +0100150 Data data = retrieveDataSet(forwarder, new Name("/localhost/nfd/rib/list"));
Andrew Brown211d2b62015-02-18 11:12:02 -0800151 return StatusDataset.wireDecode(data.getContent(), RibEntry.class);
152 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800153
Andrew Brown211d2b62015-02-18 11:12:02 -0800154 /**
155 * Helper method to register a new face on the forwarder; as mentioned at
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700156 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>,
157 * this is more for debugging; use 'register' instead
Andrew Brown211d2b62015-02-18 11:12:02 -0800158 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700159 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800160 * @param faceId
161 * @param prefix
andrewsbrown43b96302015-03-17 21:51:43 +0100162 * @throws java.lang.Exception
Andrew Brown211d2b62015-02-18 11:12:02 -0800163 */
andrewsbrown43b96302015-03-17 21:51:43 +0100164 public static void addNextHop(Face forwarder, int faceId, Name prefix) throws Exception {
Andrew Brown211d2b62015-02-18 11:12:02 -0800165 // build command name
166 Name command = new Name("/localhost/nfd/fib/add-nexthop");
167 ControlParameters parameters = new ControlParameters();
168 parameters.setName(prefix);
169 parameters.setFaceId(faceId);
170 command.append(parameters.wireEncode());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800171
Andrew Brown211d2b62015-02-18 11:12:02 -0800172 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100173 sendCommand(forwarder, new Interest(command));
Andrew Brown211d2b62015-02-18 11:12:02 -0800174 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800175
Andrew Brown211d2b62015-02-18 11:12:02 -0800176 /**
177 * Create a new face on the given forwarder. Ensure the forwarding face is on
178 * the local machine (management requests are to /localhost/...) and that
179 * command signing has been set up (e.g. forwarder.setCommandSigningInfo()).
180 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700181 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800182 * @param uri
183 * @return
184 * @throws java.lang.Exception
185 */
186 public static int createFace(Face forwarder, String uri) throws Exception {
187 Name command = new Name("/localhost/nfd/faces/create");
188 ControlParameters parameters = new ControlParameters();
189 parameters.setUri(uri);
190 command.append(parameters.wireEncode());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800191
Andrew Brown211d2b62015-02-18 11:12:02 -0800192 // send the interest
193 ControlResponse response = sendCommand(forwarder, new Interest(command));
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800194
Andrew Brown211d2b62015-02-18 11:12:02 -0800195 // return
196 return response.getBody().get(0).getFaceId();
197 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800198
Andrew Brown211d2b62015-02-18 11:12:02 -0800199 /**
andrewsbrown43b96302015-03-17 21:51:43 +0100200 * Destroy a face on given forwarder. Ensure the forwarding face is on the
201 * local machine (management requests are to /localhost/...) and that command
202 * signing has been set up (e.g. forwarder.setCommandSigningInfo()).
Alexander Afanasyev75d8dfc2015-03-13 16:41:01 -0700203 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700204 * @param forwarder only a localhost Face
Alexander Afanasyev75d8dfc2015-03-13 16:41:01 -0700205 * @param faceId
206 * @throws java.lang.Exception
207 */
andrewsbrown43b96302015-03-17 21:51:43 +0100208 public static void destroyFace(Face forwarder, int faceId) throws Exception {
Alexander Afanasyev75d8dfc2015-03-13 16:41:01 -0700209 Name command = new Name("/localhost/nfd/faces/destroy");
210 ControlParameters parameters = new ControlParameters();
211 parameters.setFaceId(faceId);
212 command.append(parameters.wireEncode());
213
214 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100215 sendCommand(forwarder, new Interest(command));
Alexander Afanasyev75d8dfc2015-03-13 16:41:01 -0700216 }
217
218 /**
andrewsbrowne8e8e852015-03-09 13:48:31 -0700219 * Enable a local control feature on the given forwarder. See
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700220 * <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 -0700221 *
222 * @param forwarder
223 * @param header
andrewsbrowne8e8e852015-03-09 13:48:31 -0700224 * @throws Exception
225 */
andrewsbrown43b96302015-03-17 21:51:43 +0100226 public static void enableLocalControlHeader(Face forwarder, LocalControlHeader header) throws Exception {
andrewsbrowne8e8e852015-03-09 13:48:31 -0700227 // build command name
228 Name command = new Name("/localhost/nfd/faces/enable-local-control");
229 ControlParameters parameters = new ControlParameters();
230 parameters.setLocalControlFeature(header.getNumericValue());
231 command.append(parameters.wireEncode());
232
233 // send command and return
andrewsbrown43b96302015-03-17 21:51:43 +0100234 sendCommand(forwarder, new Interest(command));
andrewsbrowne8e8e852015-03-09 13:48:31 -0700235 }
236
237 /**
238 * Disable a local control feature on the given forwarder. See
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700239 * <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 -0700240 *
241 * @param forwarder
242 * @param header
andrewsbrowne8e8e852015-03-09 13:48:31 -0700243 * @throws Exception
244 */
andrewsbrown43b96302015-03-17 21:51:43 +0100245 public static void disableLocalControlHeader(Face forwarder, LocalControlHeader header) throws Exception {
andrewsbrowne8e8e852015-03-09 13:48:31 -0700246 // build command name
247 Name command = new Name("/localhost/nfd/faces/disable-local-control");
248 ControlParameters parameters = new ControlParameters();
249 parameters.setLocalControlFeature(header.getNumericValue());
250 command.append(parameters.wireEncode());
251
252 // send command and return
andrewsbrown43b96302015-03-17 21:51:43 +0100253 sendCommand(forwarder, new Interest(command));
andrewsbrowne8e8e852015-03-09 13:48:31 -0700254 }
255
256 /**
Andrew Brown211d2b62015-02-18 11:12:02 -0800257 * Register a route on the forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700258 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
259 * for command-line usage and
260 * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
261 * for protocol documentation. Ensure the forwarding face is on the local
262 * machine (management requests are to /localhost/...) and that command
263 * signing has been set up (e.g. forwarder.setCommandSigningInfo()).
Andrew Brown211d2b62015-02-18 11:12:02 -0800264 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700265 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800266 * @param controlParameters
Andrew Brown211d2b62015-02-18 11:12:02 -0800267 * @throws Exception
268 */
andrewsbrown43b96302015-03-17 21:51:43 +0100269 public static void register(Face forwarder, ControlParameters controlParameters) throws Exception {
Andrew Brown211d2b62015-02-18 11:12:02 -0800270 // build command name
271 Name command = new Name("/localhost/nfd/rib/register");
272 command.append(controlParameters.wireEncode());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800273
Andrew Brown211d2b62015-02-18 11:12:02 -0800274 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100275 sendCommand(forwarder, new Interest(command));
Andrew Brown211d2b62015-02-18 11:12:02 -0800276 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800277
Andrew Brown211d2b62015-02-18 11:12:02 -0800278 /**
279 * Register a route on a forwarder; this will create a new face on the
280 * forwarder to the given URI/route pair. See register(Face,
281 * ControlParameters) for more details documentation.
282 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700283 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800284 * @param uri
285 * @param cost
286 * @param route
Andrew Brown211d2b62015-02-18 11:12:02 -0800287 * @throws java.lang.Exception
288 */
andrewsbrown43b96302015-03-17 21:51:43 +0100289 public static void register(Face forwarder, String uri, Name route, int cost) throws Exception {
Andrew Brown211d2b62015-02-18 11:12:02 -0800290 // create the new face
291 int faceId = createFace(forwarder, uri);
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800292
Andrew Brown211d2b62015-02-18 11:12:02 -0800293 // run base method
andrewsbrown43b96302015-03-17 21:51:43 +0100294 register(forwarder, faceId, route, cost);
Andrew Brown211d2b62015-02-18 11:12:02 -0800295 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800296
Andrew Brown211d2b62015-02-18 11:12:02 -0800297 /**
298 * Register a route on a forwarder; this will not create a new face since it
299 * is provided a faceId. See register(Face, ControlParameters) for full
300 * documentation
301 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700302 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800303 * @param faceId
304 * @param route
305 * @param cost
Andrew Brown211d2b62015-02-18 11:12:02 -0800306 * @throws java.lang.Exception
307 */
andrewsbrown43b96302015-03-17 21:51:43 +0100308 public static void register(Face forwarder, int faceId, Name route, int cost) throws Exception {
Andrew Brown211d2b62015-02-18 11:12:02 -0800309 // build command name
310 ControlParameters parameters = new ControlParameters();
311 parameters.setName(route);
312 parameters.setFaceId(faceId);
313 parameters.setCost(cost);
314 ForwardingFlags flags = new ForwardingFlags();
315 flags.setCapture(true);
316 flags.setChildInherit(true);
317 parameters.setForwardingFlags(flags);
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800318
Andrew Brown211d2b62015-02-18 11:12:02 -0800319 // run base method
andrewsbrown43b96302015-03-17 21:51:43 +0100320 register(forwarder, parameters);
Andrew Brown211d2b62015-02-18 11:12:02 -0800321 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800322
Andrew Brown211d2b62015-02-18 11:12:02 -0800323 /**
Andrew Brown63bed362015-02-18 11:28:50 -0800324 * Unregister a route on a forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700325 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
326 * for command-line usage and
327 * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
328 * for protocol documentation. Ensure the forwarding face is on the local
329 * machine (management requests are to /localhost/...) and that command
330 * signing has been set up (e.g. forwarder.setCommandSigningInfo()
Andrew Brown63bed362015-02-18 11:28:50 -0800331 *
332 * @param forwarder
Andrew Brown07466442015-02-24 09:07:02 -0800333 * @param controlParameters
andrewsbrown43b96302015-03-17 21:51:43 +0100334 * @throws java.lang.Exception
Andrew Brown63bed362015-02-18 11:28:50 -0800335 */
andrewsbrown43b96302015-03-17 21:51:43 +0100336 public static void unregister(Face forwarder, ControlParameters controlParameters) throws Exception {
Andrew Brown63bed362015-02-18 11:28:50 -0800337 // build command name
338 Name command = new Name("/localhost/nfd/rib/unregister");
339 command.append(controlParameters.wireEncode());
340
341 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100342 sendCommand(forwarder, new Interest(command));
Andrew Brown63bed362015-02-18 11:28:50 -0800343 }
344
345 /**
Andrew Brown07466442015-02-24 09:07:02 -0800346 * Unregister a route on a forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700347 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
348 * for command-line usage and
349 * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
350 * for protocol documentation. Ensure the forwarding face is on the local
351 * machine (management requests are to /localhost/...) and that command
352 * signing has been set up (e.g. forwarder.setCommandSigningInfo()
Andrew Brown07466442015-02-24 09:07:02 -0800353 *
354 * @param forwarder
355 * @param route
andrewsbrown43b96302015-03-17 21:51:43 +0100356 * @throws java.lang.Exception
Andrew Brown07466442015-02-24 09:07:02 -0800357 */
andrewsbrown43b96302015-03-17 21:51:43 +0100358 public static void unregister(Face forwarder, Name route) throws Exception {
Andrew Brown07466442015-02-24 09:07:02 -0800359 // build command name
360 ControlParameters controlParameters = new ControlParameters();
361 controlParameters.setName(route);
362
363 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100364 unregister(forwarder, controlParameters);
Andrew Brown07466442015-02-24 09:07:02 -0800365 }
366
367 /**
368 * Unregister a route on a forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700369 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
370 * for command-line usage and
371 * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
372 * for protocol documentation. Ensure the forwarding face is on the local
373 * machine (management requests are to /localhost/...) and that command
374 * signing has been set up (e.g. forwarder.setCommandSigningInfo()
Andrew Brown07466442015-02-24 09:07:02 -0800375 *
376 * @param forwarder
377 * @param route
378 * @param faceId
andrewsbrown43b96302015-03-17 21:51:43 +0100379 * @throws java.lang.Exception
Andrew Brown07466442015-02-24 09:07:02 -0800380 */
andrewsbrown43b96302015-03-17 21:51:43 +0100381 public static void unregister(Face forwarder, Name route, int faceId) throws Exception {
Andrew Brown07466442015-02-24 09:07:02 -0800382 // build command name
383 ControlParameters controlParameters = new ControlParameters();
384 controlParameters.setName(route);
385 controlParameters.setFaceId(faceId);
386
387 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100388 unregister(forwarder, controlParameters);
Andrew Brown07466442015-02-24 09:07:02 -0800389 }
390
391 /**
392 * Unregister a route on a forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700393 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
394 * for command-line usage and
395 * <a href="http://redmine.named-data.net/projects/nfd/wiki/RibMgmt">http://redmine.named-data.net/projects/nfd/wiki/RibMgmt</a>
396 * for protocol documentation. Ensure the forwarding face is on the local
397 * machine (management requests are to /localhost/...) and that command
398 * signing has been set up (e.g. forwarder.setCommandSigningInfo()
Andrew Brown07466442015-02-24 09:07:02 -0800399 *
400 * @param forwarder
401 * @param route
402 * @param uri
andrewsbrown43b96302015-03-17 21:51:43 +0100403 * @throws java.lang.Exception
Andrew Brown07466442015-02-24 09:07:02 -0800404 */
andrewsbrown43b96302015-03-17 21:51:43 +0100405 public static void unregister(Face forwarder, Name route, String uri) throws Exception {
Andrew Brown07466442015-02-24 09:07:02 -0800406 int faceId = -1;
andrewsbrown4c21ea22015-03-09 12:05:03 -0700407 for (FaceStatus face : getFaceList(forwarder)) {
408 if (face.getUri().matches(uri)) {
Andrew Brown07466442015-02-24 09:07:02 -0800409 faceId = face.getFaceId();
410 break;
411 }
412 }
andrewsbrown4c21ea22015-03-09 12:05:03 -0700413
414 if (faceId == -1) {
andrewsbrown43b96302015-03-17 21:51:43 +0100415 throw new ManagementException("Face not found: " + uri);
Andrew Brown07466442015-02-24 09:07:02 -0800416 }
417
418 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100419 unregister(forwarder, route, faceId);
Andrew Brown07466442015-02-24 09:07:02 -0800420 }
421
422 /**
Andrew Brown211d2b62015-02-18 11:12:02 -0800423 * Set a strategy on the forwarder; see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700424 * <a href="http://named-data.net/doc/NFD/current/manpages/nfdc.html">http://named-data.net/doc/NFD/current/manpages/nfdc.html</a>
425 * for command-line usage and
426 * <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 -0800427 * for protocol documentation. Ensure the forwarding face is on the local
428 * machine (management requests are to /localhost/...) and that command
429 * signing has been set up (e.g. forwarder.setCommandSigningInfo()).
430 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700431 * @param forwarder only a localhost Face
Andrew Brown211d2b62015-02-18 11:12:02 -0800432 * @param prefix
433 * @param strategy
Andrew Brown211d2b62015-02-18 11:12:02 -0800434 * @throws Exception
435 */
andrewsbrown43b96302015-03-17 21:51:43 +0100436 public static void setStrategy(Face forwarder, Name prefix, Name strategy) throws Exception {
Andrew Brown211d2b62015-02-18 11:12:02 -0800437 // build command name
438 Name command = new Name("/localhost/nfd/strategy-choice/set");
439 ControlParameters parameters = new ControlParameters();
440 parameters.setName(prefix);
441 parameters.setStrategy(strategy);
442 command.append(parameters.wireEncode());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800443
Andrew Brown211d2b62015-02-18 11:12:02 -0800444 // send the interest
andrewsbrown43b96302015-03-17 21:51:43 +0100445 sendCommand(forwarder, new Interest(command));
446 }
447
448 /**
449 * Build an interest to retrieve a segmented data set from the NFD; for
450 * details on the DataSet, see
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700451 * <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 +0100452 *
453 * @param forwarder
454 * @param datasetName
455 * @return
456 * @throws IOException
457 * @throws ManagementException
458 */
459 public static Data retrieveDataSet(Face forwarder, Name datasetName) throws IOException, ManagementException {
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700460 // 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 -0700461 Interest interest = new Interest(datasetName);
andrewsbrown43b96302015-03-17 21:51:43 +0100462 interest.setMustBeFresh(true);
463 interest.setChildSelector(Interest.CHILD_SELECTOR_RIGHT);
464 interest.setInterestLifetimeMilliseconds(DEFAULT_TIMEOUT);
465
466 // send packet
467 Data data = SegmentedClient.getDefault().getSync(forwarder, interest);
468
469 // check for failed request
470 if (data.getContent().buf().get(0) == ControlResponse.TLV_CONTROL_RESPONSE) {
471 throw ManagementException.fromResponse(data.getContent());
472 }
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700473
andrewsbrown43b96302015-03-17 21:51:43 +0100474 return data;
Andrew Brown211d2b62015-02-18 11:12:02 -0800475 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800476
Andrew Brown211d2b62015-02-18 11:12:02 -0800477 /**
478 * Send an interest as a command to the forwarder; this method will convert
479 * the interest to a command interest and block until a response is received
480 * from the forwarder. Ensure the forwarding face is on the local machine
481 * (management requests are to /localhost/...) and that command signing has
482 * been set up (e.g. forwarder.setCommandSigningInfo()).
483 *
andrewsbrown8a32f302015-03-24 08:42:46 -0700484 * @param forwarder only a localhost Face, command signing info must be set
Andrew Brown211d2b62015-02-18 11:12:02 -0800485 * @param interest As described at
andrewsbrown9a6d7ba2015-03-24 09:53:29 -0700486 * <a href="http://redmine.named-data.net/projects/nfd/wiki/ControlCommand,">http://redmine.named-data.net/projects/nfd/wiki/ControlCommand,</a>
487 * the requested interest must have encoded ControlParameters appended to the
Andrew Brown211d2b62015-02-18 11:12:02 -0800488 * interest name
489 * @return
Andrew Brown211d2b62015-02-18 11:12:02 -0800490 * @throws java.io.IOException
491 * @throws net.named_data.jndn.encoding.EncodingException
andrewsbrown43b96302015-03-17 21:51:43 +0100492 * @throws com.intel.jndn.management.ManagementException
Andrew Brown211d2b62015-02-18 11:12:02 -0800493 */
andrewsbrown43b96302015-03-17 21:51:43 +0100494 public static ControlResponse sendCommand(Face forwarder, Interest interest) throws IOException, EncodingException, ManagementException {
495 // forwarder must have command signing info set
496 try {
497 forwarder.makeCommandInterest(interest);
498 } catch (SecurityException e) {
499 throw new IllegalArgumentException("Failed to make command interest; ensure command signing info is set on the face.", e);
500 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800501
Andrew Brown211d2b62015-02-18 11:12:02 -0800502 // send command packet
andrewsbrown43b96302015-03-17 21:51:43 +0100503 Data data = SimpleClient.getDefault().getSync(forwarder, interest);
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800504
andrewsbrown43b96302015-03-17 21:51:43 +0100505 // decode response
Andrew Brown211d2b62015-02-18 11:12:02 -0800506 ControlResponse response = new ControlResponse();
507 response.wireDecode(data.getContent().buf());
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800508
andrewsbrown43b96302015-03-17 21:51:43 +0100509 // check response for success
510 if (response.getStatusCode() != OK_STATUS) {
511 throw ManagementException.fromResponse(response);
Andrew Brown211d2b62015-02-18 11:12:02 -0800512 }
andrewsbrown43b96302015-03-17 21:51:43 +0100513
514 return response;
Andrew Brown211d2b62015-02-18 11:12:02 -0800515 }
Andrew Brown2f1fdbf2015-01-21 10:52:29 -0800516}