blob: 1e342e2d13970f6c0c241d1e2f9499086e875d6c [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,
67 * and there is an InRecord not of this face
68 */
69 bool
70 canForwardTo(shared_ptr<Face> face) const;
71
Junxiao Shid3c792f2014-01-30 00:46:13 -070072 /** \brief records a nonce
73 *
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070074 * \return true if nonce is new; false if nonce is seen before
Junxiao Shicbba04c2014-01-26 14:21:22 -070075 */
76 bool
Junxiao Shid3c792f2014-01-30 00:46:13 -070077 addNonce(uint32_t nonce);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070078
Junxiao Shicbba04c2014-01-26 14:21:22 -070079 /** \brief inserts a InRecord for face, and updates it with interest
Junxiao Shid3c792f2014-01-30 00:46:13 -070080 *
Junxiao Shicbba04c2014-01-26 14:21:22 -070081 * If InRecord for face exists, the existing one is updated.
Junxiao Shid3c792f2014-01-30 00:46:13 -070082 * This method does not add the Nonce as a seen Nonce.
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070083 * \return an iterator to the InRecord
Junxiao Shicbba04c2014-01-26 14:21:22 -070084 */
85 InRecordCollection::iterator
86 insertOrUpdateInRecord(shared_ptr<Face> face, const Interest& interest);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070087
Junxiao Shicbba04c2014-01-26 14:21:22 -070088 /// deletes all InRecords
89 void
90 deleteInRecords();
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070091
Junxiao Shicbba04c2014-01-26 14:21:22 -070092 /** \brief inserts a OutRecord for face, and updates it with interest
Junxiao Shid3c792f2014-01-30 00:46:13 -070093 *
Junxiao Shicbba04c2014-01-26 14:21:22 -070094 * If OutRecord for face exists, the existing one is updated.
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070095 * \return an iterator to the OutRecord
Junxiao Shicbba04c2014-01-26 14:21:22 -070096 */
97 OutRecordCollection::iterator
98 insertOrUpdateOutRecord(shared_ptr<Face> face, const Interest& interest);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070099
Junxiao Shicbba04c2014-01-26 14:21:22 -0700100 /// deletes one OutRecord for face if exists
101 void
102 deleteOutRecord(shared_ptr<Face> face);
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -0700103
Junxiao Shid3c792f2014-01-30 00:46:13 -0700104public:
105 EventId m_unsatisfyTimer;
106 EventId m_stragglerTimer;
Junxiao Shicbba04c2014-01-26 14:21:22 -0700107
108private:
109 std::set<uint32_t> m_nonces;
110 const Interest m_interest;
111 InRecordCollection m_inRecords;
112 OutRecordCollection m_outRecords;
HangZhangcb4fc832014-03-11 16:57:11 +0800113 shared_ptr<name_tree::Entry> m_nameTreeEntry;
114
115 friend class nfd::NameTree;
116 friend class nfd::name_tree::Entry;
Junxiao Shicbba04c2014-01-26 14:21:22 -0700117};
118
119inline const Interest&
120Entry::getInterest() const
121{
122 return m_interest;
123}
124
125} // namespace pit
Alexander Afanasyev18bbf812014-01-29 01:40:23 -0800126} // namespace nfd
Junxiao Shicbba04c2014-01-26 14:21:22 -0700127
128#endif // NFD_TABLE_PIT_ENTRY_HPP