blob: ce639e3c7a081b4d394de0c4a62b445b977fc282 [file] [log] [blame]
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -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
Alexander Afanasyevccd5bb42012-10-31 17:27:49 -070022#ifndef NDNSIM_SIMPLE_LIMITS_H
23#define NDNSIM_SIMPLE_LIMITS_H
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070024
25#include "ns3/event-id.h"
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -080026#include "ns3/log.h"
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070027#include "ns3/ndn-pit.h"
28#include "ns3/ndn-pit-entry.h"
Alexander Afanasyev0484e772012-10-29 11:02:08 -070029#include "ns3/simulator.h"
Alexander Afanasyev6f95e702012-10-31 16:27:31 -070030#include "ns3/string.h"
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070031
32#include "ns3/ndn-forwarding-strategy.h"
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070033
Alexander Afanasyev6f95e702012-10-31 16:27:31 -070034#include "ns3/ndn-limits.h"
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070035
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070036namespace ns3 {
37namespace ndn {
38namespace fw {
39
40/**
41 * \ingroup ndn
42 * \brief Strategy implementing per-FIB entry limits
43 */
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070044template<class Parent>
Alexander Afanasyevccd5bb42012-10-31 17:27:49 -070045class SimpleLimits :
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070046 public Parent
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070047{
48private:
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070049 typedef Parent super;
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070050
51public:
52 static TypeId
53 GetTypeId ();
54
55 /**
56 * @brief Default constructor
57 */
Alexander Afanasyevccd5bb42012-10-31 17:27:49 -070058 SimpleLimits ()
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070059 { }
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070060
61 virtual void
62 WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
63
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070064 virtual void
65 AddFace (Ptr<Face> face)
66 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -070067 ObjectFactory factory (m_limitType);
68 Ptr<Limits> limits = factory.template Create<Limits> ();
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070069 face->AggregateObject (limits);
70
71 super::AddFace (face);
72 }
73
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070074protected:
75 virtual bool
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -080076 CanSendOutInterest (Ptr<Face> inFace,
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070077 Ptr<Face> outFace,
78 Ptr<const InterestHeader> header,
79 Ptr<const Packet> origPacket,
80 Ptr<pit::Entry> pitEntry);
81
82 virtual void
83 WillSatisfyPendingInterest (Ptr<Face> inFace,
84 Ptr<pit::Entry> pitEntry);
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070085
Alexander Afanasyev6f95e702012-10-31 16:27:31 -070086private:
87 std::string m_limitType;
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -080088
89 static LogComponent g_log;
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070090};
91
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070092template<class Parent>
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -080093LogComponent SimpleLimits<Parent>::g_log = LogComponent ("ndn.SimpleLimits");
94
95template<class Parent>
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070096TypeId
Alexander Afanasyevccd5bb42012-10-31 17:27:49 -070097SimpleLimits<Parent>::GetTypeId (void)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070098{
Alexander Afanasyevccd5bb42012-10-31 17:27:49 -070099 static TypeId tid = TypeId ((super::GetTypeId ().GetName ()+"::SimpleLimits").c_str ())
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700100 .SetGroupName ("Ndn")
101 .template SetParent <super> ()
Alexander Afanasyevccd5bb42012-10-31 17:27:49 -0700102 .template AddConstructor <SimpleLimits> ()
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700103
104 .template AddAttribute ("Limit", "Limit type to be used (e.g., ns3::ndn::Limits::Window or ns3::ndn::Limits::Rate)",
105 StringValue ("ns3::ndn::Limits::Window"),
Alexander Afanasyevccd5bb42012-10-31 17:27:49 -0700106 MakeStringAccessor (&SimpleLimits<Parent>::m_limitType),
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700107 MakeStringChecker ())
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700108 ;
109 return tid;
110}
111
112template<class Parent>
113bool
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800114SimpleLimits<Parent>::CanSendOutInterest (Ptr<Face> inFace,
115 Ptr<Face> outFace,
116 Ptr<const InterestHeader> header,
117 Ptr<const Packet> origPacket,
118 Ptr<pit::Entry> pitEntry)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700119{
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800120 NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700121
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800122 if (!super::CanSendOutInterest (inFace, outFace, header, origPacket, pitEntry))
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700123 {
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700124 return false;
125 }
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800126
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700127 Ptr<Limits> faceLimits = outFace->template GetObject<Limits> ();
128 if (faceLimits->IsBelowLimit ())
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700129 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700130 faceLimits->BorrowLimit ();
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700131 return true;
132 }
133 else
134 {
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800135 return false;
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700136 }
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700137}
138
139template<class Parent>
140void
Alexander Afanasyevccd5bb42012-10-31 17:27:49 -0700141SimpleLimits<Parent>::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700142{
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800143 NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700144
145 for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
146 face != pitEntry->GetOutgoing ().end ();
147 face ++)
148 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700149 Ptr<Limits> faceLimits = face->m_face->GetObject<Limits> ();
150 faceLimits->ReturnLimit ();
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700151 }
152
153 super::WillEraseTimedOutPendingInterest (pitEntry);
154}
155
156
157template<class Parent>
158void
Alexander Afanasyevccd5bb42012-10-31 17:27:49 -0700159SimpleLimits<Parent>::WillSatisfyPendingInterest (Ptr<Face> inFace,
Alexander Afanasyevf5c07742012-10-31 13:13:05 -0700160 Ptr<pit::Entry> pitEntry)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700161{
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800162 NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700163
164 for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
165 face != pitEntry->GetOutgoing ().end ();
166 face ++)
167 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700168 Ptr<Limits> faceLimits = face->m_face->GetObject<Limits> ();
169 faceLimits->ReturnLimit ();
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700170 }
171
172 super::WillSatisfyPendingInterest (inFace, pitEntry);
173}
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -0700174
175} // namespace fw
176} // namespace ndn
177} // namespace ns3
178
Alexander Afanasyevccd5bb42012-10-31 17:27:49 -0700179#endif // NDNSIM_SIMPLE_LIMITS_H