blob: 802f6970414d4d51b8a1b47f7439e9c43f54fe65 [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",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070044 MakeTraceSourceAccessor(&App::m_receivedInterests),
45 "ns3::ndn::App::InterestTraceCallback")
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070046
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080047 .AddTraceSource("ReceivedDatas", "ReceivedDatas",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070048 MakeTraceSourceAccessor(&App::m_receivedDatas),
49 "ns3::ndn::App::DataTraceCallback")
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080050
51 .AddTraceSource("TransmittedInterests", "TransmittedInterests",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070052 MakeTraceSourceAccessor(&App::m_transmittedInterests),
53 "ns3::ndn::App::InterestTraceCallback")
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080054
55 .AddTraceSource("TransmittedDatas", "TransmittedDatas",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070056 MakeTraceSourceAccessor(&App::m_transmittedDatas),
57 "ns3::ndn::App::DataTraceCallback");
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070058 return tid;
59}
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080060
61App::App()
62 : m_active(false)
63 , m_face(0)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070064{
65}
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080066
67App::~App()
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070068{
69}
70
71void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080072App::DoDispose(void)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070073{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080074 NS_LOG_FUNCTION_NOARGS();
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070075
76 // Unfortunately, this causes SEGFAULT
77 // The best reason I see is that apps are freed after ndn stack is removed
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080078 // StopApplication ();
79 Application::DoDispose();
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070080}
81
Alexander Afanasyevdb64ff12013-01-18 16:37:31 -080082uint32_t
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080083App::GetId() const
Alexander Afanasyevdb64ff12013-01-18 16:37:31 -080084{
85 if (m_face == 0)
86 return (uint32_t)-1;
87 else
Mickey Sweatt89046c12014-11-16 20:32:27 -080088 return m_face->getId();
Alexander Afanasyevdb64ff12013-01-18 16:37:31 -080089}
90
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070091void
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070092App::OnInterest(shared_ptr<const Interest> interest)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070093{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080094 NS_LOG_FUNCTION(this << interest);
95 m_receivedInterests(interest, this, m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070096}
97
98void
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070099App::OnData(shared_ptr<const Data> data)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700100{
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -0700101 NS_LOG_FUNCTION(this << data);
102 m_receivedDatas(data, this, m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700103}
104
105// Application Methods
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800106void
107App::StartApplication() // Called at time specified by Start
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700108{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800109 NS_LOG_FUNCTION_NOARGS();
110
111 NS_ASSERT(m_active != true);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700112 m_active = true;
113
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800114 NS_ASSERT_MSG(GetNode()->GetObject<L3Protocol>() != 0,
115 "Ndn stack should be installed on the node " << GetNode());
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700116
117 // step 1. Create a face
Mickey Sweatt89046c12014-11-16 20:32:27 -0800118 m_face = std::make_shared<AppFace>(this);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800119
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700120 // step 2. Add face to the Ndn stack
Mickey Sweatt89046c12014-11-16 20:32:27 -0800121 GetNode()->GetObject<L3Protocol>()->addFace(m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700122}
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700123
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800124void
125App::StopApplication() // Called at time specified by Stop
126{
127 NS_LOG_FUNCTION_NOARGS();
128
129 if (!m_active)
130 return; // don't assert here, just return
131
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700132 m_active = false;
133
Mickey Sweatt89046c12014-11-16 20:32:27 -0800134 m_face->close();
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700135}
136
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700137} // namespace ndn
138} // namespace ns3