blob: b081c27f528f97b2cbc6d653181cc45342d9e23d [file] [log] [blame]
Alexander Afanasyev68de7952012-12-12 18:02:29 -08001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2011-2012 University of California, Los Angeles
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
19 */
20
21// custom-app.cc
22
23#include "custom-app.h"
24#include "ns3/ptr.h"
25#include "ns3/log.h"
26#include "ns3/simulator.h"
27#include "ns3/packet.h"
28
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080029#include "ns3/ndnSIM/helper/ndn-fib-helper.hpp"
Alexander Afanasyev68de7952012-12-12 18:02:29 -080030
Alexander Afanasyev68de7952012-12-12 18:02:29 -080031#include "ns3/random-variable.h"
32
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080033NS_LOG_COMPONENT_DEFINE("CustomApp");
Alexander Afanasyev68de7952012-12-12 18:02:29 -080034
35namespace ns3 {
36
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080037NS_OBJECT_ENSURE_REGISTERED(CustomApp);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080038
39// register NS-3 type
40TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080041CustomApp::GetTypeId()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080042{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080043 static TypeId tid = TypeId("CustomApp").SetParent<ndn::App>().AddConstructor<CustomApp>();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080044 return tid;
45}
46
47// Processing upon start of the application
48void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080049CustomApp::StartApplication()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080050{
51 // initialize ndn::App
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080052 ndn::App::StartApplication();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080053
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080054 Simulator::Schedule(Seconds(1.0), &CustomApp::SendInterest, this);
55
Alexander Afanasyev68de7952012-12-12 18:02:29 -080056 // Create a name components object for name ``/prefix/sub``
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080057 shared_ptr<Name> prefix = make_shared<Name>(); // now prefix contains ``/``
58 prefix->append("prefix"); // now prefix contains ``/prefix``
59 prefix->append("sub"); // now prefix contains ``/prefix/sub``
Alexander Afanasyev68de7952012-12-12 18:02:29 -080060
61 // Add entry to FIB
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080062 ndn::FibHelper::AddRoute(node, *prefix, m_face, 0);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080063
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080064 // Schedule send of first interest
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080065 Simulator::Schedule(Seconds(1.0), &CustomApp::SendInterest, this);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080066}
67
68// Processing when application is stopped
69void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080070CustomApp::StopApplication()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080071{
72 // cleanup ndn::App
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080073 ndn::App::StopApplication();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080074}
75
76void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080077CustomApp::SendInterest()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080078{
79 /////////////////////////////////////
80 // Sending one Interest packet out //
81 /////////////////////////////////////
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080082
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080083 auto prefix = make_shared<Name>("/prefix/sub"); // another way to create name
Alexander Afanasyev68de7952012-12-12 18:02:29 -080084
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -070085 // Create and configure ndn::Interest
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080086 auto interest = make_shared<Interest>();
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080087 UniformVariable rand(0, std::numeric_limits<uint32_t>::max());
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080088 interest->setNonce(rand.GetValue());
89 interest->setName(*prefix);
90 interest->setInterestLifetime(time::seconds(1));
Alexander Afanasyev68de7952012-12-12 18:02:29 -080091
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080092 NS_LOG_DEBUG("Sending Interest packet for " << *prefix);
93
Alexander Afanasyev68de7952012-12-12 18:02:29 -080094 // Call trace (for logging purposes)
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080095 m_transmittedInterests(interest, this, m_face);
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -070096
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -080097 m_face->onReceiveInterest(*interest);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080098}
99
100// Callback that will be called when Interest arrives
101void
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800102CustomApp::OnInterest(shared_ptr<const ndn::Interest> interest)
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800103{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800104 ndn::App::OnInterest(interest);
105
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800106 NS_LOG_DEBUG("Received Interest packet for " << interest->getName());
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800107
108 // Note that Interests send out by the app will not be sent back to the app !
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800109
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800110 auto data = make_shared<ndn::Data>(interest->getName());
111 data->setFreshnessPeriod(ndn::time::milliseconds(uint64_t(1000)));
112 data->setContent(make_shared<::ndn::Buffer>(1024));
113 StackHelper::getKeyChain().sign(*data);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800114
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800115 NS_LOG_DEBUG("Sending Data packet for " << data->getName());
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800116
117 // Call trace (for logging purposes)
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800118 m_transmittedDatas(data, this, m_face);
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700119
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800120 m_face->onReceiveData(*data);
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800121}
122
123// Callback that will be called when Data arrives
124void
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800125CustomApp::OnData(shared_ptr<const ndn::Data> contentObject)
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800126{
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800127 NS_LOG_DEBUG("Receiving Data packet for " << contentObject->getName());
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800128
Spyridon Mastorakisdb8280f2014-11-21 20:00:17 -0800129 std::cout << "DATA received for name " << contentObject->getName() << std::endl;
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800130}
131
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800132} // namespace ns3