blob: 562f06edda7dd468ca81fb8709715b4ef46d9a95 [file] [log] [blame]
Alexander Afanasyev78057c32012-07-06 15:18:46 -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
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070021#ifndef _NDN_FIB_IMPL_H_
22#define _NDN_FIB_IMPL_H_
Alexander Afanasyev78057c32012-07-06 15:18:46 -070023
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070024#include "ns3/ndn-fib.h"
25#include "ns3/ndn-name-components.h"
Alexander Afanasyev78057c32012-07-06 15:18:46 -070026
Alexander Afanasyeve3d126f2012-07-16 17:07:31 -070027#include "../../utils/trie-with-policy.h"
28#include "../../utils/counting-policy.h"
Alexander Afanasyev78057c32012-07-06 15:18:46 -070029
30namespace ns3 {
31
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070032class NdnFibEntryImpl : public NdnFibEntry
Alexander Afanasyev1ba09b82012-07-09 09:16:14 -070033{
34public:
35 typedef ndnSIM::trie_with_policy<
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070036 NdnNameComponents,
37 ndnSIM::smart_pointer_payload_traits<NdnFibEntryImpl>,
Alexander Afanasyevf1e013f2012-07-11 17:59:40 -070038 ndnSIM::counting_policy_traits
Alexander Afanasyev1ba09b82012-07-09 09:16:14 -070039 > trie;
40
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070041 NdnFibEntryImpl (const Ptr<const NdnNameComponents> &prefix)
42 : NdnFibEntry (prefix)
Alexander Afanasyev1ba09b82012-07-09 09:16:14 -070043 , item_ (0)
44 {
45 }
46
47 void
48 SetTrie (trie::iterator item)
49 {
50 item_ = item;
51 }
52
53 trie::iterator to_iterator () { return item_; }
54 trie::const_iterator to_iterator () const { return item_; }
55
56private:
57 trie::iterator item_;
58};
59
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070060struct NdnFibEntryContainer
Alexander Afanasyev78057c32012-07-06 15:18:46 -070061{
62 typedef ndnSIM::trie_with_policy<
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070063 NdnNameComponents,
64 ndnSIM::smart_pointer_payload_traits<NdnFibEntryImpl>,
Alexander Afanasyevf1e013f2012-07-11 17:59:40 -070065 ndnSIM::counting_policy_traits
Alexander Afanasyev78057c32012-07-06 15:18:46 -070066 > type;
67};
68
69/**
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070070 * \ingroup ndn
Alexander Afanasyev78057c32012-07-06 15:18:46 -070071 * \brief Class implementing FIB functionality
72 */
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070073class NdnFibImpl : public NdnFib,
74 private NdnFibEntryContainer::type
Alexander Afanasyev78057c32012-07-06 15:18:46 -070075{
76public:
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070077 typedef NdnFibEntryContainer::type super;
Alexander Afanasyev78057c32012-07-06 15:18:46 -070078
79 /**
80 * \brief Interface ID
81 *
82 * \return interface ID
83 */
84 static TypeId GetTypeId ();
85
86 /**
87 * \brief Constructor
88 */
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070089 NdnFibImpl ();
Alexander Afanasyev78057c32012-07-06 15:18:46 -070090
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070091 virtual Ptr<NdnFibEntry>
92 LongestPrefixMatch (const NdnInterestHeader &interest);
Alexander Afanasyev78057c32012-07-06 15:18:46 -070093
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070094 virtual Ptr<NdnFibEntry>
95 Add (const NdnNameComponents &prefix, Ptr<NdnFace> face, int32_t metric);
Alexander Afanasyev78057c32012-07-06 15:18:46 -070096
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070097 virtual Ptr<NdnFibEntry>
98 Add (const Ptr<const NdnNameComponents> &prefix, Ptr<NdnFace> face, int32_t metric);
Alexander Afanasyev78057c32012-07-06 15:18:46 -070099
Alexander Afanasyev95a4fa32012-07-09 15:23:59 -0700100 virtual void
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700101 Remove (const Ptr<const NdnNameComponents> &prefix);
Alexander Afanasyev78057c32012-07-06 15:18:46 -0700102
Alexander Afanasyev95a4fa32012-07-09 15:23:59 -0700103 virtual void
Alexander Afanasyev78057c32012-07-06 15:18:46 -0700104 InvalidateAll ();
105
Alexander Afanasyev95a4fa32012-07-09 15:23:59 -0700106 virtual void
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700107 RemoveFromAll (Ptr<NdnFace> face);
Alexander Afanasyev78057c32012-07-06 15:18:46 -0700108
Alexander Afanasyev95a4fa32012-07-09 15:23:59 -0700109 virtual void
Alexander Afanasyev78057c32012-07-06 15:18:46 -0700110 Print (std::ostream &os) const;
Alexander Afanasyev95a4fa32012-07-09 15:23:59 -0700111
Alexander Afanasyevf1e013f2012-07-11 17:59:40 -0700112 virtual uint32_t
113 GetSize () const;
114
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700115 virtual Ptr<const NdnFibEntry>
Alexander Afanasyev95a4fa32012-07-09 15:23:59 -0700116 Begin ();
117
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700118 virtual Ptr<const NdnFibEntry>
Alexander Afanasyev95a4fa32012-07-09 15:23:59 -0700119 End ();
120
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700121 virtual Ptr<const NdnFibEntry>
122 Next (Ptr<const NdnFibEntry> item);
Alexander Afanasyev78057c32012-07-06 15:18:46 -0700123
Alexander Afanasyev1aa4bbc2012-07-09 17:17:25 -0700124 // /**
125 // * @brief Modify element in container
126 // */
127 // template<typename Modifier>
128 // bool
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700129 // modify (Ptr<NdnFibEntry> item, Modifier mod)
Alexander Afanasyev1aa4bbc2012-07-09 17:17:25 -0700130 // {
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700131 // return super::modify (StaticCast<NdnFibEntryImpl> (item)->to_iterator (), mod);
Alexander Afanasyev1aa4bbc2012-07-09 17:17:25 -0700132 // }
Alexander Afanasyev78057c32012-07-06 15:18:46 -0700133
134protected:
135 // inherited from Object class
136 virtual void NotifyNewAggregate (); ///< @brief Notify when object is aggregated
137 virtual void DoDispose (); ///< @brief Perform cleanup
Alexander Afanasyev44bb6ea2012-07-09 08:44:41 -0700138
139private:
140 /**
141 * @brief Remove reference to a face from the entry. If entry had only this face, the whole
142 * entry will be removed
143 */
144 void
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700145 RemoveFace (super::parent_trie &item, Ptr<NdnFace> face);
Alexander Afanasyev78057c32012-07-06 15:18:46 -0700146
147private:
148 Ptr<Node> m_node;
149};
150
151} // namespace ns3
152
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700153#endif /* _NDN_FIB_IMPL_H_ */