blob: cf9d886deeff660da79dc5f21ad8b452d3aaff62 [file] [log] [blame]
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2011-2015 Regents of the University of California.
Alexander Afanasyev68de7952012-12-12 18:02:29 -08004 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08005 * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
6 * contributors.
Alexander Afanasyev68de7952012-12-12 18:02:29 -08007 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08008 * ndnSIM is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
Alexander Afanasyev68de7952012-12-12 18:02:29 -080011 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080012 * ndnSIM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
Alexander Afanasyev68de7952012-12-12 18:02:29 -080015 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080016 * You should have received a copy of the GNU General Public License along with
17 * ndnSIM, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 **/
Alexander Afanasyev68de7952012-12-12 18:02:29 -080019
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080020// custom-app.cpp
Alexander Afanasyev68de7952012-12-12 18:02:29 -080021
22#include "custom-app.h"
23#include "ns3/ptr.h"
24#include "ns3/log.h"
25#include "ns3/simulator.h"
26#include "ns3/packet.h"
27
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080028#include "ns3/ndnSIM/helper/ndn-fib-helper.hpp"
Alexander Afanasyev68de7952012-12-12 18:02:29 -080029
Alexander Afanasyev68de7952012-12-12 18:02:29 -080030#include "ns3/random-variable.h"
31
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080032NS_LOG_COMPONENT_DEFINE("CustomApp");
Alexander Afanasyev68de7952012-12-12 18:02:29 -080033
34namespace ns3 {
35
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080036NS_OBJECT_ENSURE_REGISTERED(CustomApp);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080037
38// register NS-3 type
39TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080040CustomApp::GetTypeId()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080041{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080042 static TypeId tid = TypeId("CustomApp").SetParent<ndn::App>().AddConstructor<CustomApp>();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080043 return tid;
44}
45
46// Processing upon start of the application
47void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080048CustomApp::StartApplication()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080049{
50 // initialize ndn::App
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080051 ndn::App::StartApplication();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080052
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080053 Simulator::Schedule(Seconds(1.0), &CustomApp::SendInterest, this);
54
Alexander Afanasyev68de7952012-12-12 18:02:29 -080055 // Create a name components object for name ``/prefix/sub``
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080056 shared_ptr<Name> prefix = make_shared<Name>(); // now prefix contains ``/``
57 prefix->append("prefix"); // now prefix contains ``/prefix``
58 prefix->append("sub"); // now prefix contains ``/prefix/sub``
Alexander Afanasyev68de7952012-12-12 18:02:29 -080059
60 // Add entry to FIB
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080061 ndn::FibHelper::AddRoute(node, *prefix, m_face, 0);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080062
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080063 // Schedule send of first interest
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080064 Simulator::Schedule(Seconds(1.0), &CustomApp::SendInterest, this);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080065}
66
67// Processing when application is stopped
68void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080069CustomApp::StopApplication()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080070{
71 // cleanup ndn::App
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080072 ndn::App::StopApplication();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080073}
74
75void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080076CustomApp::SendInterest()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080077{
78 /////////////////////////////////////
79 // Sending one Interest packet out //
80 /////////////////////////////////////
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080081
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080082 auto prefix = make_shared<Name>("/prefix/sub"); // another way to create name
Alexander Afanasyev68de7952012-12-12 18:02:29 -080083
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -070084 // Create and configure ndn::Interest
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080085 auto interest = make_shared<Interest>();
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080086 UniformVariable rand(0, std::numeric_limits<uint32_t>::max());
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080087 interest->setNonce(rand.GetValue());
88 interest->setName(*prefix);
89 interest->setInterestLifetime(time::seconds(1));
Alexander Afanasyev68de7952012-12-12 18:02:29 -080090
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080091 NS_LOG_DEBUG("Sending Interest packet for " << *prefix);
92
Alexander Afanasyev68de7952012-12-12 18:02:29 -080093 // Call trace (for logging purposes)
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080094 m_transmittedInterests(interest, this, m_face);
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -070095
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080096 m_face->onReceiveInterest(*interest);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080097}
98
99// Callback that will be called when Interest arrives
100void
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800101CustomApp::OnInterest(shared_ptr<const ndn::Interest> interest)
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800102{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800103 ndn::App::OnInterest(interest);
104
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800105 NS_LOG_DEBUG("Received Interest packet for " << interest->getName());
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800106
107 // Note that Interests send out by the app will not be sent back to the app !
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800108
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800109 auto data = make_shared<ndn::Data>(interest->getName());
110 data->setFreshnessPeriod(ndn::time::milliseconds(uint64_t(1000)));
111 data->setContent(make_shared<::ndn::Buffer>(1024));
112 StackHelper::getKeyChain().sign(*data);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800113
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800114 NS_LOG_DEBUG("Sending Data packet for " << data->getName());
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800115
116 // Call trace (for logging purposes)
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800117 m_transmittedDatas(data, this, m_face);
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700118
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800119 m_face->onReceiveData(*data);
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800120}
121
122// Callback that will be called when Data arrives
123void
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800124CustomApp::OnData(shared_ptr<const ndn::Data> contentObject)
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800125{
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800126 NS_LOG_DEBUG("Receiving Data packet for " << contentObject->getName());
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800127
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800128 std::cout << "DATA received for name " << contentObject->getName() << std::endl;
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800129}
130
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800131} // namespace ns3