blob: e72365bdf3263b875eafbbe99c4f2ca109e6e3b6 [file] [log] [blame]
Junxiao Shicbba04c2014-01-26 14:21:22 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (C) 2014 Named Data Networking Project
4 * See COPYING for copyright and distribution information.
5 */
6
7#ifndef NFD_TABLE_PIT_ENTRY_HPP
8#define NFD_TABLE_PIT_ENTRY_HPP
9
10#include "pit-in-record.hpp"
11#include "pit-out-record.hpp"
Junxiao Shid3c792f2014-01-30 00:46:13 -070012#include "core/scheduler.hpp"
Junxiao Shicbba04c2014-01-26 14:21:22 -070013
Alexander Afanasyev18bbf812014-01-29 01:40:23 -080014namespace nfd {
HangZhangcb4fc832014-03-11 16:57:11 +080015
16class NameTree;
17
18namespace name_tree {
19class Entry;
20}
21
Junxiao Shicbba04c2014-01-26 14:21:22 -070022namespace pit {
23
24/** \class InRecordCollection
25 * \brief represents an unordered collection of InRecords
26 */
27typedef std::list< InRecord> InRecordCollection;
28
29/** \class OutRecordCollection
30 * \brief represents an unordered collection of OutRecords
31 */
32typedef std::list<OutRecord> OutRecordCollection;
33
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070034/** \brief represents a PIT entry
Junxiao Shicbba04c2014-01-26 14:21:22 -070035 */
Junxiao Shi408a7002014-02-12 17:53:47 -070036class Entry : public StrategyInfoHost, noncopyable
Junxiao Shicbba04c2014-01-26 14:21:22 -070037{
38public:
39 explicit
40 Entry(const Interest& interest);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070041
Junxiao Shicbba04c2014-01-26 14:21:22 -070042 const Interest&
43 getInterest() const;
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070044
45 /** \return Interest Name
Junxiao Shicbba04c2014-01-26 14:21:22 -070046 */
47 const Name&
48 getName() const;
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070049
Junxiao Shicbba04c2014-01-26 14:21:22 -070050 const InRecordCollection&
51 getInRecords() const;
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070052
Junxiao Shicbba04c2014-01-26 14:21:22 -070053 const OutRecordCollection&
54 getOutRecords() const;
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070055
Junxiao Shi11bd9c22014-03-13 20:44:13 -070056 /** \brief determines whether any InRecord is a local Face
57 *
58 * \return true if any InRecord is a local Face,
59 * false if all InRecords are non-local Faces
60 */
61 bool
62 hasLocalInRecord() const;
63
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070064 /** \brief decides whether Interest can be forwarded to face
65 *
66 * \return true if OutRecord of this face does not exist or has expired,
Junxiao Shi57f0f312014-03-16 11:52:20 -070067 * and there is an InRecord not of this face,
68 * and scope is not violated
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070069 */
70 bool
Junxiao Shi57f0f312014-03-16 11:52:20 -070071 canForwardTo(const Face& face) const;
72
73 /** \brief decides whether forwarding Interest to face would violate scope
74 *
75 * \return true if scope control would be violated
76 * \note canForwardTo has more comprehensive checks (including scope control)
77 * and should be used by most strategies. Outgoing Interest pipeline
78 * should only check scope because some strategy (eg. vehicular) needs
79 * to retransmit sooner than OutRecord expiry, or forward Interest
80 * back to incoming face
81 */
82 bool
83 violatesScope(const Face& face) const;
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070084
Junxiao Shid3c792f2014-01-30 00:46:13 -070085 /** \brief records a nonce
86 *
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070087 * \return true if nonce is new; false if nonce is seen before
Junxiao Shicbba04c2014-01-26 14:21:22 -070088 */
89 bool
Junxiao Shid3c792f2014-01-30 00:46:13 -070090 addNonce(uint32_t nonce);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070091
Junxiao Shicbba04c2014-01-26 14:21:22 -070092 /** \brief inserts a InRecord for face, and updates it with interest
Junxiao Shid3c792f2014-01-30 00:46:13 -070093 *
Junxiao Shicbba04c2014-01-26 14:21:22 -070094 * If InRecord for face exists, the existing one is updated.
Junxiao Shid3c792f2014-01-30 00:46:13 -070095 * This method does not add the Nonce as a seen Nonce.
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070096 * \return an iterator to the InRecord
Junxiao Shicbba04c2014-01-26 14:21:22 -070097 */
98 InRecordCollection::iterator
99 insertOrUpdateInRecord(shared_ptr<Face> face, const Interest& interest);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -0700100
Junxiao Shicbba04c2014-01-26 14:21:22 -0700101 /// deletes all InRecords
102 void
103 deleteInRecords();
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -0700104
Junxiao Shicbba04c2014-01-26 14:21:22 -0700105 /** \brief inserts a OutRecord for face, and updates it with interest
Junxiao Shid3c792f2014-01-30 00:46:13 -0700106 *
Junxiao Shicbba04c2014-01-26 14:21:22 -0700107 * If OutRecord for face exists, the existing one is updated.
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -0700108 * \return an iterator to the OutRecord
Junxiao Shicbba04c2014-01-26 14:21:22 -0700109 */
110 OutRecordCollection::iterator
111 insertOrUpdateOutRecord(shared_ptr<Face> face, const Interest& interest);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -0700112
Junxiao Shicbba04c2014-01-26 14:21:22 -0700113 /// deletes one OutRecord for face if exists
114 void
115 deleteOutRecord(shared_ptr<Face> face);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -0700116
Junxiao Shi57f0f312014-03-16 11:52:20 -0700117 /** \return true if there is one or more unexpired OutRecords
118 */
119 bool
120 hasUnexpiredOutRecords() const;
121
Junxiao Shid3c792f2014-01-30 00:46:13 -0700122public:
123 EventId m_unsatisfyTimer;
124 EventId m_stragglerTimer;
Junxiao Shicbba04c2014-01-26 14:21:22 -0700125
126private:
127 std::set<uint32_t> m_nonces;
128 const Interest m_interest;
129 InRecordCollection m_inRecords;
130 OutRecordCollection m_outRecords;
Junxiao Shi57f0f312014-03-16 11:52:20 -0700131
132 static const Name LOCALHOST_NAME;
133 static const Name LOCALHOP_NAME;
134
HangZhangcb4fc832014-03-11 16:57:11 +0800135 shared_ptr<name_tree::Entry> m_nameTreeEntry;
136
137 friend class nfd::NameTree;
138 friend class nfd::name_tree::Entry;
Junxiao Shicbba04c2014-01-26 14:21:22 -0700139};
140
141inline const Interest&
142Entry::getInterest() const
143{
144 return m_interest;
145}
146
147} // namespace pit
Alexander Afanasyev18bbf812014-01-29 01:40:23 -0800148} // namespace nfd
Junxiao Shicbba04c2014-01-26 14:21:22 -0700149
150#endif // NFD_TABLE_PIT_ENTRY_HPP