blob: 001c4408ff4083cba87017facab32af5fd63c449 [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
Alexander Afanasyev0c395372014-12-20 15:54:02 -080029#include "ns3/ndn-app-face.hpp"
30#include "ns3/ndn-interest.hpp"
31#include "ns3/ndn-data.hpp"
Alexander Afanasyev68de7952012-12-12 18:02:29 -080032
Alexander Afanasyev0c395372014-12-20 15:54:02 -080033#include "ns3/ndn-fib.hpp"
Alexander Afanasyev68de7952012-12-12 18:02:29 -080034#include "ns3/random-variable.h"
35
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080036NS_LOG_COMPONENT_DEFINE("CustomApp");
Alexander Afanasyev68de7952012-12-12 18:02:29 -080037
38namespace ns3 {
39
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080040NS_OBJECT_ENSURE_REGISTERED(CustomApp);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080041
42// register NS-3 type
43TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080044CustomApp::GetTypeId()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080045{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080046 static TypeId tid = TypeId("CustomApp").SetParent<ndn::App>().AddConstructor<CustomApp>();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080047 return tid;
48}
49
50// Processing upon start of the application
51void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080052CustomApp::StartApplication()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080053{
54 // initialize ndn::App
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080055 ndn::App::StartApplication();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080056
57 // Create a name components object for name ``/prefix/sub``
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080058 Ptr<ndn::Name> prefix = Create<ndn::Name>(); // now prefix contains ``/``
59 prefix->append("prefix"); // now prefix contains ``/prefix``
60 prefix->append("sub"); // now prefix contains ``/prefix/sub``
Alexander Afanasyev68de7952012-12-12 18:02:29 -080061
62 /////////////////////////////////////////////////////////////////////////////
63 // Creating FIB entry that ensures that we will receive incoming Interests //
64 /////////////////////////////////////////////////////////////////////////////
65
66 // Get FIB object
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080067 Ptr<ndn::Fib> fib = GetNode()->GetObject<ndn::Fib>();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080068
69 // Add entry to FIB
70 // Note that ``m_face`` is cretaed by ndn::App
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080071 Ptr<ndn::fib::Entry> fibEntry = fib->Add(*prefix, m_face, 0);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080072
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080073 Simulator::Schedule(Seconds(1.0), &CustomApp::SendInterest, this);
Alexander Afanasyev68de7952012-12-12 18:02:29 -080074}
75
76// Processing when application is stopped
77void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080078CustomApp::StopApplication()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080079{
80 // cleanup ndn::App
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080081 ndn::App::StopApplication();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080082}
83
84void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080085CustomApp::SendInterest()
Alexander Afanasyev68de7952012-12-12 18:02:29 -080086{
87 /////////////////////////////////////
88 // Sending one Interest packet out //
89 /////////////////////////////////////
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080090
91 Ptr<ndn::Name> prefix = Create<ndn::Name>("/prefix/sub"); // another way to create name
Alexander Afanasyev68de7952012-12-12 18:02:29 -080092
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -070093 // Create and configure ndn::Interest
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080094 Ptr<ndn::Interest> interest = Create<ndn::Interest>();
95 UniformVariable rand(0, std::numeric_limits<uint32_t>::max());
96 interest->SetNonce(rand.GetValue());
97 interest->SetName(prefix);
98 interest->SetInterestLifetime(Seconds(1.0));
Alexander Afanasyev68de7952012-12-12 18:02:29 -080099
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800100 NS_LOG_DEBUG("Sending Interest packet for " << *prefix);
101
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800102 // Call trace (for logging purposes)
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800103 m_transmittedInterests(interest, this, m_face);
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700104
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800105 m_face->ReceiveInterest(interest);
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800106}
107
108// Callback that will be called when Interest arrives
109void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800110CustomApp::OnInterest(Ptr<const ndn::Interest> interest)
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800111{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800112 ndn::App::OnInterest(interest);
113
114 NS_LOG_DEBUG("Received Interest packet for " << interest->GetName());
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800115
Alexander Afanasyev772f51b2013-08-01 18:53:25 -0700116 // Create and configure ndn::Data and ndn::DataTail
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800117 // (header is added in front of the packet, tail is added at the end of the packet)
118
119 // Note that Interests send out by the app will not be sent back to the app !
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800120
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800121 Ptr<ndn::Data> data = Create<ndn::Data>(Create<Packet>(1024));
122 data->SetName(
123 Create<ndn::Name>(interest->GetName())); // data will have the same name as Interests
124
125 NS_LOG_DEBUG("Sending Data packet for " << data->GetName());
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800126
127 // Call trace (for logging purposes)
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800128 m_transmittedDatas(data, this, m_face);
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700129
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800130 m_face->ReceiveData(data);
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800131}
132
133// Callback that will be called when Data arrives
134void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800135CustomApp::OnData(Ptr<const ndn::Data> contentObject)
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800136{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800137 NS_LOG_DEBUG("Receiving Data packet for " << contentObject->GetName());
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800138
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800139 std::cout << "DATA received for name " << contentObject->GetName() << std::endl;
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800140}
141
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800142} // namespace ns3