blob: f086a7a836bc291c31caec06fb3e57b516cd9d88 [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
Alexander Afanasyev0c395372014-12-20 15:54:02 -080021#include "ndn-app.hpp"
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070022#include "ns3/log.h"
23#include "ns3/assert.h"
24#include "ns3/packet.h"
25
Mickey Sweatt89046c12014-11-16 20:32:27 -080026#include "model/ndn-l3-protocol.hpp"
27#include "model/ndn-app-face.hpp"
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070028
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080029NS_LOG_COMPONENT_DEFINE("ndn.App");
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070030
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070031namespace ns3 {
32namespace ndn {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080033
34NS_OBJECT_ENSURE_REGISTERED(App);
35
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070036TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080037App::GetTypeId(void)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070038{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080039 static TypeId tid = TypeId("ns3::ndn::App")
40 .SetGroupName("Ndn")
41 .SetParent<Application>()
42 .AddConstructor<App>()
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070043
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080044 .AddTraceSource("ReceivedInterests", "ReceivedInterests",
45 MakeTraceSourceAccessor(&App::m_receivedInterests))
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070046
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080047 .AddTraceSource("ReceivedDatas", "ReceivedDatas",
48 MakeTraceSourceAccessor(&App::m_receivedDatas))
49
50 .AddTraceSource("TransmittedInterests", "TransmittedInterests",
51 MakeTraceSourceAccessor(&App::m_transmittedInterests))
52
53 .AddTraceSource("TransmittedDatas", "TransmittedDatas",
54 MakeTraceSourceAccessor(&App::m_transmittedDatas));
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070055 return tid;
56}
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080057
58App::App()
59 : m_active(false)
60 , m_face(0)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070061{
62}
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080063
64App::~App()
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070065{
66}
67
68void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080069App::DoDispose(void)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070070{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080071 NS_LOG_FUNCTION_NOARGS();
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070072
73 // Unfortunately, this causes SEGFAULT
74 // The best reason I see is that apps are freed after ndn stack is removed
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080075 // StopApplication ();
76 Application::DoDispose();
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070077}
78
Alexander Afanasyevdb64ff12013-01-18 16:37:31 -080079uint32_t
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080080App::GetId() const
Alexander Afanasyevdb64ff12013-01-18 16:37:31 -080081{
82 if (m_face == 0)
83 return (uint32_t)-1;
84 else
Mickey Sweatt89046c12014-11-16 20:32:27 -080085 return m_face->getId();
Alexander Afanasyevdb64ff12013-01-18 16:37:31 -080086}
87
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070088void
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070089App::OnInterest(shared_ptr<const Interest> interest)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070090{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080091 NS_LOG_FUNCTION(this << interest);
92 m_receivedInterests(interest, this, m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070093}
94
95void
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070096App::OnData(shared_ptr<const Data> data)
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070097{
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070098 NS_LOG_FUNCTION(this << data);
99 m_receivedDatas(data, this, m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700100}
101
102// Application Methods
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800103void
104App::StartApplication() // Called at time specified by Start
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700105{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800106 NS_LOG_FUNCTION_NOARGS();
107
108 NS_ASSERT(m_active != true);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700109 m_active = true;
110
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800111 NS_ASSERT_MSG(GetNode()->GetObject<L3Protocol>() != 0,
112 "Ndn stack should be installed on the node " << GetNode());
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700113
114 // step 1. Create a face
Mickey Sweatt89046c12014-11-16 20:32:27 -0800115 m_face = std::make_shared<AppFace>(this);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800116
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700117 // step 2. Add face to the Ndn stack
Mickey Sweatt89046c12014-11-16 20:32:27 -0800118 GetNode()->GetObject<L3Protocol>()->addFace(m_face);
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700119}
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700120
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800121void
122App::StopApplication() // Called at time specified by Stop
123{
124 NS_LOG_FUNCTION_NOARGS();
125
126 if (!m_active)
127 return; // don't assert here, just return
128
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700129 m_active = false;
130
Mickey Sweatt89046c12014-11-16 20:32:27 -0800131 m_face->close();
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700132}
133
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700134} // namespace ndn
135} // namespace ns3