blob: 01a5b1d1783f7151fe61011752dd91de73ba35e3 [file] [log] [blame]
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -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: Ilya Moiseenko <iliamo@cs.ucla.edu>
19 */
20
21#include "ccnx-consumer.h"
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -070022#include "ns3/ptr.h"
23#include "ns3/ccnx-local-face.h"
24#include "ns3/ccnx.h"
25#include "ns3/callback.h"
Alexander Afanasyeva46844b2011-11-21 19:13:26 -080026#include "ns3/string.h"
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -070027#include "ns3/ccnx-content-object-header.h"
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070028
29NS_LOG_COMPONENT_DEFINE ("CcnxConsumer");
30
31namespace ns3
32{
33
34NS_OBJECT_ENSURE_REGISTERED (CcnxConsumer);
35
36TypeId
37CcnxConsumer::GetTypeId (void)
38{
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080039 static TypeId tid = TypeId ("ns3::CcnxConsumer")
40 .SetParent<Application> ()
41 .AddConstructor<CcnxConsumer> ()
42 .AddAttribute ("OffTime", "Time interval between packets",
43 StringValue ("100ms"),
44 MakeTimeAccessor (&CcnxConsumer::m_offTime),
45 MakeTimeChecker ())
46 .AddAttribute ("InterestName","CcnxName of the Interest (use CcnxNameComponents)",
47 StringValue ("/"),
48 MakeCcnxNameComponentsAccessor (&CcnxConsumer::m_interestName),
49 MakeCcnxNameComponentsChecker ())
50 .AddAttribute ("LifeTime", "LifeTime fo interest packet",
51 StringValue ("2s"),
52 MakeTimeAccessor (&CcnxConsumer::m_interestLifeTime),
53 MakeTimeChecker ())
54 .AddAttribute ("MinSuffixComponents", "MinSuffixComponents",
55 IntegerValue(-1),
56 MakeIntegerAccessor(&CcnxConsumer::m_minSuffixComponents),
57 MakeIntegerChecker<int32_t>())
58 .AddAttribute ("MaxSuffixComponents", "MaxSuffixComponents",
59 IntegerValue(-1),
60 MakeIntegerAccessor(&CcnxConsumer::m_maxSuffixComponents),
61 MakeIntegerChecker<int32_t>())
62 .AddAttribute ("ChildSelector", "ChildSelector",
63 BooleanValue(false),
64 MakeBooleanAccessor(&CcnxConsumer::m_childSelector),
65 MakeBooleanChecker())
66 .AddAttribute ("Exclude", "only simple name matching is supported (use CcnxNameComponents)",
67 CcnxNameComponentsValue (),
68 MakeCcnxNameComponentsAccessor (&CcnxConsumer::m_exclude),
69 MakeCcnxNameComponentsChecker ())
70 .AddAttribute ("Initial Nonce", "If 0 then nonce is not used",
71 UintegerValue(1),
72 MakeUintegerAccessor(&CcnxConsumer::m_initialNonce),
73 MakeUintegerChecker<uint32_t>())
74 .AddTraceSource ("InterestTrace", "Interests that were sent",
75 MakeTraceSourceAccessor (&CcnxConsumer::m_interestsTrace))
76 .AddTraceSource ("ContentObjectTrace", "ContentObjects that were received",
77 MakeTraceSourceAccessor (&CcnxConsumer::m_contentObjectsTrace))
78 ;
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070079
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080080 return tid;
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070081}
82
83CcnxConsumer::CcnxConsumer ()
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080084 : m_rand (0, std::numeric_limits<uint32_t>::max ())
85 , m_seq (0)
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070086{
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080087 NS_LOG_FUNCTION_NOARGS ();
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070088}
89
90CcnxConsumer::~CcnxConsumer()
91{
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080092 NS_LOG_FUNCTION_NOARGS ();
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070093}
94
95void
96CcnxConsumer::DoDispose (void)
97{
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -080098 NS_LOG_FUNCTION_NOARGS ();
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -070099
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800100 Application::DoDispose ();
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700101}
102
103// Application Methods
104void
105CcnxConsumer::StartApplication () // Called at time specified by Start
106{
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800107 NS_LOG_FUNCTION_NOARGS ();
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700108
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800109 // do base stuff
110 CcnxApp::StartApplication ();
111
112 // schedule periodic packet generation
113 m_sendEvent = Simulator::Schedule (Seconds(0.0), &CcnxConsumer::SendPacket, this);
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700114}
115
116void
117CcnxConsumer::StopApplication () // Called at time specified by Stop
118{
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800119 NS_LOG_FUNCTION_NOARGS ();
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700120
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800121 // cancel periodic packet generation
122 Simulator::Cancel (m_sendEvent);
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700123
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800124 // cleanup base stuff
125 CcnxApp::StopApplication ();
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700126}
127
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700128void
129CcnxConsumer::SendPacket ()
130{
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800131 NS_LOG_FUNCTION_NOARGS ();
132 NS_LOG_INFO ("Sending Interest at " << Simulator::Now ());
Ilya Moiseenko0605d262011-10-28 13:00:07 -0700133
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800134 //
135 Ptr<CcnxNameComponents> nameWithSequence = Create<CcnxNameComponents> (m_interestName);
136 (*name) (m_seq++);
137 //
138
139 CcnxInterestHeader interestHeader;
140 interestHeader.SetNonce (m_rand.GetValue ());
141 interestHeader.SetName (nameWithSequence);
142 interestHeader.SetInterestLifetime (m_interestLifeTime);
143 interestHeader.SetChildSelector (m_childSelector);
144 interestHeader.SetExclude (Create<CcnxNameComponents> (m_exclude));
145 interestHeader.SetMaxSuffixComponents (m_maxSuffixComponents);
146 interestHeader.SetMinSuffixComponents (m_minSuffixComponents);
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700147
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800148 NS_LOG_INFO ("Interest: \n" << interestHeader);
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700149
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800150 Ptr<Packet> packet = Create<Packet> ();
151 packet->AddHeader (interestHeader);
Alexander Afanasyevd02a5d62011-11-21 11:01:51 -0800152
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800153 m_protocolHandler (packet);
Ilya Moiseenko0605d262011-10-28 13:00:07 -0700154
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800155 m_sendEvent = Simulator::Schedule (m_offTime, &CcnxConsumer::SendPacket, this);
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700156}
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700157
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700158void
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700159CcnxConsumer::OnContentObject (const Ptr<const CcnxContentObjectHeader> &contentObject,
160 const Ptr<const Packet> &payload)
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700161{
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800162 NS_LOG_FUNCTION (this << contentObject << payload);
163
164 NS_LOG_INFO ("Received content object: " << cref(*contentObject));
Ilya Moiseenko8196d2e2011-08-29 13:03:22 -0700165}
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700166
Alexander Afanasyev09c7deb2011-11-23 14:50:10 -0800167} // namespace ns3