blob: 7ab508c9432dba19633738b9a202b379b5b383d9 [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
29#include "ns3/ndn-app-face.h"
30#include "ns3/ndn-interest.h"
31#include "ns3/ndn-content-object.h"
32
33#include "ns3/ndn-fib.h"
34#include "ns3/random-variable.h"
35
Alexander Afanasyev68de7952012-12-12 18:02:29 -080036NS_LOG_COMPONENT_DEFINE ("CustomApp");
37
38namespace ns3 {
39
40NS_OBJECT_ENSURE_REGISTERED (CustomApp);
41
42// register NS-3 type
43TypeId
44CustomApp::GetTypeId ()
45{
46 static TypeId tid = TypeId ("CustomApp")
47 .SetParent<ndn::App> ()
48 .AddConstructor<CustomApp> ()
49 ;
50 return tid;
51}
52
53// Processing upon start of the application
54void
55CustomApp::StartApplication ()
56{
57 // initialize ndn::App
58 ndn::App::StartApplication ();
59
60 // Create a name components object for name ``/prefix/sub``
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -070061 Ptr<ndn::Name> prefix = Create<ndn::Name> (); // now prefix contains ``/``
Alexander Afanasyev68de7952012-12-12 18:02:29 -080062 prefix->Add ("prefix"); // now prefix contains ``/prefix``
63 prefix->Add ("sub"); // now prefix contains ``/prefix/sub``
64
65 /////////////////////////////////////////////////////////////////////////////
66 // Creating FIB entry that ensures that we will receive incoming Interests //
67 /////////////////////////////////////////////////////////////////////////////
68
69 // Get FIB object
70 Ptr<ndn::Fib> fib = GetNode ()->GetObject<ndn::Fib> ();
71
72 // Add entry to FIB
73 // Note that ``m_face`` is cretaed by ndn::App
74 Ptr<ndn::fib::Entry> fibEntry = fib->Add (*prefix, m_face, 0);
75
76 Simulator::Schedule (Seconds (1.0), &CustomApp::SendInterest, this);
77}
78
79// Processing when application is stopped
80void
81CustomApp::StopApplication ()
82{
83 // cleanup ndn::App
84 ndn::App::StopApplication ();
85}
86
87void
88CustomApp::SendInterest ()
89{
90 /////////////////////////////////////
91 // Sending one Interest packet out //
92 /////////////////////////////////////
93
Alexander Afanasyevcfdc14f2013-03-15 14:38:44 -070094 Ptr<ndn::Name> prefix = Create<ndn::Name> ("/prefix/sub"); // another way to create name
Alexander Afanasyev68de7952012-12-12 18:02:29 -080095
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -070096 // Create and configure ndn::Interest
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -070097 Ptr<ndn::Interest> interestHeader = Create<ndn::Interest> ();
Alexander Afanasyev68de7952012-12-12 18:02:29 -080098 UniformVariable rand (0,std::numeric_limits<uint32_t>::max ());
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -070099 interestHeader->SetNonce (rand.GetValue ());
100 interestHeader->SetName (prefix);
101 interestHeader->SetInterestLifetime (Seconds (1.0));
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800102
103 NS_LOG_DEBUG ("Sending Interest packet for " << *prefix);
104
105 // Forward packet to lower (network) layer
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700106 Ptr<Packet> payload = Create<Packet> ();
107 m_face->ReceiveInterest (interestHeader, payload);
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800108
109 // Call trace (for logging purposes)
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700110 m_transmittedInterests (interestHeader, this, m_face);
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800111}
112
113// Callback that will be called when Interest arrives
114void
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700115CustomApp::OnInterest (const Ptr<const ndn::Interest> &interest, Ptr<Packet> origPacket)
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800116{
117 NS_LOG_DEBUG ("Received Interest packet for " << interest->GetName ());
118
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700119 // Create and configure ndn::ContentObject and ndn::ContentObjectTail
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800120 // (header is added in front of the packet, tail is added at the end of the packet)
121
122 // Note that Interests send out by the app will not be sent back to the app !
123
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700124 Ptr<ndn::ContentObject> data = Create<ndn::ContentObject> ();
125 data->SetName (Create<ndn::Name> (interest->GetName ())); // data will have the same name as Interests
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800126
127 // Create packet and add header and trailer
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700128 NS_LOG_DEBUG ("Sending ContentObject packet for " << data->GetName ());
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800129
130 // Forward packet to lower (network) layer
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700131 Ptr<Packet> payload = Create<Packet> (1024);
132 m_face->ReceiveData (data, payload);
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800133
134 // Call trace (for logging purposes)
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700135 m_transmittedContentObjects (data, payload, this, m_face);
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800136}
137
138// Callback that will be called when Data arrives
139void
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -0700140CustomApp::OnContentObject (const Ptr<const ndn::ContentObject> &contentObject,
Alexander Afanasyev68de7952012-12-12 18:02:29 -0800141 Ptr<Packet> payload)
142{
143 NS_LOG_DEBUG ("Receiving ContentObject packet for " << contentObject->GetName ());
144
145 std::cout << "DATA received for name " << contentObject->GetName () << std::endl;
146}
147
148
149} // namespace ns3