blob: 51c09b4b7b8b065450780673315dee1d54951d94 [file] [log] [blame]
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -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#include "ccnx-pit.h"
22#include "ns3/log.h"
23#include "ns3/simulator.h"
24#include "ccnx-interest-header.h"
25#include "ccnx-content-object-header.h"
26
27NS_LOG_COMPONENT_DEFINE ("CcnxPit");
28
29namespace ns3 {
30
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -070031// NS_OBJECT_ENSURE_REGISTERED (CcnxPit);
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070032
33using namespace __ccnx_private;
34
35// size_t
36// PitEntry::numberOfPromisingInterests(e_pi ) const
37// {
38// size_t count = 0;
39
40// BOOST_FOREACH (const CcnxPitOutgoingInterest &interest, m_outgoingInterests)
41// {
42// }
43// for( PitOutgoingConstIterator i = outgoingInterests.begin();
44// i!=outgoingInterests.end();
45// i++ )
46// {
47// if( !i->waitingInVain ) count++;
48// }
49
50// return count;
51// }
52
Alexander Afanasyevcf133f02011-09-06 12:13:48 -070053TypeId
54CcnxPit::GetTypeId ()
55{
56 static TypeId tid = TypeId ("ns3::CcnxPit")
57 .SetGroupName ("Ccnx")
58 .SetParent<Object> ()
59 .AddConstructor<CcnxPit> ()
60 .AddAttribute ("CleanupTimeout",
61 "Timeout defining how frequent RIT should be cleaned up",
62 TimeValue (Seconds (1)),
63 MakeTimeAccessor (&CcnxPit::GetCleanupTimeout, &CcnxPit::SetCleanupTimeout),
64 MakeTimeChecker ())
65 ;
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070066
Alexander Afanasyevcf133f02011-09-06 12:13:48 -070067 return tid;
68}
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070069
70CcnxPit::CcnxPit ()
71{
72}
73
74void
75CcnxPit::SetCleanupTimeout (const Time &timeout)
76{
77 m_cleanupTimeout = timeout;
78 if (m_cleanupEvent.IsRunning ())
79 m_cleanupEvent.Cancel (); // cancel any scheduled cleanup events
80
81 // schedule even with new timeout
82 m_cleanupEvent = Simulator::Schedule (Simulator::Now () + m_cleanupTimeout,
83 &CcnxPit::CleanExpired, this);
84}
85
86Time
87CcnxPit::GetCleanupTimeout () const
88{
89 return m_cleanupTimeout;
90}
91
92void CcnxPit::CleanExpired ()
93{
94 NS_LOG_LOGIC ("Cleaning PIT");
95 Time now = Simulator::Now ();
96
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -070097 while( !empty() )
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -070098 {
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -070099 if( get<i_timestamp> ().front ().GetExpireTime () <= now ) // is the record stale?
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700100 {
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -0700101 get<i_timestamp> ().pop_front( );
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700102 }
103 else
104 break; // nothing else to do. All later records will not be stale
105 }
106
107 // schedule next even
108 m_cleanupEvent = Simulator::Schedule (Simulator::Now () + m_cleanupTimeout,
109 &CcnxPit::CleanExpired, this);
110}
111
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700112void
113CcnxPit::SetFib (Ptr<CcnxFib> fib)
114{
115 m_fib = fib;
116}
117
118
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700119const CcnxPitEntry&
120CcnxPit::Lookup (const CcnxContentObjectHeader &header) const
121{
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700122 NS_LOG_FUNCTION_NOARGS ();
123
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700124 CcnxPitEntryContainer::type::iterator entry =
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -0700125 get<i_prefix> ().find (header.GetName ());
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700126
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700127 if (entry == end ())
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700128 throw CcnxPitEntryNotFound();
129
130 return *entry;
131}
132
133const CcnxPitEntry&
Alexander Afanasyevcf133f02011-09-06 12:13:48 -0700134CcnxPit::Lookup (const CcnxInterestHeader &header)
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700135{
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700136 NS_LOG_FUNCTION_NOARGS ();
137 NS_ASSERT_MSG (m_fib != 0, "FIB should be set");
138
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700139 CcnxPitEntryContainer::type::iterator entry =
Alexander Afanasyev78cf0c92011-09-01 19:57:14 -0700140 get<i_prefix> ().find (header.GetName ());
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700141
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700142 CcnxFibEntryContainer::type::iterator fibEntry = m_fib->LongestPrefixMatch (header);
143 if (fibEntry == m_fib->end ())
144 {
145 NS_LOG_WARN ("FIB entry wasn't found. Creating an empty record");
146 fibEntry = m_fib->insert (m_fib->end (), CcnxFibEntry (header.GetName ()));
147 }
148
149 if (entry == end ())
150 entry = insert (end (),
151 CcnxPitEntry (Create<CcnxNameComponents> (header.GetName ()),
152 *fibEntry));
Alexander Afanasyeva98cdd22011-08-29 17:32:37 -0700153 return *entry;
154}
155
156
157} // namespace ns3