blob: ca22e1bdebcf2077c7622bc170283a6a3d429da0 [file] [log] [blame]
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/**
Davide Pesaventod0b59982015-02-27 19:15:15 +01003 * Copyright (C) 2014-2015 University of Arizona.
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -08004 *
Davide Pesaventod0b59982015-02-27 19:15:15 +01005 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080017 *
18 * Author: Jerald Paul Abraham <jeraldabraham@email.arizona.edu>
19 */
20
Davide Pesaventod0b59982015-02-27 19:15:15 +010021#include <cctype>
22#include <cstdlib>
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080023#include <fstream>
jeraldabraham420dbf02014-04-25 22:58:31 -070024#include <string>
Davide Pesaventod0b59982015-02-27 19:15:15 +010025#include <unistd.h>
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080026#include <vector>
27
jeraldabraham420dbf02014-04-25 22:58:31 -070028#include <boost/asio.hpp>
29#include <boost/date_time/posix_time/posix_time.hpp>
30#include <boost/filesystem.hpp>
jeraldabraham420dbf02014-04-25 22:58:31 -070031#include <boost/noncopyable.hpp>
32
33#include <ndn-cxx/exclude.hpp>
34#include <ndn-cxx/face.hpp>
35#include <ndn-cxx/name-component.hpp>
Spencer Lee8e990232015-11-27 03:54:39 -070036#include <ndn-cxx/util/backports.hpp>
jeraldabraham420dbf02014-04-25 22:58:31 -070037
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080038#include "logger.hpp"
39
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080040namespace ndn {
41
jeraldabraham420dbf02014-04-25 22:58:31 -070042class NdnTrafficClient : boost::noncopyable
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080043{
44public:
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070045 explicit
Davide Pesaventod0b59982015-02-27 19:15:15 +010046 NdnTrafficClient(const char* programName)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070047 : m_programName(programName)
48 , m_logger("NdnTrafficClient")
Spencer Lee8e990232015-11-27 03:54:39 -070049 , m_instanceId(to_string(std::rand()))
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070050 , m_hasError(false)
jeraldabraham420dbf02014-04-25 22:58:31 -070051 , m_hasQuietLogging(false)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070052 , m_interestInterval(getDefaultInterestInterval())
53 , m_nMaximumInterests(-1)
Alexander Afanasyev740812e2014-10-30 15:37:45 -070054 , m_face(m_ioService)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070055 , m_nInterestsSent(0)
56 , m_nInterestsReceived(0)
jeraldabrahamdbfee2e2014-04-04 01:18:14 -070057 , m_nContentInconsistencies(0)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070058 , m_minimumInterestRoundTripTime(std::numeric_limits<double>::max())
59 , m_maximumInterestRoundTripTime(0)
60 , m_totalInterestRoundTripTime(0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080061 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080062 }
63
64 class InterestTrafficConfiguration
65 {
66 public:
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080067 InterestTrafficConfiguration()
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070068 : m_trafficPercentage(-1)
69 , m_nameAppendBytes(-1)
70 , m_nameAppendSequenceNumber(-1)
71 , m_minSuffixComponents(-1)
72 , m_maxSuffixComponents(-1)
73 , m_excludeBeforeBytes(-1)
74 , m_excludeAfterBytes(-1)
75 , m_childSelector(-1)
76 , m_mustBeFresh(-1)
77 , m_nonceDuplicationPercentage(-1)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070078 , m_interestLifetime(getDefaultInterestLifetime())
Eric Newberryeab462b2016-03-18 11:56:31 -070079 , m_nextHopFaceId(0)
jeraldabrahamdbfee2e2014-04-04 01:18:14 -070080 , m_nInterestsSent(0)
81 , m_nInterestsReceived(0)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070082 , m_minimumInterestRoundTripTime(std::numeric_limits<double>::max())
83 , m_maximumInterestRoundTripTime(0)
84 , m_totalInterestRoundTripTime(0)
85 , m_nContentInconsistencies(0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080086 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070087 }
88
Davide Pesaventod0b59982015-02-27 19:15:15 +010089 static time::milliseconds
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070090 getDefaultInterestLifetime()
91 {
92 return time::milliseconds(-1);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080093 }
94
95 void
Alexander Afanasyevfda32a32014-03-20 10:50:00 -070096 printTrafficConfiguration(Logger& logger)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080097 {
Davide Pesaventod0b59982015-02-27 19:15:15 +010098 std::string detail;
99
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700100 if (m_trafficPercentage > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700101 detail += "TrafficPercentage=" + to_string(m_trafficPercentage) + ", ";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100102 if (!m_name.empty())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700103 detail += "Name=" + m_name + ", ";
104 if (m_nameAppendBytes > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700105 detail += "NameAppendBytes=" + to_string(m_nameAppendBytes) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700106 if (m_nameAppendSequenceNumber > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700107 detail += "NameAppendSequenceNumber=" + to_string(m_nameAppendSequenceNumber) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700108 if (m_minSuffixComponents >= 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700109 detail += "MinSuffixComponents=" + to_string(m_minSuffixComponents) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700110 if (m_maxSuffixComponents >= 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700111 detail += "MaxSuffixComponents=" + to_string(m_maxSuffixComponents) + ", ";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100112 if (!m_excludeBefore.empty())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700113 detail += "ExcludeBefore=" + m_excludeBefore + ", ";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100114 if (!m_excludeAfter.empty())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700115 detail += "ExcludeAfter=" + m_excludeAfter + ", ";
116 if (m_excludeBeforeBytes > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700117 detail += "ExcludeBeforeBytes=" + to_string(m_excludeBeforeBytes) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700118 if (m_excludeAfterBytes > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700119 detail += "ExcludeAfterBytes=" + to_string(m_excludeAfterBytes) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700120 if (m_childSelector >= 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700121 detail += "ChildSelector=" + to_string(m_childSelector) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700122 if (m_mustBeFresh >= 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700123 detail += "MustBeFresh=" + to_string(m_mustBeFresh) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700124 if (m_nonceDuplicationPercentage > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700125 detail += "NonceDuplicationPercentage=" + to_string(m_nonceDuplicationPercentage) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700126 if (m_interestLifetime >= time::milliseconds(0))
Spencer Lee8e990232015-11-27 03:54:39 -0700127 detail += "InterestLifetime=" + to_string(m_interestLifetime.count()) + ", ";
Eric Newberryeab462b2016-03-18 11:56:31 -0700128 if (m_nextHopFaceId > 0)
129 detail += "NextHopFaceId=" + to_string(m_nextHopFaceId) + ", ";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100130 if (!m_expectedContent.empty())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700131 detail += "ExpectedContent=" + m_expectedContent + ", ";
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800132 if (detail.length() >= 2)
Davide Pesaventod0b59982015-02-27 19:15:15 +0100133 detail = detail.substr(0, detail.length() - 2); // Removing suffix ", "
134
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800135 logger.log(detail, false, false);
136 }
137
138 bool
Davide Pesaventod0b59982015-02-27 19:15:15 +0100139 extractParameterValue(const std::string& detail, std::string& parameter, std::string& value)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800140 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800141 std::string allowedCharacters = ":/+._-%";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100142 std::size_t i = 0;
143
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800144 parameter = "";
145 value = "";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100146 while (detail[i] != '=' && i < detail.length()) {
147 parameter += detail[i];
148 i++;
149 }
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800150 if (i == detail.length())
151 return false;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100152
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800153 i++;
jeraldabraham79c0c232014-03-31 21:43:59 -0700154 while ((std::isalnum(detail[i]) ||
Davide Pesaventod0b59982015-02-27 19:15:15 +0100155 allowedCharacters.find(detail[i]) != std::string::npos) &&
156 i < detail.length()) {
157 value += detail[i];
158 i++;
159 }
160
161 if (parameter.empty() || value.empty())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800162 return false;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100163 else
164 return true;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800165 }
166
167 bool
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700168 processConfigurationDetail(const std::string& detail, Logger& logger, int lineNumber)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800169 {
170 std::string parameter, value;
171 if (extractParameterValue(detail, parameter, value))
172 {
173 if (parameter == "TrafficPercentage")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100174 m_trafficPercentage = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800175 else if (parameter == "Name")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700176 m_name = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800177 else if (parameter == "NameAppendBytes")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100178 m_nameAppendBytes = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800179 else if (parameter == "NameAppendSequenceNumber")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100180 m_nameAppendSequenceNumber = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800181 else if (parameter == "MinSuffixComponents")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100182 m_minSuffixComponents = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800183 else if (parameter == "MaxSuffixComponents")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100184 m_maxSuffixComponents = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800185 else if (parameter == "ExcludeBefore")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700186 m_excludeBefore = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800187 else if (parameter == "ExcludeAfter")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700188 m_excludeAfter = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800189 else if (parameter == "ExcludeBeforeBytes")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100190 m_excludeBeforeBytes = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800191 else if (parameter == "ExcludeAfterBytes")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100192 m_excludeAfterBytes = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800193 else if (parameter == "ChildSelector")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100194 m_childSelector = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800195 else if (parameter == "MustBeFresh")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100196 m_mustBeFresh = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800197 else if (parameter == "NonceDuplicationPercentage")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100198 m_nonceDuplicationPercentage = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800199 else if (parameter == "InterestLifetime")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100200 m_interestLifetime = time::milliseconds(std::stoi(value));
Eric Newberryeab462b2016-03-18 11:56:31 -0700201 else if (parameter == "NextHopFaceId")
202 m_nextHopFaceId = std::stoi(value);
jeraldabraham473ef3d2014-03-06 12:40:35 -0700203 else if (parameter == "ExpectedContent")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700204 m_expectedContent = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800205 else
Spencer Lee8e990232015-11-27 03:54:39 -0700206 logger.log("Line " + to_string(lineNumber) +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700207 " \t- Invalid Parameter='" + parameter + "'", false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800208 }
209 else
210 {
Spencer Lee8e990232015-11-27 03:54:39 -0700211 logger.log("Line " + to_string(lineNumber) +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700212 " \t- Improper Traffic Configuration Line- " + detail, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800213 return false;
214 }
215 return true;
216 }
217
218 bool
219 checkTrafficDetailCorrectness()
220 {
221 return true;
222 }
223
Davide Pesaventod0b59982015-02-27 19:15:15 +0100224 private:
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700225 int m_trafficPercentage;
226 std::string m_name;
227 int m_nameAppendBytes;
228 int m_nameAppendSequenceNumber;
229 int m_minSuffixComponents;
230 int m_maxSuffixComponents;
231 std::string m_excludeBefore;
232 std::string m_excludeAfter;
233 int m_excludeBeforeBytes;
234 int m_excludeAfterBytes;
235 int m_childSelector;
236 int m_mustBeFresh;
237 int m_nonceDuplicationPercentage;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700238 time::milliseconds m_interestLifetime;
Eric Newberryeab462b2016-03-18 11:56:31 -0700239 uint64_t m_nextHopFaceId;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700240 int m_nInterestsSent;
241 int m_nInterestsReceived;
242
243 //round trip time is stored as milliseconds with fractional
244 //sub-millisecond precision
245 double m_minimumInterestRoundTripTime;
246 double m_maximumInterestRoundTripTime;
247 double m_totalInterestRoundTripTime;
248
249 int m_nContentInconsistencies;
250 std::string m_expectedContent;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100251
252 friend class NdnTrafficClient;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700253 }; // class InterestTrafficConfiguration
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800254
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700255 bool
256 hasError() const
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800257 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700258 return m_hasError;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800259 }
260
261 void
Davide Pesaventod0b59982015-02-27 19:15:15 +0100262 usage() const
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800263 {
Davide Pesaventod0b59982015-02-27 19:15:15 +0100264 std::cout << "Usage:\n"
265 << " " << m_programName << " [options] <Traffic_Configuration_File>\n"
266 << "\n"
267 << "Generate Interest traffic as per provided Traffic Configuration File.\n"
268 << "Interests are continuously generated unless a total number is specified.\n"
269 << "Set environment variable NDN_TRAFFIC_LOGFOLDER to redirect output to a log file.\n"
270 << "\n"
271 << "Options:\n"
272 << " [-i interval] - set interest generation interval in milliseconds (default "
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700273 << getDefaultInterestInterval() << ")\n"
Davide Pesaventod0b59982015-02-27 19:15:15 +0100274 << " [-c count] - set total number of interests to be generated\n"
275 << " [-q] - quiet mode: no interest reception/data generation logging\n"
276 << " [-h] - print this help text and exit\n";
277 exit(EXIT_FAILURE);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800278 }
279
Davide Pesaventod0b59982015-02-27 19:15:15 +0100280 static time::milliseconds
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800281 getDefaultInterestInterval()
282 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700283 return time::milliseconds(1000);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800284 }
285
286 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700287 setInterestInterval(int interestInterval)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800288 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700289 if (interestInterval <= 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800290 usage();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700291 m_interestInterval = time::milliseconds(interestInterval);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800292 }
293
294 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700295 setMaximumInterests(int maximumInterests)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800296 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700297 if (maximumInterests <= 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800298 usage();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700299 m_nMaximumInterests = maximumInterests;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800300 }
301
302 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700303 setConfigurationFile(char* configurationFile)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800304 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700305 m_configurationFile = configurationFile;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800306 }
307
308 void
jeraldabraham420dbf02014-04-25 22:58:31 -0700309 setQuietLogging()
310 {
311 m_hasQuietLogging = true;
312 }
313
314 void
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800315 signalHandler()
316 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800317 logStatistics();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100318
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700319 m_logger.shutdownLogger();
320 m_face.shutdown();
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300321 m_ioService.stop();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100322
323 exit(m_hasError ? EXIT_FAILURE : EXIT_SUCCESS);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800324 }
325
326 void
327 logStatistics()
328 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800329 m_logger.log("\n\n== Interest Traffic Report ==\n", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700330 m_logger.log("Total Traffic Pattern Types = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700331 to_string(m_trafficPatterns.size()), false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700332 m_logger.log("Total Interests Sent = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700333 to_string(m_nInterestsSent), false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700334 m_logger.log("Total Responses Received = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700335 to_string(m_nInterestsReceived), false, true);
Davide Pesaventod0b59982015-02-27 19:15:15 +0100336
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700337 double loss = 0;
338 if (m_nInterestsSent > 0)
339 loss = (m_nInterestsSent - m_nInterestsReceived) * 100.0 / m_nInterestsSent;
Spencer Lee8e990232015-11-27 03:54:39 -0700340 m_logger.log("Total Interest Loss = " + to_string(loss) + "%", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700341 if (m_nContentInconsistencies != 0 || m_nInterestsSent != m_nInterestsReceived)
342 m_hasError = true;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100343
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700344 double average = 0;
345 double inconsistency = 0;
346 if (m_nInterestsReceived > 0)
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700347 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700348 average = m_totalInterestRoundTripTime / m_nInterestsReceived;
349 inconsistency = m_nContentInconsistencies * 100.0 / m_nInterestsReceived;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700350 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700351 m_logger.log("Total Data Inconsistency = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700352 to_string(inconsistency) + "%", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700353 m_logger.log("Total Round Trip Time = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700354 to_string(m_totalInterestRoundTripTime) + "ms", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700355 m_logger.log("Average Round Trip Time = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700356 to_string(average) + "ms\n", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700357
Davide Pesaventod0b59982015-02-27 19:15:15 +0100358 for (std::size_t patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700359 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700360 m_logger.log("Traffic Pattern Type #" +
Spencer Lee8e990232015-11-27 03:54:39 -0700361 to_string(patternId + 1), false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700362 m_trafficPatterns[patternId].printTrafficConfiguration(m_logger);
363 m_logger.log("Total Interests Sent = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700364 to_string(m_trafficPatterns[patternId].m_nInterestsSent), false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700365 m_logger.log("Total Responses Received = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700366 to_string(m_trafficPatterns[patternId].m_nInterestsReceived), false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700367 loss = 0;
368 if (m_trafficPatterns[patternId].m_nInterestsSent > 0)
369 {
370 loss = (m_trafficPatterns[patternId].m_nInterestsSent -
371 m_trafficPatterns[patternId].m_nInterestsReceived);
372 loss *= 100.0;
373 loss /= m_trafficPatterns[patternId].m_nInterestsSent;
374 }
Spencer Lee8e990232015-11-27 03:54:39 -0700375 m_logger.log("Total Interest Loss = " + to_string(loss) + "%", false, true);
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700376 average = 0;
377 inconsistency = 0;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700378 if (m_trafficPatterns[patternId].m_nInterestsReceived > 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800379 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700380 average = (m_trafficPatterns[patternId].m_totalInterestRoundTripTime /
381 m_trafficPatterns[patternId].m_nInterestsReceived);
382 inconsistency = m_trafficPatterns[patternId].m_nContentInconsistencies;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100383 inconsistency *= 100.0 / m_trafficPatterns[patternId].m_nInterestsReceived;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800384 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700385 m_logger.log("Total Data Inconsistency = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700386 to_string(inconsistency) + "%", false, true);
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700387 m_logger.log("Total Round Trip Time = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700388 to_string(m_trafficPatterns[patternId].m_totalInterestRoundTripTime) +
Davide Pesaventod0b59982015-02-27 19:15:15 +0100389 "ms", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700390 m_logger.log("Average Round Trip Time = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700391 to_string(average) + "ms\n", false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800392 }
393 }
394
395 bool
396 checkTrafficPatternCorrectness()
397 {
398 return true;
399 }
400
401 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700402 parseConfigurationFile()
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800403 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800404 std::string patternLine;
405 std::ifstream patternFile;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700406 m_logger.log("Analyzing Traffic Configuration File: " + m_configurationFile, true, true);
Davide Pesaventod0b59982015-02-27 19:15:15 +0100407
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700408 patternFile.open(m_configurationFile.c_str());
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800409 if (patternFile.is_open())
410 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700411 int lineNumber = 0;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800412 while (getline(patternFile, patternLine))
413 {
414 lineNumber++;
415 if (std::isalpha(patternLine[0]))
416 {
417 InterestTrafficConfiguration interestData;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700418 bool shouldSkipLine = false;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800419 if (interestData.processConfigurationDetail(patternLine, m_logger, lineNumber))
420 {
421 while (getline(patternFile, patternLine) && std::isalpha(patternLine[0]))
422 {
423 lineNumber++;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700424 if (!interestData.processConfigurationDetail(patternLine,
425 m_logger, lineNumber))
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800426 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700427 shouldSkipLine = true;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800428 break;
429 }
430 }
431 lineNumber++;
432 }
433 else
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700434 shouldSkipLine = true;
435 if (!shouldSkipLine)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800436 {
437 if (interestData.checkTrafficDetailCorrectness())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700438 m_trafficPatterns.push_back(interestData);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800439 }
440 }
441 }
442 patternFile.close();
443 if (!checkTrafficPatternCorrectness())
444 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700445 m_logger.log("ERROR - Traffic Configuration Provided Is Not Proper- " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700446 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800447 m_logger.shutdownLogger();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100448 exit(EXIT_FAILURE);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800449 }
450 m_logger.log("Traffic Configuration File Processing Completed\n", true, false);
Davide Pesaventod0b59982015-02-27 19:15:15 +0100451 for (std::size_t patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800452 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700453 m_logger.log("Traffic Pattern Type #" +
Spencer Lee8e990232015-11-27 03:54:39 -0700454 to_string(patternId + 1), false, false);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700455 m_trafficPatterns[patternId].printTrafficConfiguration(m_logger);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800456 m_logger.log("", false, false);
457 }
458 }
459 else
460 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700461 m_logger.log("ERROR - Unable To Open Traffic Configuration File: " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700462 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800463 m_logger.shutdownLogger();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100464 exit(EXIT_FAILURE);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800465 }
466 }
467
468 void
469 initializeTrafficConfiguration()
470 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700471 if (boost::filesystem::exists(boost::filesystem::path(m_configurationFile)))
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800472 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700473 if (boost::filesystem::is_regular_file(boost::filesystem::path(m_configurationFile)))
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800474 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700475 parseConfigurationFile();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800476 }
477 else
478 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700479 m_logger.log("ERROR - Traffic Configuration File Is Not A Regular File: " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700480 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800481 m_logger.shutdownLogger();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100482 exit(EXIT_FAILURE);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800483 }
484 }
485 else
486 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700487 m_logger.log("ERROR - Traffic Configuration File Does Not Exist: " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700488 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800489 m_logger.shutdownLogger();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100490 exit(EXIT_FAILURE);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800491 }
492 }
493
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700494 uint32_t
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800495 getOldNonce()
496 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700497 if (m_nonces.size() == 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800498 return getNewNonce();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700499 int randomNonceIndex = std::rand() % m_nonces.size();
500 return m_nonces[randomNonceIndex];
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800501 }
502
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700503 uint32_t
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800504 getNewNonce()
505 {
jeraldabraham473ef3d2014-03-06 12:40:35 -0700506 //Performance Enhancement
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700507 if (m_nonces.size() > 1000)
508 m_nonces.clear();
jeraldabraham473ef3d2014-03-06 12:40:35 -0700509
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700510 uint32_t randomNonce = static_cast<uint32_t>(std::rand());
511 while (std::find(m_nonces.begin(), m_nonces.end(), randomNonce) != m_nonces.end())
512 randomNonce = static_cast<uint32_t>(std::rand());
513
514 m_nonces.push_back(randomNonce);
515 return randomNonce;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800516 }
517
Eric Newberry3b284192015-07-06 21:44:46 -0700518 static name::Component
519 generateRandomNameComponent(size_t length)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800520 {
Eric Newberry3b284192015-07-06 21:44:46 -0700521 Buffer buffer(length);
522 for (size_t i = 0; i < length; i++) {
523 buffer[i] = static_cast<uint8_t>(std::rand() % 256);
524 }
525 return name::Component(buffer);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800526 }
527
528 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700529 onData(const ndn::Interest& interest,
530 ndn::Data& data,
531 int globalReference,
532 int localReference,
533 int patternId,
534 time::steady_clock::TimePoint sentTime)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800535 {
Spencer Lee8e990232015-11-27 03:54:39 -0700536 std::string logLine = "Data Received - PatternType=" + to_string(patternId + 1);
537 logLine += ", GlobalID=" + to_string(globalReference);
538 logLine += ", LocalID=" + to_string(localReference);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700539 logLine += ", Name=" + interest.getName().toUri();
540
541 m_nInterestsReceived++;
542 m_trafficPatterns[patternId].m_nInterestsReceived++;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100543 if (!m_trafficPatterns[patternId].m_expectedContent.empty())
jeraldabraham473ef3d2014-03-06 12:40:35 -0700544 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700545 std::string receivedContent = reinterpret_cast<const char*>(data.getContent().value());
546 int receivedContentLength = data.getContent().value_size();
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700547 receivedContent = receivedContent.substr(0, receivedContentLength);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700548 if (receivedContent != m_trafficPatterns[patternId].m_expectedContent)
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700549 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700550 m_nContentInconsistencies++;
551 m_trafficPatterns[patternId].m_nContentInconsistencies++;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700552 logLine += ", IsConsistent=No";
553 }
554 else
555 logLine += ", IsConsistent=Yes";
jeraldabraham473ef3d2014-03-06 12:40:35 -0700556 }
jeraldabraham473ef3d2014-03-06 12:40:35 -0700557 else
558 logLine += ", IsConsistent=NotChecked";
jeraldabraham420dbf02014-04-25 22:58:31 -0700559 if (!m_hasQuietLogging)
560 m_logger.log(logLine, true, false);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700561 double roundTripTime = (time::steady_clock::now() - sentTime).count() / 1000000.0;
562 if (m_minimumInterestRoundTripTime > roundTripTime)
563 m_minimumInterestRoundTripTime = roundTripTime;
564 if (m_maximumInterestRoundTripTime < roundTripTime)
565 m_maximumInterestRoundTripTime = roundTripTime;
566 if (m_trafficPatterns[patternId].m_minimumInterestRoundTripTime > roundTripTime)
567 m_trafficPatterns[patternId].m_minimumInterestRoundTripTime = roundTripTime;
568 if (m_trafficPatterns[patternId].m_maximumInterestRoundTripTime < roundTripTime)
569 m_trafficPatterns[patternId].m_maximumInterestRoundTripTime = roundTripTime;
570 m_totalInterestRoundTripTime += roundTripTime;
571 m_trafficPatterns[patternId].m_totalInterestRoundTripTime += roundTripTime;
jeraldabrahamdbfee2e2014-04-04 01:18:14 -0700572 if (m_nMaximumInterests >= 0 && globalReference == m_nMaximumInterests)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800573 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700574 logStatistics();
575 m_logger.shutdownLogger();
576 m_face.shutdown();
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300577 m_ioService.stop();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700578 }
579 }
580
581 void
582 onTimeout(const ndn::Interest& interest,
583 int globalReference,
584 int localReference,
585 int patternId)
586 {
Spencer Lee8e990232015-11-27 03:54:39 -0700587 std::string logLine = "Interest Timed Out - PatternType=" + to_string(patternId + 1);
588 logLine += ", GlobalID=" + to_string(globalReference);
589 logLine += ", LocalID=" + to_string(localReference);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700590 logLine += ", Name=" + interest.getName().toUri();
591 m_logger.log(logLine, true, false);
jeraldabrahamdbfee2e2014-04-04 01:18:14 -0700592 if (m_nMaximumInterests >= 0 && globalReference == m_nMaximumInterests)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700593 {
594 logStatistics();
595 m_logger.shutdownLogger();
596 m_face.shutdown();
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300597 m_ioService.stop();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700598 }
599 }
600
601 void
Davide Pesaventod0b59982015-02-27 19:15:15 +0100602 generateTraffic(boost::asio::deadline_timer* timer)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700603 {
604 if (m_nMaximumInterests < 0 || m_nInterestsSent < m_nMaximumInterests)
605 {
606 int trafficKey = std::rand() % 100;
607 int cumulativePercentage = 0;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100608 std::size_t patternId;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700609 for (patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800610 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700611 cumulativePercentage += m_trafficPatterns[patternId].m_trafficPercentage;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800612 if (trafficKey <= cumulativePercentage)
613 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700614 Name interestName(m_trafficPatterns[patternId].m_name);
615 if (m_trafficPatterns[patternId].m_nameAppendBytes > 0)
616 interestName.append(
Eric Newberry3b284192015-07-06 21:44:46 -0700617 generateRandomNameComponent(m_trafficPatterns[patternId].m_nameAppendBytes));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700618 if (m_trafficPatterns[patternId].m_nameAppendSequenceNumber >= 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800619 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700620 interestName.append(
Spencer Lee8e990232015-11-27 03:54:39 -0700621 to_string(m_trafficPatterns[patternId].m_nameAppendSequenceNumber));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700622 m_trafficPatterns[patternId].m_nameAppendSequenceNumber++;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800623 }
Davide Pesaventod0b59982015-02-27 19:15:15 +0100624
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800625 Interest interest(interestName);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700626 if (m_trafficPatterns[patternId].m_minSuffixComponents >= 0)
627 interest.setMinSuffixComponents(
628 m_trafficPatterns[patternId].m_minSuffixComponents);
629 if (m_trafficPatterns[patternId].m_maxSuffixComponents >= 0)
630 interest.setMaxSuffixComponents(
631 m_trafficPatterns[patternId].m_maxSuffixComponents);
Davide Pesaventod0b59982015-02-27 19:15:15 +0100632
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800633 Exclude exclude;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100634 if (!m_trafficPatterns[patternId].m_excludeBefore.empty() &&
635 !m_trafficPatterns[patternId].m_excludeAfter.empty())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800636 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700637 exclude.excludeRange(
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700638 name::Component(
639 m_trafficPatterns[patternId].m_excludeAfter),
640 name::Component(m_trafficPatterns[patternId].m_excludeBefore));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800641 interest.setExclude(exclude);
642 }
Davide Pesaventod0b59982015-02-27 19:15:15 +0100643 else if (!m_trafficPatterns[patternId].m_excludeBefore.empty())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800644 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700645 exclude.excludeBefore(
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700646 name::Component(m_trafficPatterns[patternId].m_excludeBefore));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800647 interest.setExclude(exclude);
648 }
Davide Pesaventod0b59982015-02-27 19:15:15 +0100649 else if (!m_trafficPatterns[patternId].m_excludeAfter.empty())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800650 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700651 exclude.excludeAfter(
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700652 name::Component(m_trafficPatterns[patternId].m_excludeAfter));
653 interest.setExclude(exclude);
654 }
655 if (m_trafficPatterns[patternId].m_excludeBeforeBytes > 0 &&
656 m_trafficPatterns[patternId].m_excludeAfterBytes > 0)
657 {
658 exclude.excludeRange(
Eric Newberry3b284192015-07-06 21:44:46 -0700659 generateRandomNameComponent(
660 m_trafficPatterns[patternId].m_excludeAfterBytes),
661 generateRandomNameComponent(
662 m_trafficPatterns[patternId].m_excludeBeforeBytes));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700663 interest.setExclude(exclude);
664 }
665 else if (m_trafficPatterns[patternId].m_excludeBeforeBytes > 0)
666 {
667 exclude.excludeBefore(
Eric Newberry3b284192015-07-06 21:44:46 -0700668 generateRandomNameComponent(
669 m_trafficPatterns[patternId].m_excludeBeforeBytes));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700670 interest.setExclude(exclude);
671 }
672 else if (m_trafficPatterns[patternId].m_excludeAfterBytes > 0)
673 {
674 exclude.excludeAfter(
Eric Newberry3b284192015-07-06 21:44:46 -0700675 generateRandomNameComponent(
676 m_trafficPatterns[patternId].m_excludeAfterBytes));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800677 interest.setExclude(exclude);
678 }
679
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700680 if (m_trafficPatterns[patternId].m_childSelector >= 0)
681 interest.setChildSelector(m_trafficPatterns[patternId].m_childSelector);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800682
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700683 if (m_trafficPatterns[patternId].m_mustBeFresh == 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800684 interest.setMustBeFresh(false);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700685 else if (m_trafficPatterns[patternId].m_mustBeFresh > 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800686 interest.setMustBeFresh(true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700687 if (m_trafficPatterns[patternId].m_nonceDuplicationPercentage > 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800688 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700689 int duplicationPercentage = std::rand() % 100;
690 if (m_trafficPatterns[patternId].m_nonceDuplicationPercentage <=
691 duplicationPercentage)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800692 interest.setNonce(getOldNonce());
693 else
694 interest.setNonce(getNewNonce());
695 }
696 else
697 interest.setNonce(getNewNonce());
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700698 if (m_trafficPatterns[patternId].m_interestLifetime >= time::milliseconds(0))
699 interest.setInterestLifetime(m_trafficPatterns[patternId].m_interestLifetime);
700
Eric Newberryeab462b2016-03-18 11:56:31 -0700701 if (m_trafficPatterns[patternId].m_nextHopFaceId > 0) {
702 interest.setTag(make_shared<lp::NextHopFaceIdTag>(
703 m_trafficPatterns[patternId].m_nextHopFaceId));
704 }
705
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800706 try {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700707 m_nInterestsSent++;
708 m_trafficPatterns[patternId].m_nInterestsSent++;
709 time::steady_clock::TimePoint sentTime = time::steady_clock::now();
710 m_face.expressInterest(interest,
711 bind(&NdnTrafficClient::onData,
712 this, _1, _2, m_nInterestsSent,
713 m_trafficPatterns[patternId].m_nInterestsSent,
714 patternId, sentTime),
715 bind(&NdnTrafficClient::onTimeout,
716 this, _1, m_nInterestsSent,
717 m_trafficPatterns[patternId].m_nInterestsSent,
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700718 patternId));
Davide Pesaventod0b59982015-02-27 19:15:15 +0100719
720 if (!m_hasQuietLogging) {
721 std::string logLine =
Spencer Lee8e990232015-11-27 03:54:39 -0700722 "Sending Interest - PatternType=" + to_string(patternId + 1) +
723 ", GlobalID=" + to_string(m_nInterestsSent) +
Davide Pesaventod0b59982015-02-27 19:15:15 +0100724 ", LocalID=" +
Spencer Lee8e990232015-11-27 03:54:39 -0700725 to_string(m_trafficPatterns[patternId].m_nInterestsSent) +
Davide Pesaventod0b59982015-02-27 19:15:15 +0100726 ", Name=" + interest.getName().toUri();
jeraldabraham420dbf02014-04-25 22:58:31 -0700727 m_logger.log(logLine, true, false);
Davide Pesaventod0b59982015-02-27 19:15:15 +0100728 }
729
730 timer->expires_at(timer->expires_at() +
731 boost::posix_time::millisec(m_interestInterval.count()));
732 timer->async_wait(bind(&NdnTrafficClient::generateTraffic, this, timer));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800733 }
Davide Pesaventod0b59982015-02-27 19:15:15 +0100734 catch (const std::exception& e) {
735 m_logger.log("ERROR: " + std::string(e.what()), true, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800736 }
737 break;
738 }
739 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700740 if (patternId == m_trafficPatterns.size())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800741 {
Davide Pesaventod0b59982015-02-27 19:15:15 +0100742 timer->expires_at(timer->expires_at() +
743 boost::posix_time::millisec(m_interestInterval.count()));
744 timer->async_wait(bind(&NdnTrafficClient::generateTraffic, this, timer));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800745 }
746 }
747 }
748
749 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700750 run()
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800751 {
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300752 boost::asio::signal_set signalSet(m_ioService, SIGINT, SIGTERM);
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700753 signalSet.async_wait(bind(&NdnTrafficClient::signalHandler, this));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700754 m_logger.initializeLog(m_instanceId);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800755 initializeTrafficConfiguration();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700756
757 if (m_nMaximumInterests == 0)
758 {
759 logStatistics();
760 m_logger.shutdownLogger();
761 return;
762 }
763
Davide Pesaventod0b59982015-02-27 19:15:15 +0100764 boost::asio::deadline_timer deadlineTimer(m_ioService,
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700765 boost::posix_time::millisec(m_interestInterval.count()));
Davide Pesaventod0b59982015-02-27 19:15:15 +0100766 deadlineTimer.async_wait(bind(&NdnTrafficClient::generateTraffic, this, &deadlineTimer));
767
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800768 try {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700769 m_face.processEvents();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800770 }
Davide Pesaventod0b59982015-02-27 19:15:15 +0100771 catch (const std::exception& e) {
772 m_logger.log("ERROR: " + std::string(e.what()), true, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800773 m_logger.shutdownLogger();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700774 m_hasError = true;
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300775 m_ioService.stop();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800776 }
777 }
778
779private:
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700780 std::string m_programName;
Alexander Afanasyev740812e2014-10-30 15:37:45 -0700781 Logger m_logger;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700782 std::string m_instanceId;
783 bool m_hasError;
jeraldabraham420dbf02014-04-25 22:58:31 -0700784 bool m_hasQuietLogging;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700785 time::milliseconds m_interestInterval;
786 int m_nMaximumInterests;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700787 std::string m_configurationFile;
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300788 boost::asio::io_service m_ioService;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700789 Face m_face;
790 std::vector<InterestTrafficConfiguration> m_trafficPatterns;
791 std::vector<uint32_t> m_nonces;
792 int m_nInterestsSent;
793 int m_nInterestsReceived;
794 int m_nContentInconsistencies;
795
796 //round trip time is stored as milliseconds with fractional
797 //sub-milliseconds precision
798 double m_minimumInterestRoundTripTime;
799 double m_maximumInterestRoundTripTime;
800 double m_totalInterestRoundTripTime;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800801};
802
803} // namespace ndn
804
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700805int
806main(int argc, char* argv[])
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800807{
Davide Pesaventod0b59982015-02-27 19:15:15 +0100808 std::srand(std::time(nullptr));
809
810 ndn::NdnTrafficClient client(argv[0]);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700811 int option;
jeraldabraham420dbf02014-04-25 22:58:31 -0700812 while ((option = getopt(argc, argv, "hqi:c:")) != -1) {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800813 switch (option) {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700814 case 'h':
Davide Pesaventod0b59982015-02-27 19:15:15 +0100815 client.usage();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800816 break;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700817 case 'i':
Davide Pesaventod0b59982015-02-27 19:15:15 +0100818 client.setInterestInterval(atoi(optarg));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800819 break;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700820 case 'c':
Davide Pesaventod0b59982015-02-27 19:15:15 +0100821 client.setMaximumInterests(atoi(optarg));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800822 break;
jeraldabraham420dbf02014-04-25 22:58:31 -0700823 case 'q':
Davide Pesaventod0b59982015-02-27 19:15:15 +0100824 client.setQuietLogging();
jeraldabraham420dbf02014-04-25 22:58:31 -0700825 break;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700826 default:
Davide Pesaventod0b59982015-02-27 19:15:15 +0100827 client.usage();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800828 break;
829 }
830 }
831
832 argc -= optind;
833 argv += optind;
834
Davide Pesaventod0b59982015-02-27 19:15:15 +0100835 if (!argc)
836 client.usage();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800837
Davide Pesaventod0b59982015-02-27 19:15:15 +0100838 client.setConfigurationFile(argv[0]);
839 client.run();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800840
Davide Pesaventod0b59982015-02-27 19:15:15 +0100841 return client.hasError() ? EXIT_FAILURE : EXIT_SUCCESS;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800842}