A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
examples_qkd_etsi_004.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2022 www.tk.etf.unsa.ba
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Emir Dervisevic <emir.dervisevic@etf.unsa.ba>
7 * Miralem Mehic <miralem.mehic@ieee.org>
8 */
9
10// Network topology
11//
12// n3 (kms) -- p2p ------- n4 (kms)
13// | |
14// n0 ---p2p-- n1 --p2p-- n2 (app)
15// |<--------qkd-------->|
16//
17// n5(QKDControl)
18// n6(QKDControl)
19//
20// - 1 QKD link (n0-n2)
21// - 2 KMSs on nodes n3 and n4
22// - 1 ETSI 004 UDP application on nodes n0 (master) and n2 (slave)
23
24#include <fstream>
25#include "ns3/core-module.h"
26#include "ns3/applications-module.h"
27#include "ns3/internet-module.h"
28#include "ns3/flow-monitor-module.h"
29#include "ns3/mobility-module.h"
30#include "ns3/point-to-point-module.h"
31#include "ns3/gnuplot.h"
32
33#include "ns3/qkd-link-helper.h"
34#include "ns3/qkd-app-helper.h"
35#include "ns3/qkd-app-004.h"
36
37#include "ns3/network-module.h"
38#include "ns3/internet-apps-module.h"
39#include "ns3/netanim-module.h"
40
41
42using namespace ns3;
43
44NS_LOG_COMPONENT_DEFINE ("QKD_ETSI004");
45
48
49
50std::map<std::string, std::map<std::string, uint32_t> > m_generatedKeys;
51std::map<std::string, std::map<std::string, uint32_t> > m_servedKeys;
52
53std::map<std::string, std::pair<uint32_t, uint32_t> > m_dataAppSent;
54std::map<std::string, std::pair<uint32_t, uint32_t> > m_dataAppReveived;
55std::map<std::string, std::pair<uint32_t, uint32_t> > m_dataSigSent;
56std::map<std::string, std::pair<uint32_t, uint32_t> > m_dataSigReceived;
57std::map<std::string, std::pair<uint32_t, uint32_t> > m_dataKmSent;
58std::map<std::string, std::pair<uint32_t, uint32_t> > m_dataKmReceived;
59std::map<std::string, uint32_t> m_missedSendPacketCalls;
60
61void
62KeyGenerated(std::string context, const std::string& appId, const std::string& keyId, const uint32_t& amountInBits)
63{
65}
66
67void
68KeyServed (std::string context, const std::string& appId, const std::string& keyId, const uint32_t& amountInBits)
69{
71}
72
73void
74SentPacket(std::string context, const std::string& appId, Ptr<const Packet> p){
75
76 auto it = m_dataAppSent.find(appId);
77 if(it == m_dataAppSent.end())
78 m_dataAppSent.insert(std::make_pair(appId, std::make_pair(1, p->GetSize() )) );
79 else{
80 it->second.first++;
81 it->second.second += p->GetSize();
82 }
83}
84
85void MissedSendPacketCall (std::string context, const std::string& appId, Ptr<const Packet> p){
86
87 auto it = m_missedSendPacketCalls.find(appId);
88 if(it == m_missedSendPacketCalls.end())
89 m_missedSendPacketCalls.insert(std::make_pair(appId, 1));
90 else
91 it->second++;
92}
93
94void
95ReceivedPacket(std::string context, const std::string& appId, Ptr<const Packet> p){
96
97 auto it = m_dataAppReveived.find(appId);
98 if(it == m_dataAppReveived.end())
99 m_dataAppReveived.insert(std::make_pair(appId, std::make_pair(1, p->GetSize())) );
100 else{
101 it->second.first++;
102 it->second.second += p->GetSize();
103 }
104}
105
106void
107SentPacketSig(std::string context, const std::string& appId, Ptr<const Packet> p){
108
109 auto it = m_dataSigSent.find(appId);
110 if(it == m_dataSigSent.end())
111 m_dataSigSent.insert(std::make_pair(appId, std::make_pair(1, p->GetSize())) );
112 else{
113 it->second.first++;
114 it->second.second += p->GetSize();
115 }
116}
117
118void
119ReceivedPacketSig(std::string context, const std::string& appId, Ptr<const Packet> p){
120
121 auto it = m_dataSigReceived.find(appId);
122 if(it == m_dataSigReceived.end())
123 m_dataSigReceived.insert(std::make_pair(appId, std::make_pair(1, p->GetSize())) );
124 else{
125 it->second.first++;
126 it->second.second += p->GetSize();
127 }
128}
129
130void
131SentPacketToKMS(std::string context, const std::string& appId, Ptr<const Packet> p){
132
133 auto it = m_dataKmSent.find(appId);
134 if(it == m_dataKmSent.end())
135 m_dataKmSent.insert(std::make_pair(appId, std::make_pair(1, p->GetSize())) );
136 else{
137 it->second.first++;
138 it->second.second += p->GetSize();
139 }
140}
141
142void
143ReceivedPacketFromKMS(std::string context, const std::string& appId, Ptr<const Packet> p){
144
145 auto it = m_dataKmReceived.find(appId);
146 if(it == m_dataKmReceived.end())
147 m_dataKmReceived.insert(std::make_pair(appId, std::make_pair(1, p->GetSize())) );
148 else{
149 it->second.first++;
150 it->second.second += p->GetSize();
151 }
152}
153
154void
156 std::cout << "\n\nAPPLICATION STATS:\n";
157 std::cout << "\n\tAPP-APP Data Packets Sent:";
158 for(const auto &el: m_dataAppSent)
159 std::cout << "\n\t\tApplication ID:\t" << el.first
160 << "\tNumber:\t" << el.second.first << "\t\tBytes:\t" << el.second.second;
161 std::cout << "\n\n\tAPP-APP Data Packets Received:";
162 for(const auto &el: m_dataAppReveived)
163 std::cout << "\n\t\tApplication ID:\t" << el.first
164 << "\tNumber:\t" << el.second.first << "\t\tBytes:\t" << el.second.second;
165 std::cout << "\n\n\tMissed Send Packet Calls:";
166 for(const auto &el: m_missedSendPacketCalls)
167 std::cout << "\n\t\tApplication ID:\t" << el.first << "\tNumber:\t" << el.second;
168 std::cout << "\n\n\tAPP-APP Signaling Packets Sent:";
169 for(const auto &el: m_dataSigSent)
170 std::cout << "\n\t\tApplication ID:\t" << el.first
171 << "\tNumber:\t" << el.second.first << "\t\tBytes:\t" << el.second.second;
172 std::cout << "\n\n\tAPP-APP Signaling Packets Received:";
173 for(const auto &el: m_dataSigReceived)
174 std::cout << "\n\t\tApplication ID:\t" << el.first
175 << "\tNumber:\t" << el.second.first << "\t\tBytes:\t" << el.second.second;
176 std::cout << "\n\n\tAPP-KM Packets Sent:";
177 for(const auto &el: m_dataKmSent)
178 std::cout << "\n\t\tApplication ID:\t" << el.first
179 << "\tNumber:\t" << el.second.first << "\t\tBytes:\t" << el.second.second;
180 std::cout << "\n\n\tAPP-KM Packets Received:";
181 for(const auto &el: m_dataKmReceived)
182 std::cout << "\n\t\tApplication ID:\t" << el.first
183 << "\tNumber:\t" << el.second.first << "\t\tBytes:\t" << el.second.second;
184
185
186 std::cout << "\n\nQKD LINK STATS:\n";
187 for (const auto &el: m_generatedKeys){
188 for(const auto &el1 : el.second)
189 std::cout << "\n\t QKDSystem link: " << el.first << "\t keyId: "<< el1.first << "\t Size: " << el1.second / 2 << " (bits)";
190 }
191
192 std::cout << "\n\nSERVICE STATS:\n";
193 for(auto const &el: m_servedKeys){
194 std::cout << "\n\tApplication ID:\t" << el.first;
195 for(auto const &el1: el.second)
196 std::cout << "\n\t\tKey ID:\t" << el1.first << "\t Size: " << el1.second << " (bits)";
197 std::cout << "\n";
198 }
199}
200
201
202int main (int argc, char *argv[])
203{
206 //
207 // Explicitly create the nodes required by the topology (shown above).
208 //
209 NS_LOG_INFO ("Create nodes.");
210
211 NodeContainer n;
212
213 double appHoldTime = 0.5;
214 uint16_t simulationTime = 500;
215 uint16_t appStartTime = 50;
216 uint16_t appStopTime = 500;
217 uint16_t qkdStartTime = 0;
218 uint16_t qkdStopTime = 500;
219 uint32_t authenticationType = 1; //0-unauthenticated, 1-VMAC, 2,3-MD5,SHA1
220 uint32_t encryptionType = 1; //0-unencrypted, 1-OTP, 2-AES256
222 uint32_t aesLifetime = 10000; //In bytes! 64GB = 68719476736B
227 NS_LOG_DEBUG(simulationTime);
235
236 uint32_t appRate = 100000; //In bps
237 uint32_t appPacketSize = 800; //In bytes
238 uint32_t ppKeyRate = 10000; //In bps
239 uint32_t ppKeySize = 8192; //In bytes
240 uint32_t ppPacketSize = 100; //In bytes
241 uint32_t ppRate = 1000;
248
249 bool trace = false;
250 n.Create (7);
251
252 uint32_t stream = 15;
253 uint32_t seed = 100;
254
255 // Configure command line parameters
257 cmd.AddValue ("simTime", "Simulation time (seconds)", simulationTime);
258 cmd.AddValue ("appHoldTime", "How long (seconds) should QKDApp004 wait to close socket to KMS after receiving REST response?", appHoldTime);
259 cmd.AddValue ("appStartTime", "Application start time (seconds)", appStartTime);
260 cmd.AddValue ("appStopTime", "Application stop time (seconds)", appStopTime);
261 cmd.AddValue ("qkdStartTime", "QKD start time (seconds)", qkdStartTime);
262 cmd.AddValue ("qkdStopTime", "QKD stop time (seconds)", qkdStopTime);
263 cmd.AddValue ("encryptionType", "Type of encryption to be used", encryptionType);
264 cmd.AddValue ("authenticationType", "Type of authentication to be used", authenticationType);
265 cmd.AddValue ("aesLifetime", "How many packets to encrypt with the same AES key?", aesLifetime);
266 cmd.AddValue ("keyBufferLengthEncryption", "How many keys to store in local buffer of QKDApp004 for encryption?", keyBufferLengthEncryption);
267 cmd.AddValue ("keyBufferLengthAuthentication", "How many keys to store in local buffer of QKDApp004 for authentication?", keyBufferLengthAuthentication);
268 cmd.AddValue ("useCrypto", "Perform crypto functions?", useCrypto);
269 cmd.AddValue ("seed", "Random seed value", seed);
270 cmd.AddValue ("trace", "Enable datapath stats and pcap traces", trace);
271 cmd.Parse (argc, argv);
272
274 RngSeedManager::SetRun (stream);
275 srand( stream ); //seeding for the first time only!
276
277 NodeContainer n0n1 = NodeContainer (n.Get(0), n.Get (1));
278 NodeContainer n1n2 = NodeContainer (n.Get(1), n.Get (2));
279 NodeContainer n0n3 = NodeContainer (n.Get(0), n.Get (3));
280 NodeContainer n2n4 = NodeContainer (n.Get(2), n.Get (4));
281 NodeContainer n3n4 = NodeContainer (n.Get(3), n.Get (4));
282
284 internet.Install (n);
285
286 // Set Mobility for all nodes
289 positionAlloc ->Add(Vector(0, 0, 0)); // node0 //Install PPApps and QKDApps
290 positionAlloc ->Add(Vector(200, 0, 0)); // node1 // optional
291 positionAlloc ->Add(Vector(400, 0, 0)); // node2 //Install PPApps and QKDApps
292 positionAlloc ->Add(Vector(0, 100, 0)); // node3 //KM node 1
293 positionAlloc ->Add(Vector(400, 100, 0)); // node4 //KM node 2
294 positionAlloc ->Add(Vector(0, 200, 0)); // node5 //Controller 1
295 positionAlloc ->Add(Vector(400, 200, 0)); // node6 //Controller 2
296 mobility.SetPositionAllocator(positionAlloc);
297 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
298 mobility.Install(n);
299
300 // We create the channels first without any IP addressing information
301 NS_LOG_INFO ("Create channels.");
303 p2p.SetDeviceAttribute ("DataRate", StringValue ("50Mbps"));
304 p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
305
306 NetDeviceContainer d0d1 = p2p.Install (n0n1);
307 NetDeviceContainer d1d2 = p2p.Install (n1n2);
308 NetDeviceContainer d0d3 = p2p.Install (n0n3);
309 NetDeviceContainer d2d4 = p2p.Install (n2n4);
310 NetDeviceContainer d3d4 = p2p.Install (n3n4);
311
312 //
313 // We've got the "hardware" in place. Now we need to add IP addresses.
314 //
315 NS_LOG_INFO ("Assign IP Addresses.");
317
318 ipv4.SetBase ("10.1.1.0", "255.255.255.0");
320 ipv4.SetBase ("10.1.2.0", "255.255.255.0");
322 ipv4.SetBase ("10.1.3.0", "255.255.255.0");
324 ipv4.SetBase ("10.1.4.0", "255.255.255.0");
326 ipv4.SetBase ("10.1.5.0", "255.255.255.0");
328
329 // install LKMS on nodes 0 and 2
332
333
334 // install QKD Control the node 5 and 6
335 Ptr<QKDControl> controlSiteA = QLinkHelper.InstallQKDNController ( n.Get(5) );
336 Ptr<QKDControl> controlSiteB = QLinkHelper.InstallQKDNController ( n.Get(6) );
337 QLinkHelper.ConfigureQBuffers ( //Configure Q-Buffers
339 1024, //min_bits
340 1800, //thr_bits
341 500000000, //max_bits
342 512 //default key size in bits
343 );
344
345 //Config::SetDefault ("ns3::QKDKeyManagerSystemApplication::SBufferMaxSizeBits", UintegerValue (3000));
346
347 // install KMs on nodes 3 and 4
348 QAHelper.InstallKeyManager( //Install key manager for site A
349 n.Get(3), //Node KM-A
350 i3i4.GetAddress(0), //IP address KM-A
351 80, //Port
352 controlSiteA //Assigned controller A
353 );
354 QAHelper.InstallKeyManager( //Install key manager for site B
355 n.Get(4), //Node KM-B
356 i3i4.GetAddress(1), //IP address KM-B
357 80, //Port
358 controlSiteB //Assigned controller B
359 );
360
361 NS_LOG_INFO ("Create Applications.");
362
363 std::cout << "SrcNode: " << n.Get(0)->GetId() << " Source IP address: " << i0i1.GetAddress(0) << std::endl;
364 std::cout << "DstNode: " << n.Get(2)->GetId() << " Destination IP address: " << i1i2.GetAddress(1) << std::endl;
365 std::cout << "SrcKMSNode: " << n.Get(3)->GetId() << " Destination KMS IP address: " << i3i4.GetAddress(0) << std::endl;
366 std::cout << "DstKMSNode: " << n.Get(4)->GetId() << " Destination KMS IP address: " << i3i4.GetAddress(1) << std::endl;
367
368 //Create APP to generate keys
371 QAHelper.InstallPostProcessing(
372 n.Get(0), //QKD module A
373 n.Get(2), //QKD module B
374 InetSocketAddress (i0i1.GetAddress(0), 102), //Address A
375 InetSocketAddress (i1i2.GetAddress(1), 102), //Address B
376 n.Get(5), //Controller-A
377 n.Get(6), //Controller-B
378 ppKeySize, //size of key to be added to QKD buffer
379 DataRate (ppKeyRate), //average QKD key rate
380 ppPacketSize, //average data packet size
381 DataRate (ppRate) //average data traffic rate
382 )
383 );
386
387 //Set default values for applications created below
388 Config::SetDefault ("ns3::QKDApp004::AuthenticationType", UintegerValue (authenticationType)); //(0-unauthenticated, 1-VMAC, 2-MD5, 3-SHA1)
389 Config::SetDefault ("ns3::QKDApp004::EncryptionType", UintegerValue (encryptionType)); //(0-unencrypted, 1-OTP, 2-AES)
390 Config::SetDefault ("ns3::QKDApp004::AESLifetime", UintegerValue (aesLifetime));
391 Config::SetDefault ("ns3::QKDApp004::UseCrypto", UintegerValue (useCrypto));
392 Config::SetDefault ("ns3::QKDApp004::LengthOfKeyBufferForEncryption", UintegerValue (keyBufferLengthEncryption));
393 Config::SetDefault ("ns3::QKDApp004::LengthOfKeyBufferForAuthentication", UintegerValue (keyBufferLengthAuthentication));
394 Config::SetDefault ("ns3::QKDApp004::SocketToKMSHoldTime", TimeValue (Seconds (appHoldTime)));
395
396 Config::SetDefault ("ns3::TcpSocket::TcpNoDelay", BooleanValue (true));
397 Config::SetDefault ("ns3::TcpSocketState::EnablePacing", BooleanValue (false));
398
399 //Create APP to consume keys
400 uint16_t communicationPort = 8081;
403 QAHelper.InstallQKDApplication(
404 n.Get(0), //Source Node
405 n.Get(2), //Destination Node
406 InetSocketAddress (i0i1.GetAddress(0), communicationPort), //Source address
407 InetSocketAddress (i1i2.GetAddress(1), communicationPort), //Destination address
408 n.Get(5), //Controller 1
409 n.Get(6), //Controller 2
410 "tcp", //Connection type
411 appPacketSize, //Payload size
412 DataRate (appRate), //Data rate
413 "etsi004" //Application type
414 )
415 );
418
420 QLinkHelper.CreateTopologyGraph({controlSiteA, controlSiteB});
421 QLinkHelper.PopulateRoutingTables();
422 QLinkHelper.AddGraphs();
423
424 //////////////////////////////////////
425 //// STATISTICS
426 //////////////////////////////////////
427
428 Config::Connect("/NodeList/*/ApplicationList/*/$ns3::QKDApp004/Tx", MakeCallback(&SentPacket));
429 Config::Connect("/NodeList/*/ApplicationList/*/$ns3::QKDApp004/Rx", MakeCallback(&ReceivedPacket));
430 Config::Connect("/NodeList/*/ApplicationList/*/$ns3::QKDApp004/Mx", MakeCallback(&MissedSendPacketCall));
431 Config::Connect("/NodeList/*/ApplicationList/*/$ns3::QKDApp004/TxSig", MakeCallback(&SentPacketSig));
432 Config::Connect("/NodeList/*/ApplicationList/*/$ns3::QKDApp004/RxSig", MakeCallback(&ReceivedPacketSig));
433 Config::Connect("/NodeList/*/ApplicationList/*/$ns3::QKDApp004/TxKMS", MakeCallback(&SentPacketToKMS));
434 Config::Connect("/NodeList/*/ApplicationList/*/$ns3::QKDApp004/RxKMS", MakeCallback(&ReceivedPacketFromKMS));
435
436 //Connect Traces for KM key statistics
437 Config::Connect("/NodeList/*/ApplicationList/*/$ns3::QKDKeyManagerSystemApplication/KeyServed", MakeCallback(&KeyServed));
438 Config::Connect("/NodeList/*/ApplicationList/*/$ns3::QKDKeyManagerSystemApplication/QKDKeyGenerated", MakeCallback(&KeyGenerated));
439
440 if(trace){
441 //if we need we can create pcap files
443 p2p.EnableAsciiAll (ascii.CreateFileStream ("qkd_etis004.tr"));
444 p2p.EnablePcapAll ("qkd_etis004");
445 AnimationInterface anim ("qkd_etis004.xml"); // where "animation.xml" is any arbitrary filename
446 }
447
448 Simulator::Stop (Seconds (simulationTime));
450
451 //Finally print the graphs
452 QLinkHelper.PrintGraphs();
453
454 std::cout << "simTime:\t" << simulationTime << "\n";
455 std::cout << "appStartTime:\t" << appStartTime << "\n";
456 std::cout << "appStopTime:\t" << appStopTime << "\n";
457 std::cout << "qkdStartTime:\t" << qkdStartTime << "\n";
458 std::cout << "qkdStopTime:\t" << qkdStopTime << "\n";
459 std::cout << "encryptionType:\t" << encryptionType << "\n";
460 std::cout << "authenticationType:\t" << authenticationType << "\n";
461 std::cout << "aesLifetime:\t" << aesLifetime << "\n";
462 std::cout << "keyBufferLengthEncryption:\t" << keyBufferLengthEncryption << "\n";
463 std::cout << "keyBufferLengthAuthentication:\t" << keyBufferLengthAuthentication << "\n";
464 std::cout << "useCrypto:\t" << useCrypto << "\n";
465 std::cout << "trace:\t" << trace << "\n";
466
467 Ratio();
469}
NodeContainer n1n2
Nodecontainer n1 + n2.
NodeContainer n3n4
Nodecontainer n3 + n4.
Ipv4InterfaceContainer i1i2
IPv4 interface container i1 + i2.
Ipv4InterfaceContainer i3i4
IPv4 interface container i3 + i4.
Interface to network animator.
holds a vector of ns3::Application pointers.
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container.
Manage ASCII trace files for device models.
AttributeValue implementation for Boolean.
Definition boolean.h:26
Parse command-line arguments.
Class for representing data rates.
Definition data-rate.h:78
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
static void PopulateRoutingTables()
Build a routing database and initialize the routing tables of the nodes in the simulation.
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
uint32_t GetId() const
Definition node.cc:106
static void EnablePrinting()
Enable printing packets metadata.
Definition packet.cc:585
static void Enable()
Enable the packet metadata.
Build a set of PointToPointNetDevice objects.
Smart pointer class similar to boost::intrusive_ptr.
Definition ptr.h:66
A helper to make it easier to instantiate an ns3::QKDAppApplication on a set of nodes.
static void SetRun(uint64_t run)
Set the run number of simulation.
static void SetSeed(uint32_t seed)
Set the seed.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void Run()
Run the simulation.
Definition simulator.cc:167
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition simulator.cc:175
Hold variables of type string.
Definition string.h:45
AttributeValue implementation for Time.
Definition nstime.h:1431
Hold an unsigned integer type.
Definition uinteger.h:34
void SentPacket(std::string context, const std::string &appId, Ptr< const Packet > p)
uint32_t showKeyAdded
void MissedSendPacketCall(std::string context, const std::string &appId, Ptr< const Packet > p)
std::map< std::string, std::pair< uint32_t, uint32_t > > m_dataKmReceived
void SentPacketToKMS(std::string context, const std::string &appId, Ptr< const Packet > p)
void KeyGenerated(std::string context, const std::string &appId, const std::string &keyId, const uint32_t &amountInBits)
std::map< std::string, std::pair< uint32_t, uint32_t > > m_dataAppReveived
std::map< std::string, uint32_t > m_missedSendPacketCalls
std::map< std::string, std::pair< uint32_t, uint32_t > > m_dataSigSent
void Ratio()
void SentPacketSig(std::string context, const std::string &appId, Ptr< const Packet > p)
std::map< std::string, std::pair< uint32_t, uint32_t > > m_dataSigReceived
void ReceivedPacketFromKMS(std::string context, const std::string &appId, Ptr< const Packet > p)
void KeyServed(std::string context, const std::string &appId, const std::string &keyId, const uint32_t &amountInBits)
std::map< std::string, std::pair< uint32_t, uint32_t > > m_dataKmSent
void ReceivedPacketSig(std::string context, const std::string &appId, Ptr< const Packet > p)
void ReceivedPacket(std::string context, const std::string &appId, Ptr< const Packet > p)
std::map< std::string, std::map< std::string, uint32_t > > m_generatedKeys
uint32_t showKeyServed
std::map< std::string, std::map< std::string, uint32_t > > m_servedKeys
std::map< std::string, std::pair< uint32_t, uint32_t > > m_dataAppSent
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:883
void Connect(std::string path, const CallbackBase &cb)
Definition config.cc:967
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition log.h:257
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition log.h:264
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:436
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1344
AnimationInterface * anim
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition callback.h:684
mobility
Definition third.py:92