blob: 4a32734ce7f2c96d28713e0053fdc5b8e43079db [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
Alexander Afanasyevbd9c18e2012-11-19 15:23:41 -080026#include "ns3/ndn-interest.h"
Alexander Afanasyev6eba36f2013-08-07 17:42:54 -070027#include "ns3/ndn-data.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
Alexander Afanasyev772f51b2013-08-01 18:53:25 -070054 .AddTraceSource ("ReceivedDatas", "ReceivedDatas",
55 MakeTraceSourceAccessor (&App::m_receivedDatas))
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
Alexander Afanasyev772f51b2013-08-01 18:53:25 -070060 .AddTraceSource ("TransmittedDatas", "TransmittedDatas",
61 MakeTraceSourceAccessor (&App::m_transmittedDatas))
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070062 ;
63 return tid;
64}
65
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070066App::App ()
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -070067 : m_active (false)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070068 , m_face (0)
69{
70}
71
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070072App::~App ()
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070073{
74}
75
76void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070077App::DoDispose (void)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070078{
79 NS_LOG_FUNCTION_NOARGS ();
80
81 // Unfortunately, this causes SEGFAULT
82 // The best reason I see is that apps are freed after ndn stack is removed
83 // StopApplication ();
84 Application::DoDispose ();
85}
86
Alexander Afanasyevdb64ff12013-01-18 16:37:31 -080087uint32_t
88App::GetId () const
89{
90 if (m_face == 0)
91 return (uint32_t)-1;
92 else
93 return m_face->GetId ();
94}
95
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070096void
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -070097App::OnInterest (Ptr<const Interest> interest)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070098{
99 NS_LOG_FUNCTION (this << interest);
100 m_receivedInterests (interest, this, m_face);
101}
102
103void
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700104App::OnNack (Ptr<const Interest> interest)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700105{
106 NS_LOG_FUNCTION (this << interest);
107 m_receivedNacks (interest, this, m_face);
108}
109
110void
Alexander Afanasyev772f51b2013-08-01 18:53:25 -0700111App::OnData (Ptr<const Data> contentObject)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700112{
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700113 NS_LOG_FUNCTION (this << contentObject);
Alexander Afanasyev772f51b2013-08-01 18:53:25 -0700114 m_receivedDatas (contentObject, this, m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700115}
116
117// Application Methods
118void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700119App::StartApplication () // Called at time specified by Start
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700120{
121 NS_LOG_FUNCTION_NOARGS ();
122
123 NS_ASSERT (m_active != true);
124 m_active = true;
125
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700126 NS_ASSERT_MSG (GetNode ()->GetObject<L3Protocol> () != 0,
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700127 "Ndn stack should be installed on the node " << GetNode ());
128
129 // step 1. Create a face
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700130 m_face = CreateObject<AppFace> (/*Ptr<App> (this)*/this);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700131
132 // step 2. Add face to the Ndn stack
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700133 GetNode ()->GetObject<L3Protocol> ()->AddFace (m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700134
135 // step 3. Enable face
136 m_face->SetUp (true);
137}
138
139void
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700140App::StopApplication () // Called at time specified by Stop
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700141{
142 NS_LOG_FUNCTION_NOARGS ();
143
144 if (!m_active) return; //don't assert here, just return
145
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700146 NS_ASSERT (GetNode ()->GetObject<L3Protocol> () != 0);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700147
148 m_active = false;
149
150 // step 1. Disable face
151 m_face->SetUp (false);
152
153 // step 2. Remove face from Ndn stack
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700154 GetNode ()->GetObject<L3Protocol> ()->RemoveFace (m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700155
156 // step 3. Destroy face
Alexander Afanasyevf3830472012-10-09 18:23:21 -0700157 if (m_face->GetReferenceCount () != 1)
158 {
Alexander Afanasyev5bee19e2013-07-10 14:33:57 -0700159 NS_LOG_ERROR ("Please a bug report on https://github.com/NDN-Routing/ndnSIM/issues");
Alexander Afanasyevf3830472012-10-09 18:23:21 -0700160 NS_LOG_ERROR ("At this point, nobody else should have referenced this face, but we have "
161 << m_face->GetReferenceCount () << " references");
162
163 }
164 // NS_ASSERT_MSG (m_face->GetReferenceCount ()==2,
165 // "At this point, nobody else should have referenced this face, but we have "
166 // << m_face->GetReferenceCount () << " references");
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700167 m_face = 0;
168}
169
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700170} // namespace ndn
171} // namespace ns3