blob: 415ab0b967bf603a3ca21279b47ad0b4be6cb5f6 [file] [log] [blame]
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2011-2015 Regents of the University of California.
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -08004 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08005 * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
6 * contributors.
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -08007 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08008 * ndnSIM is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080011 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080012 * ndnSIM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080015 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080016 * You should have received a copy of the GNU General Public License along with
17 * ndnSIM, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 **/
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080019
20#ifndef FRESHNESS_POLICY_H_
21#define FRESHNESS_POLICY_H_
22
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -080023/// @cond include_hidden
24
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -070025#include "ns3/ndnSIM/model/ndn-common.hpp"
26
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080027#include <boost/intrusive/options.hpp>
28#include <boost/intrusive/list.hpp>
29
30#include <ns3/nstime.h>
31#include <ns3/simulator.h>
32#include <ns3/traced-callback.h>
33
34namespace ns3 {
35namespace ndn {
36namespace ndnSIM {
37
38/**
39 * @brief Traits for freshness policy
40 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080041struct freshness_policy_traits {
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080042 /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080043 static std::string
44 GetName()
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080045 {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080046 return "Freshness";
47 }
48
49 struct policy_hook_type : public boost::intrusive::set_member_hook<> {
50 Time timeWhenShouldExpire;
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080051 };
52
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080053 template<class Container>
54 struct container_hook {
55 typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
56 type;
57 };
58
59 template<class Base, class Container, class Hook>
60 struct policy {
61 static Time&
62 get_freshness(typename Container::iterator item)
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080063 {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080064 return static_cast<typename policy_container::value_traits::hook_type*>(
65 policy_container::value_traits::to_node_ptr(*item))->timeWhenShouldExpire;
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080066 }
Alexander Afanasyev41824bd2013-01-23 23:57:59 -080067
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080068 static const Time&
69 get_freshness(typename Container::const_iterator item)
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080070 {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080071 return static_cast<const typename policy_container::value_traits::hook_type*>(
72 policy_container::value_traits::to_node_ptr(*item))->timeWhenShouldExpire;
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080073 }
74
75 template<class Key>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080076 struct MemberHookLess {
77 bool
78 operator()(const Key& a, const Key& b) const
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080079 {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080080 return get_freshness(&a) < get_freshness(&b);
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080081 }
82 };
83
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080084 typedef boost::intrusive::multiset<Container,
85 boost::intrusive::compare<MemberHookLess<Container>>,
86 Hook> policy_container;
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080087
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080088 class type : public policy_container {
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080089 public:
Alexander Afanasyev69786112012-12-13 11:53:36 -080090 typedef policy policy_base; // to get access to get_freshness methods from outside
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080091 typedef Container parent_trie;
92
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080093 type(Base& base)
94 : base_(base)
95 , max_size_(100)
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -080096 {
97 }
98
99 inline void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800100 update(typename parent_trie::iterator item)
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800101 {
Alexander Afanasyev41824bd2013-01-23 23:57:59 -0800102 // do nothing
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800103 }
Alexander Afanasyev41824bd2013-01-23 23:57:59 -0800104
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800105 inline bool
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800106 insert(typename parent_trie::iterator item)
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800107 {
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800108 time::milliseconds freshness = item->payload()->GetData()->getFreshnessPeriod();
109 if (freshness > time::milliseconds::zero()) {
110 get_freshness(item) = Simulator::Now() + MilliSeconds(freshness.count());
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800111
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800112 // push item only if freshness is non zero. otherwise, this payload is not
113 // controlled by the policy.
114 // Note that .size() on this policy would return only the number of items with
115 // non-infinite freshness policy
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800116 policy_container::insert(*item);
117 }
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800118
119 return true;
120 }
Alexander Afanasyev41824bd2013-01-23 23:57:59 -0800121
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800122 inline void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800123 lookup(typename parent_trie::iterator item)
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800124 {
125 // do nothing. it's random policy
126 }
Alexander Afanasyev41824bd2013-01-23 23:57:59 -0800127
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800128 inline void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800129 erase(typename parent_trie::iterator item)
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800130 {
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800131 time::milliseconds freshness = item->payload()->GetData()->getFreshnessPeriod();
132 if (freshness > time::milliseconds::zero()) {
133 // erase only if freshness is positive (otherwise an item is not in the policy)
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800134 policy_container::erase(policy_container::s_iterator_to(*item));
135 }
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800136 }
137
138 inline void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800139 clear()
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800140 {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800141 policy_container::clear();
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800142 }
143
144 inline void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800145 set_max_size(size_t max_size)
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800146 {
147 max_size_ = max_size;
148 }
149
150 inline size_t
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800151 get_max_size() const
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800152 {
153 return max_size_;
154 }
155
156 private:
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800157 type()
158 : base_(*((Base*)0)){};
Alexander Afanasyev41824bd2013-01-23 23:57:59 -0800159
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800160 private:
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800161 Base& base_;
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800162 size_t max_size_;
163 };
164 };
165};
166
167} // ndnSIM
168} // ndn
169} // ns3
170
Spyridon Mastorakis460f57c2014-12-17 00:44:14 -0800171/// @endcond
172
Alexander Afanasyevc3cc0b32012-12-12 18:41:20 -0800173#endif // LIFETIME_STATS_POLICY_H