blob: 7e844ba18499016ec3a770cddc29d8f6286029f9 [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 Afanasyevf5c07742012-10-31 13:13:05 -070022#ifndef NDNSIM_SIMPLE_WINDOW_LIMITS_H
23#define NDNSIM_SIMPLE_WINDOW_LIMITS_H
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070024
25#include "ns3/event-id.h"
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070026#include "ns3/ndn-pit.h"
27#include "ns3/ndn-pit-entry.h"
Alexander Afanasyev0484e772012-10-29 11:02:08 -070028#include "ns3/simulator.h"
Alexander Afanasyev6f95e702012-10-31 16:27:31 -070029#include "ns3/string.h"
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070030
31#include "ns3/ndn-forwarding-strategy.h"
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070032
Alexander Afanasyev6f95e702012-10-31 16:27:31 -070033#include "ns3/ndn-limits.h"
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070034
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070035namespace ns3 {
36namespace ndn {
37namespace fw {
38
39/**
40 * \ingroup ndn
41 * \brief Strategy implementing per-FIB entry limits
42 */
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070043template<class Parent>
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070044class SimpleWindowLimits :
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070045 public Parent
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070046{
47private:
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070048 typedef Parent super;
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070049
50public:
51 static TypeId
52 GetTypeId ();
53
54 /**
55 * @brief Default constructor
56 */
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070057 SimpleWindowLimits ()
58 { }
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070059
60 virtual void
61 WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
62
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070063 virtual void
64 AddFace (Ptr<Face> face)
65 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -070066 ObjectFactory factory (m_limitType);
67 Ptr<Limits> limits = factory.template Create<Limits> ();
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070068 face->AggregateObject (limits);
69
70 super::AddFace (face);
71 }
72
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070073protected:
74 virtual bool
75 TrySendOutInterest (Ptr<Face> inFace,
76 Ptr<Face> outFace,
77 Ptr<const InterestHeader> header,
78 Ptr<const Packet> origPacket,
79 Ptr<pit::Entry> pitEntry);
80
81 virtual void
82 WillSatisfyPendingInterest (Ptr<Face> inFace,
83 Ptr<pit::Entry> pitEntry);
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070084
Alexander Afanasyev6f95e702012-10-31 16:27:31 -070085private:
86 std::string m_limitType;
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070087};
88
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070089template<class Parent>
90TypeId
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070091SimpleWindowLimits<Parent>::GetTypeId (void)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070092{
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070093 static TypeId tid = TypeId ((super::GetTypeId ().GetName ()+"::SimpleWindowLimits").c_str ())
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070094 .SetGroupName ("Ndn")
95 .template SetParent <super> ()
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070096 .template AddConstructor <SimpleWindowLimits> ()
Alexander Afanasyev6f95e702012-10-31 16:27:31 -070097
98 .template AddAttribute ("Limit", "Limit type to be used (e.g., ns3::ndn::Limits::Window or ns3::ndn::Limits::Rate)",
99 StringValue ("ns3::ndn::Limits::Window"),
100 MakeStringAccessor (&SimpleWindowLimits<Parent>::m_limitType),
101 MakeStringChecker ())
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700102 ;
103 return tid;
104}
105
106template<class Parent>
107bool
Alexander Afanasyevf5c07742012-10-31 13:13:05 -0700108SimpleWindowLimits<Parent>::TrySendOutInterest (Ptr<Face> inFace,
109 Ptr<Face> outFace,
110 Ptr<const InterestHeader> header,
111 Ptr<const Packet> origPacket,
112 Ptr<pit::Entry> pitEntry)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700113{
114 // NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
115 // totally override all (if any) parent processing
116
117 pit::Entry::out_iterator outgoing =
118 pitEntry->GetOutgoing ().find (outFace);
119
120 if (outgoing != pitEntry->GetOutgoing ().end ())
121 {
122 // just suppress without any other action
123 return false;
124 }
125
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700126 Ptr<Limits> faceLimits = outFace->template GetObject<Limits> ();
127 if (faceLimits->IsBelowLimit ())
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700128 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700129 faceLimits->BorrowLimit ();
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700130 pitEntry->AddOutgoing (outFace);
131
132 //transmission
133 Ptr<Packet> packetToSend = origPacket->Copy ();
134 outFace->Send (packetToSend);
135
136 this->DidSendOutInterest (outFace, header, origPacket, pitEntry);
137 return true;
138 }
139 else
140 {
141 // NS_LOG_DEBUG ("Face limit for " << header->GetName ());
142 }
143
144 return false;
145}
146
147template<class Parent>
148void
Alexander Afanasyevf5c07742012-10-31 13:13:05 -0700149SimpleWindowLimits<Parent>::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700150{
151 // NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
152
153 for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
154 face != pitEntry->GetOutgoing ().end ();
155 face ++)
156 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700157 Ptr<Limits> faceLimits = face->m_face->GetObject<Limits> ();
158 faceLimits->ReturnLimit ();
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700159 }
160
161 super::WillEraseTimedOutPendingInterest (pitEntry);
162}
163
164
165template<class Parent>
166void
Alexander Afanasyevf5c07742012-10-31 13:13:05 -0700167SimpleWindowLimits<Parent>::WillSatisfyPendingInterest (Ptr<Face> inFace,
168 Ptr<pit::Entry> pitEntry)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700169{
170 // NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
171
172 for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
173 face != pitEntry->GetOutgoing ().end ();
174 face ++)
175 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700176 Ptr<Limits> faceLimits = face->m_face->GetObject<Limits> ();
177 faceLimits->ReturnLimit ();
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700178 }
179
180 super::WillSatisfyPendingInterest (inFace, pitEntry);
181}
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -0700182
183} // namespace fw
184} // namespace ndn
185} // namespace ns3
186
Alexander Afanasyevf5c07742012-10-31 13:13:05 -0700187#endif // NDNSIM_SIMPLE_WINDOW_LIMITS_H