blob: 011c5e11e212be283f38f81f492e45af705d70d9 [file] [log] [blame]
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/**
3 * Copyright (C) 2014 University of Arizona.
4 *
5 * GNU 3.0 License, see the LICENSE file for more information
6 *
7 * Author: Jerald Paul Abraham <jeraldabraham@email.arizona.edu>
8 */
9
10#include <string>
11#include <sstream>
12#include <fstream>
13#include <vector>
14
15#include "logger.hpp"
16
17#include <boost/asio.hpp>
18#include <boost/filesystem.hpp>
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070019#include <boost/lexical_cast.hpp>
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080020#include <boost/date_time/posix_time/posix_time.hpp>
21
22#include <ndn-cpp-dev/face.hpp>
23#include <ndn-cpp-dev/exclude.hpp>
24#include <ndn-cpp-dev/name-component.hpp>
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080025
26namespace ndn {
27
28class NdnTrafficClient
29{
30public:
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070031
32 explicit
Alexander Afanasyevfda32a32014-03-20 10:50:00 -070033 NdnTrafficClient(char* programName)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070034 : m_programName(programName)
35 , m_logger("NdnTrafficClient")
36 , m_hasError(false)
37 , m_ioService(new boost::asio::io_service)
38 , m_face(m_ioService)
39 , m_interestInterval(getDefaultInterestInterval())
40 , m_nMaximumInterests(-1)
41 , m_nInterestsSent(0)
42 , m_nInterestsReceived(0)
jeraldabrahamdbfee2e2014-04-04 01:18:14 -070043 , m_nContentInconsistencies(0)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070044 , m_minimumInterestRoundTripTime(std::numeric_limits<double>::max())
45 , m_maximumInterestRoundTripTime(0)
46 , m_totalInterestRoundTripTime(0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080047 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070048 m_instanceId = boost::lexical_cast<std::string>(std::rand());
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080049 }
50
51 class InterestTrafficConfiguration
52 {
53 public:
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080054 InterestTrafficConfiguration()
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070055 : m_trafficPercentage(-1)
56 , m_nameAppendBytes(-1)
57 , m_nameAppendSequenceNumber(-1)
58 , m_minSuffixComponents(-1)
59 , m_maxSuffixComponents(-1)
60 , m_excludeBeforeBytes(-1)
61 , m_excludeAfterBytes(-1)
62 , m_childSelector(-1)
63 , m_mustBeFresh(-1)
64 , m_nonceDuplicationPercentage(-1)
65 , m_scope(-1)
66 , m_interestLifetime(getDefaultInterestLifetime())
jeraldabrahamdbfee2e2014-04-04 01:18:14 -070067 , m_nInterestsSent(0)
68 , m_nInterestsReceived(0)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070069 , m_minimumInterestRoundTripTime(std::numeric_limits<double>::max())
70 , m_maximumInterestRoundTripTime(0)
71 , m_totalInterestRoundTripTime(0)
72 , m_nContentInconsistencies(0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080073 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070074 }
75
76 time::milliseconds
77 getDefaultInterestLifetime()
78 {
79 return time::milliseconds(-1);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080080 }
81
82 void
Alexander Afanasyevfda32a32014-03-20 10:50:00 -070083 printTrafficConfiguration(Logger& logger)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080084 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070085 std::string detail = "";
86 if (m_trafficPercentage > 0)
87 detail += "TrafficPercentage=" +
88 boost::lexical_cast<std::string>(m_trafficPercentage) + ", ";
89 if (m_name != "")
90 detail += "Name=" + m_name + ", ";
91 if (m_nameAppendBytes > 0)
92 detail += "NameAppendBytes=" + boost::lexical_cast<std::string>(m_nameAppendBytes) + ", ";
93 if (m_nameAppendSequenceNumber > 0)
94 detail += "NameAppendSequenceNumber=" +
95 boost::lexical_cast<std::string>(m_nameAppendSequenceNumber) + ", ";
96 if (m_minSuffixComponents >= 0)
97 detail += "MinSuffixComponents=" +
98 boost::lexical_cast<std::string>(m_minSuffixComponents) + ", ";
99 if (m_maxSuffixComponents >= 0)
100 detail += "MaxSuffixComponents=" +
101 boost::lexical_cast<std::string>(m_maxSuffixComponents) + ", ";
102 if (m_excludeBefore != "")
103 detail += "ExcludeBefore=" + m_excludeBefore + ", ";
104 if (m_excludeAfter != "")
105 detail += "ExcludeAfter=" + m_excludeAfter + ", ";
106 if (m_excludeBeforeBytes > 0)
107 detail += "ExcludeBeforeBytes=" +
108 boost::lexical_cast<std::string>(m_excludeBeforeBytes) + ", ";
109 if (m_excludeAfterBytes > 0)
110 detail += "ExcludeAfterBytes=" +
111 boost::lexical_cast<std::string>(m_excludeAfterBytes) + ", ";
112 if (m_childSelector >= 0)
113 detail += "ChildSelector=" +
114 boost::lexical_cast<std::string>(m_childSelector) + ", ";
115 if (m_mustBeFresh >= 0)
116 detail += "MustBeFresh=" +
117 boost::lexical_cast<std::string>(m_mustBeFresh) + ", ";
118 if (m_nonceDuplicationPercentage > 0)
119 detail += "NonceDuplicationPercentage=" +
120 boost::lexical_cast<std::string>(m_nonceDuplicationPercentage) + ", ";
121 if (m_scope >= 0)
122 detail += "Scope="+boost::lexical_cast<std::string>(m_scope) + ", ";
123 if (m_interestLifetime >= time::milliseconds(0))
124 detail += "InterestLifetime=" +
125 boost::lexical_cast<std::string>(m_interestLifetime.count()) + ", ";
126 if (m_expectedContent != "")
127 detail += "ExpectedContent=" + m_expectedContent + ", ";
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800128 if (detail.length() >= 2)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700129 detail = detail.substr(0, detail.length() - 2); //Removing suffix ", "
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800130 logger.log(detail, false, false);
131 }
132
133 bool
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700134 extractParameterValue(const std::string& detail,
135 std::string& parameter,
136 std::string& value)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800137 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800138 std::string allowedCharacters = ":/+._-%";
139 parameter = "";
140 value = "";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700141 int i = 0;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800142 while (detail[i] != '=' && i < detail.length())
143 {
144 parameter += detail[i];
145 i++;
146 }
147 if (i == detail.length())
148 return false;
149 i++;
jeraldabraham79c0c232014-03-31 21:43:59 -0700150 while ((std::isalnum(detail[i]) ||
151 allowedCharacters.find(detail[i]) != std::string::npos) &&
152 i < detail.length())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800153 {
154 value += detail[i];
155 i++;
156 }
jeraldabraham79c0c232014-03-31 21:43:59 -0700157 if (parameter == "" || value == "")
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800158 return false;
159 return true;
160 }
161
162 bool
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700163 processConfigurationDetail(const std::string& detail, Logger& logger, int lineNumber)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800164 {
165 std::string parameter, value;
166 if (extractParameterValue(detail, parameter, value))
167 {
168 if (parameter == "TrafficPercentage")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700169 m_trafficPercentage = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800170 else if (parameter == "Name")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700171 m_name = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800172 else if (parameter == "NameAppendBytes")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700173 m_nameAppendBytes = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800174 else if (parameter == "NameAppendSequenceNumber")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700175 m_nameAppendSequenceNumber = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800176 else if (parameter == "MinSuffixComponents")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700177 m_minSuffixComponents = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800178 else if (parameter == "MaxSuffixComponents")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700179 m_maxSuffixComponents = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800180 else if (parameter == "ExcludeBefore")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700181 m_excludeBefore = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800182 else if (parameter == "ExcludeAfter")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700183 m_excludeAfter = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800184 else if (parameter == "ExcludeBeforeBytes")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700185 m_excludeBeforeBytes = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800186 else if (parameter == "ExcludeAfterBytes")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700187 m_excludeAfterBytes = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800188 else if (parameter == "ChildSelector")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700189 m_childSelector = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800190 else if (parameter == "MustBeFresh")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700191 m_mustBeFresh = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800192 else if (parameter == "NonceDuplicationPercentage")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700193 m_nonceDuplicationPercentage = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800194 else if (parameter == "Scope")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700195 m_scope = boost::lexical_cast<int>(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800196 else if (parameter == "InterestLifetime")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700197 m_interestLifetime = time::milliseconds(boost::lexical_cast<int>(value));
jeraldabraham473ef3d2014-03-06 12:40:35 -0700198 else if (parameter == "ExpectedContent")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700199 m_expectedContent = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800200 else
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700201 logger.log("Line " + boost::lexical_cast<std::string>(lineNumber) +
202 " \t- Invalid Parameter='" + parameter + "'", false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800203 }
204 else
205 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700206 logger.log("Line " + boost::lexical_cast<std::string>(lineNumber) +
207 " \t- Improper Traffic Configuration Line- " + detail, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800208 return false;
209 }
210 return true;
211 }
212
213 bool
214 checkTrafficDetailCorrectness()
215 {
216 return true;
217 }
218
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700219 int m_trafficPercentage;
220 std::string m_name;
221 int m_nameAppendBytes;
222 int m_nameAppendSequenceNumber;
223 int m_minSuffixComponents;
224 int m_maxSuffixComponents;
225 std::string m_excludeBefore;
226 std::string m_excludeAfter;
227 int m_excludeBeforeBytes;
228 int m_excludeAfterBytes;
229 int m_childSelector;
230 int m_mustBeFresh;
231 int m_nonceDuplicationPercentage;
232 int m_scope;
233 time::milliseconds m_interestLifetime;
234 int m_nInterestsSent;
235 int m_nInterestsReceived;
236
237 //round trip time is stored as milliseconds with fractional
238 //sub-millisecond precision
239 double m_minimumInterestRoundTripTime;
240 double m_maximumInterestRoundTripTime;
241 double m_totalInterestRoundTripTime;
242
243 int m_nContentInconsistencies;
244 std::string m_expectedContent;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700245 }; // class InterestTrafficConfiguration
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800246
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700247 bool
248 hasError() const
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800249 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700250 return m_hasError;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800251 }
252
253 void
254 usage()
255 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700256 std::cout << "\nUsage: " << m_programName << " [options] <Traffic_Configuration_File>\n"
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800257 "Generate Interest Traffic as per provided Traffic Configuration File\n"
258 "Interests are continuously generated unless a total number is specified.\n"
259 "Set environment variable NDN_TRAFFIC_LOGFOLDER for redirecting output to a log.\n"
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700260 " [-i interval] - set interest generation interval in milliseconds (default "
261 << getDefaultInterestInterval() << ")\n"
262 " [-c count] - set total number of interests to be generated\n"
263 " [-h] - print help and exit\n\n";
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800264 exit(1);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800265 }
266
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700267 time::milliseconds
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800268 getDefaultInterestInterval()
269 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700270 return time::milliseconds(1000);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800271 }
272
273 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700274 setInterestInterval(int interestInterval)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800275 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700276 if (interestInterval <= 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800277 usage();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700278 m_interestInterval = time::milliseconds(interestInterval);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800279 }
280
281 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700282 setMaximumInterests(int maximumInterests)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800283 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700284 if (maximumInterests <= 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800285 usage();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700286 m_nMaximumInterests = maximumInterests;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800287 }
288
289 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700290 setConfigurationFile(char* configurationFile)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800291 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700292 m_configurationFile = configurationFile;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800293 }
294
295 void
296 signalHandler()
297 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800298 logStatistics();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700299 m_logger.shutdownLogger();
300 m_face.shutdown();
301 m_ioService->stop();
302 if (m_hasError)
303 exit(1);
304 else
305 exit(0);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800306 }
307
308 void
309 logStatistics()
310 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800311 m_logger.log("\n\n== Interest Traffic Report ==\n", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700312 m_logger.log("Total Traffic Pattern Types = " +
313 boost::lexical_cast<std::string>(static_cast<int>(m_trafficPatterns.size())), false, true);
314 m_logger.log("Total Interests Sent = " +
315 boost::lexical_cast<std::string>(m_nInterestsSent), false, true);
316 m_logger.log("Total Responses Received = " +
317 boost::lexical_cast<std::string>(m_nInterestsReceived), false, true);
318 double loss = 0;
319 if (m_nInterestsSent > 0)
320 loss = (m_nInterestsSent - m_nInterestsReceived) * 100.0 / m_nInterestsSent;
321 m_logger.log("Total Interest Loss = " +
322 boost::lexical_cast<std::string>(loss) + "%", false, true);
323 if (m_nContentInconsistencies != 0 || m_nInterestsSent != m_nInterestsReceived)
324 m_hasError = true;
325 double average = 0;
326 double inconsistency = 0;
327 if (m_nInterestsReceived > 0)
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700328 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700329 average = m_totalInterestRoundTripTime / m_nInterestsReceived;
330 inconsistency = m_nContentInconsistencies * 100.0 / m_nInterestsReceived;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700331 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700332 m_logger.log("Total Data Inconsistency = " +
333 boost::lexical_cast<std::string>(inconsistency) + "%", false, true);
334 m_logger.log("Total Round Trip Time = " +
335 boost::lexical_cast<std::string>(m_totalInterestRoundTripTime) + "ms", false, true);
336 m_logger.log("Average Round Trip Time = " +
337 boost::lexical_cast<std::string>(average) + "ms\n", false, true);
338
339 for (int patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700340 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700341 m_logger.log("Traffic Pattern Type #" +
342 boost::lexical_cast<std::string>(patternId + 1), false, true);
343 m_trafficPatterns[patternId].printTrafficConfiguration(m_logger);
344 m_logger.log("Total Interests Sent = " +
345 boost::lexical_cast<std::string>(
346 m_trafficPatterns[patternId].m_nInterestsSent), false, true);
347 m_logger.log("Total Responses Received = " +
348 boost::lexical_cast<std::string>(
349 m_trafficPatterns[patternId].m_nInterestsReceived), false, true);
350 loss = 0;
351 if (m_trafficPatterns[patternId].m_nInterestsSent > 0)
352 {
353 loss = (m_trafficPatterns[patternId].m_nInterestsSent -
354 m_trafficPatterns[patternId].m_nInterestsReceived);
355 loss *= 100.0;
356 loss /= m_trafficPatterns[patternId].m_nInterestsSent;
357 }
358 m_logger.log("Total Interest Loss = " +
359 boost::lexical_cast<std::string>(loss) + "%", false, true);
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700360 average = 0;
361 inconsistency = 0;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700362 if (m_trafficPatterns[patternId].m_nInterestsReceived > 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800363 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700364 average = (m_trafficPatterns[patternId].m_totalInterestRoundTripTime /
365 m_trafficPatterns[patternId].m_nInterestsReceived);
366 inconsistency = m_trafficPatterns[patternId].m_nContentInconsistencies;
367 inconsistency =
368 inconsistency * 100.0 / m_trafficPatterns[patternId].m_nInterestsReceived;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800369 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700370 m_logger.log("Total Data Inconsistency = " +
371 boost::lexical_cast<std::string>(inconsistency) + "%", false, true);
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700372 m_logger.log("Total Round Trip Time = " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700373 boost::lexical_cast<std::string>(
374 m_trafficPatterns[patternId].m_totalInterestRoundTripTime) + "ms", false, true);
375 m_logger.log("Average Round Trip Time = " +
376 boost::lexical_cast<std::string>(average) + "ms\n", false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800377 }
378 }
379
380 bool
381 checkTrafficPatternCorrectness()
382 {
383 return true;
384 }
385
386 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700387 parseConfigurationFile()
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800388 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800389 std::string patternLine;
390 std::ifstream patternFile;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700391 m_logger.log("Analyzing Traffic Configuration File: " + m_configurationFile, true, true);
392 patternFile.open(m_configurationFile.c_str());
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800393 if (patternFile.is_open())
394 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700395 int patternId = 0;
396 int lineNumber = 0;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800397 while (getline(patternFile, patternLine))
398 {
399 lineNumber++;
400 if (std::isalpha(patternLine[0]))
401 {
402 InterestTrafficConfiguration interestData;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700403 bool shouldSkipLine = false;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800404 patternId++;
405 if (interestData.processConfigurationDetail(patternLine, m_logger, lineNumber))
406 {
407 while (getline(patternFile, patternLine) && std::isalpha(patternLine[0]))
408 {
409 lineNumber++;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700410 if (!interestData.processConfigurationDetail(patternLine,
411 m_logger, lineNumber))
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800412 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700413 shouldSkipLine = true;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800414 break;
415 }
416 }
417 lineNumber++;
418 }
419 else
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700420 shouldSkipLine = true;
421 if (!shouldSkipLine)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800422 {
423 if (interestData.checkTrafficDetailCorrectness())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700424 m_trafficPatterns.push_back(interestData);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800425 }
426 }
427 }
428 patternFile.close();
429 if (!checkTrafficPatternCorrectness())
430 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700431 m_logger.log("ERROR - Traffic Configuration Provided Is Not Proper- " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700432 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800433 m_logger.shutdownLogger();
434 exit(1);
435 }
436 m_logger.log("Traffic Configuration File Processing Completed\n", true, false);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700437 for (patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800438 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700439 m_logger.log("Traffic Pattern Type #" +
440 boost::lexical_cast<std::string>(patternId + 1), false, false);
441 m_trafficPatterns[patternId].printTrafficConfiguration(m_logger);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800442 m_logger.log("", false, false);
443 }
444 }
445 else
446 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700447 m_logger.log("ERROR - Unable To Open Traffic Configuration File: " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700448 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800449 m_logger.shutdownLogger();
450 exit(1);
451 }
452 }
453
454 void
455 initializeTrafficConfiguration()
456 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700457 if (boost::filesystem::exists(boost::filesystem::path(m_configurationFile)))
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800458 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700459 if (boost::filesystem::is_regular_file(boost::filesystem::path(m_configurationFile)))
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800460 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700461 parseConfigurationFile();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800462 }
463 else
464 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700465 m_logger.log("ERROR - Traffic Configuration File Is Not A Regular File: " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700466 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800467 m_logger.shutdownLogger();
468 exit(1);
469 }
470 }
471 else
472 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700473 m_logger.log("ERROR - Traffic Configuration File Does Not Exist: " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700474 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800475 m_logger.shutdownLogger();
476 exit(1);
477 }
478 }
479
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700480 uint32_t
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800481 getOldNonce()
482 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700483 if (m_nonces.size() == 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800484 return getNewNonce();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700485 int randomNonceIndex = std::rand() % m_nonces.size();
486 return m_nonces[randomNonceIndex];
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800487 }
488
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700489 uint32_t
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800490 getNewNonce()
491 {
jeraldabraham473ef3d2014-03-06 12:40:35 -0700492 //Performance Enhancement
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700493 if (m_nonces.size() > 1000)
494 m_nonces.clear();
jeraldabraham473ef3d2014-03-06 12:40:35 -0700495
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700496 uint32_t randomNonce = static_cast<uint32_t>(std::rand());
497 while (std::find(m_nonces.begin(), m_nonces.end(), randomNonce) != m_nonces.end())
498 randomNonce = static_cast<uint32_t>(std::rand());
499
500 m_nonces.push_back(randomNonce);
501 return randomNonce;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800502 }
503
504 static std::string
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700505 getRandomByteString(int randomSize)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800506 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700507 std::string randomString;
508 for (int i = 0; i < randomSize; i++)
509 randomString += static_cast<char>(std::rand() % 128);
510 return randomString;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800511 }
512
513 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700514 onData(const ndn::Interest& interest,
515 ndn::Data& data,
516 int globalReference,
517 int localReference,
518 int patternId,
519 time::steady_clock::TimePoint sentTime)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800520 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700521 std::string logLine =
522 "Data Received - PatternType=" + boost::lexical_cast<std::string>(patternId+1);
523 logLine += ", GlobalID=" + boost::lexical_cast<std::string>(globalReference);
524 logLine += ", LocalID=" + boost::lexical_cast<std::string>(localReference);
525 logLine += ", Name=" + interest.getName().toUri();
526
527 m_nInterestsReceived++;
528 m_trafficPatterns[patternId].m_nInterestsReceived++;
529 if (m_trafficPatterns[patternId].m_expectedContent != "")
jeraldabraham473ef3d2014-03-06 12:40:35 -0700530 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700531 std::string receivedContent = reinterpret_cast<const char*>(data.getContent().value());
532 int receivedContentLength = data.getContent().value_size();
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700533 receivedContent = receivedContent.substr(0, receivedContentLength);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700534 if (receivedContent != m_trafficPatterns[patternId].m_expectedContent)
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700535 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700536 m_nContentInconsistencies++;
537 m_trafficPatterns[patternId].m_nContentInconsistencies++;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700538 logLine += ", IsConsistent=No";
539 }
540 else
541 logLine += ", IsConsistent=Yes";
jeraldabraham473ef3d2014-03-06 12:40:35 -0700542 }
jeraldabraham473ef3d2014-03-06 12:40:35 -0700543 else
544 logLine += ", IsConsistent=NotChecked";
545 m_logger.log(logLine, true, false);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700546 double roundTripTime = (time::steady_clock::now() - sentTime).count() / 1000000.0;
547 if (m_minimumInterestRoundTripTime > roundTripTime)
548 m_minimumInterestRoundTripTime = roundTripTime;
549 if (m_maximumInterestRoundTripTime < roundTripTime)
550 m_maximumInterestRoundTripTime = roundTripTime;
551 if (m_trafficPatterns[patternId].m_minimumInterestRoundTripTime > roundTripTime)
552 m_trafficPatterns[patternId].m_minimumInterestRoundTripTime = roundTripTime;
553 if (m_trafficPatterns[patternId].m_maximumInterestRoundTripTime < roundTripTime)
554 m_trafficPatterns[patternId].m_maximumInterestRoundTripTime = roundTripTime;
555 m_totalInterestRoundTripTime += roundTripTime;
556 m_trafficPatterns[patternId].m_totalInterestRoundTripTime += roundTripTime;
jeraldabrahamdbfee2e2014-04-04 01:18:14 -0700557 if (m_nMaximumInterests >= 0 && globalReference == m_nMaximumInterests)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800558 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700559 logStatistics();
560 m_logger.shutdownLogger();
561 m_face.shutdown();
562 m_ioService->stop();
563 }
564 }
565
566 void
567 onTimeout(const ndn::Interest& interest,
568 int globalReference,
569 int localReference,
570 int patternId)
571 {
572 std::string logLine = "Interest Timed Out - PatternType=" +
573 boost::lexical_cast<std::string>(patternId + 1);
574 logLine += ", GlobalID=" + boost::lexical_cast<std::string>(globalReference);
575 logLine += ", LocalID=" + boost::lexical_cast<std::string>(localReference);
576 logLine += ", Name=" + interest.getName().toUri();
577 m_logger.log(logLine, true, false);
jeraldabrahamdbfee2e2014-04-04 01:18:14 -0700578 if (m_nMaximumInterests >= 0 && globalReference == m_nMaximumInterests)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700579 {
580 logStatistics();
581 m_logger.shutdownLogger();
582 m_face.shutdown();
583 m_ioService->stop();
584 }
585 }
586
587 void
588 generateTraffic(boost::asio::deadline_timer* deadlineTimer)
589 {
590 if (m_nMaximumInterests < 0 || m_nInterestsSent < m_nMaximumInterests)
591 {
592 int trafficKey = std::rand() % 100;
593 int cumulativePercentage = 0;
594 int patternId;
595 for (patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800596 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700597 cumulativePercentage += m_trafficPatterns[patternId].m_trafficPercentage;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800598 if (trafficKey <= cumulativePercentage)
599 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700600 Name interestName(m_trafficPatterns[patternId].m_name);
601 if (m_trafficPatterns[patternId].m_nameAppendBytes > 0)
602 interestName.append(
603 getRandomByteString(m_trafficPatterns[patternId].m_nameAppendBytes));
604 if (m_trafficPatterns[patternId].m_nameAppendSequenceNumber >= 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800605 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700606 interestName.append(
607 boost::lexical_cast<std::string>(
608 m_trafficPatterns[patternId].m_nameAppendSequenceNumber));
609 m_trafficPatterns[patternId].m_nameAppendSequenceNumber++;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800610 }
611 Interest interest(interestName);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700612 if (m_trafficPatterns[patternId].m_minSuffixComponents >= 0)
613 interest.setMinSuffixComponents(
614 m_trafficPatterns[patternId].m_minSuffixComponents);
615 if (m_trafficPatterns[patternId].m_maxSuffixComponents >= 0)
616 interest.setMaxSuffixComponents(
617 m_trafficPatterns[patternId].m_maxSuffixComponents);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800618 Exclude exclude;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700619 if (m_trafficPatterns[patternId].m_excludeBefore != "" &&
620 m_trafficPatterns[patternId].m_excludeAfter != "")
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800621 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700622 exclude.excludeRange(
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700623 name::Component(
624 m_trafficPatterns[patternId].m_excludeAfter),
625 name::Component(m_trafficPatterns[patternId].m_excludeBefore));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800626 interest.setExclude(exclude);
627 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700628 else if (m_trafficPatterns[patternId].m_excludeBefore != "")
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800629 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700630 exclude.excludeBefore(
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700631 name::Component(m_trafficPatterns[patternId].m_excludeBefore));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800632 interest.setExclude(exclude);
633 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700634 else if (m_trafficPatterns[patternId].m_excludeAfter != "")
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800635 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700636 exclude.excludeAfter(
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700637 name::Component(m_trafficPatterns[patternId].m_excludeAfter));
638 interest.setExclude(exclude);
639 }
640 if (m_trafficPatterns[patternId].m_excludeBeforeBytes > 0 &&
641 m_trafficPatterns[patternId].m_excludeAfterBytes > 0)
642 {
643 exclude.excludeRange(
644 name::Component(
645 getRandomByteString(
646 m_trafficPatterns[patternId].m_excludeAfterBytes)),
647 name::Component(
648 getRandomByteString(
649 m_trafficPatterns[patternId].m_excludeBeforeBytes)));
650 interest.setExclude(exclude);
651 }
652 else if (m_trafficPatterns[patternId].m_excludeBeforeBytes > 0)
653 {
654 exclude.excludeBefore(
655 name::Component(
656 getRandomByteString(
657 m_trafficPatterns[patternId].m_excludeBeforeBytes)));
658 interest.setExclude(exclude);
659 }
660 else if (m_trafficPatterns[patternId].m_excludeAfterBytes > 0)
661 {
662 exclude.excludeAfter(
663 name::Component(
664 getRandomByteString(
665 m_trafficPatterns[patternId].m_excludeAfterBytes)));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800666 interest.setExclude(exclude);
667 }
668
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700669 if (m_trafficPatterns[patternId].m_childSelector >= 0)
670 interest.setChildSelector(m_trafficPatterns[patternId].m_childSelector);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800671
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700672 if (m_trafficPatterns[patternId].m_mustBeFresh == 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800673 interest.setMustBeFresh(false);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700674 else if (m_trafficPatterns[patternId].m_mustBeFresh > 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800675 interest.setMustBeFresh(true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700676 if (m_trafficPatterns[patternId].m_nonceDuplicationPercentage > 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800677 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700678 int duplicationPercentage = std::rand() % 100;
679 if (m_trafficPatterns[patternId].m_nonceDuplicationPercentage <=
680 duplicationPercentage)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800681 interest.setNonce(getOldNonce());
682 else
683 interest.setNonce(getNewNonce());
684 }
685 else
686 interest.setNonce(getNewNonce());
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700687 if (m_trafficPatterns[patternId].m_scope >= 0)
688 interest.setScope(m_trafficPatterns[patternId].m_scope);
689 if (m_trafficPatterns[patternId].m_interestLifetime >= time::milliseconds(0))
690 interest.setInterestLifetime(m_trafficPatterns[patternId].m_interestLifetime);
691
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800692 try {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700693 m_nInterestsSent++;
694 m_trafficPatterns[patternId].m_nInterestsSent++;
695 time::steady_clock::TimePoint sentTime = time::steady_clock::now();
696 m_face.expressInterest(interest,
697 bind(&NdnTrafficClient::onData,
698 this, _1, _2, m_nInterestsSent,
699 m_trafficPatterns[patternId].m_nInterestsSent,
700 patternId, sentTime),
701 bind(&NdnTrafficClient::onTimeout,
702 this, _1, m_nInterestsSent,
703 m_trafficPatterns[patternId].m_nInterestsSent,
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700704 patternId));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700705 std::string logLine = "";
706 logLine += "Sending Interest - PatternType=" +
707 boost::lexical_cast<std::string>(patternId+1);
708 logLine += ", GlobalID=" + boost::lexical_cast<std::string>(m_nInterestsSent);
709 logLine += ", LocalID=" + boost::lexical_cast<std::string>(
710 m_trafficPatterns[patternId].m_nInterestsSent);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800711 logLine += ", Name="+interest.getName().toUri();
712 m_logger.log(logLine, true, false);
713 deadlineTimer->expires_at(deadlineTimer->expires_at() +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700714 boost::posix_time::millisec(
715 m_interestInterval.count()));
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700716 deadlineTimer->async_wait(bind(&NdnTrafficClient::generateTraffic,
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700717 this, deadlineTimer));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800718 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700719 catch (std::exception& e) {
720 m_logger.log("ERROR: " + static_cast<std::string>(e.what()), true, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800721 }
722 break;
723 }
724 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700725 if (patternId == m_trafficPatterns.size())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800726 {
727 deadlineTimer->expires_at(deadlineTimer->expires_at() +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700728 boost::posix_time::millisec(
729 m_interestInterval.count()));
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700730 deadlineTimer->async_wait(bind(&NdnTrafficClient::generateTraffic,
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700731 this, deadlineTimer));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800732 }
733 }
734 }
735
736 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700737 run()
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800738 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700739 boost::asio::signal_set signalSet(*m_ioService, SIGINT, SIGTERM);
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700740 signalSet.async_wait(bind(&NdnTrafficClient::signalHandler, this));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700741 m_logger.initializeLog(m_instanceId);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800742 initializeTrafficConfiguration();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700743
744 if (m_nMaximumInterests == 0)
745 {
746 logStatistics();
747 m_logger.shutdownLogger();
748 return;
749 }
750
751 boost::asio::deadline_timer deadlineTimer(
752 *m_ioService,
753 boost::posix_time::millisec(m_interestInterval.count()));
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700754 deadlineTimer.async_wait(bind(&NdnTrafficClient::generateTraffic,
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700755 this, &deadlineTimer));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800756 try {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700757 m_face.processEvents();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800758 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700759 catch(std::exception& e) {
760 m_logger.log("ERROR: " + static_cast<std::string>(e.what()), true, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800761 m_logger.shutdownLogger();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700762 m_hasError = true;
763 m_ioService->stop();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800764 }
765 }
766
767private:
768
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700769 std::string m_programName;
770 std::string m_instanceId;
771 bool m_hasError;
772 time::milliseconds m_interestInterval;
773 int m_nMaximumInterests;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800774 Logger m_logger;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700775 std::string m_configurationFile;
776 shared_ptr<boost::asio::io_service> m_ioService;
777 Face m_face;
778 std::vector<InterestTrafficConfiguration> m_trafficPatterns;
779 std::vector<uint32_t> m_nonces;
780 int m_nInterestsSent;
781 int m_nInterestsReceived;
782 int m_nContentInconsistencies;
783
784 //round trip time is stored as milliseconds with fractional
785 //sub-milliseconds precision
786 double m_minimumInterestRoundTripTime;
787 double m_maximumInterestRoundTripTime;
788 double m_totalInterestRoundTripTime;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800789
790};
791
792} // namespace ndn
793
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700794int
795main(int argc, char* argv[])
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800796{
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700797 std::srand(std::time(0));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800798 ndn::NdnTrafficClient ndnTrafficClient (argv[0]);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700799 int option;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800800 while ((option = getopt(argc, argv, "hi:c:")) != -1) {
801 switch (option) {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700802 case 'h':
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800803 ndnTrafficClient.usage();
804 break;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700805 case 'i':
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800806 ndnTrafficClient.setInterestInterval(atoi(optarg));
807 break;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700808 case 'c':
809 ndnTrafficClient.setMaximumInterests(atoi(optarg));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800810 break;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700811 default:
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800812 ndnTrafficClient.usage();
813 break;
814 }
815 }
816
817 argc -= optind;
818 argv += optind;
819
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700820 if (argv[0] == 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800821 ndnTrafficClient.usage();
822
823 ndnTrafficClient.setConfigurationFile(argv[0]);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700824 ndnTrafficClient.run();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800825
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700826 if (ndnTrafficClient.hasError())
827 return 1;
828 else
829 return 0;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800830}