blob: be35d52cbee067aa0b82353f87051b1cfeae69ea [file] [log] [blame]
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/**
Eric Newberry976c2042016-06-19 23:37:35 -07003 * Copyright (C) 2014-2016 The 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)
Eric Newberry976c2042016-06-19 23:37:35 -070057 , m_nNacks(0)
jeraldabrahamdbfee2e2014-04-04 01:18:14 -070058 , m_nContentInconsistencies(0)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070059 , m_minimumInterestRoundTripTime(std::numeric_limits<double>::max())
60 , m_maximumInterestRoundTripTime(0)
61 , m_totalInterestRoundTripTime(0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080062 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080063 }
64
65 class InterestTrafficConfiguration
66 {
67 public:
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080068 InterestTrafficConfiguration()
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070069 : m_trafficPercentage(-1)
70 , m_nameAppendBytes(-1)
71 , m_nameAppendSequenceNumber(-1)
72 , m_minSuffixComponents(-1)
73 , m_maxSuffixComponents(-1)
74 , m_excludeBeforeBytes(-1)
75 , m_excludeAfterBytes(-1)
76 , m_childSelector(-1)
77 , m_mustBeFresh(-1)
78 , m_nonceDuplicationPercentage(-1)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070079 , m_interestLifetime(getDefaultInterestLifetime())
Eric Newberryeab462b2016-03-18 11:56:31 -070080 , m_nextHopFaceId(0)
jeraldabrahamdbfee2e2014-04-04 01:18:14 -070081 , m_nInterestsSent(0)
82 , m_nInterestsReceived(0)
Eric Newberry976c2042016-06-19 23:37:35 -070083 , m_nNacks(0)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070084 , m_minimumInterestRoundTripTime(std::numeric_limits<double>::max())
85 , m_maximumInterestRoundTripTime(0)
86 , m_totalInterestRoundTripTime(0)
87 , m_nContentInconsistencies(0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080088 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070089 }
90
Davide Pesaventod0b59982015-02-27 19:15:15 +010091 static time::milliseconds
jeraldabrahamcc3c6c92014-03-28 02:21:45 -070092 getDefaultInterestLifetime()
93 {
94 return time::milliseconds(-1);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080095 }
96
97 void
Alexander Afanasyevfda32a32014-03-20 10:50:00 -070098 printTrafficConfiguration(Logger& logger)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -080099 {
Davide Pesaventod0b59982015-02-27 19:15:15 +0100100 std::string detail;
101
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700102 if (m_trafficPercentage > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700103 detail += "TrafficPercentage=" + to_string(m_trafficPercentage) + ", ";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100104 if (!m_name.empty())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700105 detail += "Name=" + m_name + ", ";
106 if (m_nameAppendBytes > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700107 detail += "NameAppendBytes=" + to_string(m_nameAppendBytes) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700108 if (m_nameAppendSequenceNumber > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700109 detail += "NameAppendSequenceNumber=" + to_string(m_nameAppendSequenceNumber) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700110 if (m_minSuffixComponents >= 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700111 detail += "MinSuffixComponents=" + to_string(m_minSuffixComponents) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700112 if (m_maxSuffixComponents >= 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700113 detail += "MaxSuffixComponents=" + to_string(m_maxSuffixComponents) + ", ";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100114 if (!m_excludeBefore.empty())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700115 detail += "ExcludeBefore=" + m_excludeBefore + ", ";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100116 if (!m_excludeAfter.empty())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700117 detail += "ExcludeAfter=" + m_excludeAfter + ", ";
118 if (m_excludeBeforeBytes > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700119 detail += "ExcludeBeforeBytes=" + to_string(m_excludeBeforeBytes) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700120 if (m_excludeAfterBytes > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700121 detail += "ExcludeAfterBytes=" + to_string(m_excludeAfterBytes) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700122 if (m_childSelector >= 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700123 detail += "ChildSelector=" + to_string(m_childSelector) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700124 if (m_mustBeFresh >= 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700125 detail += "MustBeFresh=" + to_string(m_mustBeFresh) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700126 if (m_nonceDuplicationPercentage > 0)
Spencer Lee8e990232015-11-27 03:54:39 -0700127 detail += "NonceDuplicationPercentage=" + to_string(m_nonceDuplicationPercentage) + ", ";
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700128 if (m_interestLifetime >= time::milliseconds(0))
Spencer Lee8e990232015-11-27 03:54:39 -0700129 detail += "InterestLifetime=" + to_string(m_interestLifetime.count()) + ", ";
Eric Newberryeab462b2016-03-18 11:56:31 -0700130 if (m_nextHopFaceId > 0)
131 detail += "NextHopFaceId=" + to_string(m_nextHopFaceId) + ", ";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100132 if (!m_expectedContent.empty())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700133 detail += "ExpectedContent=" + m_expectedContent + ", ";
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800134 if (detail.length() >= 2)
Davide Pesaventod0b59982015-02-27 19:15:15 +0100135 detail = detail.substr(0, detail.length() - 2); // Removing suffix ", "
136
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800137 logger.log(detail, false, false);
138 }
139
140 bool
Davide Pesaventod0b59982015-02-27 19:15:15 +0100141 extractParameterValue(const std::string& detail, std::string& parameter, std::string& value)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800142 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800143 std::string allowedCharacters = ":/+._-%";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100144 std::size_t i = 0;
145
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800146 parameter = "";
147 value = "";
Davide Pesaventod0b59982015-02-27 19:15:15 +0100148 while (detail[i] != '=' && i < detail.length()) {
149 parameter += detail[i];
150 i++;
151 }
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800152 if (i == detail.length())
153 return false;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100154
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800155 i++;
jeraldabraham79c0c232014-03-31 21:43:59 -0700156 while ((std::isalnum(detail[i]) ||
Davide Pesaventod0b59982015-02-27 19:15:15 +0100157 allowedCharacters.find(detail[i]) != std::string::npos) &&
158 i < detail.length()) {
159 value += detail[i];
160 i++;
161 }
162
163 if (parameter.empty() || value.empty())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800164 return false;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100165 else
166 return true;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800167 }
168
169 bool
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700170 processConfigurationDetail(const std::string& detail, Logger& logger, int lineNumber)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800171 {
172 std::string parameter, value;
173 if (extractParameterValue(detail, parameter, value))
174 {
175 if (parameter == "TrafficPercentage")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100176 m_trafficPercentage = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800177 else if (parameter == "Name")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700178 m_name = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800179 else if (parameter == "NameAppendBytes")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100180 m_nameAppendBytes = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800181 else if (parameter == "NameAppendSequenceNumber")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100182 m_nameAppendSequenceNumber = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800183 else if (parameter == "MinSuffixComponents")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100184 m_minSuffixComponents = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800185 else if (parameter == "MaxSuffixComponents")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100186 m_maxSuffixComponents = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800187 else if (parameter == "ExcludeBefore")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700188 m_excludeBefore = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800189 else if (parameter == "ExcludeAfter")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700190 m_excludeAfter = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800191 else if (parameter == "ExcludeBeforeBytes")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100192 m_excludeBeforeBytes = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800193 else if (parameter == "ExcludeAfterBytes")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100194 m_excludeAfterBytes = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800195 else if (parameter == "ChildSelector")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100196 m_childSelector = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800197 else if (parameter == "MustBeFresh")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100198 m_mustBeFresh = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800199 else if (parameter == "NonceDuplicationPercentage")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100200 m_nonceDuplicationPercentage = std::stoi(value);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800201 else if (parameter == "InterestLifetime")
Davide Pesaventod0b59982015-02-27 19:15:15 +0100202 m_interestLifetime = time::milliseconds(std::stoi(value));
Eric Newberryeab462b2016-03-18 11:56:31 -0700203 else if (parameter == "NextHopFaceId")
204 m_nextHopFaceId = std::stoi(value);
jeraldabraham473ef3d2014-03-06 12:40:35 -0700205 else if (parameter == "ExpectedContent")
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700206 m_expectedContent = value;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800207 else
Spencer Lee8e990232015-11-27 03:54:39 -0700208 logger.log("Line " + to_string(lineNumber) +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700209 " \t- Invalid Parameter='" + parameter + "'", false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800210 }
211 else
212 {
Spencer Lee8e990232015-11-27 03:54:39 -0700213 logger.log("Line " + to_string(lineNumber) +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700214 " \t- Improper Traffic Configuration Line- " + detail, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800215 return false;
216 }
217 return true;
218 }
219
220 bool
221 checkTrafficDetailCorrectness()
222 {
223 return true;
224 }
225
Davide Pesaventod0b59982015-02-27 19:15:15 +0100226 private:
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700227 int m_trafficPercentage;
228 std::string m_name;
229 int m_nameAppendBytes;
230 int m_nameAppendSequenceNumber;
231 int m_minSuffixComponents;
232 int m_maxSuffixComponents;
233 std::string m_excludeBefore;
234 std::string m_excludeAfter;
235 int m_excludeBeforeBytes;
236 int m_excludeAfterBytes;
237 int m_childSelector;
238 int m_mustBeFresh;
239 int m_nonceDuplicationPercentage;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700240 time::milliseconds m_interestLifetime;
Eric Newberryeab462b2016-03-18 11:56:31 -0700241 uint64_t m_nextHopFaceId;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700242 int m_nInterestsSent;
243 int m_nInterestsReceived;
Eric Newberry976c2042016-06-19 23:37:35 -0700244 int m_nNacks;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700245
246 //round trip time is stored as milliseconds with fractional
247 //sub-millisecond precision
248 double m_minimumInterestRoundTripTime;
249 double m_maximumInterestRoundTripTime;
250 double m_totalInterestRoundTripTime;
251
252 int m_nContentInconsistencies;
253 std::string m_expectedContent;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100254
255 friend class NdnTrafficClient;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700256 }; // class InterestTrafficConfiguration
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800257
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700258 bool
259 hasError() const
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800260 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700261 return m_hasError;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800262 }
263
264 void
Davide Pesaventod0b59982015-02-27 19:15:15 +0100265 usage() const
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800266 {
Davide Pesaventod0b59982015-02-27 19:15:15 +0100267 std::cout << "Usage:\n"
268 << " " << m_programName << " [options] <Traffic_Configuration_File>\n"
269 << "\n"
270 << "Generate Interest traffic as per provided Traffic Configuration File.\n"
271 << "Interests are continuously generated unless a total number is specified.\n"
272 << "Set environment variable NDN_TRAFFIC_LOGFOLDER to redirect output to a log file.\n"
273 << "\n"
274 << "Options:\n"
275 << " [-i interval] - set interest generation interval in milliseconds (default "
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700276 << getDefaultInterestInterval() << ")\n"
Davide Pesaventod0b59982015-02-27 19:15:15 +0100277 << " [-c count] - set total number of interests to be generated\n"
278 << " [-q] - quiet mode: no interest reception/data generation logging\n"
279 << " [-h] - print this help text and exit\n";
280 exit(EXIT_FAILURE);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800281 }
282
Davide Pesaventod0b59982015-02-27 19:15:15 +0100283 static time::milliseconds
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800284 getDefaultInterestInterval()
285 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700286 return time::milliseconds(1000);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800287 }
288
289 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700290 setInterestInterval(int interestInterval)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800291 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700292 if (interestInterval <= 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800293 usage();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700294 m_interestInterval = time::milliseconds(interestInterval);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800295 }
296
297 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700298 setMaximumInterests(int maximumInterests)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800299 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700300 if (maximumInterests <= 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800301 usage();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700302 m_nMaximumInterests = maximumInterests;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800303 }
304
305 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700306 setConfigurationFile(char* configurationFile)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800307 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700308 m_configurationFile = configurationFile;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800309 }
310
311 void
jeraldabraham420dbf02014-04-25 22:58:31 -0700312 setQuietLogging()
313 {
314 m_hasQuietLogging = true;
315 }
316
317 void
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800318 signalHandler()
319 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800320 logStatistics();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100321
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700322 m_logger.shutdownLogger();
323 m_face.shutdown();
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300324 m_ioService.stop();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100325
326 exit(m_hasError ? EXIT_FAILURE : EXIT_SUCCESS);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800327 }
328
329 void
330 logStatistics()
331 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800332 m_logger.log("\n\n== Interest Traffic Report ==\n", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700333 m_logger.log("Total Traffic Pattern Types = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700334 to_string(m_trafficPatterns.size()), false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700335 m_logger.log("Total Interests Sent = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700336 to_string(m_nInterestsSent), false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700337 m_logger.log("Total Responses Received = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700338 to_string(m_nInterestsReceived), false, true);
Eric Newberry976c2042016-06-19 23:37:35 -0700339 m_logger.log("Total Nacks Received = " +
340 to_string(m_nNacks), false, true);
Davide Pesaventod0b59982015-02-27 19:15:15 +0100341
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700342 double loss = 0;
343 if (m_nInterestsSent > 0)
344 loss = (m_nInterestsSent - m_nInterestsReceived) * 100.0 / m_nInterestsSent;
Spencer Lee8e990232015-11-27 03:54:39 -0700345 m_logger.log("Total Interest Loss = " + to_string(loss) + "%", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700346 if (m_nContentInconsistencies != 0 || m_nInterestsSent != m_nInterestsReceived)
347 m_hasError = true;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100348
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700349 double average = 0;
350 double inconsistency = 0;
351 if (m_nInterestsReceived > 0)
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700352 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700353 average = m_totalInterestRoundTripTime / m_nInterestsReceived;
354 inconsistency = m_nContentInconsistencies * 100.0 / m_nInterestsReceived;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700355 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700356 m_logger.log("Total Data Inconsistency = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700357 to_string(inconsistency) + "%", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700358 m_logger.log("Total Round Trip Time = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700359 to_string(m_totalInterestRoundTripTime) + "ms", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700360 m_logger.log("Average Round Trip Time = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700361 to_string(average) + "ms\n", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700362
Davide Pesaventod0b59982015-02-27 19:15:15 +0100363 for (std::size_t patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700364 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700365 m_logger.log("Traffic Pattern Type #" +
Spencer Lee8e990232015-11-27 03:54:39 -0700366 to_string(patternId + 1), false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700367 m_trafficPatterns[patternId].printTrafficConfiguration(m_logger);
368 m_logger.log("Total Interests Sent = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700369 to_string(m_trafficPatterns[patternId].m_nInterestsSent), false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700370 m_logger.log("Total Responses Received = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700371 to_string(m_trafficPatterns[patternId].m_nInterestsReceived), false, true);
Eric Newberry976c2042016-06-19 23:37:35 -0700372 m_logger.log("Total Nacks Received = " +
373 to_string(m_trafficPatterns[patternId].m_nNacks), false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700374 loss = 0;
375 if (m_trafficPatterns[patternId].m_nInterestsSent > 0)
376 {
377 loss = (m_trafficPatterns[patternId].m_nInterestsSent -
378 m_trafficPatterns[patternId].m_nInterestsReceived);
379 loss *= 100.0;
380 loss /= m_trafficPatterns[patternId].m_nInterestsSent;
381 }
Spencer Lee8e990232015-11-27 03:54:39 -0700382 m_logger.log("Total Interest Loss = " + to_string(loss) + "%", false, true);
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700383 average = 0;
384 inconsistency = 0;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700385 if (m_trafficPatterns[patternId].m_nInterestsReceived > 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800386 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700387 average = (m_trafficPatterns[patternId].m_totalInterestRoundTripTime /
388 m_trafficPatterns[patternId].m_nInterestsReceived);
389 inconsistency = m_trafficPatterns[patternId].m_nContentInconsistencies;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100390 inconsistency *= 100.0 / m_trafficPatterns[patternId].m_nInterestsReceived;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800391 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700392 m_logger.log("Total Data Inconsistency = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700393 to_string(inconsistency) + "%", false, true);
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700394 m_logger.log("Total Round Trip Time = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700395 to_string(m_trafficPatterns[patternId].m_totalInterestRoundTripTime) +
Davide Pesaventod0b59982015-02-27 19:15:15 +0100396 "ms", false, true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700397 m_logger.log("Average Round Trip Time = " +
Spencer Lee8e990232015-11-27 03:54:39 -0700398 to_string(average) + "ms\n", false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800399 }
400 }
401
402 bool
403 checkTrafficPatternCorrectness()
404 {
405 return true;
406 }
407
408 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700409 parseConfigurationFile()
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800410 {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800411 std::string patternLine;
412 std::ifstream patternFile;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700413 m_logger.log("Analyzing Traffic Configuration File: " + m_configurationFile, true, true);
Davide Pesaventod0b59982015-02-27 19:15:15 +0100414
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700415 patternFile.open(m_configurationFile.c_str());
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800416 if (patternFile.is_open())
417 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700418 int lineNumber = 0;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800419 while (getline(patternFile, patternLine))
420 {
421 lineNumber++;
422 if (std::isalpha(patternLine[0]))
423 {
424 InterestTrafficConfiguration interestData;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700425 bool shouldSkipLine = false;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800426 if (interestData.processConfigurationDetail(patternLine, m_logger, lineNumber))
427 {
428 while (getline(patternFile, patternLine) && std::isalpha(patternLine[0]))
429 {
430 lineNumber++;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700431 if (!interestData.processConfigurationDetail(patternLine,
432 m_logger, lineNumber))
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800433 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700434 shouldSkipLine = true;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800435 break;
436 }
437 }
438 lineNumber++;
439 }
440 else
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700441 shouldSkipLine = true;
442 if (!shouldSkipLine)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800443 {
444 if (interestData.checkTrafficDetailCorrectness())
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700445 m_trafficPatterns.push_back(interestData);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800446 }
447 }
448 }
449 patternFile.close();
450 if (!checkTrafficPatternCorrectness())
451 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700452 m_logger.log("ERROR - Traffic Configuration Provided Is Not Proper- " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700453 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800454 m_logger.shutdownLogger();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100455 exit(EXIT_FAILURE);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800456 }
457 m_logger.log("Traffic Configuration File Processing Completed\n", true, false);
Davide Pesaventod0b59982015-02-27 19:15:15 +0100458 for (std::size_t patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800459 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700460 m_logger.log("Traffic Pattern Type #" +
Spencer Lee8e990232015-11-27 03:54:39 -0700461 to_string(patternId + 1), false, false);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700462 m_trafficPatterns[patternId].printTrafficConfiguration(m_logger);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800463 m_logger.log("", false, false);
464 }
465 }
466 else
467 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700468 m_logger.log("ERROR - Unable To Open Traffic Configuration File: " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700469 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800470 m_logger.shutdownLogger();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100471 exit(EXIT_FAILURE);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800472 }
473 }
474
475 void
476 initializeTrafficConfiguration()
477 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700478 if (boost::filesystem::exists(boost::filesystem::path(m_configurationFile)))
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800479 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700480 if (boost::filesystem::is_regular_file(boost::filesystem::path(m_configurationFile)))
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800481 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700482 parseConfigurationFile();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800483 }
484 else
485 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700486 m_logger.log("ERROR - Traffic Configuration File Is Not A Regular File: " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700487 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800488 m_logger.shutdownLogger();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100489 exit(EXIT_FAILURE);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800490 }
491 }
492 else
493 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700494 m_logger.log("ERROR - Traffic Configuration File Does Not Exist: " +
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700495 m_configurationFile, false, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800496 m_logger.shutdownLogger();
Davide Pesaventod0b59982015-02-27 19:15:15 +0100497 exit(EXIT_FAILURE);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800498 }
499 }
500
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700501 uint32_t
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800502 getOldNonce()
503 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700504 if (m_nonces.size() == 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800505 return getNewNonce();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700506 int randomNonceIndex = std::rand() % m_nonces.size();
507 return m_nonces[randomNonceIndex];
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800508 }
509
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700510 uint32_t
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800511 getNewNonce()
512 {
jeraldabraham473ef3d2014-03-06 12:40:35 -0700513 //Performance Enhancement
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700514 if (m_nonces.size() > 1000)
515 m_nonces.clear();
jeraldabraham473ef3d2014-03-06 12:40:35 -0700516
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700517 uint32_t randomNonce = static_cast<uint32_t>(std::rand());
518 while (std::find(m_nonces.begin(), m_nonces.end(), randomNonce) != m_nonces.end())
519 randomNonce = static_cast<uint32_t>(std::rand());
520
521 m_nonces.push_back(randomNonce);
522 return randomNonce;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800523 }
524
Eric Newberry3b284192015-07-06 21:44:46 -0700525 static name::Component
526 generateRandomNameComponent(size_t length)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800527 {
Eric Newberry3b284192015-07-06 21:44:46 -0700528 Buffer buffer(length);
529 for (size_t i = 0; i < length; i++) {
530 buffer[i] = static_cast<uint8_t>(std::rand() % 256);
531 }
532 return name::Component(buffer);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800533 }
534
535 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700536 onData(const ndn::Interest& interest,
Eric Newberry976c2042016-06-19 23:37:35 -0700537 const ndn::Data& data,
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700538 int globalReference,
539 int localReference,
540 int patternId,
541 time::steady_clock::TimePoint sentTime)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800542 {
Spencer Lee8e990232015-11-27 03:54:39 -0700543 std::string logLine = "Data Received - PatternType=" + to_string(patternId + 1);
544 logLine += ", GlobalID=" + to_string(globalReference);
545 logLine += ", LocalID=" + to_string(localReference);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700546 logLine += ", Name=" + interest.getName().toUri();
547
548 m_nInterestsReceived++;
549 m_trafficPatterns[patternId].m_nInterestsReceived++;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100550 if (!m_trafficPatterns[patternId].m_expectedContent.empty())
jeraldabraham473ef3d2014-03-06 12:40:35 -0700551 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700552 std::string receivedContent = reinterpret_cast<const char*>(data.getContent().value());
553 int receivedContentLength = data.getContent().value_size();
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700554 receivedContent = receivedContent.substr(0, receivedContentLength);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700555 if (receivedContent != m_trafficPatterns[patternId].m_expectedContent)
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700556 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700557 m_nContentInconsistencies++;
558 m_trafficPatterns[patternId].m_nContentInconsistencies++;
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700559 logLine += ", IsConsistent=No";
560 }
561 else
562 logLine += ", IsConsistent=Yes";
jeraldabraham473ef3d2014-03-06 12:40:35 -0700563 }
jeraldabraham473ef3d2014-03-06 12:40:35 -0700564 else
565 logLine += ", IsConsistent=NotChecked";
jeraldabraham420dbf02014-04-25 22:58:31 -0700566 if (!m_hasQuietLogging)
567 m_logger.log(logLine, true, false);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700568 double roundTripTime = (time::steady_clock::now() - sentTime).count() / 1000000.0;
569 if (m_minimumInterestRoundTripTime > roundTripTime)
570 m_minimumInterestRoundTripTime = roundTripTime;
571 if (m_maximumInterestRoundTripTime < roundTripTime)
572 m_maximumInterestRoundTripTime = roundTripTime;
573 if (m_trafficPatterns[patternId].m_minimumInterestRoundTripTime > roundTripTime)
574 m_trafficPatterns[patternId].m_minimumInterestRoundTripTime = roundTripTime;
575 if (m_trafficPatterns[patternId].m_maximumInterestRoundTripTime < roundTripTime)
576 m_trafficPatterns[patternId].m_maximumInterestRoundTripTime = roundTripTime;
577 m_totalInterestRoundTripTime += roundTripTime;
578 m_trafficPatterns[patternId].m_totalInterestRoundTripTime += roundTripTime;
jeraldabrahamdbfee2e2014-04-04 01:18:14 -0700579 if (m_nMaximumInterests >= 0 && globalReference == m_nMaximumInterests)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800580 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700581 logStatistics();
582 m_logger.shutdownLogger();
583 m_face.shutdown();
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300584 m_ioService.stop();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700585 }
586 }
587
588 void
Eric Newberry976c2042016-06-19 23:37:35 -0700589 onNack(const ndn::Interest& interest,
590 const ndn::lp::Nack& nack,
591 int globalReference,
592 int localReference,
593 int patternId)
594 {
595 std::string logLine = "Interest Nack'd - PatternType=" + to_string(patternId + 1);
596 logLine += ", GlobalID=" + to_string(globalReference);
597 logLine += ", LocalID=" + to_string(localReference);
598 logLine += ", Name=" + interest.getName().toUri();
599 logLine += ", NackReason=" + to_string((int)nack.getReason());
600 m_logger.log(logLine, true, false);
601
602 m_nNacks++;
603 m_trafficPatterns[patternId].m_nNacks++;
604
605 if (m_nMaximumInterests >= 0 && globalReference == m_nMaximumInterests) {
606 logStatistics();
607 m_logger.shutdownLogger();
608 m_face.shutdown();
609 m_ioService.stop();
610 }
611 }
612
613 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700614 onTimeout(const ndn::Interest& interest,
615 int globalReference,
616 int localReference,
617 int patternId)
618 {
Spencer Lee8e990232015-11-27 03:54:39 -0700619 std::string logLine = "Interest Timed Out - PatternType=" + to_string(patternId + 1);
620 logLine += ", GlobalID=" + to_string(globalReference);
621 logLine += ", LocalID=" + to_string(localReference);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700622 logLine += ", Name=" + interest.getName().toUri();
623 m_logger.log(logLine, true, false);
jeraldabrahamdbfee2e2014-04-04 01:18:14 -0700624 if (m_nMaximumInterests >= 0 && globalReference == m_nMaximumInterests)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700625 {
626 logStatistics();
627 m_logger.shutdownLogger();
628 m_face.shutdown();
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300629 m_ioService.stop();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700630 }
631 }
632
633 void
Davide Pesaventod0b59982015-02-27 19:15:15 +0100634 generateTraffic(boost::asio::deadline_timer* timer)
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700635 {
636 if (m_nMaximumInterests < 0 || m_nInterestsSent < m_nMaximumInterests)
637 {
638 int trafficKey = std::rand() % 100;
639 int cumulativePercentage = 0;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100640 std::size_t patternId;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700641 for (patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800642 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700643 cumulativePercentage += m_trafficPatterns[patternId].m_trafficPercentage;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800644 if (trafficKey <= cumulativePercentage)
645 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700646 Name interestName(m_trafficPatterns[patternId].m_name);
647 if (m_trafficPatterns[patternId].m_nameAppendBytes > 0)
648 interestName.append(
Eric Newberry3b284192015-07-06 21:44:46 -0700649 generateRandomNameComponent(m_trafficPatterns[patternId].m_nameAppendBytes));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700650 if (m_trafficPatterns[patternId].m_nameAppendSequenceNumber >= 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800651 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700652 interestName.append(
Spencer Lee8e990232015-11-27 03:54:39 -0700653 to_string(m_trafficPatterns[patternId].m_nameAppendSequenceNumber));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700654 m_trafficPatterns[patternId].m_nameAppendSequenceNumber++;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800655 }
Davide Pesaventod0b59982015-02-27 19:15:15 +0100656
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800657 Interest interest(interestName);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700658 if (m_trafficPatterns[patternId].m_minSuffixComponents >= 0)
659 interest.setMinSuffixComponents(
660 m_trafficPatterns[patternId].m_minSuffixComponents);
661 if (m_trafficPatterns[patternId].m_maxSuffixComponents >= 0)
662 interest.setMaxSuffixComponents(
663 m_trafficPatterns[patternId].m_maxSuffixComponents);
Davide Pesaventod0b59982015-02-27 19:15:15 +0100664
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800665 Exclude exclude;
Davide Pesaventod0b59982015-02-27 19:15:15 +0100666 if (!m_trafficPatterns[patternId].m_excludeBefore.empty() &&
667 !m_trafficPatterns[patternId].m_excludeAfter.empty())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800668 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700669 exclude.excludeRange(
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700670 name::Component(
671 m_trafficPatterns[patternId].m_excludeAfter),
672 name::Component(m_trafficPatterns[patternId].m_excludeBefore));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800673 interest.setExclude(exclude);
674 }
Davide Pesaventod0b59982015-02-27 19:15:15 +0100675 else if (!m_trafficPatterns[patternId].m_excludeBefore.empty())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800676 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700677 exclude.excludeBefore(
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700678 name::Component(m_trafficPatterns[patternId].m_excludeBefore));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800679 interest.setExclude(exclude);
680 }
Davide Pesaventod0b59982015-02-27 19:15:15 +0100681 else if (!m_trafficPatterns[patternId].m_excludeAfter.empty())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800682 {
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700683 exclude.excludeAfter(
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700684 name::Component(m_trafficPatterns[patternId].m_excludeAfter));
685 interest.setExclude(exclude);
686 }
687 if (m_trafficPatterns[patternId].m_excludeBeforeBytes > 0 &&
688 m_trafficPatterns[patternId].m_excludeAfterBytes > 0)
689 {
690 exclude.excludeRange(
Eric Newberry3b284192015-07-06 21:44:46 -0700691 generateRandomNameComponent(
692 m_trafficPatterns[patternId].m_excludeAfterBytes),
693 generateRandomNameComponent(
694 m_trafficPatterns[patternId].m_excludeBeforeBytes));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700695 interest.setExclude(exclude);
696 }
697 else if (m_trafficPatterns[patternId].m_excludeBeforeBytes > 0)
698 {
699 exclude.excludeBefore(
Eric Newberry3b284192015-07-06 21:44:46 -0700700 generateRandomNameComponent(
701 m_trafficPatterns[patternId].m_excludeBeforeBytes));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700702 interest.setExclude(exclude);
703 }
704 else if (m_trafficPatterns[patternId].m_excludeAfterBytes > 0)
705 {
706 exclude.excludeAfter(
Eric Newberry3b284192015-07-06 21:44:46 -0700707 generateRandomNameComponent(
708 m_trafficPatterns[patternId].m_excludeAfterBytes));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800709 interest.setExclude(exclude);
710 }
711
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700712 if (m_trafficPatterns[patternId].m_childSelector >= 0)
713 interest.setChildSelector(m_trafficPatterns[patternId].m_childSelector);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800714
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700715 if (m_trafficPatterns[patternId].m_mustBeFresh == 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800716 interest.setMustBeFresh(false);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700717 else if (m_trafficPatterns[patternId].m_mustBeFresh > 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800718 interest.setMustBeFresh(true);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700719 if (m_trafficPatterns[patternId].m_nonceDuplicationPercentage > 0)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800720 {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700721 int duplicationPercentage = std::rand() % 100;
722 if (m_trafficPatterns[patternId].m_nonceDuplicationPercentage <=
723 duplicationPercentage)
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800724 interest.setNonce(getOldNonce());
725 else
726 interest.setNonce(getNewNonce());
727 }
728 else
729 interest.setNonce(getNewNonce());
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700730 if (m_trafficPatterns[patternId].m_interestLifetime >= time::milliseconds(0))
731 interest.setInterestLifetime(m_trafficPatterns[patternId].m_interestLifetime);
732
Eric Newberryeab462b2016-03-18 11:56:31 -0700733 if (m_trafficPatterns[patternId].m_nextHopFaceId > 0) {
734 interest.setTag(make_shared<lp::NextHopFaceIdTag>(
735 m_trafficPatterns[patternId].m_nextHopFaceId));
736 }
737
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800738 try {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700739 m_nInterestsSent++;
740 m_trafficPatterns[patternId].m_nInterestsSent++;
741 time::steady_clock::TimePoint sentTime = time::steady_clock::now();
742 m_face.expressInterest(interest,
743 bind(&NdnTrafficClient::onData,
744 this, _1, _2, m_nInterestsSent,
745 m_trafficPatterns[patternId].m_nInterestsSent,
746 patternId, sentTime),
Eric Newberry976c2042016-06-19 23:37:35 -0700747 bind(&NdnTrafficClient::onNack,
748 this, _1, _2, m_nInterestsSent,
749 m_trafficPatterns[patternId].m_nInterestsSent,
750 patternId),
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700751 bind(&NdnTrafficClient::onTimeout,
752 this, _1, m_nInterestsSent,
753 m_trafficPatterns[patternId].m_nInterestsSent,
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700754 patternId));
Davide Pesaventod0b59982015-02-27 19:15:15 +0100755
756 if (!m_hasQuietLogging) {
757 std::string logLine =
Spencer Lee8e990232015-11-27 03:54:39 -0700758 "Sending Interest - PatternType=" + to_string(patternId + 1) +
759 ", GlobalID=" + to_string(m_nInterestsSent) +
Davide Pesaventod0b59982015-02-27 19:15:15 +0100760 ", LocalID=" +
Spencer Lee8e990232015-11-27 03:54:39 -0700761 to_string(m_trafficPatterns[patternId].m_nInterestsSent) +
Davide Pesaventod0b59982015-02-27 19:15:15 +0100762 ", Name=" + interest.getName().toUri();
jeraldabraham420dbf02014-04-25 22:58:31 -0700763 m_logger.log(logLine, true, false);
Davide Pesaventod0b59982015-02-27 19:15:15 +0100764 }
765
766 timer->expires_at(timer->expires_at() +
767 boost::posix_time::millisec(m_interestInterval.count()));
768 timer->async_wait(bind(&NdnTrafficClient::generateTraffic, this, timer));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800769 }
Davide Pesaventod0b59982015-02-27 19:15:15 +0100770 catch (const std::exception& e) {
771 m_logger.log("ERROR: " + std::string(e.what()), true, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800772 }
773 break;
774 }
775 }
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700776 if (patternId == m_trafficPatterns.size())
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800777 {
Davide Pesaventod0b59982015-02-27 19:15:15 +0100778 timer->expires_at(timer->expires_at() +
779 boost::posix_time::millisec(m_interestInterval.count()));
780 timer->async_wait(bind(&NdnTrafficClient::generateTraffic, this, timer));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800781 }
782 }
783 }
784
785 void
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700786 run()
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800787 {
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300788 boost::asio::signal_set signalSet(m_ioService, SIGINT, SIGTERM);
Alexander Afanasyevfda32a32014-03-20 10:50:00 -0700789 signalSet.async_wait(bind(&NdnTrafficClient::signalHandler, this));
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700790 m_logger.initializeLog(m_instanceId);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800791 initializeTrafficConfiguration();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700792
793 if (m_nMaximumInterests == 0)
794 {
795 logStatistics();
796 m_logger.shutdownLogger();
797 return;
798 }
799
Davide Pesaventod0b59982015-02-27 19:15:15 +0100800 boost::asio::deadline_timer deadlineTimer(m_ioService,
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700801 boost::posix_time::millisec(m_interestInterval.count()));
Davide Pesaventod0b59982015-02-27 19:15:15 +0100802 deadlineTimer.async_wait(bind(&NdnTrafficClient::generateTraffic, this, &deadlineTimer));
803
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800804 try {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700805 m_face.processEvents();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800806 }
Davide Pesaventod0b59982015-02-27 19:15:15 +0100807 catch (const std::exception& e) {
808 m_logger.log("ERROR: " + std::string(e.what()), true, true);
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800809 m_logger.shutdownLogger();
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700810 m_hasError = true;
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300811 m_ioService.stop();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800812 }
813 }
814
815private:
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700816 std::string m_programName;
Alexander Afanasyev740812e2014-10-30 15:37:45 -0700817 Logger m_logger;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700818 std::string m_instanceId;
819 bool m_hasError;
jeraldabraham420dbf02014-04-25 22:58:31 -0700820 bool m_hasQuietLogging;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700821 time::milliseconds m_interestInterval;
822 int m_nMaximumInterests;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700823 std::string m_configurationFile;
Alexander Afanasyev976c3972014-05-26 17:03:40 +0300824 boost::asio::io_service m_ioService;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700825 Face m_face;
826 std::vector<InterestTrafficConfiguration> m_trafficPatterns;
827 std::vector<uint32_t> m_nonces;
828 int m_nInterestsSent;
829 int m_nInterestsReceived;
Eric Newberry976c2042016-06-19 23:37:35 -0700830 int m_nNacks;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700831 int m_nContentInconsistencies;
832
833 //round trip time is stored as milliseconds with fractional
834 //sub-milliseconds precision
835 double m_minimumInterestRoundTripTime;
836 double m_maximumInterestRoundTripTime;
837 double m_totalInterestRoundTripTime;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800838};
839
840} // namespace ndn
841
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700842int
843main(int argc, char* argv[])
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800844{
Davide Pesaventod0b59982015-02-27 19:15:15 +0100845 std::srand(std::time(nullptr));
846
847 ndn::NdnTrafficClient client(argv[0]);
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700848 int option;
jeraldabraham420dbf02014-04-25 22:58:31 -0700849 while ((option = getopt(argc, argv, "hqi:c:")) != -1) {
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800850 switch (option) {
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700851 case 'h':
Davide Pesaventod0b59982015-02-27 19:15:15 +0100852 client.usage();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800853 break;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700854 case 'i':
Davide Pesaventod0b59982015-02-27 19:15:15 +0100855 client.setInterestInterval(atoi(optarg));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800856 break;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700857 case 'c':
Davide Pesaventod0b59982015-02-27 19:15:15 +0100858 client.setMaximumInterests(atoi(optarg));
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800859 break;
jeraldabraham420dbf02014-04-25 22:58:31 -0700860 case 'q':
Davide Pesaventod0b59982015-02-27 19:15:15 +0100861 client.setQuietLogging();
jeraldabraham420dbf02014-04-25 22:58:31 -0700862 break;
jeraldabrahamcc3c6c92014-03-28 02:21:45 -0700863 default:
Davide Pesaventod0b59982015-02-27 19:15:15 +0100864 client.usage();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800865 break;
866 }
867 }
868
869 argc -= optind;
870 argv += optind;
871
Davide Pesaventod0b59982015-02-27 19:15:15 +0100872 if (!argc)
873 client.usage();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800874
Davide Pesaventod0b59982015-02-27 19:15:15 +0100875 client.setConfigurationFile(argv[0]);
876 client.run();
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800877
Davide Pesaventod0b59982015-02-27 19:15:15 +0100878 return client.hasError() ? EXIT_FAILURE : EXIT_SUCCESS;
Alexander Afanasyeva8f2a922014-02-26 14:21:56 -0800879}