blob: fcdd43f74eb2554b63aab12e430a8b8f3320d36e [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 Afanasyev042b4a72012-11-09 17:47:48 -080022#ifndef NDNSIM_PER_OUT_FACE_LIMITS_H
23#define NDNSIM_PER_OUT_FACE_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
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080042 * \brief Strategy implementing per-outgoing face limits
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070043 */
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -070044template<class Parent>
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080045class PerOutFaceLimits :
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:
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080052 /**
53 * @brief Get TypeId of the class
54 */
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070055 static TypeId
56 GetTypeId ();
57
58 /**
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080059 * @brief Helper function to retrieve logging name for the forwarding strategy
60 */
61 static std::string
62 GetLogName ();
63
64 /**
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070065 * @brief Default constructor
66 */
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080067 PerOutFaceLimits ()
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070068 { }
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080069
70 /// \copydoc ForwardingStrategy::WillEraseTimedOutPendingInterest
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070071 virtual void
72 WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
73
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080074 /// \copydoc ForwardingStrategy::AddFace
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070075 virtual void
76 AddFace (Ptr<Face> face)
77 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -070078 ObjectFactory factory (m_limitType);
79 Ptr<Limits> limits = factory.template Create<Limits> ();
Alexander Afanasyevf5c07742012-10-31 13:13:05 -070080 face->AggregateObject (limits);
81
82 super::AddFace (face);
83 }
84
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070085protected:
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080086 /// \copydoc ForwardingStrategy::CanSendOutInterest
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070087 virtual bool
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -080088 CanSendOutInterest (Ptr<Face> inFace,
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070089 Ptr<Face> outFace,
Alexander Afanasyevb989b122013-07-10 17:15:46 -070090 Ptr<const Interest> interest,
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070091 Ptr<pit::Entry> pitEntry);
92
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080093 /// \copydoc ForwardingStrategy::WillSatisfyPendingInterest
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070094 virtual void
95 WillSatisfyPendingInterest (Ptr<Face> inFace,
96 Ptr<pit::Entry> pitEntry);
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -070097
Alexander Afanasyev042b4a72012-11-09 17:47:48 -080098protected:
99 static LogComponent g_log; ///< @brief Logging variable
100
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700101private:
102 std::string m_limitType;
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -0700103};
104
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700105template<class Parent>
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800106LogComponent PerOutFaceLimits<Parent>::g_log = LogComponent (PerOutFaceLimits<Parent>::GetLogName ().c_str ());
107
108template<class Parent>
109std::string
110PerOutFaceLimits<Parent>::GetLogName ()
111{
112 return super::GetLogName ()+".PerOutFaceLimits";
113}
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800114
115template<class Parent>
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700116TypeId
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800117PerOutFaceLimits<Parent>::GetTypeId (void)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700118{
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800119 static TypeId tid = TypeId ((super::GetTypeId ().GetName ()+"::PerOutFaceLimits").c_str ())
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700120 .SetGroupName ("Ndn")
121 .template SetParent <super> ()
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800122 .template AddConstructor <PerOutFaceLimits> ()
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700123
Alexander Afanasyev17741fd2013-06-13 10:40:10 -0700124 .AddAttribute ("Limit", "Limit type to be used (e.g., ns3::ndn::Limits::Window or ns3::ndn::Limits::Rate)",
125 StringValue ("ns3::ndn::Limits::Window"),
126 MakeStringAccessor (&PerOutFaceLimits<Parent>::m_limitType),
127 MakeStringChecker ())
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700128 ;
129 return tid;
130}
131
132template<class Parent>
133bool
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800134PerOutFaceLimits<Parent>::CanSendOutInterest (Ptr<Face> inFace,
Alexander Afanasyevadcccf42012-11-26 23:55:34 -0800135 Ptr<Face> outFace,
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700136 Ptr<const Interest> interest,
Alexander Afanasyevadcccf42012-11-26 23:55:34 -0800137 Ptr<pit::Entry> pitEntry)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700138{
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800139 NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800140
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700141 Ptr<Limits> faceLimits = outFace->template GetObject<Limits> ();
142 if (faceLimits->IsBelowLimit ())
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700143 {
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700144 if (super::CanSendOutInterest (inFace, outFace, interest, pitEntry))
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800145 {
146 faceLimits->BorrowLimit ();
147 return true;
148 }
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700149 }
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800150
151 return false;
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700152}
153
154template<class Parent>
155void
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800156PerOutFaceLimits<Parent>::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700157{
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800158 NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700159
160 for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
161 face != pitEntry->GetOutgoing ().end ();
162 face ++)
163 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700164 Ptr<Limits> faceLimits = face->m_face->GetObject<Limits> ();
Alexander Afanasyev3749fd12013-05-15 16:05:33 -0700165 for (uint32_t i = 0; i <= face->m_retxCount; i++)
166 faceLimits->ReturnLimit ();
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700167 }
168
169 super::WillEraseTimedOutPendingInterest (pitEntry);
170}
171
172
173template<class Parent>
174void
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800175PerOutFaceLimits<Parent>::WillSatisfyPendingInterest (Ptr<Face> inFace,
Alexander Afanasyevb989b122013-07-10 17:15:46 -0700176 Ptr<pit::Entry> pitEntry)
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700177{
Alexander Afanasyevdb15acb2012-11-09 14:16:27 -0800178 NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700179
180 for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
181 face != pitEntry->GetOutgoing ().end ();
182 face ++)
183 {
Alexander Afanasyev6f95e702012-10-31 16:27:31 -0700184 Ptr<Limits> faceLimits = face->m_face->GetObject<Limits> ();
Alexander Afanasyev3749fd12013-05-15 16:05:33 -0700185 for (uint32_t i = 0; i <= face->m_retxCount; i++)
186 faceLimits->ReturnLimit ();
Alexander Afanasyev0fff1db2012-10-29 10:14:47 -0700187 }
188
189 super::WillSatisfyPendingInterest (inFace, pitEntry);
190}
Alexander Afanasyev1e7bcaf2012-09-05 10:17:53 -0700191
192} // namespace fw
193} // namespace ndn
194} // namespace ns3
195
Alexander Afanasyev042b4a72012-11-09 17:47:48 -0800196#endif // NDNSIM_PER_OUT_FACE_LIMITS_H