blob: fdeb4e7d312bad4b50663f666409bed09d88b5e7 [file] [log] [blame]
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2011-2015 Regents of the University of California.
Alexander Afanasyev4aac5572012-08-09 10:49:55 -07004 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08005 * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
6 * contributors.
Alexander Afanasyev4aac5572012-08-09 10:49:55 -07007 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08008 * ndnSIM is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070011 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080012 * ndnSIM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070015 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080016 * You should have received a copy of the GNU General Public License along with
17 * ndnSIM, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 **/
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070019
Alexander Afanasyev0c395372014-12-20 15:54:02 -080020#include "ndn-app.hpp"
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070021#include "ns3/log.h"
22#include "ns3/assert.h"
23#include "ns3/packet.h"
24
Mickey Sweatt89046c12014-11-16 20:32:27 -080025#include "model/ndn-l3-protocol.hpp"
26#include "model/ndn-app-face.hpp"
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070027
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080028NS_LOG_COMPONENT_DEFINE("ndn.App");
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070029
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070030namespace ns3 {
31namespace ndn {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080032
33NS_OBJECT_ENSURE_REGISTERED(App);
34
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070035TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080036App::GetTypeId(void)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070037{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080038 static TypeId tid = TypeId("ns3::ndn::App")
39 .SetGroupName("Ndn")
40 .SetParent<Application>()
41 .AddConstructor<App>()
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070042
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080043 .AddTraceSource("ReceivedInterests", "ReceivedInterests",
44 MakeTraceSourceAccessor(&App::m_receivedInterests))
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070045
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080046 .AddTraceSource("ReceivedDatas", "ReceivedDatas",
47 MakeTraceSourceAccessor(&App::m_receivedDatas))
48
49 .AddTraceSource("TransmittedInterests", "TransmittedInterests",
50 MakeTraceSourceAccessor(&App::m_transmittedInterests))
51
52 .AddTraceSource("TransmittedDatas", "TransmittedDatas",
53 MakeTraceSourceAccessor(&App::m_transmittedDatas));
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070054 return tid;
55}
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080056
57App::App()
58 : m_active(false)
59 , m_face(0)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070060{
61}
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080062
63App::~App()
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070064{
65}
66
67void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080068App::DoDispose(void)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070069{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080070 NS_LOG_FUNCTION_NOARGS();
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070071
72 // Unfortunately, this causes SEGFAULT
73 // The best reason I see is that apps are freed after ndn stack is removed
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080074 // StopApplication ();
75 Application::DoDispose();
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070076}
77
Alexander Afanasyevdb64ff12013-01-18 16:37:31 -080078uint32_t
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080079App::GetId() const
Alexander Afanasyevdb64ff12013-01-18 16:37:31 -080080{
81 if (m_face == 0)
82 return (uint32_t)-1;
83 else
Mickey Sweatt89046c12014-11-16 20:32:27 -080084 return m_face->getId();
Alexander Afanasyevdb64ff12013-01-18 16:37:31 -080085}
86
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070087void
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070088App::OnInterest(shared_ptr<const Interest> interest)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070089{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080090 NS_LOG_FUNCTION(this << interest);
91 m_receivedInterests(interest, this, m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070092}
93
94void
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070095App::OnData(shared_ptr<const Data> data)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070096{
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070097 NS_LOG_FUNCTION(this << data);
98 m_receivedDatas(data, this, m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070099}
100
101// Application Methods
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800102void
103App::StartApplication() // Called at time specified by Start
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700104{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800105 NS_LOG_FUNCTION_NOARGS();
106
107 NS_ASSERT(m_active != true);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700108 m_active = true;
109
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800110 NS_ASSERT_MSG(GetNode()->GetObject<L3Protocol>() != 0,
111 "Ndn stack should be installed on the node " << GetNode());
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700112
113 // step 1. Create a face
Mickey Sweatt89046c12014-11-16 20:32:27 -0800114 m_face = std::make_shared<AppFace>(this);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800115
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700116 // step 2. Add face to the Ndn stack
Mickey Sweatt89046c12014-11-16 20:32:27 -0800117 GetNode()->GetObject<L3Protocol>()->addFace(m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700118}
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700119
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800120void
121App::StopApplication() // Called at time specified by Stop
122{
123 NS_LOG_FUNCTION_NOARGS();
124
125 if (!m_active)
126 return; // don't assert here, just return
127
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700128 m_active = false;
129
Mickey Sweatt89046c12014-11-16 20:32:27 -0800130 m_face->close();
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700131}
132
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700133} // namespace ndn
134} // namespace ns3