blob: a46c8ba6059026d896bb41aa250d0eb9379cc65c [file] [log] [blame]
Alexander Afanasyev4aac5572012-08-09 10:49:55 -07001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2011 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#include "ndn-app.h"
22#include "ns3/log.h"
23#include "ns3/assert.h"
24#include "ns3/packet.h"
25
26#include "ns3/ndn-interest-header.h"
27#include "ns3/ndn-content-object-header.h"
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070028#include "ns3/ndn-l3-protocol.h"
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070029#include "ns3/ndn-fib.h"
30#include "ns3/ndn-app-face.h"
31#include "ns3/ndn-forwarding-strategy.h"
32
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070033NS_LOG_COMPONENT_DEFINE ("ndn.App");
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070034
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070035namespace ns3 {
36namespace ndn {
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070037
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070038NS_OBJECT_ENSURE_REGISTERED (App);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070039
40TypeId
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070041App::GetTypeId (void)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070042{
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070043 static TypeId tid = TypeId ("ns3::ndn::App")
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070044 .SetGroupName ("Ndn")
45 .SetParent<Application> ()
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070046 .AddConstructor<App> ()
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070047
48 .AddTraceSource ("ReceivedInterests", "ReceivedInterests",
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070049 MakeTraceSourceAccessor (&App::m_receivedInterests))
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070050
51 .AddTraceSource ("ReceivedNacks", "ReceivedNacks",
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070052 MakeTraceSourceAccessor (&App::m_receivedNacks))
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070053
54 .AddTraceSource ("ReceivedContentObjects", "ReceivedContentObjects",
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070055 MakeTraceSourceAccessor (&App::m_receivedContentObjects))
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070056
57 .AddTraceSource ("TransmittedInterests", "TransmittedInterests",
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070058 MakeTraceSourceAccessor (&App::m_transmittedInterests))
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070059
60 .AddTraceSource ("TransmittedContentObjects", "TransmittedContentObjects",
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070061 MakeTraceSourceAccessor (&App::m_transmittedContentObjects))
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070062 ;
63 return tid;
64}
65
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070066App::App ()
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070067 : m_protocolHandler (0)
68 , m_active (false)
69 , m_face (0)
70{
71}
72
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070073App::~App ()
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070074{
75}
76
77void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070078App::DoDispose (void)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070079{
80 NS_LOG_FUNCTION_NOARGS ();
81
82 // Unfortunately, this causes SEGFAULT
83 // The best reason I see is that apps are freed after ndn stack is removed
84 // StopApplication ();
85 Application::DoDispose ();
86}
87
88void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070089App::RegisterProtocolHandler (ProtocolHandler handler)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070090{
91 m_protocolHandler = handler;
92}
93
94void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070095App::OnInterest (const Ptr<const InterestHeader> &interest, Ptr<Packet> packet)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070096{
97 NS_LOG_FUNCTION (this << interest);
98 m_receivedInterests (interest, this, m_face);
99}
100
101void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700102App::OnNack (const Ptr<const InterestHeader> &interest, Ptr<Packet> packet)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700103{
104 NS_LOG_FUNCTION (this << interest);
105 m_receivedNacks (interest, this, m_face);
106}
107
108void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700109App::OnContentObject (const Ptr<const ContentObjectHeader> &contentObject,
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700110 Ptr<Packet> payload)
111{
112 NS_LOG_FUNCTION (this << contentObject << payload);
113 m_receivedContentObjects (contentObject, payload, this, m_face);
114}
115
116// Application Methods
117void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700118App::StartApplication () // Called at time specified by Start
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700119{
120 NS_LOG_FUNCTION_NOARGS ();
121
122 NS_ASSERT (m_active != true);
123 m_active = true;
124
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700125 NS_ASSERT_MSG (GetNode ()->GetObject<L3Protocol> () != 0,
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700126 "Ndn stack should be installed on the node " << GetNode ());
127
128 // step 1. Create a face
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700129 m_face = CreateObject<AppFace> (/*Ptr<App> (this)*/this);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700130
131 // step 2. Add face to the Ndn stack
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700132 GetNode ()->GetObject<L3Protocol> ()->AddFace (m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700133
134 // step 3. Enable face
135 m_face->SetUp (true);
136}
137
138void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700139App::StopApplication () // Called at time specified by Stop
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700140{
141 NS_LOG_FUNCTION_NOARGS ();
142
143 if (!m_active) return; //don't assert here, just return
144
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700145 NS_ASSERT (GetNode ()->GetObject<L3Protocol> () != 0);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700146
147 m_active = false;
148
149 // step 1. Disable face
150 m_face->SetUp (false);
151
152 // step 2. Remove face from Ndn stack
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700153 GetNode ()->GetObject<L3Protocol> ()->RemoveFace (m_face);
154 GetNode ()->GetObject<Fib> ()->RemoveFromAll (m_face);
155 GetNode ()->GetObject<ForwardingStrategy> ()->RemoveFace (m_face); // notify that face is removed
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700156
157 // step 3. Destroy face
Alexander Afanasyevf3830472012-10-09 18:23:21 -0700158 if (m_face->GetReferenceCount () != 1)
159 {
160 NS_LOG_ERROR ("Please a bug report on https://github.com/NDN-Routing/ndnSIM/issues:");
161 NS_LOG_ERROR ("At this point, nobody else should have referenced this face, but we have "
162 << m_face->GetReferenceCount () << " references");
163
164 }
165 // NS_ASSERT_MSG (m_face->GetReferenceCount ()==2,
166 // "At this point, nobody else should have referenced this face, but we have "
167 // << m_face->GetReferenceCount () << " references");
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700168 m_face = 0;
169}
170
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700171} // namespace ndn
172} // namespace ns3